{"version":3,"file":"340.3c31e9f735e2ecfe.js","mappings":"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","names":["ChartComponent","constructor","this","datasets","data","value","chartData","options","chartOptions","chart","update","type","chartType","ngOnChanges","changes","detectNewData","Object","keys","includes","ngAfterViewInit","createNewChart","ngAfterViewChecked","forceChartUpdate","ngOnDestroy","destroy","canvas","ctx","nativeElement","getContext","Chart","selectors","i0","ArcElement","LineElement","BarElement","PointElement","BarController","DoughnutController","LineController","CategoryScale","LinearScale","Filler","Tooltip","ChartsModule","CommonModule","ChartColorService","colorByScore","score","COLORS","factory","LOW","LOW_MEDIUM","MEDIUM","MEDIUM_HIGH","HIGH","EMPTY","DashboardModule","MatButtonModule","MatChipsModule","MatIconModule","MatTabsModule","MatMenuModule","MatSelectModule","ScoreLegendComponent","TimeSeriesDropdownComponent","TimeValueOptions","EventEmitter","period","selectedIndex","TIME_VALUES","findIndex","v","indexChange","index","change","emit","tooltipBg","blueOne","xFontSize","noop","uid","id","isNullOrUndef","isArray","Array","prototype","toString","call","slice","isObject","isNumberFinite","Number","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toDimension","dimension","endsWith","parseFloat","callback","fn","args","thisArg","apply","each","loopable","reverse","i","len","length","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","clone$1","source","map","target","create","klen","k","isValidKey","key","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","x","o","y","resolveObjectKey","obj","_getKeyResolver","_splitKey","parts","split","tmp","part","push","_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","isNumber","n","isNaN","epsilon","abs","_setMinAndMaxByKey","array","property","min","max","toRadians","degrees","toDegrees","radians","_decimalPlaces","e","p","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","sqrt","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","s","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","_rlookupByKey","arrayEvents","unlistenArrayEvents","listener","stub","_chartjs","listeners","splice","forEach","_arrayUnique","items","set","Set","add","from","requestAnimFrame","window","requestAnimationFrame","throttled","updateFn","updateArgs","ticking","rest","_toLeftRightCenter","align","_alignStartEnd","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","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","d","m","easeInOutBounce","lim","l","h","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","c","f","hex","h1","h2","eq","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","w","rgb","rgb2hsl","r","g","hueValue","calln","hsl2rgb","hue","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","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","names","RGB_RE","to","modHSL","ratio","clone","proto","assign","fromObject","input","functionParse","rgbParse","exec","hueParse","p1","p2","hwb2rgb","hsv2rgb","Color","hexParse","ret","nameParse","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","transparent","toLowerCase","_rgb","_valid","valid","rgbString","undefined","hexString","isShort","alpha","hslString","mix","color","weight","c1","c2","w2","w1","interpolate","rgb1","rgb2","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","rotate","deg","index_esm","isPatternOrGradient","getHoverColor","overrides","descriptors","getScope$1","node","root","scope","values","defaults","Defaults","_descriptors","animation","backgroundColor","borderColor","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","style","lineHeight","hover","hoverBackgroundColor","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","describe","get","override","route","name","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","enumerable","local","_scriptable","startsWith","_indexable","_fallback","_measureText","gc","longest","string","textWidth","measureText","width","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","point","area","margin","left","right","top","bottom","clipArea","clip","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","text","opts","lines","strokeWidth","strokeColor","line","setRenderOpts","translation","fillStyle","textAlign","textBaseline","strokeStyle","lineWidth","strokeText","maxWidth","fillText","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxDescent","yDecoration","actualBoundingBoxAscent","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","toFontString","resolve","inputs","info","cacheable","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","proxy","prefix","readKey","needsSubResolver","createSubResolver","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","isScriptable","_resolveScriptable","Error","join","delete","_resolveArray","isIndexable","arr","filter","resolver","allKeys","configurable","scriptable","indexable","_allKeys","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","capControlPoint","pt","_updateBezierControlPoints","loop","controlPoints","spanGaps","cubicInterpolationMode","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","monotoneAdjust","alphaK","betaK","tauK","squaredMagnitude","monotoneCompute","delta","iPixel","vPixel","prev","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","positions","getPositionedStyle","styles","suffix","result","pos","useOffsetPos","shadowRoot","getRelativePosition","evt","borderBox","boxSizing","paddings","borders","box","getCanvasPosition","touches","offsetX","offsetY","getBoundingClientRect","clientX","clientY","round1","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","addEventListener","removeEventListener","readUsedSize","getStyle","el","getPropertyValue","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","Map","formatNumber","num","locale","getNumberFormat","cacheKey","JSON","stringify","formatter","Intl","NumberFormat","format","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","rtl","propertyFn","between","compare","normalize","normalizeSegment","count","_boundSegment","segment","bounds","startBound","endBound","getSegment","prevValue","inside","subStart","_boundSegments","segments","sub","readStyle","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","styleChanged","prevStyle","animator","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","numSteps","duration","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","pop","_getAnims","charts","complete","progress","listen","event","cb","reduce","acc","cur","_duration","stop","cancel","remove","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","easing","_start","delay","_loop","_target","_prop","_from","_to","_promises","active","elapsed","remain","wait","promises","Promise","res","rej","resolved","method","animationOptions","colors","properties","numbers","resize","show","animations","visible","hide","Animations","config","_chart","_properties","configure","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","$shared","$animations","_createAnimations","awaitAll","anim","all","then","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","isStacked","meta","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","controller","parsed","_cachedMeta","_stacks","iScale","iAxis","axis","vAxis","getStackKey","indexScale","valueScale","_top","_bottom","getFirstScaleId","shift","clearStacks","_parsed","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","initialize","linkScales","_stacked","addElements","updateIndex","dataset","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","xScale","getScaleForId","yScale","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","convertObjectDataToArray","adata","isExtensible","listenArrayEvents","defineProperty","base","object","datasetElementType","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","parse","sorted","_sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","canStack","otherScale","hidden","createStack","NEGATIVE_INFINITY","otherMin","otherMax","getUserBounds","minDefined","maxDefined","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","_clip","toClip","disabled","defaultClip","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","createDataContext","dataIndex","raw","createDatasetContext","_resolveElementOptions","dataElementType","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","computeMinSampleSize","getAllScaleValues","_cache","$bar","visibleMetas","concat","sort","curr","_length","updateMinAndPrev","getPixelForValue","ticks","getPixelForTick","parseValue","entry","parseFloatBar","startValue","endValue","barStart","barEnd","_custom","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","borderProps","horizontal","enableBorderRadius","parseEdge","swap","orig","v2","startEnd","setInflateAmount","inflateAmount","iAxisKey","vAxisKey","super","bars","getBasePixel","isHorizontal","ruler","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","skipNull","_getStackCount","_getStackIndex","pixels","barThickness","_startPixel","_endPixel","stackCount","categoryPercentage","barPercentage","baseValue","minBarLength","actualBase","floating","getDataVisibility","barSign","startPixel","getPixelForDecimal","endPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","computeFlexCategoryTraits","percent","chunk","computeFitCategoryTraits","thickness","stackIndex","rects","_index_","offset","grid","_value_","beginAtZero","innerRadius","outerRadius","getter","_getRotation","_getCircumference","circumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","cutout","toPercentage","chartWeight","_getRingWeight","ratioX","ratioY","getRatioAndOffset","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","aspectRatio","legend","generateLabels","legendItem","toggleDataVisibility","tooltip","callbacks","title","tooltipItem","dataLabel","formattedValue","_dataset","animationsDisabled","_getStartAndCountOfVisiblePoints","pointCount","_scaleRangesChanged","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","_datasetIndex","_decimated","animated","maxGapLength","directUpdate","prevParsed","nullData","border","lastPoint","updateControlPoints","Element","tooltipPosition","useFinalPosition","getProps","hasValue","final","defaultRoutes","formatters","numeric","tickValue","notation","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","Ticks","newTicks","majorStart","majorEnd","ceil","display","grace","drawBorder","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","padding","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","reverseAlign","offsetFromEdge","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","position","Scale","_margins","maxHeight","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_maxLength","_longestTextCache","_reversePixels","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","init","suggestedMin","suggestedMax","metas","getPadding","getTicks","xLabels","yLabels","beforeLayout","beforeUpdate","margins","tickOpts","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","_addGrace","minmax","keepZero","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","ticksLimit","maxTicksLimit","determineMaxTicks","_tickSize","majorIndices","enabled","getMajorIndices","numMajorIndices","first","skipMajors","calculateSpacing","evenMajorSpacing","getEvenSpacing","diff","factors","_factorize","avgMajorSpacing","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","minSize","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","fullSize","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","getValueForPixel","decimal","_int16Range","getDecimalForPixel","getBaseValue","createTickContext","createScaleContext","optionTicks","rot","_computeGridLineItems","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","limit","step","optsAtIndex","lineColor","tickBorderDash","tickBorderDashOffset","_computeLabelItems","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","backdrop","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","fillRect","drawGrid","drawLine","setLineDash","lineDashOffset","lastLineWidth","drawLabels","drawTitle","titleX","titleY","titleArgs","_layers","tz","z","gz","getSortedVisibleDatasetMetas","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","itemDefaults","routeDefaults","routes","propertyParts","sourceName","sourceScope","unregister","registry","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getElement","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","abstract","adapters","_date","DateAdapter","formats","timestamp","amount","unit","startOf","weekday","endOf","members","binarySearch","metaset","lookupMethod","getRange","evaluateInteractionItems","handler","getIntersectItems","isPointInArea","inRange","getNearestItems","getNearestCartesianItems","distanceMetric","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","minDistance","evaluationFunc","getCenterPoint","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","params","layout","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","placed","stackWeight","autoPadding","layouts","addBox","removeBox","layoutItem","minPadding","availableWidth","availableHeight","buildLayoutBoxes","layoutBoxes","wrapBoxes","wrap","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","verticalBoxes","horizontalBoxes","visibleVerticalBoxCount","vBoxMaxWidth","hBoxMaxHeight","setLayoutDims","buildStacks","handleMaxPadding","updatePos","BasePlatform","acquireContext","releaseContext","getMaximumSize","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","container","clientWidth","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","disconnect","unlistenDevicePixelRatioChanges","createProxyAndListen","fromNativeEvent","native","addListener","DomPlatform","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","removeAttribute","setAttribute","$proxies","attach","detach","proxies","bbWidth","bbHeight","containerSize","getContainerSize","containerStyle","containerBorder","containerPadding","clientHeight","isConnected","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","localIds","createDescriptors","getOpts","pluginOpts","previousDescriptors","some","pluginScopeKeys","getIndexAxis","determineAxis","scaleOptions","axisFromPosition","initOptions","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","error","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","hasFunction","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","userConfig","initialCanvas","existingChart","_detectPlatform","OffscreenCanvas","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","debounce","timeout","clearTimeout","setTimeout","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","render","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getElementsAtEventForMode","getVisibleDatasetCount","setDatasetVisibility","_updateVisibility","_stop","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","replay","hoverOptions","deactivated","activated","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","invalidatePlugins","clipArc","pixelMargin","angleMargin","rThetaToXY","theta","pathArc","circular","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStart","outerEnd","innerStart","innerEnd","parseBorderRadius$1","angleDelta","toRadiusCorners","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","p8","outerStartX","outerStartY","outerEndX","outerEndY","version","fullCircles","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","inner","lineJoin","drawFullCircleBorders","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","pathSegment","lineMethod","getLineMethod","stepped","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","_fullLoop","_path","_points","_segments","_pointsUpdated","_computeSegments","segmentOptions","findStartAndEnd","splitByStyles","doSplitByStyles","chartContext","baseStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","solidSegments","_interpolate","_getInterpolationMethod","interpolated","path","segmentMethod","strokePathWithCache","strokePathDirect","inRange$1","hitRadius","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","skipX","skipY","addNormalRectPath","inflateRect","refRect","outer","boundingRects","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","addRectPath","hasRadius","_getBounds","_findSegmentEnd","_getEdge","_createBoundaryLine","boundary","_pointsFromSegments","linePoints","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","fillOption","decodeTargetIndex","firstCh","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","unshift","pointValue","firstValue","lastValue","simpleArc","_drawfill","getLineByIndex","_buildStackLine","sourcePoints","getLinesBelow","below","computeBoundary","getPointPositionForValue","computeCircularBoundary","_getTargetValue","getDistanceFromCenterForValue","computeLinearBoundary","_getTargetPixel","lineOpts","above","doFill","clipVertical","clipY","lineLoop","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","src","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","positioners","average","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","getTooltipSize","body","footer","boxWidth","boxHeight","bodyFont","titleFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","doesNotFitWithAlign","caret","caretSize","caretPadding","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","createTooltipContext","tooltipItems","getTitle","beforeTitle","afterTitle","getBeforeBody","getBody","bodyItems","scoped","beforeLabel","afterLabel","getAfterBody","getFooter","beforeFooter","afterFooter","_createItems","itemSort","labelColor","labelPointStyle","labelTextColor","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","rtlHelper","titleColor","_drawColorBox","colorX","rtlColorX","colorY","usePointStyle","drawOptions","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","bodyColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","globalAlpha","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","textDirection","restoreTextDirection","positionChanged","_positionChanged","_ignoreReplayEvents","handleEvent","plugin_tooltip","_element","afterInit","afterDraw","afterEvent","labelCount","_startValue","_valueRange","_addedLabels","added","findOrAddLabel","addedLabels","addIfString","lastIndexOf","relativeLabelSize","minSpacing","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","getTickLimit","maxTicks","stepSize","computeTickLimit","generateTicks$1","generationOptions","dataRange","precision","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","niceMin","niceMax","numSpaces","MIN_SPACING","almostWhole","rounded","decimalPlaces","isMajor","tickVal","LogarithmicScale","_zero","exp","generateTicks","endExp","endSignificand","significand","lastTick","getTickBackdropHeight","measureLabelSize","determineLimits","updateLimits","limits","hLimits","vLimits","getTextAlignForAngle","leftForTextAlign","yForAngle","pathRadiusLine","xCenter","yCenter","pointPosition","getPointPosition","RadialLinearScale","drawingArea","_pointLabels","_pointLabelItems","_padding","pointLabels","fitWithPointLabels","valueCount","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","plFont","textSize","getIndexAngle","setCenterPoint","buildPointLabelItems","extra","outerDistance","pointLabelPosition","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","getBasePosition","getPointLabelPosition","angleLines","drawPointLabels","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawRadiusLine","gridLineOpts","animate","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","addTick","time","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","_tickFormatFunction","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable"],"sourceRoot":"webpack:///","sources":["./src/app/charts/chart.component.ts","./src/app/charts/chart.component.html","./src/app/charts/charts.module.ts","./src/app/charts/services/chart-color.service.ts","./src/app/charts/services/color-constants.ts","./src/app/dashboard/dashboard.module.ts","./src/app/dashboard/score-legend/score-legend.component.ts","./src/app/dashboard/score-legend/score-legend.component.html","./src/app/dashboard/time-series-dropdown/time-series-dropdown.component.html","./src/app/dashboard/time-series-dropdown/time-series-dropdown.component.ts","./src/app/dashboard/time-series-dropdown/time.enum.ts","./src/scss/constants.ts","./node_modules/chart.js/dist/chunks/helpers.segment.mjs","./node_modules/chart.js/dist/chart.mjs"],"sourcesContent":["import {\r\n AfterViewChecked,\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n ViewChild } from '@angular/core';\r\nimport { Chart, ChartData, ChartOptions, ChartType } from 'chart.js';\r\n\r\n\r\n@Component({\r\n selector: 'maas-chart',\r\n templateUrl: './chart.component.html',\r\n styleUrls: ['./chart.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChartComponent implements OnChanges, AfterViewInit, AfterViewChecked, OnDestroy {\r\n @Input() id: string = '';\r\n @Input() height: number = 0;\r\n @Input() width: number = 0;\r\n\r\n @Input() set data(value: ChartData) {\r\n this.chartData = { ...value };\r\n }\r\n\r\n @Input() set options(value: ChartOptions) {\r\n this.chartOptions = value;\r\n if (this.chart) {\r\n this.chart.options = { ...value };\r\n this.chart.update();\r\n }\r\n }\r\n\r\n @Input() set type(value: ChartType) {\r\n this.chartType = value;\r\n }\r\n\r\n @ViewChild('canvas', { static: true })\r\n canvas: ElementRef | undefined;\r\n\r\n private detectNewData = false;\r\n\r\n private chart: Chart | undefined;\r\n private chartData: ChartData = {\r\n datasets: []\r\n };\r\n private chartOptions: ChartOptions = {};\r\n private chartType: ChartType = 'doughnut';\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n /*\r\n set detectNewData variable equal to true if new data detected\r\n use this later in lifecycle to update chartjs\r\n */\r\n\r\n this.detectNewData = Object.keys(changes).includes('data');\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.createNewChart();\r\n }\r\n\r\n ngAfterViewChecked(): void {\r\n\r\n /*\r\n there is a bug that makes the exception handling needed\r\n appears unfinished/not cleaned up stream of data\r\n\r\n we force the the chart to be recreated if it has not been or an error occured earlier in the lifecycle\r\n */\r\n\r\n if (this.detectNewData) {\r\n try {\r\n this.forceChartUpdate();\r\n } catch {\r\n this.createNewChart();\r\n this.forceChartUpdate();\r\n } finally {\r\n this.detectNewData = false;\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.chart)\r\n this.chart.destroy();\r\n }\r\n\r\n forceChartUpdate() {\r\n /*\r\n force chartjs update\r\n need to add reference to chart.data object or update won't register any diff\r\n */\r\n if (!this.chart) return;\r\n this.chart.data = this.chartData;\r\n this.chart.update();\r\n }\r\n\r\n createNewChart() {\r\n if (!this.canvas) return;\r\n const ctx = this.canvas.nativeElement.getContext('2d');\r\n this.chart = new Chart(ctx, {\r\n type: this.chartType,\r\n data: this.chartData,\r\n options: this.chartOptions,\r\n });\r\n }\r\n\r\n}\r\n","
\r\n \r\n
\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChartComponent } from './chart.component';\r\nimport { SmallScoreDoughnutComponent } from './small-score-doughnut/small-score-doughnut.component';\r\nimport { XSmallScoreDoughnutComponent } from './x-small-score-doughnut/x-small-score-doughnut.component';\r\nimport { AimScoreComponent } from './aim-score/aim-score.component';\r\nimport { MediumScoreDoughnutComponent } from './medium-score-doughnut/medium-score-doughnut.component';\r\n\r\nimport {\r\n Chart,\r\n ArcElement,\r\n LineElement,\r\n BarElement,\r\n PointElement,\r\n BarController,\r\n DoughnutController,\r\n LineController,\r\n CategoryScale,\r\n LinearScale,\r\n Filler,\r\n Tooltip,\r\n} from 'chart.js';\r\n\r\nChart.register(\r\n ArcElement,\r\n LineElement,\r\n BarElement,\r\n PointElement,\r\n BarController,\r\n DoughnutController,\r\n LineController,\r\n CategoryScale,\r\n LinearScale,\r\n Filler,\r\n Tooltip,\r\n);\r\n\r\n@NgModule({\r\n declarations: [\r\n ChartComponent,\r\n SmallScoreDoughnutComponent,\r\n XSmallScoreDoughnutComponent,\r\n AimScoreComponent,\r\n MediumScoreDoughnutComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n ChartComponent,\r\n SmallScoreDoughnutComponent,\r\n XSmallScoreDoughnutComponent,\r\n AimScoreComponent,\r\n MediumScoreDoughnutComponent\r\n ]\r\n})\r\nexport class ChartsModule {}\r\n","import { Injectable } from '@angular/core';\r\nimport { COLORS } from './color-constants';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ChartColorService {\r\n\r\n // accepts score in range 0-100 and returns a string of the corresponding hex code\r\n colorByScore(score?: number) {\r\n if (!score) return COLORS.EMPTY;\r\n if (score <= 20) {\r\n return COLORS.LOW;\r\n }\r\n\r\n if (score > 20 && score <= 40) {\r\n return COLORS.LOW_MEDIUM;\r\n }\r\n\r\n if (score > 40 && score <= 60) {\r\n return COLORS.MEDIUM;\r\n }\r\n\r\n if (score > 60 && score <= 80) {\r\n return COLORS.MEDIUM_HIGH;\r\n }\r\n\r\n if (score > 80) {\r\n return COLORS.HIGH;\r\n }\r\n }\r\n}\r\n","export const COLORS = {\r\n LOW: '#DC003D',\r\n LOW_MEDIUM: '#EAAA00',\r\n MEDIUM: '#FFEA00',\r\n MEDIUM_HIGH: '#40DF1A',\r\n HIGH: '#33b215',\r\n EMPTY: '#BDD4E7'\r\n};\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { DashboardFilterComponent } from './dashboard-filter/dashboard-filter.component';\r\nimport { ScoreLegendComponent } from './score-legend/score-legend.component';\r\nimport { TimeSeriesDropdownComponent } from './time-series-dropdown/time-series-dropdown.component';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@NgModule({\r\n declarations: [\r\n DashboardFilterComponent,\r\n ScoreLegendComponent,\r\n TimeSeriesDropdownComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatIconModule,\r\n MatTabsModule,\r\n MatMenuModule,\r\n MatSelectModule\r\n ],\r\n exports: [\r\n DashboardFilterComponent,\r\n ScoreLegendComponent,\r\n TimeSeriesDropdownComponent\r\n ]\r\n})\r\nexport class DashboardModule {}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'maas-score-legend',\r\n templateUrl: './score-legend.component.html',\r\n styleUrls: ['./score-legend.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ScoreLegendComponent {}\r\n","
\r\n
low
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
high
\r\n
\r\n","\r\n \r\n\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\r\nimport { TimeValueOptions } from './time.enum';\r\n\r\n@Component({\r\n selector: 'maas-time-series-dropdown',\r\n templateUrl: './time-series-dropdown.component.html',\r\n styleUrls: ['./time-series-dropdown.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class TimeSeriesDropdownComponent {\r\n\r\n readonly TIME_VALUES: TimeValueOptions[] = [\r\n TimeValueOptions.twelveMonths,\r\n TimeValueOptions.currentYear,\r\n TimeValueOptions.threeMonths,\r\n ];\r\n selectedIndex = 0;\r\n\r\n @Input() set period( value: TimeValueOptions) {\r\n this.selectedIndex = this.TIME_VALUES.findIndex(v => v === value);\r\n }\r\n\r\n @Output() change: EventEmitter = new EventEmitter();\r\n\r\n indexChange(index: number) {\r\n this.change.emit(this.TIME_VALUES[index]);\r\n }\r\n}\r\n","\r\nexport enum TimeValueOptions {\r\n currentYear = 'Current Year',\r\n twelveMonths = 'Last 12 Months',\r\n threeMonths = 'Last 3 Months',\r\n}","// can use a mixin to read scss vars from component\r\n// don't think it's worth the effort yet\r\n\r\nexport const tooltipBg = 'rgba(97, 97, 97, 0.9)';\r\nexport const blueOne = '#072b87';\r\n\r\n// requirement to have 8pt\r\nexport const xFontSize = 10.66;\r\nexport const xFontStyle = 'bold'\r\n","/*!\n * Chart.js v3.9.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\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.slice(0, 7) === '[object' && type.slice(-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 keyResolvers = {\n '': v => v,\n x: o => o.x,\n y: o => o.y\n};\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\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};\nfunction _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\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}\nfunction _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\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, last) =>\n _lookup(table, value, last\n ? index => table[index][key] <= value\n : 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 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(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\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};\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, true).hi + 1,\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).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\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.2.1\n * https://github.com/kurkle/color#readme\n * (c) 2022 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\nconst map$1 = {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);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\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 const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map = {\n x: 'dark',\n Z: 'light',\n Y: 're',\n X: 'blu',\n W: 'gr',\n V: 'medium',\n U: 'slate',\n A: 'ee',\n T: 'ol',\n S: 'or',\n B: 'ra',\n C: 'lateg',\n D: 'ights',\n R: 'in',\n Q: 'turquois',\n E: 'hi',\n P: 'ro',\n O: 'al',\n N: 'le',\n M: 'de',\n L: 'yello',\n F: 'en',\n K: 'ch',\n G: 'arks',\n H: 'ea',\n I: 'ightg',\n J: 'wh'\n};\nconst names$1 = {\n OiceXe: 'f0f8ff',\n antiquewEte: 'faebd7',\n aqua: 'ffff',\n aquamarRe: '7fffd4',\n azuY: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '0',\n blanKedOmond: 'ffebcd',\n Xe: 'ff',\n XeviTet: '8a2be2',\n bPwn: 'a52a2a',\n burlywood: 'deb887',\n caMtXe: '5f9ea0',\n KartYuse: '7fff00',\n KocTate: 'd2691e',\n cSO: 'ff7f50',\n cSnflowerXe: '6495ed',\n cSnsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: 'ffff',\n xXe: '8b',\n xcyan: '8b8b',\n xgTMnPd: 'b8860b',\n xWay: 'a9a9a9',\n xgYF: '6400',\n xgYy: 'a9a9a9',\n xkhaki: 'bdb76b',\n xmagFta: '8b008b',\n xTivegYF: '556b2f',\n xSange: 'ff8c00',\n xScEd: '9932cc',\n xYd: '8b0000',\n xsOmon: 'e9967a',\n xsHgYF: '8fbc8f',\n xUXe: '483d8b',\n xUWay: '2f4f4f',\n xUgYy: '2f4f4f',\n xQe: 'ced1',\n xviTet: '9400d3',\n dAppRk: 'ff1493',\n dApskyXe: 'bfff',\n dimWay: '696969',\n dimgYy: '696969',\n dodgerXe: '1e90ff',\n fiYbrick: 'b22222',\n flSOwEte: 'fffaf0',\n foYstWAn: '228b22',\n fuKsia: 'ff00ff',\n gaRsbSo: 'dcdcdc',\n ghostwEte: 'f8f8ff',\n gTd: 'ffd700',\n gTMnPd: 'daa520',\n Way: '808080',\n gYF: '8000',\n gYFLw: 'adff2f',\n gYy: '808080',\n honeyMw: 'f0fff0',\n hotpRk: 'ff69b4',\n RdianYd: 'cd5c5c',\n Rdigo: '4b0082',\n ivSy: 'fffff0',\n khaki: 'f0e68c',\n lavFMr: 'e6e6fa',\n lavFMrXsh: 'fff0f5',\n lawngYF: '7cfc00',\n NmoncEffon: 'fffacd',\n ZXe: 'add8e6',\n ZcSO: 'f08080',\n Zcyan: 'e0ffff',\n ZgTMnPdLw: 'fafad2',\n ZWay: 'd3d3d3',\n ZgYF: '90ee90',\n ZgYy: 'd3d3d3',\n ZpRk: 'ffb6c1',\n ZsOmon: 'ffa07a',\n ZsHgYF: '20b2aa',\n ZskyXe: '87cefa',\n ZUWay: '778899',\n ZUgYy: '778899',\n ZstAlXe: 'b0c4de',\n ZLw: 'ffffe0',\n lime: 'ff00',\n limegYF: '32cd32',\n lRF: 'faf0e6',\n magFta: 'ff00ff',\n maPon: '800000',\n VaquamarRe: '66cdaa',\n VXe: 'cd',\n VScEd: 'ba55d3',\n VpurpN: '9370db',\n VsHgYF: '3cb371',\n VUXe: '7b68ee',\n VsprRggYF: 'fa9a',\n VQe: '48d1cc',\n VviTetYd: 'c71585',\n midnightXe: '191970',\n mRtcYam: 'f5fffa',\n mistyPse: 'ffe4e1',\n moccasR: 'ffe4b5',\n navajowEte: 'ffdead',\n navy: '80',\n Tdlace: 'fdf5e6',\n Tive: '808000',\n TivedBb: '6b8e23',\n Sange: 'ffa500',\n SangeYd: 'ff4500',\n ScEd: 'da70d6',\n pOegTMnPd: 'eee8aa',\n pOegYF: '98fb98',\n pOeQe: 'afeeee',\n pOeviTetYd: 'db7093',\n papayawEp: 'ffefd5',\n pHKpuff: 'ffdab9',\n peru: 'cd853f',\n pRk: 'ffc0cb',\n plum: 'dda0dd',\n powMrXe: 'b0e0e6',\n purpN: '800080',\n YbeccapurpN: '663399',\n Yd: 'ff0000',\n Psybrown: 'bc8f8f',\n PyOXe: '4169e1',\n saddNbPwn: '8b4513',\n sOmon: 'fa8072',\n sandybPwn: 'f4a460',\n sHgYF: '2e8b57',\n sHshell: 'fff5ee',\n siFna: 'a0522d',\n silver: 'c0c0c0',\n skyXe: '87ceeb',\n UXe: '6a5acd',\n UWay: '708090',\n UgYy: '708090',\n snow: 'fffafa',\n sprRggYF: 'ff7f',\n stAlXe: '4682b4',\n tan: 'd2b48c',\n teO: '8080',\n tEstN: 'd8bfd8',\n tomato: 'ff6347',\n Qe: '40e0d0',\n viTet: 'ee82ee',\n JHt: 'f5deb3',\n wEte: 'ffffff',\n wEtesmoke: 'f5f5f5',\n Lw: 'ffff00',\n LwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\nfunction index_esm(input) {\n return new Color(input);\n}\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\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 includeInvisible: false\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.drawActiveElementsOnTop = 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 drawPointLegend(ctx, options, x, y, null);\n}\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width;\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 if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\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 width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 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 = w ? w / 2 : 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 !area || (point && 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, beginAtZero) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\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 target[prop] = storage[prop] = value;\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' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n return target[prop];\n }\n const value = resolve();\n target[prop] = value;\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 (needsSubResolver(prop, 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, value) {\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, value);\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, value);\n if (key === null) {\n return false;\n }\n if (defined(fallback) && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\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, item) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\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}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const {iScale} = meta;\n const {key = 'r'} = 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 r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\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(e, canvas) {\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 if ('native' in evt) {\n return evt;\n }\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: _isBetween,\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 chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\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(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\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 { _isPointInArea as $, _factorize as A, finiteOrDefault as B, callback as C, _addGrace as D, _limitValue as E, toDegrees as F, _measureText as G, HALF_PI as H, _int16Range as I, _alignPixel as J, toPadding as K, clipArea as L, renderText as M, unclipArea as N, toFont as O, PI as P, each as Q, _toLeftRightCenter as R, _alignStartEnd as S, TAU as T, overrides as U, merge as V, _capitalize as W, getRelativePosition as X, _rlookupByKey as Y, _lookupByKey as Z, _arrayUnique as _, resolve as a, toLineHeight as a$, getAngleFromPoint as a0, getMaximumSize as a1, _getParentNode as a2, readUsedSize as a3, throttled as a4, supportsEventListenerOptions as a5, _isDomSupported as a6, descriptors as a7, isFunction as a8, _attachContext as a9, getRtlAdapter as aA, overrideTextDirection as aB, _textX as aC, restoreTextDirection as aD, drawPointLegend as aE, noop as aF, distanceBetweenPoints as aG, _setMinAndMaxByKey as aH, niceNum as aI, almostWhole as aJ, almostEquals as aK, _decimalPlaces as aL, _longestText as aM, _filterBetween as aN, _lookup as aO, isPatternOrGradient as aP, getHoverColor as aQ, clone$1 as aR, _merger as aS, _mergerIf as aT, _deprecated as aU, _splitKey as aV, toFontString as aW, splineCurve as aX, splineCurveMonotone as aY, getStyle as aZ, fontString as a_, _createResolver as aa, _descriptors as ab, mergeIf as ac, uid as ad, debounce as ae, retinaScale as af, clearCanvas as ag, setsEqual as ah, _elementsEqual as ai, _isClickEvent as aj, _isBetween as ak, _readValueToProps as al, _updateBezierControlPoints as am, _computeSegments as an, _boundSegments as ao, _steppedInterpolation as ap, _bezierInterpolation as aq, _pointInLine as ar, _steppedLineTo as as, _bezierCurveTo as at, drawPoint as au, addRoundedRectPath as av, toTRBL as aw, toTRBLCorners as ax, _boundSegment as ay, _normalizeAngle as az, isArray as b, PITAU as b0, INFINITY as b1, RAD_PER_DEG as b2, QUARTER_PI as b3, TWO_THIRDS_PI as b4, _angleDiff as b5, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, createContext as h, isObject as i, defined as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, log10 as z };\n","/*!\n * Chart.js v3.9.1\n * https://www.chartjs.org\n * (c) 2022 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 createContext, j as defined, s as sign, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as log10, A as _factorize, B as finiteOrDefault, C as callback, D as _addGrace, E as _limitValue, F as toDegrees, G as _measureText, I as _int16Range, J as _alignPixel, K as toPadding, L as clipArea, M as renderText, N as unclipArea, O as toFont, Q as each, R as _toLeftRightCenter, S as _alignStartEnd, U as overrides, V as merge, W as _capitalize, X as getRelativePosition, Y as _rlookupByKey, Z as _lookupByKey, $ as _isPointInArea, a0 as getAngleFromPoint, a1 as getMaximumSize, a2 as _getParentNode, a3 as readUsedSize, a4 as throttled, a5 as supportsEventListenerOptions, a6 as _isDomSupported, a7 as descriptors, a8 as isFunction, a9 as _attachContext, aa as _createResolver, ab as _descriptors, ac as mergeIf, ad as uid, ae as debounce, af as retinaScale, ag as clearCanvas, ah as setsEqual, ai as _elementsEqual, aj as _isClickEvent, ak as _isBetween, al as _readValueToProps, am as _updateBezierControlPoints, an as _computeSegments, ao as _boundSegments, ap as _steppedInterpolation, aq as _bezierInterpolation, ar as _pointInLine, as as _steppedLineTo, at as _bezierCurveTo, au as drawPoint, av as addRoundedRectPath, aw as toTRBL, ax as toTRBLCorners, ay as _boundSegment, az as _normalizeAngle, aA as getRtlAdapter, aB as overrideTextDirection, aC as _textX, aD as restoreTextDirection, aE as drawPointLegend, aF as noop, aG as distanceBetweenPoints, aH as _setMinAndMaxByKey, aI as niceNum, aJ as almostWhole, aK as almostEquals, aL as _decimalPlaces, aM as _longestText, aN as _filterBetween, aO as _lookup } from './chunks/helpers.segment.mjs';\nexport { d as defaults } from './chunks/helpers.segment.mjs';\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 if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._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 this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._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 if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || (elapsed < duration));\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._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, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).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, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\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 createContext(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 createContext(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);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\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.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.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 = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.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 dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n this._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._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 this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\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 (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.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(this, 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 value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.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 this.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 meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.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 meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\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 && drawActiveElementsOnTop) {\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 dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.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 active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = () => this.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 chart = this.chart;\n const cache = this._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 = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.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 _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\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 data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._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 this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._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 _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[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(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\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 if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\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}\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\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 meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.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 this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._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 || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const skipNull = (meta) => {\n const parsed = meta.controller.getParsed(dataIndex);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.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 opts = this.options;\n const meta = this._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(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.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 ? this.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 (this.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 const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\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 scale = ruler.scale;\n const options = this.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 ? this._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 = this._getStackIndex(this.index, this._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(this.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 meta = this._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 (this.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(this._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 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 parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {xScale, yScale} = meta;\n const parsed = this.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 points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\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 && this.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 = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\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 if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\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 for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n const controller = this.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 chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const {circumference, rotation} = this._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(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._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 this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.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 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\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 meta = this._cachedMeta;\n const chart = this.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 let max = 0;\n const chart = this.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 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 this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.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 ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._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(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.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};\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 meta = this._cachedMeta;\n const chart = this.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 parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.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 this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._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 / this.countVisibleElements();\n for (i = 0; i < start; ++i) {\n angle += this._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 + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 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: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && 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 vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._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 = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\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 this.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 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 anims = this.$animations;\n if (!final || !anims) {\n return this;\n }\n const ret = {};\n props.forEach(prop => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[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 createContext(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(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 this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.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 let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {min, max};\n }\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, 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 min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.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 {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [this]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [this]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [this]);\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 tickOpts = this.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], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [this]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = this.ticks.length;\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.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 this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [this]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.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(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.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 if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.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 this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._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 this.beforeTickToLabelConversion();\n this.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 this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._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 if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.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 ticks = this.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(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._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 this.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 axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = grid.setContext(this.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(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.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(this.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(this.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(this.getContext(i));\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndex.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(this, 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 this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.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(this.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 = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._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 = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._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 = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._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 = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._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 let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\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: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.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 } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._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 x = this.right + padding;\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 += widest;\n }\n } else {\n x = this.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 = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\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 -= widest;\n }\n } else {\n x = this.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 = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {textAlign, x};\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.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 grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._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 {chart, ctx, options: {grid}} = this;\n const borderOpts = grid.setContext(this.getContext());\n const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.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 optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this._labelItems || (this._labelItems = this._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 if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: gz + 1,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.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] === this.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 fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.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 proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.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 (this.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 [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n each(arg, item => {\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._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 ScatterController extends DatasetController {\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n const {dataset: line, _dataset} = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const {showLine} = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.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 ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n datasetElementType: false,\n dataElementType: 'point',\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 init(chartOptions) {}\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 binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== 'r' && _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 evaluateInteractionItems(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, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\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 evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\nvar Interaction = {\n evaluateInteractionItems,\n modes: {\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\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 const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\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 const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, 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 autoPadding: true,\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, {left: 0, top: 0, right: 0, bottom: 0});\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 updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\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(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 nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\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 observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: 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 PluginService {\n constructor() {\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._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 localIds = {};\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 localIds[plugin.id] = true;\n }\n }\n return {plugins, localIds};\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, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins) {\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, local: localIds[id]}, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\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 if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\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}\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"3.9.1\";\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};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nclass Chart {\n constructor(item, userConfig) {\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 with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.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._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(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\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(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.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 this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\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 options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {size: newSize});\n callback(options.onResize, [this, newSize], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.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 options = this.options;\n const scaleOpts = options.scales;\n const scales = this.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: this.ctx,\n chart: this\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(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.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 this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.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(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {mode});\n this._layers.sort(compare2Level('z', '_idx'));\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n this._resize(width, height);\n this._resizeBeforeDraw = null;\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._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 if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = this.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (this.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 ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\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 dataset = this.data.datasets[datasetIndex];\n const metasets = this._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 = createContext(null, {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 mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {visible});\n this.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 meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n this.notifyPlugins('destroy');\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\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 listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n each(this.options.events, (type) => _add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = () => {\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = () => {\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._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 lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.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 this._active = active;\n this._lastEvent = null;\n this._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 hoverOptions = this.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 this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [e, active, this], this);\n if (isClick) {\n callback(options.onClick, [e, active, this], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\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, circular) {\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 if (circular) {\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 } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, startAngle + TAU, circular);\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, circular);\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, circular) {\n const {options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || '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, circular);\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 _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, 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 {options, circumference} = this;\n const offset = (options.offset || 0) / 2;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n let radiusOffset = 0;\n if (offset) {\n radiusOffset = offset / 2;\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n if (this.circumference >= PI) {\n radiusOffset = offset;\n }\n }\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n const endAngle = drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, endAngle, circular);\n ctx.restore();\n }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\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.options.segment) {\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._chart = 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 options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._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 options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {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 segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || (this.points.length - start);\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._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 options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.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, this.x, this.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 || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, 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 this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\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 = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = 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 inflateAmount: 'auto',\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.controller.supportsDecimation) {\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 _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 _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 _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 _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 _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}\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 _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\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 _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 return decodeTargetIndex(fill[0], index, target, count);\n }\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\nfunction _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\nfunction _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\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}\n\nfunction _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, 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}\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\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 (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\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}\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 getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const 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 (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\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}\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 clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {line, target, color: below, scale, property});\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\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 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}\n\nvar index = {\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 && source.fill) {\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 (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || 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 = labelOpts.pointStyleWidth || 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 this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [this.chart], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const {options, ctx} = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.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 this.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 {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.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 this.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 if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.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, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.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 if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.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 this.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: boxHeight * 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 drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\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 = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.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(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.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 : this.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(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.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, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._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 let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [e, previous, this], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (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 opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.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 ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const {titleX, titleY, maxWidth, rotation} = this._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 + options.boxPadding) : 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 = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.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 {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\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 -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\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 createContext(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._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart || config._chart;\n this._chart = this.chart;\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 cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const {callbacks} = options;\n const beforeTitle = callbacks.beforeTitle.apply(this, [context]);\n const title = callbacks.title.apply(this, [context]);\n const afterTitle = callbacks.afterTitle.apply(this, [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 {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(this, context)));\n pushOrConcat(bodyItem.lines, scoped.label.call(this, context));\n pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(this, 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 {callbacks} = options;\n const beforeFooter = callbacks.beforeFooter.apply(this, [tooltipItems]);\n const footer = callbacks.footer.apply(this, [tooltipItems]);\n const afterFooter = callbacks.afterFooter.apply(this, [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 active = this._active;\n const data = this.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(this.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(this, context));\n labelPointStyles.push(scoped.labelPointStyle.call(this, context));\n labelTextColors.push(scoped.labelTextColor.call(this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.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 this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, 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 {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\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 + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - 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 title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, 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 labelColors = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, '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 = isObject(labelColors.borderWidth) ? Math.max(...Object.values(labelColors.borderWidth)) : (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 - boxPadding);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 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 = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.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(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._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(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, 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 {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._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 this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.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 lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.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 = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\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, 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 if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent(chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\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 boxPadding: 0,\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: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\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 this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\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), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.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 labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\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 getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._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 (ticks.length && 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 {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\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 this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.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 opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.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: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._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 {min, max} = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.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 (this._zero && this.min !== this._suggestedMin && min === exp(this.min, 0)) {\n setMin(exp(min, -1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._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 orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(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 updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const extra = getTickBackdropHeight(opts) / 2;\n const outerDistance = scale.drawingArea;\n const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0;\n for (let i = 0; i < valueCount; i++) {\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\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 borderRadius = toTRBLCorners(optsAtIndex.borderRadius);\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\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 createPointLabelContext(parent, index, label) {\n return createContext(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 padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.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 {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid} = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const optsAtIndex = grid.setContext(this.getContext(index - 1));\n drawRadiusLine(this, optsAtIndex, offset, labelCount);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.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 = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.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 centerPointLabels: false\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 adapter.init(opts);\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 options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let {min, max, minDefined, maxDefined} = this.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(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.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 this.min = Math.min(min, max - 1);\n this.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 options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n initOffsets(timestamps) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.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 this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._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' && this.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 adapter = this._adapter;\n const timeOpts = this.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 options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._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 = this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n const formatter = options.ticks.callback;\n return formatter ? callback(formatter, [label, index, ticks], this) : 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 return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return (this._cache.data = this.normalize(timestamps));\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n return (this._cache.labels = this._normalized ? timestamps : this.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 timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._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 let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._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 offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._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, index 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"],"x_google_ignoreList":[12,13]}