{"version":3,"sources":["webpack:///./node_modules/chart.js/dist/chunks/helpers.segment.js","webpack:///./node_modules/chart.js/dist/chart.esm.js"],"names":["requestAnimFrame","window","callback","requestAnimationFrame","throttled","fn","thisArg","updateFn","updateArgs","args","Array","prototype","slice","call","ticking","rest","apply","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","start","end","_textX","left","right","rtl","check","noop","uid","id","isNullOrUndef","value","isArray","type","Object","toString","substr","isObject","isNumberFinite","Number","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","each","loopable","reverse","i","len","keys","length","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","index","clone$1","source","map","target","create","klen","k","isValidKey","key","indexOf","_merger","options","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","emptyString","dot","indexOfDotOrLength","idx","resolveObjectKey","obj","pos","_capitalize","str","charAt","toUpperCase","defined","isFunction","setsEqual","a","b","size","item","has","PI","Math","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","niceNum","range","roundedRange","round","almostEquals","niceRange","pow","floor","fraction","niceFraction","_factorize","result","sqrt","push","sort","pop","isNumber","n","isNaN","x","y","epsilon","abs","almostWhole","rounded","_setMinAndMaxByKey","array","property","min","max","toRadians","degrees","toDegrees","radians","_decimalPlaces","e","p","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","s","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","atEdge","t","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInBounce","easeOutBounce","m","d","easeInOutBounce","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","c","f","hex","h1","h2","eq","isShort","v","r","g","hexParse","ret","hexString","lim","l","h","p2b","n2b","b2n","n2p","RGB_RE","rgbParse","exec","rgbString","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","w","rgb","rgb2hsl","calln","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","p1","p2","rotate","deg","hslString","map$1","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names$1","nameParse","transparent","toLowerCase","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","Color","this","_rgb","_valid","color","weight","me","c1","c2","w2","w1","val","index_esm","isPatternOrGradient","CanvasGradient","CanvasPattern","getHoverColor","saturate","darken","overrides","getScope$1","node","split","root","scope","values","Defaults","_descriptors","animation","undefined","backgroundColor","borderColor","datasets","devicePixelRatio","context","chart","platform","getDevicePixelRatio","elements","events","font","family","style","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","describe","name","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","enumerable","local","defaults","_scriptable","startsWith","_indexable","_fallback","toFontString","_measureText","data","gc","longest","string","textWidth","measureText","width","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","splice","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","xOffset","yOffset","cornerRadius","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","point","area","margin","top","bottom","clipArea","clip","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","text","opts","lines","strokeWidth","strokeColor","line","setRenderOpts","strokeStyle","lineWidth","strokeText","maxWidth","fillText","decorateText","translation","fillStyle","textAlign","textBaseline","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","RegExp","FONT_STYLE","toLineHeight","matches","match","numberOrZero","_readValueToProps","props","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","grace","_lookup","table","cmp","mid","hi","lo","_lookupByKey","_rlookupByKey","_filterBetween","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","forEach","method","base","res","object","unlistenArrayEvents","stub","_arrayUnique","items","set","Set","add","from","_createResolver","scopes","prefixes","rootScopes","getTarget","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","override","Proxy","_keys","_cached","_resolveWithPrefixes","Reflect","getOwnPropertyDescriptor","getPrototypeOf","getKeysFromAllScopes","includes","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","ownKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","descriptors","_resolveScriptable","_resolveArray","Error","join","delete","createSubResolver","arr","filter","resolver","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","points","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","current","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","delta","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","loop","controlPoints","spanGaps","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","useOffsetPos","shadowRoot","getCanvasPosition","evt","native","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","addEventListener","removeEventListener","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","getRightToLeftAdapter","rectX","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","count","getSegment","segment","bounds","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","last","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","baseStyle","readStyle","prevStyle","p0","p0DataIndex","p1DataIndex","_datasetIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","_request","_charts","_running","_lastDate","anims","date","callbacks","numSteps","duration","initial","currentStep","_update","_refresh","Date","now","remaining","running","draw","_active","_total","tick","_notify","charts","complete","progress","event","cb","_getAnims","reduce","acc","_duration","cancel","animator","interpolators","to","factor","c0","valid","mix","cfg","currentValue","_fn","_easing","easing","_start","_target","_prop","_from","_to","_promises","elapsed","remain","promises","Promise","rej","resolved","numbers","colors","properties","active","resize","show","animations","visible","hide","config","_chart","_properties","configure","animatedProps","getOwnPropertyNames","option","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","_animateOptions","update","anim","wait","all","scaleClip","allowedOverflow","defaultClip","xScale","yScale","toClip","disabled","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","convertObjectDataToArray","adata","isStacked","meta","stacked","getStackKey","indexScale","valueScale","getUserBounds","minDefined","maxDefined","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","controller","parsed","_cachedMeta","_stacks","iScale","iAxis","axis","vAxis","itemStacks","_top","_bottom","getFirstScaleId","shift","createDatasetContext","dataset","createDataContext","dataIndex","raw","clearStacks","_parsed","isDirectUpdateMode","cloneIfNotShared","cached","shared","_ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","$context","_syncList","initialize","linkScales","_stacked","addElements","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","isExtensible","_dataCheck","datasetElementType","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","_sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","parse","xAxisKey","yAxisKey","parsedValue","NaN","canStack","otherScale","_getOtherScale","otherMin","otherMax","_skip","updateRangeFromParsed","getParsed","label","getLabelForValue","_clip","getMaxOverflow","chartArea","hidden","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","dataElementType","elementType","sharing","datasetElementScopeKeys","names","resolveNamedOptions","freeze","transition","datasetAnimationScopeKeys","sharedOptions","_animationsDisabled","_resolveAnimations","getSharedOptions","_setStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","arguments","getAllScaleValues","_cache","$bar","metas","concat","getAllParsedValues","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForValue","ticks","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","iAxisKey","vAxisKey","super","bars","reset","getBasePixel","_getRuler","firstOpts","includeOptions","updateSharedOptions","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","updateElement","grouped","_getStacks","_startPixel","_endPixel","_getStackCount","baseValue","minBarLength","floating","getDataVisibility","halfGrid","getLineWidthForValue","skipNull","maxBarThickness","Infinity","stackIndex","_getStackIndex","rects","_index_","offset","grid","_value_","beginAtZero","getPixelForDecimal","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","tooltip","innerRadius","outerRadius","isDatasetVisible","_getRotation","_getCircumference","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","_getRotationExtents","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","_circumference","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","legendItem","toggleDataVisibility","tooltipItem","dataLabel","formattedValue","_dataset","animationsDisabled","getStartAndCountOfVisiblePoints","scaleRangesChanged","_decimated","animated","maxGapLength","directUpdate","prevParsed","nullData","border","lastPoint","updateControlPoints","pointCount","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","display","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","controllers","__proto__","BarController","BubbleController","DoughnutController","LineController","PolarAreaController","DateAdapter","timestamp","amount","unit","weekday","members","adapters","_date","evaluateAllVisibleItems","handler","getSortedVisibleDatasetMetas","binarySearch","metaset","lookupMethod","_reversePixels","getRange","optimizedEvaluateItems","position","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","_minPadding","evaluationFunc","inRange","getNearestItems","distanceMetric","minDistance","getCenterPoint","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","change","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","padding","_layers","z","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","passive","addListener","removeListener","fromNativeEvent","createAttachObserver","observer","MutationObserver","entries","addedNodes","added","observe","childList","subtree","createDetachObserver","removedNodes","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","getProps","final","defaultRoutes","formatters","tickValue","notation","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","numeric","Ticks","autoSkip","tickOpts","ticksLimit","maxTicksLimit","determineMaxTicks","majorIndices","major","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","tickLength","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","diff","drawBorder","drawOnChartArea","drawTicks","tickWidth","tickColor","title","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkipPadding","labelOffset","minor","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","reverseAlign","offsetFromEdge","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","getMinMax","xLabels","yLabels","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","beforeFit","fit","afterFit","afterUpdate","startPixel","endPixel","reversePixels","_alignToPixels","alignToPixels","notifyPlugins","_callHooks","beforeTickToLabelConversion","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","generateTickLabels","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","decimal","getBaseValue","optionTicks","rot","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","backdrop","labelPadding","fillRect","findIndex","_computeGridLineItems","drawLine","setLineDash","lineDashOffset","lastLineWidth","_computeLabelArea","_computeLabelItems","drawBackground","drawGrid","drawTitle","drawLabels","tz","gz","axisID","fontSize","isPrototypeOf","parentScope","isIChartComponent","register","registerDefaults","itemDefaults","routeDefaults","routes","propertyParts","sourceName","sourceScope","parts","_typedRegistries","_each","_get","typedRegistry","arg","reg","_getRegistryForType","isForType","_exec","itemReg","registry","component","camelMethod","_init","hook","_createDescriptors","descriptor","plugin","cancelable","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","getPlugin","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","axisFromPosition","determineAxis","scaleOptions","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","mainScope","resetCache","keyLists","_cachedScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","version","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","animationOptions","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","userConfig","initialCanvas","existingChart","chartOptionScopes","acquireContext","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","listen","_initialize","error","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","render","scalesOptions","axisOptions","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","getScale","init","hasUpdated","addBox","_destroyDatasetMeta","newControllers","_removeUnreferencedMetasets","order","updateIndex","ControllerClass","getController","getElement","_updateMetasets","_resetElements","removeBox","animsDisabled","ensureScalesHaveIDs","buildOrUpdateScales","existingEvents","newEvents","unbindEvents","invalidate","buildOrUpdateControllers","buildOrUpdateElements","_updateLayout","_updateDatasets","_eventHandler","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","setDatasetVisibility","_updateVisibility","_destroy","remove","releaseContext","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","isAttached","activeElements","lastActive","_updateHoverStyles","notify","replay","hoverOptions","deactivated","activated","updateHoverStyle","eventFilter","_handleEvent","lastEvent","getElementsAtEventForMode","invalidatePlugins","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","o","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","alpha","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","p8","drawArc","fullCircles","drawFullCircleBorders","inner","lineJoin","unregister","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","mouseX","mouseY","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","addRectPath","inflateAmount","ArcElement","LineElement","PointElement","BarElement","lttbDecimation","samples","decimated","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","minMaxDecimation","minIndex","maxIndex","startIndex","xMin","xMax","dx","lastIndex","intermediateIndex1","intermediateIndex2","cleanDecimatedDataset","cleanDecimatedData","getStartAndCountOfVisiblePointsSimplified","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","threshold","getLineByIndex","parseFillOption","fillOption","decodeFill","computeLinearBoundary","computeCircularBoundary","computeBoundary","findSegmentEnd","pointsFromSegments","boundary","linePoints","buildStackLine","sourcePoints","linesBelow","getLinesBelow","createBoundaryLine","addPointsBelow","isLineAndNotInHideAnimation","below","unshift","sourcePoint","postponed","findPoint","interpolate","pointValue","firstValue","lastValue","resolveTarget","propagate","visited","clipY","getBounds","_getEdge","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","clipBounds","interpolatedLineTo","interpolatedPoint","_fill","src","notShape","lineLoop","targetLoop","doFill","above","drawfill","lineOpts","plugin_filler","_args","$filler","drawTime","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","itemHeight","itemsEqual","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","generateLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","heightLimit","totalWidth","currentColWidth","currentColHeight","col","rtlHelper","hitbox","leftForLtr","_draw","defaultColor","fontColor","halfFontSize","cursor","drawLegendBox","lineDash","drawOptions","SQRT2","xPlus","yBoxTop","xBoxLeft","textDirection","setWidth","realX","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","isListened","hoveredItem","_getLegendItemAt","sameItem","onLeave","plugin_legend","_element","adjustHitBoxes","handleEvent","ci","_padding","textSize","fontOpts","_drawArgs","createTitle","titleBlock","plugin_title","WeakMap","plugin_subtitle","positioners","hasValue","tooltipPosition","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","getLabelAndValue","getTooltipSize","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","radiusAndPadding","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","beforeTitle","afterTitle","bodyItems","scoped","beforeLabel","afterLabel","beforeFooter","afterFooter","itemSort","labelColor","labelPointStyle","labelTextColor","_createItems","getTitle","getBeforeBody","getBody","getAfterBody","getFooter","positionAndSize","backgroundPoint","external","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","bodyColor","_drawColorBox","footerAlign","footerColor","tooltipSize","drawCaret","quadraticCurveTo","animX","animY","_updateAnimationTarget","hasTooltipContent","globalAlpha","drawBody","drawFooter","positionChanged","_positionChanged","plugin_tooltip","labelCount","Decimation","Filler","Legend","SubTitle","Title","Tooltip","addIfString","findOrAddLabel","lastIndexOf","_startValue","_valueRange","getDecimalForPixel","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","_endValue","setMin","setMax","minSign","maxSign","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","stepSize","computeTickLimit","getTickLimit","numericGeneratorOptions","_maxDigits","handleTickRangeOptions","isMajor","tickVal","generateTicks","endExp","endSignificand","exp","significand","lastTick","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","furthestLimits","furthestAngles","valueCount","getPointLabelContext","getPointPosition","drawingArea","plFont","_pointLabels","hLimits","vLimits","_setReductions","_pointLabelItems","buildPointLabelItems","tickBackdropHeight","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","param","createPointLabelContext","logarithmic","setCenterPoint","largestPossibleRadius","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","angleMultiplier","scalingFactor","scaledDistance","pointLabel","distanceFromCenter","animate","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","startOf","determineUnitForAutoTicks","minUnit","capacity","interval","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","setMajorTicks","majorUnit","ticksFromTimestamps","_unit","_majorUnit","_offsets","_normalized","displayFormats","formats","normalized","_applyBounds","_getLabelBounds","endOf","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","minorFormat","majorFormat","_tickFormatFunction","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","_getLabelSize","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CategoryScale","LinearScale","LogarithmicScale","RadialLinearScale","TimeScale","registerables"],"mappings":"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","file":"js/cap-table~my-dashboard.a5eb0977.js","sourcesContent":["/*!\n * Chart.js v3.5.0\n * https://www.chartjs.org\n * (c) 2021 Chart.js Contributors\n * Released under the MIT License\n */\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n let ticking = false;\n let args = [];\n return function(...rest) {\n args = updateArgs(rest);\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n}\nfunction debounce(fn, delay) {\n let timeout;\n return function() {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay);\n } else {\n fn();\n }\n return delay;\n };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right, rtl) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\nfunction noop() {}\nconst uid = (function() {\n let id = 0;\n return function() {\n return id++;\n };\n}());\nfunction isNullOrUndef(value) {\n return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n return true;\n }\n return false;\n}\nfunction isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : value / dimension;\nconst toDimension = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\nfunction callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\nfunction _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\nfunction clone$1(source) {\n if (isArray(source)) {\n return source.map(clone$1);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for (; k < klen; ++k) {\n target[keys[k]] = clone$1(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n merge(tval, sval, options);\n } else {\n target[key] = clone$1(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n for (let i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!isObject(source)) {\n continue;\n }\n const keys = Object.keys(source);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, source, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone$1(sval);\n }\n}\nfunction _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\nconst emptyString = '';\nconst dot = '.';\nfunction indexOfDotOrLength(key, start) {\n const idx = key.indexOf(dot, start);\n return idx === -1 ? key.length : idx;\n}\nfunction resolveObjectKey(obj, key) {\n if (key === emptyString) {\n return obj;\n }\n let pos = 0;\n let idx = indexOfDotOrLength(key, pos);\n while (obj && idx > pos) {\n obj = obj[key.substr(pos, idx - pos)];\n pos = idx + 1;\n idx = indexOfDotOrLength(key, pos);\n }\n return obj;\n}\nfunction _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b) => a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < (-0.5 * PI)) {\n angle += TAU;\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n linear: t => t,\n easeInQuad: t => t * t,\n easeOutQuad: t => -t * (t - 2),\n easeInOutQuad: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n easeInCubic: t => t * t * t,\n easeOutCubic: t => (t -= 1) * t * t + 1,\n easeInOutCubic: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: t => t * t * t * t,\n easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n easeInOutQuart: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: t => t * t * t * t * t,\n easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n easeInOutQuint: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n easeOutSine: t => Math.sin(t * HALF_PI),\n easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: t => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic(t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack(t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack(t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n easeOutBounce(t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n easeInOutBounce: t => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\n/*!\n * @kurkle/color v0.1.9\n * https://github.com/kurkle/color#readme\n * (c) 2020 Jukka Kurkela\n * Released under the MIT License\n */\nconst map = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = '0123456789ABCDEF';\nconst h1 = (b) => hex[b & 0xF];\nconst h2 = (b) => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = (b) => (((b & 0xF0) >> 4) === (b & 0xF));\nfunction isShort(v) {\n\treturn eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\n}\nfunction hexParse(str) {\n\tvar len = str.length;\n\tvar ret;\n\tif (str[0] === '#') {\n\t\tif (len === 4 || len === 5) {\n\t\t\tret = {\n\t\t\t\tr: 255 & map[str[1]] * 17,\n\t\t\t\tg: 255 & map[str[2]] * 17,\n\t\t\t\tb: 255 & map[str[3]] * 17,\n\t\t\t\ta: len === 5 ? map[str[4]] * 17 : 255\n\t\t\t};\n\t\t} else if (len === 7 || len === 9) {\n\t\t\tret = {\n\t\t\t\tr: map[str[1]] << 4 | map[str[2]],\n\t\t\t\tg: map[str[3]] << 4 | map[str[4]],\n\t\t\t\tb: map[str[5]] << 4 | map[str[6]],\n\t\t\t\ta: len === 9 ? (map[str[7]] << 4 | map[str[8]]) : 255\n\t\t\t};\n\t\t}\n\t}\n\treturn ret;\n}\nfunction hexString(v) {\n\tvar f = isShort(v) ? h1 : h2;\n\treturn v\n\t\t? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '')\n\t\t: v;\n}\nfunction round(v) {\n\treturn v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n\treturn lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n\treturn lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n\treturn lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n\treturn lim(round(v * 100), 0, 100);\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n\tconst m = RGB_RE.exec(str);\n\tlet a = 255;\n\tlet r, g, b;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[7] !== r) {\n\t\tconst v = +m[7];\n\t\ta = 255 & (m[8] ? p2b(v) : v * 255);\n\t}\n\tr = +m[1];\n\tg = +m[3];\n\tb = +m[5];\n\tr = 255 & (m[2] ? p2b(r) : r);\n\tg = 255 & (m[4] ? p2b(g) : g);\n\tb = 255 & (m[6] ? p2b(b) : b);\n\treturn {\n\t\tr: r,\n\t\tg: g,\n\t\tb: b,\n\t\ta: a\n\t};\n}\nfunction rgbString(v) {\n\treturn v && (\n\t\tv.a < 255\n\t\t\t? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n\t\t\t: `rgb(${v.r}, ${v.g}, ${v.b})`\n\t);\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\treturn [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n\tconst f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n\treturn [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n\tconst rgb = hsl2rgbn(h, 1, 0.5);\n\tlet i;\n\tif (w + b > 1) {\n\t\ti = 1 / (w + b);\n\t\tw *= i;\n\t\tb *= i;\n\t}\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] *= 1 - w - b;\n\t\trgb[i] += w;\n\t}\n\treturn rgb;\n}\nfunction rgb2hsl(v) {\n\tconst range = 255;\n\tconst r = v.r / range;\n\tconst g = v.g / range;\n\tconst b = v.b / range;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h, s, d;\n\tif (max !== min) {\n\t\td = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\th = max === r\n\t\t\t? ((g - b) / d) + (g < b ? 6 : 0)\n\t\t\t: max === g\n\t\t\t\t? (b - r) / d + 2\n\t\t\t\t: (r - g) / d + 4;\n\t\th = h * 60 + 0.5;\n\t}\n\treturn [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n\treturn (\n\t\tArray.isArray(a)\n\t\t\t? f(a[0], a[1], a[2])\n\t\t\t: f(a, b, c)\n\t).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n\treturn calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n\treturn calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n\treturn calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n\treturn (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n\tconst m = HUE_RE.exec(str);\n\tlet a = 255;\n\tlet v;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[5] !== v) {\n\t\ta = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n\t}\n\tconst h = hue(+m[2]);\n\tconst p1 = +m[3] / 100;\n\tconst p2 = +m[4] / 100;\n\tif (m[1] === 'hwb') {\n\t\tv = hwb2rgb(h, p1, p2);\n\t} else if (m[1] === 'hsv') {\n\t\tv = hsv2rgb(h, p1, p2);\n\t} else {\n\t\tv = hsl2rgb(h, p1, p2);\n\t}\n\treturn {\n\t\tr: v[0],\n\t\tg: v[1],\n\t\tb: v[2],\n\t\ta: a\n\t};\n}\nfunction rotate(v, deg) {\n\tvar h = rgb2hsl(v);\n\th[0] = hue(h[0] + deg);\n\th = hsl2rgb(h);\n\tv.r = h[0];\n\tv.g = h[1];\n\tv.b = h[2];\n}\nfunction hslString(v) {\n\tif (!v) {\n\t\treturn;\n\t}\n\tconst a = rgb2hsl(v);\n\tconst h = a[0];\n\tconst s = n2p(a[1]);\n\tconst l = n2p(a[2]);\n\treturn v.a < 255\n\t\t? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n\t\t: `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map$1 = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n\tconst unpacked = {};\n\tconst keys = Object.keys(names);\n\tconst tkeys = Object.keys(map$1);\n\tlet i, j, k, ok, nk;\n\tfor (i = 0; i < keys.length; i++) {\n\t\tok = nk = keys[i];\n\t\tfor (j = 0; j < tkeys.length; j++) {\n\t\t\tk = tkeys[j];\n\t\t\tnk = nk.replace(k, map$1[k]);\n\t\t}\n\t\tk = parseInt(names[ok], 16);\n\t\tunpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n\t}\n\treturn unpacked;\n}\nlet names$1;\nfunction nameParse(str) {\n\tif (!names$1) {\n\t\tnames$1 = unpack();\n\t\tnames$1.transparent = [0, 0, 0, 0];\n\t}\n\tconst a = names$1[str.toLowerCase()];\n\treturn a && {\n\t\tr: a[0],\n\t\tg: a[1],\n\t\tb: a[2],\n\t\ta: a.length === 4 ? a[3] : 255\n\t};\n}\nfunction modHSL(v, i, ratio) {\n\tif (v) {\n\t\tlet tmp = rgb2hsl(v);\n\t\ttmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n\t\ttmp = hsl2rgb(tmp);\n\t\tv.r = tmp[0];\n\t\tv.g = tmp[1];\n\t\tv.b = tmp[2];\n\t}\n}\nfunction clone(v, proto) {\n\treturn v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n\tvar v = {r: 0, g: 0, b: 0, a: 255};\n\tif (Array.isArray(input)) {\n\t\tif (input.length >= 3) {\n\t\t\tv = {r: input[0], g: input[1], b: input[2], a: 255};\n\t\t\tif (input.length > 3) {\n\t\t\t\tv.a = n2b(input[3]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = clone(input, {r: 0, g: 0, b: 0, a: 1});\n\t\tv.a = n2b(v.a);\n\t}\n\treturn v;\n}\nfunction functionParse(str) {\n\tif (str.charAt(0) === 'r') {\n\t\treturn rgbParse(str);\n\t}\n\treturn hueParse(str);\n}\nclass Color {\n\tconstructor(input) {\n\t\tif (input instanceof Color) {\n\t\t\treturn input;\n\t\t}\n\t\tconst type = typeof input;\n\t\tlet v;\n\t\tif (type === 'object') {\n\t\t\tv = fromObject(input);\n\t\t} else if (type === 'string') {\n\t\t\tv = hexParse(input) || nameParse(input) || functionParse(input);\n\t\t}\n\t\tthis._rgb = v;\n\t\tthis._valid = !!v;\n\t}\n\tget valid() {\n\t\treturn this._valid;\n\t}\n\tget rgb() {\n\t\tvar v = clone(this._rgb);\n\t\tif (v) {\n\t\t\tv.a = b2n(v.a);\n\t\t}\n\t\treturn v;\n\t}\n\tset rgb(obj) {\n\t\tthis._rgb = fromObject(obj);\n\t}\n\trgbString() {\n\t\treturn this._valid ? rgbString(this._rgb) : this._rgb;\n\t}\n\thexString() {\n\t\treturn this._valid ? hexString(this._rgb) : this._rgb;\n\t}\n\thslString() {\n\t\treturn this._valid ? hslString(this._rgb) : this._rgb;\n\t}\n\tmix(color, weight) {\n\t\tconst me = this;\n\t\tif (color) {\n\t\t\tconst c1 = me.rgb;\n\t\t\tconst c2 = color.rgb;\n\t\t\tlet w2;\n\t\t\tconst p = weight === w2 ? 0.5 : weight;\n\t\t\tconst w = 2 * p - 1;\n\t\t\tconst a = c1.a - c2.a;\n\t\t\tconst w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\tw2 = 1 - w1;\n\t\t\tc1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n\t\t\tc1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n\t\t\tc1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n\t\t\tc1.a = p * c1.a + (1 - p) * c2.a;\n\t\t\tme.rgb = c1;\n\t\t}\n\t\treturn me;\n\t}\n\tclone() {\n\t\treturn new Color(this.rgb);\n\t}\n\talpha(a) {\n\t\tthis._rgb.a = n2b(a);\n\t\treturn this;\n\t}\n\tclearer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 - ratio;\n\t\treturn this;\n\t}\n\tgreyscale() {\n\t\tconst rgb = this._rgb;\n\t\tconst val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n\t\trgb.r = rgb.g = rgb.b = val;\n\t\treturn this;\n\t}\n\topaquer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 + ratio;\n\t\treturn this;\n\t}\n\tnegate() {\n\t\tconst v = this._rgb;\n\t\tv.r = 255 - v.r;\n\t\tv.g = 255 - v.g;\n\t\tv.b = 255 - v.b;\n\t\treturn this;\n\t}\n\tlighten(ratio) {\n\t\tmodHSL(this._rgb, 2, ratio);\n\t\treturn this;\n\t}\n\tdarken(ratio) {\n\t\tmodHSL(this._rgb, 2, -ratio);\n\t\treturn this;\n\t}\n\tsaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, ratio);\n\t\treturn this;\n\t}\n\tdesaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, -ratio);\n\t\treturn this;\n\t}\n\trotate(deg) {\n\t\trotate(this._rgb, deg);\n\t\treturn this;\n\t}\n}\nfunction index_esm(input) {\n\treturn new Color(input);\n}\n\nconst isPatternOrGradient = (value) => value instanceof CanvasGradient || value instanceof CanvasPattern;\nfunction color(value) {\n return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n constructor(_descriptors) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.describe(_descriptors);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n}\nvar defaults = new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n});\n\nfunction toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n let type, xOffset, yOffset, size, cornerRadius;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch (style) {\n default:\n ctx.arc(x, y, radius, 0, TAU);\n ctx.closePath();\n break;\n case 'triangle':\n ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n ctx.rect(x - size, y - size, 2 * size, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n case 'rectRot':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + yOffset, y - xOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n case 'cross':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'star':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n rad += QUARTER_PI;\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'line':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\nfunction _isPointInArea(point, area, margin) {\n margin = margin || 0.5;\n return point && area && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += font.lineHeight;\n }\n ctx.restore();\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction addRoundedRectPath(ctx, rect) {\n const {x, y, w, h, radius} = rect;\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n ctx.lineTo(x, y + h - radius.bottomLeft);\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n ctx.lineTo(x + w, y + radius.topRight);\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = v => +v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\nfunction toTRBL(value) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\nfunction toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = '';\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\nfunction resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\nfunction _addGrace(minmax, grace) {\n const {min, max} = minmax;\n return {\n min: min - Math.abs(toDimension(grace, min)),\n max: max + toDimension(grace, max)\n };\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {lo, hi};\n}\nconst _lookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n const set = new Set();\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n set.add(items[i]);\n }\n if (set.size === ilen) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n if (!defined(fallback)) {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: rootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete target._keys;\n delete scopes[0][prop];\n return true;\n },\n get(target, prop) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n has(target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n set(target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n storage[prop] = value;\n delete target[prop];\n delete target._keys;\n return true;\n }\n });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete proxy[prop];\n return true;\n },\n get(target, prop, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n set(target, prop, value) {\n proxy[prop] = value;\n delete target[prop];\n return true;\n }\n });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters';\nfunction _cached(target, prop, resolve) {\n let value = target[prop];\n if (defined(value)) {\n return value;\n }\n value = resolve();\n if (defined(value)) {\n target[prop] = value;\n }\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop];\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n value = value(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (isObject(value)) {\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n if (defined(_context.index) && isIndexable(prop)) {\n value = value[_context.index % value.length];\n } else if (isObject(value[0])) {\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, scope);\n if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n return fallback;\n }\n } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop);\n if (key === null) {\n return false;\n }\n if (defined(fallback) && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n return value;\n }\n return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (defined(value)) {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (defined(value)) {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01;\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\nfunction _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(evt, canvas) {\n const e = evt.native || evt;\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const {offsetX, offsetY} = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\nfunction getRelativePosition(evt, chart) {\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(evt, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect();\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n height = round1(width / 2);\n }\n return {\n width,\n height\n };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = deviceHeight / pixelRatio;\n chart.width = deviceWidth / pixelRatio;\n const canvas = chart.canvas;\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\nconst supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() {\n passiveSupported = true;\n return false;\n }\n };\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n }\n return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\nfunction _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x(x) {\n return x;\n },\n setWidth(w) {\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) {\n return x;\n },\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: (n, s, e) => n >= Math.min(s, e) && n <= Math.max(e, s),\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n let {start, end, loop} = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n return result;\n}\nfunction _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n while (start < count && points[start].skip) {\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while (end > start && points[end % count].skip) {\n end--;\n }\n end %= count;\n return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const baseStyle = readStyle(line.options);\n const count = points.length;\n const result = [];\n let start = segments[0].start;\n let i = start;\n for (const segment of segments) {\n let prevStyle = baseStyle;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext({\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex: line._datasetIndex\n }));\n if (styleChanged(style, prevStyle)) {\n result.push({start: start, end: i - 1, loop: segment.loop, style: prevStyle});\n prevStyle = style;\n start = i - 1;\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n result.push({start, end: i - 1, loop: segment.loop, style});\n start = i - 1;\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nexport { overrides as $, toPadding as A, each as B, getMaximumSize as C, _getParentNode as D, readUsedSize as E, throttled as F, supportsEventListenerOptions as G, HALF_PI as H, _isDomSupported as I, log10 as J, _factorize as K, finiteOrDefault as L, callback as M, _addGrace as N, toDegrees as O, PI as P, _measureText as Q, _int16Range as R, _alignPixel as S, TAU as T, clipArea as U, renderText as V, unclipArea as W, toFont as X, _toLeftRightCenter as Y, _alignStartEnd as Z, _arrayUnique as _, resolve as a, merge as a0, _capitalize as a1, descriptors as a2, isFunction as a3, _attachContext as a4, _createResolver as a5, _descriptors as a6, mergeIf as a7, uid as a8, debounce as a9, _setMinAndMaxByKey as aA, niceNum as aB, almostWhole as aC, almostEquals as aD, _decimalPlaces as aE, _longestText as aF, _filterBetween as aG, _lookup as aH, getHoverColor as aI, clone$1 as aJ, _merger as aK, _mergerIf as aL, _deprecated as aM, toFontString as aN, splineCurve as aO, splineCurveMonotone as aP, getStyle as aQ, fontString as aR, toLineHeight as aS, PITAU as aT, INFINITY as aU, RAD_PER_DEG as aV, QUARTER_PI as aW, TWO_THIRDS_PI as aX, _angleDiff as aY, retinaScale as aa, clearCanvas as ab, setsEqual as ac, _elementsEqual as ad, getAngleFromPoint as ae, _readValueToProps as af, _updateBezierControlPoints as ag, _computeSegments as ah, _boundSegments as ai, _steppedInterpolation as aj, _bezierInterpolation as ak, _pointInLine as al, _steppedLineTo as am, _bezierCurveTo as an, drawPoint as ao, addRoundedRectPath as ap, toTRBL as aq, toTRBLCorners as ar, _boundSegment as as, _normalizeAngle as at, getRtlAdapter as au, overrideTextDirection as av, _textX as aw, restoreTextDirection as ax, noop as ay, distanceBetweenPoints as az, isArray as b, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, isNullOrUndef as j, toPercentage as k, listenArrayEvents as l, toDimension as m, formatNumber as n, _angleBetween as o, isNumber as p, _limitValue as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _lookupByKey as w, getRelativePosition as x, _isPointInArea as y, _rlookupByKey as z };\n","/*!\n * Chart.js v3.5.0\n * https://www.chartjs.org\n * (c) 2021 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, d as defaults, i as isObject, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as isNullOrUndef, _ as _arrayUnique, t as toRadians, k as toPercentage, m as toDimension, T as TAU, n as formatNumber, o as _angleBetween, H as HALF_PI, P as PI, p as isNumber, q as _limitValue, w as _lookupByKey, x as getRelativePosition$1, y as _isPointInArea, z as _rlookupByKey, A as toPadding, B as each, C as getMaximumSize, D as _getParentNode, E as readUsedSize, F as throttled, G as supportsEventListenerOptions, I as _isDomSupported, J as log10, K as _factorize, L as finiteOrDefault, M as callback, N as _addGrace, O as toDegrees, Q as _measureText, R as _int16Range, S as _alignPixel, U as clipArea, V as renderText, W as unclipArea, X as toFont, Y as _toLeftRightCenter, Z as _alignStartEnd, $ as overrides, a0 as merge, a1 as _capitalize, a2 as descriptors, a3 as isFunction, a4 as _attachContext, a5 as _createResolver, a6 as _descriptors, a7 as mergeIf, a8 as uid, a9 as debounce, aa as retinaScale, ab as clearCanvas, ac as setsEqual, ad as _elementsEqual, ae as getAngleFromPoint, af as _readValueToProps, ag as _updateBezierControlPoints, ah as _computeSegments, ai as _boundSegments, aj as _steppedInterpolation, ak as _bezierInterpolation, al as _pointInLine, am as _steppedLineTo, an as _bezierCurveTo, ao as drawPoint, ap as addRoundedRectPath, aq as toTRBL, ar as toTRBLCorners, as as _boundSegment, at as _normalizeAngle, au as getRtlAdapter, av as overrideTextDirection, aw as _textX, ax as restoreTextDirection, ay as noop, az as distanceBetweenPoints, aA as _setMinAndMaxByKey, aB as niceNum, aC as almostWhole, aD as almostEquals, aE as _decimalPlaces, aF as _longestText, aG as _filterBetween, aH as _lookup } from './chunks/helpers.segment.js';\nexport { d as defaults } from './chunks/helpers.segment.js';\n\nclass Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n const me = this;\n if (me._request) {\n return;\n }\n me._running = true;\n me._request = requestAnimFrame.call(window, () => {\n me._update();\n me._request = null;\n if (me._running) {\n me._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n const me = this;\n let remaining = 0;\n me._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for (; i >= 0; --i) {\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n me._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n me._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n me._lastDate = date;\n if (remaining === 0) {\n me._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color(from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n const me = this;\n if (me._active) {\n me._notify(false);\n const currentValue = me._target[me._prop];\n const elapsed = date - me._start;\n const remain = me._duration - elapsed;\n me._start = date;\n me._duration = Math.floor(Math.max(remain, cfg.duration));\n me._total += elapsed;\n me._loop = !!cfg.loop;\n me._to = resolve([cfg.to, to, currentValue, cfg.from]);\n me._from = resolve([cfg.from, currentValue, to]);\n }\n }\n cancel() {\n const me = this;\n if (me._active) {\n me.tick(Date.now());\n me._active = false;\n me._notify(false);\n }\n }\n tick(date) {\n const me = this;\n const elapsed = date - me._start;\n const duration = me._duration;\n const prop = me._prop;\n const from = me._from;\n const loop = me._loop;\n const to = me._to;\n let factor;\n me._active = from !== to && (loop || (elapsed < duration));\n if (!me._active) {\n me._target[prop] = to;\n me._notify(true);\n return;\n }\n if (elapsed < 0) {\n me._target[prop] = from;\n return;\n }\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = me._easing(Math.min(1, Math.max(0, factor)));\n me._target[prop] = me._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n});\ndefaults.describe('animations', {\n _fallback: 'animation',\n});\ndefaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0\n },\n }\n }\n});\nclass Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\nfunction convertObjectDataToArray(data) {\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n x: key,\n y: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive) {\n for (const meta of vScale.getMatchingVisibleMetas('bar').reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true);\n stack._bottom = getLastIndexInStack(stack, vScale, false);\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return Object.assign(Object.create(parent),\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\nfunction createDataContext(parent, index, element) {\n return Object.assign(Object.create(parent), {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nclass DatasetController {\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.$context = undefined;\n this._syncList = [];\n this.initialize();\n }\n initialize() {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n me.addElements();\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const me = this;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = me.getScaleForId(xid);\n meta.yScale = me.getScaleForId(yid);\n meta.rScale = me.getScaleForId(rid);\n meta.iScale = me.getScaleForId(iid);\n meta.vScale = me.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const me = this;\n const dataset = me.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = me._data;\n if (isObject(data)) {\n me._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, me);\n const meta = me._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, me);\n }\n me._syncList = [];\n me._data = data;\n }\n }\n addElements() {\n const me = this;\n const meta = me._cachedMeta;\n me._dataCheck();\n if (me.datasetElementType) {\n meta.dataset = new me.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n let stackChanged = false;\n me._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n me._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(me, meta._parsed);\n }\n }\n configure() {\n const me = this;\n const config = me.chart.config;\n const scopeKeys = config.datasetScopeKeys(me._type);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys, true);\n me.options = config.createResolver(scopes, me.getContext());\n me._parsing = me.options.parsing;\n }\n parse(start, count) {\n const me = this;\n const {_cachedMeta: meta, _data: data} = me;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (me._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = me.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = me.parseObjectData(meta, data, start, count);\n } else {\n parsed = me.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(me, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n value = applyStack(stack, parsedValue, this._cachedMeta.index, {all: true});\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const me = this;\n const meta = me._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = me._getOtherScale(scale);\n const stack = canStack && meta._stacked && {keys: getSortedDatasetIndices(me.chart, true), values: null};\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, value, parsed, otherValue;\n function _skip() {\n parsed = _parsed[i];\n value = parsed[scale.axis];\n otherValue = parsed[otherScale.axis];\n return !isNumberFinite(value) || otherMin > otherValue || otherMax < otherValue;\n }\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me._cachedDataOpts = {};\n me.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(me.options.clip, defaultClip(meta.xScale, meta.yScale, me.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const me = this;\n const ctx = me._ctx;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = me._drawStart || 0;\n const count = me._drawCount || (elements.length - start);\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const me = this;\n const dataset = me.getDataset();\n let context;\n if (index >= 0 && index < me._cachedMeta.data.length) {\n const element = me._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(me.getContext(), index, element));\n context.parsed = me.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = me.$context ||\n (me.$context = createDatasetContext(me.chart.getContext(), me.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = me.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const me = this;\n const active = mode === 'active';\n const cache = me._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = me.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = me.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(me._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = () => me.getContext(index, active);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const me = this;\n const chart = me.chart;\n const cache = me._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = me.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(me._type, transition);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n options = config.createResolver(scopes, me.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const me = this;\n const data = me._data;\n const elements = me._cachedMeta.data;\n for (const [method, arg1, arg2] of me._syncList) {\n me[method](arg1, arg2);\n }\n me._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n me.parse(0, count);\n }\n if (numData > numMeta) {\n me._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n me._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const me = this;\n const meta = me._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for (i = start; i < end; ++i) {\n data[i] = new me.dataElementType();\n }\n if (me._parsing) {\n move(meta._parsed);\n }\n me.parse(start, count);\n if (resetNewElements) {\n me.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const me = this;\n const meta = me._cachedMeta;\n if (me._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _onDataPush() {\n const count = arguments.length;\n this._syncList.push(['_insertElements', this.getDataset().data.length - count, count]);\n }\n _onDataPop() {\n this._syncList.push(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n _onDataShift() {\n this._syncList.push(['_removeElements', 0, 1]);\n }\n _onDataSplice(start, count) {\n this._syncList.push(['_removeElements', start, count]);\n this._syncList.push(['_insertElements', start, arguments.length - 2]);\n }\n _onDataUnshift() {\n this._syncList.push(['_insertElements', 0, arguments.length]);\n }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nfunction getAllScaleValues(scale) {\n if (!scale._cache.$bar) {\n const metas = scale.getMatchingVisibleMetas('bar');\n let values = [];\n for (let i = 0, ilen = metas.length; i < ilen; i++) {\n values = values.concat(metas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\nfunction computeMinSampleSize(scale) {\n const values = getAllScaleValues(scale);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n const {start, end, reverse, top, bottom} = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nclass BarController extends DatasetController {\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n const me = this;\n me.enableOptionSharing = true;\n super.initialize();\n const meta = me._cachedMeta;\n meta.stack = me.getDataset().stack;\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = me;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = me._getRuler();\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n for (let i = start; i < start + count; i++) {\n const parsed = me.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : me._calculateBarValuePixels(i);\n const ipixels = me._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n setBorderSkipped(properties, properties.options || bars[i].options, stack, index);\n me.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const metasets = iScale.getMatchingVisibleMetas(me._type);\n const stacked = iScale.options.stacked;\n const ilen = metasets.length;\n const stacks = [];\n let i, item;\n for (i = 0; i < ilen; ++i) {\n item = metasets[i];\n if (!item.controller.options.grouped) {\n continue;\n }\n if (typeof dataIndex !== 'undefined') {\n const val = item.controller.getParsed(dataIndex)[\n item.controller._cachedMeta.vScale.axis\n ];\n if (isNullOrUndef(val) || isNaN(val)) {\n continue;\n }\n }\n if (stacked === false || stacks.indexOf(item.stack) === -1 ||\n\t\t\t\t(stacked === undefined && item.stack === undefined)) {\n stacks.push(item.stack);\n }\n if (item.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1;\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n _getRuler() {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(me.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(iScale);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: me._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const me = this;\n const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = me;\n const actualBase = baseValue || 0;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? me.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (me.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n head = base + size;\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const me = this;\n const scale = ruler.scale;\n const options = me.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? me._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(me.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const me = this;\n const meta = me._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for (; i < ilen; ++i) {\n if (me.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(me._ctx);\n }\n }\n }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n};\nBarController.overrides = {\n interaction: {\n mode: 'index'\n },\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n};\n\nclass BubbleController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = [];\n let i, ilen, item;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n item = data[i];\n parsed.push({\n x: xScale.parse(resolveObjectKey(item, xAxisKey), i),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), i),\n _custom: item && item.r && +item.r\n });\n }\n return parsed;\n }\n getMaxOverflow() {\n const {data, _parsed} = this._cachedMeta;\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size() / 2, _parsed[i]._custom);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {xScale, yScale} = meta;\n const parsed = me.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: meta.label,\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const me = this;\n const points = me._cachedMeta.data;\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && me.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n me.updateElement(point, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n};\nBubbleController.overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n }\n }\n }\n }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = +data[i];\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n const me = this;\n for (let i = 0; i < me.chart.data.datasets.length; ++i) {\n if (me.chart.isDatasetVisible(i)) {\n const controller = me.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n update(mode) {\n const me = this;\n const chart = me.chart;\n const {chartArea} = chart;\n const meta = me._cachedMeta;\n const arcs = meta.data;\n const spacing = me.getMaxBorderWidth() + me.getMaxOffset(arcs) + me.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(me.options.cutout, maxSize), 1);\n const chartWeight = me._getRingWeight(me.index);\n const {circumference, rotation} = me._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(me.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / me._getVisibleDatasetWeightTotal();\n me.offsetX = offsetX * outerRadius;\n me.offsetY = offsetY * outerRadius;\n meta.total = me.calculateTotal();\n me.outerRadius = outerRadius - radiusLength * me._getRingWeightOffset(me.index);\n me.innerRadius = Math.max(me.outerRadius - radiusLength * chartWeight, 0);\n me.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const circumference = me._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return me.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : me.innerRadius;\n const outerRadius = animateScale ? 0 : me.outerRadius;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n let startAngle = me._getRotation();\n let i;\n for (i = 0; i < start; ++i) {\n startAngle += me._circumference(i, reset);\n }\n for (i = start; i < start + count; ++i) {\n const circumference = me._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + me.offsetX,\n y: centerY + me.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n me.updateElement(arc, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n getMaxBorderWidth(arcs) {\n const me = this;\n let max = 0;\n const chart = me.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n if (controller !== me) {\n controller.configure();\n }\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r',\n};\nDoughnutController.descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing',\n};\nDoughnutController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle}} = chart.legend.options;\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(tooltipItem) {\n let dataLabel = tooltipItem.label;\n const value = ': ' + tooltipItem.formattedValue;\n if (isArray(dataLabel)) {\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n return dataLabel;\n }\n }\n }\n }\n};\n\nclass LineController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n const animationsDisabled = me.chart._animationsDisabled;\n let {start, count} = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n me._drawStart = start;\n me._drawCount = count;\n if (scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._datasetIndex = me.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = me.options.segment;\n me.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n me.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const spanGaps = me.options.spanGaps;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = me.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && me.getParsed(start - 1);\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = me.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? me.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n properties.parsed = parsed;\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n me.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(me.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(me.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\nLineController.id = 'line';\nLineController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false,\n};\nLineController.overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n};\nfunction getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(\n _lookupByKey(_parsed, iScale.axis, min).lo,\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n _lookupByKey(_parsed, iScale.axis, max).hi + 1,\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {start, count};\n}\nfunction scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nclass PolarAreaController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _updateRadius() {\n const me = this;\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n me.outerRadius = outerRadius - (radiusLength * me.index);\n me.innerRadius = me.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const dataset = me.getDataset();\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = me._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / me.countVisibleElements();\n for (i = 0; i < start; ++i) {\n angle += me._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + me._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: me.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n me.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const dataset = this.getDataset();\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index) => {\n if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n};\nPolarAreaController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle}} = chart.legend.options;\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(context) {\n return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n }\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n getLabelAndValue(index) {\n const me = this;\n const vScale = me._cachedMeta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n me.updateElement(line, undefined, properties, mode);\n }\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const dataset = me.getDataset();\n const scale = me._cachedMeta.rScale;\n const reset = mode === 'reset';\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n me.updateElement(point, i, properties, mode);\n }\n }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n};\nRadarController.overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n};\n\nclass ScatterController extends LineController {\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n showLine: false,\n fill: false\n};\nScatterController.overrides = {\n interaction: {\n mode: 'point'\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(item) {\n return '(' + item.label + ', ' + item.formattedValue + ')';\n }\n }\n }\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n constructor(options) {\n this.options = options || {};\n }\n formats() {\n return abstract();\n }\n parse(value, format) {\n return abstract();\n }\n format(timestamp, format) {\n return abstract();\n }\n add(timestamp, amount, unit) {\n return abstract();\n }\n diff(a, b, unit) {\n return abstract();\n }\n startOf(timestamp, unit, weekday) {\n return abstract();\n }\n endOf(timestamp, unit) {\n return abstract();\n }\n}\nDateAdapter.override = function(members) {\n Object.assign(DateAdapter.prototype, members);\n};\nvar adapters = {\n _date: DateAdapter\n};\n\nfunction getRelativePosition(e, chart) {\n if ('native' in e) {\n return {\n x: e.x,\n y: e.y\n };\n }\n return getRelativePosition$1(e, chart);\n}\nfunction evaluateAllVisibleItems(chart, handler) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n let index, data, element;\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n ({index, data} = metasets[i]);\n for (let j = 0, jlen = data.length; j < jlen; ++j) {\n element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n return {lo: 0, hi: data.length - 1};\n}\nfunction optimizedEvaluateItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition) {\n const items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition) {\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n let items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (intersect && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n if (!_isPointInArea(center, chart.chartArea, chart._minPadding) && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n return items;\n}\nfunction getAxisItems(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const items = [];\n const axis = options.axis;\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateAllVisibleItems(chart, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n intersectsItem = true;\n }\n });\n if (options.intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\nvar Interaction = {\n modes: {\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition)\n : getNearestItems(chart, position, axis, false, useFinalPosition);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n return elements;\n },\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition) :\n getNearestItems(chart, position, axis, false, useFinalPosition);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n return items;\n },\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getIntersectItems(chart, position, axis, useFinalPosition);\n },\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition);\n },\n x(chart, e, options, useFinalPosition) {\n options.axis = 'x';\n return getAxisItems(chart, e, options, useFinalPosition);\n },\n y(chart, e, options, useFinalPosition) {\n options.axis = 'y';\n return getAxisItems(chart, e, options, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\ndefaults.set('layout', {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n});\nvar layouts = {\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n chart.boxes.push(item);\n },\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h);\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition$1(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n const element = container || canvas;\n const observer = new MutationObserver(entries => {\n const parent = _getParentNode(element);\n entries.forEach(entry => {\n for (let i = 0; i < entry.addedNodes.length; i++) {\n const added = entry.addedNodes[i];\n if (added === element || added === parent) {\n listener(entry.target);\n }\n }\n });\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const observer = new MutationObserver(entries => {\n entries.forEach(entry => {\n for (let i = 0; i < entry.removedNodes.length; i++) {\n if (entry.removedNodes[i] === canvas) {\n listener();\n break;\n }\n }\n });\n });\n observer.observe(container, {childList: true});\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart, (args) => {\n const event = args[0];\n return [event, event.offsetX, event.offsetY];\n });\n addListener(canvas, type, proxy);\n return proxy;\n}\nclass DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n constructor() {\n this.x = undefined;\n this.y = undefined;\n this.active = false;\n this.options = undefined;\n this.$animations = undefined;\n }\n tooltipPosition(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const me = this;\n const anims = this.$animations;\n if (!final || !anims) {\n return me;\n }\n const ret = {};\n props.forEach(prop => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : me[prop];\n });\n return ret;\n }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst formatters = {\n values(value) {\n return isArray(value) ? value : '' + value;\n },\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n if (remain === 1 || remain === 2 || remain === 5) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n borderDash: [],\n borderDashOffset: 0.0,\n borderWidth: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n _fallback: 'scale',\n});\ndefaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n});\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return Object.assign(Object.create(parent), {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return Object.assign(Object.create(parent), {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n constructor(cfg) {\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n const me = this;\n me.options = options.setContext(me.getContext());\n me.axis = options.axis;\n me._userMin = me.parse(options.min);\n me._userMax = me.parse(options.max);\n me._suggestedMin = me.parse(options.suggestedMin);\n me._suggestedMax = me.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n const me = this;\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {min, max};\n }\n const metas = me.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(me, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n const me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [this]);\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n const tickOpts = me.options.ticks;\n const sampleSize = tickOpts.sampleSize;\n me.beforeUpdate();\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.ticks = null;\n me._labelSizes = null;\n me._gridLineItems = null;\n me._labelItems = null;\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n me._maxLength = me.isHorizontal()\n ? me.width + margins.left + margins.right\n : me.height + margins.top + margins.bottom;\n if (!me._dataLimitsCached) {\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n me._range = _addGrace(me, me.options.grace);\n me._dataLimitsCached = true;\n }\n me.beforeBuildTicks();\n me.ticks = me.buildTicks() || [];\n me.afterBuildTicks();\n const samplingEnabled = sampleSize < me.ticks.length;\n me._convertTicksToLabels(samplingEnabled ? sample(me.ticks, sampleSize) : me.ticks);\n me.configure();\n me.beforeCalculateLabelRotation();\n me.calculateLabelRotation();\n me.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n me.ticks = autoSkip(me, me.ticks);\n me._labelSizes = null;\n }\n if (samplingEnabled) {\n me._convertTicksToLabels(me.ticks);\n }\n me.beforeFit();\n me.fit();\n me.afterFit();\n me.afterUpdate();\n }\n configure() {\n const me = this;\n let reversePixels = me.options.reverse;\n let startPixel, endPixel;\n if (me.isHorizontal()) {\n startPixel = me.left;\n endPixel = me.right;\n } else {\n startPixel = me.top;\n endPixel = me.bottom;\n reversePixels = !reversePixels;\n }\n me._startPixel = startPixel;\n me._endPixel = endPixel;\n me._reversePixels = reversePixels;\n me._length = endPixel - startPixel;\n me._alignToPixels = me.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [this]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = 0;\n me.bottom = me.height;\n }\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [this]);\n }\n _callHooks(name) {\n const me = this;\n me.chart.notifyPlugins(name, me.getContext());\n callback(me.options[name], [me]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [this]);\n }\n generateTickLabels(ticks) {\n const me = this;\n const tickOpts = me.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [tick.value, i, ticks], me);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [this]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const me = this;\n const options = me.options;\n const tickOpts = options.ticks;\n const numTicks = me.ticks.length;\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {\n me.labelRotation = minRotation;\n return;\n }\n const labelSizes = me._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(me.chart.width - maxLabelWidth, 0, me.maxWidth);\n tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = me.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, me.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n me.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [this]);\n }\n beforeFit() {\n callback(this.options.beforeFit, [this]);\n }\n fit() {\n const me = this;\n const minSize = {\n width: 0,\n height: 0\n };\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = me;\n const display = me._isVisible();\n const isHorizontal = me.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = me.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = me.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && me.ticks.length) {\n const {first, last, widest, highest} = me._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(me.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n me._calculatePadding(first, last, sin, cos);\n }\n }\n me._handleMargins();\n if (isHorizontal) {\n me.width = me._length = chart.width - me._margins.left - me._margins.right;\n me.height = minSize.height;\n } else {\n me.width = minSize.width;\n me.height = me._length = chart.height - me._margins.top - me._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const me = this;\n const {ticks: {align, padding}, position} = me.options;\n const isRotated = me.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && me.axis === 'x';\n if (me.isHorizontal()) {\n const offsetLeft = me.getPixelForTick(0) - me.left;\n const offsetRight = me.right - me.getPixelForTick(me.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n me.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * me.width / (me.width - offsetLeft), 0);\n me.paddingRight = Math.max((paddingRight - offsetRight + padding) * me.width / (me.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n me.paddingTop = paddingTop + padding;\n me.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n const me = this;\n if (me._margins) {\n me._margins.left = Math.max(me.paddingLeft, me._margins.left);\n me._margins.top = Math.max(me.paddingTop, me._margins.top);\n me._margins.right = Math.max(me.paddingRight, me._margins.right);\n me._margins.bottom = Math.max(me.paddingBottom, me._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [this]);\n }\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n const me = this;\n me.beforeTickToLabelConversion();\n me.generateTickLabels(ticks);\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n me.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n const me = this;\n let labelSizes = me._labelSizes;\n if (!labelSizes) {\n const sampleSize = me.options.ticks.sampleSize;\n let ticks = me.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n me._labelSizes = labelSizes = me._computeLabelSizes(ticks, ticks.length);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for (i = 0; i < length; ++i) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n const me = this;\n if (me._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = me._startPixel + decimal * me._length;\n return _int16Range(me._alignToPixels ? _alignPixel(me.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const {min, max} = this;\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n getContext(index) {\n const me = this;\n const ticks = me.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(me.getContext(), index, tick));\n }\n return me.$context ||\n\t\t\t(me.$context = createScaleContext(me.chart.getContext(), me));\n }\n _tickSize() {\n const me = this;\n const optionTicks = me.options.ticks;\n const rot = toRadians(me.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = me._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return me.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const chart = me.chart;\n const options = me.options;\n const {grid, position} = options;\n const offset = grid.offset;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(me.bottom);\n ty1 = me.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(me.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = me.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(me.right);\n tx1 = me.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(me.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = me.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const optsAtIndex = grid.setContext(me.getContext(i));\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = grid.borderDash || [];\n const borderDashOffset = optsAtIndex.borderDashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(me, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n me._ticksLength = ticksLength;\n me._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const options = me.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(me.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = me.bottom - hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = me.top + hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = me.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = me._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = me.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = me._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = me._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(me.getContext(i));\n pixel = me.getPixelForTick(i) + optionTicks.labelOffset;\n font = me._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n if (isHorizontal) {\n x = pixel;\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = y + textOffset - labelPadding.top;\n let left = x - labelPadding.left;\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor,\n };\n }\n items.push({\n rotation,\n label,\n font,\n color,\n strokeColor,\n strokeWidth,\n textOffset,\n textAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const me = this;\n const {position, ticks} = me.options;\n const rotation = -toRadians(me.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const me = this;\n const {position, ticks: {crossAlign, mirror, padding}} = me.options;\n const labelSizes = me._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n textAlign = 'left';\n x = me.right + padding;\n } else {\n x = me.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = me.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n textAlign = 'right';\n x = me.left + padding;\n } else {\n x = me.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = me.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {textAlign, x};\n }\n _computeLabelArea() {\n const me = this;\n if (me.options.ticks.mirror) {\n return;\n }\n const chart = me.chart;\n const position = me.options.position;\n if (position === 'left' || position === 'right') {\n return {top: 0, left: me.left, bottom: chart.height, right: me.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: me.top, left: 0, bottom: me.bottom, right: chart.width};\n }\n }\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const me = this;\n const grid = me.options.grid;\n if (!me._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = me.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(me.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const me = this;\n const grid = me.options.grid;\n const ctx = me.ctx;\n const items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n drawBorder() {\n const me = this;\n const {chart, ctx, options: {grid}} = me;\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(me.getContext(0)).lineWidth;\n const borderValue = me._borderValue;\n let x1, x2, y1, y2;\n if (me.isHorizontal()) {\n x1 = _alignPixel(chart, me.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.borderWidth;\n ctx.strokeStyle = borderOpts.borderColor;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const me = this;\n const optionTicks = me.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = me.ctx;\n const area = me._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = me._labelItems || (me._labelItems = me._computeLabelItems(chartArea));\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n const tickFont = item.font;\n const label = item.label;\n if (item.backdrop) {\n ctx.fillStyle = item.backdrop.color;\n ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n }\n let y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, item);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n draw(chartArea) {\n const me = this;\n if (!me._isVisible()) {\n return;\n }\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawBorder();\n me.drawTitle();\n me.drawLabels(chartArea);\n }\n _layers() {\n const me = this;\n const opts = me.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n if (!me._isVisible() || me.draw !== Scale.prototype.draw) {\n return [{\n z: tz,\n draw(chartArea) {\n me.draw(chartArea);\n }\n }];\n }\n return [{\n z: gz,\n draw(chartArea) {\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawTitle();\n }\n }, {\n z: gz + 1,\n draw() {\n me.drawBorder();\n }\n }, {\n z: tz,\n draw(chartArea) {\n me.drawLabels(chartArea);\n }\n }];\n }\n getMatchingVisibleMetas(type) {\n const me = this;\n const metas = me.chart.getSortedVisibleDatasetMetas();\n const axisID = me.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === me.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const me = this;\n const fontSize = me._resolveTickFontOptions(0).lineHeight;\n return (me.isHorizontal() ? me.width : me.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const me = this;\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = me.register(proto);\n }\n const items = me.items;\n const id = item.id;\n const scope = me.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (me.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n const me = this;\n [...args].forEach(arg => {\n const reg = typedRegistry || me._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === me.plugins && arg.id)) {\n me._exec(method, reg, arg);\n } else {\n each(arg, item => {\n const itemReg = typedRegistry || me._getRegistryForType(item);\n me._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = new Registry();\n\nclass PluginService {\n constructor() {\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n const me = this;\n if (hook === 'beforeInit') {\n me._init = me._createDescriptors(chart, true);\n me._notify(me._init, chart, 'install');\n }\n const descriptors = filter ? me._descriptors(chart).filter(filter) : me._descriptors(chart);\n const result = me._notify(descriptors, chart, hook, args);\n if (hook === 'destroy') {\n me._notify(descriptors, chart, 'stop');\n me._notify(me._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\nfunction allPlugins(config) {\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n }\n }\n return plugins;\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, plugins, options, all) {\n const result = [];\n const context = chart.getContext();\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, plugin, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, plugin, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, scaleOptions) {\n if (id === 'x' || id === 'y') {\n return id;\n }\n return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const firstIDs = Object.create(null);\n const scales = Object.create(null);\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n const axis = determineAxis(id, scaleConf);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n firstIDs[axis] = firstIDs[axis] || id;\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const {options, type} = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {type},\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n for (const prop of names) {\n if ((isScriptable(prop) && isFunction(proxy[prop]))\n || (isIndexable(prop) && isArray(proxy[prop]))) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"3.5.0\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nclass Chart {\n constructor(item, userConfig) {\n const me = this;\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas can be reused.'\n );\n }\n const options = config.createResolver(config.chartOptionScopes(), me.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n const context = me.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this.scale = undefined;\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(() => this.update('resize'), options.resizeDelay || 0);\n instances[me.id] = me;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(me, 'complete', onAnimationsComplete);\n animator.listen(me, 'progress', onAnimationProgress);\n me._initialize();\n if (me.attached) {\n me.update();\n }\n }\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n _initialize() {\n const me = this;\n me.notifyPlugins('beforeInit');\n if (me.options.responsive) {\n me.resize();\n } else {\n retinaScale(me, me.options.devicePixelRatio);\n }\n me.bindEvents();\n me.notifyPlugins('afterInit');\n return me;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n _resize(width, height) {\n const me = this;\n const options = me.options;\n const canvas = me.canvas;\n const aspectRatio = options.maintainAspectRatio && me.aspectRatio;\n const newSize = me.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || me.platform.getDevicePixelRatio();\n me.width = newSize.width;\n me.height = newSize.height;\n me._aspectRatio = me.aspectRatio;\n if (!retinaScale(me, newRatio, true)) {\n return;\n }\n me.notifyPlugins('resize', {size: newSize});\n callback(options.onResize, [me, newSize], me);\n if (me.attached) {\n if (me._doResize()) {\n me.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const me = this;\n const options = me.options;\n const scaleOpts = options.scales;\n const scales = me.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: me.ctx,\n chart: me\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale) => {\n layouts.configure(me, scale, scale.options);\n layouts.addBox(me, scale);\n });\n }\n _updateMetasets() {\n const me = this;\n const metasets = me._metasets;\n const numData = me.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n me._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n me._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const me = this;\n const {_metasets: metasets, data: {datasets}} = me;\n if (metasets.length > datasets.length) {\n delete me._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n me._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const me = this;\n const newControllers = [];\n const datasets = me.data.datasets;\n let i, ilen;\n me._removeUnreferencedMetasets();\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = me.getDatasetMeta(i);\n const type = dataset.type || me.config.type;\n if (meta.type && meta.type !== type) {\n me._destroyDatasetMeta(i);\n meta = me.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, me.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = me.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass.prototype, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(me, i);\n newControllers.push(meta.controller);\n }\n }\n me._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n const me = this;\n each(me.data.datasets, (dataset, datasetIndex) => {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const me = this;\n const config = me.config;\n config.update();\n me._options = config.createResolver(config.chartOptionScopes(), me.getContext());\n each(me.scales, (scale) => {\n layouts.removeBox(me, scale);\n });\n const animsDisabled = me._animationsDisabled = !me.options.animation;\n me.ensureScalesHaveIDs();\n me.buildOrUpdateScales();\n const existingEvents = new Set(Object.keys(me._listeners));\n const newEvents = new Set(me.options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== me.options.responsive) {\n me.unbindEvents();\n me.bindEvents();\n }\n me._plugins.invalidate();\n if (me.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n const newControllers = me.buildOrUpdateControllers();\n me.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; i++) {\n const {controller} = me.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n me._minPadding = minPadding;\n me._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n me._updateDatasets(mode);\n me.notifyPlugins('afterUpdate', {mode});\n me._layers.sort(compare2Level('z', '_idx'));\n if (me._lastEvent) {\n me._eventHandler(me._lastEvent, true);\n }\n me.render();\n }\n _updateLayout(minPadding) {\n const me = this;\n if (me.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n layouts.update(me, me.width, me.height, minPadding);\n const area = me.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n me._layers = [];\n each(me.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n me._layers.push(...box._layers());\n }, me);\n me._layers.forEach((item, index) => {\n item._idx = index;\n });\n me.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n const me = this;\n const isFunction = typeof mode === 'function';\n if (me.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._updateDataset(i, isFunction ? mode({datasetIndex: i}) : mode);\n }\n me.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n _updateDataset(index, mode) {\n const me = this;\n const meta = me.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n if (me.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n me.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n const me = this;\n if (me.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n if (animator.has(me)) {\n if (me.attached && !animator.running(me)) {\n animator.start(me);\n }\n } else {\n me.draw();\n onAnimationsComplete({chart: me});\n }\n }\n draw() {\n const me = this;\n let i;\n if (me._resizeBeforeDraw) {\n const {width, height} = me._resizeBeforeDraw;\n me._resize(width, height);\n me._resizeBeforeDraw = null;\n }\n me.clear();\n if (me.width <= 0 || me.height <= 0) {\n return;\n }\n if (me.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n const layers = me._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(me.chartArea);\n }\n me._drawDatasets();\n for (; i < layers.length; ++i) {\n layers[i].draw(me.chartArea);\n }\n me.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const me = this;\n const metasets = me._sortedMetasets;\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n const me = this;\n if (me.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n const metasets = me.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n me._drawDataset(metasets[i]);\n }\n me.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const me = this;\n const ctx = me.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = me.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (me.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? me.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? me.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n me.notifyPlugins('afterDatasetDraw', args);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const me = this;\n const dataset = me.data.datasets[datasetIndex];\n const metasets = me._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = {chart: this, type: 'chart'});\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const me = this;\n const mode = visible ? 'show' : 'hide';\n const meta = me.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n me.update();\n } else {\n me.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {visible});\n me.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const me = this;\n const meta = me._metasets && me._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n delete me._metasets[datasetIndex];\n }\n }\n destroy() {\n const me = this;\n const {canvas, ctx} = me;\n let i, ilen;\n me.stop();\n animator.remove(me);\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._destroyDatasetMeta(i);\n }\n me.config.clearCache();\n if (canvas) {\n me.unbindEvents();\n clearCanvas(canvas, ctx);\n me.platform.releaseContext(ctx);\n me.canvas = null;\n me.ctx = null;\n }\n me.notifyPlugins('destroy');\n delete instances[me.id];\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const me = this;\n const listeners = me._listeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const listener = function(e, x, y) {\n e.offsetX = x;\n e.offsetY = y;\n me._eventHandler(e);\n };\n each(me.options.events, (type) => _add(type, listener));\n }\n bindResponsiveEvents() {\n const me = this;\n if (!me._responsiveListeners) {\n me._responsiveListeners = {};\n }\n const listeners = me._responsiveListeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(me, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height) => {\n if (me.canvas) {\n me.resize(width, height);\n }\n };\n let detached;\n const attached = () => {\n _remove('attach', attached);\n me.attached = true;\n me.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = () => {\n me.attached = false;\n _remove('resize', listener);\n _add('attach', attached);\n };\n if (platform.isAttached(me.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n const me = this;\n each(me._listeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._listeners = {};\n each(me._responsiveListeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const me = this;\n const lastActive = me._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n me._active = active;\n me._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n _updateHoverStyles(active, lastActive, replay) {\n const me = this;\n const hoverOptions = me.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n me.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n me.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const me = this;\n const args = {event: e, replay, cancelable: true};\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.type);\n if (me.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = me._handleEvent(e, replay);\n args.cancelable = false;\n me.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n me.render();\n }\n return me;\n }\n _handleEvent(e, replay) {\n const me = this;\n const {_active: lastActive = [], options} = me;\n const hoverOptions = options.hover;\n const useFinalPosition = replay;\n let active = [];\n let changed = false;\n let lastEvent = null;\n if (e.type !== 'mouseout') {\n active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n lastEvent = e.type === 'click' ? me._lastEvent : e;\n }\n me._lastEvent = null;\n if (_isPointInArea(e, me.chartArea, me._minPadding)) {\n callback(options.onHover, [e, active, me], me);\n if (e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu') {\n callback(options.onClick, [e, active, me], me);\n }\n }\n changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n me._active = active;\n me._updateHoverStyles(active, lastActive, replay);\n }\n me._lastEvent = lastEvent;\n return changed;\n }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n defaults: {\n enumerable,\n value: defaults\n },\n instances: {\n enumerable,\n value: instances\n },\n overrides: {\n enumerable,\n value: overrides\n },\n registry: {\n enumerable,\n value: registry\n },\n version: {\n enumerable,\n value: version\n },\n getChart: {\n enumerable,\n value: getChart\n },\n register: {\n enumerable,\n value: (...items) => {\n registry.add(...items);\n invalidatePlugins();\n }\n },\n unregister: {\n enumerable,\n value: (...items) => {\n registry.remove(...items);\n invalidatePlugins();\n }\n }\n});\n\nfunction clipArc(ctx, element, endAngle) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\nfunction rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\nfunction pathArc(ctx, element, offset, spacing, end) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, startAngle + TAU);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + circumference % TAU;\n if (circumference % TAU === 0) {\n endAngle += TAU;\n }\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle);\n ctx.fill();\n return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n const {x, y, startAngle, pixelMargin, fullCircles} = element;\n const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n const innerRadius = element.innerRadius + pixelMargin;\n let i;\n if (inner) {\n clipArc(ctx, element, startAngle + TAU);\n }\n ctx.beginPath();\n ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n}\nfunction drawBorder(ctx, element, offset, spacing, endAngle) {\n const {options} = element;\n const inner = options.borderAlign === 'inner';\n if (!options.borderWidth) {\n return;\n }\n if (inner) {\n ctx.lineWidth = options.borderWidth * 2;\n ctx.lineJoin = 'round';\n } else {\n ctx.lineWidth = options.borderWidth;\n ctx.lineJoin = 'bevel';\n }\n if (element.fullCircles) {\n drawFullCircleBorders(ctx, element, inner);\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n pathArc(ctx, element, offset, spacing, endAngle);\n ctx.stroke();\n}\nclass ArcElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = this.options.spacing / 2;\n const betweenAngles = circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = (distance >= innerRadius + rAdjust && distance <= outerRadius + rAdjust);\n return (betweenAngles && withinRadius);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference',\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const me = this;\n const {options, circumference} = me;\n const offset = (options.offset || 0) / 2;\n const spacing = (options.spacing || 0) / 2;\n me.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n me.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || me.innerRadius < 0 || me.outerRadius < 0) {\n return;\n }\n ctx.save();\n let radiusOffset = 0;\n if (offset) {\n radiusOffset = offset / 2;\n const halfAngle = (me.startAngle + me.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n if (me.circumference >= PI) {\n radiusOffset = offset;\n }\n }\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n const endAngle = drawArc(ctx, me, radiusOffset, spacing);\n drawBorder(ctx, me, radiusOffset, spacing, endAngle);\n ctx.restore();\n }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n};\nArcElement.defaultRoutes = {\n backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let {move = true, reverse} = params || {};\n let i, point, prev;\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && line.segments.length === 1) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n constructor(cfg) {\n super();\n this.animated = true;\n this.options = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const me = this;\n const options = me.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !me._pointsUpdated) {\n const loop = options.spanGaps ? me._loop : me._fullLoop;\n _updateBezierControlPoints(me._points, options, chartArea, loop, indexAxis);\n me._pointsUpdated = true;\n }\n }\n set points(points) {\n const me = this;\n me._points = points;\n delete me._segments;\n delete me._path;\n me._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const me = this;\n const options = me.options;\n const value = point[property];\n const points = me.points;\n const segments = _boundSegments(me, {property, start: value, end: value});\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const me = this;\n const segments = me.segments;\n const segmentMethod = _getSegmentMethod(me);\n let loop = me._loop;\n start = start || 0;\n count = count || (me.points.length - start);\n for (const segment of segments) {\n loop &= segmentMethod(ctx, me, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const me = this;\n const options = me.options || {};\n const points = me.points || [];\n if (!points.length || !options.borderWidth) {\n return;\n }\n ctx.save();\n draw(ctx, me, start, count);\n ctx.restore();\n if (me.animated) {\n me._pointsUpdated = false;\n me._path = undefined;\n }\n }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n};\nLineElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const me = this;\n const options = me.options;\n if (me.skip || options.radius < 0.1 || !_isPointInArea(me, area, me.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, me.x, me.y);\n }\n getRange() {\n const options = this.options || {};\n return options.radius + options.hitRadius;\n }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n};\nPointElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {left, top, right, bottom};\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const options = this.options;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n const inflateAmount = 0.33;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = options.borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount, outer));\n ctx.fillStyle = options.backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n enableBorderRadius: true,\n pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for (i = 0; i < samples - 2; i++) {\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for (j = avgRangeStart; j < avgRangeEnd; j++) {\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const {x: pointAx, y: pointAy} = data[a];\n maxArea = area = -1;\n for (j = rangeOffs; j < rangeTo; j++) {\n area = 0.5 * Math.abs(\n (pointAx - avgX) * (data[j].y - pointAy) -\n (pointAx - data[j].x) * (avgY - pointAy)\n );\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for (i = start; i < start + count; ++i) {\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX,\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {value: data});\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset) => {\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const {iScale} = meta;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {start, count};\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false,\n },\n beforeElementsUpdate: (chart, args, options) => {\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex) => {\n const {_data, indexAxis} = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n return;\n }\n if (meta.type !== 'line') {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch (options.algorithm) {\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy(chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\nfunction decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n }\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n let target = null;\n let horizontal;\n if (fill === 'start') {\n target = scale.bottom;\n } else if (fill === 'end') {\n target = scale.top;\n } else if (isObject(fill)) {\n target = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n if (isNumberFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n return null;\n}\nclass simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const target = [];\n const start = options.reverse ? scale.max : scale.min;\n const end = options.reverse ? scale.min : scale.max;\n let i, center, value;\n if (fill === 'start') {\n value = start;\n } else if (fill === 'end') {\n value = end;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n if (options.grid.circular) {\n center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for (i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\nfunction buildStackLine(source) {\n const {chart, scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(chart, index);\n linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line));\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\nconst isLineAndNotInHideAnimation = (meta) => meta.type === 'line' && !meta.hidden;\nfunction getLinesBelow(chart, index) {\n const below = [];\n const metas = chart.getSortedVisibleDatasetMetas();\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (isLineAndNotInHideAnimation(meta)) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (pointValue >= firstValue && pointValue <= lastValue) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\nfunction getTarget(source) {\n const {chart, fill, line} = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return createBoundaryLine(boundary, line);\n}\nfunction createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n if (!propagate) {\n return fill;\n }\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\nfunction _clip(ctx, target, clipY) {\n ctx.beginPath();\n target.path(ctx);\n ctx.lineTo(target.last().x, clipY);\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments) {\n let {start, end} = segment;\n end = findSegmentEnd(start, end, points);\n const bounds = getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments) {\n const subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction clipBounds(ctx, scale, bounds) {\n const {top, bottom} = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\nfunction _fill(ctx, cfg) {\n const {line, target, property, color, scale} = cfg;\n const segments = _segments(line, target, property);\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n _clip(ctx, target, area.top);\n _fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n _clip(ctx, target, area.bottom);\n }\n _fill(ctx, {line, target, color: below, scale, property});\n ctx.restore();\n}\nfunction drawfill(ctx, source, area) {\n const target = getTarget(source);\n const {line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis});\n unclipArea(ctx);\n }\n}\nvar plugin_filler = {\n id: 'filler',\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw) {\n drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (source) {\n drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n if (!source || source.fill === false || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config) {\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins;\n me.setDimensions();\n me.buildLabels();\n me.fit();\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = me._margins.left;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = me._margins.top;\n me.bottom = me.height;\n }\n }\n buildLabels() {\n const me = this;\n const labelOpts = me.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [me.chart], me) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, me.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, me.chart.data));\n }\n if (me.options.reverse) {\n legendItems.reverse();\n }\n me.legendItems = legendItems;\n }\n fit() {\n const me = this;\n const {options, ctx} = me;\n if (!options.display) {\n me.width = me.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = me._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (me.isHorizontal()) {\n width = me.maxWidth;\n height = me._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = me.maxHeight;\n width = me._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n }\n me.width = Math.min(width, options.maxWidth || me.maxWidth);\n me.height = Math.min(height, options.maxHeight || me.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxWidth, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const lineWidths = me.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxHeight, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const columnSizes = me.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n return totalWidth;\n }\n adjustHitBoxes() {\n const me = this;\n if (!me.options.display) {\n return;\n }\n const titleHeight = me._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = me;\n const rtlHelper = getRtlAdapter(rtl, me.left, me.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n }\n hitbox.top += me.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += me.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n const me = this;\n if (me.options.display) {\n const ctx = me.ctx;\n clipArea(ctx, me);\n me._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const me = this;\n const {options: opts, columnSizes, lineWidths, ctx} = me;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const labelFont = toFont(labelOpts.font);\n const {color: fontColor, padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n me.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxWidth * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = me.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, me.left + padding, me.right - lineWidths[0]),\n y: me.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + padding,\n y: _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(me.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n me.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor || fontColor;\n ctx.fillStyle = legendItem.fontColor || fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(me.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > me.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, me.left + padding, me.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > me.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : me.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(me.ctx, opts.textDirection);\n }\n drawTitle() {\n const me = this;\n const opts = me.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const ctx = me.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = me.left;\n let maxWidth = me.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...me.lineWidths);\n y = me.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, me.right - maxWidth);\n } else {\n const maxHeight = me.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, me.top, me.bottom - maxHeight - opts.labels.padding - me._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n const me = this;\n let i, hitBox, lh;\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n lh = me.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n return me.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const me = this;\n const opts = me.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = me._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove') {\n const previous = me._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [e, previous, me], me);\n }\n me._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [e, hoveredItem, me], me);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [e, hoveredItem, me], me);\n }\n }\n}\nfunction isListened(type, opts) {\n if (type === 'mousemove' && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: 0,\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n\nclass Title extends Element {\n constructor(config) {\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const me = this;\n const opts = me.options;\n me.left = 0;\n me.top = 0;\n if (!opts.display) {\n me.width = me.height = me.right = me.bottom = 0;\n return;\n }\n me.width = me.right = maxWidth;\n me.height = me.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n me._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + me._padding.height;\n if (me.isHorizontal()) {\n me.height = textSize;\n } else {\n me.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const {top, left, bottom, right, options} = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {titleX, titleY, maxWidth, rotation};\n }\n draw() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + me._padding.top;\n const {titleX, titleY, maxWidth, rotation} = me._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold',\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst positioners = {\n average(items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\n y: y / count\n };\n },\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip._chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? (boxWidth + 2) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {width, height};\n}\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n const yAlign = options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const radiusAndPadding = cornerRadius + caretPadding;\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return Object.assign(Object.create(parent), {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n constructor(config) {\n super();\n this.opacity = 0;\n this._active = [];\n this._chart = config._chart;\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const me = this;\n const cached = me._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = me._chart;\n const options = me.options.setContext(me.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(me._chart, opts);\n if (opts._cacheable) {\n me._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n const me = this;\n return me.$context ||\n\t\t\t(me.$context = createTooltipContext(me._chart.getContext(), me, me._tooltipItems));\n }\n getTitle(context, options) {\n const me = this;\n const {callbacks} = options;\n const beforeTitle = callbacks.beforeTitle.apply(me, [context]);\n const title = callbacks.title.apply(me, [context]);\n const afterTitle = callbacks.afterTitle.apply(me, [context]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n }\n getBody(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const bodyItems = [];\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(me, context)));\n pushOrConcat(bodyItem.lines, scoped.label.call(me, context));\n pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(me, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n }\n getFooter(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const beforeFooter = callbacks.beforeFooter.apply(me, [tooltipItems]);\n const footer = callbacks.footer.apply(me, [tooltipItems]);\n const afterFooter = callbacks.afterFooter.apply(me, [tooltipItems]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const me = this;\n const active = me._active;\n const data = me._chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(me._chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(scoped.labelColor.call(me, context));\n labelPointStyles.push(scoped.labelPointStyle.call(me, context));\n labelTextColors.push(scoped.labelTextColor.call(me, context));\n });\n me.labelColors = labelColors;\n me.labelPointStyles = labelPointStyles;\n me.labelTextColors = labelTextColors;\n me.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n const active = me._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (me.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(me, active, me._eventPosition);\n tooltipItems = me._createItems(options);\n me.title = me.getTitle(tooltipItems, options);\n me.beforeBody = me.getBeforeBody(tooltipItems, options);\n me.body = me.getBody(tooltipItems, options);\n me.afterBody = me.getAfterBody(tooltipItems, options);\n me.footer = me.getFooter(tooltipItems, options);\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(me._chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, me._chart);\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n me._tooltipItems = tooltipItems;\n me.$context = undefined;\n if (properties) {\n me._resolveAnimations().update(me, properties);\n }\n if (changed && options.external) {\n options.external.call(me, {chart: me._chart, tooltip: me, replay});\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {cornerRadius, caretSize} = options;\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n drawTitle(pt, ctx, options) {\n const me = this;\n const title = me.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const me = this;\n const labelColors = me.labelColors[i];\n const labelPointStyle = me.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(me, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColors.borderColor;\n ctx.fillStyle = labelColors.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = labelColors.borderWidth || 1;\n ctx.strokeStyle = labelColors.borderColor;\n ctx.setLineDash(labelColors.borderDash || []);\n ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColors.borderRadius);\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = me.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const me = this;\n const {body} = me;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(me, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(me.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + 1) : (boxWidth + 2)\n : 0;\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = me.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n me._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(me.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const me = this;\n const footer = me.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const radius = options.cornerRadius;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const me = this;\n const chart = me._chart;\n const anims = me.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(me, me._active, me._eventPosition);\n if (!position) {\n return;\n }\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, me._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n me.width = size.width;\n me.height = size.height;\n me.caretX = position.x;\n me.caretY = position.y;\n me._resolveAnimations().update(me, point);\n }\n }\n }\n draw(ctx) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n let opacity = me.opacity;\n if (!opacity) {\n return;\n }\n me._updateAnimationTarget(options);\n const tooltipSize = {\n width: me.width,\n height: me.height\n };\n const pt = {\n x: me.x,\n y: me.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = me.title.length || me.beforeBody.length || me.body.length || me.afterBody.length || me.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n me.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n me.drawTitle(pt, ctx, options);\n me.drawBody(pt, ctx, options);\n me.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const me = this;\n const lastActive = me._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me._chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = me._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n me._active = active;\n me._eventPosition = eventPosition;\n me.update(true);\n }\n }\n handleEvent(e, replay) {\n const me = this;\n const options = me.options;\n const lastActive = me._active || [];\n let changed = false;\n let active = [];\n if (e.type !== 'mouseout') {\n active = me._chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n }\n const positionChanged = me._positionChanged(active, e);\n changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n me._active = active;\n if (options.enabled || options.external) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n me.update(true, replay);\n }\n }\n return changed;\n }\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({_chart: chart, options});\n }\n },\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n return;\n }\n if (tooltip) {\n tooltip.draw(chart.ctx);\n }\n chart.notifyPlugins('afterTooltipDraw', args);\n },\n afterEvent(chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: {\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n }\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: plugin_filler,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index) => typeof raw === 'string'\n ? labels.push(raw) - 1\n : isNaN(raw) ? null : index;\nfunction findOrAddLabel(labels, raw, index) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw));\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me.getMinMax(true);\n if (me.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = me.getLabels().length - 1;\n }\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const min = me.min;\n const max = me.max;\n const offset = me.options.offset;\n const ticks = [];\n let labels = me.getLabels();\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n me._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n me._startValue = me.min - (offset ? 0.5 : 0);\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n getLabelForValue(value) {\n const me = this;\n const labels = me.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n }\n configure() {\n const me = this;\n super.configure();\n if (!me.isHorizontal()) {\n me._reversePixels = !me._reversePixels;\n }\n }\n getPixelForValue(value) {\n const me = this;\n if (typeof value !== 'number') {\n value = me.parse(value);\n }\n return value === null ? NaN : me.getPixelForDecimal((value - me._startValue) / me._valueRange);\n }\n getPixelForTick(index) {\n const me = this;\n const ticks = me.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return me.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n const me = this;\n return Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n ticks: {\n callback: CategoryScale.prototype.getLabelForValue\n }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for (; j < numSpaces; ++j) {\n ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const me = this;\n const {beginAtZero} = me.options;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = 1;\n if (max >= Number.MAX_SAFE_INTEGER || min <= Number.MIN_SAFE_INTEGER) {\n offset = Math.abs(max * 0.05);\n }\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n me.min = min;\n me.max = max;\n }\n getTickLimit() {\n const me = this;\n const tickOpts = me.options.ticks;\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n } else {\n maxTicks = me.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const tickOpts = opts.ticks;\n let maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: me._maxDigits(),\n horizontal: me.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = me._range || me;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n configure() {\n const me = this;\n const ticks = me.ticks;\n let start = me.min;\n let end = me.max;\n super.configure();\n if (me.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n me._startValue = start;\n me._endValue = end;\n me._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? min : 0;\n me.max = isNumberFinite(max) ? max : 1;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n const me = this;\n const horizontal = me.isHorizontal();\n const length = horizontal ? me.width : me.height;\n const minRotation = toRadians(me.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = me._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n};\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n const endExp = Math.floor(log10(dataRange.max));\n const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n const ticks = [];\n let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n let exp = Math.floor(log10(tickVal));\n let significand = Math.floor(tickVal / Math.pow(10, exp));\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n do {\n ticks.push({value: tickVal, major: isMajor(tickVal)});\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n precision = exp >= 0 ? 1 : precision;\n }\n tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n ticks.push({value: lastTick, major: isMajor(tickVal)});\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? Math.max(0, min) : null;\n me.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (me.options.beginAtZero) {\n me._zero = true;\n }\n me.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let min = me.min;\n let max = me.max;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(exp(min, -1));\n setMax(exp(max, +1));\n }\n }\n if (min <= 0) {\n setMin(exp(max, -1));\n }\n if (max <= 0) {\n setMax(exp(min, +1));\n }\n if (me._zero && me.min !== me._suggestedMin && min === exp(me.min, 0)) {\n setMin(exp(min, -1));\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const generationOptions = {\n min: me._userMin,\n max: me._userMax\n };\n const ticks = generateTicks(generationOptions, me);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale);\n }\n configure() {\n const me = this;\n const start = me.min;\n super.configure();\n me._startValue = log10(start);\n me._valueRange = log10(me.max) - log10(start);\n }\n getPixelForValue(value) {\n const me = this;\n if (value === undefined || value === 0) {\n value = me.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return me.getPixelForDecimal(value === me.min\n ? 0\n : (log10(value) - me._startValue) / me._valueRange);\n }\n getValueForPixel(pixel) {\n const me = this;\n const decimal = me.getDecimalForPixel(pixel);\n return Math.pow(10, me._startValue + decimal * me._valueRange);\n }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n};\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\nfunction fitWithPointLabels(scale) {\n const furthestLimits = {\n l: 0,\n r: scale.width,\n t: 0,\n b: scale.height - scale.paddingTop\n };\n const furthestAngles = {};\n const labelSizes = [];\n const padding = [];\n const valueCount = scale.getLabels().length;\n for (let i = 0; i < valueCount; i++) {\n const opts = scale.options.pointLabels.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i]);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = scale.getIndexAngle(i);\n const angle = toDegrees(angleRadians);\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n scale._setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale.getLabels().length;\n const opts = scale.options;\n const tickBackdropHeight = getTickBackdropHeight(opts);\n const outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n for (let i = 0; i < valueCount; i++) {\n const extra = (i === 0 ? tickBackdropHeight / 2 : 0);\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i]);\n const angle = toDegrees(scale.getIndexAngle(i));\n const size = labelSizes[i];\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n items.push({\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n });\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n for (let i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n const {backdropColor} = optsAtIndex;\n if (!isNullOrUndef(backdropColor)) {\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillStyle = backdropColor;\n ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height);\n }\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const {color, lineWidth} = gridLineOpts;\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(gridLineOpts.borderDash);\n ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction numberOrZero(param) {\n return isNumber(param) ? param : 0;\n}\nfunction createPointLabelContext(parent, index, label) {\n return Object.assign(Object.create(parent), {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n constructor(cfg) {\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const me = this;\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.paddingTop = getTickBackdropHeight(me.options) / 2;\n me.xCenter = Math.floor(me.width / 2);\n me.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(false);\n me.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n me.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n const me = this;\n LinearScaleBase.prototype.generateTickLabels.call(me, ticks);\n me._pointLabels = me.getLabels().map((value, index) => {\n const label = callback(me.options.pointLabels.callback, [value, index], me);\n return label || label === 0 ? label : '';\n });\n }\n fit() {\n const me = this;\n const opts = me.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(me);\n } else {\n me.setCenterPoint(0, 0, 0, 0);\n }\n }\n _setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n const me = this;\n let radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n let radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n let radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n let radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n me.drawingArea = Math.max(largestPossibleRadius / 2, Math.min(\n Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n const me = this;\n const maxRight = me.width - rightMovement - me.drawingArea;\n const maxLeft = leftMovement + me.drawingArea;\n const maxTop = topMovement + me.drawingArea;\n const maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;\n me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / this.getLabels().length;\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n const me = this;\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const me = this;\n const scaledDistance = distance / (me.drawingArea / (me.max - me.min));\n return me.options.reverse ? me.max - scaledDistance : me.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const me = this;\n const pointLabels = me._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(me.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter) {\n const me = this;\n const angle = me.getIndexAngle(index) - HALF_PI;\n return {\n x: Math.cos(angle) * distanceFromCenter + me.xCenter,\n y: Math.sin(angle) * distanceFromCenter + me.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n drawBackground() {\n const me = this;\n const {backgroundColor, grid: {circular}} = me.options;\n if (backgroundColor) {\n const ctx = me.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(me, me.getDistanceFromCenterForValue(me._endValue), circular, me.getLabels().length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const {angleLines, grid} = opts;\n const labelCount = me.getLabels().length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(me, labelCount);\n }\n if (grid.display) {\n me.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = me.getDistanceFromCenterForValue(tick.value);\n const optsAtIndex = grid.setContext(me.getContext(index - 1));\n drawRadiusLine(me, optsAtIndex, offset, labelCount);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for (i = me.getLabels().length - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(me.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);\n position = me.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(me.xCenter, me.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = me.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n me.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(me.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = me.getDistanceFromCenterForValue(me.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback(label) {\n return label;\n },\n padding: 5\n }\n};\nRadialLinearScale.defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n};\n\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n return a - b;\n}\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n constructor(props) {\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const me = this;\n const options = me.options;\n const adapter = me._adapter;\n const unit = options.time.unit || 'day';\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(me._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(me.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n me.min = Math.min(min, max - 1);\n me.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n buildTicks() {\n const me = this;\n const options = me.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? me.getLabelTimestamps() : me._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n me.min = me._userMin || timestamps[0];\n me.max = me._userMax || timestamps[timestamps.length - 1];\n }\n const min = me.min;\n const max = me.max;\n const ticks = _filterBetween(timestamps, min, max);\n me._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, me._getLabelCapacity(min))\n : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));\n me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined\n : determineMajorUnit(me._unit);\n me.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(me, ticks, me._majorUnit);\n }\n initOffsets(timestamps) {\n const me = this;\n let start = 0;\n let end = 0;\n let first, last;\n if (me.options.offset && timestamps.length) {\n first = me.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (me.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = me.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - me.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n me._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n _generate() {\n const me = this;\n const adapter = me._adapter;\n const min = me.min;\n const max = me.max;\n const options = me.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, me._getLabelCapacity(min));\n const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && me.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n }\n getLabelForValue(value) {\n const me = this;\n const adapter = me._adapter;\n const timeOpts = me.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const me = this;\n const options = me.options;\n const formats = options.time.displayFormats;\n const unit = me._unit;\n const majorUnit = me._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n const label = me._adapter.format(time, format || (major ? majorFormat : minorFormat));\n const formatter = options.ticks.callback;\n return formatter ? callback(formatter, [label, index, ticks], me) : label;\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n const me = this;\n return value === null ? NaN : (value - me.min) / (me.max - me.min);\n }\n getPixelForValue(value) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForValue(value);\n return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return me.min + pos * (me.max - me.min);\n }\n _getLabelSize(label) {\n const me = this;\n const ticksOpts = me.options.ticks;\n const tickLabelWidth = me.ctx.measureText(label).width;\n const angle = toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = me._resolveTickFontOptions(0).size;\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n _getLabelCapacity(exampleTime) {\n const me = this;\n const timeOpts = me.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = me._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);\n const size = me._getLabelSize(exampleLabel);\n const capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n const me = this;\n let timestamps = me._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = me.getMatchingVisibleMetas();\n if (me._normalized && metas.length) {\n return (me._cache.data = metas[0].controller.getAllParsedValues(me));\n }\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(me));\n }\n return (me._cache.data = me.normalize(timestamps));\n }\n getLabelTimestamps() {\n const me = this;\n const timestamps = me._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = me.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(me, labels[i]));\n }\n return (me._cache.labels = me._normalized ? timestamps : me.normalize(timestamps));\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n major: {\n enabled: false\n }\n }\n};\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n constructor(props) {\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const me = this;\n const timestamps = me._getTimestampsForTable();\n const table = me._table = me.buildLookupTable(timestamps);\n me._minPos = interpolate(table, me.min);\n me._tableRange = interpolate(table, me.max) - me._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n _getTimestampsForTable() {\n const me = this;\n let timestamps = me._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = me.getDataTimestamps();\n const label = me.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = me.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = me._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const decimal = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(me._table, decimal * me._tableRange + me._minPos, true);\n }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales,\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, plugin_filler as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, elements, layouts, plugins, registerables, registry, scales };\n"],"sourceRoot":""}