{"version":3,"sources":["webpack://@amcharts/amcharts5/webpack/runtime/chunk loaded","webpack://@amcharts/amcharts5/webpack/runtime/create fake namespace object","webpack://@amcharts/amcharts5/webpack/runtime/load script","webpack://@amcharts/amcharts5/./src/.internal/core/Registry.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/ResizeSensor.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Language.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Matrix.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Throttler.ts","webpack://@amcharts/amcharts5/./node_modules/svg-arc-to-cubic-bezier/modules/index.js","webpack://@amcharts/amcharts5/./src/.internal/core/render/backend/CanvasRenderer.ts","webpack://@amcharts/amcharts5/./src/.internal/core/Root.ts","webpack://@amcharts/amcharts5/./src/.internal/core/Theme.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Button.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Circle.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Component.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Children.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Container.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Graphics.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/GridLayout.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/HorizontalLayout.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Label.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Layout.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Draw.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Line.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/MonotoneXTension.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/MonotoneYTension.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Picture.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/PointedRectangle.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/RadialLabel.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/RadialText.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Rectangle.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/RoundedRectangle.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Scrollbar.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Chart.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/SerialChart.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Series.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Slice.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Sprite.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Text.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Tick.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Tooltip.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/VerticalLayout.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/backend/Renderer.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/gradients/Gradient.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/gradients/LinearGradient.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Animation.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Array.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Color.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/ColorSet.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Data.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/DateFormatter.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Disposer.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/DurationFormatter.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Ease.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/States.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Entity.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/EventDispatcher.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/InterfaceColors.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/List.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Math.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/NumberFormatter.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Object.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Order.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Percent.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/PopulateString.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Template.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/TextFormatter.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Time.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Type.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Utils.ts","webpack://@amcharts/amcharts5/./src/.internal/themes/DefaultTheme.ts","webpack://@amcharts/amcharts5/./src/locales/en.ts","webpack://@amcharts/amcharts5/./node_modules/d3-dispatch/src/dispatch.js","webpack://@amcharts/amcharts5/./node_modules/d3-path/src/path.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/math.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/arc.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/area.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/array.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/constant.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/curve/linear.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/line.js","webpack://@amcharts/amcharts5/./node_modules/d3-shape/src/point.js","webpack://@amcharts/amcharts5/./node_modules/d3-timer/src/timer.js","webpack://@amcharts/amcharts5/./node_modules/regenerator-runtime/runtime.js","webpack://@amcharts/amcharts5/./node_modules/tslib/tslib.es6.js","webpack://@amcharts/amcharts5/webpack/bootstrap","webpack://@amcharts/amcharts5/webpack/runtime/compat get default export","webpack://@amcharts/amcharts5/webpack/runtime/define property getters","webpack://@amcharts/amcharts5/webpack/runtime/ensure chunk","webpack://@amcharts/amcharts5/webpack/runtime/get javascript chunk filename","webpack://@amcharts/amcharts5/webpack/runtime/global","webpack://@amcharts/amcharts5/webpack/runtime/hasOwnProperty shorthand","webpack://@amcharts/amcharts5/webpack/runtime/make namespace object","webpack://@amcharts/amcharts5/webpack/runtime/publicPath","webpack://@amcharts/amcharts5/webpack/runtime/jsonp chunk loading","webpack://@amcharts/amcharts5/./tmp/webpack/polyfill.js","webpack://@amcharts/amcharts5/./src/.internal/core/render/Bullet.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Ellipse.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Star.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/HeatLegend.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Legend.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Triangle.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/Slider.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/gradients/RadialGradient.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/patterns/Pattern.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/patterns/CirclePattern.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/patterns/LinePattern.ts","webpack://@amcharts/amcharts5/./src/.internal/core/render/patterns/RectanglePattern.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/DataParser.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/DataProcessor.ts","webpack://@amcharts/amcharts5/./src/.internal/core/util/Net.ts","webpack://@amcharts/amcharts5/./tmp/webpack/index.js"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","registry","addLicense","license","licenses","push","disposeAllRootElements","root","rootElements","pop","dispose","this","_observer","ResizeObserver","entries","entry","_targets","x","target","callback","observe","box","unobserve","_timer","currentTime","Date","now","Raf","delay","newSize","getBoundingClientRect","width","size","height","length","requestAnimationFrame","left","right","top","bottom","cancelAnimationFrame","observer","element","_sensor","Native","_element","addTarget","_disposed","removeTarget","setPrivate","en","_setDefaults","prompt","locale","_root","getPrivate","translation","value","translate","rest","len","i","split","join","translateFunc","list","isDefault","Entity","a","b","c","d","tx","ty","y","pivotX","pivotY","rotation","scale","Math","cos","sin","origin","id","matrix","a1","b1","c1","d1","tx1","fn","_fn","_ready","_pending","run","TAU","PI","mapToEllipse","_ref","rx","ry","cosphi","sinphi","centerx","centery","approxUnitArc","ang1","ang2","tan","x1","y1","x2","y2","vectorAngle","ux","uy","vx","vy","dot","acos","_ref2","px","py","cx","cy","_ref2$xAxisRotation","xAxisRotation","undefined","_ref2$largeArcFlag","largeArcFlag","_ref2$sweepFlag","sweepFlag","curves","pxp","pyp","abs","lambda","pow","sqrt","_getArcCenter2","arr","Array","isArray","Symbol","iterator","Object","_arr","_n","_d","_e","_s","_i","next","done","err","sliceIterator","TypeError","_slicedToArray","rxsq","rysq","pxpsq","pypsq","radicant","centerxp","centeryp","vx1","vy1","vx2","vy2","getArcCenter","ratio","segments","max","ceil","map","curve","_mapToEllipse","_mapToEllipse2","_mapToEllipse3","checkArgs","name","actual","expected","Error","checkMinArgs","checkEvenArgs","assertBinary","eachTargets","hitTarget","f","interactive","_parent","onPointerEvent","event","touches","touch","isTainted","image","canvas","document","createElement","context","getContext","drawImage","getImageData","console","warn","src","_x","_y","renderer","_renderer","_removeObject","CanvasPivot","Matrix","getLayer","view","self","_layer","defaultLayer","order","visible","registerChildLayer","dirty","invalidateBounds","_localBounds","_bounds","_colorId","paintId","inactive","_forceInteractive","_isInteractive","child","point","_matrix","apply","applyInverse","_uMatrix","setTransform","pivot","angle","bn","_addBounds","bounds","_setMatrix","getLocalMatrix","p0","p1","p2","p3","min","key","_addEvent","Disposer","_localMatrix","copyFrom","prepend","resolution","m","parentLayer","exportable","_omitTainted","layers","ghostContext","_ghostContext","mask","layer","save","_transform","_runPath","clip","globalAlpha","compoundAlpha","alpha","filter","_isInteractiveMask","_render","restore","tainted","_hovering","has","_dragging","some","interactiveChildren","_children","index","splice","render","_childLayers","deep","markDirtyLayer","CanvasDisplayObject","setPoint","_context","_forceColor","color","forceColor","fillStyle","Op","clearShadow","fill","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","stroke","strokeStyle","lineWidth","dash","setLineDash","dashOffset","lineDashOffset","rect","l","t","r","radius","moveTo","arc","radiusX","radiusY","ellipse","startAngle","endAngle","anticlockwise","arcBounds","arcTo","lineTo","closePath","cpX","cpY","cpX2","cpY2","toX","toY","bezierCurveTo","quadraticCurveTo","blur","offsetX","offsetY","opacity","clear","_operations","op","_fillAlpha","Color","_pushOp","BeginFill","toCSS","isMeasured","EndFill","_hasShadows","EndStroke","_strokeAlpha","LineStyle","LineDash","LineDashOffset","DrawRect","DrawCircle","DrawEllipse","Arc","ArcTo","LineTo","MoveTo","BezierCurveTo","QuadraticCurveTo","ClosePath","Shadow","path","match","cpx","cpy","qcpx","qcpy","SEGMENTS_REGEXP","ARGS_REGEXP","exec","args","relative","bs","beginPath","layerDirty","globalCompositeOperation","blendMode","_getColorId","colorize","addBounds","text","style","_textInfo","textAlign","direction","textBaseline","ignoreGhost","ignoreFontWeight","fontStyle","_getFontStyle","font","shadowOpacity","_shared","style2","fontVariant","fontWeight","fontSize","fontFamily","_measure","_textVisible","_prerender","line","_index","textChunks","chunk","fillText","textDecoration","thickness","offset","TextFormatter","rtl","oversizedBehavior","maxWidth","truncate","wrap","currentStyle","refText","lines","toString","replace","styleRestored","minX","maxX","chunks","type","ignoreFormatting","currentFormat","lineInfo","ascent","metrics","_measureText","actualBoundingBoxAscent","actualBoundingBoxDescent","currentFill","currentChunkWidth","currentDecoration","skipFurtherText","firstTextChunk","leftoverChunks","format","chunkWidth","actualBoundingBoxLeft","actualBoundingBoxRight","breakWords","ellipsis","ellipsisMetrics","ellipsisWidth","excessWidth","_truncateText","tmpText","slice","unshift","substr","leftBoundMod","rightBoundMod","boundsMod","chunkHeight","lineHeight","Percent","currentChunkOffset","baselineRatio","_fitRatio","minScale","_originalScale","maxW","maxH","maxHeight","w","h","fallbackBreakWords","tmp","measureText","fakeMetrics","div","innerText","visibility","position","body","appendChild","bbox","removeChild","fontBoundingBoxAscent","fontBoundingBoxDescent","textType","_renderCircular","deltaAngle","orientation","inward","inside","align","kerning","clockwise","shouldReverse","_textReversed","midAngle","reverse","textHeight","lineStartAngle","rotate","angleShift","char","charWidth","_measureCircular","round","CanvasText","naturalWidth","naturalHeight","_getMask","_imageMask","imageSmoothingEnabled","fillRect","Touch","identifier","_patternCanvas","window","devicePixelRatio","Set","Throttler","_dispatchGlobalMousemove","_lastPointerMoveEvent","native","_layerDom","_disposers","_events","_key","events","disposer","_ghostView","_ev","listener","ev","preventDefault","passive","prevent","forEach","obj","wheelable","createLinearGradient","radius1","radius2","createRadialGradient","graphics","background","repetition","_patternContext","clearRect","renderDetached","createPattern","CanvasContainer","CanvasGraphics","CanvasTextStyle","CanvasRadialText","CanvasImage","_clientWidth","_clientHeight","_width","floor","_height","existingLayer","getLayerByOrder","createDetachedLayer","sort","insertBefore","_dirtyLayers","_mouseMoveThrottler","rgb","distributeId","_colorMap","originalEvent","adjustPoint","CanvasRendererEvent","clientX","clientY","pixel","data","colorId","dispatching","cleanup","callbacks","disposed","interactionsEnabled","_withEvents","call","dispatched","object","button","getEvent","_getHitTarget","info","_mousedown","_dispatchEvent","contains","delete","cursorOverStyle","_replacedCursorStyle","add","_dispatchEventAll","clickevent","_listeners","increment","timer","clearTimeout","_","setTimeout","_makeSharedEvent","_onPointerEvent","_dispatchGlobalMouseup","mousedown","_dispatchMousedown","mousemove","_dispatchDragMove","mouseup","_dispatchDragEnd","_dispatchDoubleClick","_dispatchWheel","_initEvent","options","maxScale","minWidth","minHeight","maintainPixelRatio","forceRender","canvasWidth","canvasHeight","needRerender","exportableView","exportableContext","clientWidth","clientHeight","rAF","fps","isReal","EventDispatcher","CanvasRenderer","Language","new","NumberFormatter","DateFormatter","DurationFormatter","VerticalLayout","HorizontalLayout","GridLayout","dom","HTMLElement","getElementById","interfaceColors","InterfaceColors","inner","_inner","Root","_init","childNodes","_initResizeSensor","resize","_logo","_rootContainer","hide","show","logo","tooltipContainer","children","Container","setStateOnChildren","paddingTop","paddingRight","paddingBottom","paddingLeft","centerY","tooltipText","tooltipX","Rectangle","fillOpacity","tooltipY","tooltip","Tooltip","pointerOrientation","label","setAll","get","strokeOpacity","set","on","open","states","create","Graphics","strokeWidth","svgPath","_handleLogo","rootContainer","_defaultThemes","DefaultTheme","container","readerAlertElement","setAttribute","zIndex","_readerAlertElement","focusElementContainer","pointerEvents","overflow","_focusElementContainer","_tooltipElementContainer","focusedSprite","_focusedSprite","keyCode","dragOffsetX","dragOffsetY","downEvent","MouseEvent","dispatch","simulated","isDragging","_keyboardDragPoint","isEnabled","dragPoint","moveEvent","upEvent","items","_tabindexes","item","indexOf","lastIndex","_startTicker","setThemes","_addTooltip","_hasLicense","_showBranding","_resizeSensorDisposer","ResizeSensor","autoResize","_display","_focusElementDirty","_updateCurrentFocus","_tickers","_animations","animation","_runAnimation","allParents","_isDirtyParents","_dirtyParents","parent","isDisposed","uid","_prepareChildren","_updateChildren","objects","_dirty","entity","_beforeChanged","_changed","_clearDirty","_isDirty","depths","_dirtyBounds","depth","_updateBounds","dirtyPositions","_dirtyPositions","sprite","_updatePosition","_afterChanged","animationTime","timestamp","_runTickers","_runAnimations","_runDirties","_ticker","_runTicker","_isDisposed","horizontalLayout","verticalLayout","innerHTML","themes","_applyThemes","_tooltip","_invalidateTabindexes","aindex","bindex","groups","_moveFocusElement","_makeFocusElement","group","_decorateFocusElement","_positionFocusElement","focusElement","isHidden","getAttribute","tabindex","removeAttribute","role","ariaLabel","ariaLive","ariaChecked","ariaOrientation","ariaValueNow","ariaValueMin","ariaValueMax","ariaValueText","ariaControls","tabIndex","disposers","_handleFocus","_handleBlur","append","globalBounds","focused","_getText","tooltipElement","_makeTooltipElement","remove","removePrivate","_removeFocusElement","setupDefaultRules","themeClass","_rules","themeTags","rules","tags","template","ruleRaw","_settings","_afterNew","isDirty","previous","_prevSettings","icon","_disposeProperty","Button","className","_clear","drawCircle","Circle","component","dataContext","settings","_checkDirty","markDirtyValues","_addAnimation","disposeDataItem","_dispose","duration","setRaw","showDataItem","hideDataItem","_dataItems","_data","incrementRef","decrementRef","_updateFields","onAll","change","dataItems","_mainDataItems","_markDirtyGroup","_dataChanged","dataItem","_onDataClear","DataItem","newValue","_makeDataItem","processDataItem","animate","to","easing","oldIndex","newIndex","_afterDataChange","valueFields","_valueFields","_valueFieldsF","fieldKey","workingKey","fields","_fields","_fieldsF","_dataItem","output","field","makeDataItem","_duration","_valuesDirty","inited","markDirty","_dataGrouped","_sizeDirty","Component","_container","oldValues","_onRemoved","_onInserted","oldValue","_setParent","childrenDisplay","_childrenDisplay","addChild","addChildAt","markDirtyBounds","values","List","makeContainer","Children","allChildren","_prevWidth","_prevHeight","layout","each","markDirtyPosition","contentMask","_contentMask","_updateSize","_percentageSizeChildren","_percentagePositionChildren","updateBackground","verticalScrollbar","_contentHeight","bg","eachChildren","_applyState","_applyStateAnimated","applyAnimate","pWidth","pHeight","horizontal","vertical","Number","MAX_VALUE","childBounds","adjustedLocalBounds","childX","childY","cl","cr","ct","cb","_contentWidth","updateContainer","_addDirtyParent","innerWidth","innerHeight","_handleStates","removeValue","startGrip","endGrip","wheelEvent","shiftY","deltaY","start","end","Sprite","_processTemplateField","walkChildren","visualSettings","makeGraphics","gradient","gradientTarget","_markDirtyKey","strokeDasharray","strokeDashoffset","setLineDashOffset","draw","fillGradient","fillPattern","strokeGradient","strokePattern","shadow","changed","pattern","beginFill","endFill","stops","stop","colorInherited","opacityInherited","getFill","lineStyle","endStroke","_setRawDefault","availableWidth","minCellWidth","maxCellWidth","childWidth","columnCount","columnWidths","getColumnWidths","prevY","column","maxColumnHeight","prevX","marginTop","marginBottom","marginLeft","marginRight","totalWidth","totalPercent","Infinity","privateWidth","_text","_makeText","_textKeys","property","propValue","_setMaxDimentions","_setDataItem","markDirtyText","Label","Layout","display","points","p","isPrivateDirty","s","firstGroup","firstPoint","g","Line","tension","_tension","_line","NaN","_x0","_x1","_y0","_y1","_t0","_point","slope2","t1","slope3","curveMonotoneXTension","MonotoneXTension","sign","that","h0","h1","s0","s1","t0","x0","y0","dx","curveMonotoneYTension","monotoneYTension","MonotoneYTension","makePicture","_load","Image","decode","then","catch","_error","Picture","bwh","d2","stemX","stemY","PointedRectangle","radiusPrivate","innerRadiusPrivate","baseRadius","labelAngle","_flipped","dy","localBounds","centerX","RadialLabel","makeRadialText","textStyle","RadialText","_draw","drawRect","wSign","hSign","minSide","crtl","crtr","crbr","crbl","maxcr","RoundedRectangle","_makeThumb","_makeButton","setPrivateRaw","_thumbBusy","_addOrientationClass","thumb","newMiddle","newCoordinate","toLocal","_handleAnimation","_startDown","_endDown","_thumbDown","_updateThumb","_updateGripsByThumb","adapters","_value","updateGrips","eventType","fromValue","toValue","valueFunction","from","_t","thumbSize","Scrollbar","Chart","series","seriesContainer","_removeSeries","colors","reset","moveValue","_processSeries","setIndex","insertIndex","chart","_placeBulletsContainer","_removeBulletsContainer","classNames","concat","SerialChart","bullets","_handleBullets","bulletsContainer","bullet","_shouldMakeBullet","bulletFunction","_makeBullet","_aggregatesCalculated","_selectionAggregatesCalculated","startIndex","endIndex","_dataProcessed","_calculateAggregates","_psi","_pei","markerRectangle","legendDataItem","updateLegendMarker","_makeBullets","sum","absSum","count","low","high","close","average","changePercent","changePrevious","changePreviousPercent","changeSelection","ChangeSelectionPercent","rule","minValue","dataField","maxValue","_entities","percent","propertyValue","logarithmic","log","LOG10E","customFunction","_hideBullets","_positionBullets","_positionBullet","markDirtySize","_bullet","promises","Promise","all","realDuration","valueLabel","txt","_onHide","getTooltip","Series","innerRadius","ix","iy","generator","_generator","cornerRadius","outerRadius","middleAngle","shiftRadius","Slice","_sprite","_rendererDisposers","e","once","shouldClone","_on","rendererEvent","SpriteEventDispatcher","RENDERER_EVENTS","_onRenderer","_dispatchParents","old","dispatchParents","_hasDown","_hasMoved","_makePointerEvent","_addPercentagePositionChildren","_markDirtyPrivateKey","_templateField","_removeObjectTemplate","_removeTemplateField","_setObjectTemplate","_applyTemplates","oldDataItem","newDataItem","_addDirtyPosition","setLayer","tooltipMoveDp","_tooltipMoveDp","tooltipPointerDp","_tooltipPointerDp","showTooltip","_statesHandled","markDirtyAccessibility","_dragDp","dragStart","dragMove","dragStop","_tooltipDp","hideTooltip","_toggleDp","_isDragging","updatePivotPoint","_addPercentageSizeChildren","_registerTabindexOrder","_unregisterTabindexOrder","_focusDp","_hoverDp","_handleOver","_handleOut","_isDown","_handleUp","_handleDown","_dragEvent","stopParentDispatch","_dragPoint","lookup","isHover","_downPoint","pointerId","_downPoints","downPoint","dragEvent","hypot","getLocalBounds","_addDirtyBounds","isFocus","_invalidateAccessibility","newBounds","oldBounds","_adjustedLocalBounds","_getBounds","_fixMinBounds","getAdjustedBounds","privateHeight","tooltipPosition","tooltipTarget","toGlobal","_getTooltipPoint","promise","xx","yy","_removeParent","success","_isShowing","_isHidden","_isHiding","_onShow","animations","hovering","_findStaticTemplate","_walkParent","updateChildren","prevParent","numberFormatter","dateFormatter","durationFormatter","_getDownPointId","makeTextStyle","makeText","updateTooltip","wordWrapWidth","_textStyles","styleName","Text","Tick","_label","_updateBackground","_updateTextColor","_tooltips","updateBackgroundColor","_fillDp","_strokeDp","_labelDp","cw","ch","parentW","parentH","_w","_h","pointTo","pointerLength","pointerX","pointerY","boundsW","boundsH","_fx","_fy","animationDuration","animationEasing","availableHeight","childHeight","BlendMode","_afterNewApplyThemes","_target","addColorStop","_offset","_color","Gradient","getBounds","longer","lighten","brighten","LinearGradient","waitForAnimations","waitForStop","range","diff","defaultInterpolate","percentInterpolate","colorInterpolate","getInterpolate","array","any","test","eachReverse","eachContinue","shiftLeft","last","first","insert","pushAll","input","found","removeFirst","move","toIndex","removeIndex","pushOne","ind","toArray","copy","findIndex","matches","findIndexReverse","find","findReverse","findMap","shuffle","temporaryValue","randomIndex","currentIndex","random","getSortedIndex","ordering","getFirstSortedIndex","keepIf","keep","string2hex","string","repeat","parseInt","fromAny","hex","_hex","fromRGB","toCSSHex","val","rgba2hex","fromString","fromCSS","fromHex","lightAlternative","darkAlternative","mode","fromHSL","toHSL","pass","passOptions","reuse","hsl","hue","saturation","lightness","generateColors","getIndex","currentStep","ColorSet","processor","processRow","_onPush","_onInsertIndex","_onSetIndex","_setDefault","source","formatted","date","locales","Intl","DateTimeFormat","parseFormat","getTime","applyFormat","toUpperCase","fullYear","month","weekday","day","hours","minutes","seconds","milliseconds","res","getTimezoneOffset","utc","getUTCFullYear","getUTCMonth","getUTCDay","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","getFullYear","getMonth","getDay","getDate","getHours","getMinutes","getSeconds","getMilliseconds","parts","year","_getMonth","_getShortMonth","language","_getShortWeekday","firstDayOfWeek","tz","tzh","tzm","toISOString","toUTCString","dateFormat","_months","_shortMonths","_weekdays","_shortWeekdays","reg","parsedIndexes","resValues","indexAdjust","year3","year2","year1","getStringList","monthLong","monthShort","week","yearDay","weekdayLong","weekdayShort","am","hour12Base1","hourBase0","hour12Base0","hourBase1","minute","second","millisecond","millisecondDigits","zone","iso","regex","RegExp","resolveMonth","resolveShortMonth","hour","isAm","ts","resolveTimezoneOffset","UTC","dir","translateAll","_counter","dmillisecond","dsecond","dminute","dhour","dday","dweek","dmonth","aminute","ahour","aday","aweek","amonth","ayear","base","baseUnit","getFormat","details","positive","negative","zero","_part","parsed","dirs","partFormat","absolute","_unitAliases","tstamp","toTimeStamp","part","unit","_toTimeUnit","digits","ints","_getUnitValue","code","maxUnit","getValueUnit","currentUnit","ms","_getUnitValues","timeUnit","linear","quad","cubic","exp","sine","circle","yoyo","ease","out","inOut","b0","bounce","bounceOut","period","asin","elastic","v","_entity","fallback","_userSettings","seen","defaultState","_eachSetting","stateAnimationDuration","stateAnimationEasing","_states","state","State","newState","_callbacks","loops","startingTime","_from","_to","_easing","_loops","_interpolate","_oldTime","_playing","_stopped","_time","resolve","_reject","counter","_userProperties","_animatingSettings","_stopAnimation","_run","percentage","_checkEnded","_reset","_set","_animatingPrivateSettings","_stopAnimationPrivate","_setPrivate","_animatingCount","_settingEvents","_privateSettingEvents","getRaw","_sendKeyEvent","_setRaw","_privateSettings","_prevPrivateSettings","_sendPrivateKeyEvent","_setPrivateRaw","Animation","_animationTime","_startAnimation","templates","States","Adapters","_createEvents","_internalTemplates","_template","shouldApply","constructor","_dirtyPrivate","_disposerProperties","_addDirtyEntity","_name","fold","_removeTemplateProperty","_userPrivateProperties","_removeTemplatePrivateProperty","_findTemplateByKey","_findTemplateByPrivateKey","other","_eachTemplate","_apply","_templateDisposers","privateSettings","_runSetup","setup","_templates","_disposeTemplates","_applyTemplate","_findTemplate","isConnected","defaults","tag","_walkParents","theme","_removeTemplates","allRules","_lookupRules","every","result","prevId","removeDispose","hasTag","Settings","_killed","_disabled","_iterating","_enabled","killed","amount","_eachListener","hasListenersByType","_removeListener","_shouldDispatch","_removeExistingListener","_type","checkBounds","initial","_values","value_a","value_b","_onRemoveIndex","_onMoveIndex","newArray","_onClear","autoDispose","make","ListAutoDispose","HALFPI","RADIANS","DEGREES","precision","isNumber","rounded","getCubicControlPointA","tensionX","tensionY","getCubicControlPointB","fitToRange","normalizeAngle","getArcBounds","minY","maxY","bpoints","getArcPoint","fromAngle","toAngle","pt","mergeBounds","bound","fitAngleToRange","temp","inBounds","getAngle","point1","point2","diffX","diffY","atan2","getPointOnQuadraticCurve","pointA","pointB","controlPoint","getPointOnLine","closest","referenceValue","reduce","prev","curr","boundsOverlap","bounds1","bounds2","bns","sns","suffix","toLowerCase","NumberFormat","mod","decimals","active","thousandSeparator","translateEmpty","decimalSeparator","mods","modSpacing","thousands","interval","prefix","applyPrefix","ol","parseFloat","toPrecision","toExponential","ip","intsr","separator","decs","prefixes","force","newvalue","applied","k","number","keys","keysOrdered","assign","hasKey","eachOrdered","ord","hasOwnProperty","softCopyProperties","compare","compareArray","leftLength","rightLength","compareNumber","p100","p50","populateString","getTagValue","tagName","prop","dateFields","getDateFormatter","numericFields","getNumberFormatter","durationFields","getDurationFormatter","method","params","reg2","matches2","getTagValueFromObject","current","formatApplied","numberValue","dateValue","durationValue","encodeURIComponent","formatParts","formatterType","_stateChanged","TemplateState","TemplateStates","TemplateAdapters","Template","_setTemplateProperty","_setTemplatePrivateProperty","onPrivate","_applyStateByKey","quotedBlocks","noFormatting","escape","chunks2","i2","chunk2","cleanUp","unescape","isImage","q","sleep","timeUnitDurations","getNextUnit","getDuration","getIntervalDuration","checkChange","dateOne","dateTwo","timeOne","timeTwo","timeZoneOffset1","timeZoneOffset2","setUTCMinutes","nextUnit","timeZoneOffset","setUTCDate","setUTCSeconds","setUTCMilliseconds","setUTCHours","setUTCFullYear","setUTCMonth","wday","newTimeZoneOffset","firstDateOfWeek","firstDate","difference","unitCount","setTime","weekDay","setTimezone","timezone","toLocaleString","timeZone","chooseInterval","gridCount","intervals","intervalDuration","getUnitValue","isNaN","getType","toNumber","converted","isString","toDate","isDate","num","numberToString","zeros","exponent","isObject","PLACEHOLDER","PLACEHOLDER2","rootStylesheet","ready","readyState","removeEventListener","addEventListener","removeElement","el","parentNode","supports","cap","getPointerId","activeElement","focus","getRendererEvent","isTouchEvent","PointerEvent","pointerType","setStyle","getStyle","cursor","host","setInteractive","getShadowRoot","selector","styles","nonce","head","sheet","getStylesheet","cssRules","_rule","deleteRule","insertRule","appendStylesheet","selectorText","setProperty","_setVendorPrefixName","relativeToValue","full","decimalPlaces","padString","trimLeft","trimRight","trim","hints","cleanFormat","stripTags","plainText","escapeForRgex","getYearDay","getWeek","getMonthWeek","firstWeek","currentWeek","getDayFromWeek","get12Hours","getTimeZone","long","savings","wotz","wtz","timeZoneName","capitalizeFirst","charAt","hslToRgb","hue2rgb","rgbToHsl","getLightnessStep","step","getBrightnessStep","isLight","saturate","alternativeColor","light","dark","mergeTags","tags1","tags2","sameBounds","setColor","ic","bind","primaryButton","primaryButtonHover","primaryButtonDown","primaryButtonActive","primaryButtonText","primaryButtonStroke","secondaryButton","secondaryButtonHover","secondaryButtonDown","secondaryButtonActive","secondaryButtonText","secondaryButtonStroke","grid","alternativeBackground","alternativeText","disabled","interpolationDuration","interpolationEasing","gap","colorOpacity","checkered","centered","fillField","strokeField","nameField","clickTarget","focusable","cornerRadiusBL","cornerRadiusTL","cornerRadiusBR","cornerRadiusTR","populateText","stepCount","pointerBaseWidth","dRadius","dInnerRadius","locationX","locationY","getFillFromSprite","getStrokeFromSprite","autoTextColor","draggable","toggleKey","labelText","spikes","noop","n","arguments","Dispatch","parseTypenames","typenames","types","prototype","typename","T","pi","tau","epsilon","tauEpsilon","Path","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","t01","t21","a0","ccw","da","halfPi","arcInnerRadius","arcOuterRadius","arcStartAngle","arcEndAngle","arcPadAngle","padAngle","intersect","x3","y3","x10","y10","x32","y32","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x00","y00","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","constant","padRadius","buffer","r0","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","oc","ax","ay","bx","by","kc","lc","centroid","defined","area","j","defined0","x0z","y0z","areaStart","lineStart","lineEnd","areaEnd","arealine","lineX0","lineY0","lineY1","lineX1","Linear","taskHead","taskTail","frame","timeout","clockLast","clockNow","clockSkew","clock","performance","setFrame","clearNow","Timer","_call","_next","time","restart","wake","timerFlush","t2","nap","poke","clearInterval","setInterval","global","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","runtime","regeneratorRuntime","module","exports","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","IteratorPrototype","getPrototypeOf","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","arg","__await","defineIteratorMethods","AsyncIterator","async","innerFn","outerFn","tryLocsList","iter","Context","skipTempReset","sent","_sent","delegate","tryEntries","resetTryEntry","rootRecord","completion","rval","dispatchException","exception","handle","loc","caught","record","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","abrupt","finallyEntry","complete","afterLoc","finish","thrown","delegateYield","iterable","resultName","nextLoc","protoGenerator","_invoke","doneResult","delegateResult","maybeInvokeDelegate","tryCatch","makeInvokeMethod","invoke","reject","unwrapped","previousPromise","callInvokeWithMethodAndArg","return","pushTryEntry","locs","iteratorMethod","Function","extendStatics","__extends","String","__","__assign","__awaiter","thisArg","_arguments","P","fulfilled","rejected","__generator","trys","ops","verb","__values","o","__read","ar","error","__spreadArray","pack","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","priority","notFulfilled","getter","__esModule","ns","def","getOwnPropertyNames","definition","defineProperty","enumerable","chunkId","u","globalThis","url","script","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","onerror","onload","doneFns","installedChunks","4826","installedChunkData","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","chunkLoadingGlobal","promiseThen","promiseCatch","promiseFinally","finally","promiseReject","promiseResolve","promiseAllSettled","allSettled","promiseAll","promiseRace","race","fetch","startsWith","endsWith","Bullet","drawEllipse","Ellipse","ir","Star","labelContainer","markers","marker","startValue","startColor","endColor","markerContainer","startLabel","endLabel","makeMarker","HeatLegend","itemContainers","themeTagsSelf","labels","valueLabels","markerRectangles","itemContainer","makeItemContainer","useDefaultMarker","makeMarkerRectangle","createLegendMarker","makeLabel","makeValueLabel","clickContainer","_addHoverEvents","_addClickEvents","hoverDataItem","unhoverDataItem","readerAlert","Legend","Triangle","Slider","RadialGradient","_pattern","_backgroundDisplay","Pattern","cellW","cellH","cols","rows","CirclePattern","LinePattern","rectW","rectH","RectanglePattern","_applyDefaults","JSON","parse","normalized","col","row","CSVToArray","delimiter","skipRows","shift","useColumnNames","skipEmpty","dataPoint","objPattern","arrData","arrMatches","strMatchedDelimiter","strMatchedValue","_checkFeatures","_checkDates","_checkNumbers","_checkColors","_checkEmpty","_checkDeepFeatures","deepFields","where","steps","_checkDeep","lookupKey","_maybeToEmpty","_maybeToNumber","_maybeToDate","_maybeToColor","load","isBlob","responseType","xhr","XMLHttpRequest","status","response","readBlob","blob","getResponseHeader","responseText","withCredentials","requestHeaders","header","setRequestHeader","send","reader","FileReader","_event","readAsText","am5","currentScript","getCurrentScript"],"mappings":"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","file":"index.js","sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tresult = fn();\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"@amcharts/amcharts5:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","\r\n/**\r\n * @ignore\r\n */\r\nexport class Registry {\r\n\r\n\t/**\r\n\t * List of applied licenses.\r\n\t * @ignore\r\n\t */\r\n\tlicenses: String[] = [];\r\n\r\n\t/**\r\n\t * Entities that have their `id` setting set.\r\n\t */\r\n\tentitiesById: { [index: string]: any } = {};\r\n\r\n\t/**\r\n\t * All created [[Root]] elements.\r\n\t */\r\n\trootElements: any[] = [];\r\n\r\n}\r\n\r\n/**\r\n\t* @ignore\r\n */\r\nexport const registry = new Registry();\r\n\r\n/**\r\n * Adds a license, e.g.:\r\n *\r\n * ```TypeScript\r\n * am5.addLicense(\"xxxxxxxx\");\r\n * ```\r\n * ```JavaScript\r\n * am5.addLicense(\"xxxxxxxx\");\r\n * ```\r\n *\r\n * Multiple licenses can be added to cover for multiple products.\r\n *\r\n * @param license License key\r\n */\r\nexport function addLicense(license: string): void {\r\n\tregistry.licenses.push(license);\r\n}\r\n\r\n\r\n/**\r\n * Disposes all [[Root]] elements.\r\n */\r\nexport function disposeAllRootElements(): void {\r\n\tlet root;\r\n\twhile(root = registry.rootElements.pop()) {\r\n\t\troot.dispose();\r\n\t}\r\n}","/** @ignore *//** */\n\nimport type { IDisposer } from \"./Disposer\";\nimport * as $array from \"./Array\";\n\n/**\n * @ignore\n */\ninterface Sensor {\n\taddTarget(target: Element, callback: () => void): void;\n\tremoveTarget(target: Element): void;\n}\n\n/**\n * @ignore\n */\ndeclare const ResizeObserver: any;\n\n/**\n * @ignore\n */\nclass Native implements Sensor {\n\tprivate _observer: any;\n\tprivate _targets: Array<{ target: Element, callback: () => void }> = [];\n\n\tconstructor() {\n\t\tthis._observer = new ResizeObserver((entries: Array) => {\n\t\t\t$array.each(entries, (entry) => {\n\t\t\t\t$array.each(this._targets, (x) => {\n\t\t\t\t\tif (x.target === entry.target) {\n\t\t\t\t\t\tx.callback();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\taddTarget(target: Element, callback: () => void) {\n\t\tthis._observer.observe(target, { box: \"content-box\" });\n\t\tthis._targets.push({ target, callback });\n\t}\n\n\tremoveTarget(target: Element) {\n\t\tthis._observer.unobserve(target);\n\n\t\t$array.keepIf(this._targets, (x) => {\n\t\t\treturn x.target !== target;\n\t\t});\n\t}\n}\n\n/**\n * @ignore\n */\nclass Raf implements Sensor {\n\tpublic static delay: number = 200;\n\n\tprivate _timer: number | null = null;\n\tprivate _targets: Array<{ target: Element, callback: () => void, size: ClientRect | DOMRect }> = [];\n\n\taddTarget(target: Element, callback: () => void) {\n\t\tif (this._timer === null) {\n\t\t\tlet lastTime: number | null = null;\n\n\t\t\tconst loop = () => {\n\t\t\t\tconst currentTime = Date.now();\n\n\t\t\t\tif (lastTime === null || currentTime > (lastTime + Raf.delay)) {\n\t\t\t\t\tlastTime = currentTime;\n\n\t\t\t\t\t$array.each(this._targets, (x) => {\n\t\t\t\t\t\tlet newSize = x.target.getBoundingClientRect();\n\n\t\t\t\t\t\tif (newSize.width !== x.size.width || newSize.height !== x.size.height) {\n\t\t\t\t\t\t\tx.size = newSize;\n\t\t\t\t\t\t\tx.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._targets.length === 0) {\n\t\t\t\t\tthis._timer = null;\n\n\t\t\t\t} else {\n\t\t\t\t\tthis._timer = requestAnimationFrame(loop);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis._timer = requestAnimationFrame(loop);\n\t\t}\n\n\t\t// We start off with fake bounds so that sensor always kicks in\n\t\t//let size = target.getBoundingClientRect();\n\t\tlet size = { width: 0, height: 0, left: 0, right: 0, top: 0, bottom: 0 };\n\t\tthis._targets.push({ target, callback, size });\n\t}\n\n\tremoveTarget(target: Element) {\n\t\t$array.keepIf(this._targets, (x) => {\n\t\t\treturn x.target !== target;\n\t\t});\n\n\t\tif (this._targets.length === 0) {\n\t\t\tif (this._timer !== null) {\n\t\t\t\tcancelAnimationFrame(this._timer);\n\t\t\t\tthis._timer = null;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * @ignore\n */\nlet observer: Sensor | null = null;\n\n/**\n * @ignore\n */\nfunction makeSensor(): Sensor {\n\tif (observer === null) {\n\t\tif (typeof ResizeObserver !== \"undefined\") {\n\t\t\tobserver = new Native();\n\n\t\t} else {\n\t\t\tobserver = new Raf();\n\t\t}\n\t}\n\n\treturn observer;\n}\n\n/**\n * @ignore\n */\nexport class ResizeSensor implements IDisposer {\n\tprivate _sensor: Sensor;\n\tprivate _element: Element;\n\tprivate _disposed: boolean = false;\n\n\tconstructor(element: Element, callback: () => void) {\n\t\tthis._sensor = makeSensor();\n\t\tthis._element = element;\n\t\tthis._sensor.addTarget(element, callback);\n\t}\n\n\tpublic isDisposed() {\n\t\treturn this._disposed;\n\t}\n\n\tpublic dispose() {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\t\t\tthis._sensor.removeTarget(this._element);\n\t\t}\n\t}\n\n\tpublic get sensor(): Sensor {\n\t\treturn this._sensor;\n\t}\n}\n","import { Entity, IEntitySettings, IEntityPrivate } from \"./Entity\"\nimport * as $array from \"./Array\"\nimport en from \"../../../locales/en\";\n\n/**\n * Defines properties that exist for the locale.\n *\n * @ignore\n */\nexport interface ILocaleSettings {\n\t\"firstDayOfWeek\"?: number,\n\n\t// number formatter related\n\t\"_decimalSeparator\"?: string;\n\t\"_thousandSeparator\"?: string;\n\n\t\"_big_number_suffix_3\"?: string;\n\t\"_big_number_suffix_6\"?: string;\n\t\"_big_number_suffix_9\"?: string;\n\t\"_big_number_suffix_12\"?: string;\n\t\"_big_number_suffix_15\"?: string;\n\t\"_big_number_suffix_18\"?: string;\n\t\"_big_number_suffix_21\"?: string;\n\t\"_big_number_suffix_24\"?: string;\n\n\t\"_small_number_suffix_24\"?: string;\n\t\"_small_number_suffix_21\"?: string;\n\t\"_small_number_suffix_18\"?: string;\n\t\"_small_number_suffix_15\"?: string;\n\t\"_small_number_suffix_12\"?: string;\n\t\"_small_number_suffix_9\"?: string;\n\t\"_small_number_suffix_6\"?: string;\n\t\"_small_number_suffix_3\"?: string;\n\n\t\"_byte_suffix_B\"?: string;\n\t\"_byte_suffix_KB\"?: string;\n\t\"_byte_suffix_MB\"?: string;\n\t\"_byte_suffix_GB\"?: string;\n\t\"_byte_suffix_TB\"?: string;\n\t\"_byte_suffix_PB\"?: string;\n\n\t// Default date formats for various periods\n\t\"_date\"?: string;\n\t\"_date_millisecond\"?: string;\n\t\"_date_second\"?: string;\n\t\"_date_minute\"?: string;\n\t\"_date_hour\"?: string;\n\t\"_date_day\"?: string;\n\t\"_date_week\"?: string;\n\t\"_date_month\"?: string;\n\t\"_date_year\"?: string;\n\n\t// Default duration formats for various base units\n\t\"_duration_millisecond\"?: string;\n\t\"_duration_millisecond_second\"?: string;\n\t\"_duration_millisecond_minute\"?: string;\n\t\"_duration_millisecond_hour\"?: string;\n\t\"_duration_millisecond_day\"?: string;\n\t\"_duration_millisecond_week\"?: string;\n\t\"_duration_millisecond_month\"?: string;\n\t\"_duration_millisecond_year\"?: string;\n\n\t\"_duration_second\"?: string;\n\t\"_duration_second_minute\"?: string;\n\t\"_duration_second_hour\"?: string;\n\t\"_duration_second_day\"?: string;\n\t\"_duration_second_week\"?: string;\n\t\"_duration_second_month\"?: string;\n\t\"_duration_second_year\"?: string;\n\n\t\"_duration_minute\"?: string;\n\t\"_duration_minute_hour\"?: string;\n\t\"_duration_minute_day\"?: string;\n\t\"_duration_minute_week\"?: string;\n\t\"_duration_minute_month\"?: string;\n\t\"_duration_minute_year\"?: string;\n\n\t\"_duration_hour\"?: string;\n\t\"_duration_hour_day\"?: string;\n\t\"_duration_hour_week\"?: string;\n\t\"_duration_hour_month\"?: string;\n\t\"_duration_hour_year\"?: string;\n\n\t\"_duration_day\"?: string;\n\t\"_duration_day_week\"?: string;\n\t\"_duration_day_month\"?: string;\n\t\"_duration_day_year\"?: string;\n\n\t\"_duration_week\"?: string;\n\t\"_duration_week_month\"?: string;\n\t\"_duration_week_year\"?: string;\n\n\t\"_duration_month\"?: string;\n\t\"_duration_month_year\"?: string;\n\n\t\"_duration_year\"?: string;\n\n\t// Era\n\t\"_era_ad\"?: string;\n\t\"_era_bc\"?: string;\n\n\t// Period\n\t\"A\"?: string;\n\t\"P\"?: string;\n\t\"AM\"?: string;\n\t\"PM\"?: string;\n\t\"A.M.\"?: string;\n\t\"P.M.\"?: string;\n\n\t// Dates\n\t\"January\"?: string;\n\t\"February\"?: string;\n\t\"March\"?: string;\n\t\"April\"?: string;\n\t\"May\"?: string;\n\t\"June\"?: string;\n\t\"July\"?: string;\n\t\"August\"?: string;\n\t\"September\"?: string;\n\t\"October\"?: string;\n\t\"November\"?: string;\n\t\"December\"?: string;\n\t\"Jan\"?: string;\n\t\"Feb\"?: string;\n\t\"Mar\"?: string;\n\t\"Apr\"?: string;\n\t\"May(short)\"?: string;\n\t\"Jun\"?: string;\n\t\"Jul\"?: string;\n\t\"Aug\"?: string;\n\t\"Sep\"?: string;\n\t\"Oct\"?: string;\n\t\"Nov\"?: string;\n\t\"Dec\"?: string;\n\t\"Sunday\"?: string;\n\t\"Monday\"?: string;\n\t\"Tuesday\"?: string;\n\t\"Wednesday\"?: string;\n\t\"Thursday\"?: string;\n\t\"Friday\"?: string;\n\t\"Saturday\"?: string;\n\t\"Sun\"?: string;\n\t\"Mon\"?: string;\n\t\"Tue\"?: string;\n\t\"Wed\"?: string;\n\t\"Thu\"?: string;\n\t\"Fri\"?: string;\n\t\"Sat\"?: string;\n\n\t// Chart elements\n\t\"Zoom Out\"?: string;\n\t\"Play\"?: string;\n\t\"Stop\"?: string;\n\t\"Legend\"?: string;\n\t\"Press ENTER to toggle\"?: string;\n\t\"Loading\"?: string;\n\t\"%1 shown\"?: string;\n\t\"%1 hidden\"?: string;\n\n\t// Chart types\n\t\"Chart\"?: string;\n\t\"Serial chart\"?: string;\n\t\"X/Y chart\"?: string;\n\t\"Pie chart\"?: string;\n\t\"Sunburst chart\"?: string;\n\t\"Gauge chart\"?: string;\n\t\"Radar chart\"?: string;\n\t\"Sankey diagram\"?: string;\n\t\"Flow diagram\"?: string;\n\t\"Chord diagram\"?: string;\n\t\"TreeMap chart\"?: string;\n\t\"Force directed tree\"?: string;\n\t\"Sliced chart\"?: string;\n\n\t// Series types\n\t\"Series\"?: string;\n\t\"Candlestick Series\"?: string;\n\t\"OHLC Series\"?: string;\n\t\"Column Series\"?: string;\n\t\"Line Series\"?: string;\n\t\"Pie Slice Series\"?: string;\n\t\"Funnel Series\"?: string;\n\t\"Pyramid Series\"?: string;\n\t\"X/Y Series\"?: string;\n\n\t// Map-related\n\t\"Map\"?: string;\n\t\"Press ENTER to zoom in\"?: string;\n\t\"Press ENTER to zoom out\"?: string;\n\t\"Use arrow keys to zoom in and out\"?: string;\n\t\"Use plus and minus keys on your keyboard to zoom in and out\"?: string;\n\t\"Home\"?: string;\n\t\"Zoom level changed to %1\"?: string;\n\n\t// Export-related\n\t\"Export\"?: string;\n\t\"Image\"?: string;\n\t\"Data\"?: string;\n\t\"Print\"?: string;\n\t\"Press ENTER or use arrow keys to navigate\"?: string;\n\t\"Press ENTER to open\"?: string;\n\t\"Press ENTER to print.\"?: string;\n\t\"Press ENTER to export as %1.\"?: string;\n\t\"(Press ESC to close this message)\"?: string;\n\t\"Image Export Complete\"?: string;\n\t\"Export operation took longer than expected. Something might have gone wrong.\"?: string;\n\t\"Saved from\"?: string;\n\t\"PNG\"?: string;\n\t\"JPG\"?: string;\n\t\"GIF\"?: string;\n\t\"SVG\"?: string;\n\t\"PDF\"?: string;\n\t\"JSON\"?: string;\n\t\"CSV\"?: string;\n\t\"XLSX\"?: string;\n\t\"HTML\"?: string;\n\n\t// Scrollbar-related\n\t\"Use TAB to select grip buttons or left and right arrows to change selection\"?: string;\n\t\"Use left and right arrows to move selection\"?: string;\n\t\"Use left and right arrows to move left selection\"?: string;\n\t\"Use left and right arrows to move right selection\"?: string;\n\t\"Use TAB select grip buttons or up and down arrows to change selection\"?: string;\n\t\"Use up and down arrows to move selection\"?: string;\n\t\"Use up and down arrows to move lower selection\"?: string;\n\t\"Use up and down arrows to move upper selection\"?: string;\n\t\"From %1 to %2\"?: string;\n\t\"From %1\"?: string;\n\t\"To %1\"?: string;\n\n\t// Data loader-related\n\t\"No parser available for file: %1\"?: string;\n\t\"Error parsing file: %1\"?: string;\n\t\"Unable to load file: %1\"?: string;\n\t\"Invalid date\"?: string;\n\n\t// Common actions\n\t\"Close\"?: string;\n\t\"Minimize\"?: string;\n\n\t\"Venn Series\"?: string;\n\t\"Venn Diagram\"?: string;\n}\n\n/**\n * Defines functions that exist for the locale.\n *\n * @ignore\n */\nexport interface ILocaleFunctions {\n\t// ordinal function\n\t\"_dateOrd\": (day: number) => string;\n}\n\n/**\n * Defines all of the defaults for locale properties.\n * @ignore\n */\nexport interface ILocaleDefault extends ILocaleSettings, ILocaleFunctions { }\n\n/**\n * Defines locale interface.\n *\n * @ignore\n */\nexport interface ILocale extends Partial { };\n\nexport interface ILanguageSettings extends IEntitySettings {\n}\n\nexport interface ILanguagePrivate extends IEntityPrivate {\n\n\t/**\n\t * A locale for International English (default).\n\t */\n\tdefaultLocale: ILocale;\n\n}\n\nexport class Language extends Entity {\n\tdeclare public _settings: ILanguageSettings;\n\tdeclare public _privateSettings: ILanguagePrivate;\n\n\tprotected _setDefaults() {\n\t\tthis.setPrivate(\"defaultLocale\", en);\n\t\tsuper._setDefaults();\n\t}\n\n\tpublic translate(prompt: Key, locale?: ILocale, ...rest: Array): string {\n\n\t\t// Get langauge\n\t\tif (!locale) {\n\t\t\tlocale = this._root.locale || this.getPrivate(\"defaultLocale\");\n\t\t}\n\n\t\t// Init translation\n\t\tlet translation: string = prompt;\n\t\tlet value = locale[prompt];\n\n\t\t// Try to look for the translation\n\t\tif (value === null) {\n\t\t\ttranslation = \"\";\n\t\t}\n\t\telse if (value != null) {\n\t\t\t// It might be an empty string\n\t\t\tif (value) {\n\t\t\t\ttranslation = value!;\n\t\t\t}\n\t\t}\n\t\telse if (locale !== this.getPrivate(\"defaultLocale\")) {\n\t\t\t// Try to look in default language\n\t\t\treturn this.translate(prompt, this.getPrivate(\"defaultLocale\"), ...rest);\n\t\t}\n\n\t\t// Replace %1, %2, etc params\n\t\tif (rest.length) {\n\t\t\tfor (let len = rest.length, i = 0; i < len; ++i) {\n\t\t\t\ttranslation = translation.split(\"%\" + (i + 1)).join(rest[i]);\n\t\t\t}\n\t\t}\n\n\t\t// Return the translation\n\t\treturn translation;\n\t}\n\n\tpublic translateAny(prompt: string, locale?: ILocale, ...rest: Array): string {\n\t\treturn this.translate(prompt, locale, ...rest);\n\t}\n\n\tpublic setTranslationAny(prompt: string, translation: string, locale?: ILocale): void {\n\t\tconst localeTarget = locale || this._root.locale;\n\t\t(localeTarget)[prompt] = translation;\n\t}\n\n\tpublic translateEmpty(prompt: Key, locale?: ILocale, ...rest: Array): string {\n\t\tlet translation = this.translate(prompt, locale, ...rest);\n\t\treturn translation == prompt ? \"\" : translation;\n\t}\n\n\tpublic translateFunc(prompt: Key, locale?: ILocale): ILocaleFunctions[Key] {\n\n\t\tif ((this._root.locale)[prompt]) {\n\t\t\treturn (this._root.locale)[prompt];\n\t\t}\n\n\t\t// Try to look in default language\n\t\tif (locale !== this.getPrivate(\"defaultLocale\")) {\n\t\t\treturn this.translateFunc(prompt, this.getPrivate(\"defaultLocale\"));\n\t\t}\n\n\t\t// Fail - return empty function\n\t\treturn (): string => {\n\t\t\treturn \"\";\n\t\t};\n\t}\n\n\tpublic translateAll(list: Array, locale?: ILocale): Array {\n\t\t// Translate all items in the list\n\t\tif (!this.isDefault()) {\n\t\t\treturn $array.map(list, (x) => this.translate(x, locale));\n\n\t\t} else {\n\t\t\treturn list;\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if the currently selected locale is a default locale.\n\t *\n\t * @return `true` if locale is default; `false` if it is not.\n\t */\n\tpublic isDefault(): boolean {\n\t\treturn this.getPrivate(\"defaultLocale\") === this._root.locale;\n\t}\n\n}\n","/**\n * Modified from Pixi:\n *\n * The MIT License\n *\n * Copyright (c) 2013-2017 Mathew Groves, Chad Engler\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport type { IPoint } from \"./IPoint\";\n\n/**\n * @ignore\n */\nexport class Matrix {\n\tpublic a: number;\n\tpublic b: number;\n\tpublic c: number;\n\tpublic d: number;\n\tpublic tx: number;\n\tpublic ty: number;\n\n\tconstructor(a = 1, b = 0, c = 0, d = 1, tx = 0, ty = 0) {\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.d = d;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t}\n\n\t/**\n\t * Sets the matrix based on all the available properties\n\t */\n\tsetTransform(x: number, y: number, pivotX: number, pivotY: number, rotation: number, scale: number = 1): void {\n\t\tthis.a = Math.cos(rotation) * scale;\n\t\tthis.b = Math.sin(rotation) * scale;\n\t\tthis.c = -Math.sin(rotation) * scale;\n\t\tthis.d = Math.cos(rotation) * scale;\n\t\tthis.tx = x - ((pivotX * this.a) + (pivotY * this.c));\n\t\tthis.ty = y - ((pivotX * this.b) + (pivotY * this.d));\n\t}\n\n\t/**\n\t * Get a new position with the current transformation applied.\n\t * Can be used to go from a child's coordinate space to the world coordinate space. (e.g. rendering)\n\t */\n\tapply(origin: IPoint): IPoint {\n\t\treturn {\n\t\t\tx: (this.a * origin.x) + (this.c * origin.y) + this.tx,\n\t\t\ty: (this.b * origin.x) + (this.d * origin.y) + this.ty\n\t\t};\n\t}\n\n\t/**\n\t * Get a new position with the inverse of the current transformation applied.\n\t * Can be used to go from the world coordinate space to a child's coordinate space. (e.g. input)\n\t */\n\tapplyInverse(origin: IPoint): IPoint {\n\t\tconst id = 1 / ((this.a * this.d) + (this.c * -this.b));\n\n\t\treturn {\n\t\t\tx: (this.d * id * origin.x) + (-this.c * id * origin.y) + (((this.ty * this.c) - (this.tx * this.d)) * id),\n\t\t\ty: (this.a * id * origin.y) + (-this.b * id * origin.x) + (((-this.ty * this.a) + (this.tx * this.b)) * id)\n\t\t};\n\t}\n\n\t/**\n\t * Appends the given Matrix to this Matrix.\n\t */\n\tappend(matrix: Matrix): void {\n\t\tconst a1 = this.a;\n\t\tconst b1 = this.b;\n\t\tconst c1 = this.c;\n\t\tconst d1 = this.d;\n\t\tthis.a = (matrix.a * a1) + (matrix.b * c1);\n\t\tthis.b = (matrix.a * b1) + (matrix.b * d1);\n\t\tthis.c = (matrix.c * a1) + (matrix.d * c1);\n\t\tthis.d = (matrix.c * b1) + (matrix.d * d1);\n\t\tthis.tx = (matrix.tx * a1) + (matrix.ty * c1) + this.tx;\n\t\tthis.ty = (matrix.tx * b1) + (matrix.ty * d1) + this.ty;\n\t}\n\n\t/**\n\t * Prepends the given Matrix to this Matrix.\n\t */\n\tprepend(matrix: Matrix): void {\n\t\tconst tx1 = this.tx;\n\t\tif (matrix.a !== 1 || matrix.b !== 0 || matrix.c !== 0 || matrix.d !== 1) {\n\t\t\tconst a1 = this.a;\n\t\t\tconst c1 = this.c;\n\t\t\tthis.a = (a1 * matrix.a) + (this.b * matrix.c);\n\t\t\tthis.b = (a1 * matrix.b) + (this.b * matrix.d);\n\t\t\tthis.c = (c1 * matrix.a) + (this.d * matrix.c);\n\t\t\tthis.d = (c1 * matrix.b) + (this.d * matrix.d);\n\t\t}\n\t\tthis.tx = (tx1 * matrix.a) + (this.ty * matrix.c) + matrix.tx;\n\t\tthis.ty = (tx1 * matrix.b) + (this.ty * matrix.d) + matrix.ty;\n\t}\n\n\t/**\n\t * Copies the other matrix's properties into this matrix\n\t */\n\tcopyFrom(matrix: Matrix): void {\n\t\tthis.a = matrix.a;\n\t\tthis.b = matrix.b;\n\t\tthis.c = matrix.c;\n\t\tthis.d = matrix.d;\n\t\tthis.tx = matrix.tx;\n\t\tthis.ty = matrix.ty;\n\t}\n}\n\n","export class Throttler {\n\tprivate _ready: boolean = true;\n\tprivate _pending: boolean = false;\n\tprivate _fn: () => void;\n\n\tconstructor(fn: () => void) {\n\t\tthis._fn = fn;\n\t}\n\n\tpublic run(): void {\n\t\tif (this._ready) {\n\t\t\tthis._ready = false;\n\t\t\tthis._pending = false;\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tthis._ready = true;\n\n\t\t\t\tif (this._pending) {\n\t\t\t\t\tthis.run();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._fn();\n\n\t\t} else {\n\t\t\tthis._pending = true;\n\t\t}\n\t}\n}\n","var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar TAU = Math.PI * 2;\n\nvar mapToEllipse = function mapToEllipse(_ref, rx, ry, cosphi, sinphi, centerx, centery) {\n var x = _ref.x,\n y = _ref.y;\n\n x *= rx;\n y *= ry;\n\n var xp = cosphi * x - sinphi * y;\n var yp = sinphi * x + cosphi * y;\n\n return {\n x: xp + centerx,\n y: yp + centery\n };\n};\n\nvar approxUnitArc = function approxUnitArc(ang1, ang2) {\n // If 90 degree circular arc, use a constant\n // as derived from http://spencermortensen.com/articles/bezier-circle\n var a = ang2 === 1.5707963267948966 ? 0.551915024494 : ang2 === -1.5707963267948966 ? -0.551915024494 : 4 / 3 * Math.tan(ang2 / 4);\n\n var x1 = Math.cos(ang1);\n var y1 = Math.sin(ang1);\n var x2 = Math.cos(ang1 + ang2);\n var y2 = Math.sin(ang1 + ang2);\n\n return [{\n x: x1 - y1 * a,\n y: y1 + x1 * a\n }, {\n x: x2 + y2 * a,\n y: y2 - x2 * a\n }, {\n x: x2,\n y: y2\n }];\n};\n\nvar vectorAngle = function vectorAngle(ux, uy, vx, vy) {\n var sign = ux * vy - uy * vx < 0 ? -1 : 1;\n\n var dot = ux * vx + uy * vy;\n\n if (dot > 1) {\n dot = 1;\n }\n\n if (dot < -1) {\n dot = -1;\n }\n\n return sign * Math.acos(dot);\n};\n\nvar getArcCenter = function getArcCenter(px, py, cx, cy, rx, ry, largeArcFlag, sweepFlag, sinphi, cosphi, pxp, pyp) {\n var rxsq = Math.pow(rx, 2);\n var rysq = Math.pow(ry, 2);\n var pxpsq = Math.pow(pxp, 2);\n var pypsq = Math.pow(pyp, 2);\n\n var radicant = rxsq * rysq - rxsq * pypsq - rysq * pxpsq;\n\n if (radicant < 0) {\n radicant = 0;\n }\n\n radicant /= rxsq * pypsq + rysq * pxpsq;\n radicant = Math.sqrt(radicant) * (largeArcFlag === sweepFlag ? -1 : 1);\n\n var centerxp = radicant * rx / ry * pyp;\n var centeryp = radicant * -ry / rx * pxp;\n\n var centerx = cosphi * centerxp - sinphi * centeryp + (px + cx) / 2;\n var centery = sinphi * centerxp + cosphi * centeryp + (py + cy) / 2;\n\n var vx1 = (pxp - centerxp) / rx;\n var vy1 = (pyp - centeryp) / ry;\n var vx2 = (-pxp - centerxp) / rx;\n var vy2 = (-pyp - centeryp) / ry;\n\n var ang1 = vectorAngle(1, 0, vx1, vy1);\n var ang2 = vectorAngle(vx1, vy1, vx2, vy2);\n\n if (sweepFlag === 0 && ang2 > 0) {\n ang2 -= TAU;\n }\n\n if (sweepFlag === 1 && ang2 < 0) {\n ang2 += TAU;\n }\n\n return [centerx, centery, ang1, ang2];\n};\n\nvar arcToBezier = function arcToBezier(_ref2) {\n var px = _ref2.px,\n py = _ref2.py,\n cx = _ref2.cx,\n cy = _ref2.cy,\n rx = _ref2.rx,\n ry = _ref2.ry,\n _ref2$xAxisRotation = _ref2.xAxisRotation,\n xAxisRotation = _ref2$xAxisRotation === undefined ? 0 : _ref2$xAxisRotation,\n _ref2$largeArcFlag = _ref2.largeArcFlag,\n largeArcFlag = _ref2$largeArcFlag === undefined ? 0 : _ref2$largeArcFlag,\n _ref2$sweepFlag = _ref2.sweepFlag,\n sweepFlag = _ref2$sweepFlag === undefined ? 0 : _ref2$sweepFlag;\n\n var curves = [];\n\n if (rx === 0 || ry === 0) {\n return [];\n }\n\n var sinphi = Math.sin(xAxisRotation * TAU / 360);\n var cosphi = Math.cos(xAxisRotation * TAU / 360);\n\n var pxp = cosphi * (px - cx) / 2 + sinphi * (py - cy) / 2;\n var pyp = -sinphi * (px - cx) / 2 + cosphi * (py - cy) / 2;\n\n if (pxp === 0 && pyp === 0) {\n return [];\n }\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var lambda = Math.pow(pxp, 2) / Math.pow(rx, 2) + Math.pow(pyp, 2) / Math.pow(ry, 2);\n\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n\n var _getArcCenter = getArcCenter(px, py, cx, cy, rx, ry, largeArcFlag, sweepFlag, sinphi, cosphi, pxp, pyp),\n _getArcCenter2 = _slicedToArray(_getArcCenter, 4),\n centerx = _getArcCenter2[0],\n centery = _getArcCenter2[1],\n ang1 = _getArcCenter2[2],\n ang2 = _getArcCenter2[3];\n\n // If 'ang2' == 90.0000000001, then `ratio` will evaluate to\n // 1.0000000001. This causes `segments` to be greater than one, which is an\n // unecessary split, and adds extra points to the bezier curve. To alleviate\n // this issue, we round to 1.0 when the ratio is close to 1.0.\n\n\n var ratio = Math.abs(ang2) / (TAU / 4);\n if (Math.abs(1.0 - ratio) < 0.0000001) {\n ratio = 1.0;\n }\n\n var segments = Math.max(Math.ceil(ratio), 1);\n\n ang2 /= segments;\n\n for (var i = 0; i < segments; i++) {\n curves.push(approxUnitArc(ang1, ang2));\n ang1 += ang2;\n }\n\n return curves.map(function (curve) {\n var _mapToEllipse = mapToEllipse(curve[0], rx, ry, cosphi, sinphi, centerx, centery),\n x1 = _mapToEllipse.x,\n y1 = _mapToEllipse.y;\n\n var _mapToEllipse2 = mapToEllipse(curve[1], rx, ry, cosphi, sinphi, centerx, centery),\n x2 = _mapToEllipse2.x,\n y2 = _mapToEllipse2.y;\n\n var _mapToEllipse3 = mapToEllipse(curve[2], rx, ry, cosphi, sinphi, centerx, centery),\n x = _mapToEllipse3.x,\n y = _mapToEllipse3.y;\n\n return { x1: x1, y1: y1, x2: x2, y2: y2, x: x, y: y };\n });\n};\n\nexport default arcToBezier;","/** @ignore *//** */\n\nimport {\n\tIRenderer, IContainer, IDisplayObject, IGraphics, IRendererEvents,\n\tIText, ITextStyle, IRadialText, IPicture, IRendererEvent, ILayer, ICanvasOptions, BlendMode, IPointerEvent, Id\n} from \"./Renderer\";\nimport type { IBounds } from \"../../util/IBounds\";\nimport type { IPoint } from \"../../util/IPoint\";\nimport { Color } from \"../../util/Color\";\nimport { Matrix } from \"../../util/Matrix\";\nimport { Percent, percent } from \"../../util/Percent\";\nimport { Throttler } from \"../../util/Throttler\";\nimport { ArrayDisposer, Disposer, IDisposer, CounterDisposer, MultiDisposer } from \"../../util/Disposer\";\nimport { TextFormatter, ITextChunk } from \"../../util/TextFormatter\";\nimport * as $utils from \"../../util/Utils\";\nimport * as $array from \"../../util/Array\";\nimport * as $object from \"../../util/Object\";\nimport * as $type from \"../../util/Type\";\nimport * as $math from \"../../util/Math\";\nimport arcToBezier from 'svg-arc-to-cubic-bezier';\n\n\n/**\n * @ignore\n */\nfunction checkArgs(name: string, actual: number, expected: number) {\n\tif (actual !== expected) {\n\t\tthrow new Error(\"Required \" + expected + \" arguments for \" + name + \" but got \" + actual);\n\t}\n}\n\n/**\n * @ignore\n */\nfunction checkMinArgs(name: string, actual: number, expected: number) {\n\tif (actual < expected) {\n\t\tthrow new Error(\"Required at least \" + expected + \" arguments for \" + name + \" but got \" + actual);\n\t}\n}\n\n/**\n * @ignore\n */\nfunction checkEvenArgs(name: string, actual: number, expected: number) {\n\tcheckMinArgs(name, actual, expected);\n\n\tif ((actual % expected) !== 0) {\n\t\tthrow new Error(\"Arguments for \" + name + \" must be in pairs of \" + expected);\n\t}\n}\n\n/**\n * @ignore\n */\nfunction assertBinary(value: number): 0 | 1 {\n\tif (value === 0 || value === 1) {\n\t\treturn value;\n\n\t} else {\n\t\tthrow new Error(\"Flag must be 0 or 1\");\n\t}\n}\n\n// 1 -> 0xffffff * (2 / 2)\n// 2 -> 0xffffff * (1 / 2)\n//\n// 3 -> 0xffffff * (3 / 4)\n// 4 -> 0xffffff * (1 / 4)\n//\n// 5 -> 0xffffff * (7 / 8)\n// 6 -> 0xffffff * (5 / 8)\n// 7 -> 0xffffff * (3 / 8)\n// 8 -> 0xffffff * (1 / 8)\n//\n// 9 -> 0xffffff * (15 / 16)\n// 10 -> 0xffffff * (13 / 16)\n// 11 -> 0xffffff * (11 / 16)\n// 12 -> 0xffffff * (9 / 16)\n// 13 -> 0xffffff * (7 / 16)\n// 14 -> 0xffffff * (5 / 16)\n// 15 -> 0xffffff * (3 / 16)\n// 16 -> 0xffffff * (1 / 16)\n// @todo remove this old color distribution algo if the new one pans out\n// function distributeIdBAK(id: number): number {\n// \tif (id === 1) {\n// \t\treturn 0x000001;\n\n// \t} else {\n// \t\t// Finds the closest power of 2\n// \t\tconst base = Math.pow(2, Math.ceil(Math.log(id) / Math.log(2)));\n\n// \t\t// Translates the id into an odd fraction index\n// \t\tconst index = ((base - id) * 2) + 1;\n\n// \t\t// TODO is Math.round correct ?\n// \t\treturn Math.round(0xffffff * (index / base));\n// \t}\n// }\n\n/**\n * Function by smeans:\n * https://lowcode.life/generating-unique-contrasting-colors-in-javascript/\n * @ignore\n */\nfunction distributeId(id: number): number {\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 24; i++) {\n\t\trgb[i % 3] <<= 1;\n\t\trgb[i % 3] |= id & 0x01;\n\t\tid >>= 1;\n\t}\n\treturn (rgb[2] | 0) + (rgb[1] << 8) + (rgb[0] << 16);\n}\n\n/**\n * @ignore\n */\nfunction eachTargets(hitTarget: CanvasDisplayObject, f: (target: CanvasDisplayObject) => boolean): void {\n\tfor (; ;) {\n\t\tif (hitTarget.interactive) {\n\t\t\tif (!f(hitTarget)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (hitTarget._parent) {\n\t\t\thitTarget = hitTarget._parent;\n\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// TODO feature detection for mouse/touch/pointer\n/**\n * @ignore\n */\nfunction onPointerEvent(element: EventTarget, name: string, f: (event: IPointerEvent) => void): IDisposer {\n\treturn $utils.addEventListener(element, $utils.getRendererEvent(name), (event: MouseEvent | TouchEvent) => {\n\t\tif ((event).touches) {\n\t\t\t$array.each((event).touches, (touch) => {\n\t\t\t\tf(touch);\n\t\t\t});\n\n\t\t} else {\n\t\t\tf(event);\n\t\t}\n\t});\n}\n\n/**\n * @ignore\n */\nfunction isTainted(image: HTMLImageElement): boolean {\n\tconst canvas = document.createElement(\"canvas\");\n\tcanvas.width = 1;\n\tcanvas.height = 1;\n\tconst context = canvas.getContext(\"2d\")!;\n\tcontext.drawImage(image, 0, 0, 1, 1);\n\n\ttry {\n\t\tcontext.getImageData(0, 0, 1, 1);\n\t\treturn false;\n\t}\n\tcatch (err) {\n\t\tconsole.warn(\"Image \\\"\" + image.src + \"\\\" is loaded from different host and is not covered by CORS policy. For more information about the implications read here: https://www.amcharts.com/docs/v5/concepts/cors\");\n\t\treturn true;\n\t}\n}\n\n/**\n * @ignore\n */\nexport class CanvasPivot implements IPoint {\n\tprotected _x: number = 0;\n\tprotected _y: number = 0;\n\n\tget x(): number {\n\t\treturn this._x;\n\t}\n\n\tget y(): number {\n\t\treturn this._y;\n\t}\n\n\tset x(value: number) {\n\t\tthis._x = value;\n\t}\n\n\tset y(value: number) {\n\t\tthis._y = value;\n\t}\n}\n\n/**\n * @ignore\n */\nexport class CanvasDisplayObject extends Disposer implements IDisplayObject, IDisposer {\n\tpublic _layer?: CanvasLayer;\n\n\tpublic mask: CanvasGraphics | null = null;\n\tpublic visible: boolean = true;\n\tpublic exportable?: boolean = true;\n\tpublic interactive: boolean = false;\n\tpublic inactive: boolean = false;\n\tpublic wheelable: boolean = false;\n\tpublic isMeasured: boolean = false;\n\tpublic buttonMode: boolean = false;\n\tpublic alpha: number = 1;\n\tpublic compoundAlpha: number = 1;\n\tpublic angle: number = 0;\n\tpublic scale: number = 1;\n\tpublic x: number = 0;\n\tpublic y: number = 0;\n\tpublic pivot: CanvasPivot = new CanvasPivot();\n\n\tpublic filter?: string;\n\n\tpublic cursorOverStyle?: string;\n\tpublic _replacedCursorStyle?: string;\n\n\tpublic _localMatrix: Matrix = new Matrix();\n\tpublic _matrix: Matrix = new Matrix();\n\t// TODO can this be replaced with _localMatrix ?\n\tprotected _uMatrix: Matrix = new Matrix();\n\n\tprotected _renderer: CanvasRenderer;\n\tpublic _parent: CanvasContainer | undefined;\n\n\tprotected _localBounds: IBounds | undefined;\n\tprotected _bounds: IBounds | undefined;\n\tpublic _colorId: string | undefined;\n\n\tconstructor(renderer: CanvasRenderer) {\n\t\tsuper(() => {\n\t\t\tthis._renderer._removeObject(this);\n\t\t});\n\n\t\tthis._renderer = renderer;\n\t}\n\n\tpublic getCanvas(): HTMLCanvasElement {\n\t\treturn this.getLayer().view;\n\t}\n\n\tpublic getLayer(): CanvasLayer {\n\t\tlet self: CanvasDisplayObject = this;\n\n\t\tfor (; ;) {\n\t\t\tif (self._layer) {\n\t\t\t\treturn self._layer;\n\n\t\t\t} else if (self._parent) {\n\t\t\t\tself = self._parent;\n\n\t\t\t} else {\n\t\t\t\treturn this._renderer.defaultLayer;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setLayer(order: number | undefined, visible: boolean = true): void {\n\t\tif (order == null) {\n\t\t\tthis._layer = undefined;\n\n\t\t} else {\n\t\t\tthis._layer = this._renderer.getLayer(order, visible);\n\t\t\tthis._layer.visible = visible;\n\t\t\tif (this._parent) {\n\t\t\t\tthis._parent.registerChildLayer(this._layer);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic markDirtyLayer(): void {\n\t\tthis.getLayer().dirty = true;\n\t}\n\n\tpublic clear(): void {\n\t\tthis.invalidateBounds();\n\t}\n\n\tpublic invalidateBounds(): void {\n\t\tthis._localBounds = undefined;\n\t}\n\n\tpublic _addBounds(_bounds: IBounds): void { }\n\n\tprotected _getColorId(): string {\n\t\tif (this._colorId === undefined) {\n\t\t\tthis._colorId = this._renderer.paintId(this);\n\t\t}\n\n\t\treturn this._colorId;\n\t}\n\n\tprotected _isInteractive(): boolean {\n\t\treturn this.inactive == false && (this.interactive || this._renderer._forceInteractive > 0);\n\t}\n\n\tprotected _isInteractiveMask(): boolean {\n\t\treturn this._isInteractive();\n\t}\n\n\tpublic contains(child: CanvasDisplayObject): boolean {\n\t\tfor (; ;) {\n\t\t\tif (child === this) {\n\t\t\t\treturn true;\n\n\t\t\t} else if (child._parent) {\n\t\t\t\tchild = child._parent;\n\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\ttoGlobal(point: IPoint): IPoint {\n\t\treturn this._matrix.apply(point);\n\t}\n\n\ttoLocal(point: IPoint): IPoint {\n\t\treturn this._matrix.applyInverse(point);\n\t}\n\n\tpublic getLocalMatrix(): Matrix {\n\t\tthis._uMatrix.setTransform(0, 0, this.pivot.x, this.pivot.y, this.angle * Math.PI / 180, this.scale);\n\t\treturn this._uMatrix;\n\t}\n\n\tgetLocalBounds(): IBounds {\n\t\tif (!this._localBounds) {\n\n\t\t\tconst bn = 10000000;\n\t\t\tthis._localBounds = {\n\t\t\t\tleft: bn,\n\t\t\t\ttop: bn,\n\t\t\t\tright: -bn,\n\t\t\t\tbottom: -bn\n\t\t\t};\n\n\t\t\tthis._addBounds(this._localBounds);\n\t\t}\n\t\treturn this._localBounds;\n\t}\n\n\tgetAdjustedBounds(bounds: IBounds): IBounds {\n\t\tthis._setMatrix();\n\n\t\tconst matrix = this.getLocalMatrix();\n\n\t\tconst p0 = matrix.apply({ x: bounds.left, y: bounds.top });\n\t\tconst p1 = matrix.apply({ x: bounds.right, y: bounds.top });\n\t\tconst p2 = matrix.apply({ x: bounds.right, y: bounds.bottom });\n\t\tconst p3 = matrix.apply({ x: bounds.left, y: bounds.bottom });\n\n\t\treturn {\n\t\t\tleft: Math.min(p0.x, p1.x, p2.x, p3.x),\n\t\t\ttop: Math.min(p0.y, p1.y, p2.y, p3.y),\n\t\t\tright: Math.max(p0.x, p1.x, p2.x, p3.x),\n\t\t\tbottom: Math.max(p0.y, p1.y, p2.y, p3.y)\n\t\t}\n\t}\n\n\ton(key: Key, callback: (this: C, event: IRendererEvents[Key]) => void, context?: C): IDisposer {\n\t\tif (this.interactive) {\n\t\t\treturn this._renderer._addEvent(this, key, callback, context);\n\n\t\t} else {\n\t\t\treturn new Disposer(() => { });\n\t\t}\n\t}\n\n\tpublic _setMatrix(): void {\n\t\t// TODO only calculate this if it has actually changed\n\t\tthis._localMatrix.setTransform(\n\t\t\tthis.x,\n\t\t\tthis.y,\n\t\t\tthis.pivot.x,\n\t\t\tthis.pivot.y,\n\t\t\t// Converts degrees to radians\n\t\t\tthis.angle * Math.PI / 180,\n\t\t\tthis.scale\n\t\t);\n\n\t\tthis._matrix.copyFrom(this._localMatrix);\n\n\t\tif (this._parent) {\n\t\t\t// TODO only calculate this if it has actually changed\n\t\t\tthis._matrix.prepend(this._parent._matrix);\n\t\t}\n\t}\n\n\tpublic _transform(context: CanvasRenderingContext2D, resolution: number): void {\n\t\tconst m = this._matrix;\n\t\tcontext.setTransform(\n\t\t\tm.a * resolution,\n\t\t\tm.b * resolution,\n\t\t\tm.c * resolution,\n\t\t\tm.d * resolution,\n\t\t\tm.tx * resolution,\n\t\t\tm.ty * resolution\n\t\t);\n\t}\n\n\tpublic render(parentLayer: CanvasLayer): void {\n\t\tif (this.visible && (this.exportable !== false || !this._renderer._omitTainted)) {\n\t\t\tthis._setMatrix();\n\n\t\t\tconst resolution = this._renderer.resolution;\n\n\t\t\tconst layers = this._renderer.layers;\n\t\t\tconst ghostContext = this._renderer._ghostContext;\n\n\t\t\tconst mask = this.mask;\n\t\t\tif (mask) {\n\t\t\t\tmask._setMatrix();\n\t\t\t}\n\n\t\t\t// TODO improve this\n\t\t\t$array.each(layers, (layer) => {\n\t\t\t\tif (layer) {\n\t\t\t\t\tconst context = layer.context;\n\t\t\t\t\tcontext.save();\n\n\t\t\t\t\t// We must apply the mask before we transform the element\n\t\t\t\t\tif (mask) {\n\t\t\t\t\t\tmask._transform(context, layer.scale || resolution);\n\t\t\t\t\t\tmask._runPath(context);\n\t\t\t\t\t\tcontext.clip();\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.globalAlpha = this.compoundAlpha * this.alpha;\n\n\t\t\t\t\tthis._transform(context, layer.scale || resolution);\n\n\t\t\t\t\tif (this.filter) {\n\t\t\t\t\t\tcontext.filter = this.filter;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tghostContext.save();\n\n\t\t\t// We must apply the mask before we transform the element\n\t\t\tif (mask && this._isInteractiveMask()) {\n\t\t\t\tmask._transform(ghostContext, resolution);\n\t\t\t\tmask._runPath(ghostContext);\n\t\t\t\tghostContext.clip();\n\t\t\t}\n\n\t\t\tthis._transform(ghostContext, resolution);\n\n\t\t\tthis._render(parentLayer);\n\n\t\t\tghostContext.restore();\n\n\t\t\t$array.each(layers, (layer) => {\n\t\t\t\tif (layer) {\n\t\t\t\t\tlayer.context.restore();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _render(parentLayer: CanvasLayer): void {\n\t\tif (this.exportable === false) {\n\t\t\tconst layer = this._layer || parentLayer;\n\t\t\tlayer.tainted = true;\n\t\t}\n\t}\n\n\thovering(): boolean {\n\t\treturn this._renderer._hovering.has(this);\n\t}\n\n\tdragging(): boolean {\n\t\treturn this._renderer._dragging.some((x) => x.value === this);\n\t}\n\n\tpublic dispose() {\n\t\tthis.getLayer().dirty = true;\n\t}\n\n}\n\n/**\n * @ignore\n */\nexport class CanvasContainer extends CanvasDisplayObject implements IContainer {\n\tpublic interactiveChildren: boolean = true;\n\tprivate _childLayers?: CanvasLayer[];\n\n\tprotected _children: Array = [];\n\n\tprotected _isInteractiveMask(): boolean {\n\t\treturn this.interactiveChildren || super._isInteractiveMask();\n\t}\n\n\taddChild(child: CanvasDisplayObject): void {\n\t\tchild._parent = this;\n\t\tthis._children.push(child);\n\t\tif (child._layer) {\n\t\t\tthis.registerChildLayer(child._layer);\n\t\t}\n\t}\n\n\taddChildAt(child: CanvasDisplayObject, index: number): void {\n\t\tchild._parent = this;\n\t\tthis._children.splice(index, 0, child);\n\t\tif (child._layer) {\n\t\t\tthis.registerChildLayer(child._layer);\n\t\t}\n\t}\n\n\tremoveChild(child: CanvasDisplayObject): void {\n\t\tchild._parent = undefined;\n\t\t$array.removeFirst(this._children, child);\n\t}\n\n\tprotected _render(parentLayer: CanvasLayer): void {\n\t\tsuper._render(parentLayer);\n\n\t\tconst renderer = this._renderer;\n\n\t\tif (this.interactive && this.interactiveChildren) {\n\t\t\t++renderer._forceInteractive;\n\t\t}\n\n\t\tconst layer = this._layer || parentLayer;\n\n\t\t$array.each(this._children, (child) => {\n\t\t\tchild.compoundAlpha = this.compoundAlpha * this.alpha;\n\t\t\tchild.render(layer);\n\t\t});\n\n\t\tif (this.interactive && this.interactiveChildren) {\n\t\t\t--renderer._forceInteractive;\n\t\t}\n\t}\n\n\tregisterChildLayer(layer: CanvasLayer): void {\n\t\tif (!this._childLayers) {\n\t\t\tthis._childLayers = [];\n\t\t}\n\t\t$array.pushOne(this._childLayers, layer);\n\t\tif (this._parent) {\n\t\t\tthis._parent.registerChildLayer(layer);\n\t\t}\n\t}\n\n\tpublic markDirtyLayer(deep: boolean = false): void {\n\t\tsuper.markDirtyLayer();\n\t\tif (deep && this._childLayers) {\n\t\t\t$array.each(this._childLayers, (layer) => layer.dirty = true);\n\t\t}\n\t}\n\n\tpublic dispose() {\n\t\tsuper.dispose();\n\t\tif (this._childLayers) {\n\t\t\t$array.each(this._childLayers, (layer) => {\n\t\t\t\tlayer.dirty = true;\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nfunction setPoint(bounds: IBounds, point: IPoint): void {\n\tbounds.left = Math.min(bounds.left, point.x);\n\tbounds.top = Math.min(bounds.top, point.y);\n\tbounds.right = Math.max(bounds.right, point.x);\n\tbounds.bottom = Math.max(bounds.bottom, point.y);\n}\n\n/**\n * @ignore\n */\nabstract class Op {\n\tpublic colorize(_context: CanvasRenderingContext2D, _forceColor: string | undefined): void { }\n\n\tpublic path(_context: CanvasRenderingContext2D): void { }\n\n\tpublic addBounds(_bounds: IBounds): void { }\n}\n\n/**\n * @ignore\n */\nclass BeginFill extends Op {\n\tconstructor(public color: string | CanvasGradient | CanvasPattern) { super(); }\n\n\tpublic colorize(context: CanvasRenderingContext2D, forceColor: string | undefined): void {\n\t\tif (forceColor !== undefined) {\n\t\t\tcontext.fillStyle = forceColor;\n\n\t\t} else {\n\t\t\tcontext.fillStyle = this.color;\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nclass EndFill extends Op {\n\tconstructor(public clearShadow: boolean) { super(); }\n\tpublic colorize(context: CanvasRenderingContext2D, _forceColor: string | undefined): void {\n\t\tcontext.fill();\n\t\tif (this.clearShadow) {\n\t\t\tcontext.shadowColor = \"\";\n\t\t\tcontext.shadowBlur = 0;\n\t\t\tcontext.shadowOffsetX = 0;\n\t\t\tcontext.shadowOffsetY = 0;\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nclass EndStroke extends Op {\n\tpublic colorize(context: CanvasRenderingContext2D, _forceColor: string | undefined): void {\n\t\tcontext.stroke();\n\t}\n}\n\n/**\n * @ignore\n */\nclass LineStyle extends Op {\n\tconstructor(public width: number, public color: string | CanvasGradient | CanvasPattern) { super(); }\n\n\tpublic colorize(context: CanvasRenderingContext2D, forceColor: string | undefined): void {\n\t\tif (forceColor !== undefined) {\n\t\t\tcontext.strokeStyle = forceColor;\n\n\t\t} else {\n\t\t\tcontext.strokeStyle = this.color;\n\t\t}\n\n\t\tcontext.lineWidth = this.width;\n\t}\n}\n\n/**\n * @ignore\n */\nclass LineDash extends Op {\n\tconstructor(public dash: number[]) { super(); }\n\n\tpublic colorize(context: CanvasRenderingContext2D, _forceColor: string | undefined): void {\n\t\tcontext.setLineDash(this.dash);\n\t}\n}\n\n/**\n * @ignore\n */\nclass LineDashOffset extends Op {\n\tconstructor(public dashOffset: number) { super(); }\n\n\tpublic colorize(context: CanvasRenderingContext2D, _forceColor: string | undefined): void {\n\t\tcontext.lineDashOffset = this.dashOffset;\n\t}\n}\n\n/**\n * @ignore\n */\nclass DrawRect extends Op {\n\tconstructor(public x: number, public y: number, public width: number, public height: number) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.rect(this.x, this.y, this.width, this.height);\n\t}\n\n\tpublic addBounds(bounds: IBounds): void {\n\t\tconst l = this.x;\n\t\tconst t = this.y;\n\t\tconst r = l + this.width;\n\t\tconst b = t + this.height;\n\n\t\tsetPoint(bounds, { x: l, y: t });\n\t\tsetPoint(bounds, { x: r, y: t });\n\t\tsetPoint(bounds, { x: l, y: b });\n\t\tsetPoint(bounds, { x: r, y: b });\n\t}\n}\n\n/**\n * @ignore\n */\nclass DrawCircle extends Op {\n\tconstructor(public x: number, public y: number, public radius: number) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.moveTo(this.x + this.radius, this.y);\n\t\tcontext.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);\n\t}\n\n\t// TODO handle skewing and rotation\n\tpublic addBounds(bounds: IBounds): void {\n\t\tsetPoint(bounds, { x: this.x - this.radius, y: this.y - this.radius });\n\t\tsetPoint(bounds, { x: this.x + this.radius, y: this.y + this.radius });\n\t}\n}\n\n/**\n * @ignore\n */\nclass DrawEllipse extends Op {\n\tconstructor(public x: number, public y: number, public radiusX: number, public radiusY:number) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.ellipse(0, 0, this.radiusX, this.radiusY, 0, 0, Math.PI * 2);\n\t}\n\n\t// TODO handle skewing and rotation\n\tpublic addBounds(bounds: IBounds): void {\n\t\tsetPoint(bounds, { x: this.x - this.radiusX, y: this.y - this.radiusY });\n\t\tsetPoint(bounds, { x: this.x + this.radiusX, y: this.y + this.radiusY });\n\t}\n}\n\n/**\n * @ignore\n */\nclass Arc extends Op {\n\tconstructor(\n\t\tpublic cx: number,\n\t\tpublic cy: number,\n\t\tpublic radius: number,\n\t\tpublic startAngle: number,\n\t\tpublic endAngle: number,\n\t\tpublic anticlockwise: boolean,\n\t) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tif (this.radius > 0) {\n\t\t\tcontext.arc(this.cx, this.cy, this.radius, this.startAngle, this.endAngle, this.anticlockwise);\n\t\t}\n\t}\n\n\tpublic addBounds(bounds: IBounds): void {\n\t\tlet arcBounds = $math.getArcBounds(this.cx, this.cy, this.startAngle * $math.DEGREES, this.endAngle * $math.DEGREES, this.radius);\n\t\tsetPoint(bounds, { x: arcBounds.left, y: arcBounds.top });\n\t\tsetPoint(bounds, { x: arcBounds.right, y: arcBounds.bottom });\n\t}\n}\n\n/**\n * @ignore\n */\nclass ArcTo extends Op {\n\tconstructor(\n\t\tpublic x1: number,\n\t\tpublic y1: number,\n\t\tpublic x2: number,\n\t\tpublic y2: number,\n\t\tpublic radius: number,\n\t) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tif (this.radius > 0) {\n\t\t\tcontext.arcTo(this.x1, this.y1, this.x2, this.y2, this.radius);\n\t\t}\n\t}\n\n\t// TODO: add points\n\tpublic addBounds(_bounds: IBounds): void {\n\t\t/*\n\t\t// not finished\n\t\thttps://math.stackexchange.com/questions/1781438/finding-the-center-of-a-circle-given-two-points-and-a-radius-algebraically\n\n\t\tif (prevPoint) {\n\t\t\tlet x1 = prevPoint.x;\n\t\t\tlet y1 = prevPoint.y;\n\t\t\tlet x2 = this.x2;\n\t\t\tlet y2 = this.y2;\n\t\t\tlet r = this.radius;\n\n\t\t\tlet xa = (x2 - x1) / 2;\n\t\t\tlet ya = (y2 - y1) / 2;\n\n\t\t\tlet x0 = x1 + xa;\n\t\t\tlet y0 = y1 + ya;\n\n\t\t\tlet a = Math.hypot(xa, ya);\n\t\t\tlet b = Math.sqrt(r * r - a * a);\n\n\t\t\tlet cx = x0 + b * ya / a;\n\t\t\tlet cy = y0 - b * xa / a;\n\n\t\t\tconsole.log(cx, cy);\n\t\t}*/\n\t}\n}\n\n/**\n * @ignore\n */\nclass LineTo extends Op {\n\tconstructor(public x: number, public y: number) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.lineTo(this.x, this.y);\n\t}\n\n\tpublic addBounds(bounds: IBounds): void {\n\t\tsetPoint(bounds, { x: this.x, y: this.y });\n\t}\n}\n\n/**\n * @ignore\n */\nclass MoveTo extends Op {\n\tconstructor(public x: number, public y: number) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.moveTo(this.x, this.y);\n\t}\n\n\tpublic addBounds(bounds: IBounds): void {\n\t\tsetPoint(bounds, { x: this.x, y: this.y });\n\t}\n}\n\n/**\n * @ignore\n */\nclass ClosePath extends Op {\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.closePath();\n\t}\n}\n\n/**\n * @ignore\n */\nclass BezierCurveTo extends Op {\n\tconstructor(\n\t\tpublic cpX: number,\n\t\tpublic cpY: number,\n\t\tpublic cpX2: number,\n\t\tpublic cpY2: number,\n\t\tpublic toX: number,\n\t\tpublic toY: number,\n\t) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.bezierCurveTo(this.cpX, this.cpY, this.cpX2, this.cpY2, this.toX, this.toY);\n\t}\n\n\t// TODO: OK?\n\tpublic addBounds(bounds: IBounds): void {\n\t\tsetPoint(bounds, { x: this.cpX, y: this.cpY });\n\t\tsetPoint(bounds, { x: this.cpX2, y: this.cpY2 });\n\t\tsetPoint(bounds, { x: this.toX, y: this.toY });\n\t}\n}\n\n/**\n * @ignore\n */\nclass QuadraticCurveTo extends Op {\n\tconstructor(\n\t\tpublic cpX: number,\n\t\tpublic cpY: number,\n\t\tpublic toX: number,\n\t\tpublic toY: number,\n\t) { super(); }\n\n\tpublic path(context: CanvasRenderingContext2D): void {\n\t\tcontext.quadraticCurveTo(this.cpX, this.cpY, this.toX, this.toY);\n\t}\n\n\t// TODO: OK?\n\tpublic addBounds(bounds: IBounds): void {\n\t\tsetPoint(bounds, { x: this.cpX, y: this.cpY });\n\t\tsetPoint(bounds, { x: this.toX, y: this.toY });\n\t}\n}\n\n/**\n * @ignore\n */\nclass Shadow extends Op {\n\tconstructor(\n\t\tpublic color: string,\n\t\tpublic blur?: number,\n\t\tpublic offsetX?: number,\n\t\tpublic offsetY?: number,\n\t\tpublic opacity?: number\n\t) { super(); }\n\n\tpublic colorize(context: CanvasRenderingContext2D, _forceColor: string | undefined): void {\n\t\tif (this.opacity) {\n\t\t\tcontext.fillStyle = this.color;\n\t\t}\n\t\tcontext.shadowColor = this.color;\n\t\tif (this.blur) {\n\t\t\tcontext.shadowBlur = this.blur;\n\t\t}\n\t\tif (this.offsetX) {\n\t\t\tcontext.shadowOffsetX = this.offsetX;\n\t\t}\n\t\tif (this.offsetY) {\n\t\t\tcontext.shadowOffsetY = this.offsetY;\n\t\t}\n\t}\n}\n\n\n/**\n * @ignore\n */\nexport class CanvasGraphics extends CanvasDisplayObject implements IGraphics {\n\tprotected _operations: Array = [];\n\n\tpublic blendMode: BlendMode = BlendMode.NORMAL;\n\n\tprotected _hasShadows: boolean = false;\n\tprotected _fillAlpha?: number;\n\tprotected _strokeAlpha?: number;\n\n\tclear(): void {\n\t\tsuper.clear();\n\t\tthis._operations.length = 0;\n\t}\n\n\tprotected _pushOp(op: Op): void {\n\t\tthis._operations.push(op);\n\t}\n\n\tbeginFill(color?: Color | CanvasGradient | CanvasPattern, alpha: number = 1): void {\n\t\tthis._fillAlpha = alpha;\n\t\tif (color) {\n\t\t\tif (color instanceof Color) {\n\t\t\t\tthis._pushOp(new BeginFill(color.toCSS(alpha)));\n\n\t\t\t} else {\n\t\t\t\tthis.isMeasured = true;\n\t\t\t\tthis._pushOp(new BeginFill(color));\n\t\t\t}\n\t\t} else {\n\t\t\tthis._pushOp(new BeginFill(\"rgba(0, 0, 0, \" + alpha + \")\"));\n\t\t}\n\t}\n\n\tendFill(): void {\n\t\tthis._pushOp(new EndFill(this._hasShadows));\n\t}\n\n\tendStroke(): void {\n\t\tthis._pushOp(new EndStroke());\n\t}\n\n\tlineStyle(width: number = 0, color?: Color | CanvasGradient | CanvasPattern, alpha: number = 1): void {\n\t\tthis._strokeAlpha = alpha;\n\t\tif (color) {\n\t\t\tif (color instanceof Color) {\n\t\t\t\tthis._pushOp(new LineStyle(width, color.toCSS(alpha)));\n\t\t\t} else {\n\t\t\t\tthis._pushOp(new LineStyle(width, color));\n\t\t\t}\n\t\t} else {\n\t\t\tthis._pushOp(new LineStyle(width, \"rgba(0, 0, 0, \" + alpha + \")\"));\n\t\t}\n\t}\n\n\tsetLineDash(dash?: number[]): void {\n\t\tthis._pushOp(new LineDash(dash ? dash : []));\n\t}\n\n\tsetLineDashOffset(dashOffset?: number): void {\n\t\tthis._pushOp(new LineDashOffset(dashOffset || 0));\n\t}\n\n\tdrawRect(x: number, y: number, width: number, height: number): void {\n\t\tthis._pushOp(new DrawRect(x, y, width, height));\n\t}\n\n\tdrawCircle(x: number, y: number, radius: number): void {\n\t\tthis._pushOp(new DrawCircle(x, y, radius));\n\t}\n\n\tdrawEllipse(x: number, y: number, radiusX: number, radiusY:number): void {\n\t\tthis._pushOp(new DrawEllipse(x, y, radiusX, radiusY));\n\t}\t\n\n\tarc(cx: number, cy: number, radius: number, startAngle: number, endAngle: number, anticlockwise: boolean = false): void {\n\t\tthis._pushOp(new Arc(cx, cy, radius, startAngle, endAngle, anticlockwise));\n\t}\n\n\tarcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void {\n\t\tthis._pushOp(new ArcTo(x1, y1, x2, y2, radius));\n\t}\n\n\tlineTo(x: number, y: number): void {\n\t\tthis._pushOp(new LineTo(x, y));\n\t}\n\n\tmoveTo(x: number, y: number): void {\n\t\tthis._pushOp(new MoveTo(x, y));\n\t}\n\n\tbezierCurveTo(cpX: number, cpY: number, cpX2: number, cpY2: number, toX: number, toY: number): void {\n\t\tthis._pushOp(new BezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY));\n\t}\n\n\tquadraticCurveTo(cpX: number, cpY: number, toX: number, toY: number): void {\n\t\tthis._pushOp(new QuadraticCurveTo(cpX, cpY, toX, toY));\n\t}\n\n\tclosePath(): void {\n\t\tthis._pushOp(new ClosePath());\n\t}\n\n\tshadow(color: Color, blur?: number, offsetX?: number, offsetY?: number, opacity?: number): void {\n\t\tthis._hasShadows = true;\n\t\tthis._pushOp(new Shadow(opacity ? color.toCSS(opacity) : color.toCSS(this._fillAlpha || this._strokeAlpha), blur, offsetX, offsetY));\n\t}\n\n\t// https://svgwg.org/svg2-draft/paths.html#DProperty\n\t// TODO better error checking\n\tsvgPath(path: string): void {\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tlet cpx: number | null = null;\n\t\tlet cpy: number | null = null;\n\t\tlet qcpx: number | null = null;\n\t\tlet qcpy: number | null = null;\n\n\t\tconst SEGMENTS_REGEXP = /([MmZzLlHhVvCcSsQqTtAa])([^MmZzLlHhVvCcSsQqTtAa]*)/g;\n\t\tconst ARGS_REGEXP = /[\\u0009\\u0020\\u000A\\u000C\\u000D]*([\\+\\-]?[0-9]*\\.?[0-9]+(?:[eE][\\+\\-]?[0-9]+)?)[\\u0009\\u0020\\u000A\\u000C\\u000D]*,?/g;\n\n\t\tlet match;\n\n\t\twhile ((match = SEGMENTS_REGEXP.exec(path)) !== null) {\n\t\t\tconst name = match[1];\n\t\t\tconst rest = match[2];\n\n\t\t\tconst args = [];\n\n\t\t\twhile ((match = ARGS_REGEXP.exec(rest)) !== null) {\n\t\t\t\targs.push(+match[1]);\n\t\t\t}\n\n\t\t\t// Reset control point\n\t\t\tif (name !== \"S\" && name !== \"s\" && name !== \"C\" && name !== \"c\") {\n\t\t\t\tcpx = null;\n\t\t\t\tcpy = null;\n\t\t\t}\n\n\t\t\t// Reset control point\n\t\t\tif (name !== \"Q\" && name !== \"q\" && name !== \"T\" && name !== \"t\") {\n\t\t\t\tqcpx = null;\n\t\t\t\tqcpy = null;\n\t\t\t}\n\n\t\t\tswitch (name) {\n\t\t\t\tcase \"M\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 2);\n\t\t\t\t\tx = args[0];\n\t\t\t\t\ty = args[1];\n\t\t\t\t\tthis.moveTo(x, y);\n\n\t\t\t\t\tfor (let i = 2; i < args.length; i += 2) {\n\t\t\t\t\t\tx = args[i];\n\t\t\t\t\t\ty = args[i + 1];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"m\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 2);\n\t\t\t\t\tx += args[0];\n\t\t\t\t\ty += args[1];\n\t\t\t\t\tthis.moveTo(x, y);\n\n\t\t\t\t\tfor (let i = 2; i < args.length; i += 2) {\n\t\t\t\t\t\tx += args[i];\n\t\t\t\t\t\ty += args[i + 1];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"L\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 2);\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 2) {\n\t\t\t\t\t\tx = args[i];\n\t\t\t\t\t\ty = args[i + 1];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"l\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 2);\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 2) {\n\t\t\t\t\t\tx += args[i];\n\t\t\t\t\t\ty += args[i + 1];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"H\":\n\t\t\t\t\tcheckMinArgs(name, args.length, 1);\n\t\t\t\t\tfor (let i = 0; i < args.length; ++i) {\n\t\t\t\t\t\tx = args[i];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"h\":\n\t\t\t\t\tcheckMinArgs(name, args.length, 1);\n\t\t\t\t\tfor (let i = 0; i < args.length; ++i) {\n\t\t\t\t\t\tx += args[i];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"V\":\n\t\t\t\t\tcheckMinArgs(name, args.length, 1);\n\t\t\t\t\tfor (let i = 0; i < args.length; ++i) {\n\t\t\t\t\t\ty = args[i];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"v\":\n\t\t\t\t\tcheckMinArgs(name, args.length, 1);\n\t\t\t\t\tfor (let i = 0; i < args.length; ++i) {\n\t\t\t\t\t\ty += args[i];\n\t\t\t\t\t\tthis.lineTo(x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"C\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 6);\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 6) {\n\t\t\t\t\t\tconst x1 = args[i];\n\t\t\t\t\t\tconst y1 = args[i + 1];\n\t\t\t\t\t\tcpx = args[i + 2];\n\t\t\t\t\t\tcpy = args[i + 3];\n\t\t\t\t\t\tx = args[i + 4];\n\t\t\t\t\t\ty = args[i + 5];\n\t\t\t\t\t\tthis.bezierCurveTo(x1, y1, cpx, cpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"c\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 6);\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 6) {\n\t\t\t\t\t\tconst x1 = args[i] + x;\n\t\t\t\t\t\tconst y1 = args[i + 1] + y;\n\t\t\t\t\t\tcpx = args[i + 2] + x;\n\t\t\t\t\t\tcpy = args[i + 3] + y;\n\t\t\t\t\t\tx += args[i + 4];\n\t\t\t\t\t\ty += args[i + 5];\n\t\t\t\t\t\tthis.bezierCurveTo(x1, y1, cpx, cpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"S\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 4);\n\t\t\t\t\tif (cpx === null || cpy === null) {\n\t\t\t\t\t\tcpx = x;\n\t\t\t\t\t\tcpy = y;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 4) {\n\t\t\t\t\t\tconst x1 = 2 * x - cpx;\n\t\t\t\t\t\tconst y1 = 2 * y - cpy;\n\t\t\t\t\t\tcpx = args[i];\n\t\t\t\t\t\tcpy = args[i + 1];\n\t\t\t\t\t\tx = args[i + 2];\n\t\t\t\t\t\ty = args[i + 3];\n\t\t\t\t\t\tthis.bezierCurveTo(x1, y1, cpx, cpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"s\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 4);\n\t\t\t\t\tif (cpx === null || cpy === null) {\n\t\t\t\t\t\tcpx = x;\n\t\t\t\t\t\tcpy = y;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 4) {\n\t\t\t\t\t\tconst x1 = 2 * x - cpx;\n\t\t\t\t\t\tconst y1 = 2 * y - cpy;\n\t\t\t\t\t\tcpx = args[i] + x;\n\t\t\t\t\t\tcpy = args[i + 1] + y;\n\t\t\t\t\t\tx += args[i + 2];\n\t\t\t\t\t\ty += args[i + 3];\n\t\t\t\t\t\tthis.bezierCurveTo(x1, y1, cpx, cpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"Q\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 4);\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 4) {\n\t\t\t\t\t\tqcpx = args[i];\n\t\t\t\t\t\tqcpy = args[i + 1];\n\t\t\t\t\t\tx = args[i + 2];\n\t\t\t\t\t\ty = args[i + 3];\n\t\t\t\t\t\tthis.quadraticCurveTo(qcpx, qcpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"q\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 4);\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 4) {\n\t\t\t\t\t\tqcpx = args[i] + x;\n\t\t\t\t\t\tqcpy = args[i + 1] + y;\n\t\t\t\t\t\tx += args[i + 2];\n\t\t\t\t\t\ty += args[i + 3];\n\t\t\t\t\t\tthis.quadraticCurveTo(qcpx, qcpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"T\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 2);\n\t\t\t\t\tif (qcpx === null || qcpy === null) {\n\t\t\t\t\t\tqcpx = x;\n\t\t\t\t\t\tqcpy = y;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 2) {\n\t\t\t\t\t\tqcpx = 2 * x - qcpx;\n\t\t\t\t\t\tqcpy = 2 * y - qcpy;\n\t\t\t\t\t\tx = args[i];\n\t\t\t\t\t\ty = args[i + 1];\n\t\t\t\t\t\tthis.quadraticCurveTo(qcpx, qcpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"t\":\n\t\t\t\t\tcheckEvenArgs(name, args.length, 2);\n\t\t\t\t\tif (qcpx === null || qcpy === null) {\n\t\t\t\t\t\tqcpx = x;\n\t\t\t\t\t\tqcpy = y;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 2) {\n\t\t\t\t\t\tqcpx = 2 * x - qcpx;\n\t\t\t\t\t\tqcpy = 2 * y - qcpy;\n\t\t\t\t\t\tx += args[i];\n\t\t\t\t\t\ty += args[i + 1];\n\t\t\t\t\t\tthis.quadraticCurveTo(qcpx, qcpy, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"A\":\n\t\t\t\tcase \"a\":\n\t\t\t\t\tconst relative = (name === \"a\");\n\n\t\t\t\t\tcheckEvenArgs(name, args.length, 7);\n\n\t\t\t\t\tfor (let i = 0; i < args.length; i += 7) {\n\t\t\t\t\t\tlet cx = args[i + 5];\n\t\t\t\t\t\tlet cy = args[i + 6];\n\n\t\t\t\t\t\tif (relative) {\n\t\t\t\t\t\t\tcx += x;\n\t\t\t\t\t\t\tcy += y;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst bs = arcToBezier({\n\t\t\t\t\t\t\tpx: x,\n\t\t\t\t\t\t\tpy: y,\n\t\t\t\t\t\t\trx: args[i],\n\t\t\t\t\t\t\try: args[i + 1],\n\t\t\t\t\t\t\txAxisRotation: args[i + 2],\n\t\t\t\t\t\t\tlargeArcFlag: assertBinary(args[i + 3]),\n\t\t\t\t\t\t\tsweepFlag: assertBinary(args[i + 4]),\n\t\t\t\t\t\t\tcx,\n\t\t\t\t\t\t\tcy,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$array.each(bs, (b) => {\n\t\t\t\t\t\t\tthis.bezierCurveTo(b.x1, b.y1, b.x2, b.y2, b.x, b.y);\n\t\t\t\t\t\t\tx = b.x;\n\t\t\t\t\t\t\ty = b.y;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Z\":\n\t\t\t\tcase \"z\":\n\t\t\t\t\tcheckArgs(name, args.length, 0);\n\t\t\t\t\tthis.closePath();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tpublic _runPath(context: CanvasRenderingContext2D): void {\n\t\tcontext.beginPath();\n\n\t\t$array.each(this._operations, (op) => {\n\t\t\top.path(context);\n\t\t});\n\t}\n\n\tprotected _render(parentLayer: CanvasLayer): void {\n\t\tsuper._render(parentLayer);\n\n\t\tconst layer = this._layer || parentLayer;\n\n\t\tconst layerDirty = layer.dirty;\n\t\tconst interactive = this._isInteractive();\n\n\t\tif (layerDirty || interactive) {\n\n\t\t\tconst context = layer.context;\n\t\t\tconst ghostContext = this._renderer._ghostContext;\n\n\t\t\tif (layerDirty) {\n\t\t\t\tcontext.globalCompositeOperation = this.blendMode;\n\n\t\t\t\tcontext.beginPath();\n\t\t\t}\n\n\t\t\tlet color: string | undefined;\n\n\t\t\tif (interactive) {\n\t\t\t\tghostContext.beginPath();\n\t\t\t\tcolor = this._getColorId();\n\t\t\t}\n\n\t\t\t$array.each(this._operations, (op) => {\n\t\t\t\tif (layerDirty) {\n\t\t\t\t\top.path(context);\n\t\t\t\t\top.colorize(context, undefined);\n\t\t\t\t}\n\n\t\t\t\tif (interactive) {\n\t\t\t\t\top.path(ghostContext);\n\t\t\t\t\top.colorize(ghostContext, color);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic renderDetached(context: CanvasRenderingContext2D): void {\n\t\tif (this.visible) {\n\t\t\tthis._setMatrix();\n\n\t\t\tcontext.save();\n\n\t\t\t// We must apply the mask before we transform the element\n\t\t\tconst mask = this.mask;\n\t\t\tif (mask) {\n\t\t\t\tmask._setMatrix();\n\t\t\t\tmask._transform(context, 1);\n\t\t\t\tmask._runPath(context);\n\t\t\t\tcontext.clip();\n\t\t\t}\n\n\t\t\t// TODO handle compoundAlpha somehow ?\n\t\t\tcontext.globalAlpha = this.compoundAlpha * this.alpha;\n\n\t\t\tthis._transform(context, 1);\n\n\t\t\tif (this.filter) {\n\t\t\t\tcontext.filter = this.filter;\n\t\t\t}\n\n\t\t\tcontext.globalCompositeOperation = this.blendMode;\n\n\t\t\tcontext.beginPath();\n\n\t\t\t$array.each(this._operations, (op) => {\n\t\t\t\top.path(context);\n\t\t\t\top.colorize(context, undefined);\n\t\t\t});\n\n\t\t\tcontext.restore();\n\t\t}\n\t}\n\n\tpublic _addBounds(bounds: IBounds): void {\n\t\tif (this.visible && this.isMeasured) {\n\t\t\t$array.each(this._operations, (op) => {\n\t\t\t\top.addBounds(bounds);\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\ninterface ILineChunk {\n\tstyle: string | undefined,\n\tfill: Color | undefined,\n\ttext: string,\n\twidth: number,\n\theight: number,\n\tleft: number,\n\tright: number,\n\tascent: number,\n\toffsetX: number,\n\toffsetY: number,\n\ttextDecoration: string | undefined\n}\n\n/**\n * @ignore\n */\ninterface ILine {\n\toffsetY: number,\n\tascent: number,\n\twidth: number,\n\theight: number,\n\tleft: number,\n\tright: number,\n\ttextChunks: Array,\n}\n\n/**\n * @ignore\n */\nexport class CanvasText extends CanvasDisplayObject implements IText {\n\tpublic text: string;\n\tpublic style: CanvasTextStyle;\n\tpublic resolution: number = 1;\n\n\tprotected _textInfo: Array | undefined;\n\tprotected _textVisible: boolean = true;\n\tprotected _originalScale?: number = 1;\n\n\tconstructor(renderer: CanvasRenderer, text: string, style: CanvasTextStyle) {\n\t\tsuper(renderer);\n\t\tthis.text = text;\n\t\tthis.style = style;\n\t}\n\n\tpublic invalidateBounds(): void {\n\t\tsuper.invalidateBounds();\n\t\tthis._textInfo = undefined;\n\t}\n\n\tprivate _shared(context: CanvasRenderingContext2D) {\n\t\tif (this.style.textAlign) {\n\t\t\tcontext.textAlign = this.style.textAlign;\n\t\t}\n\n\t\tif (this.style.direction) {\n\t\t\tcontext.direction = this.style.direction;\n\t\t}\n\n\t\tif (this.style.textBaseline) {\n\t\t\tcontext.textBaseline = this.style.textBaseline;\n\t\t}\n\n\t}\n\n\tprotected _prerender(layer: CanvasLayer, ignoreGhost = false, ignoreFontWeight = false): void {\n\t\tsuper._render(layer);\n\n\t\tconst context = layer.context;\n\t\tconst ghostContext = this._renderer._ghostContext;\n\n\t\t// Font style\n\n\t\tconst style = this.style;\n\t\tlet fontStyle = this._getFontStyle(undefined, ignoreFontWeight);\n\n\t\tcontext.font = fontStyle;\n\t\tif (this._isInteractive() && !ignoreGhost) {\n\t\t\tghostContext.font = fontStyle;\n\t\t}\n\n\t\t// Other parameters\n\t\tif (style.fill) {\n\t\t\tif (style.fill instanceof Color) {\n\t\t\t\tcontext.fillStyle = style.fill.toCSS();\n\t\t\t} else {\n\t\t\t\tcontext.fillStyle = style.fill;\n\t\t\t}\n\t\t}\n\n\t\tif (style.shadowColor) {\n\t\t\tlayer.context.shadowColor = style.shadowColor.toCSS(style.shadowOpacity || 1);\n\t\t}\n\t\tif (style.shadowBlur) {\n\t\t\tlayer.context.shadowBlur = style.shadowBlur;\n\t\t}\n\t\tif (style.shadowOffsetX) {\n\t\t\tlayer.context.shadowOffsetX = style.shadowOffsetX;\n\t\t}\n\t\tif (style.shadowOffsetY) {\n\t\t\tlayer.context.shadowOffsetY = style.shadowOffsetY;\n\t\t}\n\n\t\tthis._shared(context);\n\n\t\tif (this._isInteractive() && !ignoreGhost) {\n\t\t\tghostContext.fillStyle = this._getColorId();\n\t\t\tthis._shared(ghostContext);\n\t\t}\n\t}\n\n\tprotected _getFontStyle(style2?: ITextStyle, ignoreFontWeight = false): string {\n\n\t\t// Process defaults\n\t\tconst style = this.style;\n\t\tlet fontStyle: string[] = [];\n\n\t\tif (style2 && style2.fontVariant) {\n\t\t\tfontStyle.push(style2.fontVariant);\n\t\t}\n\t\telse if (style.fontVariant) {\n\t\t\tfontStyle.push(style.fontVariant);\n\t\t}\n\n\t\tif (!ignoreFontWeight) {\n\t\t\tif (style2 && style2.fontWeight) {\n\t\t\t\tfontStyle.push(style2.fontWeight);\n\t\t\t}\n\t\t\telse if (style.fontWeight) {\n\t\t\t\tfontStyle.push(style.fontWeight);\n\t\t\t}\n\t\t}\n\n\t\tif (style2 && style2.fontStyle) {\n\t\t\tfontStyle.push(style2.fontStyle);\n\t\t}\n\t\telse if (style.fontStyle) {\n\t\t\tfontStyle.push(style.fontStyle);\n\t\t}\n\n\t\tif (style2 && style2.fontSize) {\n\t\t\tif ($type.isNumber(style2.fontSize)) {\n\t\t\t\tstyle2.fontSize = style2.fontSize + \"px\";\n\t\t\t}\n\t\t\tfontStyle.push(style2.fontSize);\n\t\t}\n\t\telse if (style.fontSize) {\n\t\t\tif ($type.isNumber(style.fontSize)) {\n\t\t\t\tstyle.fontSize = style.fontSize + \"px\";\n\t\t\t}\n\t\t\tfontStyle.push(style.fontSize);\n\t\t}\n\n\t\tif (style2 && style2.fontFamily) {\n\t\t\tfontStyle.push(style2.fontFamily);\n\t\t}\n\t\telse if (style.fontFamily) {\n\t\t\tfontStyle.push(style.fontFamily);\n\t\t}\n\t\telse if (fontStyle.length) {\n\t\t\tfontStyle.push(\"Arial\");\n\t\t}\n\n\t\treturn fontStyle.join(\" \");\n\t}\n\n\tprotected _render(parentLayer: CanvasLayer): void {\n\t\tconst layer = this._layer || parentLayer;\n\n\t\t// We need measurements in order to properly position text for alignment\n\t\tif (!this._textInfo) {\n\t\t\tthis._measure(layer);\n\t\t}\n\n\t\tif (this._textVisible) {\n\n\t\t\tconst interactive = this._isInteractive();\n\t\t\tconst context = layer.context;\n\t\t\tconst layerDirty = layer.dirty;\n\t\t\tconst ghostContext = this._renderer._ghostContext;\n\n\t\t\tcontext.save();\n\t\t\tghostContext.save();\n\t\t\tthis._prerender(layer);\n\n\t\t\t// const lines = this.text.toString().replace(/\\r/g, \"\").split(/\\n/);\n\t\t\t// const x = this._localBounds && (this._localBounds.left < 0) ? Math.abs(this._localBounds.left) : 0;\n\n\t\t\t// Process text info produced by _measure()\n\t\t\t$array.each(this._textInfo!, (line, _index) => {\n\t\t\t\t$array.each(line.textChunks, (chunk, _index) => {\n\n\t\t\t\t\t// Set style\n\t\t\t\t\tif (chunk.style) {\n\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\tghostContext.save();\n\n\t\t\t\t\t\tcontext.font = chunk.style;\n\t\t\t\t\t\tif (this._isInteractive()) {\n\t\t\t\t\t\t\tghostContext.font = chunk.style;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (chunk.fill) {\n\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\tcontext.fillStyle = chunk.fill.toCSS();\n\t\t\t\t\t\t// Color does not affect ghostContext so we not set it\n\t\t\t\t\t}\n\n\t\t\t\t\t// Draw text\n\t\t\t\t\tif (layerDirty) {\n\t\t\t\t\t\tcontext.fillText(chunk.text, chunk.offsetX, line.offsetY + chunk.offsetY);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Draw underline\n\t\t\t\t\tif (chunk.textDecoration == \"underline\") {\n\n\t\t\t\t\t\tlet thickness = 1;\n\t\t\t\t\t\tlet offset = 1;\n\t\t\t\t\t\tlet fontSize = chunk.height;\n\n\t\t\t\t\t\tlet offsetX = chunk.offsetX;\n\t\t\t\t\t\tswitch (this.style.textAlign) {\n\t\t\t\t\t\t\tcase \"right\":\n\t\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\t\toffsetX -= chunk.width;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"center\":\n\t\t\t\t\t\t\t\toffsetX -= chunk.width / 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (chunk.style) {\n\t\t\t\t\t\t\tconst format = TextFormatter.getTextStyle(chunk.style);\n\t\t\t\t\t\t\tswitch (format.fontWeight) {\n\t\t\t\t\t\t\t\tcase \"bolder\":\n\t\t\t\t\t\t\t\tcase \"bold\":\n\t\t\t\t\t\t\t\tcase \"700\":\n\t\t\t\t\t\t\t\tcase \"800\":\n\t\t\t\t\t\t\t\tcase \"900\":\n\t\t\t\t\t\t\t\t\tthickness = 2;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (fontSize) {\n\t\t\t\t\t\t\toffset = fontSize / 20;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst y = thickness + offset * 1.5 + line.offsetY + chunk.offsetY;\n\n\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\tcontext.beginPath();\n\t\t\t\t\t\tif (chunk.fill) {\n\t\t\t\t\t\t\tcontext.strokeStyle = chunk.fill.toCSS();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (this.style.fill && this.style.fill instanceof Color) {\n\t\t\t\t\t\t\tcontext.strokeStyle = this.style.fill.toCSS();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontext.lineWidth = thickness * offset;\n\t\t\t\t\t\tcontext.moveTo(offsetX, y);\n\t\t\t\t\t\tcontext.lineTo(offsetX + chunk.width, y);\n\t\t\t\t\t\tcontext.stroke();\n\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (interactive && this.interactive) {\n\t\t\t\t\t\t// Draw text in ghost canvas ONLY if it is set as interactive\n\t\t\t\t\t\t// explicitly. This way we avoid hit test anomalies caused by anti\n\t\t\t\t\t\t// aliasing of text.\n\t\t\t\t\t\tghostContext.fillText(chunk.text, chunk.offsetX, line.offsetY + chunk.offsetY);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (chunk.fill) {\n\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t// Color does not affect ghostContext so we not set it\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset style\n\t\t\t\t\tif (chunk.style) {\n\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\tghostContext.restore();\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontext.restore();\n\t\t\tghostContext.restore();\n\t\t}\n\t}\n\n\tpublic _addBounds(bounds: IBounds): void {\n\t\tif (this.visible && this.isMeasured) {\n\t\t\t//if (this._textVisible) {\n\t\t\tconst x = this._measure(this.getLayer());\n\t\t\tsetPoint(bounds, { x: x.left, y: x.top });\n\t\t\tsetPoint(bounds, { x: x.right, y: x.bottom });\n\t\t\t//}\n\t\t}\n\t}\n\n\tpublic _measure(layer: CanvasLayer): IBounds {\n\t\tconst context = layer.context;\n\t\tconst ghostContext = this._renderer._ghostContext;\n\t\tconst rtl = this.style.direction == \"rtl\";\n\n\t\t// Reset text info\n\t\tthis._textInfo = [];\n\n\t\t// Init\n\t\tconst oversizedBehavior = this.style.oversizedBehavior;\n\t\tconst maxWidth = this.style.maxWidth!;\n\n\t\tconst truncate = $type.isNumber(maxWidth) && oversizedBehavior == \"truncate\";\n\t\tconst wrap = $type.isNumber(maxWidth) && oversizedBehavior == \"wrap\";\n\n\t\t// Pre-render\n\t\tcontext.save();\n\t\tghostContext.save();\n\t\tthis._prerender(layer, true, true);\n\n\t\t// Get default font metrix\n\t\tconst refText = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 \";\n\n\t\t// Split up text into lines\n\t\tconst lines = this.text.toString().replace(/\\r/g, \"\").split(/\\n/);\n\t\tlet styleRestored = true;\n\t\tlet minX = 0;\n\t\tlet maxX = 0;\n\n\t\t// Iterate through the lines\n\t\tlet offsetY = 0;\n\t\tlet currentStyle: string | undefined;\n\t\t$array.each(lines, (line, _index) => {\n\n\t\t\t// Split up line into format/value chunks\n\t\t\tlet chunks: ITextChunk[];\n\t\t\tif (line == \"\") {\n\t\t\t\tchunks = [{\n\t\t\t\t\ttype: \"value\",\n\t\t\t\t\ttext: \"\"\n\t\t\t\t}];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchunks = TextFormatter.chunk(line, false, this.style.ignoreFormatting);\n\t\t\t}\n\n\t\t\twhile (chunks.length > 0) {\n\n\t\t\t\t// Init line object\n\t\t\t\tlet lineInfo: ILine = {\n\t\t\t\t\toffsetY: offsetY,\n\t\t\t\t\tascent: 0,\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttextChunks: []\n\t\t\t\t};\n\n\t\t\t\t// Measure reference text\n\t\t\t\tconst metrics = this._measureText(refText, context);\n\n\t\t\t\tconst height = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\t\t\t\tlineInfo.height = height;\n\t\t\t\tlineInfo.ascent = metrics.actualBoundingBoxAscent;\n\n\t\t\t\tlet currentFormat: string;\n\t\t\t\tlet currentDecoration: string | undefined = this.style.textDecoration;\n\t\t\t\tlet currentFill: Color | undefined;\n\t\t\t\tlet currentChunkWidth: number | undefined;\n\t\t\t\tlet skipFurtherText = false;\n\t\t\t\tlet firstTextChunk = true;\n\t\t\t\tlet leftoverChunks: Array = [];\n\t\t\t\t//let offsetX = 0;\n\t\t\t\t//let chunk;\n\n\t\t\t\t//while(chunk = chunks.shift()) {\n\t\t\t\t$array.eachContinue(chunks, (chunk, index) => {\n\n\t\t\t\t\t// Format chunk\n\t\t\t\t\tif (chunk.type == \"format\") {\n\t\t\t\t\t\tif (chunk.text == \"[/]\") {\n\t\t\t\t\t\t\tif (!styleRestored) {\n\t\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t\t\tghostContext.restore();\n\t\t\t\t\t\t\t\tstyleRestored = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcurrentFill = undefined;\n\t\t\t\t\t\t\tcurrentStyle = undefined;\n\t\t\t\t\t\t\tcurrentChunkWidth = undefined;\n\t\t\t\t\t\t\tcurrentDecoration = this.style.textDecoration;\n\t\t\t\t\t\t\tcurrentFormat = chunk.text;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\n\t\t\t\t\t\t\tif (!styleRestored) {\n\t\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t\t\tghostContext.restore();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet format = TextFormatter.getTextStyle(chunk.text);\n\t\t\t\t\t\t\tconst fontStyle = this._getFontStyle(format);\n\t\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\t\tghostContext.save();\n\t\t\t\t\t\t\tcontext.font = fontStyle;\n\t\t\t\t\t\t\tcurrentStyle = fontStyle;\n\t\t\t\t\t\t\tcurrentFormat = chunk.text;\n\t\t\t\t\t\t\tif (format.textDecoration) {\n\t\t\t\t\t\t\t\tcurrentDecoration = format.textDecoration;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (format.fill) {\n\t\t\t\t\t\t\t\tcurrentFill = format.fill;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ((format).width) {\n\t\t\t\t\t\t\t\tcurrentChunkWidth = $type.toNumber((format).width);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstyleRestored = false;\n\n\t\t\t\t\t\t\t// Measure reference text after change of format\n\t\t\t\t\t\t\tconst metrics = this._measureText(refText, context);\n\t\t\t\t\t\t\tconst height = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\t\t\t\t\t\t\tif (height > lineInfo.height) {\n\t\t\t\t\t\t\t\tlineInfo.height = height;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (metrics.actualBoundingBoxAscent > lineInfo.ascent) {\n\t\t\t\t\t\t\t\tlineInfo.ascent = metrics.actualBoundingBoxAscent;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Text chunk\n\t\t\t\t\telse if (chunk.type == \"value\" && !skipFurtherText) {\n\n\t\t\t\t\t\t// Measure\n\t\t\t\t\t\tconst metrics = this._measureText(chunk.text, context);\n\t\t\t\t\t\tlet chunkWidth = metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight;\n\n\t\t\t\t\t\t// Check for fit\n\t\t\t\t\t\tif (truncate) {\n\n\t\t\t\t\t\t\t// Break words?\n\t\t\t\t\t\t\tlet breakWords = firstTextChunk || this.style.breakWords || false;\n\n\t\t\t\t\t\t\t// Measure ellipsis and check if it fits\n\t\t\t\t\t\t\tconst ellipsis = this.style.ellipsis || \"\";\n\t\t\t\t\t\t\tconst ellipsisMetrics = this._measureText(ellipsis, context);\n\t\t\t\t\t\t\tconst ellipsisWidth = ellipsisMetrics.actualBoundingBoxLeft + ellipsisMetrics.actualBoundingBoxRight;\n\n\t\t\t\t\t\t\t// Check fit\n\t\t\t\t\t\t\tif ((lineInfo.width + chunkWidth) > maxWidth) {\n\t\t\t\t\t\t\t\tconst excessWidth = maxWidth - lineInfo.width - ellipsisWidth;\n\t\t\t\t\t\t\t\tchunk.text = this._truncateText(context, chunk.text, excessWidth, breakWords);\n\t\t\t\t\t\t\t\tchunk.text += ellipsis;\n\t\t\t\t\t\t\t\tskipFurtherText = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (wrap) {\n\t\t\t\t\t\t\t// Check fit\n\t\t\t\t\t\t\tif ((lineInfo.width + chunkWidth) > maxWidth) {\n\t\t\t\t\t\t\t\tconst excessWidth = maxWidth - lineInfo.width;\n\t\t\t\t\t\t\t\tconst tmpText = this._truncateText(context, chunk.text, excessWidth, false, firstTextChunk);\n\n\t\t\t\t\t\t\t\tif (tmpText == \"\") {\n\t\t\t\t\t\t\t\t\t// Unable to fit a single letter - hide the whole label\n\t\t\t\t\t\t\t\t\tthis._textVisible = true;\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//skipFurtherText = true;\n\n\t\t\t\t\t\t\t\t//Add remaining chunks for the next line\n\t\t\t\t\t\t\t\tleftoverChunks = chunks.slice(index + 1);\n\n\t\t\t\t\t\t\t\t//Add remaining text of current chunk if it was forced-cut\n\t\t\t\t\t\t\t\tif ($utils.trim(tmpText) != $utils.trim(chunk.text)) {\n\t\t\t\t\t\t\t\t\tleftoverChunks.unshift({\n\t\t\t\t\t\t\t\t\t\ttype: \"value\",\n\t\t\t\t\t\t\t\t\t\ttext: chunk.text.substr(tmpText.length)\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif (currentFormat) {\n\t\t\t\t\t\t\t\t\t\tleftoverChunks.unshift({\n\t\t\t\t\t\t\t\t\t\t\ttype: \"format\",\n\t\t\t\t\t\t\t\t\t\t\ttext: currentFormat\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Set current chunk (truncated)\n\t\t\t\t\t\t\t\tchunk.text = tmpText;\n\n\t\t\t\t\t\t\t\tchunks = [];\n\t\t\t\t\t\t\t\tskipFurtherText = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Chunk width?\n\t\t\t\t\t\tlet leftBoundMod = 1;\n\t\t\t\t\t\tlet rightBoundMod = 1;\n\t\t\t\t\t\tif (currentStyle && currentChunkWidth && (currentChunkWidth > chunkWidth)) {\n\t\t\t\t\t\t\t// increase horizontal bounding boxes accordingly\n\t\t\t\t\t\t\tconst boundsMod = chunkWidth / currentChunkWidth\n\t\t\t\t\t\t\tswitch (this.style.textAlign) {\n\t\t\t\t\t\t\t\tcase \"right\":\n\t\t\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\t\t\tleftBoundMod = boundsMod;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"center\":\n\t\t\t\t\t\t\t\t\tleftBoundMod = boundsMod;\n\t\t\t\t\t\t\t\t\trightBoundMod = boundsMod;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\trightBoundMod = boundsMod;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchunkWidth = currentChunkWidth;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst chunkHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\n\n\t\t\t\t\t\tif (chunkHeight > lineInfo.height) {\n\t\t\t\t\t\t\tlineInfo.height = chunkHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (metrics.actualBoundingBoxAscent > lineInfo.ascent) {\n\t\t\t\t\t\t\tlineInfo.ascent = metrics.actualBoundingBoxAscent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlineInfo.width += chunkWidth;\n\t\t\t\t\t\tlineInfo.left += metrics.actualBoundingBoxLeft / leftBoundMod;\n\t\t\t\t\t\tlineInfo.right += metrics.actualBoundingBoxRight / rightBoundMod;\n\t\t\t\t\t\tlineInfo.textChunks.push({\n\t\t\t\t\t\t\tstyle: currentStyle,\n\t\t\t\t\t\t\tfill: currentFill,\n\t\t\t\t\t\t\ttext: chunk.text,\n\t\t\t\t\t\t\twidth: chunkWidth,\n\t\t\t\t\t\t\theight: chunkHeight,\n\t\t\t\t\t\t\tleft: metrics.actualBoundingBoxLeft,\n\t\t\t\t\t\t\tright: metrics.actualBoundingBoxRight,\n\t\t\t\t\t\t\tascent: metrics.actualBoundingBoxAscent,\n\t\t\t\t\t\t\toffsetX: 0,\n\t\t\t\t\t\t\toffsetY: 0,\n\t\t\t\t\t\t\ttextDecoration: currentDecoration\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t//offsetX += chunkWidth;\n\n\t\t\t\t\t\tfirstTextChunk = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif (leftoverChunks) {\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t\t//}\n\t\t\t\t});\n\n\t\t\t\tif (this.style.lineHeight instanceof Percent) {\n\t\t\t\t\tlineInfo.height *= this.style.lineHeight.value;\n\t\t\t\t\tlineInfo.ascent *= this.style.lineHeight.value;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlineInfo.height *= this.style.lineHeight || 1.2;\n\t\t\t\t\tlineInfo.ascent *= this.style.lineHeight || 1.2;\n\t\t\t\t}\n\n\t\t\t\tif (minX < lineInfo.left) {\n\t\t\t\t\tminX = lineInfo.left;\n\t\t\t\t}\n\n\t\t\t\tif (maxX < lineInfo.right) {\n\t\t\t\t\tmaxX = lineInfo.right;\n\t\t\t\t}\n\n\t\t\t\tthis._textInfo!.push(lineInfo);\n\n\t\t\t\t//lineInfo.offsetY += lineInfo.ascent;\n\t\t\t\toffsetY += lineInfo.height;\n\n\t\t\t\t// Reset chunks so that it can proceed to the next line\n\t\t\t\tchunks = leftoverChunks || [];\n\t\t\t}\n\n\t\t});\n\n\t\tif (!styleRestored) {\n\t\t\tcontext.restore();\n\t\t\tghostContext.restore();\n\t\t}\n\n\t\t// Adjust chunk internal offsets\n\t\t$array.each(this._textInfo, (lineInfo, _index: number) => {\n\t\t\tlet currentChunkOffset = 0\n\t\t\t$array.each(lineInfo.textChunks, (chunk) => {\n\t\t\t\tchunk.offsetX = currentChunkOffset + chunk.left - lineInfo.left;\n\t\t\t\tchunk.offsetY += lineInfo.height - lineInfo.height * (this.style.baselineRatio || 0.19);\n\t\t\t\tcurrentChunkOffset += chunk.width;\n\t\t\t});\n\t\t});\n\n\t\tconst bounds = {\n\t\t\tleft: rtl ? -maxX : -minX,\n\t\t\ttop: 0,\n\t\t\tright: rtl ? minX : maxX,\n\t\t\tbottom: offsetY,\n\t\t};\n\n\t\t// We need to fit?\n\t\tif (oversizedBehavior !== \"none\") {\n\t\t\tconst ratio = this._fitRatio(bounds);\n\t\t\tif (ratio < 1) {\n\t\t\t\tif (oversizedBehavior == \"fit\") {\n\t\t\t\t\tif ($type.isNumber(this.style.minScale) && (ratio < this.style.minScale)) {\n\t\t\t\t\t\tthis._textVisible = false;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!this._originalScale || this._originalScale == 1) {\n\t\t\t\t\t\t\tthis._originalScale = this.scale;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.scale = ratio;\n\t\t\t\t\t\tthis._textVisible = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (oversizedBehavior == \"hide\") {\n\t\t\t\t\tthis._textVisible = false;\n\t\t\t\t}\n\t\t\t\telse {\n\n\t\t\t\t\tswitch (this.style.textAlign) {\n\t\t\t\t\t\tcase \"right\":\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\tbounds.left = maxWidth;\n\t\t\t\t\t\t\tbounds.right = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"center\":\n\t\t\t\t\t\t\tbounds.left = -maxWidth / 2;\n\t\t\t\t\t\t\tbounds.right = maxWidth / 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbounds.left = 0;\n\t\t\t\t\t\t\tbounds.right = maxWidth;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.scale = this._originalScale || 1;\n\t\t\t\t\tthis._originalScale = undefined;\n\t\t\t\t\tthis._textVisible = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.scale = this._originalScale || 1;\n\t\t\t\tthis._originalScale = undefined;\n\t\t\t\tthis._textVisible = true;\n\t\t\t}\n\t\t}\n\n\t\tcontext.restore();\n\t\tghostContext.restore();\n\n\t\treturn bounds;\n\t}\n\n\tprotected _fitRatio(bounds: IBounds): number {\n\t\tconst maxW = this.style.maxWidth;\n\t\tconst maxH = this.style.maxHeight;\n\t\tif (!$type.isNumber(maxW) && !$type.isNumber(maxH)) {\n\t\t\treturn 1;\n\t\t}\n\t\tconst w = bounds.right - bounds.left;\n\t\tconst h = bounds.bottom - bounds.top;\n\t\treturn Math.min(maxW! / w || 1, maxH! / h || 1);\n\t}\n\n\tprotected _truncateText(context: CanvasRenderingContext2D, text: string, maxWidth: number, breakWords: boolean = false, fallbackBreakWords: boolean = true): string {\n\t\tlet width: number;\n\t\tdo {\n\t\t\tif (breakWords) {\n\t\t\t\ttext = text.slice(0, -1);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet tmp = text.replace(/[^,;:!?\\\\\\/\\s]+[,;:!?\\\\\\/\\s]*$/g, \"\");\n\t\t\t\tif (tmp == \"\" && fallbackBreakWords) {\n\t\t\t\t\tbreakWords = true;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttext = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst metrics = this._measureText(text, context);\n\t\t\twidth = metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight;\n\t\t} while ((width > maxWidth) && text != \"\");\n\t\treturn text;\n\t}\n\n\tprotected _measureText(text: string, context: CanvasRenderingContext2D): TextMetrics {\n\t\tlet metrics = context.measureText(text);\n\t\tlet fakeMetrics: any = {};\n\t\tif (metrics.actualBoundingBoxAscent == null) {\n\t\t\tconst div = document.createElement(\"div\");\n\t\t\tdiv.innerText = text;\n\t\t\tdiv.style.visibility = \"hidden\";\n\t\t\tdiv.style.position = \"absolute\";\n\t\t\tdiv.style.top = \"-1000000px;\"\n\t\t\tdiv.style.fontFamily = this.style.fontFamily || \"\";\n\t\t\tdiv.style.fontSize = this.style.fontSize + \"\";\n\t\t\tdocument.body.appendChild(div);\n\t\t\tconst bbox = div.getBoundingClientRect();\n\t\t\tdocument.body.removeChild(div);\n\t\t\tconst h = bbox.height;\n\t\t\tconst w = metrics.width;\n\t\t\tlet left = 0;\n\t\t\tlet right = w;\n\n\t\t\tfakeMetrics = {\n\t\t\t\tactualBoundingBoxAscent: h,\n\t\t\t\tactualBoundingBoxDescent: 0,\n\t\t\t\tactualBoundingBoxLeft: left,\n\t\t\t\tactualBoundingBoxRight: right,\n\t\t\t\tfontBoundingBoxAscent: h,\n\t\t\t\tfontBoundingBoxDescent: 0,\n\t\t\t\twidth: w\n\t\t\t}\n\t\t\t//return fake;\n\t\t}\n\t\telse {\n\t\t\tfakeMetrics = {\n\t\t\t\tactualBoundingBoxAscent: metrics.actualBoundingBoxAscent,\n\t\t\t\tactualBoundingBoxDescent: metrics.actualBoundingBoxDescent,\n\t\t\t\tactualBoundingBoxLeft: metrics.actualBoundingBoxLeft,\n\t\t\t\tactualBoundingBoxRight: metrics.actualBoundingBoxRight,\n\t\t\t\tfontBoundingBoxAscent: metrics.actualBoundingBoxAscent,\n\t\t\t\tfontBoundingBoxDescent: metrics.actualBoundingBoxDescent,\n\t\t\t\twidth: metrics.width\n\t\t\t}\n\t\t}\n\n\t\tconst w = metrics.width;\n\t\tswitch (this.style.textAlign) {\n\t\t\tcase \"right\":\n\t\t\tcase \"end\":\n\t\t\t\tfakeMetrics.actualBoundingBoxLeft = w;\n\t\t\t\tfakeMetrics.actualBoundingBoxRight = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"center\":\n\t\t\t\tfakeMetrics.actualBoundingBoxLeft = w / 2;\n\t\t\t\tfakeMetrics.actualBoundingBoxRight = w / 2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfakeMetrics.actualBoundingBoxLeft = 0;\n\t\t\t\tfakeMetrics.actualBoundingBoxRight = w;\n\t\t}\n\n\t\treturn fakeMetrics;\n\t}\n\n}\n\n/**\n * @ignore\n */\nexport class CanvasTextStyle implements ITextStyle {\n\t//public wordWrapWidth: number = 100;\n\tpublic fill?: Color | CanvasGradient | CanvasPattern;\n\tpublic textAlign?: \"start\" | \"end\" | \"left\" | \"right\" | \"center\";\n\tpublic fontFamily?: string;\n\tpublic fontSize?: string | number;\n\tpublic fontWeight?: 'normal' | 'bold' | 'bolder' | 'lighter' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'\n\tpublic fontStyle?: 'normal' | 'italic' | 'oblique';\n\tpublic fontVariant?: \"normal\" | \"small-caps\";\n\tpublic textDecoration?: \"underline\";\n\tpublic shadowColor?: Color | null;\n\tpublic shadowBlur?: number;\n\tpublic shadowOffsetX?: number;\n\tpublic shadowOffsetY?: number;\n\tpublic shadowOpacity?: number;\n\t// leading?: number;\n\t// letterSpacing?: number;\n\tpublic lineHeight?: number | Percent = percent(120);\n\tpublic baselineRatio?: number = 0.19;\n\t// padding?: number;\n\t// stroke?: number;\n\t// strokeThickness?: number;\n\t// trim?: number;\n\t// wordWrap?: boolean;\n\tpublic direction?: \"ltr\" | \"rtl\";\n\tpublic textBaseline?: \"top\" | \"hanging\" | \"middle\" | \"alphabetic\" | \"ideographic\" | \"bottom\";\n\tpublic oversizedBehavior?: \"none\" | \"hide\" | \"fit\" | \"wrap\" | \"truncate\" = \"none\";\n\tpublic breakWords?: boolean = false;\n\tpublic ellipsis?: string = \"…\";\n\tpublic maxWidth?: number;\n\tpublic maxHeight?: number;\n\tpublic minScale?: number;\n\tpublic ignoreFormatting?: boolean = false;\n}\n\n/**\n * @ignore\n */\nexport class CanvasRadialText extends CanvasText implements IRadialText {\n\tpublic textType?: \"regular\" | \"circular\" | \"radial\" | \"aligned\" | \"adjusted\" = \"circular\";\n\tpublic radius?: number;\n\tpublic startAngle?: number;\n\tpublic inside?: boolean = false;\n\tpublic orientation?: \"inward\" | \"outward\" | \"auto\" = \"auto\";\n\tpublic kerning?: number = 0;\n\n\tprivate _textReversed: boolean = false;\n\n\tpublic _render(parentLayer: CanvasLayer): void {\n\t\tswitch (this.textType) {\n\t\t\tcase \"circular\":\n\t\t\t\tthis._renderCircular(parentLayer);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tsuper._render(parentLayer);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic _renderCircular(parentLayer: CanvasLayer): void {\n\t\tconst layer = this._layer || parentLayer;\n\n\t\tthis._prerender(layer);\n\n\t\tconst interactive = this._isInteractive();\n\t\tconst context = layer.context;\n\t\tconst layerDirty = layer.dirty;\n\t\tconst ghostContext = this._renderer._ghostContext;\n\n\t\t// Savepoint\n\t\tcontext.save();\n\t\tif (interactive) {\n\t\t\tghostContext.save();\n\t\t}\n\n\t\t// Init\n\t\tlet radius = (this.radius || 0);\n\t\tlet startAngle = (this.startAngle || 0);\n\t\tlet deltaAngle = 0;\n\t\tlet orientation = this.orientation;\n\t\tlet inward = orientation == \"auto\" ? \"auto\" : orientation == \"inward\";\n\t\tconst inside = this.inside;\n\t\tconst align = this.style.textAlign || \"left\";\n\t\tconst kerning = this.kerning || 0;\n\t\tlet clockwise = align == \"left\" ? 1 : -1;\n\t\tconst shouldReverse = !this._textReversed;\n\n\t\t// We need measurements in order to properly position text for alignment\n\t\tif (!this._textInfo) {\n\t\t\tthis._measure(layer);\n\t\t}\n\n\t\t// Check if we need to invert the whole stuff\n\t\tif (inward == \"auto\") {\n\t\t\t// Calc max angle so we know whether we need to flip it\n\t\t\tlet maxAngle = 0;\n\t\t\tlet midAngle = 0;\n\t\t\t$array.each(this._textInfo!, (line, _index) => {\n\t\t\t\tconst deltaAngle = startAngle + (line.width / (radius - line.height)) / 2 * -clockwise;\n\t\t\t\tif (deltaAngle > maxAngle) {\n\t\t\t\t\tmaxAngle = deltaAngle;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (align == \"left\") {\n\t\t\t\tmidAngle = (maxAngle + deltaAngle / 2) * $math.DEGREES;\n\t\t\t}\n\t\t\telse if (align == \"right\") {\n\t\t\t\tmidAngle = (maxAngle - deltaAngle / 2) * $math.DEGREES;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmidAngle = startAngle * $math.DEGREES;\n\t\t\t}\n\t\t\tmidAngle = $math.normalizeAngle(midAngle);\n\t\t\tinward = (midAngle >= 270) || (midAngle <= 90);\n\t\t}\n\n\t\tif (inward == true && shouldReverse) {\n\t\t\tthis._textInfo!.reverse();\n\t\t\tthis._textReversed = true;\n\t\t}\n\n\t\t// if ((inward == false && align == \"left\") || (inward == true && align == \"right\")) {\n\t\t// \tclockwise *= -1;\n\t\t// }\n\n\t\t// Process text info produced by _measure()\n\t\t$array.each(this._textInfo!, (line, _index) => {\n\n\t\t\tconst textHeight = line.height;\n\n\t\t\t// Adjust radius (for `inside = false`)\n\t\t\t// Radius adjustment for `inside = false` is below the line calculation\n\t\t\tif (!inside) {\n\t\t\t\tradius += textHeight;\n\t\t\t}\n\n\t\t\t// Reverse letters if we're painting them counter-clockwise\n\t\t\tif (((clockwise == -1 && inward) || (clockwise == 1 && !inward)) && shouldReverse) {\n\t\t\t\tline.textChunks.reverse();\n\t\t\t}\n\n\t\t\t// Init angles\n\t\t\tlet lineStartAngle = startAngle;\n\t\t\tdeltaAngle = 0;\n\n\t\t\t// Adjust for center-align\n\t\t\tif (align == \"center\") {\n\t\t\t\tlineStartAngle += (line.width / (radius - textHeight)) / 2 * -clockwise;\n\t\t\t\tdeltaAngle = lineStartAngle - startAngle;\n\t\t\t}\n\n\t\t\t// if (inward == \"auto\") {\n\t\t\t// \tlet midAngle;\n\t\t\t// \tif (align == \"left\") {\n\t\t\t// \t\tmidAngle = (lineStartAngle + deltaAngle / 2) * $math.DEGREES;\n\t\t\t// \t}\n\t\t\t// \telse if () {\n\t\t\t// \t\tmidAngle = (lineStartAngle - deltaAngle / 2) * $math.DEGREES;\n\t\t\t// \t}\n\t\t\t// \tinward = (midAngle >= 270) || (midAngle <= 90);\n\t\t\t// }\n\n\t\t\t// Rotate letters if they are facing outward\n\t\t\tlineStartAngle += (Math.PI * (inward ? 0 : 1)); // Rotate 180 if outward\n\n\t\t\t// Savepoint\n\t\t\tcontext.save();\n\t\t\tif (interactive) {\n\t\t\t\tghostContext.save();\n\t\t\t}\n\n\t\t\t// Assume starting angle\n\t\t\tcontext.rotate(lineStartAngle);\n\t\t\tif (interactive) {\n\t\t\t\tghostContext.rotate(lineStartAngle);\n\t\t\t}\n\n\t\t\tlet angleShift = 0;\n\t\t\t$array.each(line.textChunks, (chunk, _index) => {\n\n\t\t\t\t// Draw the letter\n\t\t\t\tconst char = chunk.text;\n\t\t\t\tconst charWidth = chunk.width;\n\n\t\t\t\t// Rotate half a letter\n\t\t\t\tangleShift = (charWidth / 2) / (radius - textHeight) * clockwise;\n\t\t\t\tcontext.rotate(angleShift);\n\t\t\t\tif (interactive) {\n\t\t\t\t\tghostContext.rotate(angleShift);\n\t\t\t\t}\n\n\t\t\t\t// Set style\n\t\t\t\tif (chunk.style) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tghostContext.save();\n\n\t\t\t\t\tcontext.font = chunk.style;\n\t\t\t\t\tif (interactive) {\n\t\t\t\t\t\tghostContext.font = chunk.style;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (chunk.fill) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.fillStyle = chunk.fill.toCSS();\n\t\t\t\t\t// Color does not affect ghostContext so we not set it\n\t\t\t\t}\n\n\t\t\t\t// Center letters\n\t\t\t\tcontext.textBaseline = \"middle\";\n\t\t\t\tcontext.textAlign = \"center\";\n\t\t\t\tif (interactive) {\n\t\t\t\t\tghostContext.textBaseline = \"middle\";\n\t\t\t\t\tghostContext.textAlign = \"center\";\n\t\t\t\t}\n\n\t\t\t\t// Plop the letter\n\t\t\t\tif (layerDirty) {\n\t\t\t\t\tcontext.fillText(char, 0, (inward ? 1 : -1) * (0 - radius + textHeight / 2));\n\t\t\t\t}\n\t\t\t\tif (interactive) {\n\t\t\t\t\tghostContext.fillText(char, 0, (inward ? 1 : -1) * (0 - radius + textHeight / 2));\n\t\t\t\t}\n\n\t\t\t\tif (chunk.fill) {\n\t\t\t\t\tcontext.restore();\n\t\t\t\t\t// Color does not affect ghostContext so we not set it\n\t\t\t\t}\n\n\t\t\t\t// Reset style\n\t\t\t\tif (chunk.style) {\n\t\t\t\t\tcontext.restore();\n\t\t\t\t\tghostContext.restore();\n\t\t\t\t}\n\n\t\t\t\t// Rotate half a letter and add spacing\n\t\t\t\tangleShift = (charWidth / 2 + kerning) / (radius - textHeight) * clockwise;\n\t\t\t\tcontext.rotate(angleShift);\n\t\t\t\tif (interactive) {\n\t\t\t\t\tghostContext.rotate(angleShift);\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\t// Restore angle\n\t\t\tcontext.restore();\n\t\t\tif (interactive) {\n\t\t\t\tghostContext.restore();\n\t\t\t}\n\n\t\t\t// Adjust radius (for `inside = true`)\n\t\t\tif (inside) {\n\t\t\t\tradius -= textHeight;\n\t\t\t}\n\n\t\t});\n\n\t\t// Restore\n\t\tcontext.restore();\n\t\tif (interactive) {\n\t\t\tghostContext.restore();\n\t\t}\n\t}\n\n\tpublic _measure(layer: CanvasLayer): IBounds {\n\t\tswitch (this.textType) {\n\t\t\tcase \"circular\":\n\t\t\t\treturn this._measureCircular(layer);\n\t\t\tdefault:\n\t\t\t\treturn super._measure(layer);\n\t\t}\n\t}\n\n\tpublic _measureCircular(layer: CanvasLayer): IBounds {\n\t\tconst context = layer.context;\n\t\tconst ghostContext = this._renderer._ghostContext;\n\t\tconst rtl = this.style.direction == \"rtl\";\n\n\t\t// Reset text info\n\t\tthis._textInfo = [];\n\t\tthis._textReversed = false;\n\n\t\t// Pre-render\n\t\tcontext.save();\n\t\tghostContext.save();\n\t\tthis._prerender(layer, true);\n\n\t\t// Split up text into lines\n\t\tconst lines = this.text.toString().replace(/\\r/g, \"\").split(/\\n/);\n\t\tlet styleRestored = true;\n\n\t\t// Iterate through the lines\n\t\tlet offsetY = 0;\n\t\t$array.each(lines, (line, _index) => {\n\n\t\t\t// Split up line into format/value chunks\n\t\t\tlet chunks = TextFormatter.chunk(line, false, this.style.ignoreFormatting);\n\n\t\t\t// Init line object\n\t\t\tlet lineInfo: ILine = {\n\t\t\t\toffsetY: offsetY,\n\t\t\t\tascent: 0,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttextChunks: []\n\t\t\t};\n\n\t\t\tlet currentStyle: string | undefined;\n\t\t\tlet currentFill: Color | undefined;\n\t\t\tlet currentChunkWidth: number | undefined;\n\n\t\t\t//while(chunk = chunks.shift()) {\n\t\t\t$array.each(chunks, (chunk, _index) => {\n\n\t\t\t\t// Format chunk\n\t\t\t\tif (chunk.type == \"format\") {\n\t\t\t\t\tif (chunk.text == \"[/]\") {\n\t\t\t\t\t\tif (!styleRestored) {\n\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t\tghostContext.restore();\n\t\t\t\t\t\t\tstyleRestored = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentFill = undefined;\n\t\t\t\t\t\tcurrentStyle = undefined;\n\t\t\t\t\t\tcurrentChunkWidth = undefined;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet format = TextFormatter.getTextStyle(chunk.text);\n\t\t\t\t\t\tconst fontStyle = this._getFontStyle(format);\n\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\tghostContext.save();\n\t\t\t\t\t\tcontext.font = fontStyle;\n\t\t\t\t\t\tcurrentStyle = fontStyle;\n\t\t\t\t\t\tif (format.fill) {\n\t\t\t\t\t\t\tcurrentFill = format.fill;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ((format).width) {\n\t\t\t\t\t\t\tcurrentChunkWidth = $type.toNumber((format).width);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleRestored = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Text format\n\t\t\t\telse if (chunk.type == \"value\") {\n\n\t\t\t\t\t// Measure each letter\n\t\t\t\t\tfor (let i = 0; i < chunk.text.length; i++) {\n\n\t\t\t\t\t\tconst char = rtl ? chunk.text : chunk.text[i];\n\n\t\t\t\t\t\t// Measure\n\t\t\t\t\t\tconst metrics = this._measureText(char, context);\n\t\t\t\t\t\tlet chunkWidth = metrics.width;\n\n\t\t\t\t\t\t// Chunk width?\n\t\t\t\t\t\tif (currentStyle && currentChunkWidth && (currentChunkWidth > chunkWidth)) {\n\t\t\t\t\t\t\tchunkWidth = currentChunkWidth;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst chunkHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\t\t\t\t\t\tif (chunkHeight > lineInfo.height) {\n\t\t\t\t\t\t\tlineInfo.height = chunkHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (metrics.actualBoundingBoxAscent > lineInfo.ascent) {\n\t\t\t\t\t\t\tlineInfo.ascent = metrics.actualBoundingBoxAscent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlineInfo.width += chunkWidth;\n\t\t\t\t\t\tlineInfo.left += metrics.actualBoundingBoxLeft;\n\t\t\t\t\t\tlineInfo.right += metrics.actualBoundingBoxRight;\n\t\t\t\t\t\tlineInfo.textChunks.push({\n\t\t\t\t\t\t\tstyle: currentStyle,\n\t\t\t\t\t\t\tfill: currentFill,\n\t\t\t\t\t\t\ttext: char,\n\t\t\t\t\t\t\twidth: chunkWidth,\n\t\t\t\t\t\t\theight: chunkHeight + metrics.actualBoundingBoxDescent,\n\t\t\t\t\t\t\tleft: metrics.actualBoundingBoxLeft,\n\t\t\t\t\t\t\tright: metrics.actualBoundingBoxRight,\n\t\t\t\t\t\t\tascent: metrics.actualBoundingBoxAscent,\n\t\t\t\t\t\t\toffsetX: 0,\n\t\t\t\t\t\t\toffsetY: chunkHeight,\n\t\t\t\t\t\t\ttextDecoration: undefined\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (rtl) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (this.style.lineHeight instanceof Percent) {\n\t\t\t\tlineInfo.height *= this.style.lineHeight.value;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineInfo.height *= this.style.lineHeight || 1.2;\n\t\t\t}\n\n\t\t\tthis._textInfo!.push(lineInfo);\n\n\t\t\t//lineInfo.offsetY += lineInfo.ascent;\n\t\t\toffsetY += lineInfo.height;\n\n\n\t\t});\n\n\t\tif (!styleRestored) {\n\t\t\tcontext.restore();\n\t\t\tghostContext.restore();\n\t\t}\n\n\t\t// Adjust chunk internal offsets\n\t\t$array.each(this._textInfo, (lineInfo) => {\n\t\t\t$array.each(lineInfo.textChunks, (chunk) => {\n\t\t\t\tchunk.offsetY += Math.round((lineInfo.height - chunk.height + (lineInfo.ascent - chunk.ascent)) / 2);\n\t\t\t});\n\t\t});\n\n\t\tcontext.restore();\n\t\tghostContext.restore();\n\n\t\treturn {\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t};\n\t}\n\n}\n\n/**\n * @ignore\n */\nexport class CanvasImage extends CanvasDisplayObject implements IPicture {\n\tpublic width: number | undefined;\n\tpublic height: number | undefined;\n\tpublic image: HTMLImageElement | undefined;\n\tpublic tainted?: boolean;\n\n\tpublic shadowColor?: Color;\n\tpublic shadowBlur?: number;\n\tpublic shadowOffsetX?: number;\n\tpublic shadowOffsetY?: number;\n\tpublic shadowOpacity?: number;\n\n\tprotected _imageMask: HTMLCanvasElement | undefined;\n\n\tconstructor(renderer: CanvasRenderer, image: HTMLImageElement | undefined) {\n\t\tsuper(renderer);\n\t\tthis.image = image;\n\t}\n\n\tgetLocalBounds(): IBounds {\n\t\tif (!this._localBounds) {\n\n\n\t\t\tlet w = 0;\n\t\t\tlet h = 0;\n\n\t\t\tif (this.width) {\n\t\t\t\tw = this.width;\n\t\t\t}\n\t\t\tif (this.height) {\n\t\t\t\th = this.height;\n\t\t\t}\n\n\t\t\tthis._localBounds = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tright: w,\n\t\t\t\tbottom: h\n\t\t\t};\n\n\t\t\tthis._addBounds(this._localBounds);\n\t\t}\n\t\treturn this._localBounds;\n\t}\n\n\tprotected _render(parentLayer: CanvasLayer): void {\n\t\tsuper._render(parentLayer);\n\n\t\tif (this.image) {\n\t\t\tconst layer = this._layer || parentLayer;\n\n\t\t\tif (this.tainted === undefined) {\n\t\t\t\tthis.tainted = isTainted(this.image);\n\t\t\t\tlayer.tainted = true;\n\t\t\t}\n\n\t\t\tif (this.tainted && this._renderer._omitTainted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (layer.dirty) {\n\n\t\t\t\tif (this.shadowColor) {\n\t\t\t\t\tlayer.context.shadowColor = this.shadowColor.toCSS(this.shadowOpacity || 1);\n\t\t\t\t}\n\t\t\t\tif (this.shadowBlur) {\n\t\t\t\t\tlayer.context.shadowBlur = this.shadowBlur;\n\t\t\t\t}\n\t\t\t\tif (this.shadowOffsetX) {\n\t\t\t\t\tlayer.context.shadowOffsetX = this.shadowOffsetX;\n\t\t\t\t}\n\t\t\t\tif (this.shadowOffsetY) {\n\t\t\t\t\tlayer.context.shadowOffsetY = this.shadowOffsetY;\n\t\t\t\t}\n\n\t\t\t\tconst width = this.width || this.image.naturalWidth;\n\t\t\t\tconst height = this.height || this.image.naturalHeight;\n\n\t\t\t\tlayer.context.drawImage(this.image, 0, 0, width, height);\n\t\t\t}\n\n\t\t\tif (this.interactive && this._isInteractive()) {\n\t\t\t\tconst mask = this._getMask(this.image);\n\n\t\t\t\tthis._renderer._ghostContext.drawImage(mask, 0, 0);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic clear(): void {\n\t\tsuper.clear();\n\t\tthis.image = undefined;\n\t\tthis._imageMask = undefined;\n\t}\n\n\tprotected _getMask(image: HTMLImageElement): HTMLCanvasElement {\n\t\tif (this._imageMask === undefined) {\n\t\t\tconst width = this.width || image.naturalWidth;\n\t\t\tconst height = this.height || image.naturalHeight;\n\n\t\t\t// We need to create a second canvas because destination-in clears out the entire canvas\n\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\n\t\t\tconst context = canvas.getContext(\"2d\")!;\n\n\t\t\tcontext.imageSmoothingEnabled = false;\n\n\t\t\tcontext.fillStyle = this._getColorId();\n\t\t\tcontext.fillRect(0, 0, width, height);\n\n\t\t\tif (!isTainted(image)) {\n\t\t\t\tcontext.globalCompositeOperation = \"destination-in\";\n\t\t\t\tcontext.drawImage(image, 0, 0, width, height);\n\t\t\t}\n\n\t\t\tthis._imageMask = canvas;\n\t\t}\n\n\t\treturn this._imageMask;\n\t}\n\n}\n\n/**\n * @ignore\n */\nexport class CanvasRendererEvent implements IRendererEvent {\n\tpublic id: Id;\n\tpublic simulated: boolean = false;\n\tpublic native: boolean = true;\n\n\tconstructor(public event: A, public point: IPoint) {\n\t\tif ($utils.supports(\"touchevents\") && event instanceof Touch) {\n\t\t\tthis.id = event.identifier;\n\n\t\t} else {\n\t\t\tthis.id = null;\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\ninterface Event {\n\tobject: CanvasDisplayObject;\n\tcontext: unknown;\n\tcallback: (event: IRendererEvents[Key]) => void;\n\tdisposed: boolean;\n}\n\n/**\n * @ignore\n */\ninterface Events {\n\tdisposer: IDisposer;\n\tcallbacks: Array>;\n\tdispatching: boolean;\n\tcleanup: boolean;\n}\n\n/**\n * @ignore\n */\nexport class CanvasRenderer extends ArrayDisposer implements IRenderer, IDisposer {\n\tpublic view: HTMLElement = document.createElement(\"div\");\n\tprotected _layerDom: HTMLElement = document.createElement(\"div\");\n\n\tpublic layers: Array = [];\n\tpublic _dirtyLayers: Array = [];\n\tpublic defaultLayer: CanvasLayer = this.getLayer(0);\n\n\tprotected _ghostView: HTMLCanvasElement;\n\tpublic _ghostContext: CanvasRenderingContext2D;\n\n\tprotected _patternCanvas: HTMLCanvasElement = document.createElement(\"canvas\");\n\tprotected _patternContext: CanvasRenderingContext2D = this._patternCanvas.getContext(\"2d\")!;\n\n\tprotected _width: number = 0;\n\tprotected _height: number = 0;\n\n\tprotected _clientWidth: number = 0;\n\tprotected _clientHeight: number = 0;\n\n\tpublic resolution: number = window.devicePixelRatio;\n\tpublic interactionsEnabled: boolean = true;;\n\n\tprotected _listeners: { [key: string]: CounterDisposer } = {};\n\tprotected _events: { [Key in keyof IRendererEvents]?: Events } = {};\n\n\tprotected _colorId: number = 0;\n\tprotected _colorMap: { [color: string]: CanvasDisplayObject } = {};\n\n\tpublic _forceInteractive: number = 0;\n\tpublic _omitTainted: boolean = false;\n\n\t// TODO this should store the Id as well\n\tpublic _hovering: Set = new Set();\n\tpublic _dragging: Array<{ id: Id, value: CanvasDisplayObject }> = [];\n\tpublic _mousedown: Array<{ id: Id, value: CanvasDisplayObject }> = [];\n\n\tprotected _lastPointerMoveEvent!: { event: IPointerEvent, native: boolean };\n\tprotected _mouseMoveThrottler: Throttler = new Throttler(() => {\n\t\tthis._dispatchGlobalMousemove(this._lastPointerMoveEvent.event, this._lastPointerMoveEvent.native);\n\t});\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.view.appendChild(this._layerDom);\n\n\t\tthis._disposers.push(new Disposer(() => {\n\t\t\t$object.each(this._events, (_key, events) => {\n\t\t\t\tevents.disposer.dispose();\n\t\t\t});\n\t\t}));\n\n\t\t// @todo : do the same for ghost\n\t\tthis._ghostView = document.createElement(\"canvas\");\n\t\tthis._ghostContext = this._ghostView.getContext(\"2d\", { alpha: false })!;\n\t\tthis._ghostContext.imageSmoothingEnabled = false;\n\n\t\t// Monitor for possible pixel ratio changes (when page is zoomed)\n\t\tthis._disposers.push($utils.addEventListener(window, \"resize\", (_ev) => {\n\t\t\tthis.resolution = window.devicePixelRatio;\n\t\t}));\n\n\t\t// We need this in order top prevent default touch gestures when dragging\n\t\t// draggable elements\n\t\tif ($utils.supports(\"touchevents\")) {\n\t\t\tconst listener = (ev: any) => {\n\t\t\t\tif (this._dragging.length !== 0) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis._disposers.push($utils.addEventListener(window, \"touchstart\", listener, { passive: false }));\n\t\t\tthis._disposers.push($utils.addEventListener(this.view, \"touchstart\", listener, { passive: false }));\n\t\t}\n\n\t\t// Prevent scrolling of the window when hovering on \"wheelable\" object\n\t\tif ($utils.supports(\"wheelevents\")) {\n\t\t\tthis._disposers.push($utils.addEventListener(this.view, \"wheel\", (ev) => {\n\t\t\t\tlet prevent = false;\n\t\t\t\tthis._hovering.forEach((obj) => {\n\t\t\t\t\tif (obj.wheelable) {\n\t\t\t\t\t\tprevent = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (prevent) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t}\n\t\t\t}, { passive: false }));\n\t\t}\n\n\t}\n\n\tcreateLinearGradient(x1: number, y1: number, x2: number, y2: number): CanvasGradient {\n\t\treturn this.defaultLayer.context.createLinearGradient(x1, y1, x2, y2);\n\t}\n\n\tcreateRadialGradient(x1: number, y1: number, radius1: number, x2: number, y2: number, radius2: number): CanvasGradient {\n\t\treturn this.defaultLayer.context.createRadialGradient(x1, y1, radius1, x2, y2, radius2);\n\t}\n\n\tcreatePattern(graphics: CanvasGraphics, background: CanvasGraphics, repetition: string, width: number, height: number): CanvasPattern {\n\t\t// const patternCanvas = document.createElement(\"canvas\");\n\t\t// const patternContext = patternCanvas.getContext(\"2d\")!;\n\t\t// patternCanvas.width = width;\n\t\t// patternCanvas.height = height;\n\t\t// if (fill) {\n\t\t// \tpatternContext.fillStyle = fill.toCSS();\n\t\t// \tpatternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\t\t// }\n\n\t\t// const layer = {\n\t\t// \tview: patternCanvas,\n\t\t// \tcontext: patternContext,\n\t\t// \tvisible: true,\n\t\t// \torder: 0,\n\t\t// \twidth: width,\n\t\t// \theight: height,\n\t\t// \tdirty: true\n\t\t// };\n\n\t\t// // patternContext.arc(0, 0, 50, 0, .5 * Math.PI);\n\t\t// // patternContext.stroke();\n\n\t\t// image.targetLayer = layer;\n\t\t// image.render(layer);\n\n\t\t//this._layerDom.appendChild(patternCanvas);\n\n\t\tthis._patternCanvas.width = width;\n\t\tthis._patternCanvas.height = height;\n\n\t\tthis._patternContext.clearRect(0, 0, width, height);\n\n\t\t// patternCanvas.style.width = width * this.resolution + \"px\";\n\t\t// patternCanvas.style.height = height * this.resolution + \"px\";\n\n\t\tbackground.renderDetached(this._patternContext);\n\t\tgraphics.renderDetached(this._patternContext);\n\n\t\treturn this._patternContext.createPattern(this._patternCanvas, repetition)!;\n\t}\n\n\tmakeContainer(): CanvasContainer {\n\t\treturn new CanvasContainer(this);\n\t}\n\n\tmakeGraphics(): CanvasGraphics {\n\t\treturn new CanvasGraphics(this);\n\t}\n\n\tmakeText(text: string, style: CanvasTextStyle): CanvasText {\n\t\treturn new CanvasText(this, text, style);\n\t}\n\n\tmakeTextStyle(): CanvasTextStyle {\n\t\treturn new CanvasTextStyle();\n\t}\n\n\tmakeRadialText(text: string, style: CanvasTextStyle): CanvasRadialText {\n\t\treturn new CanvasRadialText(this, text, style);\n\t}\n\n\tmakePicture(image: HTMLImageElement | undefined): CanvasImage {\n\t\treturn new CanvasImage(this, image);\n\t}\n\n\tresize(width: number, height: number): void {\n\t\tthis._clientWidth = width;\n\t\tthis._clientHeight = height;\n\t\tthis._width = Math.floor(width * this.resolution);\n\t\tthis._height = Math.floor(height * this.resolution);\n\n\t\t$array.each(this.layers, (layer) => {\n\t\t\tif (layer) {\n\t\t\t\tlayer.dirty = true;\n\n\t\t\t\tif (layer.width != null) {\n\t\t\t\t\tlayer.view.width = layer.width;\n\t\t\t\t\tlayer.view.style.width = layer.width + \"px\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlayer.view.width = this._width;\n\t\t\t\t\tlayer.view.style.width = width + \"px\";\n\t\t\t\t}\n\n\t\t\t\tif (layer.height != null) {\n\t\t\t\t\tlayer.view.height = layer.height;\n\t\t\t\t\tlayer.view.style.height = layer.height + \"px\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlayer.view.height = this._height;\n\t\t\t\t\tlayer.view.style.height = height + \"px\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// @todo: do the same for ghost canvases\n\t\tthis._ghostView.width = this._width;\n\t\tthis._ghostView.height = this._height;\n\t\tthis._ghostView.style.width = width + \"px\";\n\t\tthis._ghostView.style.height = height + \"px\";\n\t}\n\n\tcreateDetachedLayer(): CanvasLayer {\n\t\tconst view = document.createElement(\"canvas\");\n\t\tconst context = view.getContext(\"2d\")!;\n\t\tconst layer = {\n\t\t\tview: view,\n\t\t\tcontext: context,\n\t\t\torder: 0,\n\t\t\tvisible: true,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t\tdirty: true,\n\t\t\ttainted: false\n\t\t};\n\n\t\tview.style.position = \"absolute\";\n\t\tview.style.top = \"0px\";\n\t\tview.style.left = \"0px\";\n\n\t\treturn layer;\n\t}\n\n\tgetLayerByOrder(order: number): CanvasLayer | undefined {\n\t\tconst layers = this.layers;\n\t\tconst length = layers.length;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tconst layer = layers[i];\n\t\t\tif (layer.order == order) {\n\t\t\t\treturn layer;\n\t\t\t}\n\t\t}\n\t}\n\n\tgetLayer(order: number, visible: boolean = true): CanvasLayer {\n\t\tconst layers = this.layers;\n\n\t\tlet existingLayer = this.getLayerByOrder(order);\n\t\tif (existingLayer) {\n\t\t\treturn existingLayer;\n\t\t}\n\n\t\tconst layer = this.createDetachedLayer();\n\t\tlayer.order = order;\n\t\tlayer.visible = visible;\n\n\t\tif (layer.visible && this._width) {\n\t\t\tlayer.view.width = this._width;\n\t\t\tlayer.view.style.width = this._clientWidth + \"px\";\n\t\t\tlayer.view.height = this._height;\n\t\t\tlayer.view.style.height = this._clientHeight + \"px\";\n\t\t}\n\n\t\tlayers.push(layer);\n\n\t\tlayers.sort((a, b) => {\n\t\t\tif (a.order > b.order) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse if (a.order < b.order) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\n\t\tconst length = layers.length;\n\t\tconst layerIndex = $array.indexOf(layers, layer);\n\t\tlet next;\n\n\t\tfor (let i = layerIndex + 1; i < length; i++) {\n\t\t\tif (layers[i].visible) {\n\t\t\t\tnext = layers[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (visible) {\n\t\t\tif (next === undefined) {\n\t\t\t\tthis._layerDom.appendChild(layer.view);\n\n\t\t\t} else {\n\t\t\t\tthis._layerDom.insertBefore(layer.view, next.view);\n\t\t\t}\n\t\t}\n\n\t\treturn layer;\n\t}\n\n\trender(root: CanvasDisplayObject): void {\n\n\t\tthis._dirtyLayers.length = 0;\n\n\t\t$array.each(this.layers, (layer) => {\n\t\t\tif (layer) {\n\t\t\t\tif (layer.dirty && layer.visible) {\n\t\t\t\t\tconst context = layer.context;\n\n\t\t\t\t\tthis._dirtyLayers.push(layer);\n\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.clearRect(0, 0, this._width, this._height);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis._ghostContext.save();\n\t\t//this._ghostContext.clearRect(0, 0, this._width, this._height);\n\t\t//this._ghostContext.beginPath();\n\t\tthis._ghostContext.fillStyle = '#000';\n\t\tthis._ghostContext.fillRect(0, 0, this._width, this._height);\n\n\t\troot.render(this.defaultLayer);\n\n\t\tthis._ghostContext.restore();\n\n\t\t//setTimeout(() => {\n\n\t\t// Remove this after the Chrome bug is fixed:\n\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=1279394\n\t\t$array.each(this.layers, (layer) => {\n\t\t\tif (layer) {\n\t\t\t\tconst context = layer.context;\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(0, 0);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t});\n\n\t\t$array.each(this._dirtyLayers, (layer) => {\n\t\t\tlayer.context.restore();\n\t\t\tlayer.dirty = false;\n\t\t});\n\t\t//}, 100)\n\n\t\tif (this._hovering.size && this._lastPointerMoveEvent) {\n\t\t\tthis._mouseMoveThrottler.run();\n\t\t}\n\t}\n\n\tpaintId(obj: CanvasDisplayObject): string {\n\t\tconst id = distributeId(++this._colorId);\n\t\tconst color = Color.fromHex(id).toCSS();\n\t\tthis._colorMap[color] = obj;\n\t\treturn color;\n\t}\n\n\t_removeObject(obj: CanvasDisplayObject): void {\n\t\tif (obj._colorId !== undefined) {\n\t\t\tdelete this._colorMap[obj._colorId];\n\t\t}\n\t}\n\n\t// protected _identifyObjectByColor(colorId: number): CanvasDisplayObject | undefined {\n\t// \treturn this._colorMap[colorId];\n\t// }\n\n\tpublic getEvent(originalEvent: A, adjustPoint: boolean = true): CanvasRendererEvent {\n\t\tconst bbox = adjustPoint ? this.view.getBoundingClientRect() : { left: 0, top: 0 };\n\n\t\treturn new CanvasRendererEvent(originalEvent, originalEvent.clientX || originalEvent.clientY ? {\n\t\t\tx: originalEvent.clientX - (originalEvent.clientX ? bbox.left : 0),\n\t\t\ty: originalEvent.clientY - (originalEvent.clientY ? bbox.top : 0),\n\t\t} : {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t});\n\t}\n\n\t_getHitTarget(point: IPoint): CanvasDisplayObject | undefined | false {\n\t\tif (point.x < 0 || point.x > this._width / this.resolution || point.y < 0 || point.y > this._height / this.resolution) {\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tconst pixel = this._ghostContext.getImageData(\n\t\t\t\t// TODO should this round ?\n\t\t\t\tMath.round(point.x * this.resolution),\n\t\t\t\tMath.round(point.y * this.resolution),\n\t\t\t\t1,\n\t\t\t\t1\n\t\t\t);\n\n\t\t\tif (pixel.data[0] === 0 && pixel.data[1] === 0 && pixel.data[2] === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst colorId = Color.fromRGB(pixel.data[0], pixel.data[1], pixel.data[2]).toCSS();\n\t\t\tconst hit = this._colorMap[colorId];\n\n\t\t\treturn hit;\n\t\t}\n\t}\n\n\t_withEvents(key: Key, f: (events: Events) => void): void {\n\t\tconst events = this._events[key] as Events | undefined;\n\n\t\tif (events !== undefined) {\n\t\t\tevents.dispatching = true;\n\n\t\t\ttry {\n\t\t\t\tf(events);\n\n\t\t\t} finally {\n\t\t\t\tevents.dispatching = false;\n\n\t\t\t\tif (events.cleanup) {\n\t\t\t\t\tevents.cleanup = false;\n\n\t\t\t\t\t$array.keepIf(events.callbacks, (callback) => {\n\t\t\t\t\t\treturn !callback.disposed;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (events.callbacks.length === 0) {\n\t\t\t\t\t\tevents.disposer.dispose();\n\t\t\t\t\t\tdelete this._events[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t_dispatchEventAll(key: Key, event: IRendererEvents[Key]): void {\n\t\tif (!this.interactionsEnabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._withEvents(key, (events) => {\n\t\t\t$array.each(events.callbacks, (callback) => {\n\t\t\t\tif (!callback.disposed) {\n\t\t\t\t\tcallback.callback.call(callback.context, event);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t_dispatchEvent(key: Key, target: CanvasDisplayObject, event: IRendererEvents[Key]): boolean {\n\t\tif (!this.interactionsEnabled) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet dispatched = false;\n\n\t\tthis._withEvents(key, (events) => {\n\t\t\t$array.each(events.callbacks, (callback) => {\n\t\t\t\tif (!callback.disposed && callback.object === target) {\n\t\t\t\t\tcallback.callback.call(callback.context, event);\n\t\t\t\t\tdispatched = true;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn dispatched;\n\t}\n\n\t_dispatchMousedown(originalEvent: IPointerEvent): void {\n\n\t\tconst button = (originalEvent).button;\n\t\tif (button != 0 && button != 2 && button != 1) {\n\t\t\t// Ignore non-primary mouse buttons\n\t\t\treturn;\n\t\t}\n\n\t\tconst event = this.getEvent(originalEvent);\n\t\tconst target = this._getHitTarget(event.point);\n\n\t\tif (target) {\n\t\t\tconst id = event.id;\n\n\t\t\tlet dragged = false;\n\n\t\t\teachTargets(target, (obj) => {\n\t\t\t\tconst info = { id: id, value: obj };\n\n\t\t\t\tthis._mousedown.push(info);\n\n\t\t\t\tif (!dragged && this._dispatchEvent(\"pointerdown\", obj, event)) {\n\t\t\t\t\t// Only dispatch the first element which matches\n\t\t\t\t\tdragged = true;\n\n\t\t\t\t\tconst has = this._dragging.some((x) => {\n\t\t\t\t\t\treturn x.value === obj && x.id === id;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!has) {\n\t\t\t\t\t\tthis._dragging.push(info);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\t_dispatchGlobalMousemove(originalEvent: IPointerEvent, native: boolean): void {\n\t\tconst event = this.getEvent(originalEvent);\n\n\t\tconst target = this._getHitTarget(event.point);\n\t\tevent.native = native;\n\n\t\tif (target) {\n\t\t\tthis._hovering.forEach((obj) => {\n\t\t\t\tif (!obj.contains(target)) {\n\t\t\t\t\tthis._hovering.delete(obj);\n\t\t\t\t\tif (obj.cursorOverStyle) {\n\t\t\t\t\t\t$utils.setStyle(document.body, \"cursor\", obj._replacedCursorStyle!);\n\t\t\t\t\t}\n\t\t\t\t\tthis._dispatchEvent(\"pointerout\", obj, event);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (event.native) {\n\t\t\t\teachTargets(target, (obj) => {\n\t\t\t\t\tif (!this._hovering.has(obj)) {\n\t\t\t\t\t\tthis._hovering.add(obj);\n\t\t\t\t\t\tif (obj.cursorOverStyle) {\n\t\t\t\t\t\t\tobj._replacedCursorStyle = $utils.getStyle(document.body, \"cursor\");\n\t\t\t\t\t\t\t$utils.setStyle(document.body, \"cursor\", obj.cursorOverStyle);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._dispatchEvent(\"pointerover\", obj, event);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t//} else if (target === false) {\n\t\t} else {\n\t\t\tthis._hovering.forEach((obj) => {\n\t\t\t\tif (obj.cursorOverStyle) {\n\t\t\t\t\t$utils.setStyle(document.body, \"cursor\", obj._replacedCursorStyle!);\n\t\t\t\t}\n\t\t\t\tthis._dispatchEvent(\"pointerout\", obj, event);\n\t\t\t});\n\n\t\t\tthis._hovering.clear();\n\t\t}\n\t\tthis._dispatchEventAll(\"globalpointermove\", event);\n\t}\n\n\t_dispatchGlobalMouseup(originalEvent: IPointerEvent, native: boolean): void {\n\t\tconst event = this.getEvent(originalEvent);\n\t\tevent.native = native;\n\t\t//const target = this._getHitTarget(event.point);\n\t\tthis._dispatchEventAll(\"globalpointerup\", event);\n\t}\n\n\t_dispatchDragMove(originalEvent: IPointerEvent): void {\n\t\tif (this._dragging.length !== 0) {\n\t\t\tconst event = this.getEvent(originalEvent);\n\t\t\tconst id = event.id;\n\n\t\t\tthis._dragging.forEach((obj) => {\n\t\t\t\tif (obj.id === id) {\n\t\t\t\t\tthis._dispatchEvent(\"pointermove\", obj.value, event);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_dispatchDragEnd(originalEvent: IPointerEvent): void {\n\n\t\tconst button = (originalEvent).button;\n\t\tlet clickevent: \"click\" | \"rightclick\" | \"middleclick\";\n\t\tif (button == 0) {\n\t\t\tclickevent = \"click\";\n\t\t}\n\t\telse if (button == 2) {\n\t\t\tclickevent = \"rightclick\";\n\t\t}\n\t\telse if (button == 1) {\n\t\t\tclickevent = \"middleclick\";\n\t\t}\n\t\telse {\n\t\t\t// Ignore non-primary mouse buttons\n\t\t\treturn;\n\t\t}\n\n\t\tconst event = this.getEvent(originalEvent);\n\t\tconst id = event.id;\n\n\t\tif (this._mousedown.length !== 0) {\n\t\t\tconst target = this._getHitTarget(event.point);\n\n\t\t\tif (target) {\n\t\t\t\tthis._mousedown.forEach((obj) => {\n\t\t\t\t\tif (obj.id === id && obj.value.contains(target)) {\n\t\t\t\t\t\tthis._dispatchEvent(clickevent, obj.value, event);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._mousedown.length = 0;\n\t\t}\n\n\t\tif (this._dragging.length !== 0) {\n\t\t\tthis._dragging.forEach((obj) => {\n\t\t\t\tif (obj.id === id) {\n\t\t\t\t\tthis._dispatchEvent(\"pointerup\", obj.value, event);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._dragging.length = 0;\n\t\t}\n\t}\n\n\t_dispatchDoubleClick(originalEvent: IPointerEvent): void {\n\t\tconst event = this.getEvent(originalEvent);\n\t\tconst target = this._getHitTarget(event.point);\n\n\t\tif (target) {\n\t\t\teachTargets(target, (obj) => {\n\t\t\t\tif (this._dispatchEvent(\"dblclick\", obj, event)) {\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_dispatchWheel(originalEvent: WheelEvent): void {\n\t\tconst event = this.getEvent(originalEvent);\n\t\tthis._hovering.forEach((obj) => {\n\t\t\tthis._dispatchEvent(\"wheel\", obj, event);\n\t\t});\n\t}\n\n\t_makeSharedEvent(key: string, f: () => IDisposer): IDisposer {\n\t\tif (this._listeners[key] === undefined) {\n\t\t\tconst listener = f();\n\n\t\t\tthis._listeners[key] = new CounterDisposer(() => {\n\t\t\t\tdelete this._listeners[key];\n\t\t\t\tlistener.dispose();\n\t\t\t});\n\t\t}\n\n\t\treturn this._listeners[key].increment();\n\t}\n\n\t_onPointerEvent(name: string, f: (event: IPointerEvent, native: boolean) => void): IDisposer {\n\t\tlet native = false;\n\t\tlet timer: number | null = null;\n\n\t\tfunction clear() {\n\t\t\ttimer = null;\n\t\t\tnative = false;\n\t\t}\n\n\t\treturn new MultiDisposer([\n\t\t\tnew Disposer(() => {\n\t\t\t\tif (timer !== null) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t}\n\n\t\t\t\tclear();\n\t\t\t}),\n\n\t\t\t$utils.addEventListener(this.view, $utils.getRendererEvent(name), (_) => {\n\t\t\t\tnative = true;\n\n\t\t\t\tif (timer !== null) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t}\n\n\t\t\t\ttimer = window.setTimeout(clear, 0);\n\t\t\t}),\n\n\t\t\tonPointerEvent(window, name, (ev) => {\n\t\t\t\tif (timer !== null) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = null;\n\t\t\t\t}\n\n\t\t\t\tf(ev, native);\n\n\t\t\t\tnative = false;\n\t\t\t}),\n\t\t]);\n\t}\n\n\t// This ensures that only a single DOM event is added (e.g. only a single mousemove event listener)\n\t_initEvent(key: keyof IRendererEvents): IDisposer | undefined {\n\t\tswitch (key) {\n\t\t\tcase \"globalpointermove\":\n\t\t\tcase \"pointerover\":\n\t\t\tcase \"pointerout\":\n\t\t\t\treturn this._makeSharedEvent(\"pointermove\", () => {\n\t\t\t\t\t//const throttler = new Throttler();\n\n\t\t\t\t\t// TODO handle throttling properly for multitouch\n\t\t\t\t\treturn this._onPointerEvent(\"pointermove\", (event, native) => {\n\t\t\t\t\t\tthis._lastPointerMoveEvent = { event, native };\n\t\t\t\t\t\tthis._mouseMoveThrottler.run();\n\t\t\t\t\t\t//throttler.throttle(() => {\n\t\t\t\t\t\t//});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\tcase \"globalpointerup\":\n\t\t\t\treturn this._makeSharedEvent(\"pointerup\", () => {\n\t\t\t\t\t//const throttler = new Throttler();\n\n\t\t\t\t\t// TODO handle throttling properly for multitouch\n\t\t\t\t\treturn this._onPointerEvent(\"pointerup\", (event, native) => {\n\t\t\t\t\t\t//throttler.throttle(() => {\n\t\t\t\t\t\tthis._dispatchGlobalMouseup(event, native);\n\t\t\t\t\t\tthis._lastPointerMoveEvent = { event, native };\n\t\t\t\t\t\t//});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\tcase \"click\":\n\t\t\tcase \"rightclick\":\n\t\t\tcase \"middleclick\":\n\t\t\tcase \"pointerdown\":\n\t\t\tcase \"pointermove\":\n\t\t\tcase \"pointerup\":\n\t\t\t\treturn this._makeSharedEvent(\"pointerdown\", () => {\n\t\t\t\t\t//const throttler = new Throttler();\n\n\t\t\t\t\tconst mousedown = onPointerEvent(this.view, \"pointerdown\", (ev: IPointerEvent) => {\n\t\t\t\t\t\tthis._dispatchMousedown(ev);\n\t\t\t\t\t});\n\n\t\t\t\t\t// TODO handle throttling properly for multitouch\n\t\t\t\t\tconst mousemove = this._onPointerEvent(\"pointermove\", (ev: IPointerEvent) => {\n\t\t\t\t\t\t//throttler.throttle(() => {\n\t\t\t\t\t\tthis._dispatchDragMove(ev);\n\t\t\t\t\t\t//});\n\t\t\t\t\t});\n\n\t\t\t\t\tconst mouseup = this._onPointerEvent(\"pointerup\", (ev: IPointerEvent) => {\n\t\t\t\t\t\tthis._dispatchDragEnd(ev);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn new Disposer(() => {\n\t\t\t\t\t\tmousedown.dispose();\n\t\t\t\t\t\tmousemove.dispose();\n\t\t\t\t\t\tmouseup.dispose();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\tcase \"dblclick\":\n\t\t\t\treturn this._makeSharedEvent(\"dblclick\", () => {\n\t\t\t\t\treturn this._onPointerEvent(\"dblclick\", (ev) => {\n\t\t\t\t\t\tthis._dispatchDoubleClick(ev);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\tcase \"wheel\":\n\t\t\t\treturn this._makeSharedEvent(\"wheel\", () => {\n\t\t\t\t\treturn $utils.addEventListener(window, $utils.getRendererEvent(\"wheel\"), (event: WheelEvent) => {\n\t\t\t\t\t\tthis._dispatchWheel(event);\n\t\t\t\t\t}, { passive: false });\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_addEvent(object: CanvasDisplayObject, key: Key, callback: (this: C, event: IRendererEvents[Key]) => void, context?: C): IDisposer {\n\t\tlet events: Events | undefined = this._events[key] as any;\n\n\t\tif (events === undefined) {\n\t\t\tevents = this._events[key] = {\n\t\t\t\tdisposer: this._initEvent(key)!,\n\t\t\t\tcallbacks: [],\n\t\t\t\tdispatching: false,\n\t\t\t\tcleanup: false,\n\t\t\t};\n\t\t}\n\n\t\tconst listener = { object, context, callback, disposed: false };\n\n\t\tevents!.callbacks.push(listener);\n\n\t\treturn new Disposer(() => {\n\t\t\tlistener.disposed = true;\n\n\t\t\tif (events!.dispatching) {\n\t\t\t\tevents!.cleanup = true;\n\n\t\t\t} else {\n\t\t\t\t$array.removeFirst(events!.callbacks, listener);\n\n\t\t\t\tif (events!.callbacks.length === 0) {\n\t\t\t\t\tevents!.disposer.dispose();\n\t\t\t\t\tdelete this._events[key];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getCanvas(root: CanvasDisplayObject, options?: ICanvasOptions): HTMLCanvasElement {\n\n\t\t// Make sure everything is rendered\n\t\tthis.render(root);\n\n\t\tif (!options) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tlet scale: number = this.resolution;\n\n\t\t// Check if we need to scale\n\t\tif (options.minWidth && (options.minWidth > this._width)) {\n\t\t\tlet minScale = options.minWidth / this._width;\n\t\t\tif (minScale > scale) {\n\t\t\t\tscale = minScale * this.resolution;\n\t\t\t}\n\t\t}\n\n\t\tif (options.minHeight && (options.minHeight > this._height)) {\n\t\t\tlet minScale = options.minHeight / this._height;\n\t\t\tif (minScale > scale) {\n\t\t\t\tscale = minScale * this.resolution;\n\t\t\t}\n\t\t}\n\n\t\tif (options.maxWidth && (options.maxWidth < this._width)) {\n\t\t\tlet maxScale = options.maxWidth / this._width;\n\t\t\tif (maxScale < scale) {\n\t\t\t\tscale = maxScale * this.resolution;\n\t\t\t}\n\t\t}\n\n\t\tif (options.maxHeight && (options.maxHeight > this._height)) {\n\t\t\tlet maxScale = options.maxHeight / this._height;\n\t\t\tif (maxScale < scale) {\n\t\t\t\tscale = maxScale * this.resolution;\n\t\t\t}\n\t\t}\n\n\t\t// Check if we need to compensate for pixel ratio\n\t\tif (options.maintainPixelRatio) {\n\t\t\tscale /= this.resolution;\n\t\t}\n\n\t\t// Set up new canvas for export\n\t\tlet forceRender = false;\n\t\tlet canvasWidth = this._width;\n\t\tlet canvasHeight = this._height;\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tif (scale != this.resolution) {\n\t\t\tforceRender = true;\n\t\t\tcanvasWidth = this._width * scale / this.resolution;\n\t\t\tcanvasHeight = this._height * scale / this.resolution;\n\t\t}\n\n\t\tcanvas.width = canvasWidth;\n\t\tcanvas.height = canvasHeight;\n\n\t\t// Context\n\t\tconst context = canvas.getContext(\"2d\")!;\n\n\t\tlet width = 0;\n\t\tlet height = 0;\n\t\tlet needRerender = false;\n\n\t\t$array.each(this.layers, (layer) => {\n\t\t\tif (layer && layer.visible) {\n\t\t\t\tif (layer.tainted || forceRender) {\n\t\t\t\t\tneedRerender = true;\n\n\t\t\t\t\tlayer.exportableView = layer.view;\n\t\t\t\t\tlayer.exportableContext = layer.context;\n\n\t\t\t\t\tlayer.view = document.createElement(\"canvas\");\n\t\t\t\t\tlayer.view.width = canvasWidth;\n\t\t\t\t\tlayer.view.height = canvasHeight;\n\n\t\t\t\t\tlayer.context = layer.view.getContext(\"2d\")!;\n\n\t\t\t\t\tlayer.dirty = true;\n\t\t\t\t\tlayer.scale = scale;\n\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (needRerender) {\n\t\t\tthis._omitTainted = true;\n\t\t\tthis.render(root);\n\t\t\tthis._omitTainted = false;\n\t\t}\n\n\t\t$array.each(this.layers, (layer) => {\n\t\t\tif (layer && layer.visible) {\n\n\t\t\t\t// Layer is fine. Just plop it into our target canvas\n\t\t\t\tcontext.drawImage(layer.view, 0, 0);\n\n\t\t\t\t// Restore layer original canvas\n\t\t\t\tif (layer.exportableView) {\n\t\t\t\t\tlayer.view = layer.exportableView;\n\t\t\t\t\tlayer.exportableView = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (layer.exportableContext) {\n\t\t\t\t\tlayer.context = layer.exportableContext;\n\t\t\t\t\tlayer.exportableContext = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (width < layer.view.clientWidth) {\n\t\t\t\t\twidth = layer.view.clientWidth;\n\t\t\t\t}\n\t\t\t\tif (height < layer.view.clientHeight) {\n\t\t\t\t\theight = layer.view.clientHeight;\n\t\t\t\t}\n\n\t\t\t\tlayer.scale = undefined;\n\t\t\t}\n\t\t});\n\n\t\tcanvas.style.width = width + \"px\";\n\t\tcanvas.style.height = height + \"px\";\n\n\t\treturn canvas;\n\t}\n\n}\n\n/**\n * @ignore\n */\nexport interface CanvasLayer extends ILayer {\n\tview: HTMLCanvasElement;\n\tcontext: CanvasRenderingContext2D;\n\ttainted?: boolean;\n\texportableView?: HTMLCanvasElement;\n\texportableContext?: CanvasRenderingContext2D;\n\tscale?: number;\n}\n","import type { IAnimation } from \"./util/Animation\";\nimport type { Entity } from \"./util/Entity\";\nimport type { Sprite } from \"./render/Sprite\";\nimport type { Text } from \"./render/Text\";\nimport type { Theme } from \"./Theme\";\nimport type { IPoint } from \"./util/IPoint\";\nimport type { IRenderer } from \"./render/backend/Renderer\";\n\nimport { Container } from \"./render/Container\";\nimport { HorizontalLayout } from \"./render/HorizontalLayout\";\nimport { VerticalLayout } from \"./render/VerticalLayout\";\nimport { GridLayout } from \"./render/GridLayout\";\nimport { IDisposer, Disposer } from \"./util/Disposer\";\nimport { ResizeSensor } from \"./util/ResizeSensor\";\nimport { InterfaceColors } from \"./util/InterfaceColors\";\nimport { Graphics } from \"./render/Graphics\";\nimport { Rectangle } from \"./render/Rectangle\";\nimport { Tooltip } from \"./render/Tooltip\";\nimport { NumberFormatter } from \"./util/NumberFormatter\";\nimport { DateFormatter } from \"./util/DateFormatter\";\nimport { DurationFormatter } from \"./util/DurationFormatter\";\nimport { ILocale, Language } from \"./util/Language\";\nimport { Events, EventDispatcher } from \"./util/EventDispatcher\";\nimport { DefaultTheme } from \"../themes/DefaultTheme\";\nimport { CanvasRenderer } from \"./render/backend/CanvasRenderer\";\nimport { p100, percent } from \"./util/Percent\";\nimport { color } from \"./util/Color\";\nimport { populateString } from \"./util/PopulateString\";\nimport { registry } from \"./Registry\";\n\nimport * as $order from \"./util/Order\";\nimport * as $array from \"./util/Array\";\nimport * as $object from \"./util/Object\";\nimport * as $utils from \"./util/Utils\";\n\nimport en from \"../../locales/en\";\n\n\nfunction rAF(fps: number | undefined, callback: (currentTime: number) => void): void {\n\tif (fps == null) {\n\t\trequestAnimationFrame(callback);\n\n\t} else {\n\t\tsetTimeout(() => {\n\t\t\trequestAnimationFrame(callback);\n\t\t}, 1000 / fps);\n\t}\n}\n\n\n/**\n * @ignore\n */\ninterface IParent extends Entity {\n\t_prepareChildren(): void;\n\t_updateChildren(): void;\n}\n\ninterface IBounds extends Entity {\n\tdepth(): number;\n\t_updateBounds(): void;\n}\n\n\nexport interface IRootEvents {\n\tframestarted: {\n\t\ttimestamp: number;\n\t};\n\tframeended: {\n\t\ttimestamp: number;\n\t};\n}\n\n\n// TODO implement Disposer\n/**\n * Root element of the chart.\n *\n * @see {@link https://www.amcharts.com/docs/v5/getting-started/#Root_element} for more info\n */\nexport class Root implements IDisposer {\n\n\t/**\n\t * A reference to original chart container (div element).\n\t */\n\tpublic dom: HTMLElement;\n\tpublic _inner: HTMLElement;\n\n\tprotected _isDirty: boolean = false;\n\tprotected _isDirtyParents: boolean = false;\n\tprotected _dirty: { [id: number]: Entity } = {};\n\tprotected _dirtyParents: { [id: number]: IParent } = {};\n\tprotected _dirtyBounds: { [id: number]: IBounds } = {};\n\tprotected _dirtyPositions: { [id: number]: Sprite } = {};\n\n\tprotected _ticker: ((currentTime: number) => void) | null = null;\n\tprotected _tickers: Array<(currentTime: number) => void> = [];\n\n\t/**\n\t * Root's event dispatcher.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/events/} for more info\n\t */\n\tpublic events: EventDispatcher> = new EventDispatcher();\n\n\t/**\n\t * @todo needs description\n\t */\n\tpublic animationTime: number | null = null;\n\n\tprivate _animations: Array = [];\n\n\tpublic _renderer: IRenderer = new CanvasRenderer();\n\n\tpublic _rootContainer!: Container;\n\n\t/**\n\t * Main content container.\n\t */\n\tpublic container!: Container;\n\n\t/**\n\t * A [[Container]] used to display tooltips in.\n\t */\n\tpublic tooltipContainer!: Container\n\n\tpublic _tooltip!: Tooltip;\n\n\t// Locale-related\n\n\t/**\n\t * @ignore\n\t */\n\tpublic language: Language = Language.new(this, {});\n\n\t/**\n\t * Locale used by the chart.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/locales/}\n\t */\n\tpublic locale: ILocale = en;\n\n\t// Date-time related\n\n\t/**\n\t * Use UTC when formatting date/time.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-dates/#UTC_and_time_zones} for more info\n\t */\n\tpublic utc: boolean = false;\n\n\t/**\n\t * Use specific time zone when formatting date/time.\n\t *\n\t * @ignore timezones are not yet supported\n\t */\n\tpublic timezone: string | null = null;\n\n\t/**\n\t * The maximum FPS that the Root will run at.\n\t *\n\t * If `undefined` it will run at the highest FPS.\n\t */\n\tpublic fps: number | undefined;\n\n\t/**\n\t * Number formatter.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-numbers/} for more info\n\t */\n\tpublic numberFormatter: NumberFormatter = NumberFormatter.new(this, {});\n\n\t/**\n\t * Date/time formatter.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-dates/} for more info\n\t */\n\tpublic dateFormatter: DateFormatter = DateFormatter.new(this, {});\n\n\t/**\n\t * Duration formatter.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-dates/} for more info\n\t */\n\tpublic durationFormatter: DurationFormatter = DurationFormatter.new(this, {});\n\n\n\t// Accessibility\n\n\t/**\n\t * Global tab index for using for the whole chart\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/accessibility/} for more info\n\t */\n\tpublic tabindex: number = 0;\n\n\t//@todo maybe make this better\n\tprotected _tabindexes: Sprite[] = [];\n\n\tprotected _focusElementDirty: boolean = false;\n\tprotected _focusElementContainer: HTMLDivElement | undefined;\n\tprotected _focusedSprite: Sprite | undefined;\n\tprotected _keyboardDragPoint: IPoint | undefined;\n\tprotected _tooltipElementContainer: HTMLDivElement | undefined;\n\tprotected _readerAlertElement: HTMLDivElement | undefined;\n\n\tpublic _logo?: Container;\n\n\t/**\n\t * Used for dynamically-created CSS and JavaScript with strict source policies.\n\t */\n\tpublic nonce?: string;\n\n\t/**\n\t * Special color set to be used for various controls.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/#Interface_colors} for more info\n\t */\n\tpublic interfaceColors: InterfaceColors;\n\n\t/**\n\t * An instance of vertical layout object that can be used to set `layout` setting\n\t * of a [[Container]].\n\t *\n\t * @default VerticalLayout.new()\n\t */\n\tpublic verticalLayout: VerticalLayout = VerticalLayout.new(this, {});\n\n\t/**\n\t * An instance of horizontal layout object that can be used to set `layout` setting\n\t * of a [[Container]].\n\t *\n\t * @default HorizontalLayout.new()\n\t */\n\tpublic horizontalLayout: VerticalLayout = HorizontalLayout.new(this, {});\n\n\t/**\n\t * An instance of grid layout object that can be used to set `layout` setting\n\t * of a [[Container]].\n\t *\n\t * @default VerticalLayout.new()\n\t */\n\tpublic gridLayout: VerticalLayout = GridLayout.new(this, {});\n\n\t/**\n\t * Indicates whether chart should resized automatically when parent container\n\t * width and/or height changes.\n\t *\n\t * If disabled (`autoResize = false`) you can make the chart resize manually\n\t * by calling root element's `resize()` method.\n\t */\n\tpublic autoResize: boolean = true;\n\n\tprotected _isDisposed: boolean = false;\n\tprotected _disposers: Array = [];\n\n\tprotected _resizeSensorDisposer?: IDisposer;\n\n\tpublic _tooltips: Array = [];\n\n\tprotected constructor(id: string | HTMLElement, isReal: boolean) {\n\n\t\tif (!isReal) {\n\t\t\tthrow new Error(\"You cannot use `new Class()`, instead use `Class.new()`\");\n\t\t}\n\n\t\tlet dom: HTMLElement | null;\n\n\t\tif (id instanceof HTMLElement) {\n\t\t\tdom = id;\n\t\t}\n\t\telse {\n\t\t\tdom = document.getElementById(id);\n\t\t}\n\n\t\t$array.each(registry.rootElements, (root) => {\n\t\t\tif (root.dom === dom) {\n\t\t\t\tthrow new Error(\"You cannot have multiple Roots on the same DOM node\");\n\t\t\t}\n\t\t});\n\n\t\tthis.interfaceColors = InterfaceColors.new(this, {});\n\n\t\tif (dom === null) {\n\t\t\tthrow new Error(\"Could not find HTML element with id `\" + id + \"`\");\n\t\t}\n\n\t\tthis.dom = dom;\n\n\t\tlet inner: HTMLDivElement = document.createElement(\"div\");\n\t\tinner.style.position = \"relative\";\n\t\tdom.appendChild(inner);\n\n\t\tthis._inner = inner;\n\n\t\tregistry.rootElements.push(this);\n\t}\n\n\tpublic static new(id: string | HTMLElement): Root {\n\t\tconst root = new Root(id, true);\n\t\troot._init();\n\t\treturn root;\n\t}\n\n\tpublic moveDOM(id: string | HTMLElement): void {\n\t\tlet dom: HTMLElement | null;\n\n\t\tif (id instanceof HTMLElement) {\n\t\t\tdom = id;\n\t\t}\n\t\telse {\n\t\t\tdom = document.getElementById(id);\n\t\t}\n\n\t\tif (dom) {\n\t\t\twhile (this.dom.childNodes.length > 0) {\n\t\t\t\tdom.appendChild(this.dom.childNodes[0]);\n\t\t\t}\n\t\t\tthis.dom = dom;\n\t\t\tthis._initResizeSensor();\n\t\t\tthis.resize();\n\t\t}\n\n\t}\n\n\n\tprotected _handleLogo(): void {\n\t\tif (this._logo) {\n\t\t\tif (this._rootContainer.getPrivate(\"width\", 0) <= 150 || this._rootContainer.getPrivate(\"height\", 0) <= 60) {\n\t\t\t\tthis._logo.hide();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._logo.show();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _showBranding(): void {\n\t\tif (!this._logo) {\n\t\t\tconst logo = this.tooltipContainer.children.push(Container.new(this, {\n\t\t\t\tinteractive: true,\n\t\t\t\tinteractiveChildren: false,\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tsetStateOnChildren: true,\n\t\t\t\tpaddingTop: 9,\n\t\t\t\tpaddingRight: 9,\n\t\t\t\tpaddingBottom: 9,\n\t\t\t\tpaddingLeft: 9,\n\t\t\t\tscale: .6,\n\t\t\t\ty: percent(100),\n\t\t\t\tcenterY: p100,\n\t\t\t\ttooltipText: \"Created using amCharts 5\",\n\t\t\t\ttooltipX: p100,\n\t\t\t\tcursorOverStyle: \"pointer\",\n\t\t\t\tbackground: Rectangle.new(this, {\n\t\t\t\t\tfill: color(0x474758),\n\t\t\t\t\tfillOpacity: 0,\n\t\t\t\t\ttooltipY: 5\n\t\t\t\t})\n\t\t\t}));\n\n\t\t\tconst tooltip = Tooltip.new(this, {\n\t\t\t\tpointerOrientation: \"horizontal\",\n\t\t\t\tpaddingTop: 4,\n\t\t\t\tpaddingRight: 7,\n\t\t\t\tpaddingBottom: 4,\n\t\t\t\tpaddingLeft: 7\n\t\t\t});\n\t\t\ttooltip.label.setAll({\n\t\t\t\tfontSize: 12\n\t\t\t});\n\t\t\ttooltip.get(\"background\")!.setAll({\n\t\t\t\tfill: this.interfaceColors.get(\"background\"),\n\t\t\t\tstroke: this.interfaceColors.get(\"grid\"),\n\t\t\t\tstrokeOpacity: 0.3\n\t\t\t})\n\t\t\tlogo.set(\"tooltip\", tooltip);\n\n\t\t\tlogo.events.on(\"click\", () => {\n\t\t\t\twindow.open(\"https://www.amcharts.com/\", \"_blank\");\n\t\t\t});\n\n\t\t\tlogo.states.create(\"hover\", {});\n\n\t\t\tconst m = logo.children.push(Graphics.new(this, {\n\t\t\t\tstroke: color(0xcccccc),\n\t\t\t\tstrokeWidth: 3,\n\t\t\t\tsvgPath: \"M5 25 L13 25h13.6c3.4 0 6 0 10.3-4.3s5.2-12 8.6-12c3.4 0 4.3 8.6 7.7 8.6M83.4 25H79.8c-3.4 0-6 0-10.3-4.3s-5.2-12-8.6-12-4.3 8.6-7.7 8.6\"\n\t\t\t}));\n\n\t\t\tm.states.create(\"hover\", { stroke: color(0x3CABFF) });\n\n\t\t\tconst a = logo.children.push(Graphics.new(this, {\n\t\t\t\tstroke: color(0x888888),\n\t\t\t\tstrokeWidth: 3,\n\t\t\t\tsvgPath: \"M83.4 25h-31C37 25 39.5 4.4 28.4 4.4S18.9 24.2 4.3 25H0\"\n\t\t\t}));\n\n\t\t\ta.states.create(\"hover\", { stroke: color(0x474758) });\n\n\t\t\t//logo.set(\"tooltip\", this._tooltip);\n\t\t\t//logo.setPrivate(\"tooltipTarget\", logo.get(\"background\"));\n\t\t\tthis._logo = logo;\n\n\t\t\tthis._handleLogo();\n\t\t}\n\t}\n\n\tprotected _init(): void {\n\t\tconst renderer = this._renderer;\n\t\tconst rootContainer = Container.new(this, { visible: true, width: this.dom.clientWidth, height: this.dom.clientHeight });\n\t\tthis._rootContainer = rootContainer;\n\t\tthis._rootContainer._defaultThemes.push(DefaultTheme.new(this));\n\n\t\tconst container = rootContainer.children.push(Container.new(this, { visible: true, width: p100, height: p100 }));\n\t\tthis.container = container;\n\n\t\trenderer.resize(this.dom.clientWidth, this.dom.clientHeight);\n\n\t\t//@todo: better appendChild - refer\n\t\tthis._inner.appendChild(renderer.view);\n\n\t\t// TODO: TMP TMP TMP for testing only, remove\n\t\t//document.body.appendChild((renderer)._ghostView);\n\n\t\tthis._initResizeSensor();\n\n\t\t// Create element which is used to make announcements to screen reader\n\t\tconst readerAlertElement = document.createElement(\"div\");\n\t\treaderAlertElement.setAttribute(\"role\", \"alert\");\n\t\treaderAlertElement.style.zIndex = \"-100000\";\n\t\treaderAlertElement.style.opacity = \"0\";\n\t\treaderAlertElement.style.position = \"absolute\";\n\t\treaderAlertElement.style.top = \"0\";\n\t\tthis._readerAlertElement = readerAlertElement;\n\t\tthis._inner.appendChild(this._readerAlertElement);\n\n\t\tconst focusElementContainer = document.createElement(\"div\");\n\t\tfocusElementContainer.style.position = \"absolute\";\n\t\tfocusElementContainer.style.pointerEvents = \"none\";\n\t\tfocusElementContainer.style.top = \"0px\";\n\t\tfocusElementContainer.style.left = \"0px\";\n\t\tfocusElementContainer.style.overflow = \"hidden\";\n\t\tfocusElementContainer.style.width = this.dom.clientWidth + \"px\";\n\t\tfocusElementContainer.style.height = this.dom.clientHeight + \"px\";\n\n\t\tfocusElementContainer.setAttribute(\"role\", \"application\");\n\n\t\t$utils.setInteractive(focusElementContainer, false);\n\t\tthis._focusElementContainer = focusElementContainer;\n\t\tthis._inner.appendChild(this._focusElementContainer);\n\n\t\tthis._tooltipElementContainer = document.createElement(\"div\");\n\t\tthis._inner.appendChild(this._tooltipElementContainer);\n\n\t\t// Add keyboard events for accessibility, e.g. simulating drag with arrow\n\t\t// keys and click with ENTER\n\t\tif ($utils.supports(\"keyboardevents\")) {\n\t\t\tthis._disposers.push($utils.addEventListener(focusElementContainer, \"keydown\", (ev: KeyboardEvent) => {\n\t\t\t\tconst focusedSprite = this._focusedSprite;\n\t\t\t\tif (focusedSprite) {\n\t\t\t\t\tif (ev.keyCode == 27) {\n\t\t\t\t\t\t// ESC pressed - lose current focus\n\t\t\t\t\t\t$utils.blur();\n\t\t\t\t\t\tthis._focusedSprite = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tlet dragOffsetX = 0;\n\t\t\t\t\tlet dragOffsetY = 0;\n\t\t\t\t\t// TODO: figure out if using bogus MouseEvent is fine, or it will\n\t\t\t\t\t// fail on some platforms\n\t\t\t\t\tswitch (ev.keyCode) {\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t\tconst downEvent = renderer.getEvent(new MouseEvent(\"click\"));\n\t\t\t\t\t\t\tfocusedSprite.events.dispatch(\"click\", {\n\t\t\t\t\t\t\t\ttype: \"click\",\n\t\t\t\t\t\t\t\toriginalEvent: downEvent.event,\n\t\t\t\t\t\t\t\tpoint: downEvent.point,\n\t\t\t\t\t\t\t\tsimulated: true,\n\t\t\t\t\t\t\t\ttarget: focusedSprite\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tcase 37:\n\t\t\t\t\t\t\tdragOffsetX = -6;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 39:\n\t\t\t\t\t\t\tdragOffsetX = 6;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 38:\n\t\t\t\t\t\t\tdragOffsetY = -6;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 40:\n\t\t\t\t\t\t\tdragOffsetY = 6;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dragOffsetX != 0 || dragOffsetY != 0) {\n\t\t\t\t\t\tev.preventDefault();\n\n\t\t\t\t\t\tif (!focusedSprite.isDragging()) {\n\t\t\t\t\t\t\t// Start dragging\n\t\t\t\t\t\t\tthis._keyboardDragPoint = {\n\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\ty: 0\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst downEvent = renderer.getEvent(new MouseEvent(\"mousedown\", {\n\t\t\t\t\t\t\t\tclientX: 0,\n\t\t\t\t\t\t\t\tclientY: 0\n\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\tif (focusedSprite.events.isEnabled(\"pointerdown\")) {\n\t\t\t\t\t\t\t\tfocusedSprite.events.dispatch(\"pointerdown\", {\n\t\t\t\t\t\t\t\t\ttype: \"pointerdown\",\n\t\t\t\t\t\t\t\t\toriginalEvent: downEvent.event,\n\t\t\t\t\t\t\t\t\tpoint: downEvent.point,\n\t\t\t\t\t\t\t\t\tsimulated: true,\n\t\t\t\t\t\t\t\t\ttarget: focusedSprite\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Move focus marker\n\t\t\t\t\t\t\t//this._positionFocusElement(focusedSprite);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Move incrementally\n\t\t\t\t\t\tconst dragPoint = this._keyboardDragPoint!;\n\t\t\t\t\t\tdragPoint.x += dragOffsetX;\n\t\t\t\t\t\tdragPoint.y += dragOffsetY;\n\t\t\t\t\t\tconst moveEvent = renderer.getEvent(new MouseEvent(\"mousemove\", {\n\t\t\t\t\t\t\tclientX: dragPoint.x,\n\t\t\t\t\t\t\tclientY: dragPoint.y\n\t\t\t\t\t\t}), false);\n\n\t\t\t\t\t\tif (focusedSprite.events.isEnabled(\"globalpointermove\")) {\n\t\t\t\t\t\t\tfocusedSprite.events.dispatch(\"globalpointermove\", {\n\t\t\t\t\t\t\t\ttype: \"globalpointermove\",\n\t\t\t\t\t\t\t\toriginalEvent: moveEvent.event,\n\t\t\t\t\t\t\t\tpoint: moveEvent.point,\n\t\t\t\t\t\t\t\tsimulated: true,\n\t\t\t\t\t\t\t\ttarget: focusedSprite\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t\tthis._disposers.push($utils.addEventListener(focusElementContainer, \"keyup\", (ev: KeyboardEvent) => {\n\t\t\t\tif (this._focusedSprite) {\n\t\t\t\t\tconst focusedSprite = this._focusedSprite;\n\t\t\t\t\tconst keyCode = ev.keyCode;\n\t\t\t\t\tswitch (keyCode) {\n\t\t\t\t\t\tcase 37:\n\t\t\t\t\t\tcase 39:\n\t\t\t\t\t\tcase 38:\n\t\t\t\t\t\tcase 40:\n\t\t\t\t\t\t\tif (focusedSprite.isDragging()) {\n\t\t\t\t\t\t\t\t// Simulate drag stop\n\t\t\t\t\t\t\t\tconst dragPoint = this._keyboardDragPoint!;\n\t\t\t\t\t\t\t\tconst upEvent = renderer.getEvent(new MouseEvent(\"mouseup\", {\n\t\t\t\t\t\t\t\t\tclientX: dragPoint.x,\n\t\t\t\t\t\t\t\t\tclientY: dragPoint.y\n\t\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t\tif (focusedSprite.events.isEnabled(\"globalpointerup\")) {\n\t\t\t\t\t\t\t\t\tfocusedSprite.events.dispatch(\"globalpointerup\", {\n\t\t\t\t\t\t\t\t\t\ttype: \"globalpointerup\",\n\t\t\t\t\t\t\t\t\t\toriginalEvent: upEvent.event,\n\t\t\t\t\t\t\t\t\t\tpoint: upEvent.point,\n\t\t\t\t\t\t\t\t\t\tsimulated: true,\n\t\t\t\t\t\t\t\t\t\ttarget: focusedSprite\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//this._positionFocusElement(focusedSprite);\n\t\t\t\t\t\t\t\tthis._keyboardDragPoint = undefined;\n\t\t\t\t\t\t\t\t// @todo dispatch mouseup event instead of calling dragStop?\n\t\t\t\t\t\t\t\t// this._dispatchEvent(\"globalpointerup\", target, upEvent);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(focusedSprite.get(\"focusableGroup\")) {\n\t\t\t\t\t\t\t\t// Find next item in focusable group\n\t\t\t\t\t\t\t\tconst group = focusedSprite.get(\"focusableGroup\");\n\t\t\t\t\t\t\t\tconst items = this._tabindexes.filter(item => item.get(\"focusableGroup\") == group);\n\t\t\t\t\t\t\t\tlet index = items.indexOf(focusedSprite);\n\t\t\t\t\t\t\t\tconst lastIndex = items.length - 1;\n\t\t\t\t\t\t\t\tindex += (keyCode == 39 || keyCode == 40) ? 1 : -1;\n\t\t\t\t\t\t\t\tif (index < 0) {\n\t\t\t\t\t\t\t\t\tindex = lastIndex;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (index > lastIndex) {\n\t\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$utils.focus(items[index].getPrivate(\"focusElement\")!.dom);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._startTicker();\n\t\tthis.setThemes([]);\n\n\t\tthis._addTooltip();\n\n\t\tif (!this._hasLicense()) {\n\t\t\tthis._showBranding();\n\t\t}\n\t}\n\n\tprivate _initResizeSensor(): void {\n\t\tif (this._resizeSensorDisposer) {\n\t\t\tthis._resizeSensorDisposer.dispose();\n\t\t}\n\t\tthis._resizeSensorDisposer = new ResizeSensor(this.dom, () => {\n\t\t\tif (this.autoResize) {\n\t\t\t\tthis.resize();\n\t\t\t}\n\t\t});\n\t\tthis._disposers.push(this._resizeSensorDisposer);\n\t}\n\n\t/**\n\t * If automatic resizing of char is disabled (`root.autoResize = false`), it\n\t * can be resized manually by calling this method.\n\t */\n\tpublic resize(): void {\n\t\tconst dom = this.dom;\n\t\tconst w = dom.clientWidth;\n\t\tconst h = dom.clientHeight;\n\t\tif (w > 0 && h > 0) {\n\t\t\tconst focusElementContainer = this._focusElementContainer!;\n\n\t\t\tfocusElementContainer.style.width = w + \"px\";\n\t\t\tfocusElementContainer.style.height = h + \"px\";\n\n\t\t\tthis._renderer.resize(w, h);\n\n\t\t\tconst rootContainer = this._rootContainer;\n\n\t\t\trootContainer.setPrivate(\"width\", w);\n\t\t\trootContainer.setPrivate(\"height\", h);\n\t\t\tthis._render();\n\t\t\tthis._handleLogo();\n\t\t}\n\t}\n\n\tprivate _render() {\n\t\tthis._renderer.render(this._rootContainer._display);\n\n\t\tif (this._focusElementDirty) {\n\t\t\tthis._updateCurrentFocus();\n\t\t\tthis._focusElementDirty = false;\n\t\t}\n\t}\n\n\tprivate _runTickers(currentTime: number) {\n\t\t$array.each(this._tickers, (f) => {\n\t\t\tf(currentTime);\n\t\t});\n\t}\n\n\tprivate _runAnimations(currentTime: number) {\n\t\t$array.keepIf(this._animations, (animation) => {\n\t\t\treturn !animation._runAnimation(currentTime);\n\t\t});\n\t}\n\n\tprivate _runDirties() {\n\t\t//console.log(\"tick **************************************************************\");\n\t\tlet allParents: { [id: number]: IParent } = {};\n\n\t\twhile (this._isDirtyParents) {\n\t\t\t// This must be before calling _prepareChildren\n\t\t\tthis._isDirtyParents = false;\n\n\t\t\t$object.keys(this._dirtyParents).forEach((key) => {\n\t\t\t\tconst parent = this._dirtyParents[key];\n\n\t\t\t\tdelete this._dirtyParents[key];\n\n\t\t\t\tif (!parent.isDisposed()) {\n\t\t\t\t\tallParents[parent.uid] = parent;\n\t\t\t\t\tparent._prepareChildren();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t$object.keys(allParents).forEach((key) => {\n\t\t\tallParents[key]._updateChildren();\n\t\t});\n\n\t\tconst objects: Array = [];\n\n\t\t//\t\tconsole.log(\"_beforeChanged\")\n\t\t$object.keys(this._dirty).forEach((key) => {\n\t\t\tconst entity = this._dirty[key];\n\n\t\t\tif (entity.isDisposed()) {\n\t\t\t\tdelete this._dirty[entity.uid];\n\n\t\t\t} else {\n\t\t\t\tobjects.push(entity);\n\t\t\t\tentity._beforeChanged();\n\t\t\t}\n\t\t});\n\n\t\t//\t\tconsole.log(\"_changed\")\n\t\tobjects.forEach((entity) => {\n\t\t\tentity._changed();\n\t\t\tdelete this._dirty[entity.uid];\n\t\t\tentity._clearDirty();\n\t\t});\n\n\t\tthis._isDirty = false;\n\n\t\tconst depths: { [id: number]: number } = {};\n\t\tconst bounds: Array = [];\n\n\t\t$object.keys(this._dirtyBounds).forEach((key) => {\n\t\t\tconst entity = this._dirtyBounds[key];\n\n\t\t\tdelete this._dirtyBounds[key];\n\n\t\t\tif (!entity.isDisposed()) {\n\t\t\t\tdepths[entity.uid] = entity.depth();\n\t\t\t\tbounds.push(entity);\n\t\t\t}\n\t\t});\n\n\t\t// High depth -> low depth\n\t\tbounds.sort((x, y) => {\n\t\t\treturn $order.compare(depths[y.uid], depths[x.uid]);\n\t\t});\n\n\t\t//\t\tconsole.log(\"_updateBounds\")\n\t\tbounds.forEach((entity) => {\n\t\t\tentity._updateBounds();\n\t\t});\n\n\t\t//\t\tconsole.log(\"_updatePosition\")\n\t\tconst dirtyPositions = this._dirtyPositions;\n\t\t$object.keys(dirtyPositions).forEach((key) => {\n\t\t\tconst sprite = dirtyPositions[key];\n\n\t\t\tdelete dirtyPositions[key];\n\n\t\t\tif (!sprite.isDisposed()) {\n\t\t\t\tsprite._updatePosition();\n\t\t\t}\n\t\t});\n\n\t\t//\t\tconsole.log(\"_afterChanged\")\n\t\tobjects.forEach((entity) => {\n\t\t\tentity._afterChanged();\n\t\t});\n\n\t}\n\n\tprivate _runTicker(currentTime: number) {\n\t\tif (!this.isDisposed()) {\n\t\t\tthis.animationTime = currentTime;\n\n\t\t\tif (this.events.isEnabled(\"framestarted\")) {\n\t\t\t\tthis.events.dispatch(\"framestarted\", {\n\t\t\t\t\ttype: \"framestarted\",\n\t\t\t\t\ttarget: this,\n\t\t\t\t\ttimestamp: currentTime,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._runTickers(currentTime);\n\t\t\tthis._runAnimations(currentTime);\n\t\t\tthis._runDirties();\n\t\t\tthis._render();\n\n\t\t\tif (this.events.isEnabled(\"frameended\")) {\n\t\t\t\tthis.events.dispatch(\"frameended\", {\n\t\t\t\t\ttype: \"frameended\",\n\t\t\t\t\ttarget: this,\n\t\t\t\t\ttimestamp: currentTime,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// No more work to do\n\t\t\tif (this._tickers.length === 0 &&\n\t\t\t\tthis._animations.length === 0 &&\n\t\t\t\t!this._isDirty) {\n\n\t\t\t\tthis._ticker = null;\n\t\t\t\tthis.animationTime = null;\n\n\t\t\t} else {\n\t\t\t\trAF(this.fps, this._ticker!);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _startTicker() {\n\t\tif (this._ticker === null) {\n\t\t\tthis.animationTime = null;\n\n\t\t\tthis._ticker = (currentTime) => {\n\t\t\t\tthis._runTicker(currentTime);\n\t\t\t};\n\n\t\t\trAF(this.fps, this._ticker!);\n\t\t}\n\t}\n\n\tpublic _addDirtyEntity(entity: Entity) {\n\t\tif (this._dirty[entity.uid] === undefined) {\n\t\t\tthis._isDirty = true;\n\t\t\tthis._dirty[entity.uid] = entity;\n\t\t\tthis._startTicker();\n\t\t}\n\t}\n\n\tpublic _addDirtyParent(parent: IParent) {\n\t\tif (this._dirtyParents[parent.uid] === undefined) {\n\t\t\tthis._isDirty = true;\n\t\t\tthis._isDirtyParents = true;\n\t\t\tthis._dirtyParents[parent.uid] = parent;\n\t\t\tthis._startTicker();\n\t\t}\n\t}\n\n\tpublic _addDirtyBounds(entity: IBounds) {\n\t\tif (this._dirtyBounds[entity.uid] === undefined) {\n\t\t\tthis._isDirty = true;\n\t\t\tthis._dirtyBounds[entity.uid] = entity;\n\t\t\tthis._startTicker();\n\t\t}\n\t}\n\n\tpublic _addDirtyPosition(sprite: Sprite) {\n\t\tif (this._dirtyPositions[sprite.uid] === undefined) {\n\t\t\tthis._isDirty = true;\n\t\t\tthis._dirtyPositions[sprite.uid] = sprite;\n\t\t\tthis._startTicker();\n\t\t}\n\t}\n\n\tpublic _addAnimation(animation: IAnimation) {\n\t\t// TODO use numeric id instead\n\t\tif (this._animations.indexOf(animation) === -1) {\n\t\t\tthis._animations.push(animation);\n\t\t\tthis._startTicker();\n\t\t}\n\t}\n\n\tpublic eachFrame(f: (currentTime: number) => void): IDisposer {\n\t\tthis._tickers.push(f);\n\t\tthis._startTicker();\n\n\t\treturn new Disposer(() => {\n\t\t\t$array.removeFirst(this._tickers, f);\n\t\t});\n\t}\n\n\t/**\n\t * Returns width of the target container, in pixels.\n\t *\n\t * @return Width\n\t */\n\tpublic width(): number {\n\t\treturn this.dom.clientWidth;\n\t}\n\n\t/**\n\t * Returns height of the target container, in pixels.\n\t *\n\t * @return Height\n\t */\n\tpublic height(): number {\n\t\treturn this.dom.clientHeight;\n\t}\n\n\t/**\n\t * Disposes root and all the content in it.\n\t */\n\tpublic dispose(): void {\n\t\tif (!this._isDisposed) {\n\t\t\tthis._isDisposed = true;\n\n\t\t\tthis._rootContainer.dispose();\n\t\t\tthis._renderer.dispose();\n\t\t\tthis.horizontalLayout.dispose();\n\t\t\tthis.verticalLayout.dispose();\n\t\t\tthis.interfaceColors.dispose();\n\n\t\t\t$array.each(this._disposers, (x) => {\n\t\t\t\tx.dispose();\n\t\t\t});\n\n\t\t\tif (this._inner) {\n\t\t\t\t$utils.removeElement(this._inner);\n\t\t\t}\n\n\t\t\t$array.remove(registry.rootElements, this);\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if root element is disposed.\n\t *\n\t * @return Disposed?\n\t */\n\tpublic isDisposed(): boolean {\n\t\treturn this._isDisposed;\n\t}\n\n\t/**\n\t * Triggers screen reader read out a message.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/accessibility/} for more info\n\t * @param text Alert text\n\t */\n\tpublic readerAlert(text: string): void {\n\t\tthis._readerAlertElement!.innerHTML = text;\n\t}\n\n\t/**\n\t * Sets themes to be used for the chart.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/themes/} for more info\n\t * @param themes A list of themes\n\t */\n\tpublic setThemes(themes: Array): void {\n\t\tthis._rootContainer.set(\"themes\", themes);\n\n\t\t// otherwise new themes are not applied\n\t\tconst tooltipContainer = this.tooltipContainer;\n\t\tif (tooltipContainer) {\n\t\t\ttooltipContainer._applyThemes();\n\t\t}\n\n\t\t// @todo review this\n\t\tconst interfaceColors = this.interfaceColors;\n\t\tif (interfaceColors) {\n\t\t\tinterfaceColors._applyThemes();\n\t\t}\n\t}\n\n\tprotected _addTooltip() {\n\t\tif (!this.tooltipContainer) {\n\t\t\tconst tooltipContainer = this._rootContainer.children.push(Container.new(this, { position: \"absolute\", isMeasured: false, width: p100, height: p100, layer: 100 }));\n\t\t\tthis.tooltipContainer = tooltipContainer;\n\n\t\t\tconst tooltip = Tooltip.new(this, {});\n\t\t\tthis.container.set(\"tooltip\", tooltip);\n\t\t\ttooltip.hide(0);\n\t\t\tthis._tooltip = tooltip;\n\t\t}\n\t}\n\n\t/**\n\t * Accesibility\n\t */\n\n\tpublic _registerTabindexOrder(target: Sprite): void {\n\t\tif (target.get(\"focusable\")) {\n\t\t\t$array.pushOne(this._tabindexes, target);\n\t\t}\n\t\telse {\n\t\t\t$array.remove(this._tabindexes, target);\n\t\t}\n\t\tthis._invalidateTabindexes();\n\t}\n\n\tpublic _unregisterTabindexOrder(target: Sprite): void {\n\t\t$array.remove(this._tabindexes, target);\n\t\tthis._invalidateTabindexes();\n\t}\n\n\tpublic _invalidateTabindexes(): void {\n\n\t\tthis._tabindexes.sort((a: Sprite, b: Sprite) => {\n\t\t\tconst aindex = a.get(\"tabindexOrder\", 0);\n\t\t\tconst bindex = b.get(\"tabindexOrder\", 0);\n\t\t\tif (aindex == bindex) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (aindex > bindex) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t});\n\n\t\tconst groups: Array = [];\n\t\t$array.each(this._tabindexes, (item, index) => {\n\t\t\tif (!item.getPrivate(\"focusElement\")) {\n\t\t\t\tthis._makeFocusElement(index, item);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._moveFocusElement(index, item);\n\t\t\t}\n\t\t\tconst group = item.get(\"focusableGroup\");\n\t\t\tif (group) {\n\t\t\t\tif (groups.indexOf(group) !== -1) {\n\t\t\t\t\t// Non-first element in the group, make it not directly focusable\n\t\t\t\t\titem.getPrivate(\"focusElement\")!.dom.setAttribute(\"tabindex\", \"-1\");\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tgroups.push(group);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t}\n\n\tpublic _updateCurrentFocus(): void {\n\t\tif (this._focusedSprite) {\n\t\t\tthis._decorateFocusElement(this._focusedSprite);\n\t\t\tthis._positionFocusElement(this._focusedSprite);\n\t\t}\n\t}\n\n\tpublic _decorateFocusElement(target: Sprite, focusElement?: HTMLDivElement): void {\n\n\t\t// Decorate with proper accessibility attributes\n\t\tif (!focusElement) {\n\t\t\tfocusElement = target.getPrivate(\"focusElement\")!.dom;\n\t\t}\n\n\t\tif (!focusElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (target.get(\"visible\") && target.get(\"role\") != \"tooltip\" && !target.isHidden()) {\n\t\t\tif (focusElement.getAttribute(\"tabindex\") != \"-1\") {\n\t\t\t\tfocusElement.setAttribute(\"tabindex\", \"\" + this.tabindex);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"tabindex\")\n\t\t}\n\n\t\tconst role = target.get(\"role\");\n\t\tif (role) {\n\t\t\tfocusElement.setAttribute(\"role\", role);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"role\");\n\t\t}\n\n\t\tconst ariaLabel = target.get(\"ariaLabel\");\n\t\tif (ariaLabel) {\n\t\t\tconst label = populateString(target, ariaLabel);\n\t\t\tfocusElement.setAttribute(\"aria-label\", label);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-label\");\n\t\t}\n\n\t\tconst ariaLive = target.get(\"ariaLive\");\n\t\tif (ariaLive) {\n\t\t\tfocusElement.setAttribute(\"aria-live\", ariaLive);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-live\");\n\t\t}\n\n\t\tconst ariaChecked = target.get(\"ariaChecked\");\n\t\tif (ariaChecked != null) {\n\t\t\tfocusElement.setAttribute(\"aria-checked\", ariaChecked ? \"true\" : \"false\");\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-checked\");\n\t\t}\n\n\t\tif (target.get(\"ariaHidden\")) {\n\t\t\tfocusElement.setAttribute(\"aria-hidden\", \"hidden\");\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-hidden\");\n\t\t}\n\n\t\tconst ariaOrientation = target.get(\"ariaOrientation\");\n\t\tif (ariaOrientation) {\n\t\t\tfocusElement.setAttribute(\"aria-orientation\", ariaOrientation);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-orientation\");\n\t\t}\n\n\t\tconst ariaValueNow = target.get(\"ariaValueNow\");\n\t\tif (ariaValueNow) {\n\t\t\tfocusElement.setAttribute(\"aria-valuenow\", ariaValueNow);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-valuenow\");\n\t\t}\n\n\t\tconst ariaValueMin = target.get(\"ariaValueMin\");\n\t\tif (ariaValueMin) {\n\t\t\tfocusElement.setAttribute(\"aria-valuemin\", ariaValueMin);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-valuemin\");\n\t\t}\n\n\t\tconst ariaValueMax = target.get(\"ariaValueMax\");\n\t\tif (ariaValueMax) {\n\t\t\tfocusElement.setAttribute(\"aria-valuemax\", ariaValueMax);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-valuemax\");\n\t\t}\n\n\t\tconst ariaValueText = target.get(\"ariaValueText\");\n\t\tif (ariaValueText) {\n\t\t\tfocusElement.setAttribute(\"aria-valuetext\", ariaValueText);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-valuetext\");\n\t\t}\n\n\t\tconst ariaControls = target.get(\"ariaControls\");\n\t\tif (ariaControls) {\n\t\t\tfocusElement.setAttribute(\"aria-controls\", ariaControls);\n\t\t}\n\t\telse {\n\t\t\tfocusElement.removeAttribute(\"aria-controls\");\n\t\t}\n\t}\n\n\tpublic _makeFocusElement(index: number, target: Sprite): void {\n\n\t\tif (target.getPrivate(\"focusElement\")) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Init\n\t\tconst focusElement = document.createElement(\"div\");\n\t\tif (target.get(\"role\") != \"tooltip\") {\n\t\t\tfocusElement.tabIndex = this.tabindex;\n\t\t}\n\t\tfocusElement.style.position = \"absolute\";\n\t\t$utils.setInteractive(focusElement, false);\n\n\t\tconst disposers: Array = [];\n\n\t\ttarget.setPrivate(\"focusElement\", {\n\t\t\tdom: focusElement,\n\t\t\tdisposers,\n\t\t});\n\n\t\tthis._decorateFocusElement(target);\n\n\t\tdisposers.push($utils.addEventListener(focusElement, \"focus\", (ev: FocusEvent) => {\n\t\t\tthis._handleFocus(ev, index);\n\t\t}));\n\n\t\tdisposers.push($utils.addEventListener(focusElement, \"blur\", (ev: FocusEvent) => {\n\t\t\tthis._handleBlur(ev, index);\n\t\t}));\n\n\t\tthis._moveFocusElement(index, target);\n\n\t}\n\n\tpublic _removeFocusElement(target: Sprite): void {\n\n\t\t// Init\n\t\tconst container = this._focusElementContainer!;\n\t\tconst focusElement = target.getPrivate(\"focusElement\")!;\n\t\tcontainer.removeChild(focusElement.dom);\n\t\t$array.each(focusElement.disposers, (x) => {\n\t\t\tx.dispose();\n\t\t});\n\t}\n\n\tprotected _moveFocusElement(index: number, target: Sprite): void {\n\n\t\t// Get container\n\t\tconst container = this._focusElementContainer!;\n\t\tconst focusElement = target.getPrivate(\"focusElement\")!.dom;\n\n\t\tif (focusElement === this._focusElementContainer!.children[index]) {\n\t\t\t// Nothing to do\n\t\t\treturn;\n\t\t}\n\n\t\tconst next = this._focusElementContainer!.children[index + 1];\n\t\tif (next) {\n\t\t\tcontainer.insertBefore(focusElement, next);\n\t\t}\n\t\telse {\n\t\t\tcontainer.append(focusElement);\n\t\t}\n\t}\n\n\tprotected _positionFocusElement(target: Sprite): void {\n\t\tconst bounds = target.globalBounds();\n\n\t\tconst width = bounds.right == bounds.left ? target.width() : bounds.right - bounds.left;\n\t\tconst height = bounds.top == bounds.bottom ? target.height() : bounds.bottom - bounds.top;\n\n\t\tconst focusElement = target.getPrivate(\"focusElement\")!.dom;\n\t\tfocusElement.style.top = (bounds.top - 2) + \"px\";\n\t\tfocusElement.style.left = (bounds.left - 2) + \"px\";\n\t\tfocusElement.style.width = (width + 4) + \"px\";\n\t\tfocusElement.style.height = (height + 4) + \"px\";\n\n\t}\n\n\tprotected _handleFocus(ev: FocusEvent, index: number): void {\n\t\t// Get element\n\t\tconst focused = this._tabindexes[index];\n\n\t\t// Size and position\n\t\tthis._positionFocusElement(focused);\n\t\t//this._decorateFocusElement(focused);\n\n\t\tthis._focusedSprite = focused;\n\n\t\tif (focused.events.isEnabled(\"focus\")) {\n\t\t\tfocused.events.dispatch(\"focus\", {\n\t\t\t\ttype: \"focus\",\n\t\t\t\toriginalEvent: ev,\n\t\t\t\ttarget: focused\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _handleBlur(ev: FocusEvent, _index: number): void {\n\t\tconst focused = this._focusedSprite;\n\t\tif (focused && focused.events.isEnabled(\"blur\")) {\n\t\t\tfocused.events.dispatch(\"blur\", {\n\t\t\t\ttype: \"blur\",\n\t\t\t\toriginalEvent: ev,\n\t\t\t\ttarget: focused\n\t\t\t});\n\t\t}\n\t\tthis._focusedSprite = undefined;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateTooltip(target: Text): void {\n\t\tconst text = target._getText();\n\t\tlet tooltipElement = target.getPrivate(\"tooltipElement\");\n\t\tif (target.get(\"role\") == \"tooltip\" && text != \"\") {\n\t\t\tif (!tooltipElement) {\n\t\t\t\ttooltipElement = this._makeTooltipElement(target);\n\t\t\t}\n\t\t\tif (tooltipElement.innerHTML != text) {\n\t\t\t\ttooltipElement.innerHTML = text!;\n\t\t\t}\n\t\t}\n\t\telse if (tooltipElement) {\n\t\t\ttooltipElement.remove();\n\t\t\ttarget.removePrivate(\"tooltipElement\");\n\t\t}\n\t}\n\n\tpublic _makeTooltipElement(target: Text): HTMLDivElement {\n\t\tconst container = this._tooltipElementContainer!;\n\t\tconst tooltipElement = document.createElement(\"div\");\n\t\ttooltipElement.style.position = \"absolute\";\n\t\ttooltipElement.style.opacity = \"0.0000001\";\n\n\t\t$utils.setInteractive(tooltipElement, false);\n\n\t\tthis._decorateFocusElement(target, tooltipElement);\n\t\tcontainer.append(tooltipElement);\n\t\ttarget.setPrivate(\"tooltipElement\", tooltipElement);\n\t\treturn tooltipElement;\n\t}\n\n\tpublic _invalidateAccessibility(target: Sprite): void {\n\t\tthis._focusElementDirty = true;\n\t\tconst focusElement = target.getPrivate(\"focusElement\");\n\t\tif (target.get(\"focusable\")) {\n\t\t\tif (focusElement) {\n\t\t\t\tthis._decorateFocusElement(target);\n\t\t\t\tthis._positionFocusElement(target);\n\t\t\t}\n\t\t\t// else {\n\t\t\t// \tthis._renderer._makeFocusElement(0, this);\n\t\t\t// }\n\t\t}\n\t\telse if (focusElement) {\n\t\t\tthis._removeFocusElement(target);\n\t\t}\n\t\t//this.updateCurrentFocus();\n\t}\n\n\t/**\n\t * Returns `true` if `target` is currently focused.\n\t *\n\t * @param target Target\n\t * @return Focused?\n\t */\n\tpublic focused(target: Sprite): boolean {\n\t\treturn this._focusedSprite === target;\n\t}\n\n\t/**\n\t * Converts document coordinates to coordinates withing root element.\n\t *\n\t * @param point Document point\n\t * @return Root point\n\t */\n\tpublic documentPointToRoot(point: IPoint): IPoint {\n\t\tconst bbox = this.dom.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: point.x - bbox.left,\n\t\t\ty: point.y - bbox.top\n\t\t};\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic addDisposer(disposer: T): T {\n\t\tthis._disposers.push(disposer);\n\t\treturn disposer;\n\t}\n\n\t/**\n * To all the clever heads out there. Yes, we did not make any attempts to\n * scramble this.\n *\n * This is a part of a tool meant for our users to manage their commercial\n * licenses for removal of amCharts branding from charts.\n *\n * The only legit way to do so is to purchase a commercial license for amCharts:\n * https://www.amcharts.com/online-store/\n *\n * Removing or altering this code, or disabling amCharts branding in any other\n * way is against the license and thus illegal.\n */\n\tprotected _hasLicense(): boolean {\n\t\tfor (let i = 0; i < registry.licenses.length; i++) {\n\t\t\tif (registry.licenses[i].match(/^AM5C.{5,}/i)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n}\n","import type { Entity } from \"./util/Entity\";\nimport { Template } from \"./util/Template\";\nimport type { Root } from \"./Root\";\nimport type { IClasses } from \"./Classes\";\nimport * as $order from \"./util/Order\";\nimport * as $array from \"./util/Array\";\n\nexport interface IRule {\n\ttags: Array;\n\ttemplate: Template;\n}\n\n/**\n * A base class for an amCharts theme.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/themes/} for more info\n * @important\n */\nexport class Theme {\n\n\tprotected _root!: Root;\n\n\t/**\n\t * Use this method to create an instance of this class.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/getting-started/#New_element_syntax} for more info\n\t * @param root Root element\n\t * @param settings Settings\n\t * @param template Template\n\t * @return Instantiated object\n\t */\n\tstatic new(this: T, root: Root): InstanceType {\n\t\tconst x = (new this(root, true)) as InstanceType;\n\t\tx.setupDefaultRules();\n\t\treturn x;\n\t}\n\n\tconstructor(root: Root, isReal:boolean) {\n\t\tthis._root = root;\n\t\tif (!isReal) {\n\t\t\tthrow new Error(\"You cannot use `new Class()`, instead use `Class.new()`\");\n\t\t}\n\t}\n\n\tprotected setupDefaultRules(): void {}\n\n\tprotected _rules: { [type: string]: Array>; } = {};\n\n\t/**\n\t * Looks up the rules for a specific theme class.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/themes/} for more info\n\t * @param themeClass Theme class\n\t * @return Array>\n\t */\n\tpublic _lookupRules(themeClass: string): Array> | undefined {\n\t\treturn this._rules[themeClass] as unknown as Array> | undefined;\n\t}\n\n\t/**\n\t * Creates a [[Template]] for specific theme class and tags.\n\t *\n\t * NOTE: the difference from `rule()` is that `ruleRaw()` does not do any\n\t * type checks.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/themes/} for more info\n\t * @param themeClass Theme class\n\t * @param themeTags Theme tags\n\t * @return Template\n\t */\n\tpublic ruleRaw(themeClass: string, themeTags: Array = []): Template {\n\t\tlet rules = this._rules[themeClass];\n\n\t\tif (!rules) {\n\t\t\trules = this._rules[themeClass] = [];\n\t\t}\n\n\t\tthemeTags.sort($order.compare);\n\n\t\tconst { index, found } = $array.getSortedIndex(rules, (x) => {\n\t\t\tconst order = $order.compare(x.tags.length, themeTags.length);\n\n\t\t\tif (order === 0) {\n\t\t\t\treturn $order.compareArray(x.tags, themeTags, $order.compare);\n\n\t\t\t} else {\n\t\t\t\treturn order;\n\t\t\t}\n\t\t});\n\n\t\tif (found) {\n\t\t\treturn rules[index].template as Template;\n\n\t\t} else {\n\t\t\tconst template = Template.new({});\n\n\t\t\trules.splice(index, 0, {\n\t\t\t\ttags: themeTags,\n\t\t\t\ttemplate,\n\t\t\t});\n\n\t\t\treturn template;\n\t\t}\n\t}\n\n\t/**\n\t * Creates a [[Template]] for specific theme class and tags.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/themes/} for more info\n\t * @param themeClass Theme class\n\t * @param themeTags Theme tags\n\t * @return Template\n\t */\n\tpublic rule(themeClass: K, themeTags: Array = []): Template {\n\t\treturn this.ruleRaw(themeClass, themeTags) as Template;\n\t}\n}\n","import type { Label } from \"../render/Label\";\nimport type { Graphics } from \"../render/Graphics\";\n\nimport { RoundedRectangle } from \"../render/RoundedRectangle\";\nimport { Container, IContainerPrivate, IContainerSettings } from \"./Container\";\n\nimport * as $utils from \"../../core/util/Utils\";\n\nexport interface IButtonSettings extends IContainerSettings {\n\n\t/**\n\t * A [[Label]] element for the button to show as a label.\n\t */\n\tlabel?: Label;\n\n\t/**\n\t * A [[Graphics]] element for the button to show as icon.\n\t */\n\ticon?: Graphics;\n\n}\n\nexport interface IButtonPrivate extends IContainerPrivate {\n}\n\n/**\n * Draws an interactive button.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/buttons/} for more info\n * @important\n */\nexport class Button extends Container {\n\tprotected _afterNew() {\n\t\tthis._settings.themeTags = $utils.mergeTags(this._settings.themeTags, [\"button\"]);\n\n\t\tsuper._afterNew();\n\n\t\tif (!this._settings.background) {\n\t\t\tthis.set(\"background\", RoundedRectangle.new(this._root, {\n\t\t\t\tthemeTags: $utils.mergeTags(this._settings.themeTags, [\"background\"])\n\t\t\t}));\n\t\t}\n\t}\n\n\tdeclare public _settings: IButtonSettings;\n\tdeclare public _privateSettings: IButtonPrivate;\n\n\tpublic static className: string = \"Button\";\n\tpublic static classNames: Array = Container.classNames.concat([Button.className]);\n\n\tpublic _prepareChildren() {\n\t\tsuper._prepareChildren();\n\n\t\tif (this.isDirty(\"icon\")) {\n\t\t\tconst previous = this._prevSettings.icon;\n\t\t\tconst icon = this.get(\"icon\")!;\n\t\t\tif (icon !== previous) {\n\t\t\t\tthis._disposeProperty(\"icon\");\n\n\t\t\t\tif (previous) {\n\t\t\t\t\tprevious.dispose();\n\t\t\t\t}\n\t\t\t\tif (icon) {\n\t\t\t\t\tthis.children.push(icon);\n\t\t\t\t}\n\n\t\t\t\tthis._prevSettings.icon = icon;\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"label\")) {\n\t\t\tconst previous = this._prevSettings.label;\n\t\t\tconst label = this.get(\"label\")!;\n\t\t\tif (label !== previous) {\n\t\t\t\tthis._disposeProperty(\"label\");\n\t\t\t\tif (previous) {\n\t\t\t\t\tprevious.dispose();\n\t\t\t\t}\n\n\t\t\t\tif (label) {\n\t\t\t\t\tthis.children.push(label);\n\t\t\t\t}\n\n\t\t\t\tthis._prevSettings.label = label;\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\n\nexport interface ICircleSettings extends IGraphicsSettings {\n\n\t/**\n\t * Circle radius in pixels.\n\t */\n\tradius?: number;\n\n}\n\nexport interface ICirclePrivate extends IGraphicsPrivate {\n}\n\n/**\n * Draws a circle.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n * @important\n */\nexport class Circle extends Graphics {\n\n\tdeclare public _settings: ICircleSettings;\n\tdeclare public _privateSettings: ICirclePrivate;\n\n\tpublic static className: string = \"Circle\";\n\tpublic static classNames: Array = Graphics.classNames.concat([Circle.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"radius\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this._clear) {\n\t\t\tthis._display.drawCircle(0, 0, this.get(\"radius\", 10));\n\t\t}\n\t}\n}\n","import { Settings } from \"../util/Entity\";\nimport { Container, IContainerSettings, IContainerPrivate, IContainerEvents } from \"./Container\";\nimport { ListData } from \"../util/Data\";\nimport * as $array from \"../util/Array\";\nimport * as $object from \"../util/Object\";\nimport type * as $ease from \"../util/Ease\";\nimport type { Bullet } from \"./Bullet\";\n\n/**\n * A base element that holds data bit (data item) for any [[Component]].\n */\nexport class DataItem

extends Settings {\n\tdeclare public _settings: P;\n\n\t/**\n\t * A data item's owener [[Component]].\n\t */\n\tpublic component: Component;\n\n\t/**\n\t * A reference to actual item in source data this item is based on.\n\t */\n\tpublic dataContext: unknown;\n\n\t/**\n\t * @todo requires description\n\t */\n\tpublic bullets: Array | undefined;\n\n\t/**\n\t * A set of \"open\" values.\n\t */\n\tpublic open: { [index: string]: any } | undefined;\n\n\t/**\n\t * A set of \"close\" values.\n\t */\n\tpublic close: { [index: string]: any } | undefined;\n\n\tconstructor(component: Component, dataContext: unknown, settings: P) {\n\t\tsuper(settings);\n\n\t\tthis.dataContext = dataContext;\n\t\tthis.component = component;\n\t\tthis._settings.visible = true;\n\t\tthis._checkDirty();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirty(): void {\n\t\tthis.component.markDirtyValues(this);\n\t}\n\n\tprotected _startAnimation(): void {\n\t\tthis.component._root._addAnimation(this);\n\t}\n\n\tprotected _animationTime(): number | null {\n\t\treturn this.component._root.animationTime;\n\t}\n\n\tprotected _dispose() {\n\t\tif (this.component) {\n\t\t\tthis.component.disposeDataItem(this);\n\t\t}\n\t\tsuper._dispose();\n\t}\n\n\t/**\n\t * Shows a data item that's currently hidden.\n\t */\n\tpublic show(duration?: number) {\n\t\tthis.setRaw(\"visible\", true);\n\t\tif (this.component) {\n\t\t\tthis.component.showDataItem(this, duration);\n\t\t}\n\t}\n\n\t/**\n\t * Hides a data item that's currently visible.\n\t */\n\tpublic hide(duration?: number) {\n\t\tthis.setRaw(\"visible\", false);\n\t\tif (this.component) {\n\t\t\tthis.component.hideDataItem(this, duration);\n\t\t}\n\t}\n\n\tpublic isHidden() {\n\t\treturn !this.get(\"visible\");\n\t}\n}\n\n\nexport interface IComponentDataItem {\n\tvisible?: boolean;\n}\n\nexport interface IComponentSettings extends IContainerSettings {\n\n\t/**\n\t * A duration of the animation from one setting value to another, in\n\t * milliseconds.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Animating_data_values} for more info\n\t */\n\tinterpolationDuration?: number;\n\n\t/**\n\t * Easing function to use for cross setting value animations.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Easing_functions} for more info\n\t */\n\tinterpolationEasing?: $ease.Easing;\n\n}\n\nexport interface IComponentPrivate extends IContainerPrivate {\n}\n\nexport interface IComponentEvents extends IContainerEvents {\n\tdatavalidated: {}\n}\n\n/**\n * A base class for elements that make use of data.\n */\nexport abstract class Component extends Container {\n\tpublic static className: string = \"Component\";\n\tpublic static classNames: Array = Container.classNames.concat([Component.className]);\n\n\tdeclare public _settings: IComponentSettings;\n\tdeclare public _privateSettings: IComponentPrivate;\n\tdeclare public _dataItemSettings: IComponentDataItem;\n\tdeclare public _events: IComponentEvents;\n\n\tprotected _data: ListData = new ListData();\n\n\tprotected _dataItems: Array> = [];\n\n\tpublic _mainDataItems = this._dataItems;\n\n\tprotected valueFields: Array = [];\n\tprotected fields: Array = [\"id\"];\n\n\tprotected _valueFields!: Array;\n\tprotected _valueFieldsF!: { [index: string]: { fieldKey: string, workingKey: string } };\n\n\tprotected _fields!: Array;\n\tprotected _fieldsF!: { [index: string]: string };\n\n\tpublic _valuesDirty: boolean = false;\n\n\tprotected _dataChanged: boolean = false;\n\n\tprotected _dataGrouped = false;\n\n\t/**\n\t * Indicates if the component has already been initialized.\n\t */\n\tpublic inited: boolean = false;\n\n\t/**\n\t * Component's data.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/data/} for more info\n\t */\n\tpublic set data(data: ListData) {\n\t\tdata.incrementRef();\n\t\tthis._data.decrementRef();\n\t\tthis._data = data;\n\t}\n\n\t/**\n\t * @return Data\n\t */\n\tpublic get data(): ListData {\n\t\treturn this._data;\n\t}\n\n\tprotected _dispose() {\n\t\tsuper._dispose();\n\t\tthis._data.decrementRef();\n\t}\n\n\tprotected _onDataClear() {\n\n\t}\n\n\tprotected _afterNew() {\n\t\tsuper._afterNew();\n\n\t\tthis._data.incrementRef();\n\t\tthis._updateFields();\n\n\t\tthis._disposers.push(this.data.events.onAll((change) => {\n\t\t\tconst dataItems = this._mainDataItems;\n\t\t\tthis.markDirtyValues();\n\t\t\tthis._markDirtyGroup();\n\t\t\tthis._dataChanged = true;\n\t\t\tif (change.type === \"clear\") {\n\t\t\t\t$array.each(dataItems, (dataItem) => {\n\t\t\t\t\tdataItem.dispose();\n\t\t\t\t});\n\n\t\t\t\tdataItems.length = 0;\n\t\t\t\tthis._onDataClear();\n\t\t\t} else if (change.type === \"push\") {\n\t\t\t\tconst dataItem = new DataItem(this, change.newValue, this._makeDataItem(change.newValue));\n\t\t\t\tdataItems.push(dataItem);\n\t\t\t\tthis.processDataItem(dataItem);\n\n\t\t\t} else if (change.type === \"setIndex\") {\n\t\t\t\tconst dataItem = dataItems[change.index];\n\t\t\t\tconst properties = this._makeDataItem(change.newValue);\n\n\t\t\t\t$object.keys(properties).forEach((key) => {\n\t\t\t\t\tdataItem.animate({\n\t\t\t\t\t\tkey: key,\n\t\t\t\t\t\tto: properties[key],\n\t\t\t\t\t\tduration: this.get(\"interpolationDuration\", 0),\n\t\t\t\t\t\teasing: this.get(\"interpolationEasing\"),\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tdataItem.dataContext = change.newValue;\n\n\t\t\t} else if (change.type === \"insertIndex\") {\n\t\t\t\tconst dataItem = new DataItem(this, change.newValue, this._makeDataItem(change.newValue));\n\t\t\t\tdataItems.splice(change.index, 0, dataItem);\n\t\t\t\tthis.processDataItem(dataItem);\n\n\t\t\t} else if (change.type === \"removeIndex\") {\n\t\t\t\tconst dataItem = dataItems[change.index];\n\t\t\t\tdataItem.dispose();\n\t\t\t\tdataItems.splice(change.index, 1);\n\n\t\t\t} else if (change.type === \"moveIndex\") {\n\t\t\t\tconst dataItem = dataItems[change.oldIndex];\n\t\t\t\tdataItems.splice(change.oldIndex, 1);\n\t\t\t\tdataItems.splice(change.newIndex, 0, dataItem);\n\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unknown IStreamEvent type\");\n\t\t\t}\n\n\t\t\tthis._afterDataChange();\n\t\t}));\n\t}\n\n\tprotected _updateFields() {\n\t\tif (this.valueFields) {\n\t\t\tthis._valueFields = [];\n\t\t\tthis._valueFieldsF = {};\n\n\t\t\t$array.each(this.valueFields as Array, (key) => {\n\t\t\t\tconst field = this.get((key + \"Field\"));\n\t\t\t\tif (field) {\n\t\t\t\t\tthis._valueFields.push(key);\n\t\t\t\t\tthis._valueFieldsF[key as string] = { fieldKey: key + \"Field\", workingKey: key + \"Working\" };\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.fields) {\n\t\t\tthis._fields = [];\n\t\t\tthis._fieldsF = {};\n\n\t\t\t$array.each(this.fields as Array, (key) => {\n\t\t\t\tconst field = this.get((key + \"Field\"));\n\t\t\t\tif (field) {\n\t\t\t\t\tthis._fields.push(key);\n\t\t\t\t\tthis._fieldsF[key as string] = key + \"Field\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * A list of component's data items.\n\t *\n\t * @return Data items\n\t */\n\tpublic get dataItems(): Array> {\n\t\treturn this._dataItems;\n\t}\n\n\tprotected processDataItem(_dataItem: DataItem) { }\n\n\n\tpublic _makeDataItem(data: unknown): this[\"_dataItemSettings\"] {\n\t\t//const output: this[\"_dataItemSettings\"] = {};\n\t\tconst output: any = {}; // temporary to solve error\n\t\tif (this._valueFields) {\n\t\t\t$array.each(this._valueFields, (key) => {\n\t\t\t\tconst field = this.get((this._valueFieldsF[key].fieldKey));\n\t\t\t\toutput[key] = (data as any)[field];\n\n\t\t\t\toutput[this._valueFieldsF[key].workingKey] = output[key];\n\t\t\t});\n\t\t}\n\t\tif (this._fields) {\n\t\t\t$array.each(this._fields, (key) => {\n\t\t\t\tconst field = this.get((this._fieldsF[key]));\n\t\t\t\toutput[key] = (data as any)[field];\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic makeDataItem(data: this[\"_dataItemSettings\"]): DataItem {\n\t\tlet dataItem = new DataItem(this, undefined, data);\n\t\tthis.processDataItem(dataItem);\n\t\treturn dataItem;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic pushDataItem(data: this[\"_dataItemSettings\"]): DataItem {\n\t\tconst dataItem = this.makeDataItem(data);\n\t\tthis._mainDataItems.push(dataItem);\n\t\treturn dataItem;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic disposeDataItem(_dataItem: DataItem) { }\n\n\t/**\n\t * Shows component's data item.\n\t *\n\t * @param dataItem Data item\n\t * @param _duration Animation duration in milliseconds\n\t * @return Promise\n\t */\n\tpublic async showDataItem(dataItem: DataItem, _duration?: number): Promise {\n\t\tdataItem.set(\"visible\", true);\n\t}\n\n\t/**\n\t * Hides component's data item.\n\t *\n\t * @param dataItem Data item\n\t * @param _duration Animation duration in milliseconds\n\t * @return Promise\n\t */\n\tpublic async hideDataItem(dataItem: DataItem, _duration?: number): Promise {\n\t\tdataItem.set(\"visible\", false);\n\t}\n\n\tpublic _clearDirty() {\n\t\tsuper._clearDirty();\n\t\tthis._valuesDirty = false;\n\t}\n\n\tprotected _afterDataChange() {\n\n\t}\n\n\tpublic _afterChanged() {\n\t\tsuper._afterChanged();\n\t\tif (this._dataChanged) {\n\t\t\tconst type = \"datavalidated\";\n\t\t\tif (this.events.isEnabled(type)) {\n\t\t\t\tthis.events.dispatch(type, { type: type, target: this });\n\t\t\t\tthis._dataChanged = false;\n\t\t\t}\n\t\t}\n\n\t\tthis.inited = true;\n\t}\n\n\t/**\n\t * Forces a repaint of the element which relies on data.\n\t *\n\t * @since 5.0.21\n\t */\n\tpublic markDirtyValues(_dataItem?: DataItem) {\n\t\tthis.markDirty();\n\t\tthis._valuesDirty = true;\n\t}\n\n\tpublic _markDirtyGroup() {\n\t\tthis._dataGrouped = false;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirtySize() {\n\t\tthis._sizeDirty = true;\n\t\tthis.markDirty();\n\t}\n\n}\n","import { List } from \"./List\";\nimport type { IDisposer } from \"./Disposer\";\nimport type { Container } from \"../render/Container\";\nimport type { Sprite } from \"../render/Sprite\";\nimport * as $array from \"./Array\";\n\n/**\n * A version of [[List]] to hold children of the [[Container]].\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/containers/} for more info\n */\nexport class Children extends List implements IDisposer {\n\tprivate _disposed: boolean = false;\n\tprivate _container: Container;\n\tprivate _events: IDisposer;\n\n\tpublic constructor(container: Container) {\n\t\tsuper();\n\n\t\tthis._container = container;\n\n\t\tthis._events = this.events.onAll((change) => {\n\t\t\tif (change.type === \"clear\") {\n\t\t\t\t$array.each(change.oldValues, (x) => {\n\t\t\t\t\tthis._onRemoved(x);\n\t\t\t\t});\n\n\t\t\t} else if (change.type === \"push\") {\n\t\t\t\tthis._onInserted(change.newValue);\n\n\t\t\t} else if (change.type === \"setIndex\") {\n\t\t\t\tthis._onRemoved(change.oldValue);\n\t\t\t\tthis._onInserted(change.newValue, change.index);\n\n\t\t\t} else if (change.type === \"insertIndex\") {\n\t\t\t\tthis._onInserted(change.newValue, change.index);\n\n\t\t\t} else if (change.type === \"removeIndex\") {\n\t\t\t\tthis._onRemoved(change.oldValue);\n\n\t\t\t} else if (change.type === \"moveIndex\") {\n\t\t\t\tthis._onRemoved(change.value);\n\t\t\t\tthis._onInserted(change.value, change.newIndex);\n\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unknown IListEvent type\");\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _onInserted(child: A, index?: number) {\n\t\tchild._setParent(this._container, true);\n\t\tconst childrenDisplay = this._container._childrenDisplay;\n\t\tif (index === undefined) {\n\t\t\tchildrenDisplay.addChild(child._display);\n\n\t\t} else {\n\t\t\tchildrenDisplay.addChildAt(child._display, index);\n\t\t}\n\t}\n\n\tprotected _onRemoved(child: A) {\n\t\tthis._container._childrenDisplay.removeChild(child._display);\n\t\tthis._container.markDirtyBounds();\n\t\tthis._container.markDirty();\n\t}\n\n\t/**\n\t * Returns `true` if obejct is disposed.\n\t */\n\tpublic isDisposed(): boolean {\n\t\treturn this._disposed;\n\t}\n\n\t/**\n\t * Permanently dispose this object.\n\t */\n\tpublic dispose() {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\n\t\t\tthis._events.dispose();\n\n\t\t\t$array.each(this.values, (child) => {\n\t\t\t\tchild.dispose();\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { Graphics } from \"./Graphics\";\nimport type { Layout } from \"./Layout\";\nimport type { IContainer } from \"./backend/Renderer\";\nimport type { IBounds } from \"../util/IBounds\";\nimport type { Scrollbar } from \"./Scrollbar\";\n\nimport { Children } from \"../util/Children\";\nimport { Percent } from \"../util/Percent\";\nimport { Sprite, ISpriteSettings, ISpritePrivate, ISpriteEvents } from \"./Sprite\";\nimport { Rectangle } from \"./Rectangle\";\nimport { HorizontalLayout } from \"./HorizontalLayout\";\nimport { VerticalLayout } from \"./VerticalLayout\";\nimport { GridLayout } from \"./GridLayout\";\n\nimport * as $array from \"../util/Array\";\nimport * as $type from \"../util/Type\";\n\nexport interface IContainerSettings extends ISpriteSettings {\n\n\t/**\n\t * Left padding in pixels.\n\t */\n\tpaddingLeft?: number;\n\n\t/**\n\t * Right padding in pixels.\n\t */\n\tpaddingRight?: number;\n\n\t/**\n\t * Top padding in pixels.\n\t */\n\tpaddingTop?: number;\n\n\t/**\n\t * Bottom padding in pixels.\n\t */\n\tpaddingBottom?: number;\n\n\t/**\n\t * Background element.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/containers/#Background} for more info\n\t */\n\tbackground?: Graphics;\n\n\t/**\n\t * A method to layout\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/containers/#Layout} for more info\n\t */\n\tlayout?: Layout | null;\n\n\t/**\n\t * An element to use as a container's mask (clipping region).\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/containers/#Masks} for more info\n\t */\n\tmask?: Graphics | null;\n\n\t/**\n\t * If set to `true` all content going outside the bounds of the container\n\t * will be clipped.\n\t */\n\tmaskContent?: boolean;\n\n\t/**\n\t * If set to `true` all descendants - not just direct children, but every\n\t * element in it - will become \"interactive\".\n\t */\n\tinteractiveChildren?: boolean;\n\n\t/**\n\t * If set to `true`, applying a state on a container will also apply the same\n\t * state on its children.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/containers/#States} for more info\n\t */\n\tsetStateOnChildren?: boolean;\n\n\t/**\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/containers/#Scrollbar} for more info\n\t */\n\tverticalScrollbar?: Scrollbar;\n\n}\n\nexport interface IContainerEvents extends ISpriteEvents {\n}\n\nexport interface IContainerPrivate extends ISpritePrivate {\n}\n\nexport interface IContainerEvents extends ISpriteEvents {\n}\n\n/**\n * A basic element that can have child elements, maintain their layout, and\n * have a background.\n *\n * It can have any [[Sprite]] element as a child, from very basic shapes, to\n * full-fledged charts.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/containers/} for more info\n * @important\n */\nexport class Container extends Sprite {\n\n\tdeclare public _settings: IContainerSettings;\n\tdeclare public _privateSettings: IContainerPrivate;\n\tdeclare public _events: IContainerEvents;\n\n\tpublic _display: IContainer = this._root._renderer.makeContainer();\n\n\tpublic _childrenDisplay: IContainer = this._root._renderer.makeContainer();\n\n\t/**\n\t * List of Container's child elements.\n\t */\n\tpublic children: Children = new Children(this);\n\n\tpublic _percentageSizeChildren: Array = [];\n\tpublic _percentagePositionChildren: Array = [];\n\n\tpublic static className: string = \"Container\";\n\tpublic static classNames: Array = Sprite.classNames.concat([Container.className]);\n\n\tpublic _prevWidth: number = 0;\n\tpublic _prevHeight: number = 0;\n\n\tprotected _contentWidth: number = 0;\n\tprotected _contentHeight: number = 0;\n\n\tprotected _contentMask: Rectangle | undefined;\n\n\tprotected _afterNew() {\n\t\tsuper._afterNew();\n\t\tthis._display.addChild(this._childrenDisplay);\n\t}\n\n\tprotected _dispose() {\n\t\t$array.each(this.allChildren(), (child) => {\n\t\t\tchild.dispose();\n\t\t});\n\n\t\tconst mask = this.get(\"mask\");\n\t\tif (mask) {\n\t\t\tmask.dispose();\n\t\t}\n\n\t\tconst background = this.get(\"background\");\n\t\tif (background) {\n\t\t\tbackground.dispose();\n\t\t}\n\n\t\tsuper._dispose();\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this.isDirty(\"interactiveChildren\")) {\n\t\t\tthis._display.interactiveChildren = this.get(\"interactiveChildren\", false);\n\t\t}\n\n\t\tif (this.isDirty(\"layout\")) {\n\t\t\tthis._prevWidth = 0;\n\t\t\tthis._prevHeight = 0;\n\t\t\tthis.markDirtyBounds();\n\t\t\tif (this._prevSettings.layout) {\n\t\t\t\tthis.children.each((child) => {\n\t\t\t\t\tchild.removePrivate(\"x\");\n\t\t\t\t\tchild.removePrivate(\"y\");\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"paddingTop\") || this.isDirty(\"paddingBottom\") || this.isDirty(\"paddingLeft\") || this.isDirty(\"paddingRight\")) {\n\t\t\tthis.children.each((child) => {\n\t\t\t\tchild.markDirtyPosition();\n\t\t\t})\n\t\t}\n\n\t\tif (this.isDirty(\"maskContent\")) {\n\n\t\t\tconst childrenDisplay = this._childrenDisplay;\n\n\t\t\tlet contentMask = this._contentMask;\n\t\t\tif (this.get(\"maskContent\")) {\n\t\t\t\tif (!contentMask) {\n\t\t\t\t\tcontentMask = Rectangle.new(this._root, {\n\t\t\t\t\t\twidth: this.width(),\n\t\t\t\t\t\theight: this.height()\n\t\t\t\t\t});\n\t\t\t\t\tthis._contentMask = contentMask;\n\t\t\t\t\tchildrenDisplay.addChildAt(contentMask._display, 0);\n\t\t\t\t\tchildrenDisplay.mask = contentMask._display;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (contentMask) {\n\t\t\t\t\tchildrenDisplay.removeChild(contentMask._display);\n\t\t\t\t\tchildrenDisplay.mask = null;\n\t\t\t\t\tcontentMask.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _updateSize() {\n\t\tsuper._updateSize();\n\n\t\t$array.each(this._percentageSizeChildren, (child) => {\n\t\t\tchild._updateSize();\n\t\t});\n\n\t\t$array.each(this._percentagePositionChildren, (child) => {\n\t\t\tchild.markDirtyPosition();\n\t\t\tchild._updateSize();\n\t\t});\n\n\t\tthis.updateBackground();\n\t}\n\n\tprotected updateBackground() {\n\t\tconst background = this.get(\"background\");\n\t\tlet bounds = this._localBounds;\n\n\t\tif (bounds && !this.isHidden()) {\n\t\t\tlet x = bounds.left;\n\t\t\tlet y = bounds.top;\n\t\t\tlet w = bounds.right - x;\n\t\t\tlet h = bounds.bottom - y;\n\n\t\t\tlet width = this.width();\n\t\t\tlet height = this.height();\n\n\t\t\tif (background) {\n\t\t\t\tbackground.setAll({ width: w, height: h, x: x, y: y });\n\t\t\t\tif (this._display.interactive) {\n\t\t\t\t\tbackground._display.interactive = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst contentMask = this._contentMask;\n\t\t\tif (contentMask) {\n\t\t\t\tcontentMask.setAll({ width, height });\n\t\t\t}\n\n\t\t\tconst verticalScrollbar = this.get(\"verticalScrollbar\")!;\n\t\t\tif (verticalScrollbar) {\n\t\t\t\tverticalScrollbar.set(\"height\", height);\n\t\t\t\tverticalScrollbar.set(\"x\", width - verticalScrollbar.width() - verticalScrollbar.get(\"marginRight\", 0));\n\t\t\t\tverticalScrollbar.set(\"end\", verticalScrollbar.get(\"start\", 0) + height / this._contentHeight);\n\n\t\t\t\tconst bg = verticalScrollbar.get(\"background\");\n\t\t\t\tif (bg) {\n\t\t\t\t\tbg.setAll({ width: verticalScrollbar.width(), height: height })\n\t\t\t\t}\n\n\t\t\t\tlet visible = true;\n\t\t\t\tif(this._contentHeight <= height){\n\t\t\t\t\tvisible = false;\n\t\t\t\t}\t\t\t\t\n\t\t\t\tverticalScrollbar.setPrivate(\"visible\", visible);\t\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _applyThemes(): boolean {\n\t\tif (super._applyThemes()) {\n\t\t\tthis.eachChildren((child) => {\n\t\t\t\tchild._applyThemes();\n\t\t\t});\n\n\t\t\treturn true;\n\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic _applyState(name: string): void {\n\t\tsuper._applyState(name);\n\n\t\tif (this.get(\"setStateOnChildren\")) {\n\t\t\tthis.eachChildren((child) => {\n\t\t\t\tchild.states.apply(name);\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic _applyStateAnimated(name: string, duration?: number): void {\n\t\tsuper._applyStateAnimated(name, duration);\n\n\t\tif (this.get(\"setStateOnChildren\")) {\n\t\t\tthis.eachChildren((child) => {\n\t\t\t\tchild.states.applyAnimate(name, duration);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Returns container's inner width (width without padding) in pixels.\n\t *\n\t * @return Inner width (px)\n\t */\n\tpublic innerWidth(): number {\n\t\treturn this.width() - this.get(\"paddingRight\", 0) - this.get(\"paddingLeft\", 0);\n\t}\n\n\t/**\n\t * Returns container's inner height (height without padding) in pixels.\n\t *\n\t * @return Inner height (px)\n\t */\n\tpublic innerHeight(): number {\n\t\treturn this.height() - this.get(\"paddingTop\", 0) - this.get(\"paddingBottom\", 0);\n\t}\n\n\tprotected _getBounds() {\n\n\t\tlet width = this.get(\"width\");\n\t\tlet height = this.get(\"height\");\n\t\tlet pWidth = this.getPrivate(\"width\");\n\t\tlet pHeight = this.getPrivate(\"height\");\n\n\t\tlet bounds: IBounds = {\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\tright: this.width(),\n\t\t\tbottom: this.height(),\n\t\t};\n\n\t\tlet layout = this.get(\"layout\");\n\t\tlet horizontal = false;\n\t\tlet vertical = false;\n\t\tif (layout instanceof HorizontalLayout || layout instanceof GridLayout) {\n\t\t\thorizontal = true;\n\t\t}\n\n\t\tif (layout instanceof VerticalLayout) {\n\t\t\tvertical = true;\n\t\t}\n\n\t\tif ((width != null || pWidth != null) && (height != null || pHeight != null) && !this.get(\"verticalScrollbar\")) {\n\t\t\t// void\n\t\t}\n\t\telse {\n\t\t\tlet m = Number.MAX_VALUE;\n\n\t\t\tlet l = m;\n\t\t\tlet r = -m;\n\t\t\tlet t = m;\n\t\t\tlet b = -m;\n\n\t\t\tconst paddingLeft = this.get(\"paddingLeft\", 0);\n\t\t\tconst paddingTop = this.get(\"paddingTop\", 0);\n\t\t\tconst paddingRight = this.get(\"paddingRight\", 0);\n\t\t\tconst paddingBottom = this.get(\"paddingBottom\", 0);\n\n\t\t\tthis.children.each((child) => {\n\t\t\t\tif (child.get(\"position\") != \"absolute\" && child.get(\"isMeasured\")) {\n\t\t\t\t\tlet childBounds = child.adjustedLocalBounds();\n\t\t\t\t\tlet childX = child.x();\n\t\t\t\t\tlet childY = child.y();\n\t\t\t\t\tlet cl = childX + childBounds.left;\n\t\t\t\t\tlet cr = childX + childBounds.right;\n\t\t\t\t\tlet ct = childY + childBounds.top;\n\t\t\t\t\tlet cb = childY + childBounds.bottom;\n\n\t\t\t\t\tif (horizontal) {\n\t\t\t\t\t\tcl -= child.get(\"marginLeft\", 0);\n\t\t\t\t\t\tcr += child.get(\"marginRight\", 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (vertical) {\n\t\t\t\t\t\tct -= child.get(\"marginTop\", 0);\n\t\t\t\t\t\tcb += child.get(\"marginBottom\", 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (cl < l) {\n\t\t\t\t\t\tl = cl;\n\t\t\t\t\t}\n\t\t\t\t\tif (cr > r) {\n\t\t\t\t\t\tr = cr;\n\t\t\t\t\t}\n\t\t\t\t\tif (ct < t) {\n\t\t\t\t\t\tt = ct;\n\t\t\t\t\t}\n\t\t\t\t\tif (cb > b) {\n\t\t\t\t\t\tb = cb;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tif (l == m) {\n\t\t\t\tl = 0;\n\t\t\t}\n\n\t\t\tif (r == -m) {\n\t\t\t\tr = 0;\n\t\t\t}\n\n\t\t\tif (t == m) {\n\t\t\t\tt = 0;\n\t\t\t}\n\n\t\t\tif (b == -m) {\n\t\t\t\tb = 0;\n\t\t\t}\n\n\t\t\tbounds.left = l - paddingLeft;\n\t\t\tbounds.top = t - paddingTop;\n\t\t\tbounds.right = r + paddingRight;\n\t\t\tbounds.bottom = b + paddingBottom;\n\t\t}\n\n\t\tthis._contentWidth = bounds.right - bounds.left;\n\t\tthis._contentHeight = bounds.bottom - bounds.top;\n\n\t\tif ($type.isNumber(width)) {\n\t\t\tbounds.left = 0;\n\t\t\tbounds.right = width;\n\t\t}\n\n\t\tif ($type.isNumber(pWidth)) {\n\t\t\tbounds.left = 0;\n\t\t\tbounds.right = pWidth;\n\t\t}\n\n\t\tif ($type.isNumber(height)) {\n\t\t\tbounds.top = 0;\n\t\t\tbounds.bottom = height;\n\t\t}\n\n\t\tif ($type.isNumber(pHeight)) {\n\t\t\tbounds.top = 0;\n\t\t\tbounds.bottom = pHeight;\n\t\t}\n\n\t\tthis._localBounds = bounds;\n\t}\n\n\tpublic _updateBounds() {\n\t\tconst layout = this.get(\"layout\");\n\n\t\tif (layout) {\n\t\t\tlayout.updateContainer(this);\n\t\t}\n\n\t\tsuper._updateBounds();\n\n\t\tthis.updateBackground();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirty(): void {\n\t\tsuper.markDirty();\n\t\tthis._root._addDirtyParent(this);\n\t}\n\n\tpublic _prepareChildren() {\n\t\tconst innerWidth = this.innerWidth();\n\t\tconst innerHeight = this.innerHeight();\n\n\t\tif (innerWidth != this._prevWidth || innerHeight != this._prevHeight) {\n\t\t\tlet layout = this.get(\"layout\");\n\t\t\tlet horizontal = false;\n\t\t\tlet vertical = false;\n\t\t\tif (layout) {\n\t\t\t\tif (layout instanceof HorizontalLayout || layout instanceof GridLayout) {\n\t\t\t\t\thorizontal = true;\n\t\t\t\t}\n\t\t\t\tif (layout instanceof VerticalLayout) {\n\t\t\t\t\tvertical = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$array.each(this._percentageSizeChildren, (child) => {\n\t\t\t\tif (!horizontal) {\n\t\t\t\t\tlet width = child.get(\"width\");\n\t\t\t\t\tif (width instanceof Percent) {\n\t\t\t\t\t\tchild.setPrivate(\"width\", width.value * innerWidth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!vertical) {\n\t\t\t\t\tlet height = child.get(\"height\");\n\t\t\t\t\tif (height instanceof Percent) {\n\t\t\t\t\t\tchild.setPrivate(\"height\", height.value * innerHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t$array.each(this._percentagePositionChildren, (child) => {\n\t\t\t\tchild.markDirtyPosition();\n\t\t\t\tchild.markDirtyBounds();\n\t\t\t})\n\n\t\t\tthis._prevWidth = innerWidth;\n\t\t\tthis._prevHeight = innerHeight;\n\n\t\t\tthis._sizeDirty = true;\n\t\t\tthis.updateBackground();\n\t\t}\n\n\t\tthis._handleStates();\n\t}\n\n\tpublic _updateChildren() {\n\n\t\tif (this.isDirty(\"verticalScrollbar\")) {\n\t\t\tconst verticalScrollbar = this.get(\"verticalScrollbar\")!;\n\t\t\tif (verticalScrollbar) {\n\t\t\t\tverticalScrollbar._setParent(this);\n\t\t\t\tverticalScrollbar.children.removeValue(verticalScrollbar.startGrip);\n\t\t\t\tverticalScrollbar.children.removeValue(verticalScrollbar.endGrip);\n\n\t\t\t\tthis.set(\"maskContent\", true);\n\t\t\t\tthis.set(\"paddingRight\", verticalScrollbar.width() + verticalScrollbar.get(\"marginRight\", 0) + verticalScrollbar.get(\"marginLeft\", 0));\n\n\t\t\t\tlet background = this.get(\"background\");\n\n\t\t\t\tif (!background) {\n\t\t\t\t\tbackground = this.set(\"background\", Rectangle.new(this._root, {\n\t\t\t\t\t\tthemeTags: [\"background\"],\n\t\t\t\t\t\tfillOpacity: 0,\n\t\t\t\t\t\tfill: this._root.interfaceColors.get(\"alternativeBackground\")\n\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\tthis._disposers.push(this.events.on(\"wheel\", (event) => {\n\t\t\t\t\tconst wheelEvent = event.originalEvent;\n\t\t\t\t\twheelEvent.preventDefault();\n\t\t\t\t\tconst shiftY = wheelEvent.deltaY / 5000;\n\t\t\t\t\tconst start = verticalScrollbar.get(\"start\", 0);\n\t\t\t\t\tconst end = verticalScrollbar.get(\"end\", 1);\n\t\t\t\t\tif (start + shiftY > 0 && end + shiftY < 1) {\n\t\t\t\t\t\tverticalScrollbar.set(\"start\", start + shiftY);\n\t\t\t\t\t\tverticalScrollbar.set(\"end\", end + shiftY);\n\t\t\t\t\t}\n\t\t\t\t}))\n\n\t\t\t\tthis._disposers.push(verticalScrollbar.events.on(\"rangechanged\", () => {\n\t\t\t\t\tlet h = this._contentHeight;\n\t\t\t\t\tconst childrenDisplay = this._childrenDisplay;\n\t\t\t\t\tconst contentMask = this._contentMask;\n\n\t\t\t\t\tchildrenDisplay.y = -verticalScrollbar.get(\"start\") * h;\n\t\t\t\t\tchildrenDisplay.markDirtyLayer();\n\n\t\t\t\t\tif (contentMask) {\n\t\t\t\t\t\tcontentMask._display.y = -childrenDisplay.y;\n\t\t\t\t\t\tchildrenDisplay.mask = contentMask._display;\n\t\t\t\t\t}\n\t\t\t\t}))\n\n\t\t\t\tthis._display.addChild(verticalScrollbar._display);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"background\")) {\n\t\t\t// TODO maybe this should dispose ?\n\t\t\tconst previous = this._prevSettings[\"background\"];\n\t\t\tif (previous) {\n\t\t\t\tthis._display.removeChild(previous._display);\n\t\t\t}\n\n\t\t\tconst background = this.get(\"background\");\n\t\t\tif (background instanceof Sprite) {\n\t\t\t\tbackground.set(\"isMeasured\", false);\n\t\t\t\tbackground._setParent(this);\n\t\t\t\tthis._display.addChildAt(background._display, 0);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"mask\")) {\n\n\t\t\tconst mask = this.get(\"mask\");\n\n\t\t\tconst previous = this._prevSettings[\"mask\"];\n\t\t\tif (previous) {\n\t\t\t\tthis._display.removeChild(previous._display);\n\t\t\t\tif (previous != mask) {\n\t\t\t\t\tprevious.dispose();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (mask) {\n\t\t\t\tvar parent = mask.parent;\n\t\t\t\tif (parent) {\n\t\t\t\t\tparent.children.removeValue(mask);\n\t\t\t\t}\n\n\t\t\t\tmask._setParent(this);\n\t\t\t\tthis._display.addChildAt(mask._display, 0);\n\t\t\t\tthis._childrenDisplay.mask = mask._display;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _processTemplateField(): void {\n\t\tsuper._processTemplateField();\n\t\tthis.children.each((child) => {\n\t\t\tchild._processTemplateField();\n\t\t})\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic walkChildren(f: (child: Sprite) => void): void {\n\t\tthis.children.each((child) => {\n\t\t\tif (child instanceof Container) {\n\t\t\t\tchild.walkChildren(f);\n\t\t\t}\n\t\t\tf(child);\n\t\t});\n\t}\n\n\tpublic eachChildren(f: (child: Sprite) => void): void {\n\t\tconst background = this.get(\"background\");\n\t\tif (background) {\n\t\t\tf(background);\n\t\t}\n\n\t\tconst verticalScrollbar = this.get(\"verticalScrollbar\");\n\t\tif (verticalScrollbar) {\n\t\t\tf(verticalScrollbar);\n\t\t}\n\n\t\tconst mask = this.get(\"mask\");\n\t\tif (mask) {\n\t\t\tf(mask);\n\t\t}\n\n\t\tthis.children.values.forEach((child) => {\n\t\t\tf(child);\n\t\t});\n\t}\n\n\tpublic allChildren(): Array {\n\t\tconst output: Array = [];\n\n\t\tthis.eachChildren((x) => {\n\t\t\toutput.push(x);\n\t\t});\n\n\t\treturn output;\n\t}\n}\n","import type { Color } from \"../util/Color\";\nimport type { Pattern } from \"../render/patterns/Pattern\";\nimport type { Gradient } from \"../render/gradients/Gradient\";\n\nimport { ISpriteSettings, ISpritePrivate, ISpriteEvents, Sprite } from \"./Sprite\";\nimport { IGraphics, BlendMode } from \"./backend/Renderer\";\n\nimport * as $type from \"../util/Type\";\nimport * as $array from \"../util/Array\";\n\n\nexport const visualSettings = [\"fill\", \"fillOpacity\", \"stroke\", \"strokeWidth\", \"strokeOpacity\", \"fillPattern\", \"strokePattern\", \"fillGradient\", \"strokeGradient\", \"strokeDasharray\", \"strokeDashoffset\"];\n\nexport interface IGraphicsSettings extends ISpriteSettings {\n\n\t/**\n\t * Fill color.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/} for more information\n\t */\n\tfill?: Color;\n\n\t/**\n\t * Stroke (border or line) color.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/} for more information\n\t */\n\tstroke?: Color;\n\n\t/**\n\t * Fill pattern.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/patterns/} for more information\n\t */\n\tfillPattern?: Pattern;\n\n\t/**\n\t * Stroke (border or line) pattern.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/patterns/} for more information\n\t */\n\tstrokePattern?: Pattern;\n\n\t/**\n\t * Fill gradient.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/} for more information\n\t */\n\tfillGradient?: Gradient;\n\n\t/**\n\t * Stroke (border or line) gradient.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/} for more information\n\t */\n\tstrokeGradient?: Gradient;\n\n\t/**\n\t * Stroke (border or line) dash settings.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/#Dashed_lines} for more information\n\t */\n\tstrokeDasharray?: number[] | number;\n\n\t/**\n\t * Stroke (border or line) dash offset.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/#Dashed_lines} for more information\n\t */\n\tstrokeDashoffset?: number;\n\n\t/**\n\t * Opacity of the fill. 0 - fully transparent; 1 - fully opaque.\n\t */\n\tfillOpacity?: number;\n\n\t/**\n\t * Opacity of the stroke (border or line). 0 - fully transparent; 1 - fully opaque.\n\t */\n\tstrokeOpacity?: number;\n\n\t/**\n\t * Width of the stroke (border or line) in pixels.\n\t */\n\tstrokeWidth?: number;\n\n\t/**\n\t * Drawing function.\n\t *\n\t * Must use renderer (`display` parameter) methods to draw.\n\t */\n\tdraw?: (display: IGraphics, graphics: Graphics) => void;\n\n\t/**\n\t * Rendering mode.\n\t *\n\t * @default BlendMode.NORMAL (\"source-over\")\n\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation} for more information\n\t * @ignore\n\t */\n\tblendMode?: BlendMode;\n\n\t/**\n\t * Draw a shape using an SVG path.\n\t *\n\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths} for more information\n\t */\n\tsvgPath?: string;\n\n\t/**\n\t * Color of the element's shadow.\n\t *\n\t * For this to work at least one of the following needs to be set as well:\n\t * `shadowBlur`, `shadowOffsetX`, `shadowOffsetY`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowColor?: Color | null;\n\n\t/**\n\t * Blurriness of the the shadow.\n\t *\n\t * The bigger the number, the more blurry shadow will be.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowBlur?: number;\n\n\t/**\n\t * Horizontal shadow offset in pixels.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOffsetX?: number;\n\n\t/**\n\t * Vertical shadow offset in pixels.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOffsetY?: number;\n\n\t/**\n\t * Opacity of the shadow (0-1).\n\t *\n\t * If not set, will use the same as `fillOpacity` of the element.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOpacity?: number;\n\n}\n\nexport interface IGraphicsPrivate extends ISpritePrivate {\n}\n\nexport interface IGraphicsEvents extends ISpriteEvents {\n}\n\n/**\n * Base class used for drawing shapes.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n * @important\n */\nexport class Graphics extends Sprite {\n\n\tdeclare public _settings: IGraphicsSettings;\n\tdeclare public _privateSettings: IGraphicsPrivate;\n\tdeclare public _events: IGraphicsEvents;\n\n\tpublic _display: IGraphics = this._root._renderer.makeGraphics();\n\n\tprotected _clear = false;\n\n\tpublic static className: string = \"Graphics\";\n\tpublic static classNames: Array = Sprite.classNames.concat([Graphics.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"draw\") || this.isDirty(\"svgPath\")) {\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"fill\") || this.isDirty(\"stroke\") || this.isDirty(\"fillGradient\") || this.isDirty(\"strokeGradient\") || this.isDirty(\"fillPattern\") || this.isDirty(\"strokePattern\") || this.isDirty(\"fillOpacity\") || this.isDirty(\"strokeOpacity\") || this.isDirty(\"strokeWidth\") || this.isDirty(\"draw\") || this.isDirty(\"blendMode\") || this.isDirty(\"strokeDasharray\") || this.isDirty(\"strokeDashoffset\") || this.isDirty(\"svgPath\") || this.isDirty(\"shadowColor\") || this.isDirty(\"shadowBlur\") || this.isDirty(\"shadowOffsetX\") || this.isDirty(\"shadowOffsetY\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\n\t\tif (this.isDirty(\"fillGradient\")) {\n\t\t\tconst gradient = this.get(\"fillGradient\");\n\t\t\tif (gradient) {\n\t\t\t\tthis._display.isMeasured = true;\n\t\t\t\tconst gradientTarget = gradient.get(\"target\");\n\t\t\t\tif (gradientTarget) {\n\t\t\t\t\tthis._disposers.push(gradientTarget.events.on(\"boundschanged\", () => {\n\t\t\t\t\t\tthis._markDirtyKey(\"fill\");\n\t\t\t\t\t}))\n\t\t\t\t\tthis._disposers.push(\n\t\t\t\t\t\tgradientTarget.events.on(\"positionchanged\", () => {\n\t\t\t\t\t\t\tthis._markDirtyKey(\"fill\");\n\t\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"strokeGradient\")) {\n\t\t\tconst gradient = this.get(\"strokeGradient\");\n\t\t\tif (gradient) {\n\t\t\t\tthis._display.isMeasured = true;\n\t\t\t\tconst gradientTarget = gradient.get(\"target\");\n\t\t\t\tif (gradientTarget) {\n\t\t\t\t\tthis._disposers.push(\n\t\t\t\t\t\tgradientTarget.events.on(\"boundschanged\", () => {\n\t\t\t\t\t\t\tthis._markDirtyKey(\"stroke\");\n\t\t\t\t\t\t}))\n\t\t\t\t\tthis._disposers.push(\n\t\t\t\t\t\tgradientTarget.events.on(\"positionchanged\", () => {\n\t\t\t\t\t\t\tthis._markDirtyKey(\"stroke\");\n\t\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this._clear) {\n\t\t\tthis.markDirtyLayer();\n\t\t\tthis._display.clear();\n\n\t\t\tlet strokeDasharray = this.get(\"strokeDasharray\");\n\t\t\tif ($type.isNumber(strokeDasharray)) {\n\t\t\t\tif (strokeDasharray < 0.5) {\n\t\t\t\t\tstrokeDasharray = [0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstrokeDasharray = [strokeDasharray]\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._display.setLineDash(strokeDasharray as number[]);\n\n\t\t\tconst strokeDashoffset = this.get(\"strokeDashoffset\");\n\t\t\tif (strokeDashoffset) {\n\t\t\t\tthis._display.setLineDashOffset(strokeDashoffset);\n\t\t\t}\n\n\t\t\tconst blendMode = this.get(\"blendMode\", BlendMode.NORMAL);\n\t\t\tthis._display.blendMode = blendMode;\n\n\t\t\tconst draw = this.get(\"draw\");\n\t\t\tif (draw) {\n\t\t\t\tdraw(this._display, this);\n\t\t\t}\n\n\t\t\tconst svgPath = this.get(\"svgPath\");\n\t\t\tif (svgPath != null) {\n\t\t\t\tthis._display.svgPath(svgPath!);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _afterChanged() {\n\t\tsuper._afterChanged();\n\n\t\tif (this._clear) {\n\t\t\tconst fill = this.get(\"fill\");\n\t\t\tconst fillGradient = this.get(\"fillGradient\");\n\t\t\tconst fillPattern = this.get(\"fillPattern\");\n\t\t\tconst fillOpacity = this.get(\"fillOpacity\");\n\n\t\t\tconst stroke = this.get(\"stroke\");\n\t\t\tconst strokeGradient = this.get(\"strokeGradient\");\n\t\t\tconst strokePattern = this.get(\"strokePattern\");\n\n\t\t\tconst shadowColor = this.get(\"shadowColor\");\n\t\t\tconst shadowBlur = this.get(\"shadowBlur\");\n\t\t\tconst shadowOffsetX = this.get(\"shadowOffsetX\");\n\t\t\tconst shadowOffsetY = this.get(\"shadowOffsetY\");\n\t\t\tconst shadowOpacity = this.get(\"shadowOpacity\");\n\n\t\t\t//const bounds = this._display.getLocalBounds();\n\n\t\t\tif (shadowColor && (shadowBlur || shadowOffsetX || shadowOffsetY)) {\n\t\t\t\tthis._display.shadow(shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity);\n\t\t\t}\n\n\t\t\tif (fillPattern) {\n\t\t\t\tlet changed = false;\n\t\t\t\tif (fill && (!fillPattern.get(\"fill\") || fillPattern.get(\"fillInherited\"))) {\n\t\t\t\t\tfillPattern.set(\"fill\", fill);\n\t\t\t\t\tfillPattern.set(\"fillInherited\", true)\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t\tif (stroke && (!fillPattern.get(\"color\") || fillPattern.get(\"colorInherited\"))) {\n\t\t\t\t\tfillPattern.set(\"color\", stroke);\n\t\t\t\t\tfillPattern.set(\"colorInherited\", true)\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t\tif (changed) {\n\t\t\t\t\t// @todo: is this OK?\n\t\t\t\t\tfillPattern._changed();\n\t\t\t\t}\n\t\t\t\tconst pattern = fillPattern.pattern;\n\t\t\t\tif (pattern) {\n\t\t\t\t\tthis._display.beginFill(pattern, fillOpacity);\n\t\t\t\t\tthis._display.endFill();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (fillGradient) {\n\t\t\t\tif (fill) {\n\t\t\t\t\tconst stops = fillGradient.get(\"stops\", []);\n\t\t\t\t\tif (stops.length) {\n\t\t\t\t\t\t$array.each(stops, (stop: any) => {\n\t\t\t\t\t\t\tif ((!stop.color || stop.colorInherited) && fill) {\n\t\t\t\t\t\t\t\tstop.color = fill;\n\t\t\t\t\t\t\t\tstop.colorInherited = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (stop.opacity == null || stop.opacityInherited) {\n\t\t\t\t\t\t\t\tstop.opacity = fillOpacity;\n\t\t\t\t\t\t\t\tstop.opacityInherited = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst gradient = fillGradient.getFill(this);\n\t\t\t\tif (gradient) {\n\t\t\t\t\tthis._display.beginFill(gradient, fillOpacity);\n\t\t\t\t\tthis._display.endFill();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (fill) {\n\t\t\t\tthis._display.beginFill(fill, fillOpacity);\n\t\t\t\tthis._display.endFill();\n\t\t\t}\n\n\t\t\tif (stroke || strokeGradient || strokePattern) {\n\t\t\t\tconst strokeOpacity = this.get(\"strokeOpacity\");\n\t\t\t\tconst strokeWidth = this.get(\"strokeWidth\", 1);\n\n\t\t\t\tif (strokePattern) {\n\t\t\t\t\tlet changed = false;\n\t\t\t\t\tif (stroke && (!strokePattern.get(\"color\") || strokePattern.get(\"colorInherited\"))) {\n\t\t\t\t\t\tstrokePattern.set(\"color\", stroke);\n\t\t\t\t\t\tstrokePattern.set(\"colorInherited\", true);\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (changed) {\n\t\t\t\t\t\t// @todo: is this OK?\n\t\t\t\t\t\tstrokePattern._changed();\n\t\t\t\t\t}\n\t\t\t\t\tconst pattern = strokePattern.pattern;\n\t\t\t\t\tif (pattern) {\n\t\t\t\t\t\tthis._display.lineStyle(strokeWidth, pattern, strokeOpacity);\n\t\t\t\t\t\tthis._display.endStroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (strokeGradient) {\n\n\t\t\t\t\tconst stops = strokeGradient.get(\"stops\", []);\n\t\t\t\t\tif (stops.length) {\n\t\t\t\t\t\t$array.each(stops, (stop: any) => {\n\t\t\t\t\t\t\tif ((!stop.color || stop.colorInherited) && stroke) {\n\t\t\t\t\t\t\t\tstop.color = stroke;\n\t\t\t\t\t\t\t\tstop.colorInherited = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (stop.opacity == null || stop.opacityInherited) {\n\t\t\t\t\t\t\t\tstop.opacity = strokeOpacity;\n\t\t\t\t\t\t\t\tstop.opacityInherited = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tconst gradient = strokeGradient.getFill(this);\n\t\t\t\t\tif (gradient) {\n\t\t\t\t\t\tthis._display.lineStyle(strokeWidth, gradient, strokeOpacity);\n\t\t\t\t\t\tthis._display.endStroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (stroke) {\n\t\t\t\t\tthis._display.lineStyle(strokeWidth, stroke, strokeOpacity);\n\t\t\t\t\tthis._display.endStroke();\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\t\tthis._clear = false;\n\t}\n\n}\n","import { Layout, ILayoutSettings, ILayoutPrivate } from \"./Layout\";\nimport * as $array from \"../util/Array\";\nimport * as $math from \"../util/Math\";\nimport type { Container } from \"./Container\";\nimport type { List } from \"../util/List\";\nimport type { Sprite } from \"./Sprite\";\n\n\nexport interface IGridLayoutSettings extends ILayoutSettings {\n\n\t/**\n\t * If set to `true` all columns in the grid will be equal width.\n\t *\n\t * @default false\n\t */\n\tfixedWidthGrid?: boolean;\n\n\t/**\n\t * Maximum number of columns in the grid.\n\t */\n\tmaxColumns?: number;\n\n}\n\nexport interface IGridLayoutPrivate extends ILayoutPrivate {\n}\n\n/**\n * A grid children layout for [[Container]].\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/containers/#Layout} for more info\n */\nexport class GridLayout extends Layout {\n\n\tpublic static className: string = \"GridLayout\";\n\tpublic static classNames: Array = Layout.classNames.concat([GridLayout.className]);\n\n\tdeclare public _settings: IGridLayoutSettings;\n\tdeclare public _privateSettings: IGridLayoutPrivate;\n\n\n\tprotected _afterNew() {\n\t\tthis._setRawDefault(\"maxColumns\", Number.MAX_VALUE);\n\t\tsuper._afterNew();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateContainer(container: Container): void {\n\t\tlet paddingLeft = container.get(\"paddingLeft\", 0);\n\t\tlet paddingRight = container.get(\"paddingRight\", 0);\n\t\tlet paddingTop = container.get(\"paddingTop\", 0);\n\n\t\tlet availableWidth = container.maxWidth() - paddingLeft - paddingRight;\n\n\t\tlet minCellWidth = availableWidth;\n\t\tlet maxCellWidth = 1;\n\n\t\tcontainer.children.each((child) => {\n\t\t\tif (child.get(\"position\") != \"absolute\") {\n\t\t\t\tlet childWidth = child.width();\n\n\t\t\t\tif (childWidth < minCellWidth) {\n\t\t\t\t\tminCellWidth = childWidth;\n\t\t\t\t}\n\t\t\t\tif (childWidth > maxCellWidth) {\n\t\t\t\t\tmaxCellWidth = childWidth;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tminCellWidth = $math.fitToRange(minCellWidth, 1, availableWidth);\n\t\tmaxCellWidth = $math.fitToRange(maxCellWidth, 1, availableWidth);\n\n\t\tlet columnCount = 1;\n\t\tif (this.get(\"fixedWidthGrid\")) {\n\t\t\tcolumnCount = availableWidth / maxCellWidth;\n\t\t}\n\t\telse {\n\t\t\tcolumnCount = availableWidth / minCellWidth;\n\t\t}\n\n\t\tcolumnCount = Math.max(1, Math.floor(columnCount));\n\t\tcolumnCount = Math.min(this.get(\"maxColumns\", Number.MAX_VALUE), columnCount);\n\n\t\tlet columnWidths = this.getColumnWidths(container.children, columnCount, maxCellWidth, availableWidth);\n\n\t\tlet prevY = paddingTop;\n\n\t\tlet column = 0;\n\t\tlet maxColumnHeight = 0;\n\n\t\tcolumnCount = columnWidths.length;\n\n\t\tlet prevX = paddingLeft;\n\n\t\tcontainer.children.each((child) => {\n\t\t\tif (child.get(\"position\") == \"relative\" && !child.isHidden()) {\n\t\t\t\tconst marginTop = child.get(\"marginTop\", 0);\n\t\t\t\tconst marginBottom = child.get(\"marginBottom\", 0);\n\n\t\t\t\tlet bounds = child.adjustedLocalBounds();\n\n\t\t\t\tlet marginLeft = child.get(\"marginLeft\", 0);\n\t\t\t\tlet marginRight = child.get(\"marginRight\", 0);\n\t\t\t\tlet x = prevX + marginLeft - bounds.left;\n\t\t\t\tlet y = prevY + marginTop - bounds.top;\n\n\t\t\t\tchild.setPrivate(\"x\", x);\n\t\t\t\tchild.setPrivate(\"y\", y);\n\n\t\t\t\tprevX += columnWidths[column] + marginRight;\n\n\t\t\t\tmaxColumnHeight = Math.max(maxColumnHeight, child.height() + marginTop + marginBottom);\n\n\t\t\t\tcolumn++;\n\n\t\t\t\tif (column >= columnCount) {\n\t\t\t\t\tcolumn = 0;\n\t\t\t\t\tprevX = paddingLeft;\n\t\t\t\t\tprevY += maxColumnHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getColumnWidths(children: List, columnCount: number, maxCellWidth: number, availableWidth: number): number[] {\n\t\tlet totalWidth = 0;\n\t\tlet columnWidths: Array = [];\n\t\tlet column = 0;\n\n\t\tchildren.each((child) => {\n\t\t\tlet bounds = child.adjustedLocalBounds();\n\t\t\tif (child.get(\"position\") != \"absolute\" && !child.isHidden()) {\n\t\t\t\tif (this.get(\"fixedWidthGrid\")) {\n\t\t\t\t\tcolumnWidths[column] = maxCellWidth;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcolumnWidths[column] = Math.max(columnWidths[column] | 0, bounds.right - bounds.left + child.get(\"marginLeft\", 0) + child.get(\"marginRight\", 0));\n\t\t\t\t}\n\n\t\t\t\tif (column < children.length - 1) {\n\t\t\t\t\tcolumn++;\n\t\t\t\t\tif (column == columnCount) {\n\t\t\t\t\t\tcolumn = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t$array.each(columnWidths, (w) => {\n\t\t\ttotalWidth += w;\n\t\t})\n\n\t\tif (totalWidth > availableWidth) {\n\t\t\tif (columnCount > 2) {\n\t\t\t\tcolumnCount -= 1;\n\t\t\t\treturn this.getColumnWidths(children, columnCount, maxCellWidth, availableWidth);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [availableWidth];\n\t\t\t}\n\t\t}\n\n\t\treturn columnWidths;\n\t}\n}\n","import { Layout } from \"./Layout\";\nimport * as $type from \"../util/Type\";\nimport { Percent } from \"../util/Percent\";\nimport type { Container } from \"./Container\";\n\n/**\n * A horizontal children layout for [[Container]].\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/containers/#Layout} for more info\n */\nexport class HorizontalLayout extends Layout {\n\n\tpublic static className: string = \"HorizontalLayout\";\n\tpublic static classNames: Array = Layout.classNames.concat([HorizontalLayout.className]);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateContainer(container: Container): void {\n\n\t\tlet paddingLeft = container.get(\"paddingLeft\", 0);\n\n\t\tlet availableWidth = container.innerWidth();\n\n\t\tlet totalPercent = 0;\n\n\t\tcontainer.children.each((child) => {\n\t\t\tif (child.get(\"position\") == \"relative\") {\n\t\t\t\tlet childWidth = child.get(\"width\");\n\t\t\t\tif (childWidth instanceof Percent) {\n\t\t\t\t\ttotalPercent += childWidth.value;\n\n\t\t\t\t\tlet w = availableWidth * childWidth.value;\n\t\t\t\t\tlet minWidth = child.get(\"minWidth\", -Infinity);\n\t\t\t\t\tif (minWidth > w) {\n\t\t\t\t\t\tavailableWidth -= minWidth;\n\t\t\t\t\t\ttotalPercent -= childWidth.value;\n\t\t\t\t\t}\n\t\t\t\t\tlet maxWidth = child.get(\"maxWidth\", Infinity);\n\t\t\t\t\tif (w > maxWidth) {\n\t\t\t\t\t\tavailableWidth -= maxWidth;\n\t\t\t\t\t\ttotalPercent -= childWidth.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!$type.isNumber(childWidth)) {\n\t\t\t\t\t\tchildWidth = child.width();\n\t\t\t\t\t}\n\t\t\t\t\tavailableWidth -= childWidth + child.get(\"marginLeft\", 0) + child.get(\"marginRight\", 0);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (availableWidth > 0) {\n\t\t\tcontainer.children.each((child) => {\n\t\t\t\tif (child.get(\"position\") == \"relative\") {\n\t\t\t\t\tlet childWidth = child.get(\"width\");\n\t\t\t\t\tif (childWidth instanceof Percent) {\n\t\t\t\t\t\tlet privateWidth = availableWidth * childWidth.value / totalPercent - child.get(\"marginLeft\", 0) - child.get(\"marginRight\", 0);\n\t\t\t\t\t\tlet minWidth = child.get(\"minWidth\", -Infinity);\n\t\t\t\t\t\tlet maxWidth = child.get(\"maxWidth\", Infinity);\n\t\t\t\t\t\tprivateWidth = Math.min(Math.max(minWidth, privateWidth), maxWidth);\n\n\t\t\t\t\t\tchild.setPrivate(\"width\", privateWidth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet prevX = paddingLeft;\n\n\t\tcontainer.children.each((child) => {\n\t\t\tif (child.get(\"position\") == \"relative\") {\n\t\t\t\tlet bounds = child.adjustedLocalBounds();\n\t\t\t\tlet marginLeft = child.get(\"marginLeft\", 0);\n\t\t\t\tlet marginRight = child.get(\"marginRight\", 0);\n\n\t\t\t\tlet x = prevX + marginLeft - bounds.left;\n\t\t\t\tchild.setPrivate(\"x\", x);\n\t\t\t\tprevX = x + bounds.right + marginRight;\n\t\t\t}\n\t\t});\n\t}\n}\n","import type { Color } from \"../util/Color\";\nimport type { Percent } from \"../util/Percent\";\nimport type { DataItem, IComponentDataItem } from \"./Component\";\n\nimport { Text } from \"../render/Text\";\nimport { p50, p100 } from \"../util/Percent\";\nimport { Container, IContainerPrivate, IContainerSettings } from \"./Container\";\n\nimport * as $array from \"../../core/util/Array\";\nimport * as $type from \"../../core/util/Type\";\n\n\nexport interface ILabelSettings extends IContainerSettings {\n\n\t/**\n\t * Labels' text.\n\t */\n\ttext?: string;\n\n\t/**\n\t * Text color.\n\t */\n\tfill?: Color;\n\n\t/**\n\t * Alignment.\n\t */\n\ttextAlign?: \"start\" | \"end\" | \"left\" | \"right\" | \"center\";\n\n\t/**\n\t * Font family to use for the label.\n\t *\n\t * Multiple fonts can be separated by commas.\n\t */\n\tfontFamily?: string;\n\n\t/**\n\t * Font size in misc any supported CSS format (pixel, point, em, etc.).\n\t */\n\tfontSize?: string | number;\n\n\t/**\n\t * Font weight.\n\t */\n\tfontWeight?: \"normal\" | \"bold\" | \"bolder\" | \"lighter\" | \"100\" | \"200\" | \"300\" | \"400\" | \"500\" | \"600\" | \"700\" | \"800\" | \"900\";\n\n\t/**\n\t * Font style.\n\t */\n\tfontStyle?: \"normal\" | \"italic\" | \"oblique\";\n\n\t/**\n\t * Font variant.\n\t */\n\tfontVariant?: \"normal\" | \"small-caps\";\n\n\t/**\n\t * Text decoration.\n\t *\n\t * The only option currently supported is `\"underline\"`.\n\t *\n\t * @since 5.0.15\n\t */\n\ttextDecoration?: \"underline\";\n\n\t/**\n\t * Line height in percent or absolute pixels.\n\t */\n\tlineHeight?: Percent | number;\n\n\t/**\n\t * How mouch of the height should be considered to go below baseline.\n\t *\n\t * @default 0.19\n\t */\n\tbaselineRatio?: number;\n\n\t/**\n\t * Opacity of the label.\n\t *\n\t * 0 - fully transparent; 1 - fully opaque.\n\t */\n\topacity?: number;\n\n\t/**\n\t * Text direction.\n\t *\n\t * @default \"ltr\"\n\t */\n\tdirection?: \"ltr\" | \"rtl\";\n\n\t/**\n\t * A base line to use when aligning text chunks vertically.\n\t */\n\ttextBaseline?: \"top\" | \"hanging\" | \"middle\" | \"alphabetic\" | \"ideographic\" | \"bottom\";\n\n\t/**\n\t * How to handle labels that do not fit into its designated space.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/labels/#Oversized_text} for more info\n\t */\n\toversizedBehavior?: \"none\" | \"hide\" | \"fit\" | \"wrap\" | \"truncate\";\n\n\t/**\n\t * Whether words can be broken when truncating or wrapping text.\n\t *\n\t * @default false\n\t */\n\tbreakWords?: boolean;\n\n\t/**\n\t * Ellipsis characters to use when truncating text.\n\t *\n\t * Will use Unicode ellipsis symbol (`\"…\"`) by default, which might not be\n\t * available in all fonts. If ellipsis looks broken, use different\n\t * characters. E.g.:\n\t *\n\t * ```TypeScript\n\t * label.set(\"ellipsis\", \"...\");\n\t * ```\n\t * ```JavaScript\n\t * label.set(\"ellipsis\", \"...\");\n\t * ```\n\t *\n\t *\n\t * @default \"…\"\n\t */\n\tellipsis?: string;\n\n\t/**\n\t * Minimum relative scale allowed for label when scaling down\n\t * when `oversizedBehavior` is set to `\"fit\"`.\n\t *\n\t * If fitting the label would require it to scale beyond `minScale` it would\n\t * be hidden instead.\n\t */\n\tminScale?: number;\n\n\t/**\n\t * If set to `true` the label will parse `text` for data placeholders and\n\t * will try to populate them with actual data.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/labels/#Data_placeholders} for more info\n\t */\n\tpopulateText?: boolean;\n\n\t/**\n\t * If set to `true`, will ignore in-line formatting blocks and will display\n\t * text exactly as it is.\n\t *\n\t * @default false\n\t */\n\tignoreFormatting?: boolean;\n\n\t/**\n\t * Color of the element's shadow.\n\t *\n\t * For this to work at least one of the following needs to be set as well:\n\t * `shadowBlur`, `shadowOffsetX`, `shadowOffsetY`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowColor?: Color | null;\n\n\t/**\n\t * Blurriness of the the shadow.\n\t *\n\t * The bigger the number, the more blurry shadow will be.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowBlur?: number;\n\n\t/**\n\t * Horizontal shadow offset in pixels.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOffsetX?: number;\n\n\t/**\n\t * Vertical shadow offset in pixels.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOffsetY?: number;\n\n\t/**\n\t * Opacity of the shadow (0-1).\n\t *\n\t * If not set, will use the same as `fillOpacity` of the element.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOpacity?: number;\n\n\t// The following migh be supported some day:\n\t// padding?: number;\n\t// stroke?: number;\n\t// strokeThickness?: number;\n\t// trim?: number;\n\t// wordWrap?: boolean;\n\t// leading?: number;\n\t// letterSpacing?: number;\n}\n\nexport interface ILabelPrivate extends IContainerPrivate {\n}\n\n/**\n * Creates a label with support for in-line styling and data bindings.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/labels/} for more info\n */\nexport class Label extends Container {\n\n\tdeclare public _settings: ILabelSettings;\n\tdeclare public _privateSettings: ILabelPrivate;\n\n\tprotected _text!: Text;\n\n\tprotected _textKeys: Array = [\n\t\t\"text\",\n\t\t\"fill\",\n\t\t\"textAlign\",\n\t\t\"fontFamily\",\n\t\t\"fontSize\",\n\t\t\"fontStyle\",\n\t\t\"fontWeight\",\n\t\t\"fontStyle\",\n\t\t\"fontVariant\",\n\t\t\"textDecoration\",\n\t\t\"shadowColor\",\n\t\t\"shadowBlur\",\n\t\t\"shadowOffsetX\",\n\t\t\"shadowOffsetY\",\n\t\t\"shadowOpacity\",\n\t\t// \"leading\",\n\t\t// \"letterSpacing\",\n\t\t\"lineHeight\",\n\t\t\"baselineRatio\",\n\t\t//\"padding\",\n\t\t// \"stroke\",\n\t\t// \"strokeThickness\",\n\t\t// \"trim\",\n\t\t// \"wordWrap\",\n\t\t\"direction\",\n\t\t\"textBaseline\",\n\t\t\"oversizedBehavior\",\n\t\t\"breakWords\",\n\t\t\"ellipsis\",\n\t\t\"minScale\",\n\t\t\"populateText\",\n\t\t\"role\",\n\t\t\"ignoreFormatting\"\n\t];\n\n\tpublic static className: string = \"Label\";\n\tpublic static classNames: Array = Container.classNames.concat([Label.className]);\n\n\t/**\n\t * @ignore Text is not to be used directly\n\t */\n\tpublic get text(): Text {\n\t\treturn this._text;\n\t}\n\n\tprotected _afterNew() {\n\t\tsuper._afterNew();\n\n\t\tthis._makeText();\n\n\t\t$array.each(this._textKeys, (property) => {\n\t\t\tconst propValue = this.get(property as any);\n\t\t\tif (propValue != undefined) {\n\t\t\t\tthis._text.set(property as any, propValue);\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic _makeText() {\n\t\tthis._text = this.children.push(Text.new(this._root, {}));\n\t}\n\n\tpublic _updateChildren() {\n\t\tsuper._updateChildren();\n\n\t\t$array.each(this._textKeys, (property) => {\n\t\t\tthis._text.set(property as any, this.get(property as any));\n\t\t})\n\n\t\tif (this.isDirty(\"maxWidth\")) {\n\t\t\tthis._setMaxDimentions();\n\t\t}\n\n\t\tif (this.isDirty(\"maxHeight\")) {\n\t\t\tthis._setMaxDimentions();\n\t\t}\n\n\t\tif (this.isDirty(\"rotation\")) {\n\t\t\tthis._setMaxDimentions();\n\t\t}\n\n\t\tif (this.isDirty(\"textAlign\") || this.isDirty(\"width\")) {\n\t\t\tconst textAlign = this.get(\"textAlign\");\n\t\t\tlet x: number | Percent | undefined;\n\t\t\tif (this.get(\"width\") != null) {\n\t\t\t\tif (textAlign == \"right\") {\n\t\t\t\t\tx = p100;\n\t\t\t\t}\n\t\t\t\telse if (textAlign == \"center\") {\n\t\t\t\t\tx = p50;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (textAlign == \"left\" || textAlign == \"start\") {\n\t\t\t\t\tx = this.get(\"paddingLeft\");\n\t\t\t\t}\n\t\t\t\telse if (textAlign == \"right\" || textAlign == \"end\") {\n\t\t\t\t\tx = -this.get(\"paddingRight\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.text.set(\"x\", x);\n\t\t}\n\t}\n\n\tprotected _setMaxDimentions() {\n\t\tconst rotation = this.get(\"rotation\");\n\t\tconst vertical = rotation == 90 || rotation == 270;\n\n\t\tconst maxWidth = this.get(\"maxWidth\", Infinity);\n\t\tif ($type.isNumber(maxWidth)) {\n\t\t\tthis.text.set(vertical ? \"maxHeight\" : \"maxWidth\", maxWidth - this.get(\"paddingLeft\", 0) - this.get(\"paddingRight\", 0));\n\t\t}\n\t\telse {\n\t\t\tthis.text.set(vertical ? \"maxHeight\" : \"maxWidth\", undefined);\n\t\t}\n\n\t\tconst maxHeight = this.get(\"maxHeight\", Infinity);\n\t\tif ($type.isNumber(maxHeight)) {\n\t\t\tthis.text.set(vertical ? \"maxWidth\" : \"maxHeight\", maxHeight - this.get(\"paddingTop\", 0) - this.get(\"paddingBottom\", 0));\n\t\t}\n\t\telse {\n\t\t\tthis.text.set(vertical ? \"maxWidth\" : \"maxHeight\", undefined);\n\t\t}\n\t}\n\n\tpublic _setDataItem(dataItem?: DataItem): void {\n\t\tsuper._setDataItem(dataItem);\n\t\tthis._markDirtyKey(\"text\")\n\t\tif (this.text.get(\"populateText\")) {\n\t\t\tthis.text.markDirtyText();\n\t\t}\n\t}\n\n\t/**\n\t * Returns text with populated placeholders and formatting if `populateText` is\n\t * set to `true`.\n\t *\n\t * @return Populated text\n\t */\n\tpublic getText(): string {\n\t\treturn this._text._getText();\n\t}\n}\n","import type { Container } from \"./Container\";\nimport { Entity, IEntitySettings, IEntityPrivate } from \"../util/Entity\";\n\nexport interface ILayoutSettings extends IEntitySettings {\n}\n\nexport interface ILayoutPrivate extends IEntityPrivate {\n}\n\n/**\n * Base class for [[Container]] layouts.\n */\nexport abstract class Layout extends Entity {\n\tdeclare public _settings: ILayoutSettings;\n\tdeclare public _privateSettings: ILayoutPrivate;\n\n\tpublic static className: string = \"Layout\";\n\tpublic static classNames: Array = Entity.classNames.concat([Layout.className]);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic abstract updateContainer(_container: Container): void;\n}\n","/** @ignore *//** */\n\nimport type { IPoint } from \"./IPoint\"\nimport * as $math from \"./Math\";\nimport type { IGraphics } from \"../render/backend/Renderer\";\n\n/**\n * @ignore\n */\nexport function segmentedLine(display: IGraphics, segments: Array>>) {\n\tfor (let s = 0, len = segments.length; s < len; s++) {\n\t\tconst groups = segments[s];\n\t\tif (groups.length > 0) {\n\t\t\tlet firstGroup = groups[0];\n\t\t\tif (firstGroup.length > 0) {\n\t\t\t\tlet firstPoint = firstGroup[0];\n\t\t\t\tdisplay.moveTo(firstPoint.x, firstPoint.y);\n\t\t\t\tfor (let g = 0, len = groups.length; g < len; g++) {\n\t\t\t\t\tline(display, groups[g]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nexport function line(display: IGraphics, points: Array) {\n\tfor (let p = 0, len = points.length; p < len; p++) {\n\t\tconst point = points[p];\n\t\tdisplay.lineTo(point.x, point.y);\n\t}\n}\n\n/**\n * @ignore\n */\nexport function moveTo(display: IGraphics, point: IPoint) {\n\tdisplay.moveTo(point.x, point.y);\n}\n\n/**\n * @ignore\n */\nexport function clear(display: IGraphics) {\n\tdisplay.clear();\n}\n\n/**\n * @ignore\n */\nexport function smoothedSegmentedline(display: IGraphics, segments: Array>>, tensionX: number, tensionY: number) {\n\tfor (let s = 0, len = segments.length; s < len; s++) {\n\t\tconst groups = segments[s];\n\t\tif (groups.length > 0) {\n\t\t\tlet firstGroup = groups[0];\n\t\t\tif (firstGroup.length > 0) {\n\t\t\t\tlet firstPoint = firstGroup[0];\n\t\t\t\tdisplay.moveTo(firstPoint.x, firstPoint.y);\n\t\t\t\tfor (let g = 0, len = groups.length; g < len; g++) {\n\t\t\t\t\tconst points = groups[g];\n\t\t\t\t\tif (points.length > 0) {\n\t\t\t\t\t\tdisplay.lineTo(points[0].x, points[0].y)\n\t\t\t\t\t}\n\t\t\t\t\tsmoothedLine(display, points, tensionX, tensionY);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nexport function smoothedLine(display: IGraphics, points: Array, tensionX: number, tensionY: number) {\n\n\tfor (let i = points.length - 1; i > 0; i--) {\n\t\tlet p0 = points[i];\n\t\tlet p1 = points[i - 1];\n\n\t\tif (Math.abs(p0.x - p1.x) < 0.1 && Math.abs(p0.y - p1.y) < 0.1) {\n\t\t\tpoints.splice(i - 1, 1);\n\t\t}\n\t}\n\n\tif (points.length < 3 || (tensionX >= 1 && tensionY >= 1)) {\n\t\tline(display, points);\n\t\treturn;\n\t}\n\n\ttensionX = 1 - tensionX + 0.00001;\n\ttensionY = 1 - tensionY + 0.00001;\n\n\tlet first = points[0];\n\tlet last = points[points.length - 1];\n\n\tlet closed: boolean = false;\n\n\tif ($math.round(first.x, 3) == $math.round(last.x) && $math.round(first.y) == $math.round(last.y)) {\n\t\tclosed = true;\n\t}\n\n\t// Can't moveTo here, as it wont be possible to have fill then.\n\tlet path: string = \"\";\n\n\tfor (let i = 0, len = points.length - 1; i < len; i++) {\n\t\tlet p0: IPoint = points[i - 1];\n\n\t\tlet p1: IPoint = points[i];\n\n\t\tlet p2: IPoint = points[i + 1];\n\n\t\tlet p3: IPoint = points[i + 2];\n\n\t\tif (i === 0) {\n\t\t\tif (closed) {\n\t\t\t\tp0 = points[len - 2];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tp0 = points[0];\n\t\t\t}\n\t\t} else if (i == len - 1) {\n\t\t\tif (closed) {\n\t\t\t\tp3 = points[1];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tp3 = p2;\n\t\t\t}\n\t\t}\n\n\n\t\tlet controlPointA = $math.getCubicControlPointA(p0, p1, p2, tensionX, tensionY);\n\t\tlet controlPointB = $math.getCubicControlPointB(p1, p2, p3, tensionX, tensionY);\n\n\t\tdisplay.bezierCurveTo(controlPointA.x, controlPointA.y, controlPointB.x, controlPointB.y, p2.x, p2.y);\n\t}\n\n\treturn path;\n}\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\nimport type { IPoint } from \"../util/IPoint\";\nimport * as $draw from \"../util/Draw\";\n\nexport interface ILineSettings extends IGraphicsSettings {\n\n\t/**\n\t * A list of [[IPoint]] (x/y coordinates) points for the line.\n\t */\n\tpoints?: Array;\n\n}\n\nexport interface ILinePrivate extends IGraphicsPrivate {\n}\n\n/**\n * Draws a line.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n * @important\n */\nexport class Line extends Graphics {\n\n\tdeclare public _settings: ILineSettings;\n\tdeclare public _privateSettings: ILinePrivate;\n\n\tpublic static className: string = \"Line\";\n\tpublic static classNames: Array = Graphics.classNames.concat([Line.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"points\") || this._sizeDirty || this.isPrivateDirty(\"width\") || this.isPrivateDirty(\"height\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this._clear) {\n\n\t\t\tconst points = this.get(\"points\")!;\n\n\t\t\tif (points && points.length > 0) {\n\t\t\t\tlet point = points[0];\n\n\t\t\t\tthis._display.moveTo(point.x, point.y);\n\t\t\t\t$draw.segmentedLine(this._display, [[points]]);\n\t\t\t}\n\t\t\telse if (!this.get(\"draw\")) {\n\t\t\t\tlet w = this.width();\n\t\t\t\tlet h = this.height();\n\n\t\t\t\tthis._display.moveTo(0, 0);\n\t\t\t\tthis._display.lineTo(w, h);\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * @ignore\n */\nexport class MonotoneXTension {\n\n constructor(context: CanvasRenderingContext2D, tension: number) {\n this._context = context;\n this._tension = tension;\n }\n\n public _line = 0;\n public _point = 0;\n public _context: any;\n public _x0 = 0;\n public _x1 = 0;\n public _y0 = 0;\n public _y1 = 0;\n public _t0 = 0;\n\n public _tension: number = 0;\n\n public areaStart() {\n this._line = 0;\n }\n\n public areaEnd() {\n this._line = NaN;\n }\n\n public lineStart() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n }\n\n public lineEnd() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n }\n\n public point(x: number, y: number) {\n let t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\n/**\n * @ignore\n */\nexport function curveMonotoneXTension(tension: number) {\n\n function monotoneXTension(context: any) {\n return new MonotoneXTension(context, tension);\n }\n\n return monotoneXTension;\n}\n\n/**\n * @ignore\n */\nfunction sign(x: number) {\n return x < 0 ? -1 : 1;\n}\n\n/**\n * @ignore\n */\nfunction slope3(that: MonotoneXTension, x2: number, y2: number) {\n let h0 = (that._x1 - that._x0) as any;\n let h1 = (x2 - that._x1) as any;\n let s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0);\n let s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0);\n let p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n/**\n * @ignore\n */\nfunction slope2(that: MonotoneXTension, t: number) {\n let h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n/**\n * @ignore\n */\nfunction point(that: MonotoneXTension, t0: number, t1: number) {\n let x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 1.5 * (1 - that._tension);\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}","/**\n * @ignore\n */\nexport class MonotoneYTension {\n\n constructor(context: any, tension: number) {\n this._context = context;\n this._tension = tension;\n }\n\n public _line = 0;\n public _point = 0;\n public _context: any;\n public _x0 = 0;\n public _x1 = 0;\n public _y0 = 0;\n public _y1 = 0;\n public _t0 = 0;\n\n public _tension: number = 0;\n\n public areaStart() {\n this._line = 0;\n }\n\n public areaEnd() {\n this._line = NaN;\n }\n\n public lineStart() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n }\n\n public lineEnd() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n }\n\n public point(x: number, y: number) {\n\n [x, y] = [y, x]\n\n let t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(y, x) : this._context.moveTo(y, x); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\n/**\n * @ignore\n */\nexport function curveMonotoneYTension(tension: number) {\n\n function monotoneYTension(context: any) {\n return new MonotoneYTension(context, tension);\n }\n\n monotoneYTension.tension = function(tension: number) {\n return curveMonotoneYTension(+tension);\n };\n\n return monotoneYTension;\n}\n\n\n/**\n * @ignore\n */\nfunction sign(x: number) {\n return x < 0 ? -1 : 1;\n}\n\n/**\n * @ignore\n */\nfunction slope3(that: MonotoneYTension, x2: number, y2: number) {\n let h0 = (that._x1 - that._x0) as any;\n let h1 = (x2 - that._x1) as any;\n let s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0);\n let s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0);\n let p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n/**\n * @ignore\n */\nfunction slope2(that: MonotoneYTension, t: number) {\n let h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n/**\n * @ignore\n */\nfunction point(that: MonotoneYTension, t0: number, t1: number) {\n let x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 1.5 * (1 - that._tension);\n that._context.bezierCurveTo(y0 + dx * t0, x0 + dx, y1 - dx * t1, x1 - dx, y1, x1);\n}","import type { IPicture } from \"./backend/Renderer\";\nimport type { Color } from \"../util/Color\";\n\nimport { Sprite, ISpriteSettings, ISpritePrivate } from \"./Sprite\";\n\nimport * as $type from \"../util/Type\";\n\nexport interface IPictureSettings extends ISpriteSettings {\n\n\t/**\n\t * A source URI of the image.\n\t *\n\t * Can be relative or absolute URL, or data-uri.\n\t */\n\tsrc?: string;\n\n\t/**\n\t * Color of the element's shadow.\n\t *\n\t * For this to work at least one of the following needs to be set as well:\n\t * `shadowBlur`, `shadowOffsetX`, `shadowOffsetY`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowColor?: Color | null;\n\n\t/**\n\t * Blurriness of the the shadow.\n\t *\n\t * The bigger the number, the more blurry shadow will be.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowBlur?: number;\n\n\t/**\n\t * Horizontal shadow offset in pixels.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOffsetX?: number;\n\n\t/**\n\t * Vertical shadow offset in pixels.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOffsetY?: number;\n\n\t/**\n\t * Opacity of the shadow (0-1).\n\t *\n\t * If not set, will use the same as `fillOpacity` of the element.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/shadows/} for more info\n\t */\n\tshadowOpacity?: number;\n\n}\n\nexport interface IPicturePrivate extends ISpritePrivate {\n}\n\n/**\n * Displays an image.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/images/} for more info\n * @important\n */\nexport class Picture extends Sprite {\n\n\tdeclare public _settings: IPictureSettings;\n\tdeclare public _privateSettings: IPicturePrivate;\n\n\tpublic _display: IPicture = this._root._renderer.makePicture(undefined);\n\n\tpublic static className: string = \"Picture\";\n\tpublic static classNames: Array = Sprite.classNames.concat([Picture.className]);\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this.isDirty(\"width\")) {\n\t\t\tconst width = this.get(\"width\");\n\t\t\tthis._display.width = $type.isNumber(width) ? width : undefined;\n\t\t}\n\n\t\tif (this.isDirty(\"height\")) {\n\t\t\tconst height = this.get(\"height\");\n\t\t\tthis._display.height = $type.isNumber(height) ? height : undefined;\n\t\t}\n\n\t\tif (this.isDirty(\"shadowColor\")) {\n\t\t\tthis._display.clear();\n\t\t\tconst shadowColor = this.get(\"shadowColor\");\n\t\t\tthis._display.shadowColor = shadowColor == null ? undefined : shadowColor;\n\t\t}\n\n\t\tif (this.isDirty(\"shadowBlur\")) {\n\t\t\tthis._display.clear();\n\t\t\tthis._display.shadowBlur = this.get(\"shadowBlur\");\n\t\t}\n\n\t\tif (this.isDirty(\"shadowOffsetX\")) {\n\t\t\tthis._display.clear();\n\t\t\tthis._display.shadowOffsetX = this.get(\"shadowOffsetX\");\n\t\t}\n\n\t\tif (this.isDirty(\"shadowOffsetY\")) {\n\t\t\tthis._display.clear();\n\t\t\tthis._display.shadowOffsetY = this.get(\"shadowOffsetY\");\n\t\t}\n\n\t\tif (this.isDirty(\"shadowOpacity\")) {\n\t\t\tthis._display.clear();\n\t\t\tthis._display.shadowOpacity = this.get(\"shadowOpacity\");\n\t\t}\n\n\t\tif (this.isDirty(\"src\")) {\n\t\t\tthis._display.clear();\n\t\t\tthis._load();\n\t\t}\n\t}\n\n\tprotected _load() {\n\t\tconst src = this.get(\"src\");\n\t\tif (src) {\n\t\t\tconst image = new Image();\n\t\t\t//image.crossOrigin = \"Anonymous\";\n\t\t\timage.src = src!;\n\t\t\timage.decode().then(() => {\n\t\t\t\tthis._display.image = image;\n\t\t\t\tthis._updateSize();\n\t\t\t}).catch((_error: any) => {\n\t\t\t\t// TODO: maybe raise error?\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic _updateSize() {\n\t\tsuper._updateSize();\n\n\t\tconst image = this._display.image;\n\t\tif (image) {\n\t\t\tlet w = this.getPrivate(\"width\", this.get(\"width\"));\n\t\t\tlet h = this.getPrivate(\"height\", this.get(\"height\"));\n\t\t\tconst r = image.width && image.height ? image.width / image.height : 0;\n\n\t\t\tif ($type.isNumber(w) && $type.isNumber(h)) {\n\t\t\t\tthis._display.width = w;\n\t\t\t\tthis._display.height = h;\n\t\t\t}\n\t\t\telse if ($type.isNumber(w) && r) {\n\t\t\t\th = w / r;\n\t\t\t}\n\t\t\telse if ($type.isNumber(h) && r) {\n\t\t\t\tw = h * r;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tw = image.width;\n\t\t\t\th = image.height;\n\t\t\t}\n\n\t\t\tif ($type.isNumber(w)) {\n\t\t\t\tthis._display.width = w;\n\t\t\t}\n\t\t\tif ($type.isNumber(h)) {\n\t\t\t\tthis._display.height = h;\n\t\t\t}\n\t\t\tthis.markDirtyBounds();\n\t\t\tthis.markDirty();\n\t\t}\n\t}\n}\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\nimport * as $math from \"../util/Math\";\n\nexport interface IPointedRectangleSettings extends IGraphicsSettings {\n\n\t/**\n\t * A width of the pinter's (stem's) thick end (base) in pixels.\n\t */\n\tpointerBaseWidth?: number;\n\n\t/**\n\t * A length of the pinter (stem) in pixels.\n\t */\n\tpointerLength?: number;\n\n\t/**\n\t * X coordinate the shape is pointing to.\n\t */\n\tpointerX?: number;\n\n\t/**\n\t * Y coordinate the shape is pointing to.\n\t */\n\tpointerY?: number;\n\n\t/**\n\t * Corner radius in pixels.\n\t */\n\tcornerRadius?: number;\n}\n\nexport interface IPointedRectanglePrivate extends IGraphicsPrivate {\n}\n\n/**\n * Draws a rectangle with a pointer.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n * @important\n */\nexport class PointedRectangle extends Graphics {\n\n\tdeclare public _settings: IPointedRectangleSettings;\n\tdeclare public _privateSettings: IPointedRectanglePrivate;\n\n\tpublic static className: string = \"PointedRectangle\";\n\tpublic static classNames: Array = Graphics.classNames.concat([PointedRectangle.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"pointerBaseWidth\") || this.isDirty(\"cornerRadius\") || this.isDirty(\"pointerLength\") || this.isDirty(\"pointerX\") || this.isDirty(\"pointerY\") || this.isDirty(\"width\") || this.isDirty(\"height\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this._clear) {\n\n\t\t\tthis.markDirtyBounds();\n\n\t\t\tlet w = this.width();\n\t\t\tlet h = this.height();\n\n\t\t\tif (w > 0 && h > 0) {\n\t\t\t\tlet cr = this.get(\"cornerRadius\", 8);\n\t\t\t\tcr = $math.fitToRange(cr, 0, Math.min(w / 2, h / 2));\n\n\t\t\t\tlet x = this.get(\"pointerX\", 0);\n\t\t\t\tlet y = this.get(\"pointerY\", 0);\n\t\t\t\tlet bwh = this.get(\"pointerBaseWidth\", 15) / 2;\n\n\t\t\t\t// corner coordinates\n\t\t\t\t// top left\n\t\t\t\tlet xtl = 0;\n\t\t\t\tlet ytl = 0;\n\t\t\t\t// top right\n\t\t\t\tlet xtr = w;\n\t\t\t\tlet ytr = 0;\n\t\t\t\t// bottom right\n\t\t\t\tlet xbr = w;\n\t\t\t\tlet ybr = h;\n\t\t\t\t// bottom left\n\t\t\t\tlet xbl = 0;\n\t\t\t\tlet ybl = h;\n\n\t\t\t\t// find stem base side: http://$math.stackexchange.com/questions/274712/calculate-on-which-side-of-straign-line-is-dot-located\n\t\t\t\t// d=(x−x1)(y2−y1)−(y−y1)(x2−x1)\n\t\t\t\tlet d1 = (x - xtl) * (ybr - ytl) - (y - ytl) * (xbr - xtl);\n\t\t\t\tlet d2 = (x - xbl) * (ytr - ybl) - (y - ybl) * (xtr - xbl);\n\n\t\t\t\tconst display = this._display;\n\t\t\t\t// top\n\t\t\t\tdisplay.moveTo(cr, 0);\n\n\t\t\t\tif (d1 > 0 && d2 > 0) {\n\t\t\t\t\tlet stemX = Math.round($math.fitToRange(x, cr + bwh, w - bwh - cr));\n\t\t\t\t\ty = $math.fitToRange(y, -Infinity, 0);\n\n\t\t\t\t\tdisplay.lineTo(stemX - bwh, 0);\n\t\t\t\t\tdisplay.lineTo(x, y);\n\t\t\t\t\tdisplay.lineTo(stemX + bwh, 0);\n\t\t\t\t}\n\n\t\t\t\tdisplay.lineTo(w - cr, 0);\n\t\t\t\tdisplay.arcTo(w, 0, w, cr, cr);\n\n\t\t\t\t// right\n\t\t\t\tif (d1 > 0 && d2 < 0) {\n\t\t\t\t\tlet stemY = Math.round($math.fitToRange(y, cr + bwh, h - bwh - cr));\n\t\t\t\t\tx = $math.fitToRange(x, w, Infinity);\n\t\t\t\t\tdisplay.lineTo(w, cr);\n\t\t\t\t\tdisplay.lineTo(w, stemY - bwh);\n\t\t\t\t\tdisplay.lineTo(x, y);\n\t\t\t\t\tdisplay.lineTo(w, stemY + bwh);\n\t\t\t\t}\n\t\t\t\tdisplay.lineTo(w, h - cr);\n\t\t\t\tdisplay.arcTo(w, h, w - cr, h, cr);\n\n\t\t\t\t// bottom\n\t\t\t\tif (d1 < 0 && d2 < 0) {\n\t\t\t\t\tlet stemX = Math.round($math.fitToRange(x, cr + bwh, w - bwh - cr));\n\t\t\t\t\ty = $math.fitToRange(y, h, Infinity);\n\n\t\t\t\t\tdisplay.lineTo(w - cr, h);\n\t\t\t\t\tdisplay.lineTo(stemX + bwh, h);\n\t\t\t\t\tdisplay.lineTo(x, y);\n\t\t\t\t\tdisplay.lineTo(stemX - bwh, h);\n\t\t\t\t}\n\t\t\t\tdisplay.lineTo(cr, h)\n\t\t\t\tdisplay.arcTo(0, h, 0, h - cr, cr);\n\n\n\t\t\t\t// left\n\t\t\t\tif (d1 < 0 && d2 > 0) {\n\t\t\t\t\tlet stemY = Math.round($math.fitToRange(y, cr + bwh, h - cr - bwh));\n\t\t\t\t\tx = $math.fitToRange(x, -Infinity, 0);\n\t\t\t\t\tdisplay.lineTo(0, h - cr);\n\t\t\t\t\tdisplay.lineTo(0, stemY + bwh);\n\t\t\t\t\tdisplay.lineTo(x, y);\n\t\t\t\t\tdisplay.lineTo(0, stemY - bwh);\n\t\t\t\t}\n\t\t\t\tdisplay.lineTo(0, cr);\n\t\t\t\tdisplay.arcTo(0, 0, cr, 0, cr);\n\t\t\t}\n\t\t}\n\t}\n}\n","// import * as $object from \"../util/Object\";\nimport { p50, Percent } from \"../util/Percent\";\nimport { Label, ILabelPrivate, ILabelSettings } from \"./Label\";\nimport { RadialText } from \"./RadialText\";\n\nimport * as $math from \"../util/Math\";\nimport * as $utils from \"../util/Utils\";\n\n\nexport interface IRadialLabelSettings extends ILabelSettings {\n\n\t/**\n\t * Pixel value to adjust radius with.\n\t *\n\t * Will add to (or subtract from if negative) whatever value `baseRadius` evaluates\n\t * to.\n\t */\n\tradius?: number;\n\n\t/**\n\t * Radius of the label's position.\n\t *\n\t * Can be either set in absolute pixel value, or percent.\n\t *\n\t * Relative value, depending on the situation, will most often mean its\n\t * position within certain circular object, like a slice: 0% meaning inner\n\t * edge, and 100% - the outer edge.\n\t *\n\t * @default 100%\n\t */\n\tbaseRadius?: number | Percent;\n\n\t/**\n\t * Label anngle in degrees.\n\t *\n\t * In most cases it will be set by the chart/series and does not need to\n\t * be set manually.\n\t */\n\tlabelAngle?: number;\n\n\t/**\n\t * Should the text \"face\" inward or outward from the arc the text is\n\t * following.\n\t *\n\t * `\"auto\"` means that facing will be chosen automatically based on the angle\n\t * to enhance readbility.\n\t *\n\t * Only applies if `type = \"circluar\"`.\n\t * \n\t * @default \"auto\"\n\t */\n\torientation?: \"inward\" | \"outward\" | \"auto\";\n\n\t/**\n\t * Should label be drawn inside (`true`) or outside (`false`) the arc.\n\t *\n\t * @default false\n\t */\n\tinside?: boolean;\n\n\t/**\n\t * Label type.\n\t *\n\t * * `\"regular\"` (default) - normal horizontal label.\n\t * * `\"circular\"` - arched label.\n\t * * `\"radial\"` - label radiating from the center of the arc.\n\t * * `\"aligned\"` - horizontal label aligned with other labels horizontally.\n\t * * `\"adjusted\"` - horizontal label adjusted in postion.\n\t *\n\t * @default \"regular\"\n\t */\n\ttextType?: \"regular\" | \"circular\" | \"radial\" | \"aligned\" | \"adjusted\";\n\n\t/**\n\t * Extra spacing between characters, in pixels.\n\t *\n\t * @default 0\n\t */\n\tkerning?: number;\n\n}\n\nexport interface IRadialLabelPrivate extends ILabelPrivate {\n\n\t/**\n\t * @ignore\n\t */\n\tleft?: boolean;\n\n\t/**\n\t * @ignore\n\t */\n\tradius?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tinnerRadius?: number;\n\n}\n\nexport class RadialLabel extends Label {\n\n\tdeclare public _settings: IRadialLabelSettings;\n\tdeclare public _privateSettings: IRadialLabelPrivate;\n\n\tdeclare protected _text: RadialText;\n\n\tpublic static className: string = \"RadialLabel\";\n\tpublic static classNames: Array = Label.classNames.concat([RadialLabel.className]);\n\n\tprotected _flipped: boolean = false;\n\n\tprotected _afterNew() {\n\t\tthis._textKeys.push(\"textType\", \"kerning\");\n\t\tsuper._afterNew();\n\t}\n\n\n\tpublic _makeText() {\n\t\tthis._text = this.children.push(RadialText.new(this._root, {}));\n\t}\n\n\t/**\n\t * Returns base radius in pixels.\n\t * \n\t * @return Base radius\n\t */\n\tpublic baseRadius(): number {\n\t\tconst radiusPrivate = this.getPrivate(\"radius\", 0);\n\t\tconst innerRadiusPrivate = this.getPrivate(\"innerRadius\", 0);\n\t\tconst baseRadius = this.get(\"baseRadius\", 0);\n\t\treturn innerRadiusPrivate + $utils.relativeToValue(baseRadius, radiusPrivate - innerRadiusPrivate);\n\t}\n\n\t/**\n\t * Returns radius adjustment in pixels.\n\t * \n\t * @return Radius\n\t */\n\tpublic radius(): number {\n\t\tconst inside = this.get(\"inside\", false);\n\t\treturn this.baseRadius() + this.get(\"radius\", 0) * (inside ? -1 : 1);\n\t}\n\n\tpublic _updateChildren() {\n\t\tsuper._updateChildren();\n\n\t\tif (this.isDirty(\"baseRadius\") || this.isPrivateDirty(\"radius\") || this.isPrivateDirty(\"innerRadius\") || this.isDirty(\"labelAngle\") || this.isDirty(\"radius\") || this.isDirty(\"inside\") || this.isDirty(\"orientation\") || this.isDirty(\"textType\")) {\n\n\t\t\tconst textType = this.get(\"textType\", \"adjusted\");\n\n\t\t\tconst inside = this.get(\"inside\", false);\n\n\t\t\tconst orientation = this.get(\"orientation\");\n\t\t\tlet labelAngle = $math.normalizeAngle(this.get(\"labelAngle\", 0));\n\n\t\t\tthis._text.set(\"startAngle\", this.get(\"labelAngle\", 0));\n\t\t\tthis._text.set(\"inside\", inside);\n\n\t\t\tconst sin = $math.sin(labelAngle);\n\t\t\tconst cos = $math.cos(labelAngle);\n\n\t\t\tlet baseRadius = this.baseRadius();\n\t\t\tlet radius = this.radius();\n\n\t\t\tthis._display.angle = 0;\n\n\t\t\tif (textType == \"circular\") {\n\n\t\t\t\tthis.setAll({\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tpaddingRight: 0\n\t\t\t\t});\n\n\t\t\t\t// Circular labels are handled and positioned differently\n\n\t\t\t\tthis._text.set(\"orientation\", orientation);\n\t\t\t\tthis._text.set(\"radius\", radius);\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (baseRadius == 0) {\n\t\t\t\t\tlabelAngle = 0;\n\t\t\t\t\tradius = 0;\n\t\t\t\t}\n\n\t\t\t\t// Positioning of radial/regular labels are teh same\n\t\t\t\tlet x = radius * cos;\n\t\t\t\tlet y = radius * sin;\n\n\t\t\t\tif (textType == \"radial\") {\n\n\t\t\t\t\tthis.setRaw(\"x\", x);\n\t\t\t\t\tthis.setRaw(\"y\", y);\n\n\t\t\t\t\tif ((labelAngle < 90) || (labelAngle > 270) || orientation != \"auto\") {\n\t\t\t\t\t\tthis._display.angle = labelAngle;// + 90;\n\t\t\t\t\t\tthis._flipped = false;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._display.angle = labelAngle + 180;\n\t\t\t\t\t\tthis._flipped = true;\n\t\t\t\t\t}\n\t\t\t\t\tthis._dirty.rotation = false;\n\t\t\t\t}\n\t\t\t\telse if (textType == \"adjusted\") {\n\t\t\t\t\tthis.setRaw(\"centerX\", p50);\n\t\t\t\t\tthis.setRaw(\"centerY\", p50);\n\t\t\t\t\tthis.setRaw(\"x\", x);\n\t\t\t\t\tthis.setRaw(\"y\", y);\n\t\t\t\t}\n\t\t\t\telse if (textType == \"regular\") {\n\t\t\t\t\tthis.setRaw(\"x\", x);\n\t\t\t\t\tthis.setRaw(\"y\", y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.markDirtyPosition();\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\t}\n\n\n\tpublic _updatePosition() {\n\n\t\tconst textType = this.get(\"textType\", \"regular\");\n\t\tconst inside = this.get(\"inside\", false);\n\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\t\tlet labelAngle = this.get(\"labelAngle\", 0);\n\t\tlet bounds = this.localBounds();\n\t\tlet w = bounds.right - bounds.left;\n\t\tlet h = bounds.bottom - bounds.top;\n\n\t\tif (textType == \"radial\") {\n\t\t\tif (this._flipped) {\n\t\t\t\tlet centerX = this.get(\"centerX\");\n\t\t\t\tif (centerX instanceof Percent) {\n\t\t\t\t\tw = w * (1 - centerX.value * 2);\n\t\t\t\t}\n\n\t\t\t\tdx = w * $math.cos(labelAngle);\n\t\t\t\tdy = w * $math.sin(labelAngle);\n\t\t\t}\n\t\t}\n\t\telse if (!inside && textType == \"adjusted\") {\n\t\t\tdx = w / 2 * $math.cos(labelAngle);\n\t\t\tdy = h / 2 * $math.sin(labelAngle);\n\t\t}\n\n\n\t\tthis.setRaw(\"dx\", dx);\n\t\tthis.setRaw(\"dy\", dy);\n\n\t\tsuper._updatePosition();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic get text(): RadialText {\n\t\treturn this._text;\n\t}\n\n}\n","import { Text, ITextSettings, ITextPrivate } from \"./Text\";\nimport * as $math from \"../util/Math\";\nimport type { IRadialText } from \"./backend/Renderer\";\n\n/**\n * @ignore\n */\nexport interface IRadialTextSettings extends ITextSettings {\n\ttextType?: \"regular\" | \"circular\" | \"radial\" | \"aligned\" | \"adjusted\";\n\tradius?: number;\n\tstartAngle?: number;\n\tinside?: boolean;\n\torientation?: \"inward\" | \"outward\" | \"auto\";\n\tkerning?: number;\n}\n\n/**\n * @ignore\n */\nexport interface IRadialTextPrivate extends ITextPrivate {\n}\n\n/**\n * @ignore\n */\nexport class RadialText extends Text {\n\n\tdeclare public _settings: IRadialTextSettings;\n\tdeclare public _privateSettings: IRadialTextPrivate;\n\n\tpublic _display: IRadialText = this._root._renderer.makeRadialText(\"\", this.textStyle);\n\n\tprotected _afterNew() {\n\t\tsuper._afterNew();\n\t}\n\n\tpublic static className: string = \"RadialText\";\n\tpublic static classNames: Array = Text.classNames.concat([RadialText.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tthis._display.clear();\n\n\t\tif (this.isDirty(\"textType\")) {\n\t\t\tthis._display.textType = this.get(\"textType\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"radius\")) {\n\t\t\tthis._display.radius = this.get(\"radius\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"startAngle\")) {\n\t\t\tthis._display.startAngle = (this.get(\"startAngle\", 0)! + 90) * $math.RADIANS;\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"inside\")) {\n\t\t\tthis._display.inside = this.get(\"inside\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"orientation\")) {\n\t\t\tthis._display.orientation = this.get(\"orientation\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"kerning\")) {\n\t\t\tthis._display.kerning = this.get(\"kerning\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\t}\n\n}\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\n\nexport interface IRectangleSettings extends IGraphicsSettings {\n}\n\nexport interface IRectanglePrivate extends IGraphicsPrivate {\n}\n\n/**\n * Draws a rectangle.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n * @important\n */\nexport class Rectangle extends Graphics {\n\n\tdeclare public _settings: IRectangleSettings;\n\tdeclare public _privateSettings: IRectanglePrivate;\n\n\tpublic static className: string = \"Rectangle\";\n\tpublic static classNames: Array = Graphics.classNames.concat([Rectangle.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"width\") || this.isDirty(\"height\") || this.isPrivateDirty(\"width\") || this.isPrivateDirty(\"height\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this._clear && !this.get(\"draw\")) {\n\t\t\tthis._draw();\n\t\t}\n\t}\n\n\tprotected _draw() {\n\t\tthis._display.drawRect(0, 0, this.width(), this.height());\n\t}\n\n\tpublic _updateSize() {\n\t\tthis.markDirty()\n\t\tthis._clear = true;\n\t}\n}\n","import * as $type from \"../util/Type\";\nimport * as $math from \"../util/Math\";\nimport * as $utils from \"../util/Utils\";\nimport { Rectangle, IRectangleSettings, IRectanglePrivate } from \"./Rectangle\";\n\n\nexport interface IRoundedRectangleSettings extends IRectangleSettings {\n\n\t/**\n\t * Radius of the top-left corner in pixels.\n\t */\n\tcornerRadiusTL?: number;\n\n\t/**\n\t * Radius of the top-right corner in pixels.\n\t */\n\tcornerRadiusTR?: number;\n\n\t/**\n\t * Radius of the botttom-right corner in pixels.\n\t */\n\tcornerRadiusBR?: number;\n\n\t/**\n\t * Radius of the bottom-left corner in pixels.\n\t */\n\tcornerRadiusBL?: number;\n\n}\n\nexport interface IRoundedRectanglePrivate extends IRectanglePrivate {\n}\n\n/**\n * Draws a rectangle with rounded corners.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n * @important\n */\nexport class RoundedRectangle extends Rectangle {\n\n\tdeclare public _settings: IRoundedRectangleSettings;\n\tdeclare public _privateSettings: IRoundedRectanglePrivate;\n\n\tpublic static className: string = \"RoundedRectangle\";\n\tpublic static classNames: Array = Rectangle.classNames.concat([RoundedRectangle.className]);\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"cornerRadiusTL\") || this.isDirty(\"cornerRadiusTR\") || this.isDirty(\"cornerRadiusBR\") || this.isDirty(\"cornerRadiusBL\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\t}\n\n\tpublic _draw() {\t\t\n\t\tlet width = this.width();\n\t\tlet height = this.height();\n\n\t\tlet w = width;\n\t\tlet h = height;\n\n\t\tlet wSign = w / Math.abs(width);\n\t\tlet hSign = h / Math.abs(height);\n\n\t\tif ($type.isNumber(w) && $type.isNumber(h)) {\n\n\t\t\tlet minSide = Math.min(w, h) / 2;\n\n\t\t\tlet crtl = $utils.relativeToValue(this.get(\"cornerRadiusTL\", 8), minSide);\n\t\t\tlet crtr = $utils.relativeToValue(this.get(\"cornerRadiusTR\", 8), minSide);\n\t\t\tlet crbr = $utils.relativeToValue(this.get(\"cornerRadiusBR\", 8), minSide);\n\t\t\tlet crbl = $utils.relativeToValue(this.get(\"cornerRadiusBL\", 8), minSide);\n\n\t\t\tlet maxcr = Math.min(Math.abs(w / 2), Math.abs(h / 2));\n\n\t\t\tcrtl = $math.fitToRange(crtl, 0, maxcr);\n\t\t\tcrtr = $math.fitToRange(crtr, 0, maxcr);\n\t\t\tcrbr = $math.fitToRange(crbr, 0, maxcr);\n\t\t\tcrbl = $math.fitToRange(crbl, 0, maxcr);\n\n\t\t\tthis._display.moveTo(crtl * wSign, 0);\n\t\t\tthis._display.lineTo(w - crtr * wSign, 0);\n\t\t\tif (crtr > 0) {\n\t\t\t\tthis._display.arcTo(w, 0, w, crtr * hSign, crtr);\n\t\t\t}\n\t\t\tthis._display.lineTo(w, h - crbr * hSign);\n\t\t\tif (crbr > 0) {\n\t\t\t\tthis._display.arcTo(w, h, w - crbr * wSign, h, crbr);\n\t\t\t}\n\t\t\tthis._display.lineTo(crbl * wSign, h);\n\t\t\tif (crbl > 0) {\n\t\t\t\tthis._display.arcTo(0, h, 0, h - crbl * hSign, crbl);\n\t\t\t}\n\t\t\tthis._display.lineTo(0, crtl * hSign);\n\t\t\tif (crtl > 0) {\n\t\t\t\tthis._display.arcTo(0, 0, crtl * wSign, 0, crtl);\n\t\t\t}\n\t\t}\n\t}\n}\n","import { RoundedRectangle } from \"../render/RoundedRectangle\";\nimport { Container, IContainerPrivate, IContainerSettings, IContainerEvents } from \"./Container\";\nimport * as $type from \"../util/Type\";\nimport { Graphics } from \"./Graphics\";\nimport { Button } from \"./Button\";\nimport type { Time } from \"../util/Animation\";\nimport * as $utils from \"../util/Utils\";\nimport type { Animation } from \"../util/Entity\";\n\nexport interface IScrollbarSettings extends IContainerSettings {\n\n\t/**\n\t * Orientation of the scrollbar.\n\t */\n\torientation: \"horizontal\" | \"vertical\";\n\n\t/**\n\t * Relative start of the selected range, with 0 meaning beginning, and 1 the\n\t * end.\n\t */\n\tstart?: number;\n\n\t/**\n\t * Relative end of the selected range, with 0 meaning beginning, and 1 the\n\t * end.\n\t */\n\tend?: number;\n\n\t/**\n\t * Number of milliseconds to play scroll animations for.\n\t */\n\tanimationDuration?: number;\n\n\t/**\n\t * Easing function to use for animations.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Easing_functions} for more info\n\t */\n\tanimationEasing?: (t: Time) => Time;\n\n}\n\nexport interface IScrollbarPrivate extends IContainerPrivate {\n\n\t/**\n\t * @ignore\n\t */\n\tisBusy?: boolean;\n\n\t/**\n\t * @ignore\n\t */\n\tpositionTextFunction?: (position: number) => string;\n\n}\n\nexport interface IScrollbarEvents extends IContainerEvents {\n\n\t/**\n\t * Invoked when range of the selection changes.\n\t */\n\trangechanged: { start: number, end: number };\n\n}\n\n/**\n * A control that allows zooming chart's axes, or other uses requiring range\n * selection.\n *\n * @see {@link https://www.amcharts.com/docs/v5/charts/xy-chart/scrollbars/} for more info\n */\nexport class Scrollbar extends Container {\n\n\tpublic _addOrientationClass() {\n\t\tthis._settings.themeTags = $utils.mergeTags(this._settings.themeTags, [\"scrollbar\", this._settings.orientation]);\n\t\tif (!this._settings.background) {\n\t\t\tthis._settings.background = RoundedRectangle.new(this._root, {\n\t\t\t\tthemeTags: $utils.mergeTags(this._settings.themeTags, [\"main\", \"background\"])\n\t\t\t});\n\t\t}\n\t}\n\n\tdeclare public _settings: IScrollbarSettings;\n\tdeclare public _privateSettings: IScrollbarPrivate;\n\tdeclare public _events: IScrollbarEvents;\n\n\tpublic static className: string = \"Scrollbar\";\n\tpublic static classNames: Array = Container.classNames.concat([Scrollbar.className]);\n\n\t/**\n\t * A thumb elment - a draggable square between the grips, used for panning\n\t * the selection.\n\t */\n\tpublic thumb: RoundedRectangle = this._makeThumb();\n\n\t/**\n\t * Start grip button.\n\t */\n\tpublic startGrip: Button = this._makeButton();\n\n\t/**\n\t * End grip button.\n\t */\n\tpublic endGrip: Button = this._makeButton();\n\n\tprotected _thumbBusy: boolean = false;\n\n\tprotected _startDown: boolean = false;\n\n\tprotected _endDown: boolean = false;\n\n\tprotected _thumbDown: boolean = false;\n\n\tprotected _makeButton(): Button {\n\t\treturn this.children.push(Button.new(this._root, {\n\t\t\tthemeTags: [\"resize\", \"button\", this.get(\"orientation\")], icon: Graphics.new(this._root, {\n\t\t\t\tthemeTags: [\"icon\"]\n\t\t\t})\n\t\t}));\n\t}\n\n\tprotected _makeThumb(): RoundedRectangle {\n\t\treturn this.children.push(RoundedRectangle.new(this._root, {\n\t\t\tthemeTags: [\"thumb\", this.get(\"orientation\")]\n\t\t}));\n\t}\n\n\tprotected _handleAnimation(animation: Animation) {\n\t\tif (animation) {\n\t\t\tthis._disposers.push(\n\t\t\t\tanimation.events.on(\"stopped\", () => {\n\t\t\t\t\tthis.setPrivateRaw(\"isBusy\", false);\n\t\t\t\t\tthis._thumbBusy = false;\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\t}\n\n\tprotected _afterNew() {\n\t\tthis._addOrientationClass();\n\t\tsuper._afterNew();\n\n\t\tconst startGrip = this.startGrip;\n\t\tconst endGrip = this.endGrip;\n\t\tconst thumb = this.thumb;\n\t\tconst background = this.get(\"background\");\n\n\t\tif (background) {\n\t\t\tthis._disposers.push(\n\t\t\t\tbackground.events.on(\"click\", (event) => {\n\t\t\t\t\tthis.setPrivateRaw(\"isBusy\", true);\n\t\t\t\t\tconst point = this._display.toLocal(event.point);\n\n\t\t\t\t\tconst w = this.width();\n\t\t\t\t\tconst h = this.height();\n\n\t\t\t\t\tconst orientation = this.get(\"orientation\");\n\n\t\t\t\t\tlet newMiddle: number;\n\n\t\t\t\t\tif (orientation == \"vertical\") {\n\t\t\t\t\t\tnewMiddle = (point.y - thumb.height() / 2) / h;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewMiddle = (point.x - thumb.width() / 2) / w;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet newCoordinate: number;\n\t\t\t\t\tlet key: \"x\" | \"y\";\n\n\t\t\t\t\tif (orientation == \"vertical\") {\n\t\t\t\t\t\tnewCoordinate = newMiddle * h;\n\t\t\t\t\t\tkey = \"y\";\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewCoordinate = newMiddle * w;\n\t\t\t\t\t\tkey = \"x\";\n\t\t\t\t\t}\n\n\n\t\t\t\t\tconst duration = this.get(\"animationDuration\", 0);\n\t\t\t\t\tif (duration > 0) {\n\t\t\t\t\t\tthis._thumbBusy = true;\n\t\t\t\t\t\tthis._handleAnimation(this.thumb.animate({ key: key, to: newCoordinate, duration: duration, easing: this.get(\"animationEasing\") }));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.thumb.set(key, newCoordinate);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\n\t\tthis._disposers.push(thumb.events.on(\"dblclick\", () => {\n\t\t\tconst duration = this.get(\"animationDuration\", 0);\n\t\t\tconst easing = this.get(\"animationEasing\");\n\n\t\t\tthis.animate({ key: \"start\", to: 0, duration: duration, easing: easing });\n\t\t\tthis.animate({ key: \"end\", to: 1, duration: duration, easing: easing });\n\t\t}));\n\n\t\tthis._disposers.push(startGrip.events.on(\"pointerdown\", () => {\n\t\t\tthis.setPrivateRaw(\"isBusy\", true);\n\t\t\tthis._startDown = true;\n\t\t}))\n\n\t\tthis._disposers.push(endGrip.events.on(\"pointerdown\", () => {\n\t\t\tthis.setPrivateRaw(\"isBusy\", true);\n\t\t\tthis._endDown = true;\n\t\t}))\n\n\t\tthis._disposers.push(thumb.events.on(\"pointerdown\", () => {\n\t\t\tthis.setPrivateRaw(\"isBusy\", true);\n\t\t\tthis._thumbDown = true;\n\t\t}))\n\n\t\tthis._disposers.push(startGrip.events.on(\"globalpointerup\", () => {\n\t\t\tif (this._startDown) {\n\t\t\t\tthis.setPrivateRaw(\"isBusy\", false);\n\t\t\t}\n\t\t\tthis._startDown = false;\n\t\t}))\n\n\t\tthis._disposers.push(endGrip.events.on(\"globalpointerup\", () => {\n\t\t\tif (this._endDown) {\n\t\t\t\tthis.setPrivateRaw(\"isBusy\", false);\n\t\t\t}\n\t\t\tthis._endDown = false;\n\t\t}))\n\n\t\tthis._disposers.push(thumb.events.on(\"globalpointerup\", () => {\n\t\t\tif (this._thumbDown) {\n\t\t\t\tthis.setPrivateRaw(\"isBusy\", false);\n\t\t\t}\n\t\t\tthis._thumbDown = false;\n\t\t}))\n\n\t\tthis._disposers.push(startGrip.on(\"x\", () => {\n\t\t\tthis._updateThumb();\n\t\t}));\n\n\t\tthis._disposers.push(endGrip.on(\"x\", () => {\n\t\t\tthis._updateThumb();\n\t\t}));\n\n\t\tthis._disposers.push(startGrip.on(\"y\", () => {\n\t\t\tthis._updateThumb();\n\t\t}));\n\n\t\tthis._disposers.push(endGrip.on(\"y\", () => {\n\t\t\tthis._updateThumb();\n\t\t}));\n\n\t\tthis._disposers.push(thumb.events.on(\"positionchanged\", () => {\n\t\t\tthis._updateGripsByThumb();\n\t\t}));\n\n\t\tif (this.get(\"orientation\") == \"vertical\") {\n\t\t\tstartGrip.set(\"x\", 0);\n\t\t\tendGrip.set(\"x\", 0);\n\n\t\t\tthis._disposers.push(thumb.adapters.add(\"y\", (value) => {\n\t\t\t\treturn Math.max(Math.min(Number(value), this.height() - thumb.height()), 0);\n\t\t\t}))\n\n\t\t\tthis._disposers.push(thumb.adapters.add(\"x\", (_value) => {\n\t\t\t\treturn this.width() / 2;\n\t\t\t}))\n\n\t\t\tthis._disposers.push(startGrip.adapters.add(\"x\", (_value) => {\n\t\t\t\treturn this.width() / 2;\n\t\t\t}))\n\n\t\t\tthis._disposers.push(endGrip.adapters.add(\"x\", (_value) => {\n\t\t\t\treturn this.width() / 2;\n\t\t\t}))\n\n\t\t\tthis._disposers.push(startGrip.adapters.add(\"y\", (value) => {\n\t\t\t\treturn Math.max(Math.min(Number(value), this.height()), 0);\n\t\t\t}))\n\n\t\t\tthis._disposers.push(endGrip.adapters.add(\"y\", (value) => {\n\t\t\t\treturn Math.max(Math.min(Number(value), this.height()), 0);\n\t\t\t}))\n\t\t}\n\t\telse {\n\t\t\tstartGrip.set(\"y\", 0);\n\t\t\tendGrip.set(\"y\", 0);\n\n\t\t\tthis._disposers.push(thumb.adapters.add(\"x\", (value) => {\n\t\t\t\treturn Math.max(Math.min(Number(value), this.width() - thumb.width()), 0);\n\t\t\t}))\n\n\t\t\tthis._disposers.push(thumb.adapters.add(\"y\", (_value) => {\n\t\t\t\treturn this.height() / 2;\n\t\t\t}))\n\n\t\t\tthis._disposers.push(startGrip.adapters.add(\"y\", (_value) => {\n\t\t\t\treturn this.height() / 2;\n\t\t\t}))\n\n\t\t\tthis._disposers.push(endGrip.adapters.add(\"y\", (_value) => {\n\t\t\t\treturn this.height() / 2;\n\t\t\t}))\n\n\t\t\tthis._disposers.push(startGrip.adapters.add(\"x\", (value) => {\n\t\t\t\treturn Math.max(Math.min(Number(value), this.width()), 0);\n\t\t\t}))\n\n\t\t\tthis._disposers.push(endGrip.adapters.add(\"x\", (value) => {\n\t\t\t\treturn Math.max(Math.min(Number(value), this.width()), 0);\n\t\t\t}))\n\t\t}\n\t}\n\n\tpublic _updateChildren() {\n\t\tsuper._updateChildren();\n\n\t\tif (this.isDirty(\"end\") || this.isDirty(\"start\") || this._sizeDirty) {\n\t\t\tthis.updateGrips();\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\t\tif (this.isDirty(\"start\") || this.isDirty(\"end\")) {\n\t\t\tconst eventType = \"rangechanged\";\n\t\t\tif (this.events.isEnabled(eventType)) {\n\t\t\t\tthis.events.dispatch(eventType, { type: eventType, target: this, start: this.get(\"start\", 0), end: this.get(\"end\", 1) });\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateGrips() {\n\t\tconst startGrip = this.startGrip;\n\t\tconst endGrip = this.endGrip;\n\n\t\tconst orientation = this.get(\"orientation\");\n\t\tconst height = this.height();\n\t\tconst width = this.width();\n\n\t\tif (orientation == \"vertical\") {\n\t\t\tstartGrip.set(\"y\", height * this.get(\"start\", 0));\n\t\t\tendGrip.set(\"y\", height * this.get(\"end\", 1));\n\t\t}\n\t\telse {\n\t\t\tstartGrip.set(\"x\", width * this.get(\"start\", 0));\n\t\t\tendGrip.set(\"x\", width * this.get(\"end\", 1));\n\t\t}\n\n\t\tconst valueFunction = this.getPrivate(\"positionTextFunction\");\n\t\tconst from = Math.round(this.get(\"start\", 0) * 100);\n\t\tconst to = Math.round(this.get(\"end\", 0) * 100);\n\t\tlet fromValue: string;\n\t\tlet toValue: string;\n\t\tif (valueFunction) {\n\t\t\tfromValue = valueFunction.call(this, this.get(\"start\", 0));\n\t\t\ttoValue = valueFunction.call(this, this.get(\"end\", 0));\n\t\t}\n\t\telse {\n\t\t\tfromValue = from + \"%\";\n\t\t\ttoValue = to + \"%\";\n\t\t}\n\n\t\tstartGrip.set(\"ariaLabel\", this._t(\"From %1\", undefined, fromValue));\n\t\tstartGrip.set(\"ariaValueNow\", \"\" + from);\n\t\tstartGrip.set(\"ariaValueText\", from + \"%\");\n\n\t\tstartGrip.set(\"ariaValueMin\", \"0\");\n\t\tstartGrip.set(\"ariaValueMax\", \"100\");\n\n\t\tendGrip.set(\"ariaLabel\", this._t(\"To %1\", undefined, toValue));\n\t\tendGrip.set(\"ariaValueNow\", \"\" + to);\n\t\tendGrip.set(\"ariaValueText\", to + \"%\");\n\n\t\tendGrip.set(\"ariaValueMin\", \"0\");\n\t\tendGrip.set(\"ariaValueMax\", \"100\");\n\t}\n\n\tprotected _updateThumb() {\n\t\tconst thumb = this.thumb;\n\t\tconst startGrip = this.startGrip;\n\t\tconst endGrip = this.endGrip;\n\n\t\tconst height = this.height();\n\t\tconst width = this.width();\n\n\t\tlet x0 = startGrip.x();\n\t\tlet x1 = endGrip.x();\n\n\t\tlet y0 = startGrip.y();\n\t\tlet y1 = endGrip.y();\n\n\t\tlet start: number = 0;\n\t\tlet end: number = 1;\n\n\t\tif (this.get(\"orientation\") == \"vertical\") {\n\t\t\tif ($type.isNumber(y0) && $type.isNumber(y1)) {\n\t\t\t\tif (!this._thumbBusy && !thumb.isDragging()) {\n\t\t\t\t\tthumb.set(\"height\", y1 - y0);\n\t\t\t\t\tthumb.set(\"y\", y0);\n\t\t\t\t}\n\t\t\t\tstart = y0 / height;\n\t\t\t\tend = y1 / height;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ($type.isNumber(x0) && $type.isNumber(x1)) {\n\t\t\t\tif (!this._thumbBusy && !thumb.isDragging()) {\n\t\t\t\t\tthumb.set(\"width\", x1 - x0);\n\t\t\t\t\tthumb.set(\"x\", x0);\n\t\t\t\t}\n\t\t\t\tstart = x0 / width;\n\t\t\t\tend = x1 / width;\n\t\t\t}\n\t\t}\n\n\t\tif (this.getPrivate(\"isBusy\") && (this.get(\"start\") != start || this.get(\"end\") != end)) {\n\t\t\tthis.set(\"start\", start);\n\t\t\tthis.set(\"end\", end);\n\t\t}\n\n\t\tconst valueFunction = this.getPrivate(\"positionTextFunction\");\n\t\tconst from = Math.round(this.get(\"start\", 0) * 100);\n\t\tconst to = Math.round(this.get(\"end\", 0) * 100);\n\t\tlet fromValue: string;\n\t\tlet toValue: string;\n\t\tif (valueFunction) {\n\t\t\tfromValue = valueFunction.call(this, this.get(\"start\", 0));\n\t\t\ttoValue = valueFunction.call(this, this.get(\"end\", 0));\n\t\t}\n\t\telse {\n\t\t\tfromValue = from + \"%\";\n\t\t\ttoValue = to + \"%\";\n\t\t}\n\n\t\tthumb.set(\"ariaLabel\", this._t(\"From %1 to %2\", undefined, fromValue, toValue));\n\t\tthumb.set(\"ariaValueNow\", \"\" + from);\n\t\tthumb.set(\"ariaValueText\", from + \"%\");\n\t}\n\n\n\tprotected _updateGripsByThumb() {\n\n\t\tconst thumb = this.thumb;\n\t\tconst startGrip = this.startGrip;\n\t\tconst endGrip = this.endGrip;\n\n\t\tif (this.get(\"orientation\") == \"vertical\") {\n\t\t\tconst thumbSize = thumb.height();\n\t\t\tstartGrip.set(\"y\", thumb.y());\n\t\t\tendGrip.set(\"y\", thumb.y() + thumbSize);\n\t\t}\n\t\telse {\n\t\t\tconst thumbSize = thumb.width();\n\t\t\tstartGrip.set(\"x\", thumb.x());\n\t\t\tendGrip.set(\"x\", thumb.x() + thumbSize);\n\t\t}\n\t}\n}\n","import { Container, IContainerSettings, IContainerPrivate, IContainerEvents } from \"../../core/render/Container\";\nimport { p100 } from \"../../core/util/Percent\";\n\nexport interface IChartSettings extends IContainerSettings {\n}\n\nexport interface IChartPrivate extends IContainerPrivate {\n}\n\nexport interface IChartEvents extends IContainerEvents {\n}\n\n/**\n * A base class for all charts.\n */\nexport abstract class Chart extends Container {\n\tpublic static className: string = \"Chart\";\n\tpublic static classNames: Array = Container.classNames.concat([Chart.className]);\n\n\tdeclare public _settings: IChartSettings;\n\tdeclare public _privateSettings: IChartPrivate;\n\tdeclare public _events: IChartEvents;\n\n\t/**\n\t * A [[Container]] chart places its elements in.\n\t * \n\t * @default Container.new()\n\t */\n\tpublic readonly chartContainer: Container = this.children.push(Container.new(this._root, { width: p100, height: p100, interactiveChildren: false }));\n\n\t/**\n\t * A [[Container]] chart places its bullets in.\n\t * \n\t * @default Container.new()\n\t */\n\tpublic readonly bulletsContainer: Container = Container.new(this._root, { interactiveChildren: false, isMeasured: false, position: \"absolute\", width: p100, height: p100 });\n\n}","import type { Series } from \"./Series\";\n\nimport { Chart, IChartSettings, IChartPrivate, IChartEvents } from \"./Chart\";\nimport { Container } from \"../../core/render/Container\";\nimport { ListAutoDispose } from \"../../core/util/List\";\nimport { p100 } from \"../../core/util/Percent\";\nimport * as $array from \"../../core/util/Array\";\nimport type { ColorSet } from \"../../core/util/ColorSet\";\n\nexport interface ISerialChartSettings extends IChartSettings {\n\t/**\n\t * A [[ColorSet]] to use when asigning colors for series.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/charts/xy-chart/series/#Series_colors} for more info\n\t */\n\tcolors?: ColorSet;\n}\n\nexport interface ISerialChartPrivate extends IChartPrivate {\n}\n\nexport interface ISerialChartEvents extends IChartEvents {\n}\n\n/**\n * A base class for all series-based charts.\n */\nexport abstract class SerialChart extends Chart {\n\tpublic static className: string = \"SerialChart\";\n\tpublic static classNames: Array = Chart.classNames.concat([SerialChart.className]);\n\n\tdeclare public _settings: ISerialChartSettings;\n\tdeclare public _privateSettings: ISerialChartPrivate;\n\tdeclare public _seriesType: Series;\n\tdeclare public _events: ISerialChartEvents;\n\n\t/**\n\t * A [[Container]] where chart will store all series.\n\t *\n\t * @default Container.new()\n\t */\n\tpublic readonly seriesContainer: Container = Container.new(this._root, { width: p100, height: p100, isMeasured: false });\n\n\t/**\n\t * A list of chart's series.\n\t */\n\tpublic readonly series: ListAutoDispose = new ListAutoDispose();\n\n\tprotected _afterNew() {\n\t\tsuper._afterNew();\n\n\t\tthis._disposers.push(this.series);\n\n\t\tconst children = this.seriesContainer.children;\n\n\t\tthis._disposers.push(this.series.events.onAll((change) => {\n\t\t\tif (change.type === \"clear\") {\n\t\t\t\t$array.each(change.oldValues, (series) => {\n\t\t\t\t\tthis._removeSeries(series);\n\t\t\t\t})\n\t\t\t\tconst colors = this.get(\"colors\");\n\t\t\t\tif (colors) {\n\t\t\t\t\tcolors.reset();\n\t\t\t\t}\n\n\t\t\t} else if (change.type === \"push\") {\n\t\t\t\tchildren.moveValue(change.newValue);\n\t\t\t\tthis._processSeries(change.newValue);\n\t\t\t} else if (change.type === \"setIndex\") {\n\t\t\t\tchildren.setIndex(change.index, change.newValue);\n\t\t\t\tthis._processSeries(change.newValue);\n\t\t\t} else if (change.type === \"insertIndex\") {\n\t\t\t\tchildren.insertIndex(change.index, change.newValue);\n\t\t\t\tthis._processSeries(change.newValue);\n\t\t\t} else if (change.type === \"removeIndex\") {\n\t\t\t\tthis._removeSeries(change.oldValue);\n\t\t\t} else if (change.type === \"moveIndex\") {\n\t\t\t\tchildren.moveValue(change.value, change.newIndex);\n\t\t\t\tthis._processSeries(change.value);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unknown IListEvent type\");\n\t\t\t}\n\t\t}));\n\t}\n\n\tprotected _processSeries(series: this[\"_seriesType\"]) {\n\t\tseries.chart = this;\n\t\tseries._placeBulletsContainer(this);\n\t}\n\n\tprotected _removeSeries(series: this[\"_seriesType\"]) {\n\t\tif (!series.isDisposed()) {\n\t\t\tthis.seriesContainer.children.removeValue(series);\n\t\t\tseries._removeBulletsContainer();\n\t\t}\n\t}\n}\n","import { Component, IComponentSettings, IComponentPrivate, DataItem, IComponentEvents, IComponentDataItem } from \"../../core/render/Component\";\nimport { List } from \"../../core/util/List\";\nimport { Color } from \"../../core/util/Color\";\nimport { percentInterpolate } from \"../../core/util/Animation\";\nimport { Percent } from \"../../core/util/Percent\";\nimport * as $array from \"../../core/util/Array\";\nimport * as $type from \"../../core/util/Type\";\nimport * as $time from \"../../core/util/Time\";\nimport type { Root } from \"../../core/Root\";\nimport { p100 } from \"../../core/util/Percent\";\nimport type { Chart } from \"./Chart\";\nimport type { Bullet } from \"./Bullet\";\nimport { Container } from \"../../core/render/Container\";\nimport type { Graphics } from \"../../core/render/Graphics\";\nimport type { ILegendDataItem } from \"./Legend\";\nimport type { Template } from \"../../core/util/Template\";\nimport type { Sprite } from \"../../core/render/Sprite\";\nimport { Label } from \"../../core/render/Label\";\n//import { Animations } from \"../../core/util/Animation\";\n\n/**\n * Defines interface for a heat rule.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/heat-rules/} for more info\n */\nexport interface IHeatRule {\n\n\t/**\n\t * Target template.\n\t */\n\ttarget: Template;\n\n\t/**\n\t * The setting value to use for items if the lowest value.\n\t */\n\tmin: any;\n\n\t/**\n\t * The setting value to use for items if the highest value.\n\t */\n\tmax: any;\n\n\t/**\n\t * Which data field to use when determining item's value.\n\t */\n\tdataField: string;\n\n\t/**\n\t * A setting key to set.\n\t */\n\tkey?: string;\n\n\t/**\n\t * Custom lowest value.\n\t */\n\tminValue?: number;\n\n\t/**\n\t * Custom highest value.\n\t */\n\tmaxValue?: number;\n\n\t/**\n\t * Use logarithmic scale when calculating intermediate setting values.\n\t *\n\t * @default false\n\t */\n\tlogarithmic?: boolean;\n\n\t/**\n\t * A custom function that will set target element's settings.\n\t *\n\t * Can be used to do custom manipulation on complex objects requiring more\n\t * than modifying a setting.\n\t */\n\tcustomFunction?: (target: Sprite, minValue: number, maxValue: number, value?: any) => void;\n\n}\n\n\nexport interface ISeriesDataItem extends IComponentDataItem {\n\tid?: string;\n\n\tvalue?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tvalueWorking?:number;\n\n\tvalueChange?: number;\n\tvalueChangePercent?: number;\n\tvalueChangeSelection?: number;\n\tvalueChangeSelectionPercent?: number;\n\tvalueChangePrevious?: number;\n\tvalueChangePreviousPercent?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tvalueWorkingOpen?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tvalueWorkingClose?: number;\n}\n\nexport interface ISeriesSettings extends IComponentSettings {\n\n\t/**\n\t * Name of the series.\n\t */\n\tname?: string;\n\n\t/**\n\t * A key to look up in data for an id of the data item.\n\t */\n\tidField?: string;\n\n\t/**\n\t * A key to look up in data for a numeric value of the data item.\n\t *\n\t * Some series use it to display its elements. It can also be used in heat\n\t * rules.\n\t */\n\tvalueField?: string;\n\n\t/**\n\t * A text template to be used for label in legend.\n\t */\n\tlegendLabelText?: string;\n\n\t/**\n\t * A text template to be used for value label in legend.\n\t */\n\tlegendValueText?: string;\n\n\t/**\n\t * If set to `true` the series initial animation will be played item by item\n\t * rather than all at once.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Animation_of_series} for more info\n\t */\n\tsequencedInterpolation?:boolean;\n\n\t/**\n\t * A delay in milliseconds to wait before starting animation of next data\n\t * item.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Animation_of_series} for more info\n\t */\n\tsequencedDelay?:number;\n\n\t/**\n\t * A list of heat rules to apply on series elements.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/heat-rules/} for more info\n\t */\n\theatRules?:IHeatRule[];\n\n\t/**\n\t * If set to `true`, series will calculate aggregate values, e.g. change\n\t * percent, high, low, etc.\n\t *\n\t * Do not enable unless you are using such aggregate values in tooltips,\n\t * display data fields, heat rules, or similar.\n\t */\n\tcalculateAggregates?: boolean;\n\n\t/**\n\t * Series stroke color.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/charts/xy-chart/series/#Series_colors} for more info\n\t */\n\tstroke?: Color;\n\n\t/**\n\t * Series fill color.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/charts/xy-chart/series/#Series_colors} for more info\n\t */\n\tfill?: Color;\n\n\t/**\n\t * A data item representing series in a [[Legend]].\n\t *\n\t * @readonly\n\t */\n\tlegendDataItem?: DataItem;\n\n}\n\nexport interface ISeriesPrivate extends IComponentPrivate {\n\n\t/**\n\t * @ignore\n\t */\n\tchart?: Chart;\n\tstartIndex?: number;\n\tendIndex?: number;\n\n\tvalueAverage?: number;\n\tvalueCount?: number;\n\tvalueSum?: number;\n\tvalueAbsoluteSum?: number;\n\tvalueLow?: number;\n\tvalueHigh?: number;\n\tvalueOpen?: number;\n\tvalueClose?: number;\n}\n\nexport interface ISeriesEvents extends IComponentEvents {\n\n}\n\n/**\n * A base class for all series.\n */\nexport abstract class Series extends Component {\n\tpublic static className: string = \"Series\";\n\tpublic static classNames: Array = Component.classNames.concat([Series.className]);\n\n\tdeclare public _settings: ISeriesSettings;\n\tdeclare public _privateSettings: ISeriesPrivate;\n\tdeclare public _dataItemSettings: ISeriesDataItem;\n\tdeclare public _events: ISeriesEvents;\n\n\tprotected _aggregatesCalculated: boolean = false;\n\tprotected _selectionAggregatesCalculated: boolean = false;\n\tprotected _dataProcessed: boolean = false;\n\n\tprotected _psi: number | undefined;\n\tprotected _pei: number | undefined;\n\n\t/**\n\t * A chart series belongs to.\n\t */\n\tpublic chart:Chart | undefined;\n\n\t/**\n\t * List of bullets to use for the series.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/bullets/} for more info\n\t */\n\tpublic bullets: List<>(root: Root, series:Series, dataItem: D) => Bullet | undefined> = new List();\n\n\t/**\n\t * A [[Container]] series' bullets are stored in.\n\t *\n\t * @default Container.new()\n\t */\n\tpublic readonly bulletsContainer: Container = Container.new(this._root, {width:p100, height:p100, position:\"absolute\"});\n\n\tprotected _afterNew() {\n\t\tthis.valueFields.push(\"value\");\n\n\t\tsuper._afterNew();\n\n\t\tthis._disposers.push(this.bullets.events.onAll((change) => {\n\t\t\tif (change.type === \"clear\") {\n\t\t\t\tthis._handleBullets(this.dataItems);\n\t\t\t} else if (change.type === \"push\") {\n\t\t\t\tthis._handleBullets(this.dataItems);\n\t\t\t} else if (change.type === \"setIndex\") {\n\t\t\t\tthis._handleBullets(this.dataItems);\n\t\t\t} else if (change.type === \"insertIndex\") {\n\t\t\t\tthis._handleBullets(this.dataItems);\n\t\t\t} else if (change.type === \"removeIndex\") {\n\t\t\t\tthis._handleBullets(this.dataItems);\n\t\t\t} else if (change.type === \"moveIndex\") {\n\t\t\t\tthis._handleBullets(this.dataItems);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unknown IListEvent type\");\n\t\t\t}\n\t\t}));\n\t}\n\n\tprotected _dispose(){\n\t\tthis.bulletsContainer.dispose(); // can be in a different parent\n\t\tsuper._dispose();\n\t}\n\n\tpublic startIndex():number {\n\t\tlet len = this.dataItems.length;\n\t\treturn Math.min(this.getPrivate(\"startIndex\", 0), len);\n\t}\n\n\tpublic endIndex():number {\n\t\tlet len = this.dataItems.length;\n\t\treturn Math.min(this.getPrivate(\"endIndex\", len), len)\n\t}\n\n\tprotected _handleBullets(dataItems:Array>){\n\t\t$array.each(dataItems, (dataItem)=>{\n\t\t\tconst bullets = dataItem.bullets;\n\t\t\tif(bullets){\n\t\t\t\t$array.each(bullets, (bullet)=>{\n\t\t\t\t\tbullet.dispose();\n\t\t\t\t})\n\n\t\t\t\tdataItem.bullets = undefined;\n\t\t\t}\n\t\t})\n\n\t\tthis.markDirtyValues();\n\t}\n\n\t/**\n\t * Looks up and returns a data item by its ID.\n\t *\n\t * @param id ID\n\t * @return Data item\n\t */\n\tpublic getDataItemById(id: string): DataItem | undefined {\n\t\treturn $array.find(this.dataItems, (dataItem: any) => {\n\t\t\treturn dataItem.get(\"id\") == id;\n\t\t})\n\t}\n\n\tprotected _makeBullets(dataItem: DataItem) {\n\t\tif(this._shouldMakeBullet(dataItem)){\n\t\t\tdataItem.bullets = [];\n\n\t\t\tthis.bullets.each((bulletFunction) => {\n\t\t\t\tthis._makeBullet(dataItem, bulletFunction);\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected _shouldMakeBullet(_dataItem: DataItem):boolean{\n\t\treturn true;\n\t}\n\n\tprotected _makeBullet(dataItem: DataItem, bulletFunction:(root: Root, series:Series, dataItem: DataItem) => Bullet | undefined, index?:number):Bullet | undefined{\n\t\tconst bullet = bulletFunction(this._root, this, dataItem);\n\t\tif(bullet){\n\t\t\tlet sprite = bullet.get(\"sprite\");\n\n\t\t\tif (sprite) {\n\t\t\t\tsprite._setDataItem(dataItem);\n\t\t\t\tsprite.setRaw(\"position\", \"absolute\");\n\t\t\t\tthis.bulletsContainer.children.push(sprite);\n\t\t\t}\n\t\t\tbullet._index = index;\n\t\t\tbullet.series = this;\n\t\t\tdataItem.bullets!.push(bullet);\n\t\t}\n\t\treturn bullet;\n\t}\n\n\tpublic _clearDirty() {\n\t\tsuper._clearDirty();\n\t\tthis._aggregatesCalculated = false;\n\t\tthis._selectionAggregatesCalculated = false;\n\t}\n\n\tpublic _prepareChildren(){\n\t\tsuper._prepareChildren();\n\n\t\tlet startIndex = this.startIndex();\n\t\tlet endIndex = this.endIndex();\n\n\t\tconst calculateAggregates = this.get(\"calculateAggregates\");\n\t\tif(calculateAggregates){\n\t\t\tif (this._valuesDirty && !this._dataProcessed) {\n\t\t\t\tif (!this._aggregatesCalculated) {\n\t\t\t\t\tthis._calculateAggregates(0, this.dataItems.length);\n\t\t\t\t\tthis._aggregatesCalculated = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this._psi != startIndex || this._pei != endIndex) && !this._selectionAggregatesCalculated) {\n\t\t\t\tif (startIndex === 0 && endIndex === this.dataItems.length && this._aggregatesCalculated) {\n\t\t\t\t\t// void\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._calculateAggregates(startIndex, endIndex);\n\t\t\t\t}\n\n\t\t\t\tthis._selectionAggregatesCalculated = true;\n\t\t\t}\n\t\t}\n\n\t\tif(this.isDirty(\"tooltip\")){\n\t\t\tlet tooltip = this.get(\"tooltip\");\n\t\t\tif(tooltip){\n\t\t\t\ttooltip.hide(0);\n\t\t\t\ttooltip.set(\"tooltipTarget\", this);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"fill\") || this.isDirty(\"stroke\")) {\n\n\t\t\tlet markerRectangle: Graphics | undefined;\n\t\t\tconst legendDataItem = this.get(\"legendDataItem\");\n\t\t\tif (legendDataItem) {\n\t\t\t\tmarkerRectangle = legendDataItem.get(\"markerRectangle\");\n\n\t\t\t\tif (markerRectangle) {\n\t\t\t\t\tif (this.isDirty(\"stroke\")) {\n\t\t\t\t\t\tlet stroke = this.get(\"stroke\");\n\t\t\t\t\t\tmarkerRectangle.set(\"stroke\", stroke);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.isDirty(\"fill\")) {\n\t\t\t\t\t\tlet fill = this.get(\"fill\");\n\t\t\t\t\t\tmarkerRectangle.set(\"fill\", fill);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateLegendMarker(undefined);\n\t\t}\n\n\n\t\tif (this.bullets.length > 0) {\n\t\t\tlet startIndex = this.startIndex();\n\t\t\tlet endIndex = this.endIndex();\n\n\t\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\t\tlet dataItem = this.dataItems[i];\n\t\t\t\tif (!dataItem.bullets) {\n\t\t\t\t\tthis._makeBullets(dataItem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tprotected _calculateAggregates(startIndex: number, endIndex: number) {\n\t\tlet fields = this._valueFields;\n\n\t\tif (!fields) {\n\t\t\tthrow new Error(\"No value fields are set for the series.\");\n\t\t}\n\n\t\tconst sum: { [index: string]: number } = {};\n\t\tconst absSum: { [index: string]: number } = {};\n\t\tconst count: { [index: string]: number } = {};\n\t\tconst low: { [index: string]: number } = {};\n\t\tconst high: { [index: string]: number } = {};\n\t\tconst open: { [index: string]: number } = {};\n\t\tconst close: { [index: string]: number } = {};\n\t\tconst average: { [index: string]: number } = {};\n\t\tconst previous: { [index: string]: number } = {};\n\n\t\t$array.each(fields, (key) => {\n\t\t\tsum[key] = 0;\n\t\t\tabsSum[key] = 0;\n\t\t\tcount[key] = 0;\n\t\t})\n\n\t\t$array.each(fields, (key) => {\n\t\t\tlet change = key + \"Change\";\n\t\t\tlet changePercent = key + \"ChangePercent\";\n\t\t\tlet changePrevious = key + \"ChangePrevious\";\n\t\t\tlet changePreviousPercent = key + \"ChangePreviousPercent\";\n\t\t\tlet changeSelection = key + \"ChangeSelection\";\n\t\t\tlet ChangeSelectionPercent = key + \"ChangeSelectionPercent\";\n\n\t\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\t\tconst dataItem = this.dataItems[i];\n\n\t\t\t\tlet value = dataItem.get(key)\n\n\t\t\t\tif (value != null) {\n\t\t\t\t\tcount[key]++;\n\t\t\t\t\tsum[key] += value;\n\n\t\t\t\t\tabsSum[key] += Math.abs(value);\n\n\t\t\t\t\taverage[key] = sum[key] / count[key];\n\n\t\t\t\t\tif (low[key] > value || low[key] == null) {\n\t\t\t\t\t\tlow[key] = value;\n\t\t\t\t\t}\n\t\t\t\t\tif (high[key] < value || high[key] == null) {\n\t\t\t\t\t\thigh[key] = value;\n\t\t\t\t\t}\n\n\t\t\t\t\tclose[key] = value;\n\n\t\t\t\t\tif (open[key] == null) {\n\t\t\t\t\t\topen[key] = value;\n\t\t\t\t\t\tprevious[key] = value;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (startIndex === 0) {\n\t\t\t\t\t\tdataItem.setRaw((change), value - open[key]);\n\t\t\t\t\t\tdataItem.setRaw((changePercent), (value - open[key]) / open[key] * 100);\n\t\t\t\t\t}\n\n\n\t\t\t\t\tdataItem.setRaw((changePrevious), value - previous[key]);\n\t\t\t\t\tdataItem.setRaw((changePreviousPercent), (value - previous[key]) / previous[key] * 100);\n\t\t\t\t\tdataItem.setRaw((changeSelection), value - open[key]);\n\t\t\t\t\tdataItem.setRaw((ChangeSelectionPercent), (value - open[key]) / open[key] * 100);\n\n\t\t\t\t\tprevious[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\t$array.each(fields, (key) => {\n\t\t\tthis.setPrivate((key + \"AverageSelection\"), average[key]);\n\t\t\tthis.setPrivate((key + \"CountSelection\"), count[key]);\n\t\t\tthis.setPrivate((key + \"SumSelection\"), sum[key]);\n\t\t\tthis.setPrivate((key + \"AbsoluteSumSelection\"), absSum[key]);\n\t\t\tthis.setPrivate((key + \"LowSelection\"), low[key]);\n\t\t\tthis.setPrivate((key + \"HighSelection\"), high[key]);\n\t\t\tthis.setPrivate((key + \"OpenSelection\"), open[key]);\n\t\t\tthis.setPrivate((key + \"CloseSelection\"), close[key]);\n\t\t})\n\n\t\tif (startIndex === 0 && endIndex === this.dataItems.length) {\n\t\t\t$array.each(fields, (key) => {\n\t\t\t\tthis.setPrivate((key + \"Average\"), average[key]);\n\t\t\t\tthis.setPrivate((key + \"Count\"), count[key]);\n\t\t\t\tthis.setPrivate((key + \"Sum\"), sum[key]);\n\t\t\t\tthis.setPrivate((key + \"AbsoluteSum\"), absSum[key]);\n\t\t\t\tthis.setPrivate((key + \"Low\"), low[key]);\n\t\t\t\tthis.setPrivate((key + \"High\"), high[key]);\n\t\t\t\tthis.setPrivate((key + \"Open\"), open[key]);\n\t\t\t\tthis.setPrivate((key + \"Close\"), close[key]);\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic _updateChildren() {\n\t\tsuper._updateChildren();\n\n\t\tthis._psi = this.startIndex();\n\t\tthis._pei = this.endIndex();\n\n\t\t// Apply heat rules\n\t\tif (this._valuesDirty && this.get(\"heatRules\") != null) {\n\t\t\tconst rules = this.get(\"heatRules\", []);\n\t\t\t$array.each(rules, (rule) => {\n\t\t\t\tconst minValue = rule.minValue || this.getPrivate((rule.dataField + \"Low\")) || 0;\n\t\t\t\tconst maxValue = rule.maxValue || this.getPrivate((rule.dataField + \"High\")) || 0;\n\n\t\t\t\t$array.each(rule.target._entities, (target) => {\n\t\t\t\t\tconst value = target.dataItem.get(rule.dataField);\n\n\t\t\t\t\tif (!$type.isNumber(value)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet percent: number;\n\t\t\t\t\tif (rule.logarithmic) {\n\t\t\t\t\t\tpercent = (Math.log(value) * Math.LOG10E - Math.log(minValue) * Math.LOG10E) / ((Math.log(maxValue) * Math.LOG10E - Math.log(minValue) * Math.LOG10E));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tpercent = (value - minValue) / (maxValue - minValue);\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($type.isNumber(value) && (!$type.isNumber(percent) || Math.abs(percent) == Infinity)) {\n\t\t\t\t\t\tpercent = 0.5;\n\t\t\t\t\t}\n\n\t\t\t\t\t// fixes problems if all values are the same\n\t\t\t\t\tlet propertyValue;\n\t\t\t\t\tif ($type.isNumber(rule.min)) {\n\t\t\t\t\t\tpropertyValue = rule.min + (rule.max - rule.min) * percent;\n\t\t\t\t\t}\n\t\t\t\t\telse if (rule.min instanceof Color) {\n\t\t\t\t\t\tpropertyValue = Color.interpolate(percent, rule.min, rule.max);\n\t\t\t\t\t}\n\t\t\t\t\telse if (rule.min instanceof Percent) {\n\t\t\t\t\t\tpropertyValue = percentInterpolate(percent, rule.min, rule.max);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (rule.customFunction) {\n\t\t\t\t\t\trule.customFunction.call(this, target, minValue, maxValue, value);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttarget.set(rule.key, propertyValue);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tif (this.bullets.length > 0) {\n\t\t\tlet count = this.dataItems.length;\n\t\t\tlet startIndex = this.startIndex();\n\t\t\tlet endIndex = this.endIndex();\n\n\t\t\tif(endIndex < count){\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t\tif(startIndex > 0){\n\t\t\t\tstartIndex--;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < startIndex; i++) {\n\t\t\t\tthis._hideBullets(this.dataItems[i]);\n\t\t\t}\n\n\t\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\t\tthis._positionBullets(this.dataItems[i]);\n\t\t\t}\n\n\t\t\tfor (let i = endIndex; i < count; i++) {\n\t\t\t\tthis._hideBullets(this.dataItems[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _positionBullets(dataItem: DataItem){\n\t\tif(dataItem.bullets){\n\t\t\t$array.each(dataItem.bullets, (bullet) => {\n\t\t\t\tthis._positionBullet(bullet);\n\t\t\t\tconst sprite = bullet.get(\"sprite\");\n\n\t\t\t\tif(bullet.get(\"dynamic\")){\n\n\t\t\t\t\tif(sprite){\n\t\t\t\t\t\tsprite._markDirtyKey(\"fill\" as any);\n\t\t\t\t\t\tsprite.markDirtySize();\n\t\t\t\t\t}\n\t\t\t\t\tif(sprite instanceof Container){\n\t\t\t\t\t\tsprite.walkChildren((child)=>{\n\t\t\t\t\t\t\tchild._markDirtyKey(\"fill\" as any);\n\t\t\t\t\t\t\tchild.markDirtySize();\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(sprite instanceof Label && sprite.get(\"populateText\" as any)){\n\t\t\t\t\tsprite.text.markDirtyText();\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected _hideBullets(dataItem: DataItem) {\n\t\tif (dataItem.bullets) {\n\t\t\t$array.each(dataItem.bullets, (bullet) => {\n\t\t\t\tlet sprite = bullet.get(\"sprite\");\n\t\t\t\tif (sprite) {\n\t\t\t\t\tsprite.setPrivate(\"visible\", false);\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic _positionBullet(_bullet: Bullet) {\n\t}\n\n\tpublic _placeBulletsContainer(chart:Chart){\n\t\tchart.bulletsContainer.children.moveValue(this.bulletsContainer);\n\t}\n\n\tpublic _removeBulletsContainer(){\n\t\tconst bulletsContainer = this.bulletsContainer;\n\t\tif(bulletsContainer.parent){\n\t\t\tbulletsContainer.parent.children.removeValue(bulletsContainer)\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic disposeDataItem(dataItem: DataItem) {\n\t\tconst bullets = dataItem.bullets;\n\n\t\tif(bullets){\n\t\t\t$array.each(bullets, (bullet)=>{\n\t\t\t\tbullet.dispose();\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected _getItemReaderLabel(): string {\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Shows series's data item.\n\t *\n\t * @param dataItem Data item\n\t * @param duration Animation duration in milliseconds\n\t * @return Promise\n\t */\n\tpublic async showDataItem(dataItem: DataItem, duration?: number): Promise {\n\t\tconst promises = [super.showDataItem(dataItem, duration)];\n\t\tconst bullets = dataItem.bullets;\n\t\tif(bullets){\n\t\t\t$array.each(bullets, (bullet)=>{\n\t\t\t\tpromises.push(bullet.get(\"sprite\").show(duration));\n\t\t\t})\n\t\t}\n\t\tawait Promise.all(promises);\n\t}\n\n\t/**\n\t * Hides series's data item.\n\t *\n\t * @param dataItem Data item\n\t * @param duration Animation duration in milliseconds\n\t * @return Promise\n\t */\n\tpublic async hideDataItem(dataItem: DataItem, duration?: number): Promise {\n\t\tconst promises = [super.hideDataItem(dataItem, duration)];\n\t\tconst bullets = dataItem.bullets;\n\t\tif(bullets){\n\t\t\t$array.each(bullets, (bullet)=>{\n\t\t\t\tpromises.push(bullet.get(\"sprite\").hide(duration));\n\t\t\t})\n\t\t}\n\t\tawait Promise.all(promises);\n\t}\n\n\n\tprotected async _sequencedShowHide(show: boolean, duration?: number): Promise {\n\t\tif (this.get(\"sequencedInterpolation\")) {\n\n\t\t\tif (!$type.isNumber(duration)) {\n\t\t\t\tduration = this.get(\"interpolationDuration\", 0);\n\t\t\t}\n\n\t\t\tif (duration > 0) {\n\t\t\t\tconst startIndex = this.startIndex();\n\t\t\t\tconst endIndex = this.endIndex();\n\n\t\t\t\tawait Promise.all($array.map(this.dataItems, async (dataItem, i) => {\n\t\t\t\t\tlet realDuration = duration || 0;\n\n\t\t\t\t\tif (i < startIndex - 10 || i > endIndex + 10) {\n\t\t\t\t\t\trealDuration = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t//let delay = this.get(\"sequencedDelay\", 0) * i + realDuration * (i - startIndex) / (endIndex - startIndex);\n\t\t\t\t\tlet delay = this.get(\"sequencedDelay\", 0) + realDuration / (endIndex - startIndex);\n\n\t\t\t\t\tawait $time.sleep(delay * (i - startIndex));\n\n\t\t\t\t\tif (show) {\n\t\t\t\t\t\tawait this.showDataItem(dataItem, realDuration);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait this.hideDataItem(dataItem, realDuration);\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tawait Promise.all($array.map(this.dataItems, (dataItem) => {\n\t\t\t\t\tif (show) {\n\t\t\t\t\t\treturn this.showDataItem(dataItem, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn this.hideDataItem(dataItem, 0);\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateLegendValue(dataItem: DataItem) {\n\t\tconst legendDataItem = dataItem.get(\"legendDataItem\" as any) as DataItem;\n\n\t\tif (legendDataItem) {\n\t\t\tconst valueLabel = legendDataItem.get(\"valueLabel\");\n\t\t\tif (valueLabel) {\n\t\t\t\tconst text = valueLabel.text;\n\t\t\t\tlet txt = \"\";\n\t\t\t\tvalueLabel._setDataItem(dataItem);\n\t\t\t\ttxt = this.get(\"legendValueText\", text.get(\"text\", \"\"));\n\n\t\t\t\tvalueLabel.set(\"text\", txt);\n\t\t\t\ttext.markDirtyText();\n\t\t\t}\n\n\t\t\tconst label = legendDataItem.get(\"label\");\n\t\t\tif (label) {\n\t\t\t\tconst text = label.text;\n\t\t\t\tlet txt = \"\";\n\t\t\t\tlabel._setDataItem(dataItem);\n\t\t\t\ttxt = this.get(\"legendLabelText\", text.get(\"text\", \"\"));\n\n\t\t\t\tlabel.set(\"text\", txt);\n\t\t\t\ttext.markDirtyText();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateLegendMarker(_dataItem?: DataItem) {\n\t}\n\n\tprotected _onHide(){\n\t\tsuper._onHide();\n\n\t\tconst tooltip = this.getTooltip();\n\t\tif(tooltip){\n\t\t\ttooltip.hide();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic hoverDataItem(_dataItem: DataItem) {\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic unhoverDataItem(_dataItem: DataItem) {\n\t}\n}\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\nimport * as $type from \"../util/Type\";\nimport { Percent } from \"../util/Percent\";\nimport type { IPoint } from \"../util/IPoint\";\nimport { arc } from \"d3-shape\";\nimport * as $math from \"../util/Math\";\n\nexport interface ISliceSettings extends IGraphicsSettings {\n\n\t/**\n\t * Radius in pixels.\n\t */\n\tradius?: number;\n\n\t/**\n\t * Slice \"width\" in degrees.\n\t */\n\tarc?: number;\n\n\t/**\n\t * Inner radius of the slice in pixels.\n\t */\n\tinnerRadius?: number;\n\n\t/**\n\t * Start angle in degrees.\n\t */\n\tstartAngle?: number;\n\n\t/**\n\t * Slice corner radius in pixels.\n\t */\n\tcornerRadius?: number;\n\n\t/**\n\t * Slice \"pull out\" radius in pixels.\n\t */\n\tshiftRadius?: number;\n\n\t/**\n\t * Number of pixels to add to whatever slice's `radius` value is. Negative\n\t * numbers can also be used.\n\t */\n\tdRadius?: number;\n\n\t/**\n\t * Number of pixels to add to whatever slice's `innerRadius` value is.\n\t * Negative numbers can also be used.\n\t */\n\tdInnerRadius?: number;\n\n}\n\nexport interface ISlicePrivate extends IGraphicsPrivate {\n}\n\n/**\n * Draws a slice shape.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n */\nexport class Slice extends Graphics {\n\n\tdeclare public _settings: ISliceSettings;\n\tdeclare public _privateSettings: ISlicePrivate;\n\n\tpublic static className: string = \"Slice\";\n\tpublic static classNames: Array = Graphics.classNames.concat([Slice.className]);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic ix: number = 0;\n\n\t/**\n\t * @ignore\n\t */\n\tpublic iy: number = 0;\n\n\tprotected _generator = arc();\n\n\tpublic _getTooltipPoint(): IPoint {\n\t\tlet tooltipX = this.get(\"tooltipX\");\n\t\tlet tooltipY = this.get(\"tooltipY\");\n\n\t\tlet x = 0;\n\t\tlet y = 0;\n\n\t\tif ($type.isNumber(tooltipX)) {\n\t\t\tx = tooltipX;\n\t\t}\n\n\t\tif ($type.isNumber(tooltipY)) {\n\t\t\ty = tooltipY;\n\t\t}\n\n\t\tlet radius = this.get(\"radius\", 0);\n\t\tlet innerRadius = this.get(\"innerRadius\", 0);\n\n\t\tlet dRadius = this.get(\"dRadius\", 0);\n\t\tlet dInnerRadius = this.get(\"dInnerRadius\", 0);\n\n\t\tradius += dRadius;\n\t\tinnerRadius += dInnerRadius;\n\n\t\tif (innerRadius < 0) {\n\t\t\tinnerRadius = radius + innerRadius;\n\t\t}\n\n\t\tif (tooltipX instanceof Percent) {\n\t\t\tx = this.ix * (innerRadius + (radius - innerRadius) * tooltipX.value)\n\t\t}\n\n\t\tif (tooltipY instanceof Percent) {\n\t\t\ty = this.iy * (innerRadius + (radius - innerRadius) * tooltipY.value)\n\t\t}\n\n\t\tif (this.get(\"arc\") >= 360 && innerRadius == 0) {\n\t\t\tx = 0;\n\t\t\ty = 0;\n\t\t}\n\n\n\t\treturn { x, y };\n\t}\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"radius\") || this.isDirty(\"arc\") || this.isDirty(\"innerRadius\") || this.isDirty(\"startAngle\") || this.isDirty(\"dRadius\") || this.isDirty(\"dInnerRadius\") || this.isDirty(\"cornerRadius\")) {\n\t\t\tthis._clear = true;\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this._clear) {\n\t\t\tconst startAngle = this.get(\"startAngle\", 0);\n\t\t\tconst arc = this.get(\"arc\", 0);\n\t\t\tconst generator = this._generator;\n\n\t\t\tif(arc > 0.1){ // this fixes bug with full circle when arc is very small\n\t\t\t\tgenerator.cornerRadius(this.get(\"cornerRadius\", 0));\n\t\t\t}\n\t\t\tgenerator.context(this._display as any);\n\n\t\t\tlet radius = this.get(\"radius\", 0);\n\t\t\tlet innerRadius = this.get(\"innerRadius\", 0);\n\n\t\t\tlet dRadius = this.get(\"dRadius\", 0);\n\t\t\tlet dInnerRadius = this.get(\"dInnerRadius\", 0);\n\n\t\t\tradius += dRadius;\n\t\t\tinnerRadius += dInnerRadius;\t\t\t\n\n\t\t\tif (innerRadius < 0) {\n\t\t\t\tinnerRadius = radius + innerRadius;\n\t\t\t}\n\n\t\t\tgenerator({ innerRadius: innerRadius, outerRadius: radius, startAngle: (startAngle + 90) * $math.RADIANS, endAngle: (startAngle + arc + 90) * $math.RADIANS });\n\n\t\t\tlet middleAngle = startAngle + arc / 2;\n\n\t\t\tthis.ix = $math.cos(middleAngle);\n\t\t\tthis.iy = $math.sin(middleAngle);\n\t\t}\n\n\t\tif (this.isDirty(\"shiftRadius\")) {\n\t\t\tconst shiftRadius = this.get(\"shiftRadius\", 0);\n\t\t\tthis.setRaw(\"dx\", this.ix * shiftRadius);\n\t\t\tthis.setRaw(\"dy\", this.iy * shiftRadius);\n\t\t\tthis.markDirtyPosition();\n\t\t}\n\t}\n}\n","import type { IDisplayObject, IRendererEvents, IRendererEvent, IPointerEvent } from \"./backend/Renderer\";\nimport type { IBounds } from \"../util/IBounds\";\nimport type { Container } from \"./Container\";\nimport type { IAccessibilitySettings } from \"../util/Accessibility\";\nimport type { NumberFormatter } from \"../util/NumberFormatter\";\nimport type { DateFormatter } from \"../util/DateFormatter\";\nimport type { DurationFormatter } from \"../util/DurationFormatter\";\nimport type { DataItem, IComponentDataItem } from \"./Component\";\nimport type { Graphics } from \"./Graphics\";\nimport type { IPoint } from \"../util/IPoint\";\nimport type { ListTemplate } from \"../util/List\";\n\nimport type { Tooltip } from \"./Tooltip\";\nimport { Entity, IEntitySettings, IEntityPrivate, IEntityEvents } from \"../util/Entity\";\nimport { Template } from \"../util/Template\";\nimport { Percent } from \"../util/Percent\";\nimport { EventDispatcher, Events, EventListener } from \"../util/EventDispatcher\";\nimport { IDisposer, MultiDisposer, CounterDisposer } from \"../util/Disposer\";\nimport { waitForAnimations } from \"../util/Animation\";\n\nimport * as $utils from \"../util/Utils\";\nimport * as $array from \"../util/Array\";\nimport * as $type from \"../util/Type\";\nimport * as $object from \"../util/Object\";\nimport * as $math from \"../util/Math\";\n//import { populateString } from \"../util/PopulateString\";\n\n\n/**\n * An [[EventDispatcher]] for [[Sprite]].\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/events/} for more info\n */\nclass SpriteEventDispatcher> extends EventDispatcher {\n\tprotected static RENDERER_EVENTS: { [K in keyof IRendererEvents]?: >(this: SpriteEventDispatcher, event: IRendererEvents[K]) => void } = {\n\t\t\"click\": function(event) {\n\t\t\tif (this.isEnabled(\"click\") && !this._sprite.isDragging() && this._sprite._hasDown() && !this._sprite._hasMoved(this._makePointerEvent(\"click\", event))) {\n\t\t\t\tthis.dispatch(\"click\", this._makePointerEvent(\"click\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"rightclick\": function(event) {\n\t\t\tif (this.isEnabled(\"rightclick\")) {\n\t\t\t\tthis.dispatch(\"rightclick\", this._makePointerEvent(\"rightclick\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"middleclick\": function(event) {\n\t\t\tif (this.isEnabled(\"middleclick\")) {\n\t\t\t\tthis.dispatch(\"middleclick\", this._makePointerEvent(\"middleclick\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"dblclick\": function(event) {\n\t\t\tthis.dispatchParents(\"dblclick\", this._makePointerEvent(\"dblclick\", event));\n\t\t},\n\n\t\t\"pointerover\": function(event) {\n\t\t\tif (this.isEnabled(\"pointerover\")) {\n\t\t\t\tthis.dispatch(\"pointerover\", this._makePointerEvent(\"pointerover\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"pointerout\": function(event) {\n\t\t\tif (this.isEnabled(\"pointerout\")) {\n\t\t\t\tthis.dispatch(\"pointerout\", this._makePointerEvent(\"pointerout\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"pointerdown\": function(event) {\n\t\t\tthis.dispatchParents(\"pointerdown\", this._makePointerEvent(\"pointerdown\", event));\n\t\t},\n\n\t\t\"pointerup\": function(event) {\n\t\t\tif (this.isEnabled(\"pointerup\")) {\n\t\t\t\tthis.dispatch(\"pointerup\", this._makePointerEvent(\"pointerup\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"globalpointerup\": function(event) {\n\t\t\tif (this.isEnabled(\"globalpointerup\")) {\n\t\t\t\tthis.dispatch(\"globalpointerup\", this._makePointerEvent(\"globalpointerup\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"globalpointermove\": function(event) {\n\t\t\tif (this.isEnabled(\"globalpointermove\")) {\n\t\t\t\tthis.dispatch(\"globalpointermove\", this._makePointerEvent(\"globalpointermove\", event));\n\t\t\t}\n\t\t},\n\n\t\t\"wheel\": function(event) {\n\t\t\tif (this.isEnabled(\"wheel\")) {\n\t\t\t\tthis.dispatch(\"wheel\", {\n\t\t\t\t\ttype: \"wheel\",\n\t\t\t\t\ttarget: this._sprite,\n\t\t\t\t\toriginalEvent: event.event,\n\t\t\t\t\tpoint: event.point,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t};\n\n\tprotected _sprite: Sprite;\n\n\tprotected _rendererDisposers: { [K in keyof IRendererEvents]?: CounterDisposer } = {};\n\n\tprotected _dispatchParents: boolean = true;\n\n\tconstructor(sprite: Sprite) {\n\t\tsuper();\n\t\tthis._sprite = sprite;\n\t}\n\n\tprotected _makePointerEvent(key: K, event: IRendererEvent): ISpritePointerEvent & { type: K } {\n\t\treturn {\n\t\t\ttype: key,\n\t\t\toriginalEvent: event.event,\n\t\t\tpoint: event.point,\n\t\t\tsimulated: event.simulated,\n\t\t\tnative: event.native,\n\t\t\ttarget: this._sprite\n\t\t};\n\t}\n\n\tprotected _onRenderer(key: Key, dispatch: (this: this, event: IRendererEvents[Key]) => void): IDisposer {\n\t\t// TODO: is this OK? it'd be good not to require to set this on each individual element\n\t\tthis._sprite.set(\"interactive\", true);\n\t\tthis._sprite._display.interactive = true;\n\n\t\tlet events = this._rendererDisposers[key];\n\n\t\tif (events === undefined) {\n\t\t\tconst disposer = this._sprite._display.on(key, (e) => {\n\t\t\t\tdispatch.call(this, e);\n\t\t\t});\n\n\t\t\tevents = this._rendererDisposers[key] = new CounterDisposer(() => {\n\t\t\t\tdelete this._rendererDisposers[key];\n\t\t\t\tdisposer.dispose();\n\t\t\t});\n\t\t}\n\n\t\treturn events.increment();\n\t}\n\n\tprotected _on(once: boolean, type: Key | null, callback: any, context: C, shouldClone: boolean, dispatch: (type: Key, event: E[Key]) => void): EventListener {\n\t\tconst info = super._on(once, type, callback, context, shouldClone, dispatch);\n\n\t\tconst rendererEvent = (SpriteEventDispatcher.RENDERER_EVENTS as any)[type];\n\t\tif (rendererEvent !== undefined) {\n\t\t\tinfo.disposer = new MultiDisposer([\n\t\t\t\tinfo.disposer,\n\t\t\t\tthis._onRenderer(type as any, rendererEvent),\n\t\t\t]);\n\t\t}\n\n\t\treturn info;\n\t}\n\n\t/**\n\t * Will stop any bubbling up of the event to element's parents.\n\t *\n\t * Should be called in an event handler, e.g.:\n\t *\n\t * ```TypeScript\n\t * element.events.on(\"pointerdown\", function(ev) {\n\t * // Do something here and prevent from \"pointerdown\" bubbling up\n\t * // ...\n\t * ev.target.events.stopParentDispatch();\n\t * });\n\t * ```\n\t * ```JavaScript\n\t * element.events.on(\"pointerdown\", function(ev) {\n\t * // Do something here and prevent from \"pointerdown\" bubbling up\n\t * // ...\n\t * ev.target.events.stopParentDispatch();\n\t * });\n\t * ```\n\t */\n\tpublic stopParentDispatch() {\n\t\tthis._dispatchParents = false;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic dispatchParents(type: Key, event: E[Key]): void {\n\t\tconst old = this._dispatchParents;\n\n\t\tthis._dispatchParents = true;\n\n\t\ttry {\n\t\t\tthis.dispatch(type, event);\n\n\t\t\tif (this._dispatchParents && this._sprite.parent) {\n\t\t\t\tthis._sprite.parent.events.dispatchParents(type as any, event);\n\t\t\t}\n\n\t\t} finally {\n\t\t\tthis._dispatchParents = old;\n\t\t}\n\t}\n}\n\n\nexport interface ISpriteSettings extends IEntitySettings, IAccessibilitySettings {\n\n\t/**\n\t * X position relative to parent.\n\t */\n\tx?: number | Percent | null;\n\n\t/**\n\t * Y position relative to parent.\n\t */\n\ty?: number | Percent | null;\n\n\t/**\n\t * Element's absolute width in pixels (numeric value) or relative width to\n\t * parent ([[Percent]]);\n\t */\n\twidth?: number | Percent | null;\n\n\t/**\n\t * Element's absolute height in pixels (numeric value) or relative height to\n\t * parent ([[Percent]]);\n\t */\n\theight?: number | Percent | null;\n\n\t/**\n\t * Maximum allowed width in pixels.\n\t */\n\tmaxWidth?: number | null;\n\n\t/**\n\t * Maximum allowed height in pixels.\n\t */\n\tmaxHeight?: number | null;\n\n\t/**\n\t * Minimum allowed width in pixels.\n\t */\n\tminWidth?: number | null;\n\n\t/**\n\t * Minimum allowed height in pixels.\n\t */\n\tminHeight?: number | null;\n\n\t/**\n\t * Opacity. 0 - fully transparent; 1 - fully opaque.\n\t */\n\topacity?: number;\n\n\t/**\n\t * Rotation in degrees.\n\t */\n\trotation?: number;\n\n\t/**\n\t * Scale.\n\t *\n\t * Setting to a value less than 1 will shrink object.\n\t */\n\tscale?: number;\n\n\t/**\n\t * X coordinate of the center of the element relative to itself.\n\t *\n\t * Center coordinates will affect placement as well as rotation pivot point.\n\t */\n\tcenterX?: number | Percent;\n\n\t/**\n\t * Y coordinate of the center of the element relative to itself.\n\t *\n\t * Center coordinates will affect placement as well as rotation pivot point.\n\t */\n\tcenterY?: number | Percent;\n\n\t/**\n\t * Left margin in pixels.\n\t */\n\tmarginLeft?: number;\n\n\t/**\n\t * Right margin in pixels.\n\t */\n\tmarginRight?: number;\n\n\t/**\n\t * Top margin in pixels.\n\t */\n\tmarginTop?: number;\n\n\t/**\n\t * Bottom margin in pixels.\n\t */\n\tmarginBottom?: number;\n\n\t/**\n\t * Is element visible?\n\t */\n\tvisible?: boolean;\n\n\t/**\n\t * Positioning of the element.\n\t *\n\t * `\"absolute\"` means element will not participate in parent layout scheme,\n\t * and will be positioned solely accoridng its `x` and `y` settings.\n\t */\n\tposition?: \"absolute\" | \"relative\";\n\n\t/**\n\t * Horizontal shift in pixels. Can be negative to shift leftward.\n\t */\n\tdx?: number;\n\n\t/**\n\t * Vertical shift in pixels. Can be negative to shift upward.\n\t */\n\tdy?: number;\n\n\t/**\n\t * Should this element accept user interaction events?\n\t */\n\tinteractive?: boolean;\n\n\t/**\n\t * Text to show in a tooltip when hovered.\n\t */\n\ttooltipText?: string;\n\n\t/**\n\t * Tooltip pointer X coordinate relative to the element itself.\n\t */\n\ttooltipX?: number | Percent;\n\n\t/**\n\t * Tooltip pointer Y coordinate relative to the element itself.\n\t */\n\ttooltipY?: number | Percent;\n\n\t/**\n\t * [[Tooltip]] instance.\n\t */\n\ttooltip?: Tooltip;\n\n\t/**\n\t * Tooltip position.\n\t */\n\ttooltipPosition?: \"fixed\" | \"pointer\";\n\n\t/**\n\t * If set to `false` element will not be measured and cannot participate in\n\t * layout schemes.\n\t */\n\tisMeasured?: boolean;\n\n\t/**\n\t * Allows binding element's settings to data.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/template-fields/} for more info\n\t */\n\ttemplateField?: string;\n\n\t/**\n\t * If set to `true`, user will be able to drag this element. It will also\n\t * disable default drag events over the area of this element.\n\t */\n\tdraggable?: boolean;\n\n\t/**\n\t * If set to `true`, mouse wheel events will be triggered over the element. It\n\t * will also disable page scrolling using mouse wheel when pointer is over\n\t * the element.\n\t */\n\twheelable?: boolean;\n\n\t/**\n\t * An instance of [[NumberFormatter]] that should be used instead of global\n\t * formatter object.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/using-formatters/} for more info\n\t */\n\tnumberFormatter?: NumberFormatter | undefined;\n\n\t/**\n\t * An instance of [[DateFormatter]] that should be used instead of global\n\t * formatter object.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/using-formatters/} for more info\n\t */\n\tdateFormatter?: DateFormatter | undefined;\n\n\t/**\n\t * An instance of [[DurationFormatter]] that should be used instead of global\n\t * formatter object.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/using-formatters/} for more info\n\t */\n\tdurationFormatter?: DurationFormatter | undefined;\n\n\t/**\n\t * If set, element will toggle specified boolean setting between `true` and\n\t * `false` when clicked/touched.\n\t */\n\ttoggleKey?: \"disabled\" | \"active\" | \"none\" | undefined;\n\n\t/**\n\t * Indicates if element is currently active.\n\t */\n\tactive?: boolean;\n\n\t/**\n\t * Indicates if element is disabled.\n\t */\n\tdisabled?: boolean;\n\n\t/**\n\t * An SVG filter to apply to the element.\n\t *\n\t * IMPORTANT: SVG filters are not supported in some browsers, e.g. Safari.\n\t *\n\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/filter} for more info\n\t * @ignore todo: figure out if we still need this\n\t */\n\tfilter?: string;\n\n\t/**\n\t * A named mouse cursor style to show when hovering this element.\n\t *\n\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/cursor} for more info\n\t */\n\tcursorOverStyle?: string;\n\n\t/**\n\t * If set to `false` this element will not appear in exported snapshots of\n\t * the chart.\n\t */\n\texportable?: boolean;\n\n\t/**\n\t * Numeric layer to put element in.\n\t *\n\t * Elements with higher number will appear in front of the ones with lower\n\t * numer.\n\t *\n\t * If not set, will inherit layer from its ascendants.\n\t */\n\tlayer?: number;\n\n\t/**\n\t * If set to `true` the element will be hidden regardless of `visible` or\n\t * even if `show()` is called.\n\t */\n\tforceHidden?: boolean;\n\n\t/**\n\t * If set to `true` the element will be inactive - absolutely oblivious\n\t * to all interactions, even if there are related events set, or \n\t * the `interactive: true` is set.\n\t *\n\t * @since 5.0.21\n\t */\n\tforceInactive?: boolean;\n\n\t/**\n\t * Defines when tooltip is shown over the element.\n\t *\n\t * Available options:\n\t * * `\"hover\"` (default) - tooltip is shown when element is hovered by a pointer or touched. It is hidden as soon as element is not hovered anymore, or touch occurs outside it.\n\t * * `\"always\"` - a tooltip will always be shown over the element, without any interactions. Please note that if you need to show tooltips for multiple elements at the same time, you need to explicitly create a `Tooltip` instance and set element's `tooltip` setting with it.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/tooltips/#Sticky_tooltips} for more info\n\t * @default \"hover\"\n\t * @since 5.0.16\n\t */\n\tshowTooltipOn?: \"hover\" | \"always\"\n\n}\n\nexport interface ISpritePrivate extends IEntityPrivate {\n\n\t/**\n\t * @ignore\n\t */\n\tx?: number;\n\n\t/**\n\t * @ignore\n\t */\n\ty?: number;\n\n\t/**\n\t * @ignore\n\t */\n\twidth?: number;\n\n\t/**\n\t * @ignore\n\t */\n\theight?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tvisible?: boolean;\n\n\t/**\n\t * Is element currently showing a tooltip?\n\t */\n\tshowingTooltip?: boolean;\n\n\t/**\n\t * @ignore\n\t */\n\ttouchHovering?: boolean;\n\n\t/**\n\t * @ignore\n\t */\n\tfocusElement?: {\n\t\tdom: HTMLDivElement,\n\t\tdisposers: Array,\n\t};\n\n\t/**\n\t * An element tooltip should inherit its colors from.\n\t */\n\ttooltipTarget?: Graphics;\n\n\t/**\n\t * @ignore\n\t */\n\tlist?: ListTemplate;\n\n}\n\n/**\n * An interface defining event objects that originate from pinter interactions.\n */\nexport interface ISpritePointerEvent {\n\n\t/**\n\t * Original event object that caused the interaction, e.g. [[MouseEvent]].\n\t */\n\toriginalEvent: IPointerEvent;\n\n\t/**\n\t * A point where event originated.\n\t */\n\tpoint: IPoint;\n\n\t/**\n\t * Is it a simulated event, e.g. if the event was generated by code rather\n\t * then actual user interaction.\n\t */\n\tsimulated: boolean;\n\n\t/**\n\t * Whether event originated in chart's container or its children.\n\t */\n\tnative?: boolean;\n\n\t/**\n\t * The element on which the event occurred.\n\t */\n\ttarget: Sprite;\n\n}\n\nexport interface ISpriteEvents extends IEntityEvents {\n\n\t/**\n\t * Invoked when element's data item changes.\n\t */\n\tdataitemchanged: {\n\t\toldDataItem: DataItem | undefined,\n\t\tnewDataItem: DataItem | undefined\n\t};\n\n\t/**\n\t * Invoked when element's position (X/Y) changes.\n\t */\n\tpositionchanged: {};\n\n\t/**\n\t * Invoked when element's bounds change due to any manipulation to it.\n\t */\n\tboundschanged: {};\n\n\t/**\n\t * Invoked when element dragging starts.\n\t */\n\tdragstart: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when element dragging stops.\n\t */\n\tdragstop: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when element ois being dragged.\n\t */\n\tdragged: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when element is clicked or tapped.\n\t */\n\tclick: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when element is clicked width the right mouse button.\n\t */\n\trightclick: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when element is clicked with the middle mouse button.\n\t */\n\tmiddleclick: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when element is doubleclicked or tapped twice quickly.\n\t */\n\tdblclick: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when pointer moves over the element.\n\t */\n\tpointerover: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when pointer moves outside the element.\n\t */\n\tpointerout: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when pointer button is pressed or touch starts over the element.\n\t */\n\tpointerdown: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when pointer button is released or touch stops over the element.\n\t */\n\tpointerup: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when pointer button is released or touch stops in the window, even\n\t * outside of the element or even chart area.\n\t */\n\tglobalpointerup: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when pointer is moving anywhere in the window, even outside of the\n\t * element or even chart area.\n\t */\n\tglobalpointermove: ISpritePointerEvent;\n\n\t/**\n\t * Invoked when mouse wheel is spinned while pointer is over the element.\n\t */\n\twheel: {\n\t\toriginalEvent: WheelEvent;\n\t\tpoint: IPoint;\n\t};\n\n\t/**\n\t * Invoked when element gains focus.\n\t */\n\tfocus: {\n\t\toriginalEvent: FocusEvent;\n\t\ttarget: Sprite;\n\t};\n\n\t/**\n\t * Invoked when element loses focus.\n\t */\n\tblur: {\n\t\toriginalEvent: FocusEvent;\n\t\ttarget: Sprite;\n\t};\n\n}\n\n/**\n * A base class for all visual elements.\n *\n * @important\n */\nexport abstract class Sprite extends Entity {\n\tdeclare public _settings: ISpriteSettings;\n\tdeclare public _privateSettings: ISpritePrivate;\n\tdeclare public _events: ISpriteEvents;\n\n\tdeclare public events: SpriteEventDispatcher>;\n\n\tpublic abstract _display: IDisplayObject;\n\n\tprotected _adjustedLocalBounds: IBounds = { left: 0, right: 0, top: 0, bottom: 0 };\n\n\tprotected _localBounds: IBounds = { left: 0, right: 0, top: 0, bottom: 0 };\n\n\tpublic static className: string = \"Sprite\";\n\tpublic static classNames: Array = Entity.classNames.concat([Sprite.className]);\n\n\tpublic _parent: Container | undefined;\n\tprotected _dataItem: DataItem | undefined;\n\n\tprotected _templateField: Template | undefined;\n\n\tprotected _sizeDirty: boolean = false;\n\n\t// Will be true only when dragging\n\tprotected _isDragging: boolean = false;\n\n\t// The event when the dragging starts\n\tprotected _dragEvent: ISpritePointerEvent | undefined;\n\n\t// The position when dragging starts\n\tprotected _dragPoint: IPoint | undefined;\n\n\tprotected _isHidden: boolean = false;\n\n\tprotected _isShowing: boolean = false;\n\n\tprotected _isHiding: boolean = false;\n\n\tprotected _isDown: boolean = false;\n\tprotected _downPoint: IPoint | undefined;\n\n\tpublic _downPoints: { [index: number]: IPoint } = {};\n\n\tpublic _toggleDp: IDisposer | undefined;\n\n\tprotected _dragDp: MultiDisposer | undefined;\n\n\tprotected _tooltipDp: MultiDisposer | undefined;\n\n\tprotected _hoverDp: MultiDisposer | undefined;\n\n\tprotected _focusDp: MultiDisposer | undefined;\n\n\tprotected _tooltipMoveDp: IDisposer | undefined;\n\n\tprotected _tooltipPointerDp: MultiDisposer | undefined;\n\n\tprotected _statesHandled: boolean = false;\n\n\tprotected _afterNew() {\n\t\tthis.setPrivateRaw(\"visible\", true);\n\t\tsuper._afterNew();\n\t}\n\n\tpublic _markDirtyKey(key: Key) {\n\t\tsuper._markDirtyKey(key);\n\t\tif (key == \"x\" || key == \"y\" || key == \"dx\" || key == \"dy\") {\n\t\t\tthis.markDirtyBounds();\n\t\t\tthis._addPercentagePositionChildren();\n\t\t\tthis.markDirtyPosition();\n\t\t}\n\t}\n\n\tpublic _markDirtyPrivateKey(key: Key) {\n\t\tsuper._markDirtyPrivateKey(key);\n\t\tif (key == \"x\" || key == \"y\") {\n\t\t\tthis.markDirtyPosition();\n\t\t}\n\t}\n\n\tprotected _removeTemplateField(): void {\n\t\tif (this._templateField) {\n\t\t\tthis._templateField._removeObjectTemplate(this);\n\t\t}\n\t}\n\n\tprotected _createEvents(): SpriteEventDispatcher> {\n\t\treturn new SpriteEventDispatcher(this);\n\t}\n\n\tpublic _processTemplateField(): void {\n\t\tlet template;\n\n\t\tconst field = this.get(\"templateField\");\n\n\t\tif (field) {\n\t\t\tconst dataItem = this.dataItem;\n\t\t\tif (dataItem) {\n\t\t\t\tconst context = dataItem.dataContext;\n\t\t\t\tif (context) {\n\t\t\t\t\ttemplate = (context as any)[field];\n\n\t\t\t\t\tif (!(template instanceof Template) && template) {\n\t\t\t\t\t\ttemplate = Template.new(template);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this._templateField !== template) {\n\t\t\tthis._removeTemplateField();\n\n\t\t\tthis._templateField = template;\n\n\t\t\tif (template) {\n\t\t\t\ttemplate._setObjectTemplate(this);\n\t\t\t}\n\n\t\t\tthis._applyTemplates();\n\t\t}\n\t}\n\n\t// TODO change this to run before the element is added to the parent, so that way\n\t// it doesn't need to apply the themes twice\n\tpublic _setDataItem(dataItem?: DataItem): void {\n\t\tconst oldDataItem = this._dataItem\n\t\tthis._dataItem = dataItem;\n\t\tthis._processTemplateField();\n\t\tconst eventType = \"dataitemchanged\";\n\t\tif (this.events.isEnabled(eventType)) {\n\t\t\tthis.events.dispatch(eventType, {\n\t\t\t\ttype: eventType,\n\t\t\t\ttarget: this,\n\t\t\t\toldDataItem: oldDataItem,\n\t\t\t\tnewDataItem: dataItem\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * A [[DataItem]] used for this element.\n\t *\n\t * NOTE: data item is being assigned automatically in most cases where it\n\t * matters. Use this accessor to set data item only if you know what you're\n\t * doing.\n\t *\n\t * @param value Data item\n\t */\n\tpublic set dataItem(value: DataItem | undefined) {\n\t\tthis._setDataItem(value);\n\t}\n\n\t/**\n\t * @return DataItem\n\t */\n\tpublic get dataItem(): DataItem | undefined {\n\t\tif (this._dataItem) {\n\t\t\treturn this._dataItem;\n\n\t\t} else {\n\t\t\tlet parent = this._parent;\n\n\t\t\twhile (parent) {\n\t\t\t\tif (parent._dataItem) {\n\t\t\t\t\treturn parent._dataItem;\n\n\t\t\t\t} else {\n\t\t\t\t\tparent = parent._parent;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _addPercentageSizeChildren() {\n\t\tlet parent = this.parent;\n\t\tif (parent) {\n\t\t\tif (this.get(\"width\") instanceof Percent || this.get(\"height\") instanceof Percent) {\n\t\t\t\t$array.pushOne(parent._percentageSizeChildren, this);\n\t\t\t} else {\n\t\t\t\t$array.removeFirst(parent._percentageSizeChildren, this);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _addPercentagePositionChildren() {\n\t\tlet parent = this.parent;\n\t\tif (parent) {\n\t\t\tif (this.get(\"x\") instanceof Percent || this.get(\"y\") instanceof Percent) {\n\t\t\t\t$array.pushOne(parent._percentagePositionChildren, this);\n\t\t\t} else {\n\t\t\t\t$array.removeFirst(parent._percentagePositionChildren, this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirtyPosition() {\n\t\tthis._root._addDirtyPosition(this);\n\t}\n\n\tprotected updatePivotPoint() {\n\t\tconst bounds = this._localBounds;\n\t\tif (bounds) {\n\t\t\tconst centerX = this.get(\"centerX\");\n\t\t\tif (centerX != null) {\n\t\t\t\tthis._display.pivot.x = bounds.left + $utils.relativeToValue(centerX!, bounds.right - bounds.left);\n\t\t\t}\n\n\t\t\tconst centerY = this.get(\"centerY\");\n\t\t\tif (centerY != null) {\n\t\t\t\tthis._display.pivot.y = bounds.top + $utils.relativeToValue(centerY!, bounds.bottom - bounds.top);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"tooltip\")) {\n\t\t\tconst previous = this._prevSettings.tooltip;\n\t\t\tif (previous) {\n\t\t\t\tprevious.dispose();\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"layer\")) {\n\t\t\tthis._display.setLayer(this.get(\"layer\"));\n\t\t\tthis.markDirtyLayer();\n\t\t}\n\n\t\tif (this.isDirty(\"tooltipPosition\")) {\n\t\t\tconst tooltipMoveDp = this._tooltipMoveDp;\n\t\t\tif (tooltipMoveDp) {\n\t\t\t\ttooltipMoveDp.dispose();\n\t\t\t\tthis._tooltipMoveDp = undefined;\n\t\t\t}\n\n\t\t\tconst tooltipPointerDp = this._tooltipPointerDp;\n\t\t\tif (tooltipPointerDp) {\n\t\t\t\ttooltipPointerDp.dispose();\n\t\t\t\tthis._tooltipPointerDp = undefined;\n\t\t\t}\n\n\t\t\tif (this.get(\"tooltipPosition\") == \"pointer\") {\n\t\t\t\tthis._tooltipPointerDp = new MultiDisposer([\n\t\t\t\t\tthis.events.on(\"pointerover\", () => {\n\t\t\t\t\t\tthis._tooltipMoveDp = this.events.on(\"globalpointermove\", (e) => {\n\t\t\t\t\t\t\tthis.showTooltip(e.point);\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\n\t\t\t\t\tthis.events.on(\"pointerout\", () => {\n\t\t\t\t\t\tconst tooltipMoveDp = this._tooltipMoveDp;\n\t\t\t\t\t\tif (tooltipMoveDp) {\n\t\t\t\t\t\t\ttooltipMoveDp.dispose();\n\t\t\t\t\t\t\tthis._tooltipMoveDp = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t})])\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleStates() {\n\t\tif (!this._statesHandled) {\n\t\t\tif (this.isDirty(\"active\")) {\n\t\t\t\tif (this.get(\"active\")) {\n\t\t\t\t\tthis.states.applyAnimate(\"active\");\n\t\t\t\t\tthis.set(\"ariaChecked\", true);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!this.isHidden()) {\n\t\t\t\t\t\tthis.states.applyAnimate(\"default\");\n\t\t\t\t\t}\n\t\t\t\t\tthis.set(\"ariaChecked\", false);\n\t\t\t\t}\n\t\t\t\tthis.markDirtyAccessibility();\n\t\t\t}\n\n\t\t\tif (this.isDirty(\"disabled\")) {\n\t\t\t\tif (this.get(\"disabled\")) {\n\t\t\t\t\tthis.states.applyAnimate(\"disabled\");\n\t\t\t\t\tthis.set(\"ariaChecked\", false);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!this.isHidden()) {\n\t\t\t\t\t\tthis.states.applyAnimate(\"default\");\n\t\t\t\t\t}\n\t\t\t\t\tthis.set(\"ariaChecked\", true);\n\t\t\t\t}\n\t\t\t\tthis.markDirtyAccessibility();\n\t\t\t}\n\t\t\tthis._statesHandled = true;\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tconst display = this._display;\n\t\tconst events = this.events;\n\n\t\tif (this.isDirty(\"draggable\")) {\n\t\t\tconst draggable = this.get(\"draggable\");\n\t\t\tif (draggable) {\n\t\t\t\tthis.set(\"interactive\", true);\n\n\t\t\t\tthis._dragDp = new MultiDisposer([\n\t\t\t\t\tevents.on(\"pointerdown\", (ev) => {\n\t\t\t\t\t\tthis.dragStart(ev);\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"globalpointermove\", (ev) => {\n\t\t\t\t\t\tthis.dragMove(ev);\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"globalpointerup\", (ev) => {\n\t\t\t\t\t\tthis.dragStop(ev);\n\t\t\t\t\t})])\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._dragDp) {\n\t\t\t\t\tthis._dragDp.dispose();\n\t\t\t\t\tthis._dragDp = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"tooltipText\")) {\n\t\t\tconst tooltipText = this.get(\"tooltipText\");\n\t\t\tif (tooltipText) {\n\t\t\t\tthis._tooltipDp = new MultiDisposer([\n\t\t\t\t\tevents.on(\"pointerover\", () => {\n\t\t\t\t\t\tthis.showTooltip();\n\t\t\t\t\t}),\n\t\t\t\t\tevents.on(\"pointerout\", () => {\n\t\t\t\t\t\tif (this.get(\"showTooltipOn\") != \"always\") {\n\t\t\t\t\t\t\tthis.hideTooltip();\n\t\t\t\t\t\t}\n\t\t\t\t\t})])\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._tooltipDp) {\n\t\t\t\t\tthis._tooltipDp.dispose();\n\t\t\t\t\tthis._tooltipDp = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"toggleKey\")) {\n\t\t\tlet toggleKey = this.get(\"toggleKey\") as any;\n\t\t\tif (toggleKey && toggleKey != \"none\") {\n\t\t\t\tthis._toggleDp = events.on(\"click\", () => {\n\t\t\t\t\tif (!this._isDragging) {\n\t\t\t\t\t\tthis.set(toggleKey, !this.get(toggleKey));\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._toggleDp) {\n\t\t\t\t\tthis._toggleDp.dispose();\n\t\t\t\t\tthis._toggleDp = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._handleStates();\n\n\t\tif (this.isDirty(\"opacity\")) {\n\t\t\tdisplay.alpha = Math.max(0, this.get(\"opacity\", 1));\n\t\t}\n\n\t\tif (this.isDirty(\"rotation\")) {\n\t\t\tthis.markDirtyBounds();\n\t\t\tdisplay.angle = this.get(\"rotation\", 0);\n\t\t}\n\n\t\tif (this.isDirty(\"scale\")) {\n\t\t\tthis.markDirtyBounds();\n\t\t\tdisplay.scale = this.get(\"scale\", 0);\n\t\t}\n\n\t\tif (this.isDirty(\"centerX\") || this.isDirty(\"centerY\")) {\n\t\t\tthis.markDirtyBounds();\n\t\t\tthis.updatePivotPoint();\n\t\t}\n\n\t\tif (this.isDirty(\"visible\") || this.isPrivateDirty(\"visible\") || this.isDirty(\"forceHidden\")) {\n\t\t\tif (!this.get(\"visible\") || !this.getPrivate(\"visible\") || this.get(\"forceHidden\")) {\n\t\t\t\tdisplay.visible = false;\n\t\t\t\tthis.hideTooltip();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdisplay.visible = true;\n\t\t\t}\n\n\t\t\tthis.markDirtyBounds();\n\t\t\tif (this.get(\"focusable\")) {\n\t\t\t\tthis.markDirtyAccessibility();\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"width\") || this.isDirty(\"height\")) {\n\t\t\tthis.markDirtyBounds();\n\t\t\tthis._addPercentageSizeChildren();\n\n\t\t\tconst parent = this.parent;\n\t\t\tif (parent) {\n\t\t\t\tif ((this.isDirty(\"width\") && this.get(\"width\") instanceof Percent) || (this.isDirty(\"height\") && this.get(\"height\") instanceof Percent)) {\n\t\t\t\t\tparent.markDirty();\n\t\t\t\t\tparent._prevWidth = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._sizeDirty = true;\n\t\t}\n\n\t\tif (this.isDirty(\"maxWidth\") || this.isDirty(\"maxHeight\") || this.isPrivateDirty(\"width\") || this.isPrivateDirty(\"height\")) {\n\t\t\tthis.markDirtyBounds();\n\t\t\tthis._sizeDirty = true;\n\t\t}\n\n\t\tif (this._sizeDirty) {\n\t\t\tthis._updateSize();\n\t\t}\n\n\t\tif (this.isDirty(\"wheelable\")) {\n\t\t\tconst wheelable = this.get(\"wheelable\");\n\t\t\tif (wheelable) {\n\t\t\t\tthis.set(\"interactive\", true);\n\t\t\t}\n\t\t\tdisplay.wheelable = wheelable ? true : false;\n\t\t}\n\n\t\t// Accessibility\n\t\tif (this.isDirty(\"tabindexOrder\") || this.isDirty(\"focusableGroup\")) {\n\t\t\tif (this.get(\"focusable\")) {\n\t\t\t\tthis._root._registerTabindexOrder(this);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._root._unregisterTabindexOrder(this);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"filter\")) {\n\t\t\t//this.markDirtyBounds();\n\t\t\tdisplay.filter = this.get(\"filter\");\n\t\t}\n\n\t\tif (this.isDirty(\"cursorOverStyle\")) {\n\t\t\tdisplay.cursorOverStyle = this.get(\"cursorOverStyle\");\n\t\t}\n\n\t\tif (this.isDirty(\"hoverOnFocus\")) {\n\t\t\tif (this.get(\"hoverOnFocus\")) {\n\t\t\t\tthis._focusDp = new MultiDisposer([\n\t\t\t\t\tevents.on(\"focus\", () => {\n\t\t\t\t\t\t// TODO: proper hover, not just tooltip\n\t\t\t\t\t\tthis.showTooltip();\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"blur\", () => {\n\t\t\t\t\t\t// TODO: proper hover, not just tooltip\n\t\t\t\t\t\tthis.hideTooltip();\n\t\t\t\t\t})])\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._focusDp) {\n\t\t\t\t\tthis._focusDp.dispose();\n\t\t\t\t\tthis._focusDp = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"focusable\")) {\n\t\t\tif (this.get(\"focusable\")) {\n\t\t\t\tthis._root._registerTabindexOrder(this);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._root._unregisterTabindexOrder(this);\n\t\t\t}\n\t\t\tthis.markDirtyAccessibility();\n\t\t}\n\n\t\tif (this.isDirty(\"role\") || this.isDirty(\"ariaLive\") || this.isDirty(\"ariaChecked\") || this.isDirty(\"ariaHidden\") || this.isDirty(\"ariaOrientation\") || this.isDirty(\"ariaValueNow\") || this.isDirty(\"ariaValueMin\") || this.isDirty(\"ariaValueMax\") || this.isDirty(\"ariaValueText\") || this.isDirty(\"ariaLabel\") || this.isDirty(\"ariaControls\")) {\n\t\t\t// display.accessibility.ariaLabel = populateString(this, this.get(\"ariaLabel\", \"\"));\n\t\t\t// @todo make sure ariaLabel gets populated in Root\n\t\t\tthis.markDirtyAccessibility();\n\t\t}\n\n\t\tif (this.isDirty(\"exportable\")) {\n\t\t\tdisplay.exportable = this.get(\"exportable\");\n\t\t}\n\n\t\tif (this.isDirty(\"interactive\")) {\n\t\t\tconst events = this.events;\n\t\t\tif (this.get(\"interactive\")) {\n\t\t\t\tthis._hoverDp = new MultiDisposer([\n\t\t\t\t\tevents.on(\"click\", (ev) => {\n\t\t\t\t\t\tif ($utils.isTouchEvent(ev.originalEvent)) {\n\t\t\t\t\t\t\tif (!this.getPrivate(\"touchHovering\")) {\n\t\t\t\t\t\t\t\tthis.setTimeout(() => {\n\t\t\t\t\t\t\t\t\tthis._handleOver();\n\t\t\t\t\t\t\t\t\tif (this.get(\"tooltipText\")) {\n\t\t\t\t\t\t\t\t\t\tthis.showTooltip();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.setPrivateRaw(\"touchHovering\", true);\n\t\t\t\t\t\t\t\t}, 10)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"globalpointerup\", (ev) => {\n\t\t\t\t\t\tif ($utils.isTouchEvent(ev.originalEvent)) {\n\t\t\t\t\t\t\tif (this.getPrivate(\"touchHovering\")) {\n\t\t\t\t\t\t\t\tthis._handleOut();\n\t\t\t\t\t\t\t\tif (this.get(\"tooltipText\")) {\n\t\t\t\t\t\t\t\t\tthis.hideTooltip();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.setPrivateRaw(\"touchHovering\", false);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this._isDown) {\n\t\t\t\t\t\t\tthis._handleUp(ev);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//this._isDown = false;\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"pointerover\", () => {\n\t\t\t\t\t\tthis._handleOver();\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"pointerout\", () => {\n\t\t\t\t\t\tthis._handleOut();\n\t\t\t\t\t}),\n\n\t\t\t\t\tevents.on(\"pointerdown\", (e) => {\n\t\t\t\t\t\tthis._handleDown(e);\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._display.interactive = false;\n\t\t\t\tif (this._hoverDp) {\n\t\t\t\t\tthis._hoverDp.dispose();\n\t\t\t\t\tthis._hoverDp = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"forceInactive\")) {\n\t\t\tthis._display.inactive = this.get(\"forceInactive\", false);\n\t\t}\n\n\t\tif (this.get(\"showTooltipOn\") == \"always\" && this._display.visible) {\n\t\t\tthis.showTooltip();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t * @todo should this be user-accessible?\n\t */\n\tpublic dragStart(e: ISpritePointerEvent) {\n\t\tthis._dragEvent = e;\n\t\tthis.events.stopParentDispatch();\n\t}\n\n\t/**\n\t * @ignore\n\t * @todo should this be user-accessible?\n\t */\n\tpublic dragStop(e: ISpritePointerEvent) {\n\t\tthis._dragEvent = undefined;\n\t\tthis._dragPoint = undefined;\n\t\tthis.events.stopParentDispatch();\n\n\t\tif (this._isDragging) {\n\t\t\tthis._isDragging = false;\n\n\t\t\tconst type = \"dragstop\";\n\t\t\tif (this.events.isEnabled(type)) {\n\t\t\t\tthis.events.dispatch(type, {\n\t\t\t\t\ttype: type,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\toriginalEvent: e.originalEvent,\n\t\t\t\t\tpoint: e.point,\n\t\t\t\t\tsimulated: e.simulated,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleOver() {\n\t\tif (!this.isHidden()) {\n\t\t\tif (this.get(\"active\") && this.states.lookup(\"hoverActive\")) {\n\t\t\t\tthis.states.applyAnimate(\"hoverActive\");\n\t\t\t}\n\t\t\telse if (this.get(\"disabled\") && this.states.lookup(\"hoverDisabled\")) {\n\t\t\t\tthis.states.applyAnimate(\"hoverDisabled\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.states.applyAnimate(\"hover\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleOut() {\n\t\tif (!this.isHidden()) {\n\t\t\tif (this.get(\"active\") && this.states.lookup(\"active\")) {\n\t\t\t\tthis.states.applyAnimate(\"active\");\n\t\t\t}\n\t\t\telse if (this.get(\"disabled\") && this.states.lookup(\"disabled\")) {\n\t\t\t\tthis.states.applyAnimate(\"disabled\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this.states.lookup(\"hover\") || this.states.lookup(\"hoverActive\")) {\n\t\t\t\t\tthis.states.applyAnimate(\"default\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleUp(e: ISpritePointerEvent) {\n\t\tif (!this.isHidden()) {\n\t\t\tif (this.get(\"active\") && this.states.lookup(\"active\")) {\n\t\t\t\tthis.states.applyAnimate(\"active\");\n\t\t\t}\n\t\t\telse if (this.get(\"disabled\") && this.states.lookup(\"disabled\")) {\n\t\t\t\tthis.states.applyAnimate(\"disabled\");\n\t\t\t}\n\t\t\telse if (this.states.lookup(\"down\")) {\n\t\t\t\tif (this.isHover()) {\n\t\t\t\t\tthis.states.applyAnimate(\"hover\");\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.states.applyAnimate(\"default\");\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// @todo remove this once migrated to _downPoints\n\t\t\tthis._downPoint = undefined;\n\n\t\t\tconst pointerId = $utils.getPointerId(e.originalEvent);\n\t\t\tdelete this._downPoints[pointerId];\n\n\t\t\tif ($object.keys(this._downPoints).length == 0) {\n\t\t\t\tthis._isDown = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _hasMoved(e: ISpritePointerEvent): boolean {\n\t\t// @todo remove this once migrated to _downPoints\n\t\t// if (this._downPoint) {\n\t\t// \tconst x = Math.abs(this._downPoint.x - e.point.x);\n\t\t// \tconst y = Math.abs(this._downPoint.y - e.point.y);\n\t\t// \treturn (x > 5) || (y > 5);\n\t\t// }\n\n\t\tconst pointerId = $utils.getPointerId(e.originalEvent);\n\t\tconst downPoint = this._downPoints[pointerId];\n\t\tif (downPoint) {\n\t\t\tconst x = Math.abs(downPoint.x - e.point.x);\n\t\t\tconst y = Math.abs(downPoint.y - e.point.y);\n\t\t\treturn (x > 5) || (y > 5);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic _hasDown(): boolean {\n\t\treturn $object.keys(this._downPoints).length > 0;\n\t}\n\n\tprotected _handleDown(e: ISpritePointerEvent) {\n\n\t\tconst parent = this.parent;\n\t\tif (parent && !this.get(\"draggable\")) {\n\t\t\tparent._handleDown(e);\n\t\t}\n\n\t\tif (this.get(\"interactive\") && !this.isHidden()) {\n\t\t\tif (this.states.lookup(\"down\")) {\n\t\t\t\tthis.states.applyAnimate(\"down\");\n\t\t\t}\n\t\t\tthis._downPoint = {\n\t\t\t\tx: e.point.x,\n\t\t\t\ty: e.point.y\n\t\t\t};\n\n\n\t\t\t// @todo remove this once migrated to _downPoints\n\t\t\tthis._isDown = true;\n\n\t\t\tconst pointerId = $utils.getPointerId(e.originalEvent);\n\t\t\tthis._downPoints[pointerId] = {\n\t\t\t\tx: e.point.x,\n\t\t\t\ty: e.point.y\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t * @todo should this be user-accessible?\n\t */\n\tpublic dragMove(e: ISpritePointerEvent) {\n\t\tlet dragEvent = this._dragEvent;\n\n\t\tif (dragEvent) {\n\t\t\tlet angle = 0;\n\n\t\t\tlet parent = this.parent;\n\t\t\twhile (parent != null) {\n\t\t\t\tangle += parent.get(\"rotation\", 0);\n\t\t\t\tparent = parent.parent;\n\t\t\t}\n\n\t\t\tlet x = e.point.x - dragEvent.point.x;\n\t\t\tlet y = e.point.y - dragEvent.point.y;\n\n\t\t\tconst events = this.events;\n\n\t\t\tif (dragEvent.simulated && !this._isDragging) {\n\t\t\t\tthis._isDragging = true;\n\t\t\t\tthis._dragEvent = e;\n\n\t\t\t\tthis._dragPoint = {\n\t\t\t\t\tx: this.x(),\n\t\t\t\t\ty: this.y()\n\t\t\t\t};\n\n\t\t\t\tconst type = \"dragstart\";\n\t\t\t\tif (events.isEnabled(type)) {\n\t\t\t\t\tevents.dispatch(type, {\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\ttarget: this,\n\t\t\t\t\t\toriginalEvent: e.originalEvent,\n\t\t\t\t\t\tpoint: e.point,\n\t\t\t\t\t\tsimulated: e.simulated,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this._isDragging) {\n\t\t\t\tlet dragPoint = this._dragPoint!;\n\n\t\t\t\tthis.set(\"x\", dragPoint.x + x * $math.cos(angle) + y * $math.sin(angle));\n\t\t\t\tthis.set(\"y\", dragPoint.y + y * $math.cos(angle) - x * $math.sin(angle));\n\n\t\t\t\tconst type = \"dragged\";\n\t\t\t\tif (events.isEnabled(type)) {\n\t\t\t\t\tevents.dispatch(type, {\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\ttarget: this,\n\t\t\t\t\t\toriginalEvent: e.originalEvent,\n\t\t\t\t\t\tpoint: e.point,\n\t\t\t\t\t\tsimulated: e.simulated,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tif (Math.hypot(x, y) > 5) {\n\t\t\t\t\tthis._isDragging = true;\n\t\t\t\t\tthis._dragEvent = e;\n\n\t\t\t\t\tthis._dragPoint = {\n\t\t\t\t\t\tx: this.x(),\n\t\t\t\t\t\ty: this.y()\n\t\t\t\t\t};\n\n\t\t\t\t\tconst type = \"dragstart\";\n\t\t\t\t\tif (events.isEnabled(type)) {\n\t\t\t\t\t\tevents.dispatch(type, {\n\t\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\t\ttarget: this,\n\t\t\t\t\t\t\toriginalEvent: e.originalEvent,\n\t\t\t\t\t\t\tpoint: e.point,\n\t\t\t\t\t\t\tsimulated: e.simulated\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _updateSize() {\n\n\t}\n\n\tprotected _getBounds() {\n\t\tthis._localBounds = this._display.getLocalBounds();\n\t}\n\n\t/**\n\t * Returns depth (how deep in the hierachy of the content tree) of this\n\t * element.\n\t *\n\t * @return Depth\n\t */\n\tpublic depth(): number {\n\t\tlet self: Container | undefined = this.parent;\n\t\tlet depth = 0;\n\n\t\twhile (true) {\n\t\t\tif (self) {\n\t\t\t\t++depth;\n\t\t\t\tself = self.parent;\n\n\t\t\t} else {\n\t\t\t\treturn depth;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirtySize(): void {\n\t\tthis._sizeDirty = true;\n\t\tthis.markDirty();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirtyBounds(): void {\n\t\tconst display = this._display;\n\t\tif (this.get(\"isMeasured\")) {\n\t\t\tthis._root._addDirtyBounds(this);\n\t\t\tdisplay.isMeasured = true;\n\t\t\tdisplay.invalidateBounds();\n\n\t\t\tconst parent = this.parent;\n\n\t\t\tif (parent && this.get(\"position\") != \"absolute\") {\n\t\t\t\tif (parent.get(\"width\") == null || parent.get(\"height\") == null || parent.get(\"layout\")) {\n\t\t\t\t\tparent.markDirtyBounds();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.get(\"focusable\") && this.isFocus()) {\n\t\t\t\tthis.markDirtyAccessibility();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirtyAccessibility(): void {\n\t\t//if (this._root.focused(this)) {\n\t\tthis._root._invalidateAccessibility(this);\n\t\t//}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirtyLayer() {\n\t\t//this._display.markDirtyLayer(this.isDirty(\"opacity\") || this.isDirty(\"visible\")); https://codepen.io/team/amcharts/pen/gOWZPmP <- problems\n\t\tthis._display.markDirtyLayer(true);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirty() {\n\t\tsuper.markDirty();\n\t\tthis.markDirtyLayer();\n\t}\n\n\tpublic _updateBounds() {\n\t\tconst oldBounds = this._adjustedLocalBounds;\n\n\t\tlet newBounds: IBounds;\n\n\t\t// if display.visible == false, it still returns bounds\n\t\tif (!this.get(\"visible\") || !this.getPrivate(\"visible\") || this.get(\"forceHidden\")) {\n\t\t\tnewBounds = {\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t};\n\t\t\tthis._localBounds = newBounds;\n\t\t\tthis._adjustedLocalBounds = newBounds;\n\t\t}\n\t\telse {\n\t\t\tthis._getBounds();\n\t\t\tthis._fixMinBounds(this._localBounds);\n\t\t\tthis.updatePivotPoint();\n\t\t\tthis._adjustedLocalBounds = this._display.getAdjustedBounds(this._localBounds);\n\t\t\tnewBounds = this._adjustedLocalBounds!;\n\t\t}\n\n\t\tif (!oldBounds || (oldBounds.left !== newBounds.left || oldBounds.top !== newBounds.top || oldBounds.right !== newBounds.right || oldBounds.bottom !== newBounds.bottom)) {\n\t\t\tconst eventType = \"boundschanged\";\n\t\t\tif (this.events.isEnabled(eventType)) {\n\t\t\t\tthis.events.dispatch(eventType, { type: eventType, target: this });\n\t\t\t}\n\t\t\tif (this.parent) {\n\t\t\t\tthis.parent.markDirty();\n\t\t\t\tthis.parent.markDirtyBounds();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _fixMinBounds(bounds: IBounds) {\n\t\tlet minWidth = this.get(\"minWidth\");\n\t\tlet minHeight = this.get(\"minHeight\");\n\n\t\tif ($type.isNumber(minWidth)) {\n\t\t\tif (bounds.right - bounds.left < minWidth) {\n\t\t\t\tbounds.right = bounds.left + minWidth;\n\t\t\t}\n\t\t}\n\n\t\tif ($type.isNumber(minHeight)) {\n\t\t\tif (bounds.bottom - bounds.top < minHeight) {\n\t\t\t\tbounds.bottom = bounds.top + minHeight;\n\t\t\t}\n\t\t}\n\n\t\tlet privateWidth = this.getPrivate(\"width\");\n\t\tlet privateHeight = this.getPrivate(\"height\");\n\n\t\tif ($type.isNumber(privateWidth)) {\n\t\t\tbounds.right = bounds.left + privateWidth;\n\t\t}\n\n\t\tif ($type.isNumber(privateHeight)) {\n\t\t\tbounds.bottom = bounds.top + privateHeight;\n\t\t}\n\t}\n\n\tprotected _removeParent(parent: Container | undefined) {\n\t\tif (parent) {\n\t\t\tparent.children.removeValue(this);\n\t\t\t$array.removeFirst(parent._percentageSizeChildren, this);\n\t\t\t$array.removeFirst(parent._percentagePositionChildren, this);\n\t\t}\n\t}\n\n\tpublic _clearDirty() {\n\t\tsuper._clearDirty();\n\t\tthis._sizeDirty = false;\n\t\tthis._statesHandled = false;\n\t}\n\n\t/**\n\t * Simulate hover over element.\n\t */\n\tpublic hover() {\n\t\tthis.showTooltip();\n\t\tthis._handleOver();\n\t}\n\n\t/**\n\t * Simulate unhover over element.\n\t */\n\tpublic unhover(): void {\n\t\tthis.hideTooltip();\n\t\tthis._handleOut();\n\t}\n\n\t/**\n\t * Shows element's [[Tooltip]].\n\t */\n\tpublic showTooltip(point?: IPoint): Promise | undefined {\n\t\tconst tooltip = this.getTooltip();\n\t\tconst tooltipText = this.get(\"tooltipText\");\n\n\t\tif (tooltipText && tooltip) {\n\t\t\tconst tooltipPosition = this.get(\"tooltipPosition\");\n\t\t\tconst tooltipTarget = this.getPrivate(\"tooltipTarget\", this);\n\n\t\t\tif (tooltipPosition == \"fixed\" || !point) {\n\t\t\t\tthis._display._setMatrix();\n\t\t\t\tpoint = this.toGlobal(tooltipTarget._getTooltipPoint());\n\t\t\t}\n\n\t\t\ttooltip.set(\"pointTo\", point);\n\t\t\ttooltip.set(\"tooltipTarget\", tooltipTarget);\n\n\t\t\tif (!tooltip.get(\"x\")) {\n\t\t\t\ttooltip.set(\"x\", point.x);\n\t\t\t}\n\t\t\tif (!tooltip.get(\"y\")) {\n\t\t\t\ttooltip.set(\"y\", point.y);\n\t\t\t}\n\n\t\t\ttooltip.label.set(\"text\", tooltipText);\n\t\t\tconst dataItem = this.dataItem;\n\t\t\tif (dataItem) {\n\t\t\t\ttooltip.label._setDataItem(dataItem);\n\t\t\t}\n\n\t\t\tif (this.get(\"showTooltipOn\") == \"always\" && (point.x < 0 || point.x > this._root.width() || point.y < 0 || point.y > this._root.height())) {\n\t\t\t\tthis.hideTooltip();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttooltip.label.text.markDirtyText();\n\t\t\tconst promise = tooltip.show();\n\t\t\tthis.setPrivateRaw(\"showingTooltip\", true);\n\t\t\treturn promise;\n\t\t}\n\t}\n\n\t/**\n\t * Hides element's [[Tooltip]].\n\t */\n\tpublic hideTooltip(): Promise | undefined {\n\t\tconst tooltip = this.getTooltip();\n\t\tif (tooltip) {\n\t\t\tconst promise = tooltip.hide();\n\t\t\tthis.setPrivateRaw(\"showingTooltip\", false);\n\t\t\treturn promise;\n\t\t}\n\t}\n\n\tpublic _getTooltipPoint(): IPoint {\n\t\tconst bounds = this._localBounds!;\n\n\t\tif (bounds) {\n\t\t\tlet x = 0;\n\t\t\tlet y = 0;\n\n\t\t\tif (!this.get(\"isMeasured\")) {\n\t\t\t\tx = $utils.relativeToValue(this.get(\"tooltipX\", 0), this.width());\n\t\t\t\ty = $utils.relativeToValue(this.get(\"tooltipY\", 0), this.height());\n\t\t\t}\n\t\t\telse {\n\t\t\t\tx = bounds.left + $utils.relativeToValue(this.get(\"tooltipX\", 0), bounds.right - bounds.left);\n\t\t\t\ty = bounds.top + $utils.relativeToValue(this.get(\"tooltipY\", 0), bounds.bottom - bounds.top);\n\t\t\t}\n\n\t\t\treturn { x, y };\n\t\t}\n\t\treturn { x: 0, y: 0 };\n\t}\n\n\t/**\n\t * Returns [[Tooltip]] used for this element.\n\t *\n\t * @return Tooltip\n\t */\n\tpublic getTooltip(): Tooltip | undefined {\n\t\tlet tooltip = this.get(\"tooltip\");\n\t\tif (!tooltip) {\n\t\t\tlet parent = this.parent;\n\t\t\tif (parent) {\n\t\t\t\treturn parent.getTooltip();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\treturn tooltip;\n\t\t}\n\t}\n\n\tpublic _updatePosition() {\n\n\t\tconst parent = this.parent;\n\n\t\tlet dx = this.get(\"dx\", 0);\n\t\tlet dy = this.get(\"dy\", 0);\n\n\t\tlet x = this.get(\"x\");\n\t\tlet _x = this.getPrivate(\"x\");\n\n\t\tlet xx = 0;\n\t\tlet yy = 0;\n\n\t\tconst position = this.get(\"position\");\n\n\t\tif (x instanceof Percent) {\n\t\t\tif (parent) {\n\t\t\t\tx = parent.innerWidth() * x.value + parent.get(\"paddingLeft\", 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tx = 0;\n\t\t\t}\n\t\t}\n\t\tif ($type.isNumber(x)) {\n\t\t\txx = x + dx;\n\t\t}\n\t\telse {\n\t\t\tif (_x != null) {\n\t\t\t\txx = _x;\n\t\t\t}\n\t\t\telse if (parent) {\n\t\t\t\tif (position == \"relative\") {\n\t\t\t\t\txx = parent.get(\"paddingLeft\", 0) + dx;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tlet y = this.get(\"y\");\n\t\tlet _y = this.getPrivate(\"y\");\n\n\t\tif (y instanceof Percent) {\n\t\t\tif (parent) {\n\t\t\t\ty = parent.innerHeight() * y.value + parent.get(\"paddingTop\", 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ty = 0;\n\t\t\t}\n\t\t}\n\t\tif ($type.isNumber(y)) {\n\t\t\tyy = y + dy;\n\t\t}\n\t\telse {\n\t\t\tif (_y != null) {\n\t\t\t\tyy = _y;\n\t\t\t}\n\t\t\telse if (parent) {\n\t\t\t\tif (position == \"relative\") {\n\t\t\t\t\tyy = parent.get(\"paddingTop\", 0) + dy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst display = this._display;\n\n\t\tif (display.x != xx || display.y != yy) {\n\t\t\tdisplay.invalidateBounds();\n\t\t\tdisplay.x = xx;\n\t\t\tdisplay.y = yy;\n\n\t\t\tconst eventType = \"positionchanged\";\n\t\t\tif (this.events.isEnabled(eventType)) {\n\t\t\t\tthis.events.dispatch(eventType, { type: eventType, target: this });\n\t\t\t}\n\t\t}\n\n\t\t// Update tooltip position together with the Sprite\n\t\tif (this.getPrivate(\"showingTooltip\")) {\n\t\t\tthis.showTooltip();\n\t\t}\n\t}\n\n\t/**\n\t * Returns element's actual X position in pixels.\n\t *\n\t * @return X (px)\n\t */\n\tpublic x(): number {\n\t\tlet x = this.get(\"x\");\n\t\tlet _x = this.getPrivate(\"x\");\n\n\t\tconst parent = this.parent;\n\t\tif (parent) {\n\t\t\tif (x instanceof Percent) {\n\t\t\t\treturn $utils.relativeToValue(x, parent.innerWidth()) + parent.get(\"paddingLeft\", 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!$type.isNumber(x)) {\n\t\t\t\t\tif (_x != null) {\n\t\t\t\t\t\treturn _x;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn parent.get(\"paddingLeft\", this._display.x)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn x;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this._display.x;\n\t}\n\n\t/**\n\t * Returns element's actual Y position in pixels.\n\t *\n\t * @return Y (px)\n\t */\n\tpublic y(): number {\n\n\t\tlet _y = this.getPrivate(\"y\");\n\n\t\tif (_y != null) {\n\t\t\treturn _y;\n\t\t}\n\n\t\tlet y = this.get(\"y\");\n\t\tconst parent = this.parent;\n\n\t\tif (parent) {\n\t\t\tif (y instanceof Percent) {\n\t\t\t\treturn $utils.relativeToValue(y, parent.innerHeight()) + parent.get(\"paddingTop\", 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!$type.isNumber(y)) {\n\t\t\t\t\tif (_y != null) {\n\t\t\t\t\t\treturn _y;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn parent.get(\"paddingTop\", this._display.y)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this._display.y;\n\t}\n\n\tprotected _dispose() {\n\t\tsuper._dispose();\n\t\tthis._display.dispose();\n\t\tthis._removeTemplateField();\n\t\tthis._removeParent(this.parent);\n\n\t\tconst focusElement = this.getPrivate(\"focusElement\");\n\t\tif (focusElement) {\n\t\t\t$array.each(focusElement.disposers, (x) => {\n\t\t\t\tx.dispose();\n\t\t\t});\n\t\t}\n\n\t\tconst tooltip = this.get(\"tooltip\");\n\t\tif (tooltip) {\n\t\t\ttooltip.dispose();\n\t\t}\n\n\t\tthis.markDirty();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic adjustedLocalBounds(): IBounds {\n\t\tthis._fixMinBounds(this._adjustedLocalBounds);\n\t\treturn this._adjustedLocalBounds;\n\t}\n\n\t/**\n\t * Returns local coordinates of the element's bounds.\n\t *\n\t * @ignore\n\t * @return Global bounds\n\t */\n\tpublic localBounds(): IBounds {\n\t\treturn this._localBounds;\n\t}\n\n\t/**\n\t * Returns adjusted local coordinates of the element's bounds.\n\t *\n\t * @ignore\n\t * @return Global bounds\n\t */\n\tpublic bounds(): IBounds {\n\t\tconst bounds = this._adjustedLocalBounds;\n\t\tconst x = this.x();\n\t\tconst y = this.y();\n\t\treturn { left: bounds.left + x, right: bounds.right + x, top: bounds.top + y, bottom: bounds.bottom + y };\n\t}\n\n\t/**\n\t * Returns global coordinates of the element's bounds.\n\t *\n\t * @ignore\n\t * @return Global bounds\n\t */\n\tpublic globalBounds(): IBounds {\n\t\tconst bounds = this.localBounds();\n\n\t\tconst p0 = this.toGlobal({ x: bounds.left, y: bounds.top });\n\t\tconst p1 = this.toGlobal({ x: bounds.right, y: bounds.top });\n\t\tconst p2 = this.toGlobal({ x: bounds.right, y: bounds.bottom });\n\t\tconst p3 = this.toGlobal({ x: bounds.left, y: bounds.bottom });\n\n\t\treturn {\n\t\t\tleft: Math.min(p0.x, p1.x, p2.x, p3.x),\n\t\t\ttop: Math.min(p0.y, p1.y, p2.y, p3.y),\n\t\t\tright: Math.max(p0.x, p1.x, p2.x, p3.x),\n\t\t\tbottom: Math.max(p0.y, p1.y, p2.y, p3.y)\n\t\t}\n\t}\n\n\tprotected _onShow(_duration?: number) {\n\n\t}\n\n\tprotected _onHide(_duration?: number) {\n\n\t}\n\n\t/**\n\t * Plays initial reveal animation regardless if element is currently hidden\n\t * or visible.\n\t *\n\t * @param duration Duration of the animation in milliseconds\n\t * @param delay Delay showing of the element by X milliseconds\n\t * @return Promise\n\t */\n\tpublic async appear(duration?: number, delay?: number): Promise {\n\t\tawait this.hide(0);\n\t\tif (delay) {\n\t\t\treturn new Promise((success, _error) => {\n\t\t\t\tthis.setTimeout(() => {\n\t\t\t\t\tsuccess(this.show(duration));\n\t\t\t\t}, delay);\n\t\t\t});\n\n\t\t}\n\t\telse {\n\t\t\treturn this.show(duration);\n\t\t}\n\t}\n\n\t/**\n\t * Shows currently hidden element and returns a `Promise` which completes\n\t * when all showing animations are finished.\n\t *\n\t * ```TypeScript\n\t * series.show().then(function(ev) {\n\t * console.log(\"Series is now fully visible\");\n\t * })\n\t * ```\n\t * ```JavaScript\n\t * series.show().then(function(ev) {\n\t * console.log(\"Series is now fully visible\");\n\t * })\n\t * ```\n\t *\n\t * @return Promise\n\t */\n\tpublic async show(duration?: number): Promise {\n\t\tif (!this._isShowing) {\n\t\t\tthis._isHidden = false;\n\t\t\tthis._isShowing = true;\n\t\t\tthis._isHiding = false;\n\n\t\t\tif (this.states.lookup(\"default\")!.get(\"visible\")) {\n\t\t\t\tthis.set(\"visible\", true);\n\t\t\t}\n\t\t\tthis._onShow(duration);\n\n\t\t\tconst animations = this.states.applyAnimate(\"default\", duration);\n\t\t\tawait waitForAnimations(animations);\n\n\t\t\tthis._isShowing = false;\n\t\t}\n\t}\n\n\t/**\n\t * Hides the element and returns a `Promise` which completes when all hiding\n\t * animations are finished.\n\t *\n\t * ```TypeScript\n\t * series.hide().then(function(ev) {\n\t * console.log(\"Series finished hiding\");\n\t * })\n\t * ```\n\t * ```JavaScript\n\t * series.hide().then(function(ev) {\n\t * console.log(\"Series finished hiding\");\n\t * })\n\t * ```\n\t *\n\t * @return Promise\n\t */\n\tpublic async hide(duration?: number): Promise {\n\t\tif (!this._isHiding && !this._isHidden) {\n\t\t\tthis._isHiding = true;\n\t\t\tthis._isShowing = false;\n\t\t\tlet state = this.states.lookup(\"hidden\");\n\t\t\tif (!state) {\n\t\t\t\tstate = this.states.create(\"hidden\", {\n\t\t\t\t\t\"opacity\": 0,\n\t\t\t\t\t\"visible\": false\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis._isHidden = true;\n\t\t\tthis._onHide(duration);\n\n\t\t\tconst animations = this.states.applyAnimate(\"hidden\", duration);\n\n\t\t\tawait waitForAnimations(animations);\n\n\t\t\tthis._isHiding = false;\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if this element is currently hidden.\n\t *\n\t * @return Is hidden?\n\t */\n\tpublic isHidden(): boolean {\n\t\treturn this._isHidden;\n\t}\n\n\t/**\n\t * Returns `true` if this element is currently animating to a default state.\n\t *\n\t * @return Is showing?\n\t */\n\tpublic isShowing(): boolean {\n\t\treturn this._isShowing;\n\t}\n\n\t/**\n\t * Returns `true` if this element is currently animating to a hidden state.\n\t *\n\t * @return Is hiding?\n\t */\n\tpublic isHiding(): boolean {\n\t\treturn this._isHiding;\n\t}\n\n\t/**\n\t * Returns `true` if this element is currently hovered by a pointer.\n\t *\n\t * @return Is hovered?\n\t */\n\tpublic isHover(): boolean {\n\t\treturn this._display.hovering();\n\t}\n\n\t/**\n\t * Returns `true` if this element does currently have focus.\n\t *\n\t * @return Is focused?\n\t */\n\tpublic isFocus(): boolean {\n\t\treturn this._root.focused(this);\n\t}\n\n\t/**\n\t * Returns `true` if this element is currently being dragged.\n\t *\n\t * @return Is dragged?\n\t */\n\tpublic isDragging(): boolean {\n\t\treturn this._isDragging;\n\t}\n\n\t/**\n\t * Returns width of this element in pixels.\n\t *\n\t * @return Width (px)\n\t */\n\tpublic width(): number {\n\t\tlet width = this.get(\"width\");\n\t\tlet maxWidth = this.get(\"maxWidth\");\n\t\tlet minWidth = this.get(\"minWidth\");\n\t\tlet privateWidth = this.getPrivate(\"width\");\n\t\tlet w = 0;\n\n\t\tif ($type.isNumber(privateWidth)) {\n\t\t\tw = privateWidth;\n\t\t}\n\t\telse {\n\t\t\tif (width == null) {\n\t\t\t\tif (this._adjustedLocalBounds) {\n\t\t\t\t\tw = this._adjustedLocalBounds.right - this._adjustedLocalBounds.left;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (width instanceof Percent) {\n\t\t\t\t\tconst parent = this.parent;\n\t\t\t\t\tif (parent) {\n\t\t\t\t\t\tw = parent.innerWidth() * width.value;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tw = this._root.width() * width.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ($type.isNumber(width)) {\n\t\t\t\t\tw = width;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ($type.isNumber(minWidth)) {\n\t\t\tw = Math.max(minWidth, w);\n\t\t}\n\t\tif ($type.isNumber(maxWidth)) {\n\t\t\tw = Math.min(maxWidth, w);\n\t\t}\n\n\t\treturn w;\n\t}\n\n\t/**\n\t * Returns maximum allowed width of this element in pixels.\n\t *\n\t * @return Maximum width (px)\n\t */\n\tpublic maxWidth(): number {\n\t\tlet maxWidth = this.get(\"maxWidth\");\n\t\tif ($type.isNumber(maxWidth)) {\n\t\t\treturn maxWidth;\n\t\t}\n\t\telse {\n\t\t\tlet width = this.get(\"width\")\n\t\t\tif ($type.isNumber(width)) {\n\t\t\t\treturn width;\n\t\t\t}\n\t\t}\n\t\tconst parent = this.parent;\n\t\tif (parent) {\n\t\t\treturn parent.innerWidth();\n\t\t}\n\t\treturn this._root.width();\n\t}\n\n\t/**\n\t * Returns maximum allowed height of this element in pixels.\n\t *\n\t * @return Maximum height (px)\n\t */\n\tpublic maxHeight(): number {\n\t\tlet maxHeight = this.get(\"maxHeight\");\n\t\tif ($type.isNumber(maxHeight)) {\n\t\t\treturn maxHeight;\n\t\t}\n\t\telse {\n\t\t\tlet height = this.get(\"height\")\n\t\t\tif ($type.isNumber(height)) {\n\t\t\t\treturn height;\n\t\t\t}\n\t\t}\n\t\tconst parent = this.parent;\n\t\tif (parent) {\n\t\t\treturn parent.innerHeight();\n\t\t}\n\t\treturn this._root.height();\n\t}\n\n\t/**\n\t * Returns height of this element in pixels.\n\t *\n\t * @return Height (px)\n\t */\n\tpublic height(): number {\n\t\tlet height = this.get(\"height\");\n\t\tlet maxHeight = this.get(\"maxHeight\");\n\t\tlet minHeight = this.get(\"minHeight\");\n\t\tlet privateHeight = this.getPrivate(\"height\");\n\t\tlet h = 0;\n\n\t\tif ($type.isNumber(privateHeight)) {\n\t\t\th = privateHeight;\n\t\t}\n\t\telse {\n\t\t\tif (height == null) {\n\t\t\t\tif (this._adjustedLocalBounds) {\n\t\t\t\t\th = this._adjustedLocalBounds.bottom - this._adjustedLocalBounds.top;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (height instanceof Percent) {\n\t\t\t\t\tconst parent = this.parent;\n\t\t\t\t\tif (parent) {\n\t\t\t\t\t\th = parent.innerHeight() * height.value;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\th = this._root.height() * height.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ($type.isNumber(height)) {\n\t\t\t\t\th = height;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ($type.isNumber(minHeight)) {\n\t\t\th = Math.max(minHeight, h);\n\t\t}\n\t\tif ($type.isNumber(maxHeight)) {\n\t\t\th = Math.min(maxHeight, h);\n\t\t}\n\n\t\treturn h;\n\t}\n\n\tprotected _findStaticTemplate(f: (template: Template) => boolean): Template | undefined {\n\t\t// templateField overrides template\n\t\tif (this._templateField && f(this._templateField)) {\n\t\t\treturn this._templateField;\n\t\t}\n\n\t\treturn super._findStaticTemplate(f);\n\t}\n\n\tprotected _walkParents(f: (parent: Sprite) => void): void {\n\t\tif (this._parent) {\n\t\t\tthis._walkParent(f);\n\t\t}\n\t}\n\n\tprotected _walkParent(f: (parent: Sprite) => void): void {\n\t\tif (this._parent) {\n\t\t\tthis._parent._walkParent(f);\n\t\t}\n\n\t\tf(this);\n\t}\n\n\t/**\n\t * Parent [[Container]] of this element.\n\t *\n\t * @return Parent container\n\t */\n\tpublic get parent(): Container | undefined {\n\t\treturn this._parent;\n\t}\n\n\tpublic _setParent(parent: Container, updateChildren: boolean = false) {\n\t\tconst prevParent = this._parent;\n\t\tif (parent !== prevParent) {\n\t\t\tthis.markDirtyBounds();\n\n\t\t\tparent.markDirty();\n\n\t\t\tthis._parent = parent;\n\n\t\t\tif (updateChildren) {\n\t\t\t\tthis._removeParent(prevParent);\n\n\t\t\t\tif (parent) {\n\t\t\t\t\tthis._addPercentageSizeChildren();\n\t\t\t\t\tthis._addPercentagePositionChildren();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.markDirtyPosition();\n\t\t\tthis._applyThemes();\n\t\t}\n\t}\n\n\t/**\n\t * Returns an instance of [[NumberFormatter]] used in this element.\n\t *\n\t * If this element does not have it set, global one form [[Root]] is used.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/using-formatters/} for more info\n\t * @return NumberFormatter instace\n\t */\n\tpublic getNumberFormatter(): NumberFormatter {\n\t\treturn this.get(\"numberFormatter\", this._root.numberFormatter);\n\t}\n\n\t/**\n\t * Returns an instance of [[DateFormatter]] used in this element.\n\t *\n\t * If this element does not have it set, global one form [[Root]] is used.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/using-formatters/} for more info\n\t * @return DateFormatter instace\n\t */\n\tpublic getDateFormatter(): DateFormatter {\n\t\treturn this.get(\"dateFormatter\", this._root.dateFormatter);\n\t}\n\n\t/**\n\t * Returns an instance of [[DurationFormatter]] used in this element.\n\t *\n\t * If this element does not have it set, global one form [[Root]] is used.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/using-formatters/} for more info\n\t * @return DurationFormatter instace\n\t */\n\tpublic getDurationFormatter(): DurationFormatter {\n\t\treturn this.get(\"durationFormatter\", this._root.durationFormatter);\n\t}\n\n\t/**\n\t * Converts X/Y coordinate within this element to a global coordinate.\n\t *\n\t * @param point Local coordinate\n\t * @return Global coordinate\n\t */\n\tpublic toGlobal(point: IPoint): IPoint {\n\t\treturn this._display.toGlobal(point);\n\t}\n\n\t/**\n\t * Converts global X/Y coordinate to a coordinate within this element.\n\t *\n\t * @param point Global coordinate\n\t * @return Local coordinate\n\t */\n\tpublic toLocal(point: IPoint): IPoint {\n\t\treturn this._display.toLocal(point);\n\t}\n\n\tpublic _getDownPoint(): IPoint | undefined {\n\t\tconst id = this._getDownPointId();\n\t\tif (id) {\n\t\t\treturn this._downPoints[id];\n\t\t}\n\n\t}\n\n\tpublic _getDownPointId(): number | undefined {\n\t\tif (this._downPoints) {\n\t\t\treturn $object.keysOrdered(this._downPoints, (a, b) => {\n\t\t\t\tif (a > b) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\tif (a < b) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t})[0];\n\t\t}\n\t}\n\n\t/**\n\t * Moves sprite to the end of the parent's children array.\n\t *\n\t * Depending on `layout` setting of the parten container, it may effect the\n\t * positioning or overlapping order of the elements.\n\t */\n\tpublic toFront() {\n\t\tconst parent = this.parent;\n\t\tif (parent) {\n\t\t\tparent.children.moveValue(this, parent.children.length - 1);\n\t\t}\n\t}\n\n\t/**\n\t * Moves sprite to the beginning of the parent's children array.\n\t *\n\t * Depending on `layout` setting of the parten container, it may effect the\n\t * positioning or overlapping order of the elements.\n\t */\n\tpublic toBack() {\n\t\tconst parent = this.parent;\n\t\tif (parent) {\n\t\t\tparent.children.moveValue(this, 0);\n\t\t}\n\t}\n\n}\n","import type { Color } from \"../util/Color\";\nimport type { Percent } from \"../util/Percent\";\nimport type { IText } from \"./backend/Renderer\";\nimport type { IBounds } from \"../util/IBounds\";\nimport type { DataItem, IComponentDataItem } from \"./Component\";\n\nimport { Sprite, ISpriteSettings, ISpritePrivate } from \"./Sprite\";\nimport { populateString } from \"../util/PopulateString\";\n\nimport * as $array from \"../util/Array\";\n\n/**\n * @ignore Text is an internal class. Use Label instead.\n */\nexport interface ITextSettings extends ISpriteSettings {\n\ttext?: string;\n\tfill?: Color;\n\ttextAlign?: \"start\" | \"end\" | \"left\" | \"right\" | \"center\";\n\tfontFamily?: string;\n\tfontSize?: string | number;\n\tfontWeight?: \"normal\" | \"bold\" | \"bolder\" | \"lighter\" | \"100\" | \"200\" | \"300\" | \"400\" | \"500\" | \"600\" | \"700\" | \"800\" | \"900\"\n\tfontStyle?: \"normal\" | \"italic\" | \"oblique\";\n\tfontVariant?: \"normal\" | \"small-caps\";\n\ttextDecoration?: \"underline\";\n\tshadowColor?: Color | null;\n\tshadowBlur?: number;\n\tshadowOffsetX?: number;\n\tshadowOffsetY?: number;\n\tshadowOpacity?: number;\n\t// leading?: number;\n\t// letterSpacing?: number;\n\tlineHeight?: Percent | number;\n\tbaselineRatio?: number;\n\t// stroke?: number;\n\t// strokeThickness?: number;\n\t// trim?: number;\n\t// wordWrap?: boolean;\n\topacity?: number;\n\tdirection?: \"ltr\" | \"rtl\";\n\ttextBaseline?: \"top\" | \"hanging\" | \"middle\" | \"alphabetic\" | \"ideographic\" | \"bottom\";\n\toversizedBehavior?: \"none\" | \"hide\" | \"fit\" | \"wrap\" | \"truncate\";\n\tbreakWords?: boolean;\n\tellipsis?: string;\n\tminScale?: number;\n\tpopulateText?: boolean;\n\tignoreFormatting?: boolean;\n}\n\n/**\n * @ignore\n */\nexport interface ITextPrivate extends ISpritePrivate {\n\n\t/**\n\t * @ignore\n\t */\n\ttooltipElement?: HTMLDivElement;\n\n}\n\n/**\n * @ignore Text is an internal class. Use Label instead.\n */\nexport class Text extends Sprite {\n\n\tdeclare public _settings: ITextSettings;\n\tdeclare public _privateSettings: ITextPrivate;\n\n\tpublic textStyle = this._root._renderer.makeTextStyle();\n\n\tpublic _display: IText = this._root._renderer.makeText(\"\", this.textStyle);\n\n\tprotected _textStyles: Array = [\n\t\t\"textAlign\",\n\t\t\"fontFamily\",\n\t\t\"fontSize\",\n\t\t\"fontStyle\",\n\t\t\"fontWeight\",\n\t\t\"fontStyle\",\n\t\t\"fontVariant\",\n\t\t\"textDecoration\",\n\t\t\"shadowColor\",\n\t\t\"shadowBlur\",\n\t\t\"shadowOffsetX\",\n\t\t\"shadowOffsetY\",\n\t\t\"shadowOpacity\",\n\t\t// \"leading\",\n\t\t// \"letterSpacing\",\n\t\t\"lineHeight\",\n\t\t\"baselineRatio\",\n\t\t//\"padding\",\n\t\t// \"stroke\",\n\t\t// \"strokeThickness\",\n\t\t// \"trim\",\n\t\t// \"wordWrap\",\n\t\t\"direction\",\n\t\t\"textBaseline\",\n\t\t\"oversizedBehavior\",\n\t\t\"breakWords\",\n\t\t\"ellipsis\",\n\t\t\"minScale\"\n\t];\n\n\tprotected _originalScale: number | undefined;\n\n\tpublic static className: string = \"Text\";\n\tpublic static classNames: Array = Sprite.classNames.concat([Text.className]);\n\n\tpublic _updateBounds(): void {\n\t\tif (!this.get(\"text\")) {\n\n\t\t\tlet newBounds: IBounds = {\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0,\n\t\t\t};\n\t\t\tthis._adjustedLocalBounds = newBounds;\n\t\t}\n\t\telse {\n\t\t\tsuper._updateBounds();\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tthis._display.clear();\n\n\t\tlet textStyle = this.textStyle;\n\n\t\tif (this.isDirty(\"opacity\")) {\n\t\t\tlet opacity = this.get(\"opacity\", 1);\n\t\t\tthis._display.alpha = opacity;\n\t\t}\n\n\t\tif (this.isDirty(\"text\") || this.isDirty(\"populateText\")) {\n\t\t\tthis._display.text = this._getText();\n\n\t\t\tthis.markDirtyBounds();\n\t\t\tif (this.get(\"role\") == \"tooltip\") {\n\t\t\t\tthis._root.updateTooltip(this);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"width\")) {\n\t\t\ttextStyle.wordWrapWidth = this.width();\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"oversizedBehavior\")) {\n\t\t\ttextStyle.oversizedBehavior = this.get(\"oversizedBehavior\", \"none\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"breakWords\")) {\n\t\t\ttextStyle.breakWords = this.get(\"breakWords\", false);\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"ellipsis\")) {\n\t\t\ttextStyle.ellipsis = this.get(\"ellipsis\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"ignoreFormatting\")) {\n\t\t\ttextStyle.ignoreFormatting = this.get(\"ignoreFormatting\", false);\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"minScale\")) {\n\t\t\ttextStyle.minScale = this.get(\"minScale\", 0);\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"fill\")) {\n\t\t\tlet fill = this.get(\"fill\");\n\t\t\tif (fill) {\n\t\t\t\ttextStyle.fill = fill;\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"maxWidth\")) {\n\t\t\ttextStyle.maxWidth = this.get(\"maxWidth\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\tif (this.isDirty(\"maxHeight\")) {\n\t\t\ttextStyle.maxHeight = this.get(\"maxHeight\");\n\t\t\tthis.markDirtyBounds();\n\t\t}\n\n\t\t$array.each(this._textStyles, (styleName) => {\n\t\t\tif (this._dirty[styleName]) {\n\t\t\t\ttextStyle[styleName] = this.get(styleName);\n\t\t\t\tthis.markDirtyBounds();\n\t\t\t}\n\t\t})\n\n\t\ttextStyle[\"fontSize\"] = this.get(\"fontSize\");\n\t\ttextStyle[\"fontFamily\"] = this.get(\"fontFamily\");\n\t\tthis._display.style = textStyle;\n\n\t\tif (this.isDirty(\"role\") && this.get(\"role\") == \"tooltip\") {\n\t\t\tthis._root.updateTooltip(this);\n\t\t}\n\t}\n\n\tpublic _getText(): string {\n\t\tconst text = this.get(\"text\", \"\");\n\t\treturn this.get(\"populateText\") ? populateString(this, text) : text;\n\t}\n\n\tpublic markDirtyText(): void {\n\t\tthis._display.text = this._getText();\n\t\tif (this.get(\"role\") == \"tooltip\") {\n\t\t\tthis._root.updateTooltip(this);\n\t\t}\n\t\tthis.markDirtyBounds();\n\t\tthis.markDirty();\n\t}\n\n\tpublic _setDataItem(dataItem?: DataItem): void {\n\t\tsuper._setDataItem(dataItem);\n\t\tif (this.get(\"populateText\")) {\n\t\t\tthis.markDirtyText();\n\t\t}\n\t}\n}\n","import { Line, ILineSettings, ILinePrivate } from \"./Line\";\n\n\nexport interface ITickSettings extends ILineSettings {\n\n\t/**\n\t * Length in pixels.\n\t */\n\tlength?: number;\n\n\t/**\n\t * Location within target space. 0 - beginning, 1 - end.\n\t */\n\tlocation?: number;\n\n}\n\nexport interface ITickPrivate extends ILinePrivate {\n}\n\n/**\n * Draws a tick element (mostly used on axes).\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\n */\nexport class Tick extends Line {\n\n\tdeclare public _settings: ITickSettings;\n\tdeclare public _privateSettings: ITickPrivate;\n\n\tpublic static className: string = \"Tick\";\n\tpublic static classNames: Array = Line.classNames.concat([Tick.className]);\n}\n","import type { IBounds } from \"../util/IBounds\";\nimport type { IPoint } from \"../util/IPoint\";\nimport type { Pattern } from \"../render/patterns/Pattern\";\nimport type { Time } from \"../util/Animation\";\nimport type { Sprite } from \"../render/Sprite\";\nimport type { MultiDisposer, IDisposer } from \"../util/Disposer\";\n\nimport { Label } from \"../render/Label\";\nimport { PointedRectangle } from \"../render/PointedRectangle\";\nimport { Container, IContainerPrivate, IContainerSettings } from \"./Container\";\nimport { Percent } from \"../util/Percent\";\nimport { Color } from \"../util/Color\";\n\nimport * as $math from \"../util/Math\";\nimport * as $array from \"../util/Array\";\nimport * as $utils from \"../util/Utils\";\n//import * as $utils from \"../util/Utils\";\nimport type { DataItem, IComponentDataItem } from \"./Component\";\n\n\nexport interface ITooltipSettings extends IContainerSettings {\n\n\t/**\n\t * Text to use for tooltip's label.\n\t */\n\tlabelText?: string\n\n\t/**\n\t * A direction of the tooltip pointer.\n\t *\n\t * https://www.amcharts.com/docs/v5/concepts/common-elements/tooltips/#Orientation\n\t */\n\tpointerOrientation?: \"left\" | \"right\" | \"up\" | \"down\" | \"vertical\" | \"horizontal\";\n\n\t/**\n\t * If set to `true` will use the same `fill` color for its background as\n\t * its `tooltipTarget`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/tooltips/#Colors} for more info\n\t * @defaul false\n\t */\n\tgetFillFromSprite?: boolean;\n\n\t/**\n\t * If set to `true` will use the same `fill` color as its `tooltipTarget`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/tooltips/#Colors} for more info\n\t * @defaul false\n\t */\n\tgetLabelFillFromSprite?: boolean;\n\n\t/**\n\t * If set to `true` will use the same `stroke` color as its `tooltipTarget`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/tooltips/#Colors} for more info\n\t * @default false\n\t */\n\tgetStrokeFromSprite?: boolean;\n\n\t/**\n\t * Scree bounds to constring tooltip within.\n\t */\n\tbounds?: IBounds;\n\n\t/**\n\t * If set to `true` tooltip will adjust its text color for better visibility\n\t * on its background.\n\t *\n\t * @default true\n\t */\n\tautoTextColor?: boolean;\n\n\t/**\n\t * Screen coordinates the tooltip show point to.\n\t */\n\tpointTo?: IPoint;\n\n\t/**\n\t * Duration in milliseconds for tooltip position change, e.g. when tooltip\n\t * is jumping from one target to another.\n\t */\n\tanimationDuration?: number;\n\n\t/**\n\t * Easing function for tooltip animation.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Easing_functions} for more info\n\t */\n\tanimationEasing?: (t: Time) => Time;\n\n\t/**\n\t * A target element tooltip is shown fow.\n\t */\n\ttooltipTarget?: Sprite;\n\n}\n\nexport interface ITooltipPrivate extends IContainerPrivate {\n}\n\n/**\n * Creates a tooltip.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/tooltips/} for more info\n * @important\n */\nexport class Tooltip extends Container {\n\n\tprotected _arrangeDisposer: MultiDisposer | undefined;\n\n\tpublic _fx: number = 0;\n\tpublic _fy: number = 0;\n\n\tdeclare public _settings: ITooltipSettings;\n\tdeclare public _privateSettings: ITooltipPrivate;\n\n\tprotected _label!: Label;\n\tpublic static className: string = \"Tooltip\";\n\tpublic static classNames: Array = Container.classNames.concat([Tooltip.className]);\n\n\tprotected _fillDp: IDisposer | undefined;\n\tprotected _strokeDp: IDisposer | undefined;\n\tprotected _labelDp: IDisposer | undefined;\n\n\tprotected _w: number = 0;\n\tprotected _h: number = 0;\n\n\tprotected _afterNew() {\n\t\tthis._settings.themeTags = $utils.mergeTags(this._settings.themeTags, [\"tooltip\"]);\n\n\t\tsuper._afterNew();\n\n\t\tthis.set(\"background\", PointedRectangle.new(this._root, {\n\t\t\tthemeTags: [\"tooltip\", \"background\"]\n\t\t}));\n\n\t\tthis._label = this.children.push(Label.new(this._root, {}));\n\n\t\tthis._disposers.push(this._label.events.on(\"boundschanged\", () => {\n\t\t\tthis._updateBackground();\n\t\t}))\n\n\t\tthis.on(\"bounds\", () => {\n\t\t\tthis._updateBackground();\n\t\t})\n\n\t\tthis._updateTextColor();\n\n\t\tthis._root.tooltipContainer.children.push(this);\n\t\tthis.hide(0);\n\n\t\tthis._root._tooltips.push(this);\n\t}\n\n\t/**\n\t * A [[Label]] element for the tooltip.\n\t *\n\t * @readonly\n\t * @return Label\n\t */\n\tpublic get label(): Label {\n\t\treturn this._label;\n\t}\n\n\t/**\n\t * Permanently disposes the tooltip.\n\t */\n\tpublic dispose() {\n\t\tsuper.dispose();\n\t\t$array.remove(this._root._tooltips, this);\n\t}\n\n\tpublic _updateChildren() {\n\t\tsuper._updateChildren();\n\t\tconst labelText = this.get(\"labelText\");\n\t\tif (labelText != null) {\n\t\t\tthis.label.set(\"text\", this.get(\"labelText\"));\n\t\t}\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\tif (this.isDirty(\"pointTo\")) {\n\t\t\t// can't compare to previous, as sometimes pointTo is set twice (when pointer moves, so the position won't be udpated)\n\t\t\tthis._updateBackground();\n\t\t}\n\n\t\tif (this.isDirty(\"tooltipTarget\")) {\n\t\t\tthis.updateBackgroundColor();\n\t\t}\n\t}\n\n\tprotected _onShow() {\n\t\tsuper._onShow();\n\t\tthis.updateBackgroundColor();\n\t}\n\n\n\tpublic updateBackgroundColor() {\n\t\tlet tooltipTarget = this.get(\"tooltipTarget\");\n\t\tconst background = this.get(\"background\");\n\t\tlet fill: Color | undefined;\n\t\tlet stroke: Color | undefined;\n\n\n\t\tif (tooltipTarget && background) {\n\n\t\t\tfill = tooltipTarget.get(\"fill\" as any);\n\t\t\tstroke = tooltipTarget.get(\"stroke\" as any);\n\n\t\t\tif (fill == null) {\n\t\t\t\tfill = stroke;\n\t\t\t}\n\n\t\t\tif (this.get(\"getFillFromSprite\")) {\n\n\t\t\t\tif (this._fillDp) {\n\t\t\t\t\tthis._fillDp.dispose();\n\t\t\t\t}\n\n\t\t\t\tif (fill != null) {\n\t\t\t\t\tbackground.set(\"fill\", fill as any);\n\t\t\t\t}\n\n\t\t\t\tthis._fillDp = tooltipTarget.on(\"fill\" as any, (fill) => {\n\t\t\t\t\tif (fill != null) {\n\t\t\t\t\t\tbackground.set(\"fill\", fill as any);\n\t\t\t\t\t\tthis._updateTextColor(fill);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (this.get(\"getStrokeFromSprite\")) {\n\n\t\t\t\tif (this._strokeDp) {\n\t\t\t\t\tthis._strokeDp.dispose();\n\t\t\t\t}\n\n\t\t\t\tif (fill != null) {\n\t\t\t\t\tbackground.set(\"stroke\", fill as any);\n\t\t\t\t}\n\n\t\t\t\tthis._strokeDp = tooltipTarget.on(\"fill\" as any, (fill) => {\n\t\t\t\t\tif (fill != null) {\n\t\t\t\t\t\tbackground.set(\"stroke\", fill as any);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (this.get(\"getLabelFillFromSprite\")) {\n\n\t\t\t\tif (this._labelDp) {\n\t\t\t\t\tthis._labelDp.dispose();\n\t\t\t\t}\n\n\t\t\t\tif (fill != null) {\n\t\t\t\t\tthis.label.set(\"fill\", fill as any);\n\t\t\t\t}\n\n\t\t\t\tthis._labelDp = tooltipTarget.on(\"fill\" as any, (fill) => {\n\t\t\t\t\tif (fill != null) {\n\t\t\t\t\t\tthis.label.set(\"fill\", fill as any);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tthis._updateTextColor(fill);\n\t}\n\n\n\tprotected _updateTextColor(fill?: Color | Pattern) {\n\t\tif (this.get(\"autoTextColor\")) {\n\t\t\tif (fill == null) {\n\t\t\t\tfill = this.get(\"background\")!.get(\"fill\") as Color;\n\t\t\t}\n\n\t\t\tif (fill == null) {\n\t\t\t\tfill = this._root.interfaceColors.get(\"background\");\n\t\t\t}\n\n\t\t\tif (fill instanceof Color) {\n\t\t\t\tthis.label.set(\"fill\", Color.alternative(fill, this._root.interfaceColors.get(\"alternativeText\"), this._root.interfaceColors.get(\"text\")));\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _setDataItem(dataItem?: DataItem): void {\n\t\tsuper._setDataItem(dataItem);\n\t\tthis.label._setDataItem(dataItem);\n\t}\t\n\n\n\tprotected _updateBackground() {\n\t\tsuper.updateBackground();\n\t\tconst parent = this._root.container;\n\n\t\tif (parent) {\n\n\t\t\tlet cw = 0.5;\n\t\t\tlet ch = 0.5;\n\n\t\t\tlet centerX = this.get(\"centerX\");\n\t\t\tif (centerX instanceof Percent) {\n\t\t\t\tcw = centerX.value;\n\t\t\t}\n\n\t\t\tlet centerY = this.get(\"centerY\");\n\t\t\tif (centerY instanceof Percent) {\n\t\t\t\tch = centerY.value;\n\t\t\t}\n\n\t\t\tlet parentW = parent.width();\n\t\t\tlet parentH = parent.height();\n\n\t\t\tconst bounds = this.get(\"bounds\", { left: 0, top: 0, right: parentW, bottom: parentH });\n\n\t\t\tthis._updateBounds();\n\n\t\t\tlet w = this.width();\n\t\t\tlet h = this.height();\n\n\t\t\t// use old w and h,as when tooltip is hidden, these are 0 and unneeded animation happens\n\t\t\tif (w === 0) {\n\t\t\t\tw = this._w;\n\t\t\t}\n\n\t\t\tif (h === 0) {\n\t\t\t\th = this._h;\n\t\t\t}\n\n\t\t\tlet pointTo = this.get(\"pointTo\", { x: parentW / 2, y: parentH / 2 });\n\t\t\tlet x = pointTo.x;\n\t\t\tlet y = pointTo.y;\n\n\t\t\tlet pointerOrientation = this.get(\"pointerOrientation\");\n\n\t\t\tlet background = this.get(\"background\");\n\t\t\tlet pointerLength = 0;\n\t\t\tif (background instanceof PointedRectangle) {\n\t\t\t\tpointerLength = background.get(\"pointerLength\", 0);\n\t\t\t}\n\n\t\t\tlet pointerX = 0;\n\t\t\tlet pointerY = 0;\n\n\t\t\tlet boundsW = bounds.right - bounds.left;\n\t\t\tlet boundsH = bounds.bottom - bounds.top;\n\n\t\t\t// horizontal\n\t\t\tif (pointerOrientation == \"horizontal\" || pointerOrientation == \"left\" || pointerOrientation == \"right\") {\n\t\t\t\tif (pointerOrientation == \"horizontal\") {\n\t\t\t\t\tif (x > bounds.left + boundsW / 2) {\n\t\t\t\t\t\tx -= (w * (1 - cw) + pointerLength);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tx += (w * cw + pointerLength);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (pointerOrientation == \"left\") {\n\t\t\t\t\tx += (w * (1 - cw) + pointerLength);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx -= (w * cw + pointerLength);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// vertical pointer\n\t\t\telse {\n\t\t\t\tif (pointerOrientation == \"vertical\") {\n\t\t\t\t\tif (y > bounds.top + h / 2 + pointerLength) {\n\t\t\t\t\t\ty -= (h * (1 - ch) + pointerLength);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ty += (h * ch + pointerLength);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (pointerOrientation == \"down\") {\n\t\t\t\t\ty -= (h * (1 - ch) + pointerLength);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ty += (h * ch + pointerLength);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tx = $math.fitToRange(x, bounds.left + w * cw, bounds.left + boundsW - w * (1 - cw));\n\t\t\ty = $math.fitToRange(y, bounds.top + h * ch, bounds.top + boundsH - h * (1 - ch));\n\n\t\t\tpointerX = pointTo.x - x + w * cw;\n\t\t\tpointerY = pointTo.y - y + h * ch;\n\n\t\t\tthis._fx = x;\n\t\t\tthis._fy = y;\n\n\t\t\tconst animationDuration = this.get(\"animationDuration\", 0);\n\n\t\t\tif (animationDuration > 0 && this.get(\"visible\") && this.get(\"opacity\") > 0.1) {\n\t\t\t\tconst animationEasing = this.get(\"animationEasing\");\n\t\t\t\tthis.animate({ key: \"x\", to: x, duration: animationDuration, easing: animationEasing });\n\t\t\t\tthis.animate({ key: \"y\", to: y, duration: animationDuration, easing: animationEasing });\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.set(\"x\", x);\n\t\t\t\tthis.set(\"y\", y);\n\t\t\t}\n\n\t\t\tif (background instanceof PointedRectangle) {\n\t\t\t\tbackground.set(\"pointerX\", pointerX);\n\t\t\t\tbackground.set(\"pointerY\", pointerY);\n\t\t\t}\n\n\t\t\tif (w > 0) {\n\t\t\t\tthis._w = w;\n\t\t\t}\n\t\t\tif (h > 0) {\n\t\t\t\tthis._h = h;\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Layout } from \"./Layout\";\nimport * as $type from \"../util/Type\";\nimport { Percent } from \"../util/Percent\";\nimport type { Container } from \"./Container\";\n\n\n/**\n * A vertical children layout for [[Container]].\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/containers/#Layout} for more info\n */\nexport class VerticalLayout extends Layout {\n\n\tpublic static className: string = \"VerticalLayout\";\n\tpublic static classNames: Array = Layout.classNames.concat([VerticalLayout.className]);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic updateContainer(container: Container): void {\n\t\tlet paddingTop = container.get(\"paddingTop\", 0);\n\n\t\tlet availableHeight = container.innerHeight();\n\t\tlet totalPercent = 0;\n\n\t\tcontainer.children.each((child) => {\n\t\t\tif (child.get(\"position\") == \"relative\") {\n\t\t\t\tlet childHeight = child.get(\"height\");\n\t\t\t\tif (childHeight instanceof Percent) {\n\t\t\t\t\ttotalPercent += childHeight.value;\n\n\t\t\t\t\tlet h = availableHeight * childHeight.value;\n\t\t\t\t\tlet minHeight = child.get(\"minHeight\", -Infinity);\n\t\t\t\t\tif (minHeight > h) {\n\t\t\t\t\t\tavailableHeight -= minHeight;\n\t\t\t\t\t\ttotalPercent -= childHeight.value;\n\t\t\t\t\t}\n\t\t\t\t\tlet maxHeight = child.get(\"minHeight\", Infinity);\n\t\t\t\t\tif (h > maxHeight) {\n\t\t\t\t\t\tavailableHeight -= maxHeight;\n\t\t\t\t\t\ttotalPercent -= childHeight.value;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!$type.isNumber(childHeight)) {\n\t\t\t\t\t\tchildHeight = child.height();\n\t\t\t\t\t}\n\t\t\t\t\tavailableHeight -= childHeight + child.get(\"marginTop\", 0) + child.get(\"marginBottom\", 0);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tif(availableHeight > 0){\n\t\t\tcontainer.children.each((child) => {\n\t\t\t\tif (child.get(\"position\") == \"relative\") {\n\t\t\t\t\tlet childHeight = child.get(\"height\");\n\n\t\t\t\t\tif (childHeight instanceof Percent) {\n\t\t\t\t\t\tlet privateHeight = availableHeight * childHeight.value / totalPercent - child.get(\"marginTop\", 0) - child.get(\"marginBottom\", 0);\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet minHeight = child.get(\"minHeight\", -Infinity);\n\t\t\t\t\t\tlet maxHeight = child.get(\"maxHeight\", Infinity);\n\t\t\t\t\t\tprivateHeight = Math.min(Math.max(minHeight, privateHeight), maxHeight);\n\n\t\t\t\t\t\tchild.setPrivate(\"height\", privateHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tlet prevY = paddingTop;\n\n\t\tcontainer.children.each((child) => {\n\t\t\tif (child.get(\"position\") == \"relative\") {\n\t\t\t\tlet bounds = child.adjustedLocalBounds();\n\t\t\t\tlet marginTop = child.get(\"marginTop\", 0);\n\t\t\t\tlet marginBottom = child.get(\"marginBottom\", 0);\n\t\t\t\tlet y = prevY + marginTop - bounds.top;\n\t\t\t\tchild.setPrivate(\"y\", y);\n\t\t\t\tprevY = y + bounds.bottom + marginBottom;\n\t\t\t}\n\t\t});\n\t}\n}\n","import type { IDisposer } from \"../../util/Disposer\";\nimport type { IPoint } from \"../../util/IPoint\";\nimport type { Color } from \"../../util/Color\";\nimport type { Percent } from \"../../util/Percent\";\nimport type { Matrix } from \"../../util/Matrix\";\nimport type { IBounds } from \"../../util/IBounds\";\n\nexport interface IGradient {\n\taddColorStop(offset: number, color: string): void;\n}\n\n/**\n * Represents an object describing color switching point in a gradiend.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/} for more info\n */\nexport interface IGradientStop {\n\n\t/**\n\t * Color.\n\t */\n\tcolor?: Color;\n\n\t/**\n\t * Offset defines where in the gradient the color should kick in. Values\n\t * from 0 to 1 are possible with 0 meaning start, 0.5 half-way through the\n\t * gradient, etc.\n\t */\n\toffset?: number;\n\n\t/**\n\t * Transparency of the color. 0 - completely transparent, 1 - fully opaque.\n\t */\n\topacity?: number;\n\n\t/**\n\t * Sets lightness of the color.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/#Brightness} for more info\n\t */\n\tlighten?: number;\n\n\t/**\n\t * Sets brightness of the color.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/#Brightness} for more info\n\t */\n\tbrighten?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tcolorInherited?: boolean;\n\n\t/**\n\t * @ignore\n\t */\n\topacityInherited?: boolean;\n\n}\n\nexport interface IPattern {\n}\n\nexport type IPointerEvent = PointerEvent | MouseEvent | Touch;\n\nexport type Id = number | null;;\n\nexport interface IRendererEvent {\n\tevent: E;\n\tpoint: IPoint;\n\tid: Id;\n\tsimulated: boolean;\n\tnative: boolean;\n}\n\nexport interface IRendererEvents {\n\tclick: IRendererEvent;\n\trightclick: IRendererEvent;\n\tmiddleclick: IRendererEvent;\n\tdblclick: IRendererEvent;\n\tglobalpointermove: IRendererEvent,\n\tglobalpointerup: IRendererEvent,\n\tpointerover: IRendererEvent;\n\tpointerout: IRendererEvent;\n\tpointerdown: IRendererEvent;\n\tpointermove: IRendererEvent;\n\tpointerup: IRendererEvent;\n\twheel: IRendererEvent;\n}\n\nexport interface IDisplayObject extends IDisposer {\n\tmask: IGraphics | null;\n\tvisible: boolean;\n\tinteractive: boolean;\n\tinactive: boolean;\n\twheelable: boolean;\n\tisMeasured: boolean;\n\tbuttonMode: boolean;\n\talpha: number;\n\tangle: number;\n\tscale: number;\n\tx: number;\n\ty: number;\n\tpivot: IPoint;\n\tfilter?: string;\n\tcursorOverStyle?: string;\n\texportable?: boolean;\n\n\t_setMatrix():void;\n\tgetLayer(): ILayer;\n\tsetLayer(order: number | undefined): void;\n\tmarkDirtyLayer(deep?: boolean): void;\n\tclear(): void;\n\tinvalidateBounds(): void;\n\ttoLocal(point: IPoint): IPoint;\n\ttoGlobal(point: IPoint): IPoint;\n\tgetLocalBounds(): IBounds;\n\tgetAdjustedBounds(bounds?:IBounds):IBounds;\n\ton(key: Key, callback: (this: C, event: IRendererEvents[Key]) => void, context?: C): IDisposer;\n\thovering(): boolean;\n\tgetCanvas(): HTMLCanvasElement;\n\n\t/**\n\t * @ignore\n\t */\n\tgetLocalMatrix():Matrix;\n}\n\nexport interface IContainer extends IDisplayObject {\n\tinteractiveChildren: boolean;\n\n\taddChild(child: IDisplayObject): void;\n\taddChildAt(child: IDisplayObject, index: number): void;\n\tremoveChild(child: IDisplayObject): void;\n}\n\n\n/**\n * From https://github.com/pixijs/pixi.js/blob/3dd0ff9a935f0bc13a09aefff9eb2872f02c51b9/packages/canvas/canvas-renderer/src/utils/mapCanvasBlendModesToPixi.ts#L13\n */\nexport enum BlendMode {\n\tADD = \"lighter\",\n\tCOLOR = \"color\",\n\tCOLOR_BURN = \"color-burn\",\n\tCOLOR_DODGE = \"color-dodge\",\n\tDARKEN = \"darken\",\n\tDIFFERENCE = \"difference\",\n\tDST_OVER = \"destination-over\",\n\tEXCLUSION = \"exclusion\",\n\tHARD_LIGHT = \"hard-light\",\n\tHUE = \"hue\",\n\tLIGHTEN = \"lighten\",\n\tLUMINOSITY = \"luminosity\",\n\tMULTIPLY = \"multiply\",\n\tNORMAL = \"source-over\",\n\tOVERLAY = \"overlay\",\n\tSATURATION = \"saturation\",\n\tSCREEN = \"screen\",\n\tSOFT_LIGHT = \"soft-light\",\n\tSRC_ATOP = \"source-atop\",\n\tXOR = \"xor\",\n}\n\nexport interface IGraphics extends IDisplayObject {\n\tblendMode: BlendMode;\n\n\tclear(): void;\n\n\tbeginFill(color?: Color | IGradient | IPattern, alpha?: number): void;\n\tendFill(): void;\n\n\tlineStyle(width?: number, color?: Color | IGradient | IPattern, alpha?: number): void;\n\tsetLineDash(dash?: number[]): void;\n\tsetLineDashOffset(dashOffset?: number): void;\n\tendStroke(): void;\n\n\tdrawRect(x: number, y: number, width: number, height: number): void;\n\tdrawCircle(x: number, y: number, radius: number): void;\n\tdrawEllipse(x: number, y: number, radiusX: number, radiusY: number): void;\n\tarc(cx: number, cy: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;\n\tarcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;\n\tlineTo(x: number, y: number): void;\n\tmoveTo(x: number, y: number): void;\n\tclosePath(): void;\n\tbezierCurveTo(cpX: number, cpY: number, cpX2: number, cpY2: number, toX: number, toY: number): void;\n\tquadraticCurveTo(cpX: number, cpY: number, toX: number, toY: number): void;\n\tsvgPath(path: string): void;\n\tshadow(color: Color, blur?: number, offsetX?: number, offsetY?: number, opacity?: number): void;\n}\n\n/**\n * @ignore\n */\nexport interface IText extends IDisplayObject {\n\tresolution: number;\n\ttext: string;\n\tstyle: ITextStyle;\n}\n\n/**\n * @ignore\n */\nexport interface IRadialText extends IText {\n\ttextType?: \"regular\" | \"circular\" | \"radial\" | \"aligned\" | \"adjusted\";\n\tradius?: number;\n\tstartAngle?: number;\n\trelativeAngle?: number;\n\tinside?: boolean;\n\torientation?: \"inward\" | \"outward\" | \"auto\";\n\tkerning?: number;\n}\n\nexport interface ITextStyle {\n\t//wordWrapWidth: number = 100;\n\tfill?: Color | IGradient | IPattern;\n\ttextAlign?: \"start\" | \"end\" | \"left\" | \"right\" | \"center\";\n\tfontFamily?: string;\n\tfontSize?: string | number;\n\tfontWeight?: 'normal' | 'bold' | 'bolder' | 'lighter' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'\n\tfontStyle?: 'normal' | 'italic' | 'oblique';\n\tfontVariant?: \"normal\" | \"small-caps\";\n\ttextDecoration?: \"underline\";\n\tshadowColor?: Color | null;\n\tshadowBlur?: number;\n\tshadowOffsetX?: number;\n\tshadowOffsetY?: number;\n\tshadowOpacity?: number;\n\n\t// leading?: number;\n\t// letterSpacing?: number;\n\tlineHeight?: number | Percent;\n\tbaselineRatio?: number;\n\t// padding?: number;\n\t// stroke?: number;\n\t// strokeThickness?: number;\n\t// trim?: number;\n\t// wordWrap?: boolean;\n\tdirection?: \"ltr\" | \"rtl\";\n\ttextBaseline?: \"top\" | \"hanging\" | \"middle\" | \"alphabetic\" | \"ideographic\" | \"bottom\";\n\toversizedBehavior?: \"none\" | \"hide\" | \"fit\" | \"wrap\" | \"truncate\";\n\tbreakWords?: boolean;\n\tellipsis?: string;\n\tmaxWidth?: number;\n\tmaxHeight?: number;\n\tminScale?: number;\n}\n\nexport interface IPicture extends IDisplayObject {\n\timage: HTMLImageElement | undefined;\n\twidth?: number | undefined;\n\theight?: number | undefined;\n\tshadowColor?: Color;\n\tshadowBlur?: number;\n\tshadowOffsetX?: number;\n\tshadowOffsetY?: number;\n\tshadowOpacity?: number;\n}\n\nexport interface IRenderer extends IDisposer {\n\tresolution: number;\n\tinteractionsEnabled: boolean;\n\tcreateLinearGradient(x1: number, y1: number, x2: number, y2: number): IGradient;\n\tcreateRadialGradient(x1: number, y1: number, radius1: number, x2: number, y2: number, radius2: number): IGradient;\n\tcreatePattern(graphics: IGraphics, background: IGraphics, repetition: string, width: number, height: number): IPattern;\n\tmakeContainer(): IContainer;\n\tmakeGraphics(): IGraphics;\n\tmakeText(text: string, style: ITextStyle): IText;\n\tmakeRadialText(text: string, style: ITextStyle): IText;\n\tmakeTextStyle(): ITextStyle;\n\tmakePicture(image: HTMLImageElement | undefined): IPicture;\n\tresize(width: number, height: number): void;\n\trender(root: IDisplayObject): void;\n\tgetCanvas(root: IDisplayObject, options?: ICanvasOptions): HTMLCanvasElement;\n\tview: HTMLElement;\n\n\tgetEvent(originalEvent: A, adjustPoint?: boolean): IRendererEvent;\n}\n\nexport interface ICanvasOptions {\n\tmaintainPixelRatio?: boolean;\n\tminWidth?: number;\n\tmaxWidth?: number;\n\tminHeight?: number;\n\tmaxHeight?: number;\n}\n\n/**\n * @ignore\n */\nexport interface ILayer {\n\tvisible: boolean;\n\torder: number;\n\twidth: number | undefined;\n\theight: number | undefined;\n\tdirty: boolean;\n}\n","import type { IBounds } from \"../../util/IBounds\"\nimport type { IGradient, IGradientStop } from \"../backend/Renderer\";\nimport type { Sprite } from \"../Sprite\";\n\nimport { Entity, IEntitySettings, IEntityPrivate } from \"../../util/Entity\"\n\n\nexport interface IGradientSettings extends IEntitySettings {\n\n\t/**\n\t * A list of color steps for the gradient.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/} for more info\n\t */\n\tstops?: Array;\n\n\t/**\n\t * Gradient target.\n\t */\n\ttarget?: Sprite;\n\n}\n\nexport interface IGradientPrivate extends IEntityPrivate {\n}\n\n/**\n * Base class for gradients.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/} for more info\n */\nexport abstract class Gradient extends Entity {\n\n\tdeclare public _settings: IGradientSettings;\n\tdeclare public _privateSettings: IGradientPrivate;\n\n\tpublic static className: string = \"Gradient\";\n\tpublic static classNames: Array = Entity.classNames.concat([Gradient.className]);\n\n\tprotected _afterNew() {\n\t\t// Applying themes because gradient will not have parent\n\t\tsuper._afterNewApplyThemes();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getFill(_target: Sprite): IGradient {\n\t\treturn {\n\t\t\taddColorStop: (_offset: number, _color: string) => { }\n\t\t};\n\t}\n\n\tpublic _changed() {\n\t\tsuper._changed();\n\n\t\t//if (this.isDirty(\"target\") && this.get(\"target\")) {\n\t\t//\tthis.get(\"target\")!.events.on(\"boundschanged\", () => {\n\n\t\t//\t});\n\t\t//}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getBounds(target: Sprite): IBounds {\n\t\tconst gradientTarget = this.get(\"target\");\n\t\tif (gradientTarget) {\n\t\t\tlet bounds = gradientTarget.globalBounds();\n\n\t\t\tconst p0 = target.toLocal({ x: bounds.left, y: bounds.top });\n\t\t\tconst p1 = target.toLocal({ x: bounds.right, y: bounds.top });\n\t\t\tconst p2 = target.toLocal({ x: bounds.right, y: bounds.bottom });\n\t\t\tconst p3 = target.toLocal({ x: bounds.left, y: bounds.bottom });\n\n\t\t\treturn {\n\t\t\t\tleft: Math.min(p0.x, p1.x, p2.x, p3.x),\n\t\t\t\ttop: Math.min(p0.y, p1.y, p2.y, p3.y),\n\t\t\t\tright: Math.max(p0.x, p1.x, p2.x, p3.x),\n\t\t\t\tbottom: Math.max(p0.y, p1.y, p2.y, p3.y)\n\t\t\t}\n\t\t}\n\t\treturn target._display.getLocalBounds();\n\t}\n\n}\n","import type { IGradient } from \"../backend/Renderer\";\nimport type { Sprite } from \"../Sprite\";\n\nimport { Gradient, IGradientSettings, IGradientPrivate } from \"./Gradient\";\nimport { Color } from \"../../util/Color\";\n\nimport * as $array from \"../../util/Array\";\nimport * as $type from \"../../util/Type\";\nimport * as $math from \"../../util/Math\";\n\n\nexport interface ILinearGradientSettings extends IGradientSettings {\n\n\t/**\n\t * Gradient rotation, in degrees.\n\t *\n\t * @default 90\n\t */\n\trotation?: number;\n\n}\n\nexport interface ILinearGradientPrivate extends IGradientPrivate {\n}\n\n/**\n * Linear gradient.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/gradients/} for more info\n */\nexport class LinearGradient extends Gradient {\n\n\tdeclare public _settings: ILinearGradientSettings;\n\tdeclare public _privateSettings: ILinearGradientPrivate;\n\n\tpublic static className: string = \"LinearGradient\";\n\tpublic static classNames: Array = Gradient.classNames.concat([LinearGradient.className]);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getFill(target: Sprite): IGradient {\n\t\tconst rotation = this.get(\"rotation\", 0);\n\t\tlet bounds = this.getBounds(target);\n\n\t\tlet l = bounds.left || 0;\n\t\tlet r = bounds.right || 0;\n\t\tlet t = bounds.top || 0;\n\t\tlet b = bounds.bottom || 0;\n\n\t\tlet cos = $math.cos(rotation);\n\t\tlet sin = $math.sin(rotation);\n\n\t\tlet w = cos * (r - l);\n\t\tlet h = sin * (b - t);\n\n\t\tlet longer = Math.max(w, h);\n\n\t\tconst gradient = this._root._renderer.createLinearGradient(\n\t\t\tl,\n\t\t\tt,\n\t\t\tl + longer * cos,\n\t\t\tt + longer * sin\n\t\t);\n\n\t\tconst stops = this.get(\"stops\")!;\n\t\tif (stops) {\n\t\t\tlet i = 0;\n\t\t\t$array.each(stops, (stop) => {\n\n\t\t\t\tlet offset = stop.offset;\n\n\t\t\t\tif (!$type.isNumber(offset)) {\n\t\t\t\t\toffset = i / (stops.length - 1);\n\t\t\t\t}\n\n\t\t\t\tlet opacity = stop.opacity;\n\n\t\t\t\tif (!$type.isNumber(opacity)) {\n\t\t\t\t\topacity = 1;\n\t\t\t\t}\n\n\t\t\t\tlet color = stop.color;\n\n\t\t\t\tif (color) {\n\n\t\t\t\t\tconst lighten = stop.lighten;\n\t\t\t\t\tif (lighten) {\n\t\t\t\t\t\tcolor = Color.lighten(color, lighten)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst brighten = stop.brighten;\n\t\t\t\t\tif (brighten) {\n\t\t\t\t\t\tcolor = Color.brighten(color, brighten)\n\t\t\t\t\t}\n\n\t\t\t\t\tgradient.addColorStop(offset, 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + opacity + ')');\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t})\n\t\t}\n\t\treturn gradient;\n\t}\n}\n","import type { Entity, Animation } from \"./Entity\";\nimport { Percent } from \"./Percent\";\nimport { Color } from \"./Color\";\nimport type { Easing } from \"./Ease\";\nimport { EventDispatcher, Events } from \"./EventDispatcher\";\nimport * as $object from \"./Object\";\n\nexport type Animations = { [K in keyof T]?: Animation };\n\n/**\n * @ignore\n */\nexport async function waitForAnimations(animations: Animations | undefined): Promise {\n\tif (animations !== undefined) {\n\t\tconst promises: Array> = [];\n\n\t\t$object.each(animations, (_, animation) => {\n\t\t\tpromises.push(animation.waitForStop());\n\t\t});\n\n\t\tawait Promise.all(promises);\n\t}\n}\n\n\ninterface ITime {\n\treadonly tag: unique symbol;\n}\n\n/**\n * New type which allows for conversion from a number into a Time, but not from a Time to a number\n */\nexport type Time = number | ITime;\n\n\n/**\n * @ignore\n */\nexport function normalize(value: number, min: number, max: number): Time {\n\tif (min === max) {\n\t\treturn 0;\n\n\t} else {\n\t\treturn Math.min(Math.max((value - min) * (1 / (max - min)), 0), 1);\n\t}\n}\n\n/**\n * @ignore\n */\nexport function range(diff: Time, from: number, to: number): number {\n\treturn from + (diff as number * (to - from));\n}\n\n/**\n * @ignore\n */\nexport function defaultInterpolate(diff: Time, from: A, to: B): A | B {\n\tif (diff >= 1) {\n\t\treturn to;\n\n\t} else {\n\t\treturn from;\n\t}\n}\n\n/**\n * @ignore\n */\nexport function percentInterpolate(diff: Time, from: Percent, to: Percent): Percent {\n\treturn new Percent(range(diff, from.percent, to.percent));\n}\n\n/**\n * @ignore\n */\nexport function colorInterpolate(diff: Time, from: Color, to: Color): Color {\n\treturn Color.interpolate(diff, from, to);\n}\n\n/**\n * @ignore\n */\nexport function getInterpolate(from: number, to: number): typeof range;\n\n/**\n * @ignore\n */\nexport function getInterpolate(from: Percent, to: Percent): typeof percentInterpolate;\n\n/**\n * @ignore\n */\nexport function getInterpolate(from: any, to: any): typeof defaultInterpolate;\n\n/**\n * @ignore\n */\nexport function getInterpolate(from: any, to: any): (diff: Time, from: any, to: any) => any {\n\tif (typeof from === \"number\" && typeof to === \"number\") {\n\t\treturn range;\n\t}\n\n\tif (from instanceof Percent && to instanceof Percent) {\n\t\treturn percentInterpolate;\n\t}\n\n\tif (from instanceof Color && to instanceof Color) {\n\t\treturn colorInterpolate;\n\t}\n\n\treturn defaultInterpolate;\n}\n\n\nexport interface IAnimation {\n\t_runAnimation(_currentTime: number): boolean;\n}\n\n\n/**\n * @ignore\n */\nexport interface IEntityEvents {\n\tstarted: {};\n\tstopped: {};\n\t// TODO replace this with stopped\n\tended: {};\n\tprogress: { progress: number };\n}\n\n/**\n * @ignore\n */\nexport class AnimationTime implements IAnimation {\n\tprotected _entity: Entity;\n\tprotected _duration: number;\n\n\tprotected _playingDuration: number | null = null;\n\tprotected _startingTime: number | null = null;\n\tprotected _current: Time = 0;\n\tprotected _from: Time = 0;\n\tprotected _to: Time = 0;\n\n\tdeclare public _events: IEntityEvents;\n\tpublic events: EventDispatcher> = new EventDispatcher();\n\n\tpublic easing: Easing | undefined;\n\n\tconstructor(entity: Entity, duration: number) {\n\t\tthis._entity = entity;\n\t\tthis._duration = duration;\n\t}\n\n\tprivate _stopEvent() {\n\t\tconst type = \"stopped\";\n\t\tif (this.events.isEnabled(type)) {\n\t\t\tthis.events.dispatch(type, { type: type, target: this });\n\t\t}\n\t}\n\n\tpublic _runAnimation(currentTime: number): boolean {\n\t\tif (this._playingDuration !== null) {\n\t\t\tif (this._startingTime === null) {\n\t\t\t\tthis._startingTime = currentTime;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst diff = (currentTime - this._startingTime) / this._playingDuration;\n\n\t\t\t\tif (diff >= 1) {\n\t\t\t\t\tthis._playingDuration = null;\n\t\t\t\t\tthis._startingTime = null;\n\t\t\t\t\tthis._from = this._to;\n\t\t\t\t\tthis._current = this._to;\n\t\t\t\t\tthis._entity.markDirty();\n\t\t\t\t\tthis._stopEvent();\n\t\t\t\t\tconst type = \"ended\";\n\t\t\t\t\tif (this.events.isEnabled(type)) {\n\t\t\t\t\t\tthis.events.dispatch(type, { type: type, target: this });\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\t\t\t\t\tthis._current = range(diff, this._from as number, this._to as number);\n\t\t\t\t\tthis._entity.markDirty();\n\n\t\t\t\t\tconst type = \"progress\";\n\t\t\t\t\tif (this.events.isEnabled(type)) {\n\t\t\t\t\t\tthis.events.dispatch(type, { type: type, target: this, progress: diff });\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate _play() {\n\t\tthis._from = this._current;\n\n\t\tif (this._playingDuration === null) {\n\t\t\tthis._entity._root._addAnimation(this);\n\n\t\t\tconst type = \"started\";\n\t\t\tif (this.events.isEnabled(type)) {\n\t\t\t\tthis.events.dispatch(type, { type: type, target: this });\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis._startingTime = null;\n\t\t}\n\n\t\tthis._playingDuration = Math.abs((this._to as number) - (this._from as number)) * this._duration;\n\t}\n\n\tpublic get duration(): number {\n\t\treturn this._duration;\n\t}\n\n\tpublic set duration(value: number) {\n\t\tif (this._duration !== value) {\n\t\t\tthis._duration = value;\n\n\t\t\tif (value === 0) {\n\t\t\t\tthis.jumpTo(this._to);\n\n\t\t\t} else if (this._current !== this._to) {\n\t\t\t\tthis._play();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic get current(): Time {\n\t\tif (this.easing) {\n\t\t\treturn this.easing(this._current);\n\n\t\t} else {\n\t\t\treturn this._current;\n\t\t}\n\t}\n\n\tpublic stop() {\n\t\tthis.jumpTo(this._current);\n\t}\n\n\tpublic jumpTo(value: Time) {\n\t\tif (this._current !== value) {\n\t\t\tthis._entity.markDirty();\n\t\t}\n\n\t\tif (this._playingDuration !== null) {\n\t\t\tthis._stopEvent();\n\t\t}\n\n\t\tthis._playingDuration = null;\n\t\tthis._startingTime = null;\n\t\tthis._current = value;\n\t\tthis._from = value;\n\t\tthis._to = value;\n\t}\n\n\tpublic tweenTo(value: Time) {\n\t\tif (this._current === value || this._duration === 0) {\n\t\t\tthis.jumpTo(value);\n\n\t\t} else {\n\t\t\tif (this._to !== value) {\n\t\t\t\tthis._to = value;\n\t\t\t\tthis._play();\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/*export class AnimationValue extends AnimationTime {\n\tpublic _min: number;\n\tpublic _max: number;\n\n\tconstructor(entity: Entity, duration: number, min: number, max: number) {\n\t\tsuper(entity, duration);\n\t\tthis._min = min;\n\t\tthis._max = max;\n\t}\n\n\tpublic get min(): number {\n\t\treturn this._min;\n\t}\n\n\tpublic set min(value: number) {\n\t\tif (this._min !== value) {\n\t\t\tthis._min = value;\n\t\t\tthis._entity.markDirty();\n\t\t}\n\t}\n\n\tpublic get max(): number {\n\t\treturn this._max;\n\t}\n\n\tpublic set max(value: number) {\n\t\tif (this._max !== value) {\n\t\t\tthis._max = value;\n\t\t\tthis._entity.markDirty();\n\t\t}\n\t}\n\n\tpublic currentValue(): number {\n\t\treturn range(super.currentTime(), this._min, this._max);\n\t}\n\n\tpublic jumpToValue(value: number) {\n\t\tsuper.jumpToTime(normalize(value, this._min, this._max));\n\t}\n\n\tpublic tweenToValue(value: number) {\n\t\tsuper.tweenToTime(normalize(value, this._min, this._max));\n\t}\n}\n*/\n","/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\nimport type { Optional } from \"./Type\";\nimport * as $type from \"./Type\";\n\n\n/**\n * ============================================================================\n * UTILITY FUNCTIONS\n * ============================================================================\n * @hidden\n */\n\n/**\n * Searches `array` for `value`.\n *\n * Returns -1 if not found.\n *\n * @param array Source array\n * @param value Value to search\n * @returns Index\n */\nexport function indexOf(array: ArrayLike, value: A): number {\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\t// TODO handle NaN\n\t\tif (array[i] === value) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Calls `test` for each element in `array`.\n *\n * If `test` returns `true` then it immediately returns `true`.\n *\n * If `test` returns `false` for all of the elements in `array` then it returns `false`.\n *\n * @param array Source array\n * @param test Function which is called on each element\n * @returns Whether `test` returned true or not\n */\nexport function any(array: ArrayLike, test: (value: A) => boolean): boolean {\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tif (test(array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Calls `fn` function for every member of array and returns a new array out\n * of all outputs.\n *\n * @param array Source array\n * @param fn Callback function\n * @returns New array\n */\nexport function map(array: ArrayLike, fn: (value: A, index: number) => B): Array {\n\tconst length = array.length;\n\tconst output = new Array(length);\n\n\tfor (let i = 0; i < length; ++i) {\n\t\toutput[i] = fn(array[i], i);\n\t}\n\n\treturn output;\n}\n\n/**\n * Iterates through all items in array and calls `fn` function for each of\n * them.\n *\n * @param array Source array\n * @param fn Callback function\n */\nexport function each(array: ArrayLike, fn: (value: A, index: number) => void): void {\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tfn(array[i], i);\n\t}\n}\n\n/**\n * Iterates through all items in array in reverse order and calls `fn` function for each of\n * them.\n *\n * @param array Source array\n * @param fn Callback function\n */\nexport function eachReverse(array: ArrayLike, fn: (value: A, index: number) => void): void {\n\tlet i = array.length;\n\n\twhile (i > 0) {\n\t\t--i;\n\t\tfn(array[i], i);\n\t}\n}\n\n/**\n * Iterates through all items in array and calls `fn` function for each of\n * them.\n *\n * If `fn` call evaluates to `false`, further iteration is cancelled.\n *\n * @param array Source array\n * @param fn Callback function\n */\nexport function eachContinue(array: ArrayLike, fn: (value: A, index: number) => boolean): void {\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tif (!fn(array[i], i)) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Shifts an item at `index` towards beginning of the array.\n *\n * @param array Source array\n * @param index Target element index\n */\nexport function shiftLeft(array: Array, index: number): void {\n\tconst length = array.length;\n\n\tfor (let i = index; i < length; ++i) {\n\t\tarray[i - index] = array[i];\n\t}\n\n\tarray.length = length - index;\n}\n\n/**\n * Returns the last item of the array.\n *\n * @param array Source array\n * @returns Last item\n */\nexport function last(array: Array): Optional {\n\tconst length = array.length;\n\treturn length ? array[length - 1] : undefined;\n}\n\n/**\n * Returns the first item of the array.\n *\n * @param array Source array\n * @returns Last item\n */\nexport function first(array: Array): Optional {\n\treturn array[0];\n}\n\n/**\n * Inserts `element` into `array` at `index`.\n *\n * Caps `index` to be between `0` and `array.length`\n *\n * @param array Source array\n * @param element Item to insert\n * @param array Index to insert item at\n */\nexport function insert(array: Array, element: A, index: number): void {\n\t//if (array) {\n\tindex = Math.max(0, Math.min(index, array.length));\n\tarray.splice(index, 0, element);\n\t//}\n}\n\n/**\n * Removes all copies of `element` from `array` (if they exist) and then\n * inserts `element` at `index`.\n *\n * @param array Source array\n * @param element Item\n * @param array Index to move item to\n */\nexport function setIndex(array: Array, element: A, index: number): void {\n\tremove(array, element);\n\tinsert(array, element, index);\n}\n\n\n/**\n * Pushes all of the elements from `input` into `array`.\n *\n * @param array Output array\n * @param input Input array\n */\nexport function pushAll(array: Array, input: Array) {\n\tconst length = input.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tarray.push(input[i]);\n\t}\n}\n\n\n/**\n * Removes `element` from `array`.\n *\n * If there are multiple copies of `element`, they are all removed.\n *\n * @param array Source array\n * @param element Item to remove\n */\nexport function remove(array: Array, element: A): boolean {\n\tlet found: boolean = false;\n\tlet index: number = array.indexOf(element);\n\n\tif (index !== -1) {\n\t\tfound = true;\n\t\tarray.splice(index, 1);\n\n\t\tlet length: number = array.length;\n\n\t\twhile (index < length) {\n\t\t\t// TODO handle NaN\n\t\t\tif (array[index] === element) {\n\t\t\t\tarray.splice(index, 1);\n\t\t\t\t--length;\n\n\t\t\t} else {\n\t\t\t\t++index;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn found;\n}\n\nexport function removeFirst(array: Array, element: A): boolean {\n\tlet index: number = array.indexOf(element);\n\n\tif (index !== -1) {\n\t\tarray.splice(index, 1);\n\t\treturn true;\n\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Adds an `element` to `array`.\n *\n * If array already contains and item like this, it is removed before adding\n * it again.\n *\n * Optionally `toIndex` can be specified to add element at specific index.\n *\n * @param array Source array\n * @param element Item to add\n * @param array Index to move item to\n */\nexport function move(array: Array, element: A, toIndex?: number): void {\n\t// @todo this implementation must be the same as the List.moveValue method\n\t// @todo don't do anything if the desired index is the same as the current index\n\tlet index = indexOf(array, element);\n\n\t// @todo remove all old values rather than only the first ?\n\tif (index !== -1) {\n\t\tremoveIndex(array, index);\n\t}\n\n\tif (toIndex == null) {\n\t\tarray.push(element);\n\t} else {\n\t\tinsertIndex(array, toIndex, element);\n\t}\n}\n\n\n/**\n * Inserts `element` into `array` at `index`.\n *\n * If `index` is not provided, it will insert `element` at the end of `array`.\n *\n * @param array Source array\n * @param element Item to add\n * @param array Index to add item at\n */\nexport function add(array: Array, element: A, index?: number): void {\n\t// Append to the end if index is not set\n\tif (!$type.isNumber(index)) {\n\t\tarray.push(element);\n\t}\n\n\t// Add to the beginning of array if index is 0\n\telse if (index === 0) {\n\t\tarray.unshift(element);\n\t}\n\t// Add to indicated place if index is set\n\telse {\n\t\tarray.splice(index, 0, element);\n\t}\n}\n\n\n/**\n * Pushes `element` into `array` if it doesn't already exist.\n *\n * @param array Source array\n * @param element Item to add\n */\nexport function pushOne(array: Array, element: A): void {\n\tif (array.indexOf(element) === -1) {\n\t\tarray.push(element);\n\t}\n}\n\n\n/**\n * Removes `element` from `array` (if it exists) and then inserts `element` at\n * `index`.\n *\n * If `index` is not provided, it will insert `element` at the end of `array`.\n *\n * @param array Source array\n * @param element Item to remove\n * @param array Index to move item to\n */\nexport function replace(array: Array, element: A, index?: number): void {\n\t// check if exists\n\tlet ind: number = array.indexOf(element);\n\n\t// remove if exists\n\tif (ind !== -1) {\n\t\tarray.splice(ind, 1);\n\t}\n\n\t// add to end if index is not set\n\tif (!$type.isNumber(index)) {\n\t\tarray.push(element);\n\t}\n\t// add to indicated place if index is set\n\telse {\n\t\tarray.splice(index, 0, element);\n\t}\n}\n\n/**\n * Wraps `input` in an array, if it isn't already an array.\n *\n * @param input Source value\n * @return An array\n */\nexport function toArray(input: Array | A): Array {\n\tif (Array.isArray(input)) {\n\t\treturn input;\n\t}\n\telse {\n\t\treturn [input];\n\t}\n}\n\n/**\n * Returns `true` if `element` exists in `array`.\n *\n * @param array Source array\n * @param element Item to search for\n * @returns Item in array?\n */\nexport function has(array: ArrayLike, element: A): boolean {\n\treturn indexOf(array, element) !== -1;\n}\n\n/**\n * Returns a shallow copy of `array`.\n *\n * @param array Source array\n * @returns Copy of the array\n */\nexport function copy(array: ArrayLike): Array {\n\tconst length = array.length;\n\n\t// It's faster to create the array with a pre-defined length\n\tconst output = new Array(length);\n\n\tfor (let i = 0; i < length; ++i) {\n\t\t// Because the array has a pre-defined length, we have to assign rather than push\n\t\t// This is also faster than pushing\n\t\toutput[i] = array[i];\n\t}\n\n\treturn output;\n}\n\n\n/**\n * Returns a copy of `array` which contains all the elements between `start`\n * and `end`. (including `start` and excluding `end`)\n *\n * If `end` is not provided, it defaults to `array.length`.\n *\n * @param array Source array\n * @param start Start index\n * @param end End index\n * @returns Part of the array\n */\nexport function slice(array: ArrayLike, start: number, end: number = array.length): Array {\n\tconst output = new Array(end - start);\n\n\tfor (let i = start; i < end; ++i) {\n\t\toutput[i - start] = array[i];\n\t}\n\n\treturn output;\n}\n\n/**\n * Inserts a value into array at specific index.\n *\n * @param array Source array\n * @param index Index\n * @param value Value to insert\n */\nexport function insertIndex(array: Array, index: number, value: A): void {\n\tarray.splice(index, 0, value);\n}\n\n/**\n * Removes a value from array at specific index.\n *\n * @param array Source array\n * @param index Index\n */\nexport function removeIndex(array: Array, index: number): void {\n\tarray.splice(index, 1);\n}\n\n/**\n * @ignore Exclude from docs\n * @todo Description\n */\nexport interface SortResult {\n\tfound: boolean;\n\tindex: number\n}\n\n/**\n * Searches the array using custom function and returns index of the item if\n * found.\n *\n * Will call `matches` function on all items of the array. If return value\n * evaluates to `true`, index is returned.\n *\n * Otherwise returns -1.\n *\n * @param array Source array\n * @param matches Search function\n * @returns Index of the item if found\n */\nexport function findIndex(array: ArrayLike, matches: (value: A, index: number) => boolean): number {\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tif (matches(array[i], i)) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * This is the same as `findIndex` except it searches from right to left.\n *\n * @param array Source array\n * @param matches Search function\n * @returns Index of the item if found\n */\nexport function findIndexReverse(array: ArrayLike, matches: (value: A, index: number) => boolean): number {\n\tlet i = array.length;\n\n\twhile (i > 0) {\n\t\t--i;\n\t\tif (matches(array[i], i)) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Searches the array using custom function and returns item if found.\n *\n * Will call `matches` function on all items of the array. If return value\n * evaluates to `true`, index is returned.\n *\n * Otherwise returns `undefined`.\n *\n * @param array Source array\n * @param matches Search function\n * @returns Item if found\n */\nexport function find(array: ArrayLike, matches: (value: A, index: number) => boolean): A | undefined {\n\tconst index = findIndex(array, matches);\n\n\tif (index !== -1) {\n\t\treturn array[index];\n\t}\n}\n\n/**\n * This is the same as `find` except it searches from right to left.\n *\n * @param array Source array\n * @param matches Search function\n * @returns Item if found\n */\nexport function findReverse(array: ArrayLike, matches: (value: A, index: number) => boolean): A | undefined {\n\tconst index = findIndexReverse(array, matches);\n\n\tif (index !== -1) {\n\t\treturn array[index];\n\t}\n}\n\n/**\n * Searches the array using custom function and returns item if found.\n *\n * Will call `matches` function on all items of the array. If value\n * is not `undefined`, it returns it.\n *\n * Otherwise returns `undefined`.\n *\n * @param array Source array\n * @param matches Search function\n * @returns Item if found\n */\nexport function findMap(array: ArrayLike, matches: (value: A, index: number) => B | undefined): B | undefined {\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tconst value = matches(array[i], i);\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t}\n}\n\n/**\n * Iterates through all items in array and calls `fn` function for each of\n * them.\n *\n * @param array Source array\n * @param fn Callback function\n */\nexport function shuffle(array: Array) {\n\t// https://stackoverflow.com/a/2450976/449477\n\tlet currentIndex = array.length,\n\t\ttemporaryValue,\n\t\trandomIndex;\n\n\t// While there remain elements to shuffle...\n\twhile (0 !== currentIndex) {\n\t\t// Pick a remaining element...\n\t\trandomIndex = Math.floor(Math.random() * currentIndex);\n\t\tcurrentIndex -= 1;\n\n\t\t// And swap it with the current element.\n\t\ttemporaryValue = array[currentIndex];\n\t\tarray[currentIndex] = array[randomIndex];\n\t\tarray[randomIndex] = temporaryValue;\n\t}\n}\n\n\nexport type Ordering = -1 | 0 | 1;\n\n/**\n * @ignore Exclude from docs\n * @todo Description\n */\nexport interface SortResult {\n\tfound: boolean;\n\tindex: number\n}\n\n/**\n * Orders an array using specific `ordering` function and returns right-most index of\n * the `value`.\n *\n * @ignore Exclude from docs\n * @param array Source array\n * @param ordering An ordering function\n * @returns Result of the search\n */\nexport function getSortedIndex(array: ArrayLike, ordering: (left: A) => Ordering): SortResult {\n\tlet start = 0;\n\tlet end = array.length;\n\tlet found = false;\n\n\twhile (start < end) {\n\t\t// TODO is this faster/slower than using Math.floor ?\n\t\tconst pivot = (start + end) >> 1;\n\n\t\tconst order = ordering(array[pivot]);\n\n\t\t// less\n\t\tif (order < 0) {\n\t\t\tstart = pivot + 1;\n\n\t\t// equal\n\t\t} else if (order === 0) {\n\t\t\tfound = true;\n\t\t\tstart = pivot + 1;\n\n\t\t// more\n\t\t} else {\n\t\t\tend = pivot;\n\t\t}\n\t}\n\n\treturn {\n\t\tfound: found,\n\t\tindex: (found ? start - 1 : start)\n\t};\n}\n\n\n/**\n * Orders an array using specific `ordering` function and returns left-most index of\n * the `value`.\n *\n * @ignore Exclude from docs\n * @param array Source array\n * @param ordering An ordering function\n * @returns Result of the search\n */\nexport function getFirstSortedIndex(array: ArrayLike, ordering: (left: A) => Ordering): SortResult {\n\tlet start = 0;\n\tlet end = array.length;\n\tlet found = false;\n\n\twhile (start < end) {\n\t\t// TODO is this faster/slower than using Math.floor ?\n\t\tconst pivot = (start + end) >> 1;\n\n\t\tconst order = ordering(array[pivot]);\n\n\t\t// less\n\t\tif (order < 0) {\n\t\t\tstart = pivot + 1;\n\n\t\t// equal\n\t\t} else if (order === 0) {\n\t\t\tfound = true;\n\t\t\tend = pivot;\n\n\t\t// more\n\t\t} else {\n\t\t\tend = pivot;\n\t\t}\n\t}\n\n\treturn {\n\t\tfound: found,\n\t\tindex: start\n\t};\n}\n\n\nexport function keepIf(array: Array, keep: (value: A) => boolean): void {\n\tlet length = array.length;\n\tlet i = 0;\n\n\twhile (i < length) {\n\t\tif (keep(array[i])) {\n\t\t\t++i;\n\n\t\t} else {\n\t\t\tarray.splice(i, 1);\n\t\t\t--length;\n\t\t}\n\t}\n}\n","import { range, Time } from \"./Animation\";\nimport * as $utils from \"./Utils\";\nimport * as $type from \"./Type\";\n\n/**\n * @ignore\n */\nfunction string2hex(string: string): number {\n\t//string = cssColorNames[string.toLowerCase()] || string;\n\n\tif (string[0] === \"#\") {\n\t\tstring = string.substr(1);\n\t}\n\tif (string.length == 3) {\n\t\tstring = string[0].repeat(2) + string[1].repeat(2) + string[2].repeat(2);\n\t}\n\n\treturn parseInt(string, 16);\n}\n\n/**\n * @ignore\n */\nexport function rgba2hex(color: string): number {\n\tcolor = color.replace(/[ ]/g, \"\");\n\n\t// Init\n\tlet matches: string[] | null = color.match(/^rgb\\(([0-9]*),([0-9]*),([0-9]*)\\)/i);\n\n\t// Try rgb() format\n\tif (matches) {\n\t\tmatches.push(\"1\");\n\n\t} else {\n\t\tmatches = color.match(/^rgba\\(([0-9]*),([0-9]*),([0-9]*),([.0-9]*)\\)/i);\n\n\t\tif (!matches) {\n\t\t\treturn 0x000000;\n\t\t}\n\t}\n\n\tlet hex = \"\";\n\tfor (let i = 1; i <= 3; i++) {\n\t\tlet val = parseInt(matches[i]).toString(16);\n\t\tif (val.length == 1) {\n\t\t\tval = \"0\" + val;\n\t\t}\n\t\thex += val;\n\t}\n\n\treturn string2hex(hex);\n\n}\n\n/**\n * Returns a new [[Color]] object base on input.\n *\n * Accepts parameters in CSS hex or rgb/rtba strings, or hex numbers.\n *\n * * `\"#f00\"`\n * * `\"#ff0000\"`\n * * `\"rgb(255, 0, 0)\"`\n * * `\"rgba(255, 0, 0, 1)\"`\n * * `0xff0000`\n * \n * @param input Input color\n * @return Color\n */\nexport function color(input: number | string): Color {\n\treturn Color.fromAny(input);\n}\n\n/**\n * Wherever color needs to be specified in amCharts 5, `Color` object needs to\n * be used.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/} for more info\n * @important\n */\nexport class Color {\n\tprotected _hex: number;\n\n\tprivate constructor(hex: number) {\n\t\tthis._hex = hex | 0;\n\t}\n\n\t/**\n\t * Color numeric value.\n\t */\n\tpublic get hex(): number {\n\t\treturn this._hex;\n\t}\n\n\t/**\n\t * Value of color's R channel.\n\t * @return R value\n\t */\n\tpublic get r(): number {\n\t\treturn this._hex >>> 16;\n\t}\n\n\t/**\n\t * Value of color's G channel.\n\t * @return G value\n\t */\n\tpublic get g(): number {\n\t\treturn (this._hex >> 8) & 0xFF;\n\t}\n\n\t/**\n\t * Value of color's B channel.\n\t * @return B value\n\t */\n\tpublic get b(): number {\n\t\treturn this._hex & 0xFF;\n\t}\n\n\t/**\n\t * Returns color CSS representation in form of `rgba(r, g, b, a)` string.\n\t * \n\t * @param alpha Opacity\n\t * @return CSS string\n\t */\n\tpublic toCSS(alpha: number = 1): string {\n\t\treturn \"rgba(\" + this.r + \", \" + this.g + \", \" + this.b + \", \" + alpha + \")\";\n\t}\n\n\t/**\n\t * Returns color CSS representation in form of `#rgb` string.\n\t * \n\t * @return CSS string\n\t */\n\tpublic toCSSHex(): string {\n\t\treturn \"#\" + $utils.padString(this.r.toString(16), 2) + $utils.padString(this.g.toString(16), 2) + $utils.padString(this.b.toString(16), 2);\n\t}\n\n\t/**\n\t * Returns color's HSL info.\n\t * @param alpha Opacity\n\t * @return HSL info\n\t */\n\tpublic toHSL(alpha: number = 1): $utils.iHSL {\n\t\treturn $utils.rgbToHsl({\n\t\t\tr: this.r,\n\t\t\tg: this.g,\n\t\t\tb: this.b,\n\t\t\ta: alpha\n\t\t})\n\t}\n\n\t/**\n\t * Converts HSL values into a new [[Color]] object.\n\t *\n\t * @param h H value\n\t * @param s S value\n\t * @param l L value\n\t * @return Color object\n\t */\n\tpublic static fromHSL(h: number, s: number, l: number): Color {\n\t\tconst rgb = $utils.hslToRgb({\n\t\t\th: h,\n\t\t\ts: s,\n\t\t\tl: l\n\t\t});\n\t\treturn this.fromRGB(rgb.r, rgb.g, rgb.b);\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.toCSSHex();\n\t}\n\n\t/**\n\t * Converts hex number into a new [[Color]] object.\n\t *\n\t * ```TypeScript\n\t * Color.fromHex(0xff0000) // red\n\t * ```\n\t * ```JavaScript\n\t * Color.fromHex(0xff0000) // red\n\t * ```\n\t *\n\t * @param hex Hex color\n\t * @return Color\n\t */\n\tpublic static fromHex(hex: number): Color {\n\t\treturn new Color(hex);\n\t}\n\n\t/**\n\t * Converts RGB values to a new [[Color]] object.\n\t *\n\t * @param r R value\n\t * @param g G value\n\t * @param b B value\n\t * @return Color\n\t */\n\tpublic static fromRGB(r: number, g: number, b: number): Color {\n\t\treturn new Color((b | 0) + (g << 8) + (r << 16));\n\t}\n\n\t/**\n\t * Converts RGB string to a new [[Color]] object.\n\t *\n\t * ```TypeScript\n\t * Color.fromString(\"#ff0000\") // red\n\t * ```\n\t * ```JavaScript\n\t * Color.fromString(\"#ff0000\") // red\n\t * ```\n\t *\n\t * @param s RGB string\n\t * @return Color\n\t */\n\tpublic static fromString(s: string): Color {\n\t\treturn new Color(string2hex(s));\n\t}\n\n\t/**\n\t * Converts CSS rgba() syntax to a new [[Color]] object.\n\t *\n\t * ```TypeScript\n\t * Color.fromCSS(\"rgba(255, 0, 0, 1)\") // red\n\t * ```\n\t * ```JavaScript\n\t * Color.fromCSS(\"rgba(255, 0, 0, 1)\") // red\n\t * ```\n\t *\n\t * @param {string} s [description]\n\t * @return {Color} [description]\n\t */\n\tpublic static fromCSS(s: string): Color {\n\t\treturn new Color(rgba2hex(s));\n\t}\n\n\t/**\n\t * Convert to color from virtually anything.\n\t *\n\t * Will throw an exception if unable to resolve the color.\n\t *\n\t * @param s Source\n\t * @return Color\n\t */\n\tpublic static fromAny(s: string | number | Color): Color {\n\t\tif ($type.isString(s)) {\n\t\t\tif (s[0] == \"#\") {\n\t\t\t\treturn Color.fromString(s);\n\t\t\t}\n\t\t\telse if (s.substr(0, 3) == \"rgb\") {\n\t\t\t\treturn Color.fromCSS(s);\n\t\t\t}\n\t\t}\n\t\telse if ($type.isNumber(s)) {\n\t\t\treturn Color.fromHex(s);\n\t\t}\n\t\telse if (s instanceof Color) {\n\t\t\treturn Color.fromHex(s.hex);\n\t\t}\n\n\t\tthrow new Error(\"Unknown color syntax: \" + s);\n\t}\n\n\t/**\n\t * Returns a new [[Color]] object based on either `lightAlternative` or\n\t * `darkAlternative` depending on which one is more contrasting with\n\t * the `color`.\n\t *\n\t * @param color Reference color\n\t * @param lightAlternative Light color\n\t * @param darkAlternative Dark color\n\t * @return Alternative color\n\t */\n\tpublic static alternative(color: Color, lightAlternative?: Color, darkAlternative?: Color): Color {\n\t\tconst rgb = $utils.alternativeColor(\n\t\t\t{ r: color.r, g: color.g, b: color.b },\n\t\t\tlightAlternative ? { r: lightAlternative.r, g: lightAlternative.g, b: lightAlternative.b } : undefined,\n\t\t\tdarkAlternative ? { r: darkAlternative.r, g: darkAlternative.g, b: darkAlternative.b } : undefined\n\t\t);\n\t\treturn this.fromRGB(rgb.r, rgb.g, rgb.b);\n\t}\n\n\t/**\n\t * Returns an intermediate Color between two reference colors depending on\n\t * the progress (`diff`) between the two.\n\t *\n\t * @param diff Progress\n\t * @param from Source color\n\t * @param to Target color\n\t * @param mode Interpolation mode\n\t * @return Color\n\t */\n\tpublic static interpolate(diff: Time, from: Color, to: Color, mode: \"rgb\" | \"hsl\" = \"rgb\"): Color {\n\t\tif (mode == \"hsl\") {\n\t\t\tconst fromHSL = from.toHSL();\n\t\t\tconst toHSL = to.toHSL();\n\t\t\treturn Color.fromHSL(\n\t\t\t\trange(diff, fromHSL.h, toHSL.h),\n\t\t\t\trange(diff, fromHSL.s, toHSL.s),\n\t\t\t\trange(diff, fromHSL.l, toHSL.l)\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\treturn Color.fromRGB(\n\t\t\t\trange(diff, from.r, to.r),\n\t\t\t\trange(diff, from.g, to.g),\n\t\t\t\trange(diff, from.b, to.b)\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a new [[Color]] lightened by `percent` value.\n\t *\n\t * Use negative value to darken the color.\n\t *\n\t * @param color Source color\n\t * @param percent Percent\n\t * @return New color\n\t */\n\tpublic static lighten(color: Color, percent: number): Color {\n\t\tconst rgb = $utils.lighten({ r: color.r, g: color.g, b: color.b }, percent);\n\t\treturn Color.fromRGB(rgb!.r, rgb!.g, rgb!.b);\n\t}\n\n\t/**\n\t * Returns a new [[Color]] brightened by `percent` value.\n\t *\n\t * Use negative value to dim the color.\n\t *\n\t * @param color Source color\n\t * @param percent Percent\n\t * @return New color\n\t */\n\tpublic static brighten(color: Color, percent: number): Color {\n\t\tconst rgb = $utils.brighten({ r: color.r, g: color.g, b: color.b }, percent);\n\t\treturn Color.fromRGB(rgb!.r, rgb!.g, rgb!.b);\n\t}\n\n\t/**\n\t * Returns a new [[Color]] saturated by `percent` value.\n\t *\n\t * Use negative value to desaturate the color.\n\t *\n\t * @param color Source color\n\t * @param percent Percent\n\t * @return New color\n\t */\n\tpublic static saturate(color: Color, percent: number): Color {\n\t\tconst rgb = $utils.saturate({ r: color.r, g: color.g, b: color.b }, percent);\n\t\treturn Color.fromRGB(rgb!.r, rgb!.g, rgb!.b);\n\t}\n}\n","import { Entity, IEntitySettings, IEntityPrivate } from \"./Entity\";\nimport { Color } from \"./Color\";\n\n\nexport interface IColorSetSettings extends IEntitySettings {\n\n\t/**\n\t * List of colors in the set.\n\t */\n\tcolors?: Color[];\n\n\t/**\n\t * A step size when using `next()`.\n\t *\n\t * E.g. setting to `2` will make it return every second color in the list.\n\t *\n\t * @default 1\n\t */\n\tstep?: number;\n\n\t/**\n\t * Start iterating colors from specific index.\n\t */\n\tstartIndex?: number;\n\n\t/**\n\t * If set to `true`, color set will reuse existing colors from the list\n\t * inestead of generating new ones.\n\t *\n\t * @default false\n\t */\n\treuse?: boolean;\n\n\t/**\n\t * A base color to generate new colors from if `colors` is not specified.\n\t * @type {[type]}\n\t */\n\tbaseColor?: Color;\n\n\t/**\n\t * A set of tranformation to apply to base list of colors when the set runs\n\t * out of colors and generates additional ones.\n\t */\n\tpassOptions?: IColorSetStepOptions;\n\n\t/**\n\t * If set, each returned color will be applied saturation.\n\t */\n\tsaturation?: number;\n\n\t// count?: number;\n}\n\nexport interface IColorSetPrivate extends IEntityPrivate {\n\n\tcurrentStep?: number;\n\tcurrentPass?: number;\n\n\t/**\n\t * @ignore\n\t */\n\tnumColors?: number;\n\n}\n\nexport interface IColorSetStepOptions {\n\n\t/**\n\t * Value to add to \"hue\".\n\t */\n\thue?: number;\n\n\t/**\n\t * Value to add to \"saturation\".\n\t */\n\tsaturation?: number;\n\n\t/**\n\t * Value to add to \"lightness\".\n\t */\n\tlightness?: number;\n\n}\n\n\n/**\n * An object which holds list of colors and can generate new ones.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/#Color_sets} for more info\n */\nexport class ColorSet extends Entity {\n\tpublic static className: string = \"ColorSet\";\n\tpublic static classNames: Array = Entity.classNames.concat([ColorSet.className]);\n\n\tdeclare public _settings: IColorSetSettings;\n\tdeclare public _privateSettings: IColorSetPrivate;\n\n\t//protected _currentPass: number = 0;\n\n\tprotected _afterNew() {\n\t\t// Applying themes because color set will not have parent\n\t\tsuper._afterNewApplyThemes();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic generateColors(): void {\n\t\tthis.setPrivate(\"currentPass\", this.getPrivate(\"currentPass\", 0) + 1)\n\t\tconst pass = this.getPrivate(\"currentPass\");\n\t\tconst colors = this.get(\"colors\", [this.get(\"baseColor\", Color.fromHex(0xff0000))]);\n\t\tif (!this.getPrivate(\"numColors\")) {\n\t\t\tthis.setPrivate(\"numColors\", colors.length);\n\t\t}\n\t\t//const len = colors.length;\n\t\tconst len = this.getPrivate(\"numColors\")!;\n\t\t//const start = len - this.getPrivate(\"numColors\")!;\n\t\tconst start = 0;\n\t\tconst passOptions = this.get(\"passOptions\")!;\n\t\tconst reuse = this.get(\"reuse\");\n\t\tfor (let i = start; i < len; i++) {\n\t\t\tif (reuse) {\n\t\t\t\tcolors.push(colors[i])\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst hsl = colors[i]!.toHSL();\n\t\t\t\tlet h = hsl.h + (passOptions.hue || 0) * pass!;\n\t\t\t\twhile (h > 1) h -= 1;\n\n\t\t\t\tlet s = hsl.s + (passOptions.saturation || 0) * pass!;\n\t\t\t\t//if (s > 1) s -= Math.floor(s);\n\t\t\t\tif (s > 1) s = 1;\n\t\t\t\tif (s < 0) s = 0;\n\n\t\t\t\tlet l = hsl.l + (passOptions.lightness || 0) * pass!;\n\t\t\t\t//if (l > 1) l -= Math.floor(l);\n\t\t\t\twhile (l > 1) l -= 1;\n\t\t\t\tcolors.push(Color.fromHSL(h, s, l));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a [[Color]] at specific index.\n\t *\n\t * If there's no color at this index, a new color is generated.\n\t *\n\t * @param index Index\n\t * @return Color\n\t */\n\tpublic getIndex(index: number): Color {\n\t\tconst colors = this.get(\"colors\", []);\n\t\tconst saturation = this.get(\"saturation\");\n\t\tif (index >= colors.length) {\n\t\t\tthis.generateColors();\n\t\t\treturn this.getIndex(index);\n\t\t}\n\n\t\treturn saturation != null ? Color.saturate(colors[index], saturation!) : colors[index];\n\t}\n\n\t/**\n\t * Returns next [[Color]] in the list.\n\t *\n\t * If the list is out of colors, new ones are generated dynamically.\n\t */\n\tpublic next() {\n\t\tlet currentStep = this.getPrivate(\"currentStep\", this.get(\"startIndex\", 0));\n\t\tthis.setPrivate(\"currentStep\", currentStep + this.get(\"step\", 1));\n\t\treturn this.getIndex(currentStep);\n\t}\n\n\t/**\n\t * Resets counter to the start of the list, so the next call for `next()` will\n\t * return the first color.\n\t */\n\tpublic reset() {\n\t\tthis.setPrivate(\"currentStep\", this.get(\"startIndex\", 0));\n\t}\n}\n","import type { ICounterRef } from \"./Counter\";\nimport { List } from \"./List\";\nimport type { DataProcessor } from \"./DataProcessor\";\n\n/**\n * Defines interface for a [[List]] with a data processor.\n */\nexport interface IDataWithProcessor {\n\n\t/**\n\t * An optional processor for data.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/data/#Pre_processing_data} for more info\n\t */\n\tprocessor?: DataProcessor;\n\n}\n\n/**\n * A [[List]] that holds components data.\n * \n * @see {@link https://www.amcharts.com/docs/v5/concepts/data/} for more info\n */\nexport class ListData extends List implements ICounterRef, IDataWithProcessor {\n\n\t/**\n\t * @ignore\n\t */\n\tpublic incrementRef(): void { }\n\n\t/**\n\t * @ignore\n\t */\n\tpublic decrementRef(): void { }\n\n\t/**\n\t * An optional processor for data.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/data/#Pre_processing_data} for more info\n\t */\n\tpublic processor?: DataProcessor;\n\n\tprotected _onPush(newValue: T) {\n\t\tif (this.processor) {\n\t\t\tthis.processor.processRow(newValue);\n\t\t\t//console.log(newValue)\n\t\t}\n\t\tsuper._onPush(newValue);\n\t}\n\n\tprotected _onInsertIndex(index: number, newValue: T) {\n\t\tif (this.processor) {\n\t\t\tthis.processor.processRow(newValue);\n\t\t}\n\t\tsuper._onInsertIndex(index, newValue);\n\t}\n\n\tprotected _onSetIndex(index: number, oldValue: T, newValue: T) {\n\t\tif (this.processor) {\n\t\t\tthis.processor.processRow(newValue);\n\t\t}\n\t\tsuper._onSetIndex(index, oldValue, newValue);\n\t}\n}\n\n/**\n * @deprecated\n * @todo remove\n */\nexport class JsonData implements ICounterRef, IDataWithProcessor {\n\tpublic incrementRef(): void { }\n\tpublic decrementRef(): void { }\n\n\tpublic processor?: DataProcessor;\n\tprotected _value: T;\n\n\tconstructor(value: T) {\n\t\tthis._value = value;\n\t}\n\n\t// TODO: how do we go about calling processor here?\n\n}\n","import type { ILocaleSettings } from \"./Language\"\n\nimport { Entity, IEntitySettings, IEntityPrivate } from \"./Entity\"\nimport { TextFormatter } from \"./TextFormatter\"\n\nimport * as $type from \"./Type\"\nimport * as $utils from \"./Utils\";\n\n/**\n * Interface describing parsed date format definition.\n *\n * @ignore\n */\nexport interface DateFormatInfo {\n\t\"template\": string;\n\t\"parts\": any[];\n}\n\nexport interface IDateFormatterSettings extends IEntitySettings {\n\n\t/**\n\t * Should the first letter of the formatted date be capitalized?\n\t *\n\t * @default true\n\t */\n\tcapitalize?: boolean;\n\n\t/**\n\t * A date format to be used when formatting dates.\n\t * \n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-dates/} for more info\n\t */\n\tdateFormat?: string | Intl.DateTimeFormatOptions;\n\n\t/**\n\t * An array of data fields that hold date values and should be formatted\n\t * with a [[DateFormatter]].\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/data-placeholders/#Formatting_placeholders} for more info\n\t */\n\tdateFields?: string[];\n\n\t/**\n\t * Locales to use when formatting using `Intl.DateFormatter`.\n\t */\n\tintlLocales?: string;\n\n}\n\nexport interface IDateFormatterPrivate extends IEntityPrivate {\n}\n\ntype Months = \"January\" | \"February\" | \"March\" | \"April\" | \"May\" | \"June\" | \"July\" | \"August\" | \"September\" | \"October\" | \"November\" | \"December\";\ntype ShortMonths = \"Jan\" | \"Feb\" | \"Mar\" | \"Apr\" | \"May(short)\" | \"Jun\" | \"Jul\" | \"Aug\" | \"Sep\" | \"Oct\" | \"Nov\" | \"Dec\";\ntype Weekdays = \"Sunday\" | \"Monday\" | \"Tuesday\" | \"Wednesday\" | \"Thursday\" | \"Friday\" | \"Saturday\";\ntype ShortWeekdays = \"Sun\" | \"Mon\" | \"Tue\" | \"Wed\" | \"Thu\" | \"Fri\" | \"Sat\";\n\nexport class DateFormatter extends Entity {\n\tdeclare public _settings: IDateFormatterSettings;\n\tdeclare public _privateSettings: IDateFormatterPrivate;\n\n\tprotected _setDefaults() {\n\t\t// Defaults\n\t\tthis._setDefault(\"capitalize\", true);\n\t\tthis._setDefault(\"dateFormat\", \"yyyy-MM-dd\");\n\n\t\tsuper._setDefaults();\n\t}\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\t}\n\n\tpublic format(source: any, format?: string | Intl.DateTimeFormatOptions): string {\n\n\t\t// Locale?\n\t\t// TODO\n\n\t\t// No format passed in or it's empty\n\t\tif (typeof format === \"undefined\" || format === \"\") {\n\t\t\tformat = this.get(\"dateFormat\", \"yyyy-MM-dd\");\n\t\t}\n\n\t\t// Init return value\n\t\tlet formatted;\n\n\t\t// Cast?\n\t\t// TODO: decide if we need to cast\n\t\tlet date: Date = source;\n\n\t\t// Is it a built-in format or Intl.DateTimeFormat\n\t\tif ($type.isObject(format)) {\n\n\t\t\ttry {\n\t\t\t\tconst locales = this.get(\"intlLocales\");\n\t\t\t\tif (locales) {\n\t\t\t\t\treturn new Intl.DateTimeFormat(locales, format).format(date);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn new Intl.DateTimeFormat(undefined, format).format(date);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\treturn \"Invalid\";\n\t\t\t}\n\n\t\t}\n\n\t\t// get format info (it will also deal with parser caching)\n\t\tlet info = this.parseFormat(format);\n\n\t\t// Should we apply custom time zone?\n\t\t// TODO\n\t\t// if (this.timezoneOffset != null) {\n\t\t// \tdate.setMinutes(date.getMinutes() + date.getTimezoneOffset() - this.timezoneOffset);\n\t\t// }\n\t\t// else if (this.timezone != null) {\n\t\t// \tdate = $time.setTimezone(date, this.timezone);\n\t\t// }\n\n\t\t// Check if it's a valid date\n\t\tif (!$type.isNumber(date.getTime())) {\n\t\t\t// TODO translation\n\t\t\t//return this._t(\"Invalid date\");\n\t\t\treturn \"Invalid date\";\n\t\t}\n\n\t\t// Apply format\n\t\tformatted = this.applyFormat(date, info);\n\n\t\t// Capitalize\n\t\tif (this.get(\"capitalize\")) {\n\t\t\tformatted = formatted.replace(\n\t\t\t\t/^.{1}/, formatted.substr(0, 1).toUpperCase()\n\t\t\t);\n\t\t}\n\n\t\t// We're done\n\t\treturn formatted;\n\t}\n\n\t/**\n\t * Applies format to Date.\n\t *\n\t * @param date Date object\n\t * @param info Parsed format information\n\t * @return Formatted date string\n\t */\n\tprotected applyFormat(date: Date, info: DateFormatInfo): string {\n\n\t\t// Init return value\n\t\tlet res = info.template;\n\n\t\t// Get values\n\t\tlet fullYear: number,\n\t\t\tmonth: number,\n\t\t\tweekday: number,\n\t\t\tday: number,\n\t\t\thours: number,\n\t\t\tminutes: number,\n\t\t\tseconds: number,\n\t\t\tmilliseconds: number,\n\t\t\toffset: number = date.getTimezoneOffset(),\n\t\t\ttimestamp: number = date.getTime();\n\t\tif (this._root.utc) {\n\t\t\tfullYear = date.getUTCFullYear();\n\t\t\tmonth = date.getUTCMonth();\n\t\t\tweekday = date.getUTCDay();\n\t\t\tday = date.getUTCDate();\n\t\t\thours = date.getUTCHours();\n\t\t\tminutes = date.getUTCMinutes();\n\t\t\tseconds = date.getUTCSeconds();\n\t\t\tmilliseconds = date.getUTCMilliseconds();\n\t\t}\n\t\telse {\n\t\t\tfullYear = date.getFullYear();\n\t\t\tmonth = date.getMonth();\n\t\t\tweekday = date.getDay();\n\t\t\tday = date.getDate();\n\t\t\thours = date.getHours();\n\t\t\tminutes = date.getMinutes();\n\t\t\tseconds = date.getSeconds();\n\t\t\tmilliseconds = date.getMilliseconds();\n\t\t}\n\n\t\t// Go through each part and format/replace it in template\n\t\tfor (let i = 0, len = info.parts.length; i < len; i++) {\n\t\t\tlet value: string = \"\";\n\t\t\tswitch (info.parts[i]) {\n\n\t\t\t\tcase \"G\":\n\t\t\t\t\tvalue = this._t(\n\t\t\t\t\t\tfullYear < 0\n\t\t\t\t\t\t\t? \"_era_bc\"\n\t\t\t\t\t\t\t: \"_era_ad\"\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"yyyy\":\n\t\t\t\t\tvalue = Math.abs(fullYear).toString();\n\t\t\t\t\tif (fullYear < 0) {\n\t\t\t\t\t\tvalue += this._t(\"_era_bc\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"yyy\":\n\t\t\t\tcase \"yy\":\n\t\t\t\tcase \"y\":\n\t\t\t\t\tvalue = Math.abs(fullYear).toString().substr(-info.parts[i].length);\n\t\t\t\t\tif (fullYear < 0) {\n\t\t\t\t\t\tvalue += this._t(\"_era_bc\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"YYYY\":\n\t\t\t\tcase \"YYY\":\n\t\t\t\tcase \"YY\":\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tlet week = $utils.getWeek(date);\n\t\t\t\t\tlet year = fullYear;\n\t\t\t\t\tif (week == 1 && (weekday > 4)) {\n\t\t\t\t\t\tyear--;\n\t\t\t\t\t}\n\t\t\t\t\tif (info.parts[i] == \"YYYY\") {\n\t\t\t\t\t\tvalue = Math.abs(year).toString();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalue = Math.abs(year).toString().substr(-info.parts[i].length);\n\t\t\t\t\t}\n\t\t\t\t\tif (year < 0) {\n\t\t\t\t\t\tvalue += this._t(\"_era_bc\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"u\":\n\t\t\t\t\t// @todo\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"q\":\n\t\t\t\t\tvalue = \"\" + Math.ceil((date.getMonth() + 1) / 3);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MMMMM\":\n\t\t\t\t\tvalue = this._t(this._getMonth(month)).substr(0, 1);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MMMM\":\n\t\t\t\t\tvalue = this._t(this._getMonth(month));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MMM\":\n\t\t\t\t\tvalue = this._t(this._getShortMonth(month));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MM\":\n\t\t\t\t\tvalue = $utils.padString(month + 1, 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"M\":\n\t\t\t\t\tvalue = (month + 1).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ww\":\n\t\t\t\t\tvalue = $utils.padString($utils.getWeek(date, this._root.utc), 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"w\":\n\t\t\t\t\tvalue = $utils.getWeek(date, this._root.utc).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"W\":\n\t\t\t\t\tvalue = $utils.getMonthWeek(date, this._root.utc).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"dd\":\n\t\t\t\t\tvalue = $utils.padString(day, 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"d\":\n\t\t\t\t\tvalue = day.toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"DD\":\n\t\t\t\tcase \"DDD\":\n\t\t\t\t\tvalue = $utils.padString($utils.getYearDay(date, this._root.utc).toString(), info.parts[i].length, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"D\":\n\t\t\t\t\tvalue = $utils.getYearDay(date, this._root.utc).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"F\":\n\t\t\t\t\t// @todo\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"g\":\n\t\t\t\t\t// @todo\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"t\":\n\t\t\t\t\tvalue = this._root.language.translateFunc(\"_dateOrd\").call(this, day);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"E\":\n\t\t\t\t\tvalue = (weekday || 7).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"EE\":\n\t\t\t\t\tvalue = $utils.padString((weekday || 7).toString(), 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"EEE\":\n\t\t\t\tcase \"eee\":\n\t\t\t\t\tvalue = this._t(this._getShortWeekday(weekday));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"EEEE\":\n\t\t\t\tcase \"eeee\":\n\t\t\t\t\tvalue = this._t(this._getShortWeekday(weekday));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"EEEEE\":\n\t\t\t\tcase \"eeeee\":\n\t\t\t\t\tvalue = this._t(this._getShortWeekday(weekday)).substr(0, 1);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"e\":\n\t\t\t\tcase \"ee\":\n\t\t\t\t\tvalue = (weekday - (this._root.locale.firstDayOfWeek || 1) + 1).toString();\n\t\t\t\t\tif (info.parts[i] == \"ee\") {\n\t\t\t\t\t\tvalue = $utils.padString(value, 2, \"0\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"a\":\n\t\t\t\t\tif (hours >= 12) {\n\t\t\t\t\t\tvalue = this._t(\"PM\");\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalue = this._t(\"AM\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"aa\":\n\t\t\t\t\tif (hours >= 12) {\n\t\t\t\t\t\tvalue = this._t(\"P.M.\");\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalue = this._t(\"A.M.\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"aaa\":\n\t\t\t\t\tif (hours >= 12) {\n\t\t\t\t\t\tvalue = this._t(\"P\");\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalue = this._t(\"A\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"h\":\n\t\t\t\t\tvalue = $utils.get12Hours(hours).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"hh\":\n\t\t\t\t\tvalue = $utils.padString($utils.get12Hours(hours), 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"H\":\n\t\t\t\t\tvalue = hours.toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"HH\":\n\t\t\t\t\tvalue = $utils.padString(hours, 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"K\":\n\t\t\t\t\tvalue = $utils.get12Hours(hours, 0).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"KK\":\n\t\t\t\t\tvalue = $utils.padString($utils.get12Hours(hours, 0), 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"k\":\n\t\t\t\t\tvalue = (hours + 1).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"kk\":\n\t\t\t\t\tvalue = $utils.padString(hours + 1, 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"m\":\n\t\t\t\t\tvalue = minutes.toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"mm\":\n\t\t\t\t\tvalue = $utils.padString(minutes, 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"s\":\n\t\t\t\t\tvalue = seconds.toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ss\":\n\t\t\t\t\tvalue = $utils.padString(seconds, 2, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"S\":\n\t\t\t\tcase \"SS\":\n\t\t\t\tcase \"SSS\":\n\t\t\t\t\tvalue = Math.round((milliseconds / 1000) * Math.pow(10, info.parts[i].length)).toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"x\":\n\t\t\t\t\tvalue = timestamp.toString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"n\":\n\t\t\t\tcase \"nn\":\n\t\t\t\tcase \"nnn\":\n\t\t\t\t\tvalue = $utils.padString(milliseconds, info.parts[i].length, \"0\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"z\":\n\t\t\t\t\tvalue = $utils.getTimeZone(date, false, false, this._root.utc);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"zz\":\n\t\t\t\t\tvalue = $utils.getTimeZone(date, true, false, this._root.utc);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"zzz\":\n\t\t\t\t\tvalue = $utils.getTimeZone(date, false, true, this._root.utc);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"zzzz\":\n\t\t\t\t\tvalue = $utils.getTimeZone(date, true, true, this._root.utc);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"Z\":\n\t\t\t\tcase \"ZZ\":\n\t\t\t\t\tlet tz = Math.abs(offset) / 60;\n\t\t\t\t\tlet tzh = Math.floor(tz);\n\t\t\t\t\tlet tzm = tz * 60 - tzh * 60;\n\n\t\t\t\t\tif (this._root.utc) {\n\t\t\t\t\t\ttzh = 0;\n\t\t\t\t\t\ttzm = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (info.parts[i] == \"Z\") {\n\t\t\t\t\t\tvalue = \"GMT\";\n\t\t\t\t\t\tvalue += offset > 0 ? \"-\" : \"+\";\n\t\t\t\t\t\tvalue += $utils.padString(tzh, 2) + \":\" + $utils.padString(tzm, 2);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalue = offset > 0 ? \"-\" : \"+\";\n\t\t\t\t\t\tvalue += $utils.padString(tzh, 2) + $utils.padString(tzm, 2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"i\":\n\t\t\t\t\tvalue = date.toISOString();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"I\":\n\t\t\t\t\tvalue = date.toUTCString();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t\tres = res.replace($type.PLACEHOLDER, value);\n\t\t}\n\n\t\treturn res;\n\t}\n\n\t/**\n\t * Parses format into structured infromation.\n\t *\n\t * @param format Format template\n\t */\n\tprotected parseFormat(format: string): DateFormatInfo {\n\n\t\t// Check cache\n\t\t// TODO: implement caching of the parsed format\n\n\t\t// Init format parse info holder\n\t\tlet info: DateFormatInfo = {\n\t\t\t\"template\": \"\",\n\t\t\t\"parts\": []\n\t\t};\n\n\t\t// Let TextFormatter split into chunks\n\t\tlet chunks = TextFormatter.chunk(format, true);\n\t\tfor (let i: number = 0; i < chunks.length; i++) {\n\t\t\tlet chunk = chunks[i];\n\n\t\t\tif (chunk.type === \"value\") {\n\n\t\t\t\t// Just \"Date\"?\n\t\t\t\tif (chunk.text.match(/^date$/i)) {\n\t\t\t\t\tlet dateFormat = this.get(\"dateFormat\", \"yyyy-MM-dd\");\n\t\t\t\t\tif (!$type.isString(dateFormat)) {\n\t\t\t\t\t\tdateFormat = \"yyyy-MM-dd\";\n\t\t\t\t\t}\n\t\t\t\t\tchunk.text = dateFormat;\n\t\t\t\t}\n\n\t\t\t\t// Find all possible parts\n\t\t\t\tlet matches = chunk.text.match(/G|yyyy|yyy|yy|y|YYYY|YYY|YY|Y|u|q|MMMMM|MMMM|MMM|MM|M|ww|w|W|dd|d|DDD|DD|D|F|g|EEEEE|EEEE|EEE|EE|E|eeeee|eeee|eee|ee|e|aaa|aa|a|hh|h|HH|H|KK|K|kk|k|mm|m|ss|s|SSS|SS|S|A|zzzz|zzz|zz|z|ZZ|Z|t|x|nnn|nn|n|i|I/g);\n\n\t\t\t\t// Found?\n\t\t\t\tif (matches) {\n\n\t\t\t\t\t// Populate template\n\t\t\t\t\tfor (let x = 0; x < matches.length; x++) {\n\t\t\t\t\t\tinfo.parts.push(matches[x]);\n\t\t\t\t\t\tchunk.text = chunk.text.replace(matches[x], $type.PLACEHOLDER);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply to template\n\t\t\tinfo.template += chunk.text;\n\t\t}\n\n\t\t// Save cache\n\t\t// TODO\n\n\t\treturn info;\n\t}\n\n\tprotected _months(): Months[] {\n\t\treturn [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n\t}\n\n\tprotected _getMonth(index: number): Months {\n\t\treturn this._months()[index];\n\t}\n\n\tprotected _shortMonths(): ShortMonths[] {\n\t\treturn [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May(short)\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\t}\n\n\tprotected _getShortMonth(index: number): ShortMonths {\n\t\treturn this._shortMonths()[index];\n\t}\n\n\tprotected _weekdays(): Weekdays[] {\n\t\treturn [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\t}\n\n\tprotected _getWeekday(index: number): Weekdays {\n\t\treturn this._weekdays()[index];\n\t}\n\n\tprotected _shortWeekdays(): ShortWeekdays[] {\n\t\treturn [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\t}\n\n\tprotected _getShortWeekday(index: number): ShortWeekdays {\n\t\treturn this._shortWeekdays()[index];\n\t}\n\n\tpublic parse(source: any, format: string): Date {\n\n\t\t// Is it already a Date\n\t\tif (source instanceof Date) {\n\t\t\treturn source;\n\t\t}\n\n\t\t// Is it a numeric timestamp\n\t\tif ($type.isNumber(source)) {\n\t\t\treturn new Date(source);\n\t\t}\n\n\t\t// No? Let's check if it's string, and try converting to it if nec\n\t\tif (!$type.isString(source)) {\n\t\t\tsource = source.toString();\n\t\t}\n\n\t\t// Init return value\n\t\tlet res: Date;\n\n\t\t// Init RegEx for parsing\n\t\tlet reg: string = \"\";\n\n\t\t// Clean format\n\t\tformat = $utils.cleanFormat(format);\n\n\t\t// Clip format to length of the source string\n\t\tformat = format.substr(0, source.length);\n\n\t\t// Parse format\n\t\tlet info = this.parseFormat(format);\n\n\t\t// Init parsed items holder\n\t\tlet parsedIndexes = {\n\t\t\t\"year\": -1,\n\t\t\t\"year3\": -1,\n\t\t\t\"year2\": -1,\n\t\t\t\"year1\": -1,\n\t\t\t\"month\": -1,\n\t\t\t\"monthShort\": -1,\n\t\t\t\"monthLong\": -1,\n\t\t\t\"weekdayShort\": -1,\n\t\t\t\"weekdayLong\": -1,\n\t\t\t\"day\": -1,\n\t\t\t\"yearDay\": -1,\n\t\t\t\"week\": -1,\n\t\t\t\"hourBase0\": -1,\n\t\t\t\"hour12Base0\": -1,\n\t\t\t\"hourBase1\": -1,\n\t\t\t\"hour12Base1\": -1,\n\t\t\t\"minute\": -1,\n\t\t\t\"second\": -1,\n\t\t\t\"millisecond\": -1,\n\t\t\t\"millisecondDigits\": -1,\n\t\t\t\"am\": -1,\n\t\t\t\"zone\": -1,\n\t\t\t\"timestamp\": -1,\n\t\t\t\"iso\": -1\n\t\t};\n\n\t\t// Init values\n\t\tlet resValues = {\n\t\t\t\"year\": 1970,\n\t\t\t\"month\": 0,\n\t\t\t\"day\": 1,\n\t\t\t\"hour\": 0,\n\t\t\t\"minute\": 0,\n\t\t\t\"second\": 0,\n\t\t\t\"millisecond\": 0,\n\t\t\t\"timestamp\": null,\n\t\t\t\"offset\": 0,\n\t\t\t\"utc\": this._root.utc\n\t\t}\n\n\t\t// Index adjuster\n\t\tlet indexAdjust: number = 0;\n\t\tlet index: number = 0;\n\n\t\t// Iterate through all of the parts\n\t\tfor (let i: number = 0; i < info.parts.length; i++) {\n\n\t\t\t// Set current match index\n\t\t\tindex = i + indexAdjust + 1;\n\n\t\t\tswitch (info.parts[i]) {\n\n\t\t\t\tcase \"yyyy\":\n\t\t\t\tcase \"YYYY\":\n\t\t\t\t\treg += \"([0-9]{4})\";\n\t\t\t\t\tparsedIndexes.year = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"yyy\":\n\t\t\t\tcase \"YYY\":\n\t\t\t\t\treg += \"([0-9]{3})\";\n\t\t\t\t\tparsedIndexes.year3 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"yy\":\n\t\t\t\tcase \"YY\":\n\t\t\t\t\treg += \"([0-9]{2})\";\n\t\t\t\t\tparsedIndexes.year2 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"y\":\n\t\t\t\tcase \"Y\":\n\t\t\t\t\treg += \"([0-9]{1})\";\n\t\t\t\t\tparsedIndexes.year1 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MMMM\":\n\t\t\t\t\treg += \"(\" + this.getStringList(this._months()).join(\"|\") + \")\";\n\t\t\t\t\tparsedIndexes.monthLong = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MMM\":\n\t\t\t\t\treg += \"(\" + this.getStringList(this._shortMonths()).join(\"|\") + \")\";\n\t\t\t\t\tparsedIndexes.monthShort = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"MM\":\n\t\t\t\tcase \"M\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.month = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ww\":\n\t\t\t\tcase \"w\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.week = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"dd\":\n\t\t\t\tcase \"d\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.day = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"DDD\":\n\t\t\t\tcase \"DD\":\n\t\t\t\tcase \"D\":\n\t\t\t\t\treg += \"([0-9]{3}|[0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.yearDay = index;\n\t\t\t\t\tbreak;\n\n\n\t\t\t\tcase \"dddd\":\n\t\t\t\t\treg += \"(\" + this.getStringList(this._weekdays()).join(\"|\") + \")\";\n\t\t\t\t\tparsedIndexes.weekdayLong = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ddd\":\n\t\t\t\t\treg += \"(\" + this.getStringList(this._shortWeekdays()).join(\"|\") + \")\";\n\t\t\t\t\tparsedIndexes.weekdayShort = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"aaa\":\n\t\t\t\tcase \"aa\":\n\t\t\t\tcase \"a\":\n\t\t\t\t\t// TODO: fix (escape regex)\n\t\t\t\t\treg += \"(\" + this.getStringList([\"AM\", \"PM\", \"A\\.M\\.\", \"P\\.M\\.\", \"A\", \"P\"]).join(\"|\") + \")\";\n\t\t\t\t\tparsedIndexes.am = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"hh\":\n\t\t\t\tcase \"h\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.hour12Base1 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"HH\":\n\t\t\t\tcase \"H\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.hourBase0 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"KK\":\n\t\t\t\tcase \"K\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.hour12Base0 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"kk\":\n\t\t\t\tcase \"k\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.hourBase1 = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"mm\":\n\t\t\t\tcase \"m\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.minute = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ss\":\n\t\t\t\tcase \"s\":\n\t\t\t\t\treg += \"([0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.second = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"SSS\":\n\t\t\t\tcase \"SS\":\n\t\t\t\tcase \"S\":\n\t\t\t\t\treg += \"([0-9]{3}|[0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.millisecond = index;\n\t\t\t\t\tparsedIndexes.millisecondDigits = info.parts[i].length;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"nnn\":\n\t\t\t\tcase \"nn\":\n\t\t\t\tcase \"n\":\n\t\t\t\t\treg += \"([0-9]{3}|[0-9]{2}|[0-9]{1})\";\n\t\t\t\t\tparsedIndexes.millisecond = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"x\":\n\t\t\t\t\treg += \"([0-9]{1,})\";\n\t\t\t\t\tparsedIndexes.timestamp = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"Z\":\n\t\t\t\t\treg += \"GMT([-+]+[0-9]{2}:[0-9]{2})\";\n\t\t\t\t\tparsedIndexes.zone = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ZZ\":\n\t\t\t\t\treg += \"([\\\\-+]+[0-9]{2}[0-9]{2})\";\n\t\t\t\t\tparsedIndexes.zone = index;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"i\":\n\t\t\t\t\treg += \"([0-9]{4})-?([0-9]{2})-?([0-9]{2})T?([0-9]{2}):?([0-9]{2}):?([0-9]{2})\\.?([0-9]{0,3})([zZ]|[+\\-][0-9]{2}:?[0-9]{2}|$)\";\n\t\t\t\t\tparsedIndexes.iso = index;\n\t\t\t\t\tindexAdjust += 7;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"G\":\n\t\t\t\tcase \"YYYY\":\n\t\t\t\tcase \"YYY\":\n\t\t\t\tcase \"YY\":\n\t\t\t\tcase \"Y\":\n\t\t\t\tcase \"MMMMM\":\n\t\t\t\tcase \"W\":\n\t\t\t\tcase \"EEEEE\":\n\t\t\t\tcase \"EEEE\":\n\t\t\t\tcase \"EEE\":\n\t\t\t\tcase \"EE\":\n\t\t\t\tcase \"E\":\n\t\t\t\tcase \"eeeee\":\n\t\t\t\tcase \"eeee\":\n\t\t\t\tcase \"eee\":\n\t\t\t\tcase \"ee\":\n\t\t\t\tcase \"e\":\n\t\t\t\tcase \"zzzz\":\n\t\t\t\tcase \"zzz\":\n\t\t\t\tcase \"zz\":\n\t\t\t\tcase \"z\":\n\t\t\t\tcase \"t\":\n\t\t\t\t\t// Ignore\n\t\t\t\t\tindexAdjust--;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treg += \"[^0-9]*\";\n\t\t}\n\n\t\t// Try matching\n\t\tlet regex = new RegExp(reg);\n\t\tlet matches: RegExpMatchArray = source.match(regex);\n\n\t\tif (matches) {\n\t\t\t// Populate the date object\n\n\t\t\t// Full year\n\t\t\tif (parsedIndexes.year > -1) {\n\t\t\t\tresValues.year = parseInt(matches[parsedIndexes.year]);\n\t\t\t}\n\n\t\t\t// 3-digit year\n\t\t\tif (parsedIndexes.year3 > -1) {\n\t\t\t\tlet val = parseInt(matches[parsedIndexes.year3]);\n\t\t\t\tval += 1000;\n\t\t\t\tresValues.year = val;\n\t\t\t}\n\n\t\t\t// 2-digit year\n\t\t\tif (parsedIndexes.year2 > -1) {\n\t\t\t\tlet val = parseInt(matches[parsedIndexes.year2]);\n\t\t\t\tif (val > 50) {\n\t\t\t\t\tval += 1000;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tval += 2000;\n\t\t\t\t}\n\t\t\t\tresValues.year = val;\n\t\t\t}\n\n\t\t\t// 1-digit year\n\t\t\tif (parsedIndexes.year1 > -1) {\n\t\t\t\tlet val = parseInt(matches[parsedIndexes.year1]);\n\t\t\t\tval = Math.floor((new Date().getFullYear()) / 10) * 10 + val;\n\t\t\t\tresValues.year = val;\n\t\t\t}\n\n\t\t\t// Full month\n\t\t\tif (parsedIndexes.monthLong > -1) {\n\t\t\t\tresValues.month = this.resolveMonth(matches[parsedIndexes.monthLong]);\n\t\t\t}\n\n\t\t\t// Short month\n\t\t\tif (parsedIndexes.monthShort > -1) {\n\t\t\t\tresValues.month = this.resolveShortMonth(matches[parsedIndexes.monthShort]);\n\t\t\t}\n\n\t\t\t// Numeric month\n\t\t\tif (parsedIndexes.month > -1) {\n\t\t\t\tresValues.month = parseInt(matches[parsedIndexes.month]) - 1;\n\t\t\t}\n\n\t\t\t// Weekday\n\t\t\t// @todo\n\n\t\t\t// Week\n\t\t\tif ((parsedIndexes.week > -1) && (parsedIndexes.day === -1)) {\n\t\t\t\t// We parse weeks ONLY if day is not explicitly set\n\t\t\t\t// TODO: this needs work\n\t\t\t\t// (but maybe later - I can hardly imagine anyone passing their dates in weeks)\n\t\t\t\tresValues.month = 0;\n\t\t\t\tresValues.day = $utils.getDayFromWeek(\n\t\t\t\t\tparseInt(matches[parsedIndexes.week]),\n\t\t\t\t\tresValues.year,\n\t\t\t\t\t1,\n\t\t\t\t\tthis._root.utc\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Day\n\t\t\tif (parsedIndexes.day > -1) {\n\t\t\t\tresValues.day = parseInt(matches[parsedIndexes.day]);\n\t\t\t}\n\n\t\t\t// Year day\n\t\t\tif (parsedIndexes.yearDay > -1) {\n\t\t\t\tresValues.month = 0;\n\t\t\t\tresValues.day = parseInt(matches[parsedIndexes.yearDay]);\n\t\t\t}\n\n\t\t\t// 24 Hour (0-23)\n\t\t\tif (parsedIndexes.hourBase0 > -1) {\n\t\t\t\tresValues.hour = parseInt(matches[parsedIndexes.hourBase0]);\n\t\t\t}\n\n\t\t\t// 24 Hour (1-24)\n\t\t\tif (parsedIndexes.hourBase1 > -1) {\n\t\t\t\tresValues.hour = parseInt(matches[parsedIndexes.hourBase1]) - 1;\n\t\t\t}\n\n\t\t\t// 12 Hour (0-11)\n\t\t\tif (parsedIndexes.hour12Base0 > -1) {\n\t\t\t\tlet val = parseInt(matches[parsedIndexes.hour12Base0]);\n\t\t\t\tif (val == 11) {\n\t\t\t\t\tval = 0;\n\t\t\t\t}\n\t\t\t\tif ((parsedIndexes.am > -1) && !this.isAm(matches[parsedIndexes.am])) {\n\t\t\t\t\tval += 12;\n\t\t\t\t}\n\t\t\t\tresValues.hour = val;\n\t\t\t}\n\n\t\t\t// 12 Hour (1-12)\n\t\t\tif (parsedIndexes.hour12Base1 > -1) {\n\t\t\t\tlet val = parseInt(matches[parsedIndexes.hour12Base1]);\n\t\t\t\tif (val == 12) {\n\t\t\t\t\tval = 0;\n\t\t\t\t}\n\t\t\t\tif ((parsedIndexes.am > -1) && !this.isAm(matches[parsedIndexes.am])) {\n\t\t\t\t\tval += 12;\n\t\t\t\t}\n\t\t\t\tresValues.hour = val;\n\t\t\t}\n\n\t\t\t// Minute\n\t\t\tif (parsedIndexes.minute > -1) {\n\t\t\t\tresValues.minute = parseInt(matches[parsedIndexes.minute]);\n\t\t\t}\n\n\t\t\t// Second\n\t\t\tif (parsedIndexes.second > -1) {\n\t\t\t\tresValues.second = parseInt(matches[parsedIndexes.second]);\n\t\t\t}\n\n\t\t\t// Millisecond\n\t\t\tif (parsedIndexes.millisecond > -1) {\n\t\t\t\tlet val = parseInt(matches[parsedIndexes.millisecond]);\n\t\t\t\tif (parsedIndexes.millisecondDigits == 2) {\n\t\t\t\t\tval *= 10;\n\t\t\t\t}\n\t\t\t\telse if (parsedIndexes.millisecondDigits == 1) {\n\t\t\t\t\tval *= 100;\n\t\t\t\t}\n\t\t\t\tresValues.millisecond = val;\n\t\t\t}\n\n\t\t\t// Timestamp\n\t\t\tif (parsedIndexes.timestamp > -1) {\n\t\t\t\tresValues.timestamp = parseInt(matches[parsedIndexes.timestamp]);\n\n\t\t\t\tconst ts = new Date(resValues.timestamp);\n\t\t\t\tresValues.year = ts.getUTCFullYear();\n\t\t\t\tresValues.month = ts.getUTCMonth();\n\t\t\t\tresValues.day = ts.getUTCDate();\n\t\t\t\tresValues.hour = ts.getUTCHours();\n\t\t\t\tresValues.minute = ts.getUTCMinutes();\n\t\t\t\tresValues.second = ts.getUTCSeconds();\n\t\t\t\tresValues.millisecond = ts.getUTCMilliseconds();\n\t\t\t}\n\n\t\t\t// Adjust time zone\n\t\t\tif (parsedIndexes.zone > -1) {\n\t\t\t\tresValues.offset = this.resolveTimezoneOffset(new Date(resValues.year, resValues.month, resValues.day), matches[parsedIndexes.zone]);\n\t\t\t}\n\n\t\t\t// ISO\n\t\t\tif (parsedIndexes.iso > -1) {\n\n\t\t\t\tresValues.year = $type.toNumber(matches[parsedIndexes.iso + 0]);\n\t\t\t\tresValues.month = $type.toNumber(matches[parsedIndexes.iso + 1]) - 1;\n\t\t\t\tresValues.day = $type.toNumber(matches[parsedIndexes.iso + 2]);\n\t\t\t\tresValues.hour = $type.toNumber(matches[parsedIndexes.iso + 3]);\n\t\t\t\tresValues.minute = $type.toNumber(matches[parsedIndexes.iso + 4]);\n\t\t\t\tresValues.second = $type.toNumber(matches[parsedIndexes.iso + 5]);\n\t\t\t\tresValues.millisecond = $type.toNumber(matches[parsedIndexes.iso + 6]);\n\n\t\t\t\tif (matches[parsedIndexes.iso + 7] == \"Z\" || matches[parsedIndexes.iso + 7] == \"z\") {\n\t\t\t\t\tresValues.utc = true;\n\t\t\t\t}\n\t\t\t\telse if (matches[parsedIndexes.iso + 7] != \"\") {\n\t\t\t\t\tresValues.offset = this.resolveTimezoneOffset(new Date(resValues.year, resValues.month, resValues.day), matches[parsedIndexes.iso + 7]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create Date object\n\t\t\tif (resValues.utc) {\n\t\t\t\tres = new Date(Date.UTC(\n\t\t\t\t\tresValues.year,\n\t\t\t\t\tresValues.month,\n\t\t\t\t\tresValues.day,\n\t\t\t\t\tresValues.hour,\n\t\t\t\t\tresValues.minute,\n\t\t\t\t\tresValues.second,\n\t\t\t\t\tresValues.millisecond\n\t\t\t\t));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tres = new Date(\n\t\t\t\t\tresValues.year,\n\t\t\t\t\tresValues.month,\n\t\t\t\t\tresValues.day,\n\t\t\t\t\tresValues.hour,\n\t\t\t\t\tresValues.minute + resValues.offset,\n\t\t\t\t\tresValues.second,\n\t\t\t\t\tresValues.millisecond\n\t\t\t\t);\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\t// Didn't match anything\n\t\t\t// Let's try dropping it into Date constructor and hope for the best\n\t\t\tres = new Date(source);\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tprotected resolveTimezoneOffset(date: Date, zone: string): number {\n\t\tlet value = zone.match(/([+\\-]?)([0-9]{2}):?([0-9]{2})/);\n\t\tif (value) {\n\t\t\tlet match = zone.match(/([+\\-]?)([0-9]{2}):?([0-9]{2})/)!;\n\t\t\tlet dir = match[1];\n\t\t\tlet hour = match[2];\n\t\t\tlet minute = match[3];\n\t\t\tlet offset = parseInt(hour) * 60 + parseInt(minute);\n\n\t\t\t// Adjust offset\n\t\t\t// Making it negative does not seem to make sense, but it's right\n\t\t\t// because of how JavaScript calculates GMT offsets\n\t\t\tif (dir == \"+\") {\n\t\t\t\toffset *= -1;\n\t\t\t}\n\n\t\t\t// Check the difference in offset\n\t\t\tlet originalOffset = (date || new Date()).getTimezoneOffset();\n\t\t\tlet diff = offset - originalOffset;\n\t\t\treturn diff;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Resolves month name (i.e. \"December\") into a month number (11).\n\t *\n\t * @param value Month name\n\t * @return Month number\n\t */\n\tprotected resolveMonth(value: Months): number {\n\n\t\t// Let's try English first\n\t\tlet month: number = this._months().indexOf(value);\n\t\tif (month > -1) {\n\t\t\treturn month;\n\t\t}\n\n\t\t// Try the translation\n\t\tif (!this._root.language.isDefault()) {\n\t\t\tmonth = this._root.language.translateAll(this._months()).indexOf(value);\n\t\t\tif (month > -1) {\n\t\t\t\treturn month\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Resolves short month name (i.e. \"Dec\") into a month number.\n\t *\n\t * @param value Short month name\n\t * @return Month number\n\t */\n\tprotected resolveShortMonth(value: ShortMonths): number {\n\n\t\t// Let's try English first\n\t\tlet month: number = this._shortMonths().indexOf(value);\n\t\tif (month > -1) {\n\t\t\treturn month;\n\t\t}\n\n\t\t// Maybe long month (workaround for May)\n\t\tmonth = this._months().indexOf(value);\n\t\tif (month > -1) {\n\t\t\treturn month;\n\t\t}\n\n\t\t// Try the translation\n\t\tif (this._root.language && !this._root.language.isDefault()) {\n\t\t\tmonth = this._root.language.translateAll(this._shortMonths()).indexOf(value);\n\t\t\tif (month > -1) {\n\t\t\t\treturn month\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Checks if passed in string represents AM/PM notation in many of its\n\t * versions.\n\t *\n\t * @param value Source string\n\t * @return Is it AM/PM?\n\t */\n\tprotected isAm(value: string): boolean {\n\t\tlet list = this.getStringList([\"AM\", \"A.M.\", \"A\"]);\n\t\treturn list.indexOf(value.toUpperCase()) > -1;\n\t}\n\n\t/**\n\t * Translates list of strings.\n\t *\n\t * @param list Source strings\n\t * @return Translated strings\n\t */\n\tprotected getStringList(list: Array): Array {\n\t\tlet res: string[] = [];\n\t\tfor (let i: number = 0; i < list.length; i++) {\n\t\t\t// translate?\n\t\t\tif (this._root.language) {\n\t\t\t\tres.push($utils.escapeForRgex(this._t(list[i])));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tres.push($utils.escapeForRgex(list[i]));\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t}\n\n}\n","/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\nimport * as $array from \"./Array\";\nimport type { Optional } from \"./Type\";\n\n/**\n * Defines interface for disposable objects.\n *\n * @ignore Exclude from docs\n */\nexport interface IDisposer {\n\tisDisposed(): boolean;\n\tdispose(): void;\n}\n\n/**\n * A base class for disposable objects.\n *\n * @ignore Exclude from docs\n */\nexport class Disposer implements IDisposer {\n\n\t/**\n\t * Is object disposed?\n\t */\n\tprivate _disposed: boolean;\n\n\t/**\n\t * Method that disposes the object.\n\t */\n\tprivate _dispose: () => void;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param dispose Function that disposes object\n\t */\n\tconstructor(dispose: () => void) {\n\t\tthis._disposed = false;\n\t\tthis._dispose = dispose;\n\t}\n\n\t/**\n\t * Checks if object is disposed.\n\t *\n\t * @return Disposed?\n\t */\n\tpublic isDisposed(): boolean {\n\t\treturn this._disposed;\n\t}\n\n\t/**\n\t * Disposes the object.\n\t */\n\tpublic dispose(): void {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\t\t\tthis._dispose();\n\t\t}\n\t}\n\n}\n\n/**\n * This can be extended by other classes to add a `_disposers` property.\n *\n * @ignore Exclude from docs\n */\nexport class ArrayDisposer extends Disposer {\n\tprotected _disposers: Array = [];\n\n\tconstructor() {\n\t\tsuper(() => {\n\t\t\t$array.each(this._disposers, (x) => {\n\t\t\t\tx.dispose();\n\t\t\t});\n\t\t});\n\t}\n}\n\n/**\n * A collection of related disposers that can be disposed in one go.\n *\n * @ignore Exclude from docs\n */\nexport class MultiDisposer extends Disposer {\n\tconstructor(disposers: Array) {\n\t\tsuper(() => {\n\t\t\t$array.each(disposers, (x) => {\n\t\t\t\tx.dispose();\n\t\t\t});\n\t\t});\n\t}\n}\n\n/**\n * A special kind of Disposer that has attached value set.\n *\n * If a new value is set using `set()` method, the old disposer value is\n * disposed.\n *\n * @ignore Exclude from docs\n * @todo Description\n */\nexport class MutableValueDisposer extends Disposer {\n\n\t/**\n\t * Current disposer.\n\t */\n\tprivate _disposer: Optional;\n\n\t/**\n\t * Current value.\n\t */\n\tprivate _value: Optional;\n\n\t/**\n\t * Constructor.\n\t */\n\tconstructor() {\n\t\tsuper(() => {\n\t\t\tif (this._disposer != null) {\n\t\t\t\tthis._disposer.dispose();\n\t\t\t\tthis._disposer = undefined;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns current value.\n\t *\n\t * @return Value\n\t */\n\tpublic get(): Optional {\n\t\treturn this._value;\n\t}\n\n\t/**\n\t * Sets value and disposes previous disposer if it was set.\n\t *\n\t * @param value New value\n\t * @param disposer Disposer\n\t */\n\tpublic set(value: Optional, disposer: Optional): void {\n\t\tif (this._disposer != null) {\n\t\t\tthis._disposer.dispose();\n\t\t}\n\n\t\tthis._disposer = disposer;\n\t\tthis._value = value;\n\t}\n\n\t/**\n\t * Resets the disposer value.\n\t */\n\tpublic reset(): void {\n\t\tthis.set(undefined, undefined);\n\t}\n\n}\n\n/**\n * @ignore Exclude from docs\n * @todo Description\n */\nexport class CounterDisposer extends Disposer {\n\n\t/**\n\t * [_counter description]\n\t *\n\t * @todo Description\n\t */\n\tprivate _counter: number = 0;\n\n\t/**\n\t * [increment description]\n\t *\n\t * @todo Description\n\t */\n\tpublic increment() {\n\t\t// TODO throw an error if it is disposed\n\t\t++this._counter;\n\n\t\t// TODO make this more efficient\n\t\treturn new Disposer(() => {\n\t\t\t--this._counter;\n\n\t\t\tif (this._counter === 0) {\n\t\t\t\tthis.dispose();\n\t\t\t}\n\t\t});\n\t}\n\n}\n","import type { TimeUnit } from \"./Time\";\r\n\r\nimport { Entity, IEntitySettings, IEntityPrivate } from \"./Entity\"\r\nimport { TextFormatter } from \"./TextFormatter\";\r\n\r\nimport * as $object from \"./Object\";\r\nimport * as $utils from \"./Utils\";\r\nimport * as $type from \"./Type\";\r\n\r\n\r\nexport interface IDurationFormatterSettings extends IEntitySettings {\r\n\r\n\t/**\r\n\t * A universal duration format to use wherever number needs to be formatted\r\n\t * as a duration.\r\n\t */\r\n\tdurationFormat?: string;\r\n\r\n\t/**\r\n\t * A base value. Any number below it will be considered \"negative\".\r\n\t *\r\n\t * @default 0\r\n\t */\r\n\tnegativeBase?: number;\r\n\r\n\t/**\r\n\t * Identifies what values are used in duration.\r\n\t *\r\n\t * Available options: `\"millisecond\"`, `\"second\"` (default), `\"minute\"`, `\"hour\"`, `\"day\"`, `\"week\"`, `\"month\"`, and `\"year\"`.\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-durations/#Base_unit} for more info\r\n\t * @default \"second\"\r\n\t */\r\n\tbaseUnit?: TimeUnit;\r\n\r\n\t/**\r\n\t * Time unit dependent duration formats.\r\n\t *\r\n\t * Used be [[DurationAxis]].\r\n\t */\r\n\tdurationFormats?: Partial>>>;\r\n\r\n\t/**\r\n\t * An array of data fields that hold duration values and should be formatted\r\n\t * with a [[DurationFormatter]].\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/data-placeholders/#Formatting_placeholders} for more info\r\n\t */\r\n\tdurationFields?: string[];\r\n\r\n}\r\n\r\nexport interface IDurationFormatterPrivate extends IEntityPrivate {\r\n}\r\n\r\n/**\r\n * A class used to format numberic values as time duration.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-durations/} for more info\r\n */\r\nexport class DurationFormatter extends Entity {\r\n\tdeclare public _settings: IDurationFormatterSettings;\r\n\tdeclare public _privateSettings: IDurationFormatterPrivate;\r\n\r\n\tprotected _setDefaults() {\r\n\t\tconst dmillisecond = \"_duration_millisecond\";\r\n\t\tconst dsecond = \"_duration_second\";\r\n\t\tconst dminute = \"_duration_minute\";\r\n\t\tconst dhour = \"_duration_hour\";\r\n\t\tconst dday = \"_duration_day\";\r\n\t\tconst dweek = \"_duration_week\";\r\n\t\tconst dmonth = \"_duration_month\";\r\n\t\tconst dyear = \"_duration_year\";\r\n\r\n\t\tconst asecond = \"_second\";\r\n\t\tconst aminute = \"_minute\";\r\n\t\tconst ahour = \"_hour\";\r\n\t\tconst aday = \"_day\";\r\n\t\tconst aweek = \"_week\";\r\n\t\tconst amonth = \"_week\";\r\n\t\tconst ayear = \"_year\";\r\n\r\n\t\t// Defaults\r\n\t\tthis._setDefault(\"negativeBase\", 0);\r\n\t\tthis._setDefault(\"baseUnit\", \"second\");\r\n\t\tthis._setDefault(\"durationFormats\", {\r\n\t\t\t\"millisecond\": {\r\n\t\t\t\t\"millisecond\": this._t(dmillisecond),\r\n\t\t\t\t\"second\": this._t((dmillisecond + asecond) as any),\r\n\t\t\t\t\"minute\": this._t((dmillisecond + aminute) as any),\r\n\t\t\t\t\"hour\": this._t((dmillisecond + ahour) as any),\r\n\t\t\t\t\"day\": this._t((dmillisecond + aday) as any),\r\n\t\t\t\t\"week\": this._t((dmillisecond + aweek) as any),\r\n\t\t\t\t\"month\": this._t((dmillisecond + amonth) as any),\r\n\t\t\t\t\"year\": this._t((dmillisecond + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"second\": {\r\n\t\t\t\t\"second\": this._t((dsecond) as any),\r\n\t\t\t\t\"minute\": this._t((dsecond + aminute) as any),\r\n\t\t\t\t\"hour\": this._t((dsecond + ahour) as any),\r\n\t\t\t\t\"day\": this._t((dsecond + aday) as any),\r\n\t\t\t\t\"week\": this._t((dsecond + aweek) as any),\r\n\t\t\t\t\"month\": this._t((dsecond + amonth) as any),\r\n\t\t\t\t\"year\": this._t((dsecond + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"minute\": {\r\n\t\t\t\t\"minute\": this._t((dminute) as any),\r\n\t\t\t\t\"hour\": this._t((dminute + ahour) as any),\r\n\t\t\t\t\"day\": this._t((dminute + aday) as any),\r\n\t\t\t\t\"week\": this._t((dminute + aweek) as any),\r\n\t\t\t\t\"month\": this._t((dminute + amonth) as any),\r\n\t\t\t\t\"year\": this._t((dminute + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"hour\": {\r\n\t\t\t\t\"hour\": this._t((dhour) as any),\r\n\t\t\t\t\"day\": this._t((dhour + aday) as any),\r\n\t\t\t\t\"week\": this._t((dhour + aweek) as any),\r\n\t\t\t\t\"month\": this._t((dhour + amonth) as any),\r\n\t\t\t\t\"year\": this._t((dhour + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"day\": {\r\n\t\t\t\t\"day\": this._t((dday) as any),\r\n\t\t\t\t\"week\": this._t((dday + aweek) as any),\r\n\t\t\t\t\"month\": this._t((dday + amonth) as any),\r\n\t\t\t\t\"year\": this._t((dday + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"week\": {\r\n\t\t\t\t\"week\": this._t((dweek) as any),\r\n\t\t\t\t\"month\": this._t((dweek + amonth) as any),\r\n\t\t\t\t\"year\": this._t((dweek + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"month\": {\r\n\t\t\t\t\"month\": this._t((dmonth) as any),\r\n\t\t\t\t\"year\": this._t((dmonth + ayear) as any)\r\n\t\t\t},\r\n\t\t\t\"year\": {\r\n\t\t\t\t\"year\": this._t(dyear)\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tsuper._setDefaults();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Collection of aliases for units.\r\n\t */\r\n\tprotected _unitAliases: { [index: string]: string } = {\r\n\t\t\"Y\": \"y\",\r\n\t\t\"D\": \"d\",\r\n\t\t\"H\": \"h\",\r\n\t\t\"K\": \"h\",\r\n\t\t\"k\": \"h\",\r\n\t\t\"n\": \"S\"\r\n\t};\r\n\r\n\tpublic _beforeChanged() {\r\n\t\tsuper._beforeChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Formats the number as duration.\r\n\t *\r\n\t * For example `1000` (base unit seconds) would be converted to `16:40` as in\r\n\t * 16 minutes and 40 seconds.\r\n\t *\r\n\t * @param value Value to format\r\n\t * @param format Format to apply\r\n\t * @param base Override base unit\r\n\t * @return Formatted number\r\n\t */\r\n\tpublic format(value: number | string, format?: string, base?: TimeUnit): string {\r\n\r\n\t\t// no base unit?\r\n\t\tlet baseUnit = base || this.get(\"baseUnit\");\r\n\r\n\t\t// no format passed in or empty\r\n\t\tif (typeof format === \"undefined\" || format === \"\") {\r\n\t\t\tif (this.get(\"durationFormat\") != null) {\r\n\t\t\t\tformat = this.get(\"durationFormat\");\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tformat = this.getFormat($type.toNumber(value), undefined, baseUnit);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Clean format\r\n\t\tformat = $utils.cleanFormat(format!);\r\n\r\n\t\t// get format info (it will also deal with parser caching)\r\n\t\tlet info = this.parseFormat(format, baseUnit);\r\n\r\n\t\t// cast to number just in case\r\n\t\t// TODO: maybe use better casting\r\n\t\tlet source: number = Number(value);\r\n\r\n\t\t// format and replace the number\r\n\t\tlet details;\r\n\t\tif (source > this.get(\"negativeBase\")) {\r\n\t\t\tdetails = info.positive;\r\n\t\t}\r\n\t\telse if (source < this.get(\"negativeBase\")) {\r\n\t\t\tdetails = info.negative;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tdetails = info.zero;\r\n\t\t}\r\n\r\n\r\n\t\t// Format\r\n\t\tlet formatted = this.applyFormat(source, details);\r\n\r\n\t\t// Apply color?\r\n\t\tif (details.color !== \"\") {\r\n\t\t\tformatted = \"[\" + details.color + \"]\" + formatted + \"[/]\";\r\n\t\t}\r\n\r\n\t\treturn formatted;\r\n\t}\r\n\r\n\t/**\r\n\t * Parses supplied format into structured object which can be used to format\r\n\t * the number.\r\n\t *\r\n\t * @param format Format string, i.e. \"#,###.00\"\r\n\t * @param base Override base unit\r\n\t * @return Parsed information\r\n\t */\r\n\tprotected parseFormat(format: string, base?: TimeUnit): any {\r\n\r\n\t\t// Check cache\r\n\t\t// TODO\r\n\t\t// let cached = this.getCache(format);\r\n\t\t// if (cached != null) {\r\n\t\t// \treturn cached;\r\n\t\t// }\r\n\r\n\t\t// no base unit?\r\n\t\tlet baseUnit = base || this.get(\"baseUnit\");\r\n\r\n\t\t// Initialize duration parsing info\r\n\t\tlet info = {\r\n\t\t\t\"positive\": {\r\n\t\t\t\t\"color\": \"\",\r\n\t\t\t\t\"template\": \"\",\r\n\t\t\t\t\"parts\": [],\r\n\t\t\t\t\"source\": \"\",\r\n\t\t\t\t\"baseUnit\": baseUnit,\r\n\t\t\t\t\"parsed\": false,\r\n\t\t\t\t\"absolute\": false\r\n\t\t\t},\r\n\t\t\t\"negative\": {\r\n\t\t\t\t\"color\": \"\",\r\n\t\t\t\t\"template\": \"\",\r\n\t\t\t\t\"parts\": [],\r\n\t\t\t\t\"source\": \"\",\r\n\t\t\t\t\"baseUnit\": baseUnit,\r\n\t\t\t\t\"parsed\": false,\r\n\t\t\t\t\"absolute\": false\r\n\t\t\t},\r\n\t\t\t\"zero\": {\r\n\t\t\t\t\"color\": \"\",\r\n\t\t\t\t\"template\": \"\",\r\n\t\t\t\t\"parts\": [],\r\n\t\t\t\t\"source\": \"\",\r\n\t\t\t\t\"baseUnit\": baseUnit,\r\n\t\t\t\t\"parsed\": false,\r\n\t\t\t\t\"absolute\": false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Escape double vertical bars (that mean display one vertical bar)\r\n\t\tformat = format.replace(\"||\", $type.PLACEHOLDER2);\r\n\r\n\t\t// Split it up and deal with different formats\r\n\t\tlet parts = format.split(\"|\");\r\n\t\tinfo.positive.source = parts[0];\r\n\r\n\t\tif (typeof parts[2] === \"undefined\") {\r\n\t\t\tinfo.zero = info.positive;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tinfo.zero.source = parts[2];\r\n\t\t}\r\n\r\n\t\tif (typeof parts[1] === \"undefined\") {\r\n\t\t\tinfo.negative = info.positive;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tinfo.negative.source = parts[1];\r\n\t\t}\r\n\r\n\t\t// Parse each\r\n\t\t$object.each(info, (_part, item) => {\r\n\t\t\t// Already parsed\r\n\t\t\tif (item.parsed) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Check cached\r\n\t\t\t// TODO\r\n\t\t\t// if (typeof this.getCache(item.source) !== \"undefined\") {\r\n\t\t\t// \tinfo[part] = this.getCache(item.source);\r\n\t\t\t// \treturn;\r\n\t\t\t// }\r\n\r\n\t\t\t// Begin parsing\r\n\t\t\tlet partFormat: string = item.source;\r\n\r\n\t\t\t// Check for [] directives\r\n\t\t\tlet dirs: string[] | null = [];\r\n\t\t\tdirs = item.source.match(/^\\[([^\\]]*)\\]/);\r\n\t\t\tif (dirs && dirs.length && dirs[0] !== \"\") {\r\n\t\t\t\tpartFormat = item.source.substr(dirs[0].length);\r\n\t\t\t\titem.color = dirs[1];\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// Let TextFormatter split into chunks\r\n\t\t\tlet chunks = TextFormatter.chunk(partFormat, true);\r\n\t\t\tfor (let i: number = 0; i < chunks.length; i++) {\r\n\t\t\t\tlet chunk = chunks[i];\r\n\r\n\t\t\t\t// replace back double vertical bar\r\n\t\t\t\tchunk.text = chunk.text.replace($type.PLACEHOLDER2, \"|\");\r\n\r\n\t\t\t\tif (chunk.type === \"value\") {\r\n\r\n\t\t\t\t\t// Just \"Duration\"?\r\n\t\t\t\t\t// if (chunk.text.toLowerCase() === \"duration\") {\r\n\t\t\t\t\t// \tchunk.text = durationFormat;\r\n\t\t\t\t\t// }\r\n\r\n\t\t\t\t\t// Check for \"a\" (absolute) modifier\r\n\t\t\t\t\tif (chunk.text.match(/[yYMdDwhHKkmsSn]+a/)) {\r\n\t\t\t\t\t\titem.absolute = true;\r\n\t\t\t\t\t\tchunk.text = chunk.text.replace(/([yYMdDwhHKkmsSn]+)a/, \"$1\");\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Find all possible parts\r\n\t\t\t\t\tlet matches = chunk.text.match(/y+|Y+|M+|d+|D+|w+|h+|H+|K+|k+|m+|s+|S+|n+/g);\r\n\r\n\t\t\t\t\tif (matches) {\r\n\t\t\t\t\t\t// Populate template\r\n\t\t\t\t\t\tfor (let x = 0; x < matches.length; x++) {\r\n\t\t\t\t\t\t\t// Is it an alias?\r\n\t\t\t\t\t\t\tif (matches[x] == null) {\r\n\t\t\t\t\t\t\t\tmatches[x] = this._unitAliases[matches[x]];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\titem.parts.push(matches[x]);\r\n\t\t\t\t\t\t\tchunk.text = chunk.text.replace(matches[x], $type.PLACEHOLDER);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Apply to template\r\n\t\t\t\titem.template += chunk.text;\r\n\t\t\t}\r\n\r\n\t\t\t// Apply style formatting\r\n\t\t\t//item.template = TextFormatter.format(item.template, this.outputFormat);\r\n\r\n\t\t\t// Save cache\r\n\t\t\t// TODO\r\n\t\t\t//this.setCache(item.source, item);\r\n\r\n\t\t\t// Mark this as parsed\r\n\t\t\titem.parsed = true;\r\n\t\t});\r\n\r\n\t\t// Save cache (the whole thing)\r\n\t\t// TODO\r\n\t\t//this.setCache(format, info);\r\n\r\n\t\treturn info;\r\n\t}\r\n\r\n\t/**\r\n\t * Applies parsed format to a numeric value.\r\n\t *\r\n\t * @param value Value\r\n\t * @param details Parsed format as returned by {parseFormat}\r\n\t * @return Formatted duration\r\n\t */\r\n\tprotected applyFormat(value: number, details: any): string {\r\n\r\n\t\t// Use absolute values\r\n\t\tlet negative = !details.absolute && (value < this.get(\"negativeBase\"));\r\n\t\tvalue = Math.abs(value);\r\n\r\n\t\t// Recalculate to milliseconds\r\n\t\tlet tstamp = this.toTimeStamp(value, details.baseUnit);\r\n\r\n\t\t// Init return value\r\n\t\tlet res = details.template;\r\n\r\n\t\t// Iterate through duration parts\r\n\t\tfor (let i = 0, len = details.parts.length; i < len; i++) {\r\n\r\n\t\t\t// Gather the part\r\n\t\t\tlet part = details.parts[i];\r\n\t\t\tlet unit = this._toTimeUnit(part.substr(0, 1));\r\n\t\t\tlet digits = part.length;\r\n\r\n\t\t\t// Calculate current unit value\r\n\t\t\tlet ints = Math.floor(tstamp / this._getUnitValue(unit!));\r\n\t\t\tres = res.replace($type.PLACEHOLDER, $utils.padString(ints, digits, \"0\"));\r\n\r\n\t\t\t// Reduce timestamp\r\n\t\t\ttstamp -= ints * this._getUnitValue(unit!);\r\n\t\t}\r\n\r\n\t\t// Reapply negative sign\r\n\t\tif (negative) {\r\n\t\t\tres = \"-\" + res;\r\n\t\t}\r\n\r\n\t\treturn res;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts numeric value to timestamp in milliseconds.\r\n\t *\r\n\t * @param value A source value\r\n\t * @param baseUnit Base unit the source value is in: \"q\", \"s\", \"i\", \"h\", \"d\", \"w\", \"m\", \"y\"\r\n\t * @return Value representation as a timestamp in milliseconds\r\n\t */\r\n\tpublic toTimeStamp(value: number, baseUnit: TimeUnit): number {\r\n\t\treturn value * this._getUnitValue(baseUnit);\r\n\t}\r\n\r\n\tprotected _toTimeUnit(code: string): TimeUnit | undefined {\r\n\t\tswitch (code) {\r\n\t\t\tcase \"S\":\r\n\t\t\t\treturn \"millisecond\";\r\n\t\t\tcase \"s\":\r\n\t\t\t\treturn \"second\";\r\n\t\t\tcase \"m\":\r\n\t\t\t\treturn \"minute\";\r\n\t\t\tcase \"h\":\r\n\t\t\t\treturn \"hour\";\r\n\t\t\tcase \"d\":\r\n\t\t\t\treturn \"day\";\r\n\t\t\tcase \"w\":\r\n\t\t\t\treturn \"week\";\r\n\t\t\tcase \"M\":\r\n\t\t\t\treturn \"month\";\r\n\t\t\tcase \"y\":\r\n\t\t\t\treturn \"year\";\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Returns appropriate default format for the value.\r\n\t *\r\n\t * If `maxValue` is sepcified, it will use that value to determine the time\r\n\t * unit for the format.\r\n\t *\r\n\t * For example if your `baseUnit` is `\"second\"` and you pass in `10`, you\r\n\t * will get `\"10\"`.\r\n\t *\r\n\t * However, you might want it to be formatted in the context of bigger scale,\r\n\t * say 10 minutes (600 seconds). If you pass in `600` as `maxValue`, all\r\n\t * values, including small ones will use format with minutes, e.g.:\r\n\t * `00:10`, `00:50`, `12: 30`, etc.\r\n\t *\r\n\t * @param value Value to format\r\n\t * @param maxValue Maximum value to be used to determine format\r\n\t * @param baseUnit Base unit of the value\r\n\t * @return Format\r\n\t */\r\n\tpublic getFormat(value: number, maxValue?: number, baseUnit?: TimeUnit): string {\r\n\r\n\t\t// Is format override set?\r\n\t\tif (this.get(\"durationFormat\") != null) {\r\n\t\t\treturn this.get(\"durationFormat\")!;\r\n\t\t}\r\n\r\n\t\t// Get base unit\r\n\t\tif (!baseUnit) {\r\n\t\t\tbaseUnit = this.get(\"baseUnit\");\r\n\t\t}\r\n\r\n\t\tif (maxValue != null && value != maxValue) {\r\n\t\t\tvalue = Math.abs(value);\r\n\t\t\tmaxValue = Math.abs(maxValue);\r\n\t\t\tlet maxUnit = this.getValueUnit(Math.max(value, maxValue), baseUnit);\r\n\t\t\t//let diffUnit = this.getValueUnit(Math.abs(maxValue - value), baseUnit);\r\n\t\t\t//console.log(maxUnit, diffUnit);\r\n\t\t\treturn (this.get(\"durationFormats\"))[baseUnit!][maxUnit!];\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet unit = this.getValueUnit(value, baseUnit);\r\n\t\t\treturn (this.get(\"durationFormats\"))[baseUnit!][unit!];\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Returns value's closest denominator time unit, e.g 100 seconds is\r\n\t * `\"minute\"`, while 59 seconds would still be `second`.\r\n\t *\r\n\t * @param value Source duration value\r\n\t * @param baseUnit Base unit\r\n\t * @return Denominator\r\n\t */\r\n\tpublic getValueUnit(value: number, baseUnit?: TimeUnit): TimeUnit | undefined {\r\n\r\n\t\t// Get base unit\r\n\t\tif (!baseUnit) {\r\n\t\t\tbaseUnit = this.get(\"baseUnit\");\r\n\t\t}\r\n\r\n\t\t// Convert to milliseconds\r\n\t\tlet currentUnit: any;\r\n\t\tlet ms = this.getMilliseconds(value, baseUnit);\r\n\t\t$object.eachContinue(this._getUnitValues(), (key, val) => {\r\n\t\t\tif (key == baseUnit || currentUnit) {\r\n\t\t\t\tlet num = ms / val;\r\n\t\t\t\tif (num <= 1) {\r\n\t\t\t\t\tif (!currentUnit) {\r\n\t\t\t\t\t\tcurrentUnit = key;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tcurrentUnit = key;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\treturn currentUnit;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts value to milliseconds according to `baseUnit`.\r\n\t *\r\n\t * @param value Source duration value\r\n\t * @param baseUnit Base unit\r\n\t * @return Value in milliseconds\r\n\t */\r\n\tpublic getMilliseconds(value: number, baseUnit?: TimeUnit): number {\r\n\r\n\t\t// Get base unit\r\n\t\tif (!baseUnit) {\r\n\t\t\tbaseUnit = this.get(\"baseUnit\");\r\n\t\t}\r\n\r\n\t\treturn value * this._getUnitValue(baseUnit!);\r\n\t}\r\n\r\n\tprotected _getUnitValue(timeUnit: TimeUnit): number {\r\n\t\treturn this._getUnitValues()[timeUnit];\r\n\t}\r\n\r\n\tprotected _getUnitValues(): any {\r\n\t\treturn {\r\n\t\t\t\"millisecond\": 1,\r\n\t\t\t\"second\": 1000,\r\n\t\t\t\"minute\": 60000,\r\n\t\t\t\"hour\": 3600000,\r\n\t\t\t\"day\": 86400000,\r\n\t\t\t\"week\": 604800000,\r\n\t\t\t\"month\": 2592000000,\r\n\t\t\t\"year\": 31536000000,\r\n\t\t};\r\n\t}\r\n\r\n}\r\n","/**\n * A collection of easing functions\n *\n * Parts of this collection are taken from D3.js library (https://d3js.org/)\n */\n\n/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\nimport * as $math from \"./Math\";\nimport type { Time } from \"./Animation\";\n\nexport type Easing = (time: Time) => Time;\n\n/**\n * The functions below are from D3.js library (https://d3js.org/)\n *\n * ----------------------------------------------------------------------------\n * Copyright 2017 Mike Bostock\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *\tthis list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *\tthis list of conditions and the following disclaimer in the documentation\n *\tand/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n *\tcontributors may be used to endorse or promote products derived from this\n *\tsoftware without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n * ----------------------------------------------------------------------------\n * @hidden\n */\n\n/**\n */\nexport function linear(t: Time): Time {\n\treturn t;\n}\n\nexport function quad(t: Time): Time {\n\treturn (t as number) * (t as number);\n}\n\nexport function cubic(t: Time): Time {\n\treturn (t as number) * (t as number) * (t as number);\n}\n\nexport function pow(t: Time, e: number): Time {\n\treturn Math.pow(t as number, e);\n}\n\nexport function exp(t: Time): Time {\n\treturn Math.pow(2, 10 * (t as number) - 10);\n}\n\nexport function sine(t: Time): Time {\n\treturn 1 - Math.cos((t as number) * $math.HALFPI);\n}\n\nexport function circle(t: Time): Time {\n\treturn 1 - Math.sqrt(1 - (t as number) * (t as number));\n}\n\n/**\n * ============================================================================\n * TRANSFORMERS\n * ============================================================================\n * @hidden\n */\n\n/**\n */\nexport function yoyo(ease: Easing): Easing {\n\treturn function (t: Time) {\n\t\tif ((t as number) < 0.5) {\n\t\t\treturn ease((t as number) * 2.0);\n\n\t\t} else {\n\t\t\treturn ease((1.0 - (t as number)) * 2.0);\n\t\t}\n\t};\n}\n\nexport function out(ease: Easing): Easing {\n\treturn function (t: Time) {\n\t\treturn 1.0 - (ease(1.0 - (t as number)) as number);\n\t};\n}\n\nexport function inOut(ease: Easing): Easing {\n\treturn function (t: Time) {\n\t\tif (t as number <= 0.5) {\n\t\t\treturn ease(t as number * 2.0) as number / 2.0;\n\n\t\t} else {\n\t\t\treturn 1.0 - (ease((1.0 - (t as number)) * 2.0) as number / 2.0);\n\t\t}\n\t};\n}\n\n/**\n * ============================================================================\n * BOUNCE\n * ============================================================================\n * @hidden\n */\nlet b1 = 4 / 11,\n\tb2 = 6 / 11,\n\tb3 = 8 / 11,\n\tb4 = 3 / 4,\n\tb5 = 9 / 11,\n\tb6 = 10 / 11,\n\tb7 = 15 / 16,\n\tb8 = 21 / 22,\n\tb9 = 63 / 64,\n\tb0 = 1 / b1 / b1;\n\nexport function bounce(t: Time): Time {\n\treturn 1 - (bounceOut(1 - (t as number)) as number);\n}\n\n/**\n * @ignore\n */\nfunction bounceOut(t: Time): Time {\n\tt = t as number;\n\tif (t < b1) {\n\t\treturn b0 * t * t;\n\t} else if (t < b3) {\n\t\treturn b0 * (t -= b2) * t + b4;\n\t} else if (t < b6) {\n\t\treturn b0 * (t -= b5) * t + b7;\n\t} else {\n\t\treturn b0 * (t -= b8) * t + b9;\n\t}\n}\n\n/**\n * ============================================================================\n * ELASTIC\n * ============================================================================\n * @hidden\n */\n\n/**\n * @ignore\n */\nlet tau = 2 * Math.PI;\n\n/**\n * @ignore\n */\nlet amplitude = 1;\n\n/**\n * @ignore\n */\nlet period = 0.3 / tau;\n\n/**\n * @ignore\n */\nlet s = Math.asin(1 / amplitude) * period;\n\nexport function elastic(t: Time): Time {\n\tlet v = t as number;\n\treturn amplitude * Math.pow(2, 10 * --v) * Math.sin((s - v) / period);\n}\n","import type { Entity, Dirty } from \"./Entity\";\nimport type { Animations } from \"./Animation\";\nimport * as $object from \"./Object\";\nimport * as $ease from \"./Ease\";\n\n/**\n * An object representing a collection of setting values to apply as required.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/states/} for more info\n */\nexport class State {\n\tprivate _entity: E;\n\tpublic _settings: Partial;\n\tpublic _userSettings: Dirty = {};\n\n\tconstructor(entity: E, settings: Partial) {\n\t\tthis._entity = entity;\n\t\tthis._settings = settings;\n\t}\n\n\t/**\n\t * Returns settings value for the specified `key`.\n\t *\n\t * If there is no value, `fallback` is returned instead (if set).\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Settings value\n\t * @param callback Fallback value\n\t * @return Value\n\t */\n\tpublic get(key: Key): this[\"_settings\"][Key];\n\tpublic get(key: Key, fallback: F): NonNullable | F;\n\tpublic get(key: Key, fallback?: any): any {\n\t\tconst value = this._settings[key];\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setRaw(key: Key, value: E[\"_settings\"][Key]) {\n\t\tthis._settings[key] = value;\n\t}\n\n\t/**\n\t * Sets a setting `value` for the specified `key` to be set when the state\n\t * is applied.\n\t *\n\t * @param key Setting key\n\t * @param value Setting value\n\t * @return Setting value\n\t */\n\tpublic set(key: Key, value: E[\"_settings\"][Key]) {\n\t\tthis._userSettings[key] = true;\n\t\tthis.setRaw(key, value);\n\t}\n\n\t/**\n\t * Removes a setting value for the specified `key`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Setting key\n\t */\n\tpublic remove(key: Key) {\n\t\tdelete this._userSettings[key];\n\t\tdelete this._settings[key];\n\t}\n\n\t/**\n\t * Sets multiple settings at once.\n\t *\n\t * `settings` must be an object with key: value pairs.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param settings Settings\n\t */\n\tpublic setAll(settings: this[\"_settings\"]) {\n\t\t$object.keys(settings).forEach((key) => {\n\t\t\tthis.set(key, settings[key]);\n\t\t});\n\t}\n\n\tprivate _eachSetting(f: (key: Key, value: Value) => void): void {\n\t\t$object.each(this._settings, f as any);\n\t}\n\n\t/**\n\t * Applies the state to the target element.\n\t *\n\t * All setting values are set immediately.\n\t */\n\tpublic apply() {\n\t\tconst seen: Dirty = {};\n\n\t\tseen[\"stateAnimationEasing\"] = true;\n\t\tseen[\"stateAnimationDuration\"] = true;\n\n\t\tconst defaultState = this._entity.states.lookup(\"default\")!;\n\n\t\tthis._eachSetting((key, value) => {\n\t\t\tif (!seen[key]) {\n\t\t\t\tseen[key] = true;\n\n\t\t\t\t// save values to default state\n\t\t\t\tif (this !== defaultState) {\n\t\t\t\t\tif (!(key in defaultState._settings)) {\n\t\t\t\t\t\tdefaultState._settings[key] = this._entity.get(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._entity.set(key, value);\n\t\t\t}\n\t\t});\n\t}\n\n\n\n\t/**\n\t * Applies the state to the target element.\n\t *\n\t * Returns an object representing all [[Animation]] objects created for\n\t * each setting key transition.\n\t *\n\t * @return Animations\n\t */\n\tpublic applyAnimate(duration?: number): Animations {\n\n\t\tif (duration == null) {\n\t\t\tduration = this._settings.stateAnimationDuration;\n\t\t}\n\t\tif (duration == null) {\n\t\t\tduration = this.get(\"stateAnimationDuration\", this._entity.get(\"stateAnimationDuration\", 0));\n\t\t}\n\n\t\tlet easing = this._settings.stateAnimationEasing;\n\t\tif (easing == null) {\n\t\t\teasing = this.get(\"stateAnimationEasing\", this._entity.get(\"stateAnimationEasing\", $ease.cubic));\n\t\t}\n\n\t\tconst defaultState = this._entity.states.lookup(\"default\")!;\n\n\t\tconst seen: Dirty = {};\n\n\t\tseen[\"stateAnimationEasing\"] = true;\n\t\tseen[\"stateAnimationDuration\"] = true;\n\n\t\tconst animations: Animations = {};\n\n\t\tthis._eachSetting((key, value) => {\n\t\t\tif (!seen[key]) {\n\t\t\t\tseen[key] = true;\n\n\t\t\t\t// save values to default state\n\t\t\t\tif (this != defaultState) {\n\t\t\t\t\tif (!(key in defaultState._settings)) {\n\t\t\t\t\t\tdefaultState._settings[key] = this._entity.get(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst animation = this._entity.animate({\n\t\t\t\t\tkey: key,\n\t\t\t\t\tto: value,\n\t\t\t\t\tduration: duration!,\n\t\t\t\t\teasing: easing\n\t\t\t\t});\n\n\t\t\t\tif (animation) {\n\t\t\t\t\tanimations[key] = animation;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn animations;\n\t}\n}\n\n/**\n * Collection of [[State]] objects for an element.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/states/} for more info\n */\nexport class States {\n\tprivate _states: { [key: string]: State } = {};\n\tprivate _entity: E;\n\n\tconstructor(entity: E) {\n\t\tthis._entity = entity;\n\t}\n\n\t/**\n\t * Checks if a state by `name` exists. Returns it there is one.\n\t *\n\t * @param name State name\n\t * @return State\n\t */\n\tpublic lookup(name: string): State | undefined {\n\t\treturn this._states[name];\n\t}\n\n\t/**\n\t * Sets supplied `settings` on a state by the `name`.\n\t *\n\t * If such state does not yet exists, it is created.\n\t *\n\t * @param name State name\n\t * @param settings Settings\n\t * @return New State\n\t */\n\tpublic create(name: string, settings: Partial): State {\n\t\tconst state = this._states[name];\n\n\t\tif (state) {\n\t\t\tstate.setAll(settings);\n\t\t\treturn state;\n\n\t\t} else {\n\t\t\tconst state = new State(this._entity, settings);\n\t\t\tthis._states[name] = state;\n\t\t\treturn state;\n\t\t}\n\t}\n\n\t/**\n\t * Removes the state called `name`.\n\t *\n\t * @param name State name\n\t */\n\tpublic remove(name: string): void {\n\t\tdelete this._states[name];\n\t}\n\n\t/**\n\t * Applies a named state to the target element.\n\t *\n\t * @param newState State name\n\t */\n\tpublic apply(newState: string) {\n\t\tconst state = this._states[newState];\n\n\t\tif (state) {\n\t\t\tstate.apply();\n\t\t}\n\n\t\tthis._entity._applyState(newState);\n\t}\n\n\t/**\n\t * Applies a named state to the element.\n\t *\n\t * Returns an object representing all [[Animation]] objects created for\n\t * each setting key transition.\n\t *\n\t * @param newState State name\n\t * @return Animations\n\t */\n\tpublic applyAnimate(newState: string, duration?: number): Animations | undefined {\n\t\tlet animations;\n\t\tconst state = this._states[newState];\n\n\t\tif (state) {\n\t\t\tanimations = state.applyAnimate(duration);\n\t\t}\n\n\t\tthis._entity._applyStateAnimated(newState, duration);\n\t\treturn animations;\n\t}\n}\n","import type { Root } from \"../Root\";\nimport type { Template, ApplyState } from \"./Template\";\nimport type { Theme, IRule } from \"../Theme\";\nimport type { ILocale } from \"./Language\";\n\nimport { IDisposer, Disposer } from \"./Disposer\";\nimport { EventDispatcher, Events } from \"./EventDispatcher\";\nimport { Time, IAnimation, getInterpolate } from \"./Animation\";\nimport { States } from \"./States\";\nimport { registry } from \"../Registry\";\n\nimport * as $object from \"./Object\";\nimport * as $ease from \"./Ease\";\nimport * as $array from \"./Array\";\nimport * as $order from \"./Order\";\n\n/**\n * @ignore\n */\nexport type Dirty = { [K in keyof A]?: boolean };\n\n\n/**\n * Allows to dynamically modify setting value of its target element.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/adapters/} for more info\n */\nexport class Adapters {\n\tprivate _entity: E;\n\tprivate _callbacks: { [K in keyof E[\"_settings\"]]?: Array<(value: O[K], target?: O, key?: K) => O[K]> } = {};\n\n\tconstructor(entity: E) {\n\t\tthis._entity = entity;\n\t}\n\n\t/**\n\t * Add a function (`callback`) that will modify value for setting `key`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/adapters/} for more info\n\t */\n\tpublic add(key: Key, callback: (value: O[Key], target?: O, key?: Key) => O[Key]): IDisposer {\n\t\tlet callbacks = this._callbacks[key];\n\n\t\tif (callbacks === undefined) {\n\t\t\tcallbacks = this._callbacks[key] = [];\n\t\t}\n\n\t\tcallbacks.push(callback);\n\n\t\tthis._entity._markDirtyKey(key);\n\n\t\treturn new Disposer(() => {\n\t\t\t$array.removeFirst(callbacks!, callback);\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic fold(key: Key, value: E[\"_settings\"][Key]): E[\"_settings\"][Key] {\n\t\tconst callbacks = this._callbacks[key];\n\n\t\tif (callbacks !== undefined) {\n\t\t\tfor (let i = 0, len = callbacks.length; i < len; ++i) {\n\t\t\t\tvalue = callbacks[i](value, this._entity, key);\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n}\n\n\nexport interface IEntitySettings {\n\n\t/**\n\t * Tags which can be used by the theme rules.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/themes/} for more info\n\t */\n\tthemeTags?: Array;\n\n\t/**\n\t * Tags which can be used by the theme rules.\n\t *\n\t * These tags only apply to this object, not any children.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/themes/} for more info\n\t */\n\tthemeTagsSelf?: Array;\n\n\t/**\n\t * A list of themes applied to the element.\n\t */\n\tthemes?: Array;\n\n\n\t/**\n\t * Duration of transition from one state to another.\n\t */\n\tstateAnimationDuration?:number;\n\n\t/**\n\t * Easing of transition from one state to another.\n\t */\n\tstateAnimationEasing?:$ease.Easing;\n\n\t/**\n\t * A custom string ID for the element.\n\t *\n\t * If set, element can be looked up via `am5.registry.entitiesById`.\n\t *\n\t * Will raise error if an element with the same ID already exists.\n\t */\n\tid?: string;\n\n\t/**\n\t * A storage for any custom user data that needs to be associated with the\n\t * element.\n\t */\n\tuserData?: any;\n\n}\n\nexport interface IEntityPrivate {\n}\n\nexport interface IEntityEvents {\n}\n\n/**\n * Animation options.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/} for more info\n */\nexport interface AnimationOptions {\n\n\t/**\n\t * A setting key to animate value for.\n\t */\n\tkey: Key,\n\n\t/**\n\t * Initial value to animate from. If not set, will use current value.\n\t */\n\tfrom?: Value;\n\n\t/**\n\t * Target value to animate to.\n\t */\n\tto: Value;\n\n\t/**\n\t * Animation duration in milliseconds.\n\t */\n\tduration: number;\n\n\t/**\n\t * Easing function. Defaults to linear.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Easing_functions} for more info\n\t */\n\teasing?: $ease.Easing;\n\n\t/**\n\t * How many times to play the animation. Defaults to 1.\n\t */\n\tloops?: number;\n}\n\nexport interface IAnimationEvents {\n\t/**\n\t * Invoked when animation was stopped, which happens in these situations:\n\t * 1. When the animation reached the end.\n\t * 2. When the `stop()` method is called.\n\t * 3. When a new animation starts for the same key.\n\t * 4. When calling `set` for the same key.\n\t */\n\tstopped: {};\n}\n\n/**\n * Animation object.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/} for more info\n */\nexport class Animation {\n\tprivate _from: Value;\n\tprivate _to: Value;\n\tprivate _duration: number;\n\tprivate _easing: $ease.Easing;\n\tprivate _loops: number;\n\tprivate _interpolate: (diff: Time, from: A, to: A) => A;\n\tprivate _oldTime: number | null;\n\tprivate _time: number = 0;\n\n\tpublic _stopped: boolean = false;\n\tpublic _playing: boolean = true;\n\n\tpublic events: EventDispatcher> = new EventDispatcher();\n\n\tconstructor(from: Value, to: Value, duration: number, easing: $ease.Easing, loops: number, startingTime: number | null) {\n\t\tthis._from = from;\n\t\tthis._to = to;\n\t\tthis._duration = duration;\n\t\tthis._easing = easing;\n\t\tthis._loops = loops;\n\t\tthis._interpolate = getInterpolate(from, to);\n\t\tthis._oldTime = startingTime;\n\t}\n\n\tpublic get to() {\n\t\treturn this._to;\n\t}\n\n\tpublic get from() {\n\t\treturn this._from;\n\t}\n\n\tpublic get playing() {\n\t\treturn this._playing;\n\t}\n\n\tpublic get stopped() {\n\t\treturn this._stopped;\n\t}\n\n\tpublic stop(): void {\n\t\tif (!this._stopped) {\n\t\t\tthis._stopped = true;\n\t\t\tthis._playing = false;\n\n\t\t\tif (this.events.isEnabled(\"stopped\")) {\n\t\t\t\tthis.events.dispatch(\"stopped\", {\n\t\t\t\t\ttype: \"stopped\",\n\t\t\t\t\ttarget: this,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic pause(): void {\n\t\tthis._playing = false;\n\t\tthis._oldTime = null;\n\t}\n\n\tpublic play(): void {\n\t\tif (!this._stopped) {\n\t\t\tthis._playing = true;\n\t\t}\n\t}\n\n\tpublic get percentage(): Time {\n\t\treturn this._time / this._duration;\n\t}\n\n\tpublic waitForStop(): Promise {\n\t\treturn new Promise((resolve, _reject) => {\n\t\t\tif (this._stopped) {\n\t\t\t\tresolve();\n\n\t\t\t} else {\n\t\t\t\tconst listener = () => {\n\t\t\t\t\tstopped.dispose();\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tconst stopped = this.events.on(\"stopped\", listener);\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic _checkEnded(): boolean {\n\t\tif (this._loops > 1) {\n\t\t\t--this._loops;\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tpublic _run(currentTime: number): void {\n\t\tif (this._oldTime !== null) {\n\t\t\tthis._time += currentTime - this._oldTime;\n\n\t\t\tif (this._time > this._duration) {\n\t\t\t\tthis._time = this._duration;\n\t\t\t}\n\t\t}\n\n\t\tthis._oldTime = currentTime;\n\t}\n\n\tpublic _reset(currentTime: number): void {\n\t\tthis._oldTime = currentTime;\n\t\tthis._time = 0;\n\t}\n\n\tpublic _value(diff: Time): Value {\n\t\treturn this._interpolate(this._easing(diff), this._from, this._to);\n\t}\n}\n\ntype Animated

= { [K in keyof P]?: Animation };\n\n\n/**\n * @ignore\n */\nlet counter = 0;\n\n/**\n * Base class for [[Entity]] objects that support Settings.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n */\nexport abstract class Settings implements IDisposer, IAnimation {\n\n\t/**\n\t * Unique ID.\n\t */\n\tpublic uid: number = ++counter;\n\n\tpublic _settings: {};\n\tpublic _privateSettings: {} = {};\n\n\tpublic _settingEvents: { [K in keyof this[\"_settings\"]]?: Array<(value: V, target?: O, key?: K) => void> } = {};\n\tpublic _privateSettingEvents: { [K in keyof this[\"_settings\"]]?: Array<(value: V, target?: O, key?: K) => void> } = {};\n\n\tpublic _prevSettings: this[\"_settings\"] = {};\n\tpublic _prevPrivateSettings: this[\"_privateSettings\"] = {};\n\n\tprotected _animatingSettings: Animated = {};\n\tprotected _animatingPrivateSettings: Animated = {};\n\tprotected _animatingCount: number = 0;\n\n\tprivate _disposed: boolean = false;\n\n\t// TODO move this into Entity\n\tprotected _userProperties: Dirty = {};\n\n\tconstructor(settings: Settings[\"_settings\"]) {\n\t\tthis._settings = settings;\n\t}\n\n\tprotected _checkDirty(): void {\n\t\t$object.keys(this._settings).forEach((key) => {\n\t\t\t(this._userProperties as any)[key] = true;\n\t\t\tthis._markDirtyKey(key);\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic abstract markDirty(): void;\n\n\tpublic _runAnimation(currentTime: number): boolean {\n\t\tif (!this.isDisposed()) {\n\t\t\t$object.each(this._animatingSettings, (key, animation) => {\n\t\t\t\tif (animation._stopped) {\n\t\t\t\t\tthis._stopAnimation(key);\n\n\t\t\t\t} else if (animation._playing) {\n\t\t\t\t\tanimation._run(currentTime);\n\n\t\t\t\t\tconst diff = animation.percentage;\n\n\t\t\t\t\tif (diff >= 1) {\n\t\t\t\t\t\tif (animation._checkEnded()) {\n\t\t\t\t\t\t\tthis.set(key, animation._value(1));\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tanimation._reset(currentTime);\n\t\t\t\t\t\t\tthis._set(key, animation._value(1));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._set(key, animation._value(diff));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t$object.each(this._animatingPrivateSettings, (key, animation) => {\n\t\t\t\tif (animation._stopped) {\n\t\t\t\t\tthis._stopAnimationPrivate(key);\n\n\t\t\t\t} else if (animation._playing) {\n\t\t\t\t\tanimation._run(currentTime);\n\n\t\t\t\t\tconst diff = animation.percentage;\n\n\t\t\t\t\tif (diff >= 1) {\n\t\t\t\t\t\tif (animation._checkEnded()) {\n\t\t\t\t\t\t\tthis.setPrivate(key, animation._value(1));\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tanimation._reset(currentTime);\n\t\t\t\t\t\t\tthis._setPrivate(key, animation._value(1));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._setPrivate(key, animation._value(diff));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (this._animatingCount < 0) {\n\t\t\t\tthrow new Error(\"Invalid animation count\");\n\t\t\t}\n\n\t\t\treturn this._animatingCount === 0;\n\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprotected abstract _startAnimation(): void;\n\tprotected abstract _animationTime(): number | null;\n\n\tpublic _markDirtyKey(_key: Key) {\n\t\tthis.markDirty();\n\t}\n\n\tpublic _markDirtyPrivateKey(_key: Key) {\n\t\tthis.markDirty();\n\t}\n\n\t/**\n\t * Sets a callback function to invoke when specific key of settings changes\n\t * or is set.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/events/#Settings_value_change} for more info\n\t * @param key Settings key\n\t * @param callback Callback\n\t * @return Disposer for event\n\t */\n\tpublic on(key: Key, callback: (value: this[\"_settings\"][Key], target?: this, key?: Key) => void): IDisposer {\n\t\tlet events = this._settingEvents[key];\n\n\t\tif (events === undefined) {\n\t\t\tevents = this._settingEvents[key] = [];\n\t\t}\n\n\t\tevents.push(callback);\n\n\t\treturn new Disposer(() => {\n\t\t\t$array.removeFirst(events!, callback);\n\n\t\t\tif (events!.length === 0) {\n\t\t\t\tdelete this._settingEvents[key];\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Sets a callback function to invoke when specific key of private settings\n\t * changes or is set.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/events/#Settings_value_change} for more info\n\t * @ignore\n\t * @param key Private settings key\n\t * @param callback Callback\n\t * @return Disposer for event\n\t */\n\tpublic onPrivate(key: Key, callback: (value: this[\"_privateSettings\"][Key], target?: this, key?: Key) => void): IDisposer {\n\t\tlet events = this._privateSettingEvents[key];\n\n\t\tif (events === undefined) {\n\t\t\tevents = this._privateSettingEvents[key] = [];\n\t\t}\n\n\t\tevents.push(callback);\n\n\t\treturn new Disposer(() => {\n\t\t\t$array.removeFirst(events!, callback);\n\n\t\t\tif (events!.length === 0) {\n\t\t\t\tdelete this._privateSettingEvents[key];\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getRaw(key: Key, fallback: F): NonNullable | F;\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getRaw(key: Key): this[\"_settings\"][Key];\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getRaw(key: Key, fallback?: any): any {\n\t\tconst value = (this._settings)[key];\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\t/**\n\t * Returns settings value for the specified `key`.\n\t *\n\t * If there is no value, `fallback` ios returned instead (if set)/\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Settings value\n\t * @param callback Fallback value\n\t * @return {any} Value\n\t */\n\tpublic get(key: Key, fallback: F): NonNullable | F;\n\tpublic get(key: Key): this[\"_settings\"][Key];\n\tpublic get(key: Key, fallback?: any): any {\n\t\treturn this.getRaw(key, fallback);\n\t}\n\n\tprotected _sendKeyEvent(key: Key, value: Value): void {\n\t\tconst events = this._settingEvents[key];\n\n\t\tif (events !== undefined) {\n\t\t\t$array.each(events!, (callback) => {\n\t\t\t\tcallback(value, this, key);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _sendPrivateKeyEvent(key: Key, value: Value): void {\n\t\tconst events = this._privateSettingEvents[key];\n\n\t\tif (events !== undefined) {\n\t\t\t$array.each(events!, (callback) => {\n\t\t\t\tcallback(value, this, key);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tprivate _setRaw(key: Key, old: Value, value: Value) {\n\t\tthis._prevSettings[key] = old;\n\t\tthis._sendKeyEvent(key, value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setRaw(key: Key, value: Value) {\n\t\tconst old = (this._settings)[key];\n\n\t\t(this._settings)[key] = value;\n\n\t\tif (old !== value) {\n\t\t\tthis._setRaw(key, old, value);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tprivate _set(key: Key, value: this[\"_settings\"][Key]) {\n\t\tconst old = (this._settings)[key];\n\n\t\t(this._settings)[key] = value;\n\n\t\tif (old !== value) {\n\t\t\tthis._setRaw(key, old, value);\n\t\t\tthis._markDirtyKey(key);\n\t\t}\n\t}\n\n\n\tprotected _stopAnimation(key: Key): void {\n\t\tconst animation = this._animatingSettings[key];\n\n\t\tif (animation) {\n\t\t\tdelete this._animatingSettings[key];\n\t\t\t--this._animatingCount;\n\t\t\tanimation.stop();\n\t\t}\n\t}\n\n\t/**\n\t * Sets a setting `value` for the specified `key`, and returns the same `value`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Setting key\n\t * @param value Setting value\n\t * @return Setting value\n\t */\n\tpublic set(key: Key, value: Value): Value {\n\t\tthis._set(key, value);\n\t\tthis._stopAnimation(key);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Removes a setting value for the specified `key`;\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Setting key\n\t */\n\tpublic remove(key: Key): void {\n\t\tif (key in this._settings) {\n\t\t\tthis._prevSettings[key] = (this._settings)[key];\n\n\t\t\tdelete (this._settings)[key];\n\n\t\t\tthis._sendKeyEvent(key, undefined as any);\n\t\t\tthis._markDirtyKey(key);\n\t\t}\n\n\t\tthis._stopAnimation(key);\n\t}\n\n\t/**\n\t * Removes all keys;\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t */\n\tpublic removeAll(): void {\n\t\t$array.each($object.keys(this._settings), (key) => {\n\t\t\tthis.remove(key);\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getPrivate(key: Key, fallback: F): NonNullable | F;\n\n\t/**\n\t * @ignore\n\t */\n\tpublic getPrivate(key: Key): this[\"_privateSettings\"][Key];\n\n\t/**\n\t * Returns a value of a private setting.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/#Private_settings} for more info\n\t */\n\tpublic getPrivate(key: Key, fallback?: any): any {\n\t\tconst value = (this._privateSettings)[key];\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tprivate _setPrivateRaw(key: Key, old: Value, value: Value) {\n\t\tthis._prevPrivateSettings[key] = old;\n\t\tthis._sendPrivateKeyEvent(key, value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setPrivateRaw(key: Key, value: Value) {\n\t\tconst old = (this._privateSettings)[key];\n\n\t\t(this._privateSettings)[key] = value;\n\n\t\tif (old !== value) {\n\t\t\tthis._setPrivateRaw(key, old, value);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tprivate _setPrivate(key: Key, value: this[\"_privateSettings\"][Key]) {\n\t\tconst old = (this._privateSettings)[key];\n\n\t\t(this._privateSettings)[key] = value;\n\n\t\tif (old !== value) {\n\t\t\tthis._setPrivateRaw(key, old, value);\n\t\t\tthis._markDirtyPrivateKey(key);\n\t\t}\n\t}\n\n\tprotected _stopAnimationPrivate(key: Key): void {\n\t\tconst animation = this._animatingPrivateSettings[key];\n\n\t\tif (animation) {\n\t\t\tanimation.stop();\n\t\t\tdelete this._animatingPrivateSettings[key];\n\t\t\t--this._animatingCount;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setPrivate(key: Key, value: Value): Value {\n\t\tthis._setPrivate(key, value);\n\t\tthis._stopAnimationPrivate(key);\n\t\treturn value;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic removePrivate(key: Key): void {\n\t\tif (key in this._privateSettings) {\n\t\t\tthis._prevPrivateSettings[key] = (this._privateSettings)[key];\n\n\t\t\tdelete (this._privateSettings)[key];\n\n\t\t\tthis._markDirtyPrivateKey(key);\n\t\t}\n\n\t\tthis._stopAnimationPrivate(key);\n\t}\n\n\t/**\n\t * Sets multiple settings at once.\n\t *\n\t * `settings` must be an object with key: value pairs.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param settings Settings\n\t */\n\tpublic setAll(settings: Partial) {\n\t\t$object.each(settings, (key, value) => {\n\t\t\tthis.set(key, value);\n\t\t});\n\t}\n\n\t/**\n\t * Animates setting values from current/start values to new ones.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/animations/#Animating_settings} for more info\n\t * @param options Animation options\n\t * @return Animation object\n\t */\n\tpublic animate(options: AnimationOptions): Animation {\n\t\tconst key = options.key;\n\t\tconst to = options.to;\n\t\tconst duration = options.duration || 0;\n\t\tconst loops = options.loops || 1;\n\n\t\tconst from = (options.from === undefined ? this.get(key) : options.from);\n\t\tconst easing = (options.easing === undefined ? $ease.linear : options.easing);\n\n\t\tif (duration === 0) {\n\t\t\tthis.set(key, to);\n\n\t\t} else {\n\t\t\tif (from === undefined || from === to) {\n\t\t\t\tthis.set(key, to);\n\n\t\t\t} else {\n\t\t\t\t++this._animatingCount;\n\n\t\t\t\tthis.set(key, from);\n\n\t\t\t\tconst animation = this._animatingSettings[key] = new Animation(from, to, duration, easing, loops, this._animationTime());\n\n\t\t\t\tthis._startAnimation();\n\n\t\t\t\treturn animation;\n\t\t\t}\n\t\t}\n\n\t\tconst animation = new Animation(from, to, duration, easing, loops, null);\n\t\tanimation.stop();\n\t\treturn animation;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic animatePrivate(options: AnimationOptions): Animation {\n\t\tconst key = options.key;\n\t\tconst to = options.to;\n\t\tconst duration = options.duration || 0;\n\t\tconst loops = options.loops || 1;\n\n\t\tconst from = (options.from === undefined ? this.getPrivate(key) : options.from);\n\t\tconst easing = (options.easing === undefined ? $ease.linear : options.easing);\n\n\t\tif (duration === 0) {\n\t\t\tthis.setPrivate(key, to);\n\n\t\t} else {\n\t\t\tif (from === undefined || from === to) {\n\t\t\t\tthis.setPrivate(key, to);\n\n\t\t\t} else {\n\t\t\t\t++this._animatingCount;\n\n\t\t\t\tthis.setPrivate(key, from);\n\n\t\t\t\tconst animation = this._animatingPrivateSettings[key] = new Animation(from, to, duration, easing, loops, this._animationTime());\n\n\t\t\t\tthis._startAnimation();\n\n\t\t\t\treturn animation;\n\t\t\t}\n\t\t}\n\n\t\tconst animation = new Animation(from, to, duration, easing, loops, null);\n\t\tanimation.stop();\n\t\treturn animation;\n\t}\n\n\tprotected _dispose() {}\n\n\t/**\n\t * Returns `true` if this element is disposed.\n\t *\n\t * @return Disposed\n\t */\n\tpublic isDisposed(): boolean {\n\t\treturn this._disposed;\n\t}\n\n\t/**\n\t * Disposes this object.\n\t */\n\tpublic dispose() {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\t\t\tthis._dispose();\n\t\t}\n\t}\n}\n\n/**\n * Base class.\n *\n * @important\n */\nexport class Entity extends Settings implements IDisposer {\n\tpublic _root: Root;\n\n\tpublic _user_id:any; // for testing purposes\n\n\tdeclare public _settings: IEntitySettings;\n\tdeclare public _privateSettings: IEntityPrivate;\n\tdeclare public _events: IEntityEvents;\n\n\tpublic states: States = new States(this);\n\tpublic adapters: Adapters = new Adapters(this);\n\tpublic events: EventDispatcher> = this._createEvents();\n\n\tprotected _userPrivateProperties: Dirty = {};\n\n\tpublic _dirty: Dirty = {};\n\tpublic _dirtyPrivate: Dirty = {};\n\n\tprotected _template: Template | undefined;\n\n\t// Templates for the themes\n\tprotected _templates: Array> = [];\n\n\t// Internal templates which can be overridden by the user's templates\n\tprotected _internalTemplates: Array>;\n\n\t// Default themes which can be overridden by the user's themes\n\tpublic _defaultThemes: Array = [];\n\n\t// Disposers for all of the templates\n\tprotected _templateDisposers: Array = [];\n\n\tprotected _disposers: Array = [];\n\n\t// Whether the template setup function should be run\n\tprotected _runSetup: boolean = true;\n\n\tpublic static className: string = \"Entity\";\n\tpublic static classNames: Array = [\"Entity\"];\n\n\tprotected _disposerProperties: { [Key in keyof this[\"_settings\"]]?: Array } = {};\n\n\t/**\n\t * IMPORTANT! Do not instantiate this class via `new Class()` syntax.\n\t *\n\t * Use static method `Class.new()` instead.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/getting-started/#New_element_syntax} for more info\n\t * @ignore\n\t */\n\tconstructor(root: Root, settings: Entity[\"_settings\"], isReal: boolean, templates: Array> = []) {\n\t\tsuper(settings);\n\t\tif (!isReal) {\n\t\t\tthrow new Error(\"You cannot use `new Class()`, instead use `Class.new()`\");\n\t\t}\n\t\tthis._root = root;\n\t\tthis._internalTemplates = templates as Array>;\n\t}\n\n\t/**\n\t * Use this method to create an instance of this class.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/getting-started/#New_element_syntax} for more info\n\t * @param root Root element\n\t * @param settings Settings\n\t * @param template Template\n\t * @return Instantiated object\n\t */\n\tstatic new>(this: C, root: Root, settings: T[\"_settings\"], template?: Template): T {\n\t\tconst x = (new this(root, settings, true)) as T;\n\t\tx._template = template;\n\t\tx._afterNew();\n\t\treturn x;\n\t}\n\n\tstatic _new>(this: C, root: Root, settings: T[\"_settings\"], templates: Array> = []): T {\n\t\tconst x = (new this(root, settings, true, templates)) as T;\n\t\tx._afterNew();\n\t\treturn x;\n\t}\n\n\tprotected _afterNew() {\n\t\tthis._checkDirty();\n\n\t\tlet shouldApply = false;\n\n\t\tconst template = this._template;\n\n\t\tif (template) {\n\t\t\tshouldApply = true;\n\t\t\ttemplate._setObjectTemplate(this);\n\t\t}\n\n\t\t$array.each(this._internalTemplates, (template) => {\n\t\t\tshouldApply = true;\n\t\t\ttemplate._setObjectTemplate(this);\n\t\t});\n\n\t\tif (shouldApply) {\n\t\t\tthis._applyTemplates(false);\n\t\t}\n\n\t\tthis.states.create(\"default\", {});\n\n\t\tthis._setDefaults();\n\t}\n\n\t// This is the same as _afterNew, except it also applies the themes.\n\t// This should only be used for classes which don't have a parent (because they extend from Entity and not Sprite).\n\tprotected _afterNewApplyThemes() {\n\t\tthis._checkDirty();\n\n\t\tconst template = this._template;\n\n\t\tif (template) {\n\t\t\ttemplate._setObjectTemplate(this);\n\t\t}\n\n\t\t$array.each(this._internalTemplates, (template) => {\n\t\t\ttemplate._setObjectTemplate(this);\n\t\t});\n\n\t\tthis.states.create(\"default\", {});\n\n\t\tthis._setDefaults();\n\n\t\tthis._applyThemes();\n\t}\n\n\tprotected _createEvents(): EventDispatcher> {\n\t\treturn new EventDispatcher();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic get classNames(): Array {\n\t\treturn (this.constructor as any).classNames;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic get className(): string {\n\t\treturn (this.constructor as any).className;\n\t}\n\n\tprotected _setDefaults(){\n\n\t}\n\n\tpublic _setDefault(key: Key, value: this[\"_settings\"][Key]) {\n\t\tif (!(key in this._settings)) {\n\t\t\tsuper.set(key, value);\n\t\t}\n\t}\n\n\tpublic _setRawDefault(key: Key, value: this[\"_settings\"][Key]) {\n\t\tif (!(key in this._settings)) {\n\t\t\tsuper.setRaw(key, value);\n\t\t}\n\t}\n\n\tpublic _clearDirty() {\n\t\t$object.keys(this._dirty).forEach((key) => {\n\t\t\tthis._dirty[key] = false;\n\t\t});\n\n\t\t$object.keys(this._dirtyPrivate).forEach((key) => {\n\t\t\tthis._dirtyPrivate[key] = false;\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic isDirty(key: Key): boolean {\n\t\treturn !!this._dirty[key];\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic isPrivateDirty(key: Key): boolean {\n\t\treturn !!this._dirtyPrivate[key];\n\t}\n\n\tpublic _markDirtyKey(key: Key) {\n\t\tthis._dirty[key] = true;\n\t\tsuper._markDirtyKey(key);\n\t}\n\n\tpublic _markDirtyPrivateKey(key: Key) {\n\t\tthis._dirtyPrivate[key] = true;\n\t\tsuper._markDirtyKey(key);\n\t}\n\n\t/**\n\t * Checks if element is of certain class (or inherits one).\n\t *\n\t * @param type Class name to check\n\t * @return {boolean} Is of class?\n\t */\n\tpublic isType(type: string): this is A {\n\t\treturn this.classNames.indexOf(type) !== -1;\n\t}\n\n\tprotected _pushPropertyDisposer(key: Key, disposer: D): D {\n\t\tlet disposers = this._disposerProperties[key];\n\n\t\tif (disposers === undefined) {\n\t\t\tdisposers = this._disposerProperties[key] = [];\n\t\t}\n\n\t\tdisposers.push(disposer);\n\n\t\treturn disposer;\n\t}\n\n\tprotected _disposeProperty(key: Key): void {\n\t\tconst disposers = this._disposerProperties[key];\n\n\t\tif (disposers !== undefined) {\n\t\t\t$array.each(disposers!, (disposer) => {\n\t\t\t\tdisposer.dispose();\n\t\t\t});\n\n\t\t\tdelete this._disposerProperties[key];\n\t\t}\n\t}\n\n\t/**\n\t * @todo needs description\n\t * @param value Template\n\t */\n\tpublic set template(value: Template | undefined) {\n\t\tconst template = this._template;\n\n\t\tif (template !== value) {\n\t\t\tthis._template = value;\n\n\t\t\tif (template) {\n\t\t\t\ttemplate._removeObjectTemplate(this);\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tvalue._setObjectTemplate(this);\n\t\t\t}\n\n\t\t\tthis._applyTemplates();\n\t\t}\n\t}\n\n\tpublic get template(): Template | undefined {\n\t\treturn this._template;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic markDirty() {\n\t\tthis._root._addDirtyEntity(this);\n\t}\n\n\tprotected _startAnimation(): void {\n\t\tthis._root._addAnimation(this);\n\t}\n\n\tprotected _animationTime(): number | null {\n\t\treturn this._root.animationTime;\n\t}\n\n\tpublic _applyState(_name: string): void { }\n\tpublic _applyStateAnimated(_name: string, _duration?: number): void { }\n\n\t/**\n\t * Returns settings value for the specified `key`.\n\t *\n\t * If there is no value, `fallback` is returned instead (if set).\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Settings value\n\t * @param callback Fallback value\n\t * @return Value\n\t */\n\tpublic get(key: Key, fallback: F): NonNullable | F;\n\tpublic get(key: Key): this[\"_settings\"][Key];\n\tpublic get(key: Key, fallback?: any): any {\n\t\tconst value = this.adapters.fold(key, (this._settings)[key]);\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\t/**\n\t * Sets a setting `value` for the specified `key`, and returns the same `value`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Setting key\n\t * @param value Setting value\n\t * @return Setting value\n\t */\n\tpublic set(key: Key, value: Value): Value {\n\t\tthis._userProperties[key] = true;\n\t\treturn super.set(key, value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setRaw(key: Key, value: Value) {\n\t\tthis._userProperties[key] = true;\n\t\tsuper.setRaw(key, value);\n\t}\n\n\t/**\n\t * Sets a setting `value` for the specified `key` only if the value for this key was not set previously using set method, and returns the same `value`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Setting key\n\t * @param value Setting value\n\t * @return Setting value\n\t */\n\tpublic _setSoft(key: Key, value: Value): Value {\n\t\tif(!this._userProperties[key]){\n\t\t\treturn super.set(key, value);\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Removes a setting value for the specified `key`.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/} for more info\n\t * @param key Setting key\n\t */\n\tpublic remove(key: Key) {\n\t\tdelete this._userProperties[key];\n\t\tthis._removeTemplateProperty(key);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setPrivate(key: Key, value: Value): Value {\n\t\tthis._userPrivateProperties[key] = true;\n\t\treturn super.setPrivate(key, value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic setPrivateRaw(key: Key, value: Value) {\n\t\tthis._userPrivateProperties[key] = true;\n\t\tsuper.setPrivateRaw(key, value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic removePrivate(key: Key) {\n\t\tdelete this._userPrivateProperties[key];\n\t\tthis._removeTemplatePrivateProperty(key);\n\t}\n\n\tpublic _setTemplateProperty(template: Template, key: Key, value: this[\"_settings\"][Key]) {\n\t\tif (!this._userProperties[key]) {\n\t\t\tconst match = this._findTemplateByKey(key);\n\n\t\t\tif (template === match) {\n\t\t\t\tsuper.set(key, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _setTemplatePrivateProperty(template: Template, key: Key, value: this[\"_privateSettings\"][Key]) {\n\t\tif (!this._userPrivateProperties[key]) {\n\t\t\tconst match = this._findTemplateByPrivateKey(key);\n\n\t\t\tif (template === match) {\n\t\t\t\tsuper.setPrivate(key, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _removeTemplateProperty(key: Key) {\n\t\tif (!this._userProperties[key]) {\n\t\t\tconst match = this._findTemplateByKey(key);\n\n\t\t\tif (match) {\n\t\t\t\t// TODO don't stop the animation if the property didn't change\n\t\t\t\tsuper.set(key, match._settings[key]!);\n\n\t\t\t} else {\n\t\t\t\tsuper.remove(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _removeTemplatePrivateProperty(key: Key) {\n\t\tif (!this._userPrivateProperties[key]) {\n\t\t\tconst match = this._findTemplateByPrivateKey(key);\n\n\t\t\tif (match) {\n\t\t\t\t// TODO don't stop the animation if the property didn't change\n\t\t\t\tsuper.setPrivate(key, match._privateSettings[key]);\n\n\t\t\t} else {\n\t\t\t\tsuper.removePrivate(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _walkParents(f: (parent: Entity) => void): void {\n\t\tf(this._root._rootContainer);\n\t\tf(this);\n\t}\n\n\t// TODO faster version of this method which is specialized to just 1 key\n\tpublic _applyStateByKey(name: string): void {\n\t\tconst other = this.states.create(name, {});\n\t\tconst seen: Dirty = {};\n\n\t\tthis._eachTemplate((template) => {\n\t\t\tconst state = template.states.lookup(name);\n\n\t\t\tif (state) {\n\t\t\t\tstate._apply(other, seen);\n\t\t\t}\n\t\t});\n\n\t\t$object.each(other._settings, (key) => {\n\t\t\tif (!seen[key] && !other._userSettings[key]) {\n\t\t\t\tother.remove(key);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _applyTemplate(template: Template, state: ApplyState): void {\n\t\tthis._templateDisposers.push(template._apply(this, state));\n\n\t\t$object.each(template._settings, (key, value) => {\n\t\t\tif (!state.settings[key] && !this._userProperties[key]) {\n\t\t\t\tstate.settings[key] = true;\n\t\t\t\tsuper.set(key, value);\n\t\t\t}\n\t\t});\n\n\t\t$object.each(template._privateSettings, (key, value) => {\n\t\t\tif (!state.privateSettings[key] && !this._userPrivateProperties[key]) {\n\t\t\t\tstate.privateSettings[key] = true;\n\t\t\t\tsuper.setPrivate(key, value);\n\t\t\t}\n\t\t});\n\n\t\tif (this._runSetup && template.setup) {\n\t\t\tthis._runSetup = false;\n\t\t\ttemplate.setup(this);\n\t\t}\n\t}\n\n\t/**\n\t * Calls the closure with each template and returns the first template which is true\n\t */\n\tprotected _findStaticTemplate(f: (template: Template) => boolean): Template | undefined {\n\t\tif (this._template) {\n\t\t\tif (f(this._template)) {\n\t\t\t\treturn this._template;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _eachTemplate(f: (template: Template) => void): void {\n\t\tthis._findStaticTemplate((template) => {\n\t\t\tf(template);\n\t\t\treturn false;\n\t\t});\n\n\t\t// _internalTemplates is sorted with most specific to the right\n\t\t$array.eachReverse(this._internalTemplates, f);\n\n\t\t// _templates is sorted with most specific to the left\n\t\t$array.each(this._templates, f);\n\t}\n\n\tpublic _applyTemplates(remove: boolean = true): void {\n\t\tif (remove) {\n\t\t\tthis._disposeTemplates();\n\t\t}\n\n\t\tconst state: ApplyState = {\n\t\t\tsettings: {},\n\t\t\tprivateSettings: {},\n\t\t\tstates: {},\n\t\t};\n\n\t\tthis._eachTemplate((template) => {\n\t\t\tthis._applyTemplate(template, state);\n\t\t});\n\n\t\tif (remove) {\n\t\t\t$object.each(this._settings, (key) => {\n\t\t\t\tif (!this._userProperties[key] && !state.settings[key]) {\n\t\t\t\t\tsuper.remove(key);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t$object.each(this._privateSettings, (key) => {\n\t\t\t\tif (!this._userPrivateProperties[key] && !state.privateSettings[key]) {\n\t\t\t\t\tsuper.removePrivate(key);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _findTemplate(f: (template: Template) => boolean): Template | undefined {\n\t\tconst value = this._findStaticTemplate(f);\n\n\t\tif (value === undefined) {\n\t\t\t// _internalTemplates is sorted with most specific to the right\n\t\t\tconst value = $array.findReverse(this._internalTemplates, f);\n\n\t\t\tif (value === undefined) {\n\t\t\t\t// _templates is sorted with most specific to the left\n\t\t\t\treturn $array.find(this._templates, f);\n\n\t\t\t} else {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else {\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tprotected _findTemplateByKey(key: Key): Template | undefined {\n\t\treturn this._findTemplate((template) => {\n\t\t\treturn key in template._settings;\n\t\t});\n\t}\n\n\tprotected _findTemplateByPrivateKey(key: Key): Template | undefined {\n\t\treturn this._findTemplate((template) => {\n\t\t\treturn key in template._privateSettings;\n\t\t});\n\t}\n\n\tprotected _disposeTemplates() {\n\t\t$array.each(this._templateDisposers, (disposer) => {\n\t\t\tdisposer.dispose();\n\t\t});\n\n\t\tthis._templateDisposers.length = 0;\n\t}\n\n\tprotected _removeTemplates() {\n\t\t$array.each(this._templates, (template) => {\n\t\t\ttemplate._removeObjectTemplate(this);\n\t\t});\n\n\t\tthis._templates.length = 0;\n\t}\n\n\tpublic _applyThemes(): boolean {\n\t\tlet isConnected = false;\n\n\t\tconst defaults: Array> = [];\n\n\t\tlet themes: Array> = [];\n\n\t\tconst themeTags: Set = new Set();\n\n\t\tconst tags = this.get(\"themeTagsSelf\");\n\n\t\tif (tags) {\n\t\t\t$array.each(tags, (tag) => {\n\t\t\t\tthemeTags.add(tag);\n\t\t\t});\n\t\t}\n\n\t\tthis._walkParents((entity) => {\n\t\t\tif (entity === this._root._rootContainer) {\n\t\t\t\tisConnected = true;\n\t\t\t}\n\n\t\t\tif (entity._defaultThemes.length > 0) {\n\t\t\t\tdefaults.push(entity._defaultThemes);\n\t\t\t}\n\n\t\t\tconst theme = entity.get(\"themes\");\n\n\t\t\tif (theme) {\n\t\t\t\tthemes.push(theme);\n\t\t\t}\n\n\t\t\tconst tags = entity.get(\"themeTags\");\n\n\t\t\tif (tags) {\n\t\t\t\t$array.each(tags, (tag) => {\n\t\t\t\t\tthemeTags.add(tag);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthemes = defaults.concat(themes);\n\n\t\tthis._removeTemplates();\n\n\t\tif (isConnected) {\n\t\t\t$array.eachReverse(this.classNames, (name) => {\n\t\t\t\tconst allRules: Array> = [];\n\n\t\t\t\t$array.each(themes, (themes) => {\n\t\t\t\t\t$array.each(themes, (theme) => {\n\t\t\t\t\t\tconst rules = theme._lookupRules(name);\n\n\t\t\t\t\t\tif (rules) {\n\t\t\t\t\t\t\t$array.eachReverse(rules, (rule) => {\n\t\t\t\t\t\t\t\tconst matches = rule.tags.every((tag) => {\n\t\t\t\t\t\t\t\t\treturn themeTags.has(tag);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\t\tconst result = $array.getFirstSortedIndex(allRules, (x) => {\n\t\t\t\t\t\t\t\t\t\tconst order = $order.compare(rule.tags.length, x.tags.length);\n\n\t\t\t\t\t\t\t\t\t\tif (order === 0) {\n\t\t\t\t\t\t\t\t\t\t\treturn $order.compareArray(rule.tags, x.tags, $order.compare);\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\treturn order;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tallRules.splice(result.index, 0, rule);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t$array.each(allRules, (rule) => {\n\t\t\t\t\tthis._templates.push(rule.template);\n\t\t\t\t\trule.template._setObjectTemplate(this);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis._applyTemplates();\n\n\t\tif (isConnected) {\n\t\t\t// This causes it to only run the setup function the first time that the themes are applied\n\t\t\tthis._runSetup = false;\n\t\t}\n\n\t\treturn isConnected;\n\t}\n\n\tpublic _changed(): void { }\n\n\tpublic _beforeChanged(): void {\n\n\t\tif (this.isDirty(\"id\")) {\n\t\t\tconst id = this.get(\"id\")!;\n\t\t\tif (id) {\n\t\t\t\tif (registry.entitiesById[id]) {\n\t\t\t\t\tthrow new Error(\"An entity with id \\\"\" + id + \"\\\" already exists.\");\n\t\t\t\t}\n\t\t\t\tregistry.entitiesById[id] = this;\n\t\t\t}\n\n\t\t\tconst prevId = this._prevSettings.id;\n\t\t\tif(prevId) {\n\t\t\t\tdelete registry.entitiesById[prevId];\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _afterChanged(): void { }\n\n\t/**\n\t * @ignore\n\t */\n\tpublic addDisposer(disposer: T): T {\n\t\tthis._disposers.push(disposer);\n\t\treturn disposer;\n\t}\n\n\tprotected _dispose() {\n\t\tsuper._dispose();\n\n\t\tconst template = this._template;\n\n\t\tif (template) {\n\t\t\ttemplate._removeObjectTemplate(this);\n\t\t}\n\n\t\t$array.each(this._internalTemplates, (template) => {\n\t\t\ttemplate._removeObjectTemplate(this);\n\t\t});\n\n\t\tthis._removeTemplates();\n\t\tthis._disposeTemplates();\n\n\t\tthis.events.dispose();\n\n\t\tthis._disposers.forEach((x) => {\n\t\t\tx.dispose();\n\t\t});\n\n\t\t$object.each(this._disposerProperties, (_, disposers) => {\n\t\t\t$array.each(disposers, (disposer) => {\n\t\t\t\tdisposer.dispose();\n\t\t\t});\n\t\t});\n\n\t\tconst id = this.get(\"id\")!;\n\t\tif (id) {\n\t\t\tdelete registry.entitiesById[id];\n\t\t}\n\t}\n\n\t/**\n\t * Creates and returns a \"disposable\" timeout.\n\t *\n\t * @param fn Callback\n\t * @param delay Delay in milliseconds\n\t * @return Timeout disposer\n\t */\n\tpublic setTimeout(fn: () => void, delay: number): IDisposer {\n\t\tconst id = setTimeout(() => {\n\t\t\tthis.removeDispose(disposer);\n\t\t\tfn();\n\t\t}, delay);\n\n\t\tconst disposer = new Disposer(() => {\n\t\t\tclearTimeout(id);\n\t\t});\n\n\t\tthis._disposers.push(disposer);\n\t\treturn disposer;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic removeDispose(target: IDisposer): void {\n\t\tif (!this.isDisposed()) {\n\t\t\tlet index = $array.indexOf(this._disposers, target);\n\t\t\tif (index > -1) {\n\t\t\t\tthis._disposers.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\ttarget.dispose();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic hasTag(tag: string): boolean {\n\t\treturn $array.indexOf(this.get(\"themeTags\", []), tag) !== -1;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic addTag(tag: string): void {\n\t\tif (!this.hasTag(tag)) {\n\t\t\tconst tags = (this).get(\"themeTags\", []);\n\t\t\ttags.push(tag);\n\t\t\tthis.set(\"themeTags\", tags);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic removeTag(tag: string): void {\n\t\tif (this.hasTag(tag)) {\n\t\t\tconst tags = (this).get(\"themeTags\", []);\n\t\t\t$array.remove(tags, tag);\n\t\t\tthis.set(\"themeTags\", tags);\n\t\t}\n\t}\n\n\tprotected _t(text: any, locale?: ILocale, ...rest: Array){\n\t\treturn this._root.language.translate(text, locale, ...rest);\n\t}\n\n\t/**\n\t * An instance of [[Root]] object.\n\t *\n\t * @readonly\n\t * @since 5.0.6\n\t * @return Root object\n\t */\n\tpublic get root(): Root {\n\t\treturn this._root;\n\t}\n\n}\n","/**\n * Event Dispatcher module is used for registering listeners and dispatching\n * events across amCharts system.\n */\n\n/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\nimport { Disposer, IDisposer, MultiDisposer } from \"./Disposer\";\nimport * as $array from \"./Array\";\nimport * as $type from \"./Type\";\n\n/**\n * @ignore\n */\nexport type Events = {\n\t[K in keyof T]: T[K] & { type: K, target: Target }\n};\n\n/**\n * A universal interface for event listeners.\n *\n * @ignore\n */\nexport interface EventListener {\n\tkilled: boolean;\n\tonce: boolean;\n\ttype: any | null;\n\tcallback: (event: any) => void;\n\tcontext: unknown;\n\tshouldClone: boolean;\n\tdispatch: (type: any, event: any) => void;\n\tdisposer: IDisposer;\n}\n\n/**\n * Universal Event Dispatcher.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/events/} for more info\n */\nexport class EventDispatcher implements IDisposer {\n\tprotected _listeners: Array;\n\tprotected _killed: Array;\n\tprotected _disabled: { [key in keyof T]?: number };\n\tprotected _iterating: number;\n\tprotected _enabled: boolean;\n\tprotected _disposed: boolean;\n\n\n\t/**\n\t * Constructor\n\t */\n\tconstructor() {\n\t\tthis._listeners = [];\n\t\tthis._killed = [];\n\t\tthis._disabled = {};\n\t\tthis._iterating = 0;\n\t\tthis._enabled = true;\n\t\tthis._disposed = false;\n\t}\n\n\t/**\n\t * Returns if this object has been already disposed.\n\t *\n\t * @return Disposed?\n\t */\n\tpublic isDisposed(): boolean {\n\t\treturn this._disposed;\n\t}\n\n\t/**\n\t * Dispose (destroy) this object.\n\t */\n\tpublic dispose(): void {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\n\t\t\tconst a = this._listeners;\n\n\t\t\tthis._iterating = 1;\n\t\t\tthis._listeners = null;\n\t\t\tthis._disabled = null;\n\n\t\t\ttry {\n\t\t\t\t$array.each(a, (x) => {\n\t\t\t\t\tx.disposer.dispose();\n\t\t\t\t});\n\n\t\t\t} finally {\n\t\t\t\tthis._killed = null;\n\t\t\t\tthis._iterating = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if this particular event dispatcher has any listeners set.\n\t *\n\t * @return Has listeners?\n\t */\n\tpublic hasListeners(): boolean {\n\t\treturn this._listeners.length !== 0;\n\t}\n\n\t/**\n\t * Checks if this particular event dispatcher has any particular listeners set.\n\t *\n\t * @return Has particular event listeners?\n\t */\n\tpublic hasListenersByType(type: Key): boolean {\n\t\treturn $array.any(this._listeners, (x) => (x.type === null || x.type === type) && !x.killed);\n\t}\n\n\t/**\n\t * Enable dispatching of events if they were previously disabled by\n\t * `disable()`.\n\t */\n\tpublic enable(): void {\n\t\tthis._enabled = true;\n\t}\n\n\t/**\n\t * Disable dispatching of events until re-enabled by `enable()`.\n\t */\n\tpublic disable(): void {\n\t\tthis._enabled = false;\n\t}\n\n\t/**\n\t * Enable dispatching particular event, if it was disabled before by\n\t * `disableType()`.\n\t *\n\t * @param type Event type\n\t */\n\tpublic enableType(type: Key): void {\n\t\tdelete this._disabled[type];\n\t}\n\n\t/**\n\t * Disable dispatching of events for a certain event type.\n\t *\n\t * Optionally, can set how many dispatches to skip before automatically\n\t * re-enabling the dispatching.\n\t *\n\t * @param type Event type\n\t * @param amount Number of event dispatches to skip\n\t */\n\tpublic disableType(type: Key, amount: number = Infinity): void {\n\t\tthis._disabled[type] = amount;\n\t}\n\n\t/**\n\t * Removes listener from dispatcher.\n\t *\n\t * Will throw an exception if such listener does not exists.\n\t *\n\t * @param listener Listener to remove\n\t */\n\tprotected _removeListener(listener: EventListener): void {\n\t\tif (this._iterating === 0) {\n\t\t\tconst index = this._listeners.indexOf(listener);\n\n\t\t\tif (index === -1) {\n\t\t\t\tthrow new Error(\"Invalid state: could not remove listener\");\n\t\t\t}\n\n\t\t\tthis._listeners.splice(index, 1);\n\n\t\t} else {\n\t\t\tthis._killed.push(listener);\n\t\t}\n\t}\n\n\t/**\n\t * Removes existing listener by certain parameters.\n\t *\n\t * @param once Listener's once setting\n\t * @param type Listener's type\n\t * @param callback Callback function\n\t * @param context Callback context\n\t */\n\tprotected _removeExistingListener(once: boolean, type: Key | null, callback?: (this: C, event: T[Key]) => void, context?: C): void {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"EventDispatcher is disposed\");\n\t\t}\n\n\t\tthis._eachListener((info) => {\n\t\t\tif (info.once === once && // TODO is this correct ?\n\t\t\t\tinfo.type === type &&\n\t\t\t\t(callback === undefined || info.callback === callback) &&\n\t\t\t\tinfo.context === context) {\n\t\t\t\tinfo.disposer.dispose();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Checks if dispatching for particular event type is enabled.\n\t *\n\t * @param type Event type\n\t * @return Enabled?\n\t */\n\tpublic isEnabled(type: Key): boolean {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"EventDispatcher is disposed\");\n\t\t}\n\n\t\t// TODO is this check correct ?\n\t\treturn this._enabled && this._listeners.length > 0 && this.hasListenersByType(type) && this._disabled[type] === undefined;\n\t}\n\n\t/**\n\t * Checks if there's already a listener with specific parameters.\n\t *\n\t * @param type Listener's type\n\t * @param callback Callback function\n\t * @param context Callback context\n\t * @return Has listener?\n\t */\n\tpublic has(type: Key, callback?: (this: C, event: T[Key]) => void, context?: C): boolean {\n\t\tconst index = $array.findIndex(this._listeners, (info) => {\n\t\t\treturn info.once !== true && // Ignoring \"once\" listeners\n\t\t\t\tinfo.type === type &&\n\t\t\t\t(callback === undefined || info.callback === callback) &&\n\t\t\t\tinfo.context === context;\n\t\t});\n\n\t\treturn index !== -1;\n\t}\n\n\t/**\n\t * Checks whether event of the particular type should be dispatched.\n\t *\n\t * @param type Event type\n\t * @return Dispatch?\n\t */\n\tprotected _shouldDispatch(type: Key): boolean {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"EventDispatcher is disposed\");\n\t\t}\n\n\t\tconst count = this._disabled[type];\n\n\t\tif (!$type.isNumber(count)) {\n\t\t\treturn this._enabled;\n\n\t\t} else {\n\t\t\tif (count <= 1) {\n\t\t\t\tdelete this._disabled[type];\n\n\t\t\t} else {\n\t\t\t\t--this._disabled[type]!;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * [_eachListener description]\n\t *\n\t * All of this extra code is needed when a listener is removed while iterating\n\t *\n\t * @todo Description\n\t * @param fn [description]\n\t */\n\tprotected _eachListener(fn: (listener: EventListener) => void): void {\n\t\t++this._iterating;\n\n\t\ttry {\n\t\t\t$array.each(this._listeners, fn);\n\n\t\t} finally {\n\t\t\t--this._iterating;\n\n\t\t\t// TODO should this be inside or outside the finally ?\n\t\t\tif (this._iterating === 0 && this._killed.length !== 0) {\n\t\t\t\t// Remove killed listeners\n\t\t\t\t$array.each(this._killed, (killed) => {\n\t\t\t\t\tthis._removeListener(killed);\n\t\t\t\t});\n\n\t\t\t\tthis._killed.length = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Dispatches an event immediately without waiting for next cycle.\n\t *\n\t * @param type Event type\n\t * @param event Event object\n\t * @todo automatically add in type and target properties if they are missing\n\t */\n\tpublic dispatch(type: Key, event: T[Key]): void {\n\t\tif (this._shouldDispatch(type)) {\n\t\t\t// TODO check if it's faster to use an object of listeners rather than a single big array\n\t\t\t// TODO if the function throws, maybe it should keep going ?\n\t\t\tthis._eachListener((listener) => {\n\t\t\t\tif (!listener.killed && (listener.type === null || listener.type === type)) {\n\t\t\t\t\tlistener.dispatch(type, event);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Shelves the event to be dispatched within next update cycle.\n\t *\n\t * @param type Event type\n\t * @param event Event object\n\t * @todo automatically add in type and target properties if they are missing\n\t */\n\t/*public dispatchLater(type: Key, event: T[Key]): void {\n\t\tif (this._shouldDispatch(type)) {\n\t\t\tthis._eachListener((listener) => {\n\t\t\t\t// TODO check if it's faster to use an object of listeners rather than a single big array\n\t\t\t\tif (!listener.killed && (listener.type === null || listener.type === type)) {\n\t\t\t\t\t// TODO if the function throws, maybe it should keep going ?\n\t\t\t\t\t// TODO dispatch during the update cycle, rather than using whenIdle\n\t\t\t\t\t$async.whenIdle(() => {\n\t\t\t\t\t\tif (!listener.killed) {\n\t\t\t\t\t\t\tlistener.dispatch(type, event);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}*/\n\n\t/**\n\t * Creates, catalogs and returns an [[EventListener]].\n\t *\n\t * Event listener can be disposed.\n\t *\n\t * @param once Listener's once setting\n\t * @param type Listener's type\n\t * @param callback Callback function\n\t * @param context Callback context\n\t * @param shouldClone Whether the listener should be copied when the EventDispatcher is copied\n\t * @param dispatch\n\t * @returns An event listener\n\t */\n\tprotected _on(once: boolean, type: Key | null, callback: any, context: C, shouldClone: boolean, dispatch: (type: Key, event: T[Key]) => void): EventListener {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"EventDispatcher is disposed\");\n\t\t}\n\n\t\tthis._removeExistingListener(once, type, callback, context);\n\n\t\tconst info: EventListener = {\n\t\t\ttype: type,\n\t\t\tcallback: callback,\n\t\t\tcontext: context,\n\t\t\tshouldClone: shouldClone,\n\t\t\tdispatch: dispatch,\n\t\t\tkilled: false,\n\t\t\tonce: once,\n\t\t\tdisposer: new Disposer(() => {\n\t\t\t\tinfo.killed = true;\n\t\t\t\tthis._removeListener(info);\n\t\t\t})\n\t\t};\n\n\t\tthis._listeners.push(info);\n\n\t\treturn info;\n\t}\n\n\t/**\n\t * Creates an event listener to be invoked on **any** event.\n\t *\n\t * @param callback Callback function\n\t * @param context Callback context\n\t * @param shouldClone Whether the listener should be copied when the EventDispatcher is copied\n\t * @returns A disposable event listener\n\t */\n\tpublic onAll(callback: (this: C, event: T[K]) => void, context?: C, shouldClone: boolean = true): IDisposer {\n\t\treturn this._on(false, null, callback, context, shouldClone, (_type, event) => (callback).call(context, event as any)).disposer;\n\t}\n\n\t/**\n\t * Creates an event listener to be invoked on a specific event type.\n\t *\n\t * ```TypeScript\n\t * button.events.once(\"click\", (ev) => {\n\t * console.log(\"Button clicked\");\n\t * }, this);\n\t * ```\n\t * ```JavaScript\n\t * button.events.once(\"click\", (ev) => {\n\t * console.log(\"Button clicked\");\n\t * }, this);\n\t * ```\n\t *\n\t * The above will invoke our custom event handler whenever series we put\n\t * event on is hidden.\n\t *\n\t * @param type Listener's type\n\t * @param callback Callback function\n\t * @param context Callback context\n\t * @param shouldClone Whether the listener should be copied when the EventDispatcher is copied\n\t * @returns A disposable event listener\n\t */\n\tpublic on(type: Key, callback: (this: C | undefined, event: T[Key]) => void, context?: C, shouldClone: boolean = true): IDisposer {\n\t\treturn this._on(false, type, callback, context, shouldClone, (_type, event) => callback.call(context, event)).disposer;\n\t}\n\n\t/**\n\t * Creates an event listener to be invoked on a specific event type once.\n\t *\n\t * Once the event listener is invoked, it is automatically disposed.\n\t *\n\t * ```TypeScript\n\t * button.events.once(\"click\", (ev) => {\n\t * console.log(\"Button clicked\");\n\t * }, this);\n\t * ```\n\t * ```JavaScript\n\t * button.events.once(\"click\", (ev) => {\n\t * console.log(\"Button clicked\");\n\t * }, this);\n\t * ```\n\t *\n\t * The above will invoke our custom event handler the first time series we\n\t * put event on is hidden.\n\t *\n\t * @param type Listener's type\n\t * @param callback Callback function\n\t * @param context Callback context\n\t * @param shouldClone Whether the listener should be copied when the EventDispatcher is copied\n\t * @returns A disposable event listener\n\t */\n\tpublic once(type: Key, callback: (this: C | undefined, event: T[Key]) => void, context?: C, shouldClone: boolean = true): IDisposer {\n\t\tconst x = this._on(true, type, callback, context, shouldClone, (_type, event) => {\n\t\t\tx.disposer.dispose();\n\t\t\tcallback.call(context, event)\n\t\t});\n\n\t\t// TODO maybe this should return a different Disposer ?\n\t\treturn x.disposer;\n\t}\n\n\t/**\n\t * Removes the event listener with specific parameters.\n\t *\n\t * @param type Listener's type\n\t * @param callback Callback function\n\t * @param context Callback context\n\t */\n\tpublic off(type: Key, callback?: (this: C, event: T[Key]) => void, context?: C): void {\n\t\tthis._removeExistingListener(false, type, callback, context);\n\t}\n\n\n\t/**\n\t * Copies all dispatcher parameters, including listeners, from another event\n\t * dispatcher.\n\t *\n\t * @param source Source event dispatcher\n\t * @ignore\n\t */\n\tpublic copyFrom(source: this): IDisposer {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"EventDispatcher is disposed\");\n\t\t}\n\n\t\tif (source === this) {\n\t\t\tthrow new Error(\"Cannot copyFrom the same TargetedEventDispatcher\");\n\t\t}\n\n\t\tconst disposers: Array = [];\n\n\t\t$array.each(source._listeners, (x) => {\n\t\t\t// TODO is this correct ?\n\t\t\tif (!x.killed && x.shouldClone) {\n\t\t\t\tif (x.type === null) {\n\t\t\t\t\tdisposers.push(this.onAll(x.callback as any, x.context));\n\n\t\t\t\t} else if (x.once) {\n\t\t\t\t\tdisposers.push(this.once(x.type, x.callback, x.context));\n\n\t\t\t\t} else {\n\t\t\t\t\tdisposers.push(this.on(x.type, x.callback, x.context));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn new MultiDisposer(disposers);\n\t}\n\n}\n\n/**\n * A version of the [[EventDispatcher]] that dispatches events for a specific\n * target object.\n *\n * @ignore\n */\nexport class TargetedEventDispatcher extends EventDispatcher {\n\n\t/**\n\t * A target object which is originating events using this dispatcher.\n\t */\n\tpublic target: Target;\n\n\t/**\n\t * Constructor\n\t *\n\t * @param target Event dispatcher target\n\t */\n\tconstructor(target: Target) {\n\t\tsuper();\n\t\tthis.target = target;\n\t}\n\n\t/**\n\t * Copies all dispatcher parameters, including listeners, from another event\n\t * dispatcher.\n\t *\n\t * @param source Source event dispatcher\n\t * @ignore\n\t */\n\tpublic copyFrom(source: this): IDisposer {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"EventDispatcher is disposed\");\n\t\t}\n\n\t\tif (source === this) {\n\t\t\tthrow new Error(\"Cannot copyFrom the same TargetedEventDispatcher\");\n\t\t}\n\n\t\tconst disposers: Array = [];\n\n\t\t$array.each(source._listeners, (x) => {\n\t\t\t// TODO very hacky\n\t\t\tif (x.context === source.target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// TODO is this correct ?\n\t\t\tif (!x.killed && x.shouldClone) {\n\t\t\t\tif (x.type === null) {\n\t\t\t\t\tdisposers.push(this.onAll(x.callback as any, x.context));\n\n\t\t\t\t} else if (x.once) {\n\t\t\t\t\tdisposers.push(this.once(x.type, x.callback, x.context));\n\n\t\t\t\t} else {\n\t\t\t\t\tdisposers.push(this.on(x.type, x.callback, x.context));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn new MultiDisposer(disposers);\n\t}\n\n}\n","import type { Color } from \"./Color\"\n\nimport { Entity, IEntitySettings } from \"./Entity\"\n\n\nexport interface IInterfaceColorsSettings extends IEntitySettings {\n\n\t/**\n\t * Used for generic outlines.\n\t */\n\tstroke?: Color,\n\n\t/**\n\t * Used for genmeric fills.\n\t */\n\tfill?: Color,\n\n\t/**\n\t * Primary button fill color.\n\t */\n\tprimaryButton?: Color,\n\n\t/**\n\t * Primary button fill color on hover.\n\t */\n\tprimaryButtonHover?: Color,\n\n\t/**\n\t * Primary button fill color when pressing down on it.\n\t */\n\tprimaryButtonDown?: Color,\n\n\t/**\n\t * Primary button fill color when it is set as active.\n\t */\n\tprimaryButtonActive?: Color,\n\n\t/**\n\t * Primary button text color.\n\t */\n\tprimaryButtonText?: Color,\n\n\t/**\n\t * Primary button stroke (outline) color.\n\t */\n\tprimaryButtonStroke?: Color,\n\n\t/**\n\t * Secondary button fill color.\n\t */\n\tsecondaryButton?: Color,\n\n\t/**\n\t * Secondary button fill color on hover.\n\t */\n\tsecondaryButtonHover?: Color,\n\n\t/**\n\t * Secondary button fill color when pressing down on it.\n\t */\n\tsecondaryButtonDown?: Color,\n\n\t/**\n\t * Secondary button fill color when it is set as active.\n\t */\n\tsecondaryButtonActive?: Color,\n\n\t/**\n\t * Secondary button text color.\n\t */\n\tsecondaryButtonText?: Color,\n\n\t/**\n\t * Secondary button stroke (outline) color.\n\t */\n\tsecondaryButtonStroke?: Color,\n\n\t/**\n\t * Grid color.\n\t */\n\tgrid?: Color,\n\n\t/**\n\t * Chart background color.\n\t */\n\tbackground?: Color,\n\n\t/**\n\t * Alternative background, for elements that need to contrast with primary\n\t * background.\n\t */\n\talternativeBackground?: Color,\n\n\t/**\n\t * Label text color.\n\t */\n\ttext?: Color,\n\n\t/**\n\t * Alternative text color, used for inverted (dark) backgrounds.\n\t * @type {[type]}\n\t */\n\talternativeText?: Color,\n\n\t/**\n\t * Color for disabled elements.\n\t */\n\tdisabled?: Color,\n\n\t/**\n\t * Color to indicate positive value.\n\t */\n\tpositive?: Color,\n\n\t/**\n\t * Color to indicate negative value.\n\t */\n\tnegative?: Color\n\n}\n\n\n/**\n * Presets for common UI elements.\n */\nexport class InterfaceColors extends Entity {\n\tpublic static className: string = \"InterfaceColors\";\n\tpublic static classNames: Array = Entity.classNames.concat([InterfaceColors.className]);\n\n\tdeclare public _settings: IInterfaceColorsSettings;\n}\n","/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\nimport type { Entity } from \"./Entity\";\nimport type { Template } from \"./Template\";\nimport type { IDisposer } from \"./Disposer\";\nimport { EventDispatcher, Events } from \"./EventDispatcher\";\nimport * as $array from \"./Array\";\nimport type { Optional } from \"./Type\";\n\n\n/**\n * Checks if specific index fits into length.\n *\n * @param index Index\n * @param len Length\n * @ignore\n */\nfunction checkBounds(index: number, len: number): void {\n\tif (!(index >= 0 && index < len)) {\n\t\tthrow new Error(\"Index out of bounds: \" + index);\n\t}\n}\n\n\nexport interface IListEvents {\n\tclear: {\n\t\toldValues: Array,\n\t};\n\tpush: {\n\t\tnewValue: A,\n\t};\n\tinsertIndex: {\n\t\tindex: number,\n\t\tnewValue: A,\n\t};\n\tsetIndex: {\n\t\tindex: number,\n\t\toldValue: A,\n\t\tnewValue: A,\n\t};\n\tremoveIndex: {\n\t\tindex: number,\n\t\toldValue: A,\n\t};\n\tmoveIndex: {\n\t\toldIndex: number,\n\t\tnewIndex: number,\n\t\tvalue: A,\n\t};\n}\n\n\n/**\n * A List class is used to hold a number of indexed items of the same type.\n */\nexport class List {\n\n\t/**\n\t * List values.\n\t */\n\tprotected _values: Array;\n\n\tpublic events = new EventDispatcher>>();\n\n\t/**\n\t * Constructor\n\t *\n\t * @param initial Inital list of values to add to list\n\t */\n\tconstructor(initial: Array = []) {\n\t\tthis._values = initial;\n\t}\n\n\t/**\n\t * An array of values in the list.\n\t *\n\t * Do not use this property to add values. Rather use dedicated methods, like\n\t * `push()`, `removeIndex()`, etc.\n\t *\n\t * @readonly\n\t * @return List values\n\t */\n\tpublic get values(): Array {\n\t\treturn this._values;\n\t}\n\n\t/**\n\t * Checks if list contains specific item reference.\n\t *\n\t * @param item Item to search for\n\t * @return `true` if found, `false` if not found\n\t */\n\tpublic contains(value: T): boolean {\n\t\treturn this._values.indexOf(value) !== -1;\n\t}\n\n\t/**\n\t * Removes specific item from the list.\n\t *\n\t * @param item An item to remove\n\t */\n\tpublic removeValue(value: T): void {\n\t\tlet i = 0;\n\t\tlet length = this._values.length;\n\n\t\twhile (i < length) {\n\t\t\t// TODO handle NaN\n\t\t\tif (this._values[i] === value) {\n\t\t\t\tthis.removeIndex(i);\n\t\t\t\t--length;\n\n\t\t\t} else {\n\t\t\t\t++i;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Searches the list for specific item and returns its index.\n\t *\n\t * @param item An item to search for\n\t * @return Index or -1 if not found\n\t */\n\tpublic indexOf(value: T): number {\n\t\treturn $array.indexOf(this._values, value);\n\t}\n\n\t/**\n\t * Number of items in list.\n\t *\n\t * @readonly\n\t * @return Number of items\n\t */\n\tpublic get length(): number {\n\t\treturn this._values.length;\n\t}\n\n\t/**\n\t * Checks if there's a value at specific index.\n\t *\n\t * @param index Index\n\t * @return Value exists?\n\t */\n\tpublic hasIndex(index: number): boolean {\n\t\treturn index >= 0 && index < this._values.length;\n\t}\n\n\t/**\n\t * Returns an item at specified index.\n\t *\n\t * @param index Index\n\t * @return List item\n\t */\n\tpublic getIndex(index: number): T | undefined {\n\t\treturn this._values[index];\n\t}\n\n\tprotected _onPush(newValue: T) {\n\t\tif (this.events.isEnabled(\"push\")) {\n\t\t\tthis.events.dispatch(\"push\", {\n\t\t\t\ttype: \"push\",\n\t\t\t\ttarget: this,\n\t\t\t\tnewValue\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _onInsertIndex(index: number, newValue: T) {\n\t\tif (this.events.isEnabled(\"insertIndex\")) {\n\t\t\tthis.events.dispatch(\"insertIndex\", {\n\t\t\t\ttype: \"insertIndex\",\n\t\t\t\ttarget: this,\n\t\t\t\tindex,\n\t\t\t\tnewValue\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _onSetIndex(index: number, oldValue: T, newValue: T) {\n\t\tif (this.events.isEnabled(\"setIndex\")) {\n\t\t\tthis.events.dispatch(\"setIndex\", {\n\t\t\t\ttype: \"setIndex\",\n\t\t\t\ttarget: this,\n\t\t\t\tindex,\n\t\t\t\toldValue,\n\t\t\t\tnewValue\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _onRemoveIndex(index: number, oldValue: T) {\n\t\tif (this.events.isEnabled(\"removeIndex\")) {\n\t\t\tthis.events.dispatch(\"removeIndex\", {\n\t\t\t\ttype: \"removeIndex\",\n\t\t\t\ttarget: this,\n\t\t\t\tindex,\n\t\t\t\toldValue\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _onMoveIndex(oldIndex: number, newIndex: number, value: T) {\n\t\tif (this.events.isEnabled(\"moveIndex\")) {\n\t\t\tthis.events.dispatch(\"moveIndex\", {\n\t\t\t\ttype: \"moveIndex\",\n\t\t\t\ttarget: this,\n\t\t\t\toldIndex,\n\t\t\t\tnewIndex,\n\t\t\t\tvalue,\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _onClear(oldValues: Array) {\n\t\tif (this.events.isEnabled(\"clear\")) {\n\t\t\tthis.events.dispatch(\"clear\", {\n\t\t\t\ttype: \"clear\",\n\t\t\t\ttarget: this,\n\t\t\t\toldValues\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Sets value at specific index.\n\t *\n\t * If there's already a value at the index, it is overwritten.\n\t *\n\t * @param index Index\n\t * @param value New value\n\t * @return New value\n\t */\n\tpublic setIndex(index: number, value: T): T {\n\t\tcheckBounds(index, this._values.length);\n\n\t\tconst oldValue = this._values[index];\n\n\t\t// Do nothing if the old value and the new value are the same\n\t\tif (oldValue !== value) {\n\t\t\tthis._values[index] = value;\n\t\t\tthis._onSetIndex(index, oldValue, value);\n\t\t}\n\n\t\treturn oldValue;\n\t}\n\n\t/**\n\t * Adds an item to the list at a specific index, which pushes all the other\n\t * items further down the list.\n\t *\n\t * @param index Index\n\t * @param item An item to add\n\t */\n\tpublic insertIndex(index: number, value: K): K {\n\t\tcheckBounds(index, this._values.length + 1);\n\n\t\t$array.insertIndex(this._values, index, value);\n\t\tthis._onInsertIndex(index, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Swaps indexes of two items in the list.\n\t *\n\t * @param a Item 1\n\t * @param b Item 2\n\t */\n\tpublic swap(a: number, b: number): void {\n\t\tconst len = this._values.length;\n\n\t\tcheckBounds(a, len);\n\t\tcheckBounds(b, len);\n\n\t\tif (a !== b) {\n\t\t\tconst value_a = this._values[a];\n\t\t\tconst value_b = this._values[b];\n\n\t\t\tthis._values[a] = value_b;\n\t\t\tthis._onSetIndex(a, value_a, value_b);\n\n\t\t\tthis._values[b] = value_a;\n\t\t\tthis._onSetIndex(b, value_b, value_a);\n\t\t}\n\t}\n\n\t/**\n\t * Removes a value at specific index.\n\t *\n\t * @param index Index of value to remove\n\t * @return Removed value\n\t */\n\tpublic removeIndex(index: number): T {\n\t\tcheckBounds(index, this._values.length);\n\n\t\tconst oldValue = this._values[index];\n\n\t\t$array.removeIndex(this._values, index);\n\t\tthis._onRemoveIndex(index, oldValue);\n\n\t\treturn oldValue;\n\t}\n\n\t/**\n\t * Moves an item to a specific index within the list.\n\t *\n\t * If the index is not specified it will move the item to the end of the\n\t * list.\n\t *\n\t * @param value Item to move\n\t * @param index Index to place item at\n\t */\n\tpublic moveValue(value: K, toIndex?: number): K {\n\t\t// TODO don't do anything if the desired index is the same as the current index\n\t\tlet index = this.indexOf(value);\n\n\t\t// TODO remove all old values rather than only the first ?\n\t\tif (index !== -1) {\n\t\t\t$array.removeIndex(this._values, index);\n\n\t\t\tif (toIndex == null) {\n\t\t\t\tconst toIndex = this._values.length;\n\t\t\t\tthis._values.push(value);\n\t\t\t\tthis._onMoveIndex(index, toIndex, value);\n\n\t\t\t} else {\n\t\t\t\t$array.insertIndex(this._values, toIndex, value);\n\t\t\t\tthis._onMoveIndex(index, toIndex, value);\n\t\t\t}\n\n\t\t} else if (toIndex == null) {\n\t\t\tthis._values.push(value);\n\t\t\tthis._onPush(value);\n\n\t\t} else {\n\t\t\t$array.insertIndex(this._values, toIndex, value);\n\t\t\tthis._onInsertIndex(toIndex, value);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t/**\n\t * Adds an item to the end of the list.\n\t *\n\t * @param item An item to add\n\t */\n\tpublic push(value: K): K {\n\t\tthis._values.push(value);\n\t\tthis._onPush(value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Adds an item as a first item in the list.\n\t *\n\t * @param item An item to add\n\t */\n\tpublic unshift(value: K): K {\n\t\tthis.insertIndex(0, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Adds multiple items to the list.\n\t *\n\t * @param items An Array of items to add\n\t */\n\tpublic pushAll(values: Array): void {\n\t\t$array.each(values, (value) => {\n\t\t\tthis.push(value);\n\t\t});\n\t}\n\n\t/**\n\t * Copies and adds items from abother list.\n\t *\n\t * @param source A list top copy items from\n\t */\n\tpublic copyFrom(source: this): void {\n\t\tthis.pushAll(source._values);\n\t}\n\n\t/**\n\t * Returns the last item from the list, and removes it.\n\t *\n\t * @return Item\n\t */\n\tpublic pop(): Optional {\n\t\tlet index = this._values.length - 1;\n\t\treturn index < 0 ? undefined : this.removeIndex(this._values.length - 1);\n\t}\n\n\t/**\n\t * Returns the first item from the list, and removes it.\n\t *\n\t * @return Item\n\t */\n\tpublic shift(): Optional {\n\t\treturn this._values.length ? this.removeIndex(0) : undefined;\n\t}\n\n\t/**\n\t * Sets multiple items to the list.\n\t *\n\t * All current items are removed.\n\t *\n\t * @param newArray New items\n\t */\n\tpublic setAll(newArray: Array): void {\n\t\tconst old = this._values;\n\t\tthis._values = [];\n\t\tthis._onClear(old);\n\n\t\t$array.each(newArray, (value) => {\n\t\t\tthis._values.push(value);\n\t\t\tthis._onPush(value);\n\t\t});\n\t}\n\n\t/**\n\t * Removes all items from the list.\n\t */\n\tpublic clear(): void {\n\t\tthis.setAll([]);\n\t}\n\n\t/**\n\t * Returns an ES6 iterator for the list.\n\t */\n\tpublic *[Symbol.iterator](): Iterator {\n\t\tconst length = this._values.length;\n\n\t\tfor (let i = 0; i < length; ++i) {\n\t\t\tyield this._values[i];\n\t\t}\n\t}\n\n\t/**\n\t * Calls `f` for each element in the list.\n\t *\n\t * `f` should have at least one parameter defined which will get a current\n\t * item, with optional second argument - index.\n\t */\n\tpublic each(f: (value: T, index: number) => void): void {\n\t\t$array.each(this._values, f);\n\t}\n}\n\n\n/**\n * A version of a [[List]] where the elements are disposed automatically when\n * removed from the list, unless `autoDispose` is set to `false`.\n */\nexport class ListAutoDispose extends List implements IDisposer {\n\t/**\n\t * Automatically disposes elements that are removed from the list.\n\t *\n\t * @default true\n\t */\n\tpublic autoDispose: boolean = true;\n\n\tprivate _disposed: boolean = false;\n\n\tprotected _onSetIndex(index: number, oldValue: A, newValue: A) {\n\t\tif (this.autoDispose) {\n\t\t\toldValue.dispose();\n\t\t}\n\n\t\tsuper._onSetIndex(index, oldValue, newValue);\n\t}\n\n\tprotected _onRemoveIndex(index: number, oldValue: A) {\n\t\tif (this.autoDispose) {\n\t\t\toldValue.dispose();\n\t\t}\n\n\t\tsuper._onRemoveIndex(index, oldValue);\n\t}\n\n\tprotected _onClear(oldValues: Array) {\n\t\tif (this.autoDispose) {\n\t\t\t$array.each(oldValues, (x) => {\n\t\t\t\tx.dispose();\n\t\t\t});\n\t\t}\n\n\t\tsuper._onClear(oldValues);\n\t}\n\n\tpublic isDisposed(): boolean {\n\t\treturn this._disposed;\n\t}\n\n\tpublic dispose(): void {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\n\t\t\tif (this.autoDispose) {\n\t\t\t\t$array.each(this._values, (x) => {\n\t\t\t\t\tx.dispose();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * A version of a [[List]] that is able to create new elements as well as\n * apply additional settings to newly created items.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/settings/list-templates/} for more info\n */\nexport class ListTemplate extends ListAutoDispose {\n\tpublic template: Template;\n\tpublic make: () => A;\n\n\tconstructor(template: Template, make: () => A) {\n\t\tsuper();\n\t\tthis.template = template;\n\t\tthis.make = make;\n\t}\n}\n","import type { IPoint } from \"./IPoint\";\nimport { isNumber } from \"./Type\";\nimport type { IBounds } from \"./IBounds\";\n\n/**\n * ============================================================================\n * CONSTANTS\n * ============================================================================\n * @hidden\n */\nexport const PI = Math.PI;\nexport const HALFPI = PI / 2;\nexport const RADIANS = PI / 180;\nexport const DEGREES = 180 / PI;\n\n/**\n * Rounds the numeric value to whole number or specific precision of set.\n *\n * @param value Value\n * @param precision Precision (number of decimal points)\n * @param floor In case value ends with 0.5 and precision is 0, we might need to floor the value instead of ceiling it.\n * @return Rounded value\n */\nexport function round(value: number, precision?: number, floor?: boolean): number {\n\tif (!isNumber(precision) || precision <= 0) {\n\n\t\tlet rounded = Math.round(value);\n\t\tif (floor) {\n\t\t\tif (rounded - value == 0.5) {\n\t\t\t\trounded--;\n\t\t\t}\n\t\t}\n\t\treturn rounded;\n\t}\n\telse {\n\t\tlet d: number = Math.pow(10, precision);\n\t\treturn Math.round(value * d) / d;\n\t}\n}\n\n\n/**\n * Ceils the numeric value to whole number or specific precision of set.\n *\n * @param value Value\n * @param precision Precision (number of decimal points)\n * @return Rounded value\n */\nexport function ceil(value: number, precision: number): number {\n\tif (!isNumber(precision) || precision <= 0) {\n\t\treturn Math.ceil(value);\n\t}\n\telse {\n\t\tlet d: number = Math.pow(10, precision);\n\t\treturn Math.ceil(value * d) / d;\n\t}\n}\n\n\n/**\n * [getCubicControlPointA description]\n *\n * @ignore Exclude from docs\n * @todo Description\n * @param p0 [description]\n * @param p1 [description]\n * @param p2 [description]\n * @param p3 [description]\n * @param tensionX [description]\n * @param tensionY [description]\n * @return [description]\n */\nexport function getCubicControlPointA(p0: IPoint, p1: IPoint, p2: IPoint, tensionX: number, tensionY: number): IPoint {\n\treturn { x: ((-p0.x + p1.x / tensionX + p2.x) * tensionX), y: ((-p0.y + p1.y / tensionY + p2.y) * tensionY) };\n}\n\n/**\n * [getCubicControlPointB description]\n *\n * @ignore Exclude from docs\n * @todo Description\n * @param p0 [description]\n * @param p1 [description]\n * @param p2 [description]\n * @param p3 [description]\n * @param tensionX [description]\n * @param tensionY [description]\n * @return [description]\n */\nexport function getCubicControlPointB(p1: IPoint, p2: IPoint, p3: IPoint, tensionX: number, tensionY: number): IPoint {\n\treturn { x: ((p1.x + p2.x / tensionX - p3.x) * tensionX), y: ((p1.y + p2.y / tensionY - p3.y) * tensionY) };\n}\n\n\nexport function fitToRange(value: number, min: number, max: number): number {\n\treturn Math.min(Math.max(value, min), max);\n}\n\n/**\n * Returns sine of an angle specified in degrees.\n *\n * @param value Value\n * @return Sine\n */\nexport function sin(angle: number): number {\n\treturn Math.sin(RADIANS * angle);\n}\n\n/**\n * Returns tan of an angle specified in degrees.\n *\n * @param value Value\n * @return Sine\n */\nexport function tan(angle: number): number {\n\treturn Math.tan(RADIANS * angle);\n}\n\n/**\n * Returns cosine of an angle specified in degrees.\n *\n * @param value Value\n * @return Cosine\n */\nexport function cos(angle: number): number {\n\treturn Math.cos(RADIANS * angle);\n}\n\n// 0 to 360\nexport function normalizeAngle(value: number): number {\n\tvalue = value % 360;\n\tif (value < 0) {\n\t\tvalue += 360;\n\t}\n\treturn value;\n}\n\n// TODO this doesn't work properly for skewing, and it's probably broken for rotation too\nexport function getArcBounds(cx: number, cy: number, startAngle: number, endAngle: number, radius: number): IBounds {\n\n\tlet minX = Number.MAX_VALUE;\n\tlet minY = Number.MAX_VALUE;\n\tlet maxX = -Number.MAX_VALUE;\n\tlet maxY = -Number.MAX_VALUE;\n\n\tlet bpoints = [];\n\n\tbpoints.push(getArcPoint(radius, startAngle));\n\tbpoints.push(getArcPoint(radius, endAngle));\n\n\tlet fromAngle = Math.min(Math.floor(startAngle / 90) * 90, Math.floor(endAngle / 90) * 90);\n\tlet toAngle = Math.max(Math.ceil(startAngle / 90) * 90, Math.ceil(endAngle / 90) * 90);\n\n\tfor (let angle = fromAngle; angle <= toAngle; angle += 90) {\n\t\tif (angle >= startAngle && angle <= endAngle) {\n\t\t\tbpoints.push(getArcPoint(radius, angle));\n\t\t}\n\t}\n\n\tfor (let i = 0; i < bpoints.length; i++) {\n\t\tlet pt = bpoints[i];\n\t\tif (pt.x < minX) { minX = pt.x; }\n\t\tif (pt.y < minY) { minY = pt.y; }\n\t\tif (pt.x > maxX) { maxX = pt.x; }\n\t\tif (pt.y > maxY) { maxY = pt.y; }\n\t}\n\n\treturn ({ left: cx + minX, top: cy + minY, right: cx + maxX, bottom: cy + maxY });\n}\n\n/**\n * Returns point on arc\n *\n * @param center point\n * @param radius\n * @param arc\n * @return {boolean}\n */\nexport function getArcPoint(radius: number, arc: number) {\n\treturn ({ x: radius * cos(arc), y: radius * sin(arc) });\n}\n\n\nexport function mergeBounds(bounds: IBounds[]): IBounds {\n\tconst len = bounds.length;\n\n\tif (len > 0) {\n\t\tlet bound = bounds[0];\n\t\tlet left = bound.left;\n\t\tlet top = bound.top;\n\t\tlet right = bound.right;\n\t\tlet bottom = bound.bottom;\n\n\t\tif (len > 1) {\n\t\t\tfor (let i = 1; i < len; i++) {\n\t\t\t\tbound = bounds[i];\n\t\t\t\tleft = Math.min(bound.left, left);\n\t\t\t\tright = Math.max(bound.right, right);\n\t\t\t\ttop = Math.min(bound.top, top);\n\t\t\t\tbottom = Math.max(bound.bottom, bottom);\n\t\t\t}\n\t\t}\n\n\t\treturn { left, right, top, bottom };\n\t}\n\treturn { left: 0, right: 0, top: 0, bottom: 0 };\n}\n\n\nexport function fitAngleToRange(value: number, startAngle: number, endAngle: number): number {\n\n\tif (startAngle > endAngle) {\n\t\tlet temp: number = startAngle;\n\t\tstartAngle = endAngle;\n\t\tendAngle = temp;\n\t}\n\n\tvalue = normalizeAngle(value);\n\n\tlet count = (startAngle - normalizeAngle(startAngle)) / 360;\n\n\tif (value < startAngle) {\n\t\tvalue += 360 * (count + 1);\n\t}\n\n\tlet maxEnd: number = startAngle + (endAngle - startAngle) / 2 + 180;\n\tlet maxStart: number = startAngle + (endAngle - startAngle) / 2 - 180;\n\n\tif (value > endAngle) {\n\n\t\tif (value - 360 > startAngle) {\n\t\t\tvalue -= 360;\n\t\t}\n\t\telse {\n\t\t\tif (value < maxEnd) {\n\t\t\t\tvalue = endAngle;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvalue = startAngle;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (value < startAngle) {\n\t\tif (value > maxStart) {\n\t\t\tvalue = startAngle;\n\t\t}\n\t\telse {\n\t\t\tvalue = endAngle;\n\t\t}\n\t}\n\n\treturn value;\n}\n\nexport function inBounds(point: IPoint, bounds: IBounds) {\n\tif (point.x >= bounds.left && point.y >= bounds.top && point.x <= bounds.right && point.y <= bounds.bottom) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport function getAngle(point1: IPoint, point2?: IPoint): number {\n\tif (!point2) {\n\t\tpoint2 = { x: point1.x * 2, y: point1.y * 2 };\n\t}\n\tlet diffX: number = point2.x - point1.x;\n\tlet diffY: number = point2.y - point1.y;\n\tlet angle: number = Math.atan2(diffY, diffX) * DEGREES;\n\tif (angle < 0) {\n\t\tangle += 360;\n\t}\n\treturn normalizeAngle(angle);\n}\n\n/**\n * [getPointOnQuadraticCurve description]\n *\n * @ignore Exclude from docs\n * @todo Description\n * @param pointA [description]\n * @param pointB [description]\n * @param controlPoint [description]\n * @param position [description]\n * @return [description]\n */\nexport function getPointOnQuadraticCurve(pointA: IPoint, pointB: IPoint, controlPoint: IPoint, position: number): IPoint {\n\tlet x: number = (1 - position) * (1 - position) * pointA.x + 2 * (1 - position) * position * controlPoint.x + position * position * pointB.x;\n\tlet y: number = (1 - position) * (1 - position) * pointA.y + 2 * (1 - position) * position * controlPoint.y + position * position * pointB.y;\n\treturn { x: x, y: y };\n}\n\nexport function getPointOnLine(pointA: IPoint, pointB: IPoint, position: number): IPoint {\n\treturn { x: pointA.x + (pointB.x - pointA.x) * position, y: pointA.y + (pointB.y - pointA.y) * position };\n}\n\n\n/**\n * Returns the closest value from the array of values to the reference value.\n *\n * @param values Array of values\n * @param value Reference value\n * @return Closes value from the array\n */\nexport function closest(values: number[], referenceValue: number): number {\n\treturn values.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - referenceValue) < Math.abs(prev - referenceValue) ? curr : prev);\n\t});\n}\n\nexport function boundsOverlap (bounds1:IBounds, bounds2:IBounds) { \n return !(bounds1.bottom < bounds2.top || bounds2.bottom < bounds1.top || bounds1.right < bounds2.left || bounds2.right < bounds1.left);\n}","import type { Language } from \"./Language\";\n\nimport { Entity, IEntitySettings, IEntityPrivate } from \"./Entity\"\nimport { TextFormatter } from \"./TextFormatter\";\n\nimport * as $object from \"./Object\";\nimport * as $utils from \"./Utils\";\nimport * as $type from \"./Type\";\n\n/**\n * @ignore\n */\nexport interface INumberSuffix {\n\tnumber: number;\n\tsuffix: string;\n}\n\nexport interface INumberFormatterSettings extends IEntitySettings {\n\n\t/**\n\t * Number format to be used when formatting numbers.\n\t *\n\t * @default \"#,###.#####\"\n\t */\n\tnumberFormat?: string | Intl.NumberFormatOptions;\n\n\t/**\n\t * A threshold value for negative numbers.\n\t *\n\t * @default 0\n\t */\n\tnegativeBase?: number;\n\n\t/**\n\t * Prefixes and thresholds to group big numbers into, e.g. 1M.\n\t *\n\t * Used in conjunction with `a` modifier of the number format.\n\t */\n\tbigNumberPrefixes?: INumberSuffix[];\n\n\t/**\n\t * Prefixes and thresholds to group small numbers into, e.g. 1m.\n\t *\n\t * Used in conjunction with `a` modifier of the number format.\n\t */\n\tsmallNumberPrefixes?: INumberSuffix[];\n\n\t/**\n\t * All numbers below this value are considered small.\n\t *\n\t * @default 1\n\t */\n\tsmallNumberThreshold?: number;\n\n\t/**\n\t * Prefixes to and thresholds to use when grouping data size numbers, e.g. 1MB.\n\t *\n\t * Used in conjunction with `b` modifier of the number format.\n\t */\n\tbytePrefixes?: INumberSuffix[];\n\n\t/**\n\t * Indicates which fields in data should be considered numeric.\n\t *\n\t * It is used when formatting data placeholder values.\n\t */\n\tnumericFields?: string[];\n\n\t/**\n\t * Locales if you are using date formats in `Intl.NumberFormatOptions` syntax.\n\t *\n\t * @see (@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat) about using Intl for number formatting\n\t * @param value Locales\n\t */\n\tintlLocales?: string;\n\n}\n\nexport interface INumberFormatterPrivate extends IEntityPrivate {\n}\n\n/**\n * Number formatter\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/formatters/formatting-numbers/} for more info\n * @important\n */\nexport class NumberFormatter extends Entity {\n\tdeclare public _settings: INumberFormatterSettings;\n\tdeclare public _privateSettings: INumberFormatterPrivate;\n\n\tprotected _setDefaults() {\n\t\t// Defaults\n\t\tthis._setDefault(\"negativeBase\", 0);\n\t\tthis._setDefault(\"numberFormat\", \"#,###.#####\");\n\t\tthis._setDefault(\"smallNumberThreshold\", 1.00);\n\n\t\tconst bns = \"_big_number_suffix_\";\n\t\tconst sns = \"_small_number_suffix_\";\n\t\tconst bs = \"_byte_suffix_\";\n\n\t\tthis._setDefault(\"bigNumberPrefixes\", [\n\t\t\t{ \"number\": 1e+3, \"suffix\": this._t(bns + \"3\") },\n\t\t\t{ \"number\": 1e+6, \"suffix\": this._t(bns + \"6\") },\n\t\t\t{ \"number\": 1e+9, \"suffix\": this._t(bns + \"9\") },\n\t\t\t{ \"number\": 1e+12, \"suffix\": this._t(bns + \"12\") },\n\t\t\t{ \"number\": 1e+15, \"suffix\": this._t(bns + \"15\") },\n\t\t\t{ \"number\": 1e+18, \"suffix\": this._t(bns + \"18\") },\n\t\t\t{ \"number\": 1e+21, \"suffix\": this._t(bns + \"21\") },\n\t\t\t{ \"number\": 1e+24, \"suffix\": this._t(bns + \"24\") }\n\t\t]);\n\n\t\tthis._setDefault(\"smallNumberPrefixes\", [\n\t\t\t{ \"number\": 1e-24, \"suffix\": this._t(sns + \"24\") },\n\t\t\t{ \"number\": 1e-21, \"suffix\": this._t(sns + \"21\") },\n\t\t\t{ \"number\": 1e-18, \"suffix\": this._t(sns + \"18\") },\n\t\t\t{ \"number\": 1e-15, \"suffix\": this._t(sns + \"15\") },\n\t\t\t{ \"number\": 1e-12, \"suffix\": this._t(sns + \"12\") },\n\t\t\t{ \"number\": 1e-9, \"suffix\": this._t(sns + \"9\") },\n\t\t\t{ \"number\": 1e-6, \"suffix\": this._t(sns + \"6\") },\n\t\t\t{ \"number\": 1e-3, \"suffix\": this._t(sns + \"3\") }\n\t\t]);\n\n\t\tthis._setDefault(\"bytePrefixes\", [\n\t\t\t{ \"number\": 1, suffix: this._t(bs + \"B\") },\n\t\t\t{ \"number\": 1024, suffix: this._t(bs + \"KB\") },\n\t\t\t{ \"number\": 1048576, suffix: this._t(bs + \"MB\") },\n\t\t\t{ \"number\": 1073741824, suffix: this._t(bs + \"GB\") },\n\t\t\t{ \"number\": 1099511627776, suffix: this._t(bs + \"TB\") },\n\t\t\t{ \"number\": 1125899906842624, suffix: this._t(bs + \"PB\") }\n\t\t]);\n\n\t\tsuper._setDefaults();\n\t}\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\t}\n\n\t/**\n\t * Formats the number according to specific format.\n\t *\n\t * @param value Value to format\n\t * @param format Format to apply\n\t * @return Formatted number\n\t */\n\tpublic format(value: number | string, format?: string | Intl.NumberFormatOptions, precision?: number): string {\n\n\t\t// no format passed in or \"Number\"\n\t\tif (format == null || ($type.isString(format) && format.toLowerCase() === \"number\")) {\n\t\t\tformat = this.get(\"numberFormat\", \"\");\n\t\t}\n\n\t\t// Init return value\n\t\tlet formatted;\n\n\t\t// Cast to number just in case\n\t\t// TODO: maybe use better casting\n\t\tlet source: number = Number(value);\n\n\t\t// Is it a built-in format or Intl.NumberFormatOptions\n\t\tif ($type.isObject(format)) {\n\t\t\ttry {\n\t\t\t\tif (this.get(\"intlLocales\")) {\n\t\t\t\t\treturn new Intl.NumberFormat(this.get(\"intlLocales\"), format).format(source);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn new Intl.NumberFormat(undefined, format).format(source);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\treturn \"Invalid\";\n\t\t\t}\n\n\t\t}\n\t\telse {\n\n\t\t\t// Clean format\n\t\t\tformat = $utils.cleanFormat(format!);\n\n\t\t\t// Get format info (it will also deal with parser caching)\n\t\t\tlet info = this.parseFormat(format, this._root.language);\n\n\n\t\t\t// format and replace the number\n\t\t\tlet details;\n\t\t\tif (source > this.get(\"negativeBase\")) {\n\t\t\t\tdetails = info.positive;\n\t\t\t}\n\t\t\telse if (source < this.get(\"negativeBase\")) {\n\t\t\t\tdetails = info.negative;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdetails = info.zero;\n\t\t\t}\n\n\t\t\t// Adjust precision\n\t\t\tif (precision != null && !details.mod) {\n\t\t\t\tdetails = $object.copy(details);\n\t\t\t\tdetails.decimals.active = source == 0 ? 0 : precision;\n\t\t\t}\n\n\t\t\t// Format\n\t\t\tformatted = details.template.split($type.PLACEHOLDER).join(this.applyFormat(source, details));\n\n\t\t}\n\n\t\treturn formatted;\n\t}\n\n\t/**\n\t * Parses supplied format into structured object which can be used to format\n\t * the number.\n\t *\n\t * @param format Format string, i.e. \"#,###.00\"\n\t * @param language Language\n\t * @ignore\n\t */\n\tprotected parseFormat(format: string, language: Language): any {\n\n\t\t// Check cache\n\t\t// TODO\n\t\t// let cached = this.getCache(format);\n\t\t// if (cached != null) {\n\t\t// \treturn cached;\n\t\t// }\n\n\t\tconst thousandSeparator = language.translateEmpty(\"_thousandSeparator\");\n\t\tconst decimalSeparator = language.translateEmpty(\"_decimalSeparator\")\n\n\t\t// init format parse info holder\n\t\tlet info: any = {\n\t\t\t\"positive\": {\n\t\t\t\t\"thousands\": {\n\t\t\t\t\t\"active\": -1,\n\t\t\t\t\t\"passive\": -1,\n\t\t\t\t\t\"interval\": -1,\n\t\t\t\t\t\"separator\": thousandSeparator\n\t\t\t\t},\n\t\t\t\t\"decimals\": {\n\t\t\t\t\t\"active\": -1,\n\t\t\t\t\t\"passive\": -1,\n\t\t\t\t\t\"separator\": decimalSeparator\n\t\t\t\t},\n\t\t\t\t\"template\": \"\",\n\t\t\t\t\"source\": \"\",\n\t\t\t\t\"parsed\": false\n\t\t\t},\n\t\t\t\"negative\": {\n\t\t\t\t\"thousands\": {\n\t\t\t\t\t\"active\": -1,\n\t\t\t\t\t\"passive\": -1,\n\t\t\t\t\t\"interval\": -1,\n\t\t\t\t\t\"separator\": thousandSeparator\n\t\t\t\t},\n\t\t\t\t\"decimals\": {\n\t\t\t\t\t\"active\": -1,\n\t\t\t\t\t\"passive\": -1,\n\t\t\t\t\t\"separator\": decimalSeparator\n\t\t\t\t},\n\t\t\t\t\"template\": \"\",\n\t\t\t\t\"source\": \"\",\n\t\t\t\t\"parsed\": false\n\t\t\t},\n\t\t\t\"zero\": {\n\t\t\t\t\"thousands\": {\n\t\t\t\t\t\"active\": -1,\n\t\t\t\t\t\"passive\": -1,\n\t\t\t\t\t\"interval\": -1,\n\t\t\t\t\t\"separator\": thousandSeparator\n\t\t\t\t},\n\t\t\t\t\"decimals\": {\n\t\t\t\t\t\"active\": -1,\n\t\t\t\t\t\"passive\": -1,\n\t\t\t\t\t\"separator\": decimalSeparator\n\t\t\t\t},\n\t\t\t\t\"template\": \"\",\n\t\t\t\t\"source\": \"\",\n\t\t\t\t\"parsed\": false\n\t\t\t}\n\t\t};\n\n\t\t// Escape double vertical bars (that mean display one vertical bar)\n\t\tformat = format.replace(\"||\", $type.PLACEHOLDER2);\n\n\t\t// Split it up and deal with different formats\n\t\tlet parts = format.split(\"|\");\n\t\tinfo.positive.source = parts[0];\n\n\t\tif (typeof parts[2] === \"undefined\") {\n\t\t\tinfo.zero = info.positive;\n\t\t}\n\t\telse {\n\t\t\tinfo.zero.source = parts[2];\n\t\t}\n\n\t\tif (typeof parts[1] === \"undefined\") {\n\t\t\tinfo.negative = info.positive;\n\t\t}\n\t\telse {\n\t\t\tinfo.negative.source = parts[1];\n\t\t}\n\n\t\t// Parse each\n\t\t$object.each(info, (_part, item) => {\n\t\t\t// Already parsed\n\t\t\tif (item.parsed) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check cached\n\t\t\t// TODO\n\t\t\t// if (typeof this.getCache(item.source) !== \"undefined\") {\n\t\t\t// \tinfo[part] = this.getCache(item.source);\n\t\t\t// \treturn;\n\t\t\t// }\n\n\t\t\t// Begin parsing\n\t\t\tlet partFormat = item.source;\n\n\t\t\t// Just \"Number\"?\n\t\t\tif (partFormat.toLowerCase() === \"number\") {\n\t\t\t\tpartFormat = this.get(\"numberFormat\", \"#,###.#####\");\n\t\t\t}\n\n\t\t\t// Let TextFormatter split into chunks\n\t\t\tlet chunks = TextFormatter.chunk(partFormat, true);\n\t\t\tfor (let i: number = 0; i < chunks.length; i++) {\n\t\t\t\tlet chunk = chunks[i];\n\n\t\t\t\t// replace back double vertical bar\n\t\t\t\tchunk.text = chunk.text.replace($type.PLACEHOLDER2, \"|\");\n\n\t\t\t\tif (chunk.type === \"value\") {\n\t\t\t\t\t// Parse format\n\n\t\t\t\t\t// Look for codes\n\t\t\t\t\tlet matches: string[] | null = chunk.text.match(/[#0.,]+[ ]?[abesABES%!]?[abesABES‰!]?/);\n\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tif (matches === null || matches[0] === \"\") {\n\t\t\t\t\t\t\t// no codes here - assume string\n\t\t\t\t\t\t\t// nothing to do here\n\t\t\t\t\t\t\titem.template += chunk.text;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\n\t\t\t\t\t\t\t// look for the format modifiers at the end\n\t\t\t\t\t\t\tlet mods: string[] | null = matches[0].match(/[abesABES%‰!]{2}|[abesABES%‰]{1}$/);\n\n\t\t\t\t\t\t\tif (mods) {\n\t\t\t\t\t\t\t\titem.mod = mods[0].toLowerCase();\n\t\t\t\t\t\t\t\titem.modSpacing = matches[0].match(/[ ]{1}[abesABES%‰!]{1}$/) ? true : false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// break the format up\n\t\t\t\t\t\t\tlet a = matches[0].split(\".\");\n\n\t\t\t\t\t\t\t// Deal with thousands\n\t\t\t\t\t\t\tif (a[0] === \"\") {\n\t\t\t\t\t\t\t\t// No directives for thousands\n\t\t\t\t\t\t\t\t// Leave default settings (no formatting)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// Counts\n\t\t\t\t\t\t\t\titem.thousands.active = (a[0].match(/0/g) || []).length;\n\t\t\t\t\t\t\t\titem.thousands.passive = (a[0].match(/\\#/g) || []).length + item.thousands.active;\n\n\t\t\t\t\t\t\t\t// Separator interval\n\t\t\t\t\t\t\t\tlet b = a[0].split(\",\");\n\t\t\t\t\t\t\t\tif (b.length === 1) {\n\t\t\t\t\t\t\t\t\t// No thousands separators\n\t\t\t\t\t\t\t\t\t// Do nothing\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t// Use length fo the last chunk as thousands length\n\t\t\t\t\t\t\t\t\titem.thousands.interval = (b.pop() || \"\").length;\n\n\t\t\t\t\t\t\t\t\tif (item.thousands.interval === 0) {\n\t\t\t\t\t\t\t\t\t\titem.thousands.interval = -1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Deal with decimals\n\t\t\t\t\t\t\tif (typeof (a[1]) === \"undefined\") {\n\t\t\t\t\t\t\t\t// No directives for decimals\n\t\t\t\t\t\t\t\t// Leave at defaults (no formatting)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// Counts\n\t\t\t\t\t\t\t\titem.decimals.active = (a[1].match(/0/g) || []).length;\n\t\t\t\t\t\t\t\titem.decimals.passive = (a[1].match(/\\#/g) || []).length + item.decimals.active;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Add special code to template\n\t\t\t\t\t\t\titem.template += chunk.text.split(matches[0]).join($type.PLACEHOLDER);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Quoted string - take it as it is\n\t\t\t\t\titem.template += chunk.text;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply style formatting\n\t\t\t//item.template = getTextFormatter().format(item.template, this.outputFormat);\n\n\t\t\t// Save cache\n\t\t\t// TODO\n\t\t\t//this.setCache(item.source, item);\n\n\t\t\t// Mark this as parsed\n\t\t\titem.parsed = true;\n\n\t\t});\n\n\t\t// Save cache (the whole thing)\n\t\t// TODO\n\t\t//this.setCache(format, info);\n\n\t\treturn info;\n\t}\n\n\t/**\n\t * Applies parsed format to a numeric value.\n\t *\n\t * @param value Value\n\t * @param details Parsed format as returned by parseFormat()\n\t * @return Formatted number\n\t * @ignore\n\t */\n\tprotected applyFormat(value: number, details: any): string {\n\n\t\t// Use absolute values\n\t\tlet negative: boolean = value < 0;\n\t\tvalue = Math.abs(value);\n\n\t\t// Recalculate according to modifier\n\t\tlet prefix: string = \"\", suffix: string = \"\";\n\t\tlet mods: string[] = details.mod ? details.mod.split(\"\") : [];\n\t\tif (mods.indexOf(\"b\") !== -1) {\n\t\t\tlet a = this.applyPrefix(value, this.get(\"bytePrefixes\")!, mods.indexOf(\"!\") !== -1);\n\t\t\tvalue = a[0];\n\t\t\tprefix = a[1];\n\t\t\tsuffix = a[2];\n\t\t\tif (details.modSpacing) {\n\t\t\t\tsuffix = \" \" + suffix;\n\t\t\t}\n\t\t}\n\t\telse if (mods.indexOf(\"a\") !== -1) {\n\t\t\tlet a = this.applyPrefix(value, value < this.get(\"smallNumberThreshold\")! ? this.get(\"smallNumberPrefixes\")! : this.get(\"bigNumberPrefixes\")!, mods.indexOf(\"!\") !== -1);\n\t\t\tvalue = a[0];\n\t\t\tprefix = a[1];\n\t\t\tsuffix = a[2];\n\t\t\tif (details.modSpacing) {\n\t\t\t\tsuffix = \" \" + suffix;\n\t\t\t}\n\t\t}\n\t\telse if (mods.indexOf(\"%\") !== -1) {\n\t\t\tlet ol = Math.min(value.toString().length + 2, 21);\n\t\t\tvalue *= 100;\n\t\t\tvalue = parseFloat(value.toPrecision(ol));\n\t\t\tsuffix = \"%\";\n\t\t}\n\t\telse if (mods.indexOf(\"‰\") !== -1) {\n\t\t\tlet ol = Math.min(value.toString().length + 3, 21);\n\t\t\tvalue *= 1000;\n\t\t\tvalue = parseFloat(value.toPrecision(ol));\n\t\t\tsuffix = \"‰\";\n\t\t}\n\n\t\t// Round to passive\n\t\tif (mods.indexOf(\"e\") !== -1) {\n\t\t\t// convert the value to exponential\n\t\t\tlet exp: string[];\n\t\t\tif (details.decimals.passive >= 0) {\n\t\t\t\texp = value.toExponential(details.decimals.passive).split(\"e\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\texp = value.toExponential().split(\"e\");\n\t\t\t}\n\t\t\tvalue = Number(exp[0]);\n\t\t\tsuffix = \"e\" + exp[1];\n\t\t\tif (details.modSpacing) {\n\t\t\t\tsuffix = \" \" + suffix;\n\t\t\t}\n\t\t}\n\t\telse if (details.decimals.passive === 0) {\n\t\t\tvalue = Math.round(value);\n\t\t}\n\t\telse if (details.decimals.passive > 0) {\n\t\t\tlet d: number = Math.pow(10, details.decimals.passive);\n\t\t\tvalue = Math.round(value * d) / d;\n\t\t}\n\n\t\t// Init return value\n\t\tlet res: string = \"\";\n\n\t\t// Calc integer and decimal parts\n\t\tlet a = $type.numberToString(value).split(\".\");\n\n\t\t// Format integers\n\t\tlet ints = a[0];\n\n\t\t// Pad integers to active length\n\t\tif (ints.length < details.thousands.active) {\n\t\t\tints = Array(details.thousands.active - ints.length + 1).join(\"0\") + ints;\n\t\t}\n\n\t\t// Insert thousands separators\n\t\tif (details.thousands.interval > 0) {\n\t\t\tlet ip: string[] = [];\n\t\t\tlet intsr: string = ints.split(\"\").reverse().join(\"\");\n\t\t\tfor (let i = 0, len = ints.length; i <= len; i += details.thousands.interval) {\n\t\t\t\tlet c: string = intsr.substr(i, details.thousands.interval).split(\"\").reverse().join(\"\");\n\t\t\t\tif (c !== \"\") {\n\t\t\t\t\tip.unshift(c);\n\t\t\t\t}\n\t\t\t}\n\t\t\tints = ip.join(details.thousands.separator);\n\t\t}\n\n\t\t// Add integers\n\t\tres += ints;\n\n\t\t// Add decimals\n\t\tif (a.length === 1) {\n\t\t\ta.push(\"\");\n\t\t}\n\t\tlet decs: string = a[1];\n\n\t\t// Fill zeros?\n\t\tif (decs.length < details.decimals.active) {\n\t\t\tdecs += Array(details.decimals.active - decs.length + 1).join(\"0\");\n\t\t}\n\n\t\tif (decs !== \"\") {\n\t\t\tres += details.decimals.separator + decs;\n\t\t}\n\n\t\t// Can't have empty return value\n\t\tif (res === \"\") {\n\t\t\tres = \"0\";\n\t\t}\n\n\t\t// Add minus sign back\n\t\tif (value !== 0 && negative && (mods.indexOf(\"s\") === -1)) {\n\t\t\tres = \"-\" + res;\n\t\t}\n\n\t\t// Add suffixes/prefixes\n\t\tif (prefix) {\n\t\t\tres = prefix + res;\n\t\t}\n\t\tif (suffix) {\n\t\t\tres += suffix;\n\t\t}\n\n\t\treturn res;\n\t}\n\n\n\tprotected applyPrefix(value: number, prefixes: any[], force: boolean = false): any[] {\n\t\tlet newvalue = value;\n\t\tlet prefix = \"\";\n\t\tlet suffix = \"\";\n\t\tlet applied = false;\n\t\tlet k = 1;\n\n\t\tfor (let i = 0, len = prefixes.length; i < len; i++) {\n\t\t\tif (prefixes[i].number <= value) {\n\t\t\t\tif (prefixes[i].number === 0) {\n\t\t\t\t\tnewvalue = 0;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewvalue = value / prefixes[i].number;\n\t\t\t\t\tk = prefixes[i].number;\n\t\t\t\t}\n\t\t\t\tprefix = prefixes[i].prefix;\n\t\t\t\tsuffix = prefixes[i].suffix;\n\t\t\t\tapplied = true;\n\t\t\t}\n\t\t}\n\n\n\t\tif (!applied && force && prefixes.length && value != 0) {\n\t\t\t// Prefix was not applied. Use the first prefix.\n\t\t\tnewvalue = value / prefixes[0].number;\n\t\t\tprefix = prefixes[0].prefix;\n\t\t\tsuffix = prefixes[0].suffix;\n\t\t\tapplied = true;\n\t\t}\n\n\t\tif (applied) {\n\t\t\tnewvalue = parseFloat(\n\t\t\t\tnewvalue.toPrecision(\n\t\t\t\t\tMath.min(k.toString().length + Math.floor(newvalue).toString().replace(/[^0-9]*/g, \"\").length, 21)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn [newvalue, prefix, suffix];\n\t}\n\n\t/**\n\t * Replaces brackets with temporary placeholders.\n\t *\n\t * @ignore Exclude from docs\n\t * @param text Input text\n\t * @return Escaped text\n\t */\n\tpublic escape(text: string): string {\n\t\treturn text.replace(\"||\", $type.PLACEHOLDER2);\n\t}\n\n\t/**\n\t * Replaces placeholders back to brackets.\n\t *\n\t * @ignore Exclude from docs\n\t * @param text Escaped text\n\t * @return Unescaped text\n\t */\n\tpublic unescape(text: string): string {\n\t\treturn text.replace($type.PLACEHOLDER2, \"|\");\n\t}\n\n}\n","import * as $array from \"./Array\";\nimport type { Keyof } from \"./Type\";\n\nexport function keys(object: O): Array> {\n\treturn Object.keys(object) as Array>;\n}\n\n/**\n * Returns an array of object's property names ordered using specific ordering\n * function.\n *\n * @param object Source object\n * @param order Ordering function\n * @returns Object property names\n */\nexport function keysOrdered(object: Object, order: (a: Keyof, b: Keyof) => number): Array> {\n\treturn keys(object).sort(order);\n}\n\nexport function copy(object: O): O {\n\treturn Object.assign({}, object);\n}\n\nexport function each(object: O, f: (key: K, value: Exclude) => void): void {\n\tkeys(object).forEach((key) => {\n\t\tf(key, object[key] as any);\n\t});\n}\n\n/**\n * Iterates through all properties of the object calling `fn` for each of them.\n *\n * If return value of the function evaluates to `false` further iteration is\n * cancelled.\n *\n * @param object Source object\n * @param fn Callback function\n */\nexport function eachContinue(object: Object, fn: >(key: Key, value: Object[Key]) => boolean): void {\n\tfor (let key in object) {\n\t\tif (hasKey(object, key)) {\n\t\t\tif (!fn(key as Keyof, object[key] as Object[Keyof])) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Orders object properties using custom `ord` function and iterates through\n * them calling `fn` for each of them.\n *\n * @param object Source object\n * @param fn Callback function\n * @param order Ordering function\n */\nexport function eachOrdered(object: Object, fn: >(key: Key, value: Object[Key]) => void, ord: (a: Keyof, b: Keyof) => number): void {\n\t$array.each(keysOrdered(object, ord), (key) => {\n\t\tfn(key, object[key]);\n\t});\n}\n\n/**\n * Checks if `object` has a specific `key`.\n *\n * @param object Source object\n * @param key Property name\n * @returns Has key?\n */\nexport function hasKey(object: Object, key: Key): boolean {\n\treturn {}.hasOwnProperty.call(object, key);\n}\n\n/**\n * Copies all properties of one object to the other, omitting undefined, but only if property in target object doesn't have a value set.\n *\n * @param fromObject Source object\n * @param toObject Target object\n * @return Updated target object\n * @todo Maybe consolidate with utils.copy?\n */\nexport function softCopyProperties(source: Object, target: Object): Object {\n\teach(source, (key, value) => {\n\t\t// only if value is set\n\t\t//if ($type.hasValue(value) && !($type.hasValue((target)[key]))) {\n\t\tif (value != null && (target)[key] == null) {\n\t\t\t(target)[key] = value;\n\t\t}\n\t});\n\treturn target;\n}\n","export type Order = -1 | 0 | 1;\n\n/**\n * @ignore\n */\nexport function compare(left: A, right: A): Order {\n\tif (left === right) {\n\t\treturn 0;\n\n\t} else if (left < right) {\n\t\treturn -1;\n\n\t} else {\n\t\treturn 1;\n\t}\n}\n\n/**\n * @ignore\n */\nexport function compareArray(left: ArrayLike, right: ArrayLike, f: (x: A, y: A) => Order): Order {\n\tconst leftLength = left.length;\n\tconst rightLength = right.length;\n\n\tconst length = Math.min(leftLength, rightLength);\n\n\tfor (let i = 0; i < length; ++i) {\n\t\tconst order = f(left[i], right[i]);\n\n\t\tif (order !== 0) {\n\t\t\treturn order;\n\t\t}\n\t}\n\n\treturn compare(leftLength, rightLength);\n}\n\n/**\n * @ignore\n */\nexport function reverse(order: Order): Order {\n\tif (order < 0) {\n\t\treturn 1;\n\n\t} else if (order > 0) {\n\t\treturn -1;\n\n\t} else {\n\t\treturn 0;\n\t}\n}\n\n/**\n * @ignore\n */\nexport function compareNumber(a: number, b: number): Order {\n\tif (a === b) {\n\t\treturn 0;\n\n\t} else if (a < b) {\n\t\treturn -1;\n\n\t} else {\n\t\treturn 1;\n\t}\n}\n","/**\n * ============================================================================\n * MAIN CLASS\n * ============================================================================\n * @hidden\n */\n\n/**\n * Represents a relative value (percent).\n *\n * The Percent object, can be instantiated using two ways:\n *\n * * Via `new Percent(X)`.\n * * Via `am5.percent(X)`.\n *\n * You can also use shortcut functions for `0%`, `50%`, and `100%`:\n * * `am5.p0`\n * * `am5.p50`\n * * `am5.p1000`\n */\nexport class Percent {\n\n\t/**\n\t * Value in percent.\n\t */\n\tprotected _value: number;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param percent Percent value\n\t */\n\tconstructor(percent: number) {\n\t\tthis._value = percent;\n\t}\n\n\t/**\n\t * Relative value.\n\t *\n\t * E.g. 100% is 1, 50% is 0.5, etc.\n\t *\n\t * This is useful to apply transformations to other values. E.g.:\n\t *\n\t * ```TypeScript\n\t * let value = 256;\n\t * let percent = new am5.p50;\n\t * console.log(value * percent.value); // outputs 128\n\t * ```\n\t * ```JavaScript\n\t * var value = 256;\n\t * var percent = new am5.p50;\n\t * console.log(value * percent.value); // outputs 128\n\t * ```\n\t *\n\t * Alternatively, you can use `am5.percent()` helper function:\n\t *\n\t * ```TypeScript\n\t * let value = 256;\n\t * let percent = am5.p50;\n\t * console.log(value * percent.value); // outputs 128\n\t * ```\n\t * ```JavaScript\n\t * var value = 256;\n\t * var percent = am5.p50;\n\t * console.log(value * percent.value); // outputs 128\n\t * ```\n\t *\n\t * @readonly\n\t * @return Relative value\n\t */\n\tpublic get value(): number {\n\t\treturn this._value / 100;\n\t}\n\n\t/**\n\t * Value in percent.\n\t *\n\t * @return Percent\n\t */\n\tpublic get percent(): number {\n\t\treturn this._value;\n\t}\n\n\tpublic toString(): string {\n\t\treturn \"\" + this._value + \"%\";\n\t}\n\n\tpublic interpolate(min: number, max: number): number {\n\t\treturn min + (this.value * (max - min));\n\t}\n\n\tstatic normalize(percent: Percent | number, min: number, max: number): Percent {\n\t\tif (percent instanceof Percent) {\n\t\t\treturn percent;\n\n\t\t} else {\n\t\t\tif (min === max) {\n\t\t\t\treturn new Percent(0);\n\n\t\t\t} else {\n\t\t\t\treturn new Percent(Math.min(Math.max((percent - min) * (1 / (max - min)), 0), 1) * 100);\n\t\t\t}\n\t\t}\n\t}\n\n\t/*public toNumber(): number {\n\t\treturn this.percent;\n\t}*/\n\n}\n\n\n/**\n * Converts numeric percent value to a proper [[Percent]] object.\n *\n * ```TypeScript\n * pieSeries.set(\"radius\", am5.percent(80));\n * ```\n * ```JavaScript\n * pieSeries.set(\"radius\", am5.percent(80));\n * ```\n *\n * @param value Percent\n * @return Percent object\n */\nexport function percent(value: number): Percent {\n\treturn new Percent(value);\n}\n\n/**\n * A shortcut function to `am5.percent(0)`.\n */\nexport const p0 = percent(0);\n\n/**\n * A shortcut function to `am5.percent(100)`.\n */\nexport const p100 = percent(100);\n\n/**\n * A shortcut function to `am5.percent(50)`.\n */\nexport const p50 = percent(50);\n\n\n/**\n * Checks if value is a [[Percent]] object.\n *\n * @ignore Exclude from docs\n * @param value Input value\n * @return Is percent?\n */\nexport function isPercent(value: any): boolean {\n\treturn value instanceof Percent;\n}\n","/** @ignore *//** */\n\nimport * as $type from \"./Type\";\nimport * as $utils from \"./Utils\";\nimport { Sprite } from \"../render/Sprite\";\nimport { TextFormatter } from \"./TextFormatter\";\n\n/**\n * @ignore\n */\nexport function populateString(target: Sprite, string: string): string {\n\tif (string != null) {\n\t\tstring = \"\" + string;\n\t\tstring = TextFormatter.escape(string);\n\t\tlet tags = string.match(/\\{([^}]+)\\}/g);\n\t\tlet i;\n\t\tif (tags) {\n\t\t\tfor (i = 0; i < tags.length; i++) {\n\t\t\t\tlet tag = tags[i].replace(/\\{([^}]+)\\}/, \"$1\");\n\t\t\t\tlet value = getTagValue(target, tag, \"\");\n\n\t\t\t\tif (value == null) {\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t}\n\n\t\t\t\tstring = string.split(tags[i]).join(value);\n\t\t\t}\n\t\t}\n\t\tstring = TextFormatter.unescape(string);\n\t}\n\telse {\n\t\tstring = \"\";\n\t}\n\n\t// TODO: apply adapter?\n\treturn string;\n}\n\n/**\n * @ignore\n */\nfunction getTagValue(target: Sprite, tagName: string, format?: string): string {\n\tlet value: any;\n\tconst dataItem = target.dataItem;\n\n\t// Parse parts\n\tlet parts: any[] = [];\n\tlet reg = /([^.]+)\\(([^)]*)\\)|([^.]+)/g;;\n\tlet matches;\n\n\twhile (true) {\n\t\tmatches = reg.exec(tagName);\n\n\t\tif (matches === null) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (matches[3]) {\n\t\t\t// Simple property\n\t\t\tparts.push({\n\t\t\t\tprop: matches[3]\n\t\t\t});\n\n\t\t\t// Check if maybe we should force a formatter on this value\n\t\t\tconst dateFields = target.getDateFormatter().get(\"dateFields\", []);\n\t\t\tconst numericFields = target.getNumberFormatter().get(\"numericFields\", []);\n\t\t\tconst durationFields = target.getDurationFormatter().get(\"durationFields\", []);\n\t\t\tif ((dateFields).indexOf(matches[3]) !== -1) {\n\t\t\t\tparts.push({\n\t\t\t\t\tmethod: \"formatDate\",\n\t\t\t\t\tparams: []\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if ((numericFields).indexOf(matches[3]) !== -1) {\n\t\t\t\tparts.push({\n\t\t\t\t\tmethod: \"formatNumber\",\n\t\t\t\t\tparams: []\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if ((durationFields).indexOf(matches[3]) !== -1) {\n\t\t\t\tparts.push({\n\t\t\t\t\tmethod: \"formatDuration\",\n\t\t\t\t\tparams: []\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Method\n\t\t\t// Parse parameters\n\t\t\tlet params: any[] = [];\n\t\t\tif ($utils.trim(matches[2]) != \"\") {\n\t\t\t\tlet reg2 = /'([^']*)'|\"([^\"]*)\"|([0-9\\-]+)/g;\n\t\t\t\tlet matches2;\n\n\t\t\t\twhile (true) {\n\t\t\t\t\tmatches2 = reg2.exec(matches[2]);\n\n\t\t\t\t\tif (matches2 === null) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tparams.push(matches2[1] || matches2[2] || matches2[3])\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts.push({\n\t\t\t\tmethod: matches[1],\n\t\t\t\tparams: params\n\t\t\t})\n\t\t}\n\t}\n\n\t// Check if we can retrieve the value from data item\n\tif (dataItem) {\n\n\n\t\t// Check values\n\t\tvalue = getTagValueFromObject(target, parts, dataItem._settings);\n\n\t\t// Check properties\n\t\tif (value == null || $type.isObject(value)) { // isObject helps to solve problem with date axis, as for example dateX will get dateX from values object and won't get to the dateX date.\n\t\t\tvalue = getTagValueFromObject(target, parts, dataItem);\n\t\t}\n\n\t\t// Check data context\n\t\tlet dataContext: any = dataItem.dataContext;\n\n\t\tif (value == null && dataContext) {\n\t\t\tvalue = getTagValueFromObject(target, parts, dataContext);\n\n\t\t\t// Maybe it's a literal dot-separated name of the key in dataContext?\n\t\t\tif (value == null) {\n\t\t\t\tvalue = getTagValueFromObject(target, [{\n\t\t\t\t\tprop: tagName\n\t\t\t\t}], dataContext);\n\t\t\t}\n\n\t\t\t// scond data context level sometimes exist (tree map)\n\t\t\tif (value == null && dataContext.dataContext) {\n\t\t\t\tvalue = getTagValueFromObject(target, parts, dataContext.dataContext);\n\t\t\t}\n\t\t}\n\n\t\t// Check component's data item\n\t\tif (value == null && dataItem.component && dataItem.component.dataItem !== dataItem) {\n\t\t\tvalue = getTagValue(dataItem.component, tagName, format);\n\t\t}\n\t}\n\n\t// Check sprite's properties\n\tif (value == null) {\n\t\tvalue = getTagValueFromObject(target, parts, target);\n\t}\n\n\t// Finally, check the parent\n\tif (value == null && target.parent) {\n\t\tvalue = getTagValue(target.parent, tagName, format);\n\t}\n\n\treturn value;\n}\n\n/**\n * @ignore\n */\nfunction getTagValueFromObject(target: Sprite, parts: any[], object: any, format?: string): any {\n\tlet current: any = object;\n\tlet formatApplied = false;\n\tfor (let i = 0, len = parts.length; i < len; i++) {\n\t\tlet part = parts[i];\n\t\tif (part.prop) {\n\t\t\t// Regular property\n\t\t\tif (current instanceof Sprite) {\n\t\t\t\tcurrent = current.get(part.prop) || current.getPrivate(part.prop) || (current)[part.prop];\n\t\t\t}\n\t\t\telse if (current.get) {\n\t\t\t\tcurrent = current.get(part.prop) || (current)[part.prop];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcurrent = current[part.prop];\n\t\t\t}\n\t\t\tif (current == null) {\n\t\t\t\t// Not set, return undefined\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Method\n\n\t\t\tswitch (part.method) {\n\t\t\t\tcase \"formatNumber\":\n\t\t\t\t\tlet numberValue = $type.toNumber(current);\n\t\t\t\t\tif (numberValue != null) {\n\t\t\t\t\t\tcurrent = target.getNumberFormatter().format(\n\t\t\t\t\t\t\tnumberValue,\n\t\t\t\t\t\t\tformat || part.params[0] || undefined\n\t\t\t\t\t\t);\n\t\t\t\t\t\tformatApplied = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"formatDate\":\n\t\t\t\t\tlet dateValue = $type.toDate(current);\n\t\t\t\t\tif (!$type.isDate(dateValue) || $type.isNaN(dateValue.getTime())) {\n\t\t\t\t\t\t// Was not able to get date out of value, quitting and letting\n\t\t\t\t\t\t// calling method try another value\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (dateValue != null) {\n\t\t\t\t\t\tcurrent = target.getDateFormatter().format(\n\t\t\t\t\t\t\tdateValue,\n\t\t\t\t\t\t\tformat || part.params[0] || undefined\n\t\t\t\t\t\t);\n\t\t\t\t\t\tformatApplied = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"formatDuration\":\n\t\t\t\t\tlet durationValue = $type.toNumber(current);\n\t\t\t\t\tif (durationValue != null) {\n\t\t\t\t\t\tcurrent = target.getDurationFormatter().format(\n\t\t\t\t\t\t\tdurationValue,\n\t\t\t\t\t\t\tformat || part.params[0] || undefined,\n\t\t\t\t\t\t\tpart.params[1] || undefined\n\t\t\t\t\t\t);\n\t\t\t\t\t\tformatApplied = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"urlEncode\":\n\t\t\t\tcase \"encodeURIComponent\":\n\t\t\t\t\tcurrent = encodeURIComponent(current);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif (current[part.method]) {\n\t\t\t\t\t\tcurrent[part.method].apply(object, part.params);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Apply default format if it wasn't applied explicitly\n\tif (!formatApplied) {\n\n\t\tlet formatParts = [{\n\t\t\tmethod: \"\",\n\t\t\tparams: format\n\t\t}];\n\n\t\tif (format == null) {\n\n\t\t\t// Format is not set\n\t\t\t// Determine from the type of the value\n\t\t\tif ($type.isNumber(current)) {\n\t\t\t\tformatParts[0].method = \"formatNumber\";\n\t\t\t\tformatParts[0].params = \"\";\n\t\t\t}\n\t\t\telse if ($type.isDate(current)) {\n\t\t\t\tformatParts[0].method = \"formatDate\";\n\t\t\t\tformatParts[0].params = \"\";\n\t\t\t}\n\n\t\t}\n\t\telse {\n\n\t\t\t// Format set\n\t\t\t// Try to determine formatter based on the format\n\t\t\tlet formatterType: string = $utils.getFormat(format);\n\n\t\t\t// format\n\t\t\tif (formatterType === \"number\") {\n\t\t\t\tformatParts[0].method = \"formatNumber\";\n\t\t\t}\n\t\t\telse if (formatterType === \"date\") {\n\t\t\t\tformatParts[0].method = \"formatDate\";\n\t\t\t}\n\t\t\telse if (formatterType === \"duration\") {\n\t\t\t\tformatParts[0].method = \"formatDuration\";\n\t\t\t}\n\n\t\t}\n\n\t\t// Apply format\n\t\tif (formatParts[0].method) {\n\t\t\tcurrent = getTagValueFromObject(target, formatParts, current);\n\t\t}\n\n\t}\n\n\treturn current;\n}","import type { Entity, Dirty } from \"./Entity\";\nimport type { State } from \"./States\";\nimport { EventDispatcher, Events } from \"./EventDispatcher\";\nimport { IDisposer, Disposer, MultiDisposer } from \"./Disposer\";\nimport * as $array from \"./Array\";\nimport * as $object from \"./Object\";\n\nexport class TemplateState {\n\tpublic _settings: Partial;\n\n\tprivate _name: string;\n\tprivate _template: Template;\n\n\tconstructor(name: string, template: Template, settings: Partial) {\n\t\tthis._name = name;\n\t\tthis._template = template;\n\t\tthis._settings = settings;\n\t}\n\n\tpublic get(key: Key): this[\"_settings\"][Key];\n\tpublic get(key: Key, fallback: F): NonNullable | F;\n\tpublic get(key: Key, fallback?: any): any {\n\t\tconst value = this._settings[key];\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\tpublic set(key: Key, value: E[\"_settings\"][Key]) {\n\t\tthis._settings[key] = value;\n\t\t// TODO maybe only do this if the value changed ?\n\t\tthis._template._stateChanged(this._name);\n\t}\n\n\tpublic remove(key: Key) {\n\t\tdelete this._settings[key];\n\t\t// TODO maybe only do this if the value changed ?\n\t\tthis._template._stateChanged(this._name);\n\t}\n\n\tpublic setAll(settings: this[\"_settings\"]) {\n\t\t$object.keys(settings).forEach((key) => {\n\t\t\tthis._settings[key] = settings[key];\n\t\t});\n\n\t\tthis._template._stateChanged(this._name);\n\t}\n\n\tpublic _apply(other: State, seen: Dirty): void {\n\t\t$object.each(this._settings, (key, value) => {\n\t\t\tif (!seen[key] && !other._userSettings[key]) {\n\t\t\t\tseen[key] = true;\n\t\t\t\tother.setRaw(key, value);\n\t\t\t}\n\t\t});\n\t}\n}\n\n\nexport class TemplateStates {\n\tprivate _template: Template;\n\tprivate _states: { [key: string]: TemplateState } = {};\n\n\tconstructor(template: Template) {\n\t\tthis._template = template;\n\t}\n\n\tpublic lookup(name: string): TemplateState | undefined {\n\t\treturn this._states[name];\n\t}\n\n\tpublic create(name: string, settings: Partial): TemplateState {\n\t\tconst state = this._states[name];\n\n\t\tif (state) {\n\t\t\tstate.setAll(settings);\n\t\t\treturn state;\n\n\t\t} else {\n\t\t\tconst state = new TemplateState(name, this._template, settings);\n\t\t\tthis._states[name] = state;\n\t\t\tthis._template._stateChanged(name);\n\t\t\treturn state;\n\t\t}\n\t}\n\n\tpublic remove(name: string) {\n\t\tdelete this._states[name];\n\t\tthis._template._stateChanged(name);\n\t}\n\n\tpublic _apply(entity: E, state: ApplyState): void {\n\t\t$object.each(this._states, (key, value) => {\n\t\t\tlet seen = state.states[key];\n\n\t\t\tif (seen == null) {\n\t\t\t\tseen = state.states[key] = {};\n\t\t\t}\n\n\t\t\tconst other = entity.states.create(key as string, {});\n\t\t\tvalue._apply(other, seen);\n\t\t});\n\t}\n}\n\n\nexport class TemplateAdapters {\n\tprivate _callbacks: { [K in keyof E[\"_settings\"]]?: Array<(value: O[K], target?: O, key?: K) => O[K]> } = {};\n\n\tpublic add(key: Key, callback: (value: O[Key], target?: O, key?: Key) => O[Key]) {\n\t\tlet callbacks = this._callbacks[key];\n\n\t\tif (callbacks === undefined) {\n\t\t\tcallbacks = this._callbacks[key] = [];\n\t\t}\n\n\t\tcallbacks.push(callback);\n\t}\n\n\tpublic _apply(entity: E): IDisposer {\n\t\tconst disposers: Array = [];\n\n\t\t$object.each(this._callbacks, (key, callbacks) => {\n\t\t\t$array.each(callbacks, (callback) => {\n\t\t\t\tdisposers.push(entity.adapters.add(key, callback));\n\t\t\t});\n\t\t});\n\n\t\treturn new MultiDisposer(disposers);\n\t}\n}\n\n\nexport interface ApplyState {\n\tsettings: Dirty;\n\tprivateSettings: Dirty;\n\tstates: { [name: string]: Dirty };\n}\n\n\n// TODO maybe extend from Properties ?\nexport class Template {\n\tpublic _settings: Partial;\n\tpublic _privateSettings: E[\"_privateSettings\"] = {};\n\n\t// TODO code duplication with Properties\n\tpublic _settingEvents: { [K in keyof this[\"_settings\"]]?: Array<(value: V) => void> } = {};\n\tpublic _privateSettingEvents: { [K in keyof this[\"_settings\"]]?: Array<(value: V) => void> } = {};\n\n\tpublic _entities: Array = [];\n\n\tpublic readonly states: TemplateStates = new TemplateStates(this);\n\n\tpublic readonly adapters: TemplateAdapters = new TemplateAdapters();\n\tpublic readonly events: EventDispatcher> = new EventDispatcher();\n\n\tpublic setup: ((entity: O) => void) | undefined;\n\n\t/**\n\t * Use this method to create an instance of this class.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/getting-started/#New_element_syntax} for more info\n\t * @param root Root element\n\t * @param settings Settings\n\t * @param template Template\n\t * @return Instantiated object\n\t */\n\tpublic static new(settings: E[\"_settings\"]): Template {\n\t\treturn new Template(settings, true);\n\t}\n\n\tconstructor(settings: E[\"_settings\"], isReal: boolean) {\n\t\tif (!isReal) {\n\t\t\tthrow new Error(\"You cannot use `new Class()`, instead use `Class.new()`\");\n\t\t}\n\n\t\tthis._settings = settings;\n\t}\n\n\tpublic get(key: Key): this[\"_settings\"][Key];\n\tpublic get(key: Key, fallback: F): NonNullable | F;\n\tpublic get(key: Key, fallback?: any): any {\n\t\tconst value = this._settings[key];\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\tpublic setRaw(key: Key, value: this[\"_settings\"][Key]) {\n\t\tthis._settings[key] = value;\n\t}\n\n\tpublic set(key: Key, value: this[\"_settings\"][Key]) {\n\t\tif (this._settings[key] !== value) {\n\t\t\tthis.setRaw(key, value);\n\n\t\t\tthis._entities.forEach((entity) => {\n\t\t\t\tentity._setTemplateProperty(this, key, value);\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic remove(key: Key): void {\n\t\tif (key in this._settings) {\n\t\t\tdelete this._settings[key];\n\n\t\t\tthis._entities.forEach((entity) => {\n\t\t\t\tentity._removeTemplateProperty(key);\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic removeAll(): void {\n\t\t$object.each(this._settings, (key, _value) => {\n\t\t\tthis.remove(key);\n\t\t});\n\t}\n\n\tpublic getPrivate(key: Key, fallback: F): NonNullable | F;\n\tpublic getPrivate(key: Key): this[\"_privateSettings\"][Key];\n\tpublic getPrivate(key: Key, fallback?: any): any {\n\t\tconst value = this._privateSettings[key];\n\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\n\t\t} else {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\tpublic setPrivateRaw(key: Key, value: Value): Value {\n\t\tthis._privateSettings[key] = value;\n\t\treturn value;\n\t}\n\n\tpublic setPrivate(key: Key, value: Value): Value {\n\t\tif (this._privateSettings[key] !== value) {\n\t\t\tthis.setPrivateRaw(key, value);\n\n\t\t\tthis._entities.forEach((entity) => {\n\t\t\t\tentity._setTemplatePrivateProperty(this, key, value);\n\t\t\t});\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic removePrivate(key: Key): void {\n\t\tif (key in this._privateSettings) {\n\t\t\tdelete this._privateSettings[key];\n\n\t\t\tthis._entities.forEach((entity) => {\n\t\t\t\tentity._removeTemplatePrivateProperty(key);\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic setAll(value: this[\"_settings\"]) {\n\t\t$object.each(value, (key, value) => {\n\t\t\tthis.set(key, value);\n\t\t});\n\t}\n\n\t// TODO code duplication with Properties\n\tpublic on(key: Key, callback: (value: this[\"_settings\"][Key], target?: E, key?: Key) => void): IDisposer {\n\t\tlet events = this._settingEvents[key];\n\n\t\tif (events === undefined) {\n\t\t\tevents = this._settingEvents[key] = [];\n\t\t}\n\n\t\tevents.push(callback);\n\n\t\treturn new Disposer(() => {\n\t\t\t$array.removeFirst(events!, callback);\n\n\t\t\tif (events!.length === 0) {\n\t\t\t\tdelete this._settingEvents[key];\n\t\t\t}\n\t\t});\n\t}\n\n\t// TODO code duplication with Properties\n\tpublic onPrivate(key: Key, callback: (value: this[\"_privateSettings\"][Key], target?: E, key?: Key) => void): IDisposer {\n\t\tlet events = this._privateSettingEvents[key];\n\n\t\tif (events === undefined) {\n\t\t\tevents = this._privateSettingEvents[key] = [];\n\t\t}\n\n\t\tevents.push(callback);\n\n\t\treturn new Disposer(() => {\n\t\t\t$array.removeFirst(events!, callback);\n\n\t\t\tif (events!.length === 0) {\n\t\t\t\tdelete this._privateSettingEvents[key];\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic _apply(entity: E, state: ApplyState): IDisposer {\n\t\tconst disposers: Array = [];\n\n\t\t$object.each(this._settingEvents, (key, events) => {\n\t\t\t$array.each(events, (event) => {\n\t\t\t\tdisposers.push(entity.on(key, event));\n\t\t\t});\n\t\t});\n\n\t\t$object.each(this._privateSettingEvents, (key, events) => {\n\t\t\t$array.each(events, (event) => {\n\t\t\t\tdisposers.push(entity.onPrivate(key, event));\n\t\t\t});\n\t\t});\n\n\t\tthis.states._apply(entity, state);\n\n\t\tdisposers.push(this.adapters._apply(entity));\n\t\tdisposers.push(entity.events.copyFrom(this.events));\n\n\t\treturn new MultiDisposer(disposers);\n\t}\n\n\tpublic _setObjectTemplate(entity: E) {\n\t\tthis._entities.push(entity);\n\t}\n\n\tpublic _removeObjectTemplate(entity: E) {\n\t\t$array.keepIf(this._entities, (x) => x !== entity);\n\t}\n\n\tpublic _stateChanged(name: string): void {\n\t\tthis._entities.forEach((entity) => {\n\t\t\tentity._applyStateByKey(name);\n\t\t});\n\t}\n}\n","import { Color } from \"./Color\"\nimport type { ITextStyle } from \"../render/backend/Renderer\"\nimport * as $type from \"./Type\";\n\n/**\n * Defines an interface for an object that holds a chunk of text.\n */\nexport interface ITextChunk {\n\n\t/**\n\t * Type of the chunk.\n\t */\n\t\"type\": \"value\" | \"text\" | \"format\" | \"image\",\n\n\t/**\n\t * Text.\n\t */\n\t\"text\": string\n\n}\n\nexport class TextFormatter {\n\n\tpublic static prefix = \"__amcharts__\";\n\n\t/**\n\t * Replaces brackets with temporary placeholders.\n\t *\n\t * @ignore Exclude from docs\n\t * @param text Input text\n\t * @return Escaped text\n\t */\n\tpublic static escape(text: string): string {\n\t\treturn text.\n\t\t\treplace(/\\[\\[/g, this.prefix + \"1\").\n\t\t\treplace(/([^\\/\\]]{1})\\]\\]/g, \"$1\" + this.prefix + \"2\").\n\t\t\treplace(/\\]\\]/g, this.prefix + \"2\").\n\t\t\treplace(/\\{\\{/g, this.prefix + \"3\").\n\t\t\treplace(/\\}\\}/g, this.prefix + \"4\").\n\t\t\treplace(/\\'\\'/g, this.prefix + \"5\");\n\t}\n\n\t/**\n\t * Replaces placeholders back to brackets.\n\t *\n\t * @ignore Exclude from docs\n\t * @param text Escaped text\n\t * @return Unescaped text\n\t */\n\tpublic static unescape(text: string): string {\n\t\treturn text.\n\t\t\treplace(new RegExp(this.prefix + \"1\", \"g\"), \"[[\").\n\t\t\treplace(new RegExp(this.prefix + \"2\", \"g\"), \"]]\").\n\t\t\treplace(new RegExp(this.prefix + \"3\", \"g\"), \"{{\").\n\t\t\treplace(new RegExp(this.prefix + \"4\", \"g\"), \"}}\").\n\t\t\treplace(new RegExp(this.prefix + \"5\", \"g\"), \"''\");\n\t}\n\n\t/**\n\t * Cleans up the text text for leftover double square brackets.\n\t *\n\t * @ignore Exclude from docs\n\t * @param text Input text\n\t * @return Cleaned up text\n\t */\n\tpublic static cleanUp(text: string): string {\n\t\treturn text.\n\t\t\treplace(/\\[\\[/g, \"[\").\n\t\t\treplace(/\\]\\]/g, \"]\").\n\t\t\treplace(/\\{\\{/g, \"{\").\n\t\t\treplace(/\\}\\}/g, \"}\").\n\t\t\treplace(/\\'\\'/g, \"'\");\n\t}\n\n\t/**\n\t * Splits string into chunks. (style blocks, quoted blocks, regular blocks)\n\t *\n\t * If the second parameter `quotedBlocks` is set to `true` this method will\n\t * also single out text blocks enclosed within single quotes that no\n\t * formatting should be applied to, and they should be displayed as is.\n\t *\n\t * Default for the above is `false`, so that you can use single quote in text\n\t * without escaping it.\n\t *\n\t * If enabled, single quotes can be escaped by doubling it - adding two\n\t * single quotes, which will be replaced by a one single quote in the final\n\t * output.\n\t *\n\t * @ignore Exclude from docs\n\t * @param text Text to chunk\n\t * @param quotedBlocks Use quoted blocks\n\t * @param noFormatting Formatting blocks will be treated as regular text\n\t * @return Array of string chunks\n\t */\n\tpublic static chunk(text: string, quotedBlocks: boolean = false, noFormatting: boolean = false): ITextChunk[] {\n\n\t\t// Init result\n\t\tlet res: ITextChunk[] = [];\n\n\t\t// Replace double (escaped) square spaces and quotes with temporary codes\n\t\ttext = this.escape(text);\n\n\t\t// Deal with style blocks\n\t\tlet chunks = quotedBlocks ? text.split(\"'\") : [text];\n\t\tfor (let i: number = 0; i < chunks.length; i++) {\n\t\t\tlet chunk = chunks[i];\n\n\t\t\t// Empty?\n\t\t\tif (chunk === \"\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((i % 2) === 0) {\n\n\t\t\t\t// Text outside quotes\n\t\t\t\t// Parse for style blocks which are \"text\" chunks, the rest chunks are\n\t\t\t\t// \"value\"\n\n\t\t\t\tchunk = chunk.replace(/\\]\\[/g, \"]\" + $type.PLACEHOLDER + \"[\");\n\t\t\t\tchunk = chunk.replace(/\\[\\]/g, \"[ ]\");\n\t\t\t\tlet chunks2 = chunk.split(/[\\[\\]]+/);\n\t\t\t\tfor (let i2: number = 0; i2 < chunks2.length; i2++) {\n\t\t\t\t\tlet chunk2 = this.cleanUp(this.unescape(chunks2[i2]));\n\n\t\t\t\t\t// Placeholder?\n\t\t\t\t\tif (chunk2 === $type.PLACEHOLDER) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Empty?\n\t\t\t\t\tif (chunk2 === \"\") {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Block or value\n\t\t\t\t\tif ((i2 % 2) === 0) {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\t\"type\": \"value\",\n\t\t\t\t\t\t\t\"text\": chunk2\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\t\"type\": noFormatting ? \"value\" : \"format\",\n\t\t\t\t\t\t\t\"text\": \"[\" + chunk2 + \"]\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse {\n\n\t\t\t\t// A text within doublequotes\n\t\t\t\t// All chunks are \"text\"\n\n\t\t\t\tlet chunks2 = chunk.split(/[\\[\\]]+/);\n\t\t\t\tfor (let i2: number = 0; i2 < chunks2.length; i2++) {\n\t\t\t\t\tlet chunk2 = this.cleanUp(this.unescape(chunks2[i2]));\n\n\t\t\t\t\t// Empty?\n\t\t\t\t\tif (chunk2 === \"\") {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Block or text\n\t\t\t\t\tif ((i2 % 2) === 0) {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": chunk2\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.isImage(chunk2)) {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\t\"type\": \"image\",\n\t\t\t\t\t\t\t\"text\": \"[\" + chunk2 + \"]\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\t\"type\": \"format\",\n\t\t\t\t\t\t\t\"text\": \"[\" + chunk2 + \"]\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\t/**\n\t * Checks if supplied format contains image information and should be\n\t * formatted as such.\n\t * I.e.: `[img: myImage.png]`\n\t *\n\t * @ignore\n\t * @param text Format\n\t * @return true if it is an image\n\t */\n\tpublic static isImage(text: string): boolean {\n\t\treturn text.match(/img[ ]?:/) ? true : false;\n\t}\n\n\tpublic static getTextStyle(style: string): ITextStyle {\n\n\t\t// let textStyle: string[] = [];\n\t\t// let textFill: string | undefined;\n\t\tlet format: ITextStyle = {};\n\n\t\tif (style == \"\" || style == \"[ ]\") {\n\t\t\treturn {};\n\t\t}\n\n\t\t// TODO: cache\n\t\t// let cached = registry.getCache(\"translateStyleShortcuts_\" + style);\n\t\t// if (cached) {\n\t\t// \treturn cached;\n\t\t// }\n\n\t\t// Pre-process quoted text\n\t\tconst q = style.match(/('[^']*')|(\"[^\"]*\")/gi);\n\t\tif (q) {\n\t\t\tfor (let i: number = 0; i < q.length; i++) {\n\t\t\t\tstyle = style.replace(q[i], q[i].replace(/['\"]*/g, \"\").replace(/[ ]+/g, \"+\"));\n\t\t\t}\n\t\t}\n\n\t\t// Get style parts\n\t\tlet b: string[] | null = style.match(/([\\w\\-]*:[\\s]?[^;\\s\\]]*)|(\\#[\\w]{1,6})|([\\w]+)|(\\/)/gi);\n\n\t\t// Empty?\n\t\tif (!b) {\n\t\t\treturn {};\n\t\t}\n\n\t\t//console.log(b)\n\n\t\t// Check each part\n\t\tfor (let i: number = 0; i < b.length; i++) {\n\n\t\t\tif (b[i].match(/^(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)$/i)) {\n\t\t\t\t(format).fontWeight = b[i];\n\t\t\t}\n\t\t\telse if (b[i].match(/^(underline)$/i)) {\n\t\t\t\t(format).textDecoration = b[i];\n\t\t\t}\n\t\t\telse if (b[i] == \"/\") {\n\t\t\t\t// Just closing tag\n\t\t\t\t// Do nothing\n\t\t\t}\n\t\t\telse if (!b[i].match(/:/)) {\n\t\t\t\t// Color\n\t\t\t\tformat.fill = Color.fromString(b[i]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst p = b[i].split(/:[ ]*/);\n\t\t\t\t(format)[p[0]] = p[1];\n\t\t\t\t//textStyle.push(b[i].replace(/^[a-zA-Z]:[ ]*/, \"\"));\n\t\t\t\t//b[i] = b[i].replace(/\\+/g, \" \");\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO: cache\n\t\t// registry.setCache(\"translateStyleShortcuts_\" + style, res);\n\n\t\treturn format;\n\t}\n\n}\n","/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\nimport * as $type from \"./Type\";\nimport * as $utils from \"./Utils\";\n\n\nexport type TimeUnit = \"millisecond\" | \"second\" | \"minute\" | \"hour\" | \"day\" | \"week\" | \"month\" | \"year\";\n\nexport interface ITimeInterval {\n\ttimeUnit: TimeUnit;\n\tcount: number;\n}\n\n\n/**\n * Returns a `Promise` which can be used to execute code after number of\n * milliseconds.\n * \n * @param ms Sleep duration in ms\n * @return Promise\n */\nexport function sleep(ms: number): Promise {\n\treturn new Promise((resolve, _reject) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\n\n/**\n * Maps time period names to their numeric representations in milliseconds.\n *\n * @ignore Exclude from docs\n */\nexport let timeUnitDurations: { [Key in TimeUnit]: number } = {\n\tmillisecond: 1,\n\tsecond: 1000,\n\tminute: 60000,\n\thour: 3600000,\n\tday: 86400000,\n\tweek: 604800000,\n\tmonth: 365.242 / 12 * 86400000,\n\tyear: 31536000000\n};\n\n/**\n * Returns the next time unit that goes after source `unit`.\n *\n * E.g. \"hour\" is the next unit after \"minute\", etc.\n *\n * @ignore Exclude from docs\n * @param unit Source time unit\n * @return Next time unit\n */\nexport function getNextUnit(unit: TimeUnit): TimeUnit | undefined {\n\tswitch (unit) {\n\t\tcase \"year\":\n\t\t\treturn;\n\t\tcase \"month\":\n\t\t\treturn \"year\";\n\n\t\tcase \"week\":\n\t\t\treturn \"month\";\n\n\t\tcase \"day\":\n\t\t\treturn \"month\"; // not a mistake\n\n\t\tcase \"hour\":\n\t\t\treturn \"day\";\n\n\t\tcase \"minute\":\n\t\t\treturn \"hour\";\n\n\t\tcase \"second\":\n\t\t\treturn \"minute\"\n\n\t\tcase \"millisecond\":\n\t\t\treturn \"second\";\n\t}\n}\n\n/**\n * Returns number of milliseconds in the `count` of time `unit`.\n *\n * Available units: \"millisecond\", \"second\", \"minute\", \"hour\", \"day\", \"week\",\n * \"month\", and \"year\".\n *\n * @param unit Time unit\n * @param count Number of units\n * @return Milliseconds\n */\nexport function getDuration(unit: TimeUnit, count?: number): number {\n\tif (count == null) {\n\t\tcount = 1;\n\t}\n\treturn timeUnitDurations[unit] * count;\n}\n\n/**\n * @ignore\n */\nexport function getIntervalDuration(interval: ITimeInterval | undefined) {\n\tif (interval) {\n\t\treturn timeUnitDurations[interval.timeUnit] * interval.count;\n\t}\n\treturn 0;\n}\n\n/**\n * Returns current `Date` object.\n *\n * @return Current date\n */\nexport function now(): Date {\n\treturn new Date();\n}\n\n/**\n * Returns current timestamp.\n *\n * @return Current timestamp\n */\nexport function getTime(): number {\n\treturn now().getTime();\n}\n\n/**\n * Returns a copy of the `Date` object.\n *\n * @param date Source date\n * @return Copy\n */\nexport function copy(date: Date): Date {\n\treturn new Date(date.getTime()); // todo: check if this is ok. new Date(date) used to strip milliseconds on FF in v3\n}\n\n/**\n * Checks if the `unit` part of two `Date` objects do not match. Two dates\n * represent a \"range\" of time, rather the same time date.\n *\n * @param dateOne Date 1\n * @param dateTwo Date 2\n * @param unit Time unit to check\n * @return Range?\n */\nexport function checkChange(dateOne: Date, dateTwo: Date, unit: TimeUnit, utc?: boolean): boolean {\n\n\tconst timeOne = dateOne.getTime();\n\tconst timeTwo = dateTwo.getTime();\n\n\t// quick\n\tif ((timeTwo - timeOne) > getDuration(unit, 1.2)) {\n\t\treturn true;\n\t}\n\n\tdateOne = new Date(timeOne);\n\tdateTwo = new Date(timeTwo);\n\n\tlet timeZoneOffset1 = 0;\n\tlet timeZoneOffset2 = 0;\n\n\tif (!utc && unit != \"millisecond\") {\n\t\ttimeZoneOffset1 = dateOne.getTimezoneOffset();\n\t\tdateOne.setUTCMinutes(dateOne.getUTCMinutes() - timeZoneOffset1);\n\n\t\ttimeZoneOffset2 = dateTwo.getTimezoneOffset();\n\t\tdateTwo.setUTCMinutes(dateTwo.getUTCMinutes() - timeZoneOffset2);\n\t}\n\n\tlet changed = false;\n\tswitch (unit) {\n\t\tcase \"year\":\n\t\t\tif (dateOne.getUTCFullYear() != dateTwo.getUTCFullYear()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"month\":\n\t\t\tif (dateOne.getUTCFullYear() != dateTwo.getUTCFullYear()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\telse if (dateOne.getUTCMonth() != dateTwo.getUTCMonth()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"day\":\n\t\t\tif (dateOne.getUTCMonth() != dateTwo.getUTCMonth()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\telse if (dateOne.getUTCDate() != dateTwo.getUTCDate()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase \"hour\":\n\t\t\tif (dateOne.getUTCHours() != dateTwo.getUTCHours()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"minute\":\n\t\t\tif (dateOne.getUTCMinutes() != dateTwo.getUTCMinutes()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase \"second\":\n\t\t\tif (dateOne.getUTCSeconds() != dateTwo.getUTCSeconds()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"millisecond\":\n\t\t\tif (dateOne.getTime() != dateTwo.getTime()) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tif (changed) {\n\t\treturn true;\n\t}\n\n\tlet nextUnit: $type.Optional = getNextUnit(unit);\n\tif (nextUnit) {\n\t\tdateOne.setUTCMinutes(dateOne.getUTCMinutes() + timeZoneOffset1);\n\t\tdateTwo.setUTCMinutes(dateTwo.getUTCMinutes() + timeZoneOffset2);\n\t\treturn checkChange(dateOne, dateTwo, nextUnit, utc);\n\t}\n\telse {\n\t\treturn false;\n\t}\n}\n\n/**\n * Adds `count` of time `unit` to the source date. Returns a modified `Date` object.\n *\n * @param date Source date\n * @param unit Time unit\n * @param count Number of units to add\n * @return Modified date\n */\nexport function add(date: Date, unit: TimeUnit, count: number, utc?: boolean): Date {\n\tlet timeZoneOffset = 0;\n\n\tif (!utc && unit != \"millisecond\") {\n\t\ttimeZoneOffset = date.getTimezoneOffset();\n\t\tdate.setUTCMinutes(date.getUTCMinutes() - timeZoneOffset);\n\t}\n\n\tswitch (unit) {\n\t\tcase \"day\":\n\t\t\tlet day: number = date.getUTCDate();\n\t\t\tdate.setUTCDate(day + count);\n\t\t\tbreak;\n\n\t\tcase \"second\":\n\t\t\tlet seconds: number = date.getUTCSeconds();\n\t\t\tdate.setUTCSeconds(seconds + count);\n\t\t\tbreak;\n\n\t\tcase \"millisecond\":\n\t\t\tlet milliseconds: number = date.getUTCMilliseconds();\n\t\t\tdate.setUTCMilliseconds(milliseconds + count);\n\t\t\tbreak;\n\n\t\tcase \"hour\":\n\t\t\tlet hours: number = date.getUTCHours();\n\t\t\tdate.setUTCHours(hours + count);\n\t\t\tbreak;\n\n\t\tcase \"minute\":\n\t\t\tlet minutes: number = date.getUTCMinutes();\n\t\t\tdate.setUTCMinutes(minutes + count);\n\t\t\tbreak;\n\n\t\tcase \"year\":\n\t\t\tlet year: number = date.getUTCFullYear();\n\t\t\tdate.setUTCFullYear(year + count);\n\t\t\tbreak;\n\n\t\tcase \"month\":\n\t\t\tlet month: number = date.getUTCMonth();\n\t\t\tdate.setUTCMonth(month + count);\n\t\t\tbreak;\n\n\t\tcase \"week\":\n\t\t\tlet wday: number = date.getUTCDate();\n\t\t\tdate.setUTCDate(wday + count * 7);\n\t\t\tbreak;\n\t}\n\tif (!utc && unit != \"millisecond\") {\n\t\tdate.setUTCMinutes(date.getUTCMinutes() + timeZoneOffset);\n\n\t\tif (unit == \"day\" || unit == \"week\" || unit == \"month\" || unit == \"year\") {\n\t\t\tlet newTimeZoneOffset = date.getTimezoneOffset();\n\t\t\tif (newTimeZoneOffset != timeZoneOffset) {\n\t\t\t\tlet diff = newTimeZoneOffset - timeZoneOffset;\n\n\t\t\t\tdate.setUTCMinutes(date.getUTCMinutes() + diff);\n\t\t\t\t// solves issues if newe time falls back to old time zone\n\t\t\t\tif (date.getTimezoneOffset() != newTimeZoneOffset) {\n\t\t\t\t\tdate.setUTCMinutes(date.getUTCMinutes() - diff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn date;\n}\n\n/**\n * \"Rounds\" the date to specific time unit.\n *\n * @param date Source date\n * @param unit Time unit\n * @param count Number of units to round to\n * @param firstDateOfWeek First day of week\n * @return New date\n */\nexport function round(date: Date, unit: TimeUnit, count: number, firstDateOfWeek?: number, utc?: boolean, firstDate?: Date): Date {\n\n\tif (!$type.isNumber(count)) {\n\t\tcount = 1;\n\t}\n\n\tlet timeZoneOffset = 0;\n\n\tif (!utc && unit != \"millisecond\") {\n\t\ttimeZoneOffset = date.getTimezoneOffset();\n\t\tdate.setUTCMinutes(date.getUTCMinutes() - timeZoneOffset);\n\t}\n\n\tswitch (unit) {\n\n\t\tcase \"day\":\n\t\t\tlet day = date.getUTCDate();\n\n\t\t\tif (count > 1) {\n\t\t\t\t//\tday = Math.floor(day / count) * count;\n\t\t\t\tif (firstDate) {\n\t\t\t\t\tfirstDate = round(firstDate, \"day\", 1);\n\n\t\t\t\t\tlet difference = date.getTime() - firstDate.getTime();\n\t\t\t\t\tlet unitCount = Math.floor(difference / getDuration(\"day\") / count);\n\t\t\t\t\tlet duration = getDuration(\"day\", unitCount * count);\n\t\t\t\t\tdate.setTime(firstDate.getTime() + duration - timeZoneOffset * getDuration(\"minute\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdate.setUTCDate(day);\n\t\t\t}\n\t\t\tdate.setUTCHours(0, 0, 0, 0);\n\n\t\t\tbreak;\n\n\t\tcase \"second\":\n\t\t\tlet seconds = date.getUTCSeconds();\n\t\t\tif (count > 1) {\n\t\t\t\tseconds = Math.floor(seconds / count) * count;\n\t\t\t}\n\t\t\tdate.setUTCSeconds(seconds, 0);\n\t\t\tbreak;\n\n\t\tcase \"millisecond\":\n\t\t\tif (count == 1) {\n\t\t\t\treturn date; // much better for perf!\n\t\t\t}\n\n\t\t\tlet milliseconds = date.getUTCMilliseconds();\n\t\t\tmilliseconds = Math.floor(milliseconds / count) * count;\n\t\t\tdate.setUTCMilliseconds(milliseconds);\n\t\t\tbreak;\n\n\t\tcase \"hour\":\n\n\t\t\tlet hours = date.getUTCHours();\n\t\t\tif (count > 1) {\n\t\t\t\thours = Math.floor(hours / count) * count;\n\t\t\t}\n\t\t\tdate.setUTCHours(hours, 0, 0, 0);\n\n\t\t\tbreak;\n\n\t\tcase \"minute\":\n\n\t\t\tlet minutes = date.getUTCMinutes();\n\t\t\tmilliseconds = date.getUTCMilliseconds();\n\t\t\tif (count > 1) {\n\t\t\t\tminutes = Math.floor(minutes / count) * count;\n\t\t\t}\n\n\t\t\tdate.setUTCMinutes(minutes, 0, 0);\n\n\t\t\tbreak;\n\n\t\tcase \"month\":\n\n\t\t\tlet month = date.getUTCMonth();\n\t\t\tif (count > 1) {\n\t\t\t\tmonth = Math.floor(month / count) * count;\n\t\t\t}\n\n\t\t\tdate.setUTCMonth(month, 1);\n\t\t\tdate.setUTCHours(0, 0, 0, 0);\n\n\t\t\tbreak;\n\n\t\tcase \"year\":\n\n\t\t\tlet year = date.getUTCFullYear();\n\t\t\tif (count > 1) {\n\t\t\t\tyear = Math.floor(year / count) * count;\n\t\t\t}\n\t\t\tdate.setUTCFullYear(year, 0, 1);\n\t\t\tdate.setUTCHours(0, 0, 0, 0);\n\n\t\t\t//let nonUTCDateY = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n\t\t\t//timeZoneOffset = nonUTCDateY.getTimezoneOffset();\n\n\t\t\tbreak;\n\n\n\t\tcase \"week\":\n\n\t\t\tlet wday = date.getUTCDate();\n\t\t\tlet weekDay = date.getUTCDay();\n\n\t\t\tif (!$type.isNumber(firstDateOfWeek)) {\n\t\t\t\tfirstDateOfWeek = 1;\n\t\t\t}\n\n\t\t\t// todo: rounding when count is not 1\n\t\t\tif (weekDay >= firstDateOfWeek) {\n\t\t\t\twday = wday - weekDay + firstDateOfWeek;\n\t\t\t} else {\n\t\t\t\twday = wday - (7 + weekDay) + firstDateOfWeek;\n\t\t\t}\n\n\t\t\tdate.setUTCDate(wday);\n\t\t\tdate.setUTCHours(0, 0, 0, 0);\n\n\t\t\tbreak;\n\t}\n\tif (!utc && unit != \"millisecond\") {\n\t\tdate.setUTCMinutes(date.getUTCMinutes() + timeZoneOffset);\n\n\t\tif (unit == \"day\" || unit == \"week\" || unit == \"month\" || unit == \"year\") {\n\t\t\tlet newTimeZoneOffset = date.getTimezoneOffset();\n\t\t\tif (newTimeZoneOffset != timeZoneOffset) {\n\t\t\t\tlet diff = newTimeZoneOffset - timeZoneOffset;\n\n\t\t\t\tdate.setUTCMinutes(date.getUTCMinutes() + diff);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn date;\n}\n\n/**\n * Returns a new `Date` object which corresponds to the source date in a\n * specific timezone.\n *\n * @param date Source date\n * @param timezone Timezone identifier\n * @return Recalculated new Date\n */\nexport function setTimezone(date: Date, timezone: string): Date {\n\tconst d = new Date(date.toLocaleString(\"en-US\", { timeZone: timezone }));\n\treturn d;\n}\n\n/**\n * @ignore\n */\nexport function chooseInterval(index: number, duration: number, gridCount: number, intervals: Array): ITimeInterval {\n\tlet gridInterval: ITimeInterval = intervals[index];\n\tlet intervalDuration = getIntervalDuration(gridInterval);\n\n\tlet lastIndex = intervals.length - 1;\n\tif (index >= lastIndex) {\n\t\treturn { ...intervals[lastIndex] };\n\t}\n\n\tlet count = Math.ceil(duration / intervalDuration);\n\n\tif (duration < intervalDuration && index > 0) {\n\t\treturn { ...intervals[index - 1] };\n\t}\n\tif (count <= gridCount) {\n\t\treturn { ...intervals[index] };\n\t} else {\n\t\tif (index + 1 < intervals.length) {\n\t\t\treturn chooseInterval(index + 1, duration, gridCount, intervals);\n\t\t} else {\n\t\t\treturn { ...intervals[index] };\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nexport function getUnitValue(date: Date, unit: TimeUnit) {\n\tswitch (unit) {\n\t\tcase \"day\":\n\t\t\treturn date.getDate();\n\t\tcase \"second\":\n\t\t\treturn date.getSeconds();\n\t\tcase \"millisecond\":\n\t\t\treturn date.getMilliseconds();\n\t\tcase \"hour\":\n\t\t\treturn date.getHours();\n\t\tcase \"minute\":\n\t\t\treturn date.getMinutes();\n\t\tcase \"month\":\n\t\t\treturn date.getMonth();\n\t\tcase \"year\":\n\t\t\treturn date.getFullYear();\n\t\tcase \"week\":\n\t\t\treturn $utils.getWeek(date);\n\t}\n}\n\n","/**\n * A collection of utility functions for various type checks and conversion\n * @hidden\n */\n\n/**\n * ============================================================================\n * IMPORTS\n * ============================================================================\n * @hidden\n */\n\n/**\n * ============================================================================\n * MISC\n * ============================================================================\n * @hidden\n */\n\ntype Cond = Keys extends never\n\t? never\n\t: { [K in Keys]: T[K] };\n\ntype Never = T extends undefined ? never : T;\n\n/**\n * Selects all the keys of T which have a value of U.\n */\nexport type SelectKeys = Never<{ [K in keyof T]: T[K] extends U ? K : never }[keyof T]>;\n\n/**\n * Creates a new type which is the same as T except it only has the properties of type U.\n */\nexport type Select = Cond>;\n\n\n/**\n * @todo Description\n * @ignore Exclude from docs\n */\nexport type Public = { [P in keyof T]: T[P] };\n\n\n/**\n * `Keyof` is the same as `keyof T` except it only accepts string keys, not numbers or symbols.\n */\nexport type Keyof = Extract;\n\n\n\n/**\n * ============================================================================\n * TYPE CHECK\n * ============================================================================\n * @hidden\n */\n\n/**\n * Returns `true` if value is not a number (NaN).\n *\n * @param value Input value\n * @return Is NaN?\n */\nexport function isNaN(value: number): boolean {\n\treturn Number(value) !== value;\n}\n\n/**\n * Represents a type for all available JavaScript variable types.\n */\nexport type Type\n\t= \"[object Object]\"\n\t| \"[object Array]\"\n\t| \"[object String]\"\n\t| \"[object Number]\"\n\t| \"[object Boolean]\"\n\t| \"[object Date]\";\n\n/**\n * Returns a type of the value.\n *\n * @param value Input value\n * @return Type of the value\n * @ignore\n */\nexport function getType(value: A): Type {\n\treturn ({}).toString.call(value) as Type;\n}\n\n\n/**\n * ============================================================================\n * QUICK CONVERSION\n * ============================================================================\n * @hidden\n */\n\n\n/**\n * Converts any value into a `number`.\n *\n * @param value Source value\n * @return Number representation of value\n */\nexport function toNumber(value: any): number {\n\tif (value != null && !isNumber(value)) {\n\t\tlet converted = Number(value);\n\t\tif (isNaN(converted) && isString(value) && value != \"\") {\n\t\t\treturn toNumber(value.replace(/[^0-9.\\-]+/g, ''));\n\t\t}\n\t\treturn converted;\n\t}\n\treturn value;\n}\n\n\n\n/**\n * Converts anything to Date object.\n *\n * @param value A value of any type\n * @return Date object representing a value\n */\nexport function toDate(value: Date | number | string): Date {\n\tif (isDate(value)) {\n\t\t// TODO maybe don't create a new Date ?\n\t\treturn new Date(value);\n\t}\n\n\telse if (isNumber(value)) {\n\t\treturn new Date(value);\n\t}\n\n\telse {\n\t\t// Try converting to number (assuming timestamp)\n\t\tlet num = Number(value);\n\n\t\tif (!isNumber(num)) {\n\t\t\treturn new Date(value);\n\t\t}\n\t\telse {\n\t\t\treturn new Date(num);\n\t\t}\n\t}\n}\n\n/**\n * Converts numeric value into string. Deals with large or small numbers that\n * would otherwise use exponents.\n *\n * @param value Numeric value\n * @return Numeric value as string\n */\nexport function numberToString(value: number): string {\n\t// TODO handle Infinity and -Infinity\n\tif (isNaN(value)) {\n\t\treturn \"NaN\";\n\t}\n\n\tif (value === Infinity) {\n\t\treturn \"Infinity\";\n\t}\n\n\tif (value === -Infinity) {\n\t\treturn \"-Infinity\";\n\t}\n\n\t// Negative 0\n\tif ((value === 0) && (1 / value === -Infinity)) {\n\t\treturn \"-0\";\n\t}\n\n\t// Preserve negative and deal with absoute values\n\tlet negative = value < 0;\n\n\tvalue = Math.abs(value);\n\n\t// TODO test this\n\tlet parsed = /^([0-9]+)(?:\\.([0-9]+))?(?:e[\\+\\-]([0-9]+))?$/.exec(\"\" + value)!;\n\tlet digits = parsed[1];\n\tlet decimals = parsed[2] || \"\";\n\n\tlet res: string;\n\n\t// Leave the nummber as it is if it does not use exponents\n\tif (parsed[3] === undefined) {\n\t\tres = (decimals === \"\" ? digits : digits + \".\" + decimals);\n\n\t} else {\n\t\tlet exponent = +parsed[3];\n\n\t\t// Deal with decimals\n\t\tif (value < 1) {\n\t\t\tlet zeros = exponent - 1;\n\n\t\t\tres = \"0.\" + repeat(\"0\", zeros) + digits + decimals;\n\n\t\t\t// Deal with integers\n\t\t} else {\n\t\t\tlet zeros = exponent - decimals.length;\n\n\t\t\tif (zeros === 0) {\n\t\t\t\tres = digits + decimals;\n\n\t\t\t} else if (zeros < 0) {\n\t\t\t\tres = digits + decimals.slice(0, zeros) + \".\" + decimals.slice(zeros);\n\n\t\t\t} else {\n\t\t\t\tres = digits + decimals + repeat(\"0\", zeros);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn negative ? \"-\" + res : res;\n}\n\n/**\n * Repeats a `string` number of times as set in `amount`.\n *\n * @ignore Exclude from docs\n * @todo Make this faster\n * @param string Source string\n * @param amount Number of times to repeat string\n * @return New string\n */\nexport function repeat(string: string, amount: number): string {\n return new Array(amount + 1).join(string);\n}\n\n\n/**\n * ============================================================================\n * VALUE PRESENCE CHECK\n * ============================================================================\n * @hidden\n */\n\n/**\n * Defines an optional value that can be of any type or `undefined`.\n */\nexport type Optional = A | undefined;\n\n\n/**\n * ============================================================================\n * TYPE CHECK\n * ============================================================================\n * @hidden\n */\n\n/**\n * Checks if parameter is `Date`.\n *\n * @param value Input value\n * @return Is Date?\n */\nexport function isDate(value: any): value is Date {\n\treturn getType(value) === \"[object Date]\";\n}\n\n/**\n * Checks if parameter is `string`.\n *\n * @param value Input value\n * @return Is string?\n */\nexport function isString(value: any): value is string {\n\treturn typeof value === \"string\";\n}\n\n/**\n * Checks if parameter is `number`.\n *\n * @param value Input value\n * @return Is number?\n */\nexport function isNumber(value: any): value is number {\n\treturn typeof value === \"number\" && Number(value) == value;\n}\n\n/**\n * Checks if parameter is `object`.\n *\n * @param value Input value\n * @return Is object?\n */\nexport function isObject(value: any): value is object {\n\treturn typeof value === \"object\" && value !== null;\n}\n\n/**\n * Checks if parameter is `Array`.\n *\n * @param value Input value\n * @return Is Array?\n */\nexport function isArray(value: any): value is Array {\n\treturn Array.isArray(value);\n}\n\n\n/**\n * ============================================================================\n * STATIC CONSTANTS\n * ============================================================================\n * @hidden\n */\n\n\n/**\n * @ignore Exclude from docs\n */\nexport const PLACEHOLDER: string = \"__§§§__\";\n\n/**\n * @ignore Exclude from docs\n */\nexport const PLACEHOLDER2: string = \"__§§§§__\";","import type { Percent } from \"./Percent\";\nimport type { IPointerEvent } from \"../render/backend/Renderer\";\n\nimport * as $type from \"./Type\";\nimport * as $array from \"./Array\";\nimport * as $object from \"./Object\";\nimport type { IBounds } from \"./IBounds\";\n\nimport { Disposer, IDisposer } from \"./Disposer\";\n\n/**\n * ============================================================================\n * DOM FUNCTIONS\n * ============================================================================\n * @hidden\n */\n\n/**\n * Execute a function when DOM is ready.\n * \n * @since 5.0.2\n * @param f Callback\n */\nexport function ready(f: () => void): void {\n\tif (document.readyState !== \"loading\") {\n\t\tf();\n\n\t} else {\n\t\tconst listener = () => {\n\t\t\tif (document.readyState !== \"loading\") {\n\t\t\t\tdocument.removeEventListener(\"readystatechange\", listener);\n\t\t\t\tf();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"readystatechange\", listener);\n\t}\n}\n\n/**\n * Removes a DOM element.\n * @param el Target element\n */\nexport function removeElement(el: HTMLElement): void {\n\tif (el.parentNode) {\n\t\tel.parentNode.removeChild(el);\n\t}\n}\n\n/**\n * Function that adds a disposable event listener directly to a DOM element.\n *\n * @ignore Exclude from docs\n * @param dom A DOM element to add event to\n * @param type Event type\n * @param listener Event listener\n * @returns Disposable event\n */\nexport function addEventListener(dom: EventTarget, type: string, listener: (event: E) => void, options?: any): IDisposer {\n\t//@todo proper type check for options: EventListenerOptions | boolean (TS for some reason gives error on passive parameter)\n\t//console.log(type, dom);\n\tdom.addEventListener(type, listener, options || false);\n\n\treturn new Disposer(() => {\n\t\tdom.removeEventListener(type, listener, options || false);\n\t});\n}\n\n/**\n * @ignore\n */\nexport function supports(cap: \"touchevents\" | \"pointerevents\" | \"mouseevents\" | \"wheelevents\" | \"keyboardevents\"): boolean {\n\tswitch (cap) {\n\t\tcase \"touchevents\":\n\t\t\t//return \"ontouchstart\" in document.documentElement;\n\t\t\treturn window.hasOwnProperty(\"TouchEvent\");\n\n\t\tcase \"pointerevents\":\n\t\t\treturn window.hasOwnProperty(\"PointerEvent\");\n\n\t\tcase \"mouseevents\":\n\t\t\treturn window.hasOwnProperty(\"MouseEvent\");\n\n\t\tcase \"wheelevents\":\n\t\t\treturn window.hasOwnProperty(\"WheelEvent\");\n\n\t\tcase \"keyboardevents\":\n\t\t\treturn window.hasOwnProperty(\"KeyboardEvent\");\n\t}\n\treturn false;\n}\n\n/**\n * @ignore\n */\nexport function getPointerId(event: IPointerEvent) {\n\tlet id = (event).pointerId || 0;\n\t//console.log(event);\n\treturn id;\n}\n\n/**\n * Removes focus from any element by shifting focus to body.\n *\n * @ignore\n */\nexport function blur(): void {\n\tif (document.activeElement && document.activeElement != document.body) {\n\t\tif ((document.activeElement).blur) {\n\t\t\t(document.activeElement).blur();\n\t\t}\n\t\telse {\n\t\t\tlet input = document.createElement(\"button\");\n\t\t\tinput.style.position = \"fixed\";\n\t\t\tinput.style.top = \"0px\";\n\t\t\tinput.style.left = \"-10000px\";\n\t\t\tdocument.body.appendChild(input);\n\t\t\tinput.focus();\n\t\t\tinput.blur();\n\t\t\tdocument.body.removeChild(input);\n\t\t}\n\t}\n}\n\n/**\n * Focuses element.\n * \n * @ignore\n */\nexport function focus(el: HTMLElement): void {\n\tif (el) {\n\t\tel.focus();\n\t}\n}\n\n/**\n * @ignore\n */\nexport function getRendererEvent(key: string): string {\n\tif (supports(\"pointerevents\")) {\n\t\treturn key;\n\t}\n\telse if (supports(\"touchevents\")) {\n\t\tswitch (key) {\n\t\t\tcase \"pointerover\": return \"touchstart\";\n\t\t\tcase \"pointerout\": return \"touchend\";\n\t\t\tcase \"pointerdown\": return \"touchstart\";\n\t\t\tcase \"pointermove\": return \"touchmove\";\n\t\t\tcase \"pointerup\": return \"touchend\";\n\t\t\tcase \"click\": return \"click\";\n\t\t\tcase \"dblclick\": return \"dblclick\";\n\n\t\t}\n\t}\n\telse if (supports(\"mouseevents\")) {\n\t\tswitch (key) {\n\t\t\tcase \"pointerover\": return \"mouseover\";\n\t\t\tcase \"pointerout\": return \"mouseout\";\n\t\t\tcase \"pointerdown\": return \"mousedown\";\n\t\t\tcase \"pointermove\": return \"mousemove\";\n\t\t\tcase \"pointerup\": return \"mouseup\";\n\t\t\tcase \"click\": return \"click\";\n\t\t\tcase \"dblclick\": return \"dblclick\";\n\n\t\t}\n\t}\n\treturn key;\n}\n\n/**\n * Determines if pointer event originated from a touch pointer or mouse.\n *\n * @param ev Original event\n * @return Touch pointer?\n */\nexport function isTouchEvent(ev: MouseEvent | Touch): boolean {\n\tif (typeof Touch !== \"undefined\" && ev instanceof Touch) {\n\t\treturn true;\n\t}\n\telse if (typeof PointerEvent !== \"undefined\" && ev instanceof PointerEvent && (ev).pointerType != null) {\n\t\tswitch ((ev).pointerType) {\n\t\t\tcase \"touch\":\n\t\t\tcase \"pen\":\n\t\t\tcase 2:\n\t\t\t\treturn true;\n\t\t\tcase \"mouse\":\n\t\t\tcase 4:\n\t\t\t\treturn false;\n\t\t\tdefault:\n\t\t\t\treturn !(ev instanceof MouseEvent);\n\t\t}\n\t}\n\telse if ((ev).type != null) {\n\t\tif ((ev).type.match(/^mouse/)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Sets style property on DOM element.\n *\n * @ignore Exclude from docs\n */\nexport function setStyle(dom: HTMLElement, property: string, value: string | undefined): void {\n\t(dom.style)[property] = value;\n}\n\nexport function getStyle(dom: HTMLElement, property: string): string | undefined {\n\treturn (dom.style)[property];\n}\n\n/**\n * Checks of element `a` contains element `b`.\n *\n * @param a Aleged ascendant\n * @param b Aleged descendant\n * @return Contains?\n */\nexport function contains(a: Element, b: Element): boolean {\n\tlet cursor: Node = b;\n\n\twhile (true) {\n\t\tif (a === cursor) {\n\t\t\treturn true;\n\n\t\t} else if (cursor.parentNode === null) {\n\t\t\t// TODO better ShadowRoot detection\n\t\t\tif ((cursor).host == null) {\n\t\t\t\treturn false;\n\n\t\t\t} else {\n\t\t\t\tcursor = (cursor).host;\n\t\t\t}\n\n\t\t} else {\n\t\t\tcursor = cursor.parentNode;\n\t\t}\n\t}\n}\n\n/**\n * Disables or enables interactivity of a DOM element.\n * \n * @param target Target element\n * @param interactive Interactive?\n */\nexport function setInteractive(target: HTMLElement, interactive: boolean): void {\n\tif (interactive) {\n\t\ttarget.style.pointerEvents = \"\";\n\t}\n\telse {\n\t\ttarget.style.pointerEvents = \"none\";\n\t}\n}\n\n/**\n * Returns the shadow root of the element or null\n *\n * @param a Node\n * @return Root\n */\nexport function getShadowRoot(a: Node): ShadowRoot | null {\n\tlet cursor: Node = a;\n\n\twhile (true) {\n\t\tif (cursor.parentNode === null) {\n\t\t\t// TODO better ShadowRoot detection\n\t\t\tif ((cursor).host != null) {\n\t\t\t\treturn cursor;\n\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t} else {\n\t\t\tcursor = cursor.parentNode;\n\t\t}\n\t}\n}\n\n/**\n * [rootStylesheet description]\n *\n * @ignore Exclude from docs\n * @todo Description\n */\nlet rootStylesheet: $type.Optional;\n\n/**\n * [getStylesheet description]\n *\n * @ignore Exclude from docs\n * @todo Description\n * @return [description]\n */\nfunction getStylesheet(element: ShadowRoot | null, nonce: string = \"\"): CSSStyleSheet {\n\tif (element === null) {\n\t\tif (rootStylesheet == null) {\n\t\t\t// TODO use createElementNS ?\n\t\t\tconst e = document.createElement(\"style\");\n\t\t\te.type = \"text/css\";\n\t\t\tif (nonce != \"\") {\n\t\t\t\te.setAttribute(\"nonce\", nonce)\n\t\t\t}\n\t\t\tdocument.head.appendChild(e);\n\t\t\trootStylesheet = e.sheet as CSSStyleSheet;\n\t\t}\n\n\t\treturn rootStylesheet;\n\n\t} else {\n\t\t// TODO use createElementNS ?\n\t\tconst e = document.createElement(\"style\");\n\t\te.type = \"text/css\";\n\t\tif (nonce != \"\") {\n\t\t\te.setAttribute(\"nonce\", nonce)\n\t\t}\n\t\telement.appendChild(e);\n\t\treturn e.sheet as CSSStyleSheet;\n\t}\n}\n\n/**\n * [makeStylesheet description]\n *\n * @ignore Exclude from docs\n * @todo Description\n * @param selector [description]\n * @return [description]\n */\nfunction appendStylesheet(root: CSSStyleSheet, selector: string): CSSStyleRule {\n\tconst index = root.cssRules.length;\n\n\troot.insertRule(selector + \"{}\", index);\n\n\treturn root.cssRules[index] as CSSStyleRule;\n}\n\n/**\n * Defines a class for a CSS rule.\n *\n * Can be used to dynamically add CSS to the document.\n */\nexport class StyleRule extends Disposer {\n\n\t/**\n\t * CSS rule.\n\t */\n\tprivate _rule: CSSStyleRule;\n\n\t/**\n\t * A CSS selector text.\n\t *\n\t * E.g.: `.myClass p`\n\t *\n\t * @param selector CSS selector\n\t */\n\tpublic set selector(selector: string) {\n\t\tthis._rule.selectorText = selector;\n\t}\n\n\t/**\n\t * @return CSS selector\n\t */\n\tpublic get selector(): string {\n\t\treturn this._rule.selectorText;\n\t}\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param selector CSS selector\n\t * @param styles An object of style attribute - value pairs\n\t */\n\tconstructor(element: ShadowRoot | null, selector: string, styles: { [name: string]: string }, nonce: string = \"\") {\n\t\tconst root = getStylesheet(element, nonce);\n\n\t\t// TODO test this\n\t\tsuper(() => {\n\t\t\t// TODO a bit hacky\n\t\t\tconst index = $array.indexOf(root.cssRules, this._rule);\n\n\t\t\tif (index === -1) {\n\t\t\t\tthrow new Error(\"Could not dispose StyleRule\");\n\n\t\t\t} else {\n\t\t\t\t// TODO if it's empty remove it from the DOM ?\n\t\t\t\troot.deleteRule(index);\n\t\t\t}\n\t\t});\n\n\t\tthis._rule = appendStylesheet(root, selector);\n\n\t\t$object.each(styles, (key, value) => {\n\t\t\tthis.setStyle(key, value);\n\t\t});\n\t}\n\n\t/**\n\t * Sets the same style properties with browser-specific prefixes.\n\t *\n\t * @param name Attribute name\n\t * @param value Attribute value\n\t */\n\tprivate _setVendorPrefixName(name: string, value: string): void {\n\t\tconst style = this._rule.style;\n\t\tstyle.setProperty(\"-webkit-\" + name, value, \"\");\n\t\tstyle.setProperty(\"-moz-\" + name, value, \"\");\n\t\tstyle.setProperty(\"-ms-\" + name, value, \"\");\n\t\tstyle.setProperty(\"-o-\" + name, value, \"\");\n\t\tstyle.setProperty(name, value, \"\");\n\t}\n\n\t/**\n\t * Sets a value for specific style attribute.\n\t *\n\t * @param name Attribute\n\t * @param value Value\n\t */\n\tpublic setStyle(name: string, value: string): void {\n\t\tif (name === \"transition\") {\n\t\t\tthis._setVendorPrefixName(name, value);\n\n\t\t} else {\n\t\t\tthis._rule.style.setProperty(name, value, \"\");\n\t\t}\n\t}\n\n}\n\n// /**\n// * Applies a set of styles to an element. Stores the original styles so they\n// * can be restored later.\n// *\n// * @ignore\n// * @param io Element\n// */\n// export function prepElementForDrag(dom: HTMLElement): void {\n\n// \t// @todo: save current values\n\n// \t// Define possible props\n// \tlet props = [\n// \t\t\"touchAction\", \"webkitTouchAction\", \"MozTouchAction\", \"MSTouchAction\", \"msTouchAction\", \"oTouchAction\",\n// \t\t\"userSelect\", \"webkitUserSelect\", \"MozUserSelect\", \"MSUserSelect\", \"msUserSelect\", \"oUserSelect\",\n// \t\t\"touchSelect\", \"webkitTouchSelect\", \"MozTouchSelect\", \"MSTouchSelect\", \"msTouchSelect\", \"oTouchSelect\",\n// \t\t\"touchCallout\", \"webkitTouchCallout\", \"MozTouchCallout\", \"MSTouchCallout\", \"msTouchCallout\", \"oTouchCallout\",\n// \t\t\"contentZooming\", \"webkitContentZooming\", \"MozContentZooming\", \"MSContentZooming\", \"msContentZooming\", \"oContentZooming\",\n// \t\t\"userDrag\", \"webkitUserDrag\", \"MozUserDrag\", \"MSUserDrag\", \"msUserDrag\", \"oUserDrag\"\n// \t];\n// \tfor (let i = 0; i < props.length; i++) {\n// \t\tif (props[i] in dom.style) {\n// \t\t\tsetStyle(dom, props[i], \"none\");\n// \t\t}\n// \t}\n\n// \t// Remove iOS-specific selection;\n// \tsetStyle(dom, \"tapHighlightColor\", \"rgba(0, 0, 0, 0)\");\n\n// }\n\n// /**\n// * Restores replaced styles\n// *\n// * @ignore\n// * @param io Element\n// */\n// export function unprepElementForDrag(dom: HTMLElement): void {\n\n// \t// Define possible props\n// \tlet props = [\n// \t\t\"touchAction\", \"webkitTouchAction\", \"MozTouchAction\", \"MSTouchAction\", \"msTouchAction\", \"oTouchAction\",\n// \t\t\"userSelect\", \"webkitUserSelect\", \"MozUserSelect\", \"MSUserSelect\", \"msUserSelect\", \"oUserSelect\",\n// \t\t\"touchSelect\", \"webkitTouchSelect\", \"MozTouchSelect\", \"MSTouchSelect\", \"msTouchSelect\", \"oTouchSelect\",\n// \t\t\"touchCallout\", \"webkitTouchCallout\", \"MozTouchCallout\", \"MSTouchCallout\", \"msTouchCallout\", \"oTouchCallout\",\n// \t\t\"contentZooming\", \"webkitContentZooming\", \"MozContentZooming\", \"MSContentZooming\", \"msContentZooming\", \"oContentZooming\",\n// \t\t\"userDrag\", \"webkitUserDrag\", \"MozUserDrag\", \"MSUserDrag\", \"msUserDrag\", \"oUserDrag\"\n// \t];\n// \tfor (let i = 0; i < props.length; i++) {\n// \t\tif (props[i] in dom.style) {\n// \t\t\tsetStyle(dom, props[i], \"\");\n// \t\t}\n// \t}\n\n// \t// Remove iOS-specific selection;\n// \tsetStyle(dom, \"tapHighlightColor\", \"\");\n\n// }\n\n\n\nexport function relativeToValue(percent: number | Percent | undefined | null, full: number): number {\n\tif ($type.isNumber(percent)) {\n\t\treturn percent;\n\t} else if (percent != null && $type.isNumber(percent.value) && $type.isNumber(full)) {\n\t\treturn full * percent.value;\n\n\t} else {\n\t\treturn 0;\n\t}\n}\n\n\n\n/**\n * Returns number of decimals\n *\n * @ignore Exclude from docs\n * @param number Input number\n * @return Number of decimals\n */\nexport function decimalPlaces(number: number): number {\n\tlet match = ('' + number).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\tif (!match) { return 0; }\n\treturn Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0));\n}\n\n\n/**\n * ============================================================================\n * STRING FORMATTING FUNCTIONS\n * ============================================================================\n * @hidden\n */\n\n/**\n * Pads a string with additional characters to certain length.\n *\n * @param value A numeric value\n * @param len Result string length in characters\n * @param char A character to use for padding\n * @return Padded value as string\n */\nexport function padString(value: any, len: number = 0, char: string = \"0\"): string {\n\tif (typeof value !== \"string\") {\n\t\tvalue = value.toString();\n\t}\n\n\treturn len > value.length ? Array(len - value.length + 1).join(char) + value : value;\n}\n\nexport function trimLeft(text: string): string {\n\treturn text.replace(/^[\\n \\t]+/, \"\");\n}\n\nexport function trimRight(text: string): string {\n\treturn text.replace(/^[\\n \\t]+$/, \"\");\n}\n\nexport function trim(text: string): string {\n\treturn trimLeft(trimRight(text));\n}\n\n/**\n * Tries to determine format type.\n *\n * @ignore Exclude from docs\n * @param format Format string\n * @return Format type (\"string\" | \"number\" | \"date\" | \"duration\")\n */\nexport function getFormat(format: string): string {\n\n\t// Undefined?\n\tif (typeof format === \"undefined\") {\n\t\treturn \"string\";\n\t}\n\n\t// Cleanup and lowercase format\n\tformat = format.toLowerCase().replace(/^\\[[^\\]]*\\]/, \"\");\n\n\t// Remove style tags\n\tformat = format.replace(/\\[[^\\]]+\\]/, \"\");\n\n\t// Trim\n\tformat = format.trim();\n\n\t// Check for any explicit format hints (i.e. /Date)\n\tlet hints: RegExpMatchArray | null = format.match(/\\/(date|number|duration)$/);\n\n\tif (hints) {\n\t\treturn hints[1];\n\t}\n\n\t// Check for explicit hints\n\tif (format === \"number\") {\n\t\treturn \"number\";\n\t}\n\n\tif (format === \"date\") {\n\t\treturn \"date\";\n\t}\n\n\tif (format === \"duration\") {\n\t\treturn \"duration\";\n\t}\n\n\t// Detect number formatting symbols\n\tif (format.match(/[#0]/)) {\n\t\treturn \"number\";\n\t}\n\n\t// Detect date formatting symbols\n\tif (format.match(/[ymwdhnsqaxkzgtei]/)) {\n\t\treturn \"date\";\n\t}\n\n\t// Nothing? Let's display as string\n\treturn \"string\";\n}\n\n/**\n * Cleans up format:\n * * Strips out formatter hints\n *\n * @ignore Exclude from docs\n * @param format Format\n * @return Cleaned format\n */\nexport function cleanFormat(format: string): string {\n\treturn format.replace(/\\/(date|number|duration)$/i, \"\");\n}\n\n/**\n * Strips all tags from the string.\n *\n * @param text Source string\n * @return String without tags\n */\nexport function stripTags(text: string): string {\n\treturn text ? text.replace(/<[^>]*>/g, \"\") : text;\n}\n\n/**\n * Removes new lines and tags from a string.\n *\n * @param text String to conver\n * @return Converted string\n */\nexport function plainText(text: string): string {\n\treturn text ? stripTags((\"\" + text).replace(/[\\n\\r]+/g, \". \")) : text;\n}\n\n/**\n * Escapes string so it can safely be used in a Regex.\n *\n * @param value Unsescaped string\n * @return Escaped string\n */\nexport function escapeForRgex(value: string): string {\n\treturn value.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n/**\n * ============================================================================\n * DATE-RELATED FUNCTIONS\n * ============================================================================\n * @hidden\n */\n\n/**\n * Returns a year day.\n *\n * @param date Date\n * @param utc Assume UTC dates?\n * @return Year day\n * @todo Account for UTC\n */\nexport function getYearDay(date: Date, utc: boolean = false): number {\n\t// TODO: utc needed?\n\tutc;\n\tconst start = new Date(date.getFullYear(), 0, 0);\n\tconst diff = (date.getTime() - start.getTime()) + ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000);\n\tconst oneDay = 1000 * 60 * 60 * 24;\n\treturn Math.floor(diff / oneDay);\n}\n\n/**\n * Returns week number for a given date.\n *\n * @param date Date\n * @param utc Assume UTC dates?\n * @return Week number\n * @todo Account for UTC\n */\nexport function getWeek(date: Date, utc: boolean = false): number {\n\tconst day = getYearDay(date, utc) - 1;\n\tlet week = Math.floor((day - (date.getDay() || 7) + 10) / 7);\n\tif (week === 0) {\n\t\tweek = 53;\n\t}\n\telse if (week === 53) {\n\t\tweek = 1;\n\t}\n\treturn week;\n}\n\n/**\n * Returns a week number in the month.\n *\n * @param date Source Date\n * @param utc Assume UTC dates?\n * @return Week number in month\n */\nexport function getMonthWeek(date: Date, utc: boolean = false): number {\n\tconst firstWeek = getWeek(new Date(date.getFullYear(), date.getMonth(), 1), utc);\n\tlet currentWeek = getWeek(date, utc);\n\tif (currentWeek == 1) {\n\t\tcurrentWeek = 53;\n\t}\n\treturn currentWeek - firstWeek + 1;\n}\n\n/**\n * Returns a year day out of the given week number.\n *\n * @param week Week\n * @param year Year\n * @param weekday Weekday\n * @param utc Assume UTC dates\n * @return Day in a year\n */\nexport function getDayFromWeek(week: number, year: number, weekday: number = 1, utc: boolean = false): number {\n\tlet date = new Date(year, 0, 4, 0, 0, 0, 0);\n\tif (utc) {\n\t\tdate.setUTCFullYear(year);\n\t}\n\tlet day = week * 7 + weekday - ((date.getDay() || 7) + 3);\n\treturn day;\n}\n\n/**\n * Returns 12-hour representation out of the 24-hour hours.\n *\n * @param hours 24-hour number\n * @return 12-hour number\n */\nexport function get12Hours(hours: number, base?: number): number {\n\tif (hours > 12) {\n\t\thours -= 12;\n\t}\n\telse if (hours === 0) {\n\t\thours = 12;\n\t}\n\treturn base != null ? hours + (base - 1) : hours;\n}\n\n/**\n * Returns a string name of the tome zone.\n *\n * @param date Date object\n * @param long Should return long (\"Pacific Standard Time\") or short abbreviation (\"PST\")\n * @param savings Include information if it's in daylight savings mode\n * @param utc Assume UTC dates\n * @return Time zone name\n */\nexport function getTimeZone(date: Date, long: boolean = false, savings: boolean = false, utc: boolean = false): string {\n\tif (utc) {\n\t\treturn long ? \"Coordinated Universal Time\" : \"UTC\";\n\t}\n\tlet wotz = date.toLocaleString(\"UTC\");\n\tlet wtz = date.toLocaleString(\"UTC\", { timeZoneName: long ? \"long\" : \"short\" }).substr(wotz.length);\n\t//wtz = wtz.replace(/[+-]+[0-9]+$/, \"\");\n\tif (savings === false) {\n\t\twtz = wtz.replace(/ (standard|daylight|summer|winter) /i, \" \");\n\t}\n\treturn wtz;\n}\n\n\nexport function capitalizeFirst(text: string): string {\n\treturn text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n\n/**\n * ============================================================================\n * COLOR UTILS\n * ============================================================================\n */\n\n\n/**\n * Represents an interface for an object that represents an RGB color.\n */\nexport interface iRGB {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta?: number;\n}\n\n/**\n * Represents an interface for an object that represents an HSL color.\n */\nexport interface iHSL {\n\th: number;\n\ts: number;\n\tl: number;\n\ta?: number;\n}\n\n/**\n * The functions below are taken and adapted from Garry Tan's blog post:\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n *\n * The further attributions go mjijackson.com, which now seems to be defunct.\n */\n\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * Function adapted from:\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n *\n * @ignore Exclude from docs\n * @param h The hue\n * @param s The saturation\n * @param l The lightness\n * @return The RGB representation\n */\nexport function hslToRgb(color: iHSL): iRGB {\n\tlet r, g, b;\n\tlet h = color.h;\n\tlet s = color.s;\n\tlet l = color.l;\n\n\tif (s == 0) {\n\t\tr = g = b = l; // achromatic\n\t} else {\n\t\tlet hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n\t\t\tif (t < 0) { t += 1; }\n\t\t\tif (t > 1) { t -= 1; }\n\t\t\tif (t < 1 / 6) { return p + (q - p) * 6 * t; }\n\t\t\tif (t < 1 / 2) { return q; }\n\t\t\tif (t < 2 / 3) { return p + (q - p) * (2 / 3 - t) * 6; }\n\t\t\treturn p;\n\t\t}\n\n\t\tlet q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\tlet p = 2 * l - q;\n\t\tr = hue2rgb(p, q, h + 1 / 3);\n\t\tg = hue2rgb(p, q, h);\n\t\tb = hue2rgb(p, q, h - 1 / 3);\n\t}\n\n\treturn {\n\t\tr: Math.round(r * 255),\n\t\tg: Math.round(g * 255),\n\t\tb: Math.round(b * 255)\n\t};\n}\n\n/**\n * Converts an RGB color value to HSL. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and l in the set [0, 1].\n *\n * Function adapted from:\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n *\n * @ignore Exclude from docs\n * @param r The red color value\n * @param g The green color value\n * @param b The blue color value\n * @return The HSL representation\n */\nexport function rgbToHsl(color: iRGB): iHSL {\n\tlet r = color.r / 255;\n\tlet g = color.g / 255;\n\tlet b = color.b / 255;\n\tlet max = Math.max(r, g, b);\n\tlet min = Math.min(r, g, b);\n\tlet h = 0;\n\tlet s = 0;\n\tlet l = (max + min) / 2;\n\n\tif (max === min) {\n\t\th = s = 0; // achromatic\n\n\t} else {\n\t\tlet d = max - min;\n\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n\t\tswitch (max) {\n\t\t\tcase r: h = (g - b) / d + (g < b ? 6 : 0); break;\n\t\t\tcase g: h = (b - r) / d + 2; break;\n\t\t\tcase b: h = (r - g) / d + 4; break;\n\t\t}\n\n\t\th /= 6;\n\t}\n\n\treturn {\n\t\th: h,\n\t\ts: s,\n\t\tl: l\n\t};\n}\n\n/**\n * Returns a color that is `percent` brighter than the reference color.\n *\n * @ignore Exclude from docs\n * @param color Reference color\n * @param percent Brightness percent\n * @return Hex code of the new color\n */\nexport function lighten(rgb: $type.Optional, percent: number): $type.Optional {\n\tif (rgb) {\n\t\treturn {\n\t\t\tr: Math.max(0, Math.min(255, rgb.r + getLightnessStep(rgb.r, percent))),\n\t\t\tg: Math.max(0, Math.min(255, rgb.g + getLightnessStep(rgb.g, percent))),\n\t\t\tb: Math.max(0, Math.min(255, rgb.b + getLightnessStep(rgb.b, percent))),\n\t\t\ta: rgb.a\n\t\t};\n\n\t} else {\n\t\t// TODO is this correct ?\n\t\treturn rgb;\n\t}\n};\n\n/**\n * Gets lightness step.\n *\n * @ignore Exclude from docs\n * @param value Value\n * @param percent Percent\n * @return Step\n */\nexport function getLightnessStep(value: number, percent: number): number {\n\tlet base = percent > 0 ? 255 - value : value;\n\treturn Math.round(base * percent);\n}\n\n/**\n * Returns a color that is `percent` brighter than the source `color`.\n *\n * @ignore Exclude from docs\n * @param color Source color\n * @param percent Brightness percent\n * @return New color\n */\nexport function brighten(rgb: $type.Optional, percent: number): $type.Optional {\n\tif (rgb) {\n\t\tlet base = Math.min(Math.max(rgb.r, rgb.g, rgb.b), 230);\n\t\t//let base = Math.max(rgb.r, rgb.g, rgb.b);\n\t\tlet step = getLightnessStep(base, percent);\n\t\treturn {\n\t\t\tr: Math.max(0, Math.min(255, Math.round(rgb.r + step))),\n\t\t\tg: Math.max(0, Math.min(255, Math.round(rgb.g + step))),\n\t\t\tb: Math.max(0, Math.min(255, Math.round(rgb.b + step))),\n\t\t\ta: rgb.a\n\t\t};\n\n\t} else {\n\t\t// TODO is this correct ?\n\t\treturn rgb;\n\t}\n};\n\n/**\n * Returns brightness step.\n *\n * @ignore Exclude from docs\n * @param value Value\n * @param percent Percent\n * @return Step\n */\nexport function getBrightnessStep(_value: number, percent: number): number {\n\tlet base = 255; //percent > 0 ? 255 - value : value;\n\treturn Math.round(base * percent);\n}\n\n/**\n * Returns `true` if color is \"light\". Useful indetermining which contrasting\n * color to use for elements over this color. E.g.: you would want to use\n * black text over light background, and vice versa.\n *\n * @ignore Exclude from docs\n * @param color Source color\n * @return Light?\n */\nexport function isLight(color: iRGB): boolean {\n\treturn ((color.r * 299) + (color.g * 587) + (color.b * 114)) / 1000 >= 128;\n}\n\n/**\n * Returns a new [[iRGB]] object based on `rgb` parameter with specific\n * saturation applied.\n *\n * `saturation` can be in the range of 0 (fully desaturated) to 1 (fully\n * saturated).\n *\n * @ignore Exclude from docs\n * @param color Base color\n * @param saturation Saturation (0-1)\n * @return New color\n */\nexport function saturate(rgb: $type.Optional, saturation: number): $type.Optional {\n\tif (rgb === undefined || saturation == 1) {\n\t\treturn rgb;\n\t}\n\n\tlet hsl = rgbToHsl(rgb);\n\thsl.s = saturation;\n\treturn hslToRgb(hsl);\n}\n\nexport function alternativeColor(color: iRGB, lightAlternative: iRGB = { r: 255, g: 255, b: 255 }, darkAlternative: iRGB = { r: 255, g: 255, b: 255 }): iRGB {\n\tlet light = lightAlternative;\n\tlet dark = darkAlternative;\n\tif (isLight(darkAlternative)) {\n\t\tlight = darkAlternative;\n\t\tdark = lightAlternative;\n\t}\n\treturn isLight(color) ? dark : light;\n}\n\n/**\n * @ignore\n * @deprecated\n */\n// export function unshiftThemeClass(settings: any, themeClass: string) {\n// \tlet themeClasses = settings.themeClasses;\n// \tif (!themeClasses) {\n// \t\tthemeClasses = [];\n// \t}\n// \tthemeClasses.unshift(themeClass);\n// \tsettings.themeClasses = themeClasses;\n// }\n\n/**\n * @ignore\n * @deprecated\n */\n// export function pushThemeClass(settings: any, themeClass: string) {\n// \tlet themeClasses = settings.themeClasses;\n// \tif (!themeClasses) {\n// \t\tthemeClasses = [];\n// \t}\n// \tthemeClasses.push(themeClass);\n// \tsettings.themeClasses = themeClasses;\n// }\n\n/**\n * @ignore\n */\nexport function mergeTags(tags1: string[] | undefined, tags2: string[]): string[] {\n\tif (!tags1) {\n\t\ttags1 = [];\n\t}\n\treturn [...tags1, ...tags2].filter((value, index, self) => {\n\t\treturn self.indexOf(value) === index;\n\t});\n}\n\n/**\n * @ignore\n */\nexport function sameBounds(a: IBounds, b?: IBounds): boolean {\n\tif (!b) {\n\t\treturn false;\n\t}\n\tif (a.left != b.left) {\n\t\treturn false\n\t}\n\tif (a.right != b.right) {\n\t\treturn false\n\t}\n\tif (a.top != b.top) {\n\t\treturn false\n\t}\n\tif (a.bottom != b.bottom) {\n\t\treturn false\n\t}\n\treturn true;\n}","import type { InterfaceColors, IInterfaceColorsSettings } from \"../core/util/InterfaceColors\";\n\nimport { Theme } from \"../core/Theme\";\nimport { p100, p50 } from \"../core/util/Percent\";\nimport { Color } from \"../core/util/Color\";\nimport { GridLayout } from \"../core/render/GridLayout\"\n\nimport * as $ease from \"../core/util/Ease\";\n\n\ninterface Settable {\n\t_settings: A;\n\tset(key: K, value: A[K]): void;\n}\n\n/**\n * @ignore\n */\nexport function setColor(rule: Settable, key: K, ic: InterfaceColors, name: keyof IInterfaceColorsSettings) {\n\t// TODO this shouldn't use get, figure out a better way\n\trule.set(key, ic.get(name) as any);\n\n\tic.on(name, (value) => {\n\t\trule.set(key, value as any);\n\t});\n}\n\n/**\n * @ignore\n */\nexport class DefaultTheme extends Theme {\n\tprotected setupDefaultRules() {\n\t\tsuper.setupDefaultRules();\n\n\t\tconst language = this._root.language;\n\n\t\tconst ic = this._root.interfaceColors;\n\n\t\tconst horizontalLayout = this._root.horizontalLayout;\n\t\tconst verticalLayout = this._root.verticalLayout;\n\n\t\tconst r = this.rule.bind(this);\n\n\n\t\t/**\n\t\t * ========================================================================\n\t\t * core\n\t\t * ========================================================================\n\t\t */\n\n\t\tr(\"InterfaceColors\").setAll({\n\t\t\tstroke: Color.fromHex(0xe5e5e5),\n\t\t\tfill: Color.fromHex(0xf3f3f3),\n\t\t\tprimaryButton: Color.fromHex(0x6794dc),\n\t\t\tprimaryButtonHover: Color.fromHex(0x6771dc),\n\t\t\tprimaryButtonDown: Color.fromHex(0x68dc76),\n\t\t\tprimaryButtonActive: Color.fromHex(0x68dc76),\n\t\t\tprimaryButtonText: Color.fromHex(0xffffff),\n\t\t\tprimaryButtonStroke: Color.fromHex(0xffffff),\n\t\t\tsecondaryButton: Color.fromHex(0xd9d9d9),\n\t\t\tsecondaryButtonHover: Color.fromHex(0xa3a3a3),\n\t\t\tsecondaryButtonDown: Color.fromHex(0x8d8d8d),\n\t\t\tsecondaryButtonActive: Color.fromHex(0xe6e6e6),\n\t\t\tsecondaryButtonText: Color.fromHex(0x000000),\n\t\t\tsecondaryButtonStroke: Color.fromHex(0xffffff),\n\t\t\tgrid: Color.fromHex(0x000000),\n\t\t\tbackground: Color.fromHex(0xffffff),\n\t\t\talternativeBackground: Color.fromHex(0x000000),\n\t\t\ttext: Color.fromHex(0x000000),\n\t\t\talternativeText: Color.fromHex(0xffffff),\n\t\t\tdisabled: Color.fromHex(0xadadad),\n\t\t\tpositive: Color.fromHex(0x50b300),\n\t\t\tnegative: Color.fromHex(0xb30000)\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"ColorSet\");\n\n\t\t\trule.setAll({\n\t\t\t\tpassOptions: {\n\t\t\t\t\thue: 0.05,\n\t\t\t\t\tsaturation: 0,\n\t\t\t\t\tlightness: 0\n\t\t\t\t},\n\t\t\t\tcolors: [\n\t\t\t\t\tColor.fromHex(0x67b7dc)\n\t\t\t\t],\n\t\t\t\tstep: 1,\n\t\t\t\t//baseColor: Color.fromRGB(103, 183, 220),\n\t\t\t\t//count: 20,\n\t\t\t\treuse: false,\n\t\t\t\tstartIndex: 0\n\t\t\t});\n\n\t\t\trule.setPrivate(\"currentStep\", 0);\n\t\t\trule.setPrivate(\"currentPass\", 0);\n\t\t}\n\n\t\tr(\"Entity\").setAll({\n\t\t\tstateAnimationDuration: 0,\n\t\t\tstateAnimationEasing: $ease.out($ease.cubic)\n\t\t});\n\n\t\tr(\"Component\").setAll({\n\t\t\tinterpolationDuration: 0,\n\t\t\tinterpolationEasing: $ease.out($ease.cubic)\n\t\t});\n\n\t\tr(\"Sprite\").setAll({\n\t\t\tvisible: true,\n\t\t\tscale: 1,\n\t\t\topacity: 1,\n\t\t\trotation: 0,\n\t\t\tposition: \"relative\",\n\t\t\ttooltipX: p50,\n\t\t\ttooltipY: p50,\n\t\t\ttooltipPosition: \"fixed\",\n\t\t\tisMeasured: true\n\t\t});\n\n\t\tr(\"Sprite\").states.create(\"default\", { \"visible\": true, opacity: 1 });\n\n\t\tr(\"Container\").setAll({\n\t\t\tinteractiveChildren: true,\n\t\t\tsetStateOnChildren: false\n\t\t});\n\n\t\tr(\"Graphics\").setAll({\n\t\t\tstrokeWidth: 1\n\t\t});\n\n\n\t\tr(\"Chart\").setAll({\n\t\t\twidth: p100,\n\t\t\theight: p100\n\t\t});\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: alignment\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Sprite\", [\"horizontal\", \"center\"]).setAll({\n\t\t\tcenterX: p50,\n\t\t\tx: p50\n\t\t});\n\n\t\tr(\"Sprite\", [\"vertical\", \"center\"]).setAll({\n\t\t\tcenterY: p50,\n\t\t\ty: p50\n\t\t});\n\n\t\tr(\"Container\", [\"horizontal\", \"layout\"]).setAll({\n\t\t\tlayout: horizontalLayout\n\t\t});\n\n\t\tr(\"Container\", [\"vertical\", \"layout\"]).setAll({\n\t\t\tlayout: verticalLayout\n\t\t});\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: patterns\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Pattern\").setAll({\n\t\t\trepetition: \"repeat\",\n\t\t\twidth: 50,\n\t\t\theight: 50,\n\t\t\trotation: 0,\n\t\t\tfillOpacity: 1\n\t\t});\n\n\t\tr(\"LinePattern\").setAll({\n\t\t\tgap: 6,\n\t\t\tcolorOpacity: 1,\n\t\t\twidth: 49,\n\t\t\theight: 49\n\t\t});\n\n\t\tr(\"RectanglePattern\").setAll({\n\t\t\tgap: 6,\n\t\t\tcheckered: false,\n\t\t\tcentered: true,\n\t\t\tmaxWidth: 5,\n\t\t\tmaxHeight: 5,\n\t\t\twidth: 48,\n\t\t\theight: 48,\n\t\t\tstrokeWidth: 0\n\t\t});\n\n\t\tr(\"CirclePattern\").setAll({\n\t\t\tgap: 5,\n\t\t\tcheckered: false,\n\t\t\tcentered: false,\n\t\t\tradius: 3,\n\t\t\tstrokeWidth: 0,\n\t\t\twidth: 45,\n\t\t\theight: 45\n\t\t});\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: gradients\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"LinearGradient\").setAll({\n\t\t\trotation: 90\n\t\t});\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: Legend\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Legend\").setAll({\n\t\t\tfillField: \"fill\",\n\t\t\tstrokeField: \"stroke\",\n\t\t\tnameField: \"name\",\n\t\t\tlayout: GridLayout.new(this._root, {}),\n\t\t\tlayer: 30,\n\t\t\tclickTarget: \"itemContainer\"\n\t\t});\n\n\t\t// Class: Container\n\t\tr(\"Container\", [\"legend\", \"item\", \"itemcontainer\"]).setAll({\n\t\t\tpaddingLeft: 5,\n\t\t\tpaddingRight: 5,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingTop: 5,\n\t\t\tlayout: horizontalLayout,\n\t\t\tsetStateOnChildren: true,\n\t\t\tinteractiveChildren: false,\n\t\t\tariaChecked: true,\n\t\t\tfocusable: true,\n\t\t\tariaLabel: language.translate(\"Press ENTER to toggle\")\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"Rectangle\", [\"legend\", \"item\", \"background\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tfillOpacity: 0,\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"background\");\n\t\t}\n\n\t\tr(\"Container\", [\"legend\", \"marker\"]).setAll({\n\t\t\tsetStateOnChildren: true,\n\t\t\tcenterY: p50,\n\t\t\tpaddingLeft: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingTop: 0,\n\t\t\twidth: 18,\n\t\t\theight: 18\n\t\t});\n\n\t\tr(\"RoundedRectangle\", [\"legend\", \"marker\", \"rectangle\"]).setAll({\n\t\t\twidth: p100,\n\t\t\theight: p100,\n\t\t\tcornerRadiusBL: 3,\n\t\t\tcornerRadiusTL: 3,\n\t\t\tcornerRadiusBR: 3,\n\t\t\tcornerRadiusTR: 3\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"legend\", \"marker\", \"rectangle\"]).states.create(\"disabled\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"disabled\");\n\t\t\tsetColor(rule, \"stroke\", ic, \"disabled\");\n\t\t}\n\n\t\tr(\"Label\", [\"legend\", \"label\"]).setAll({\n\t\t\tcenterY: p50,\n\t\t\tmarginLeft: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpopulateText: true\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"Label\", [\"legend\", \"label\"]).states.create(\"disabled\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"disabled\");\n\t\t}\n\n\t\tr(\"Label\", [\"legend\", \"value\", \"label\"]).setAll({\n\t\t\tcenterY: p50,\n\t\t\tmarginLeft: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\twidth: 50,\n\t\t\tcenterX: p100,\n\t\t\tpopulateText: true\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"Label\", [\"legend\", \"value\", \"label\"]).states.create(\"disabled\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"disabled\");\n\t\t}\n\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: HeatLegend\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"HeatLegend\").setAll({\n\t\t\tstepCount: 1\n\t\t});\n\n\t\tr(\"RoundedRectangle\", [\"heatlegend\", \"marker\"]).setAll({\n\t\t\tcornerRadiusTR: 0,\n\t\t\tcornerRadiusBR: 0,\n\t\t\tcornerRadiusTL: 0,\n\t\t\tcornerRadiusBL: 0\n\t\t});\n\n\t\tr(\"RoundedRectangle\", [\"vertical\", \"heatlegend\", \"marker\"]).setAll({\n\t\t\theight: p100,\n\t\t\twidth: 15\n\t\t});\n\n\t\tr(\"RoundedRectangle\", [\"horizontal\", \"heatlegend\", \"marker\"]).setAll({\n\t\t\twidth: p100,\n\t\t\theight: 15\n\t\t});\n\n\t\tr(\"HeatLegend\", [\"vertical\"]).setAll({\n\t\t\theight: p100\n\t\t});\n\n\t\tr(\"HeatLegend\", [\"horizontal\"]).setAll({\n\t\t\twidth: p100\n\t\t});\n\n\t\tr(\"Label\", [\"heatlegend\", \"start\"]).setAll({\n\t\t\tpaddingLeft: 5,\n\t\t\tpaddingRight: 5,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingBottom: 5\n\t\t});\n\n\t\tr(\"Label\", [\"heatlegend\", \"end\"]).setAll({\n\t\t\tpaddingLeft: 5,\n\t\t\tpaddingRight: 5,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingBottom: 5\n\t\t});\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: Labels\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\t{\n\t\t\tconst rule = r(\"Label\");\n\n\t\t\trule.setAll({\n\t\t\t\tpaddingTop: 8,\n\t\t\t\tpaddingBottom: 8,\n\t\t\t\tpaddingLeft: 10,\n\t\t\t\tpaddingRight: 10,\n\t\t\t\tfontFamily: \"-apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, Helvetica, Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\"\",\n\t\t\t\tfontSize: \"1em\",\n\t\t\t\tpopulateText: false\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"text\");\n\t\t}\n\n\t\tr(\"RadialLabel\").setAll({\n\t\t\ttextType: \"regular\",\n\t\t\tcenterY: p50,\n\t\t\tcenterX: p50,\n\t\t\tinside: false,\n\t\t\tradius: 0,\n\t\t\tbaseRadius: p100,\n\t\t\torientation: \"auto\",\n\t\t\ttextAlign: \"center\"\n\t\t});\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: Elements and shapes\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"RoundedRectangle\").setAll({\n\t\t\tcornerRadiusTL: 8,\n\t\t\tcornerRadiusBL: 8,\n\t\t\tcornerRadiusTR: 8,\n\t\t\tcornerRadiusBR: 8\n\t\t});\n\n\t\tr(\"PointedRectangle\").setAll({\n\t\t\tpointerBaseWidth: 15,\n\t\t\tpointerLength: 10,\n\t\t\tcornerRadius: 8\n\t\t});\n\n\t\tr(\"Slice\").setAll({\n\t\t\tshiftRadius: 0,\n\t\t\tdRadius: 0,\n\t\t\tdInnerRadius: 0\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"Tick\");\n\n\t\t\trule.setAll({\n\t\t\t\tstrokeOpacity: .15,\n\t\t\t\tisMeasured: false,\n\t\t\t\tlength: 5,\n\t\t\t\tposition: \"absolute\"\n\t\t\t});\n\n\t\t\tsetColor(rule, \"stroke\", ic, \"grid\");\n\t\t}\n\n\t\tr(\"Bullet\").setAll({\n\t\t\tlocationX: 0.5,\n\t\t\tlocationY: 0.5\n\t\t});\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: Tooltip\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Tooltip\").setAll({\n\t\t\tposition: \"absolute\",\n\t\t\tgetFillFromSprite: true,\n\t\t\tgetStrokeFromSprite: false,\n\t\t\tautoTextColor: true,\n\t\t\tpaddingTop: 9,\n\t\t\tpaddingBottom: 8,\n\t\t\tpaddingLeft: 10,\n\t\t\tpaddingRight: 10,\n\t\t\tmarginBottom: 5,\n\t\t\tpointerOrientation: \"vertical\",\n\t\t\tcenterX: p50,\n\t\t\tcenterY: p50,\n\t\t\tanimationEasing: $ease.out($ease.cubic),\n\t\t\texportable: false\n\t\t\t//layer: 100\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"PointedRectangle\", [\"tooltip\", \"background\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tstrokeOpacity: 0.9,\n\t\t\t\tcornerRadius: 4,\n\t\t\t\tpointerLength: 4,\n\t\t\t\tpointerBaseWidth: 8,\n\t\t\t\tfillOpacity: 0.9,\n\t\t\t\tstroke: Color.fromHex(0xffffff)\n\t\t\t});\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Label\", [\"tooltip\"]);\n\n\t\t\trule.setAll({\n\t\t\t\trole: \"tooltip\",\n\t\t\t\tpopulateText: true,\n\t\t\t\tpaddingRight: 0,\n\t\t\t\tpaddingTop: 0,\n\t\t\t\tpaddingLeft: 0,\n\t\t\t\tpaddingBottom: 0\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"alternativeText\");\n\t\t}\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: Button\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Button\").setAll({\n\t\t\tpaddingTop: 8,\n\t\t\tpaddingBottom: 8,\n\t\t\tpaddingLeft: 10,\n\t\t\tpaddingRight: 10,\n\t\t\tinteractive: true,\n\t\t\tlayout: horizontalLayout,\n\t\t\tinteractiveChildren: false,\n\t\t\tsetStateOnChildren: true,\n\t\t\tfocusable: true\n\t\t});\n\n\t\tr(\"Button\").states.create(\"hover\", {});\n\t\tr(\"Button\").states.create(\"down\", { stateAnimationDuration: 0 });\n\t\tr(\"Button\").states.create(\"active\", {});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"button\", \"background\"]);\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButton\");\n\t\t\tsetColor(rule, \"stroke\", ic, \"primaryButtonStroke\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"button\", \"background\"]).states.create(\"hover\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonHover\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"button\", \"background\"]).states.create(\"down\", { stateAnimationDuration: 0 });\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonDown\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"button\", \"background\"]).states.create(\"active\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonActive\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Graphics\", [\"button\", \"icon\"]);\n\t\t\tsetColor(rule, \"stroke\", ic, \"primaryButtonText\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Label\", [\"button\"]);\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonText\");\n\t\t}\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * charts/xy: ZoomOutButton\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Button\", [\"zoom\"]).setAll({\n\t\t\tpaddingTop: 18,\n\t\t\tpaddingBottom: 18,\n\t\t\tpaddingLeft: 12,\n\t\t\tpaddingRight: 12,\n\t\t\tcenterX: 46,\n\t\t\tcenterY: -10,\n\t\t\ty: 0,\n\t\t\tx: p100,\n\t\t\trole: \"button\",\n\t\t\tariaLabel: language.translate(\"Zoom Out\"),\n\t\t\tlayer: 40\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"background\", \"button\", \"zoom\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tcornerRadiusBL: 40,\n\t\t\t\tcornerRadiusBR: 40,\n\t\t\t\tcornerRadiusTL: 40,\n\t\t\t\tcornerRadiusTR: 40\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButton\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"background\", \"button\", \"zoom\"]).states.create(\"hover\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonHover\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"background\", \"button\", \"zoom\"]).states.create(\"down\", { stateAnimationDuration: 0 });\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonDown\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Graphics\", [\"icon\", \"button\", \"zoom\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tstrokeOpacity: 0.7,\n\t\t\t\tdraw: (display: any) => {\n\t\t\t\t\tdisplay.moveTo(0, 0);\n\t\t\t\t\tdisplay.lineTo(12, 0);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsetColor(rule, \"stroke\", ic, \"primaryButtonText\");\n\t\t}\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: ResizeButton\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Button\", [\"resize\"]).setAll({\n\t\t\tpaddingTop: 9,\n\t\t\tpaddingBottom: 9,\n\t\t\tpaddingLeft: 13,\n\t\t\tpaddingRight: 13,\n\t\t\tdraggable: true,\n\t\t\tcenterX: p50,\n\t\t\tcenterY: p50,\n\t\t\tposition: \"absolute\",\n\t\t\trole: \"slider\",\n\t\t\tariaValueMin: \"0\",\n\t\t\tariaValueMax: \"100\",\n\t\t\tariaLabel: language.translate(\"Use up and down arrows to move selection\")\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"background\", \"resize\", \"button\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tcornerRadiusBL: 40,\n\t\t\t\tcornerRadiusBR: 40,\n\t\t\t\tcornerRadiusTL: 40,\n\t\t\t\tcornerRadiusTR: 40\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"secondaryButton\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"background\", \"resize\", \"button\"]).states.create(\"hover\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"secondaryButtonHover\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"background\", \"resize\", \"button\"]).states.create(\"down\", { stateAnimationDuration: 0 });\n\t\t\tsetColor(rule, \"fill\", ic, \"secondaryButtonDown\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Graphics\", [\"resize\", \"button\", \"icon\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tstrokeOpacity: 0.7,\n\t\t\t\tdraw: (display: any) => {\n\t\t\t\t\tdisplay.moveTo(0, 0);\n\t\t\t\t\tdisplay.lineTo(0, 12);\n\t\t\t\t\tdisplay.moveTo(4, 0);\n\t\t\t\t\tdisplay.lineTo(4, 12);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsetColor(rule, \"stroke\", ic, \"secondaryButtonText\");\n\t\t}\n\n\t\tr(\"Button\", [\"resize\", \"vertical\"]).setAll({\n\t\t\trotation: 90,\n\t\t\tcursorOverStyle: \"ns-resize\"\n\t\t});\n\n\t\tr(\"Button\", [\"resize\", \"horizontal\"]).setAll({\n\t\t\tcursorOverStyle: \"ew-resize\"\n\t\t});\n\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: PlayButton\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Button\", [\"play\"]).setAll({\n\t\t\tpaddingTop: 13,\n\t\t\tpaddingBottom: 13,\n\t\t\tpaddingLeft: 14,\n\t\t\tpaddingRight: 14,\n\t\t\tariaLabel: language.translate(\"Play\"),\n\t\t\ttoggleKey: \"active\"\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"play\", \"background\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tstrokeOpacity: 0.5,\n\t\t\t\tcornerRadiusBL: 100,\n\t\t\t\tcornerRadiusBR: 100,\n\t\t\t\tcornerRadiusTL: 100,\n\t\t\t\tcornerRadiusTR: 100\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButton\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Graphics\", [\"play\", \"icon\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tstateAnimationDuration: 0,\n\t\t\t\tdx: 1,\n\t\t\t\tdraw: (display: any) => {\n\t\t\t\t\tdisplay.moveTo(0, -5);\n\t\t\t\t\tdisplay.lineTo(8, 0);\n\t\t\t\t\tdisplay.lineTo(0, 5);\n\t\t\t\t\tdisplay.lineTo(0, -5);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonText\");\n\t\t}\n\n\t\tr(\"Graphics\", [\"play\", \"icon\"]).states.create(\"default\", {\n\t\t\tstateAnimationDuration: 0\n\t\t})\n\n\t\tr(\"Graphics\", [\"play\", \"icon\"]).states.create(\"active\", {\n\t\t\tstateAnimationDuration: 0,\n\t\t\tdraw: (display: any) => {\n\t\t\t\tdisplay.moveTo(-4, -5);\n\t\t\t\tdisplay.lineTo(-1, -5);\n\t\t\t\tdisplay.lineTo(-1, 5);\n\t\t\t\tdisplay.lineTo(-4, 5);\n\t\t\t\tdisplay.lineTo(-4, -5);\n\n\t\t\t\tdisplay.moveTo(4, -5);\n\t\t\t\tdisplay.lineTo(1, -5);\n\t\t\t\tdisplay.lineTo(1, 5);\n\t\t\t\tdisplay.lineTo(4, 5);\n\t\t\t\tdisplay.lineTo(4, -5);\n\t\t\t}\n\t\t})\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: SwitchButton\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Button\", [\"switch\"]).setAll({\n\t\t\tpaddingTop: 4,\n\t\t\tpaddingBottom: 4,\n\t\t\tpaddingLeft: 4,\n\t\t\tpaddingRight: 4,\n\t\t\tariaLabel: language.translate(\"Press ENTER to toggle\"),\n\t\t\ttoggleKey: \"active\",\n\t\t\twidth: 40,\n\t\t\theight: 24,\n\t\t\tlayout: null\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"switch\", \"background\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tstrokeOpacity: 0.5,\n\t\t\t\tcornerRadiusBL: 100,\n\t\t\t\tcornerRadiusBR: 100,\n\t\t\t\tcornerRadiusTL: 100,\n\t\t\t\tcornerRadiusTR: 100\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButton\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"Circle\", [\"switch\", \"icon\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tradius: 8,\n\t\t\t\tcenterY: 0,\n\t\t\t\tcenterX: 0,\n\t\t\t\tdx: 0\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"primaryButtonText\");\n\t\t}\n\n\t\tr(\"Graphics\", [\"switch\", \"icon\"]).states.create(\"active\", {\n\t\t\tdx: 16\n\t\t});\n\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * core: Scrollbar\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\tr(\"Scrollbar\").setAll({\n\t\t\tstart: 0,\n\t\t\tend: 1,\n\t\t\tlayer: 40,\n\t\t\tanimationEasing: $ease.out($ease.cubic)\n\t\t});\n\n\t\tr(\"Scrollbar\", [\"vertical\"]).setAll({\n\t\t\tmarginRight: 13,\n\t\t\tmarginLeft: 13,\n\t\t\tminWidth: 12,\n\t\t\theight: p100\n\t\t});\n\n\t\tr(\"Scrollbar\", [\"horizontal\"]).setAll({\n\t\t\tmarginTop: 13,\n\t\t\tmarginBottom: 13,\n\t\t\tminHeight: 12,\n\t\t\twidth: p100\n\t\t});\n\n\t\tthis.rule(\"Button\", [\"scrollbar\"]).setAll({\n\t\t\texportable: false\n\t\t});\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"scrollbar\", \"main\", \"background\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tcornerRadiusTL: 8,\n\t\t\t\tcornerRadiusBL: 8,\n\t\t\t\tcornerRadiusTR: 8,\n\t\t\t\tcornerRadiusBR: 8,\n\t\t\t\tfillOpacity: 0.8,\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"fill\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"scrollbar\", \"thumb\"]);\n\n\t\t\trule.setAll({\n\t\t\t\trole: \"slider\",\n\t\t\t\tariaLive: \"polite\",\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tdraggable: true\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"secondaryButton\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"scrollbar\", \"thumb\"]).states.create(\"hover\", {});\n\t\t\tsetColor(rule, \"fill\", ic, \"secondaryButtonHover\");\n\t\t}\n\n\t\t{\n\t\t\tconst rule = r(\"RoundedRectangle\", [\"scrollbar\", \"thumb\"]).states.create(\"down\", { stateAnimationDuration: 0 });\n\t\t\tsetColor(rule, \"fill\", ic, \"secondaryButtonDown\");\n\t\t}\n\n\t\tr(\"RoundedRectangle\", [\"scrollbar\", \"thumb\", \"vertical\"]).setAll({\n\t\t\tx: p50,\n\t\t\twidth: p100,\n\t\t\tcenterX: p50,\n\t\t\tariaLabel: language.translate(\"Use up and down arrows to move selection\")\n\t\t});\n\n\t\tr(\"RoundedRectangle\", [\"scrollbar\", \"thumb\", \"horizontal\"]).setAll({\n\t\t\ty: p50,\n\t\t\tcenterY: p50,\n\t\t\theight: p100,\n\t\t\tariaLabel: language.translate(\"Use left and right arrows to move selection\")\n\t\t});\n\n\t\t// @todo: is this needed? used to be \"ContentScrollbar\"\n\t\t// r(\"Scrollbar\", [\"content?\"]).setAll({\n\t\t// \tmarginRight: 0,\n\t\t// \tmarginLeft: 5,\n\t\t// \tlayer: 5\n\t\t// });\n\n\t\t/**\n\t\t * ========================================================================\n\t\t * charts/xy\n\t\t * ========================================================================\n\t\t *\n\t\t * This needs to be in DefaultTheme because it's the only theme that is\n\t\t * automatically applied to Root, and tooltips different ancestors\n\t\t * than actual charts using them.\n\t\t */\n\n\t\t{\n\t\t\tconst rule = r(\"PointedRectangle\", [\"axis\", \"tooltip\", \"background\"]);\n\n\t\t\trule.setAll({\n\t\t\t\tcornerRadius: 0\n\t\t\t});\n\n\t\t\tsetColor(rule, \"fill\", ic, \"alternativeBackground\");\n\t\t}\n\n\t\tr(\"Label\", [\"axis\", \"tooltip\"]).setAll({\n\t\t\trole: undefined\n\t\t});\n\n\t\tr(\"Label\", [\"axis\", \"tooltip\", \"y\"]).setAll({\n\t\t\ttextAlign: \"right\"\n\t\t});\n\n\t\tr(\"Label\", [\"axis\", \"tooltip\", \"y\", \"opposite\"]).setAll({\n\t\t\ttextAlign: \"left\"\n\t\t});\n\n\t\tr(\"Label\", [\"axis\", \"tooltip\", \"x\"]).setAll({\n\t\t\ttextAlign: \"center\"\n\t\t});\n\n\t\tr(\"Tooltip\", [\"categoryaxis\"]).setAll({\n\t\t\tlabelText: \"{category}\"\n\t\t})\n\n\t\t/**\n\t\t * ------------------------------------------------------------------------\n\t\t * Shapes\n\t\t * ------------------------------------------------------------------------\n\t\t */\n\n\t\t// Class: Graphics\n\t\tr(\"Star\").setAll({\n\t\t\tspikes: 5,\n\t\t\tinnerRadius: 5,\n\t\t\tradius: 10\n\t\t})\n\t}\n}\n","/**\n * amCharts 5 locale\n * \n * Locale: en\n * Language: International English\n * Author: Martynas Majeris\n *\n * Follow instructions in [on this page](https://www.amcharts.com/docs/v5/tutorials/creating-translations/) to make corrections or add new translations.\n *\n * ---\n * Edit but leave the header section above this line. You can remove any\n * subsequent comment sections.\n * ---\n *\n * Use this file as a template to create translations. Leave the key part in\n * English intact. Fill the value with a translation.\n *\n * Empty string means no translation, so default \"International English\"\n * will be used.\n *\n * If you need the translation to literally be an empty string, use `null`\n * instead.\n *\n * IMPORTANT:\n * When translating make good effort to keep the translation length\n * at least the same chartcount as the English, especially for short prompts.\n *\n * Having significantly longer prompts may distort the actual charts.\n *\n * NOTE:\n * Some prompts - like months or weekdays - come in two versions: full and\n * shortened.\n *\n * If there's no official shortened version of these in your language, and it\n * would not be possible to invent such short versions that don't seem weird\n * to native speakers of that language, fill those with the same as full\n * version.\n *\n * PLACEHOLDERS:\n * Some prompts have placeholders like \"%1\". Those will be replaced by actual\n * values during translation and should be retained in the translated prompts.\n *\n * Placeholder positions may be changed to better suit structure of the\n * sentence.\n *\n * For example \"From %1 to %2\", when actually used will replace \"%1\" with an\n * actual value representing range start, and \"%2\" will be replaced by end\n * value.\n *\n * E.g. in a Scrollbar for Value axis \"From %1 to %2\" will become\n * \"From 100 to 200\". You may translate \"From\" and \"to\", as well as re-arrange\n * the order of the prompt itself, but make sure the \"%1\" and \"%2\" remain, in\n * places where they will make sense.\n *\n * Save the file as language_LOCALE, i.e. `en_GB.ts`, `fr_FR.ts`, etc.\n */\nexport default {\n\t\"firstDayOfWeek\": 1,\n\t\n\t// Number formatting options.\n\t// \n\t// Please check with the local standards which separator is accepted to be\n\t// used for separating decimals, and which for thousands.\n\t\"_decimalSeparator\": \".\",\n\t\"_thousandSeparator\": \",\",\n\n\t// Suffixes for numbers\n\t// When formatting numbers, big or small numers might be reformatted to\n\t// shorter version, by applying a suffix.\n\t// \n\t// For example, 1000000 might become \"1m\".\n\t// Or 1024 might become \"1KB\" if we're formatting byte numbers.\n\t// \n\t// This section defines such suffixes for all such cases.\n\t\"_big_number_suffix_3\": \"k\",\n\t\"_big_number_suffix_6\": \"M\",\n\t\"_big_number_suffix_9\": \"G\",\n\t\"_big_number_suffix_12\": \"T\",\n\t\"_big_number_suffix_15\": \"P\",\n\t\"_big_number_suffix_18\": \"E\",\n\t\"_big_number_suffix_21\": \"Z\",\n\t\"_big_number_suffix_24\": \"Y\",\n\n\t\"_small_number_suffix_3\": \"m\",\n\t\"_small_number_suffix_6\": \"μ\",\n\t\"_small_number_suffix_9\": \"n\",\n\t\"_small_number_suffix_12\": \"p\",\n\t\"_small_number_suffix_15\": \"f\",\n\t\"_small_number_suffix_18\": \"a\",\n\t\"_small_number_suffix_21\": \"z\",\n\t\"_small_number_suffix_24\": \"y\",\n\n\t\"_byte_suffix_B\": \"B\",\n\t\"_byte_suffix_KB\": \"KB\",\n\t\"_byte_suffix_MB\": \"MB\",\n\t\"_byte_suffix_GB\": \"GB\",\n\t\"_byte_suffix_TB\": \"TB\",\n\t\"_byte_suffix_PB\": \"PB\",\n\n\t// Default date formats for various periods.\n\t// \n\t// This should reflect official or de facto formatting universally accepted\n\t// in the country translation is being made for\n\t// Available format codes here:\n\t// https://www.amcharts.com/docs/v5/concepts/formatters/formatting-dates/#Format_codes\n\t// \n\t// This will be used when formatting date/time for particular granularity,\n\t// e.g. \"_date_hour\" will be shown whenever we need to show time as hours.\n\t// \n\t// \"date\" is used as in default date format when showing standalone dates.\n\t\"_date\": \"yyyy-MM-dd\",\n\t\"_date_millisecond\": \"mm:ss SSS\",\n\t\"_date_second\": \"HH:mm:ss\",\n\t\"_date_minute\": \"HH:mm\",\n\t\"_date_hour\": \"HH:mm\",\n\t\"_date_day\": \"MMM dd\",\n\t\"_date_week\": \"ww\",\n\t\"_date_month\": \"MMM\",\n\t\"_date_year\": \"yyyy\",\n\n\t// Default duration formats for various base units.\n\t// \n\t// This will be used by DurationFormatter to format numeric values into\n\t// duration.\n\t// \n\t// Notice how each duration unit comes in several versions. This is to ensure\n\t// that each base unit is shown correctly.\n\t// \n\t// For example, if we have baseUnit set to \"second\", meaning our duration is\n\t// in seconds.\n\t// \n\t// If we pass in `50` to formatter, it will know that we have just 50 seconds\n\t// (less than a minute) so it will use format in `\"_duration_second\"` (\"ss\"),\n\t// and the formatted result will be in like `\"50\"`.\n\t// \n\t// If we pass in `70`, which is more than a minute, the formatter will switch\n\t// to `\"_duration_second_minute\"` (\"mm:ss\"), resulting in \"01:10\" formatted\n\t// text.\n\t// \n\t// Available codes here:\n\t// https://www.amcharts.com/docs/v4/concepts/formatters/formatting-duration/#Available_Codes\n\t\"_duration_millisecond\": \"SSS\",\n\t\"_duration_millisecond_second\": \"ss.SSS\",\n\t\"_duration_millisecond_minute\": \"mm:ss SSS\",\n\t\"_duration_millisecond_hour\": \"hh:mm:ss SSS\",\n\t\"_duration_millisecond_day\": \"d'd' mm:ss SSS\",\n\t\"_duration_millisecond_week\": \"d'd' mm:ss SSS\",\n\t\"_duration_millisecond_month\": \"M'm' dd'd' mm:ss SSS\",\n\t\"_duration_millisecond_year\": \"y'y' MM'm' dd'd' mm:ss SSS\",\n\n\t\"_duration_second\": \"ss\",\n\t\"_duration_second_minute\": \"mm:ss\",\n\t\"_duration_second_hour\": \"hh:mm:ss\",\n\t\"_duration_second_day\": \"d'd' hh:mm:ss\",\n\t\"_duration_second_week\": \"d'd' hh:mm:ss\",\n\t\"_duration_second_month\": \"M'm' dd'd' hh:mm:ss\",\n\t\"_duration_second_year\": \"y'y' MM'm' dd'd' hh:mm:ss\",\n\n\t\"_duration_minute\": \"mm\",\n\t\"_duration_minute_hour\": \"hh:mm\",\n\t\"_duration_minute_day\": \"d'd' hh:mm\",\n\t\"_duration_minute_week\": \"d'd' hh:mm\",\n\t\"_duration_minute_month\": \"M'm' dd'd' hh:mm\",\n\t\"_duration_minute_year\": \"y'y' MM'm' dd'd' hh:mm\",\n\n\t\"_duration_hour\": \"hh'h'\",\n\t\"_duration_hour_day\": \"d'd' hh'h'\",\n\t\"_duration_hour_week\": \"d'd' hh'h'\",\n\t\"_duration_hour_month\": \"M'm' dd'd' hh'h'\",\n\t\"_duration_hour_year\": \"y'y' MM'm' dd'd' hh'h'\",\n\n\t\"_duration_day\": \"d'd'\",\n\t\"_duration_day_week\": \"d'd'\",\n\t\"_duration_day_month\": \"M'm' dd'd'\",\n\t\"_duration_day_year\": \"y'y' MM'm' dd'd'\",\n\n\t\"_duration_week\": \"w'w'\",\n\t\"_duration_week_month\": \"w'w'\",\n\t\"_duration_week_year\": \"w'w'\",\n\n\t\"_duration_month\": \"M'm'\",\n\t\"_duration_month_year\": \"y'y' MM'm'\",\n\n\t\"_duration_year\": \"y'y'\",\n\n\t// Era translations\n\t\"_era_ad\": \"AD\",\n\t\"_era_bc\": \"BC\",\n\n\t// Day part, used in 12-hour formats, e.g. 5 P.M.\n\t// Please note that these come in 3 variants:\n\t// * one letter (e.g. \"A\")\n\t// * two letters (e.g. \"AM\")\n\t// * two letters with dots (e.g. \"A.M.\")\n\t// \n\t// All three need to to be translated even if they are all the same. Some\n\t// users might use one, some the other.\n\t\"A\": \"\",\n\t\"P\": \"\",\n\t\"AM\": \"\",\n\t\"PM\": \"\",\n\t\"A.M.\": \"\",\n\t\"P.M.\": \"\",\n\n\t// Date-related stuff.\n\t// \n\t// When translating months, if there's a difference, use the form which is\n\t// best for a full date, e.g. as you would use it in \"2018 January 1\".\n\t// \n\t// Note that May is listed twice. This is because in English May is the same\n\t// in both long and short forms, while in other languages it may not be the\n\t// case. Translate \"May\" to full word, while \"May(short)\" to shortened\n\t// version.\n\t// \n\t// Should month names and weekdays be capitalized or not?\n\t// \n\t// Rule of thumb is this: if the names should always be capitalized,\n\t// regardless of name position within date (\"January\", \"21st January 2018\",\n\t// etc.) use capitalized names. Otherwise enter all lowercase.\n\t// \n\t// The date formatter will automatically capitalize names if they are the\n\t// first (or only) word in resulting date.\n\t\"January\": \"\",\n\t\"February\": \"\",\n\t\"March\": \"\",\n\t\"April\": \"\",\n\t\"May\": \"\",\n\t\"June\": \"\",\n\t\"July\": \"\",\n\t\"August\": \"\",\n\t\"September\": \"\",\n\t\"October\": \"\",\n\t\"November\": \"\",\n\t\"December\": \"\",\n\t\"Jan\": \"\",\n\t\"Feb\": \"\",\n\t\"Mar\": \"\",\n\t\"Apr\": \"\",\n\t\"May(short)\": \"May\",\n\t\"Jun\": \"\",\n\t\"Jul\": \"\",\n\t\"Aug\": \"\",\n\t\"Sep\": \"\",\n\t\"Oct\": \"\",\n\t\"Nov\": \"\",\n\t\"Dec\": \"\",\n\n\t// Weekdays.\n\t\"Sunday\": \"\",\n\t\"Monday\": \"\",\n\t\"Tuesday\": \"\",\n\t\"Wednesday\": \"\",\n\t\"Thursday\": \"\",\n\t\"Friday\": \"\",\n\t\"Saturday\": \"\",\n\t\"Sun\": \"\",\n\t\"Mon\": \"\",\n\t\"Tue\": \"\",\n\t\"Wed\": \"\",\n\t\"Thu\": \"\",\n\t\"Fri\": \"\",\n\t\"Sat\": \"\",\n\n\t// Date ordinal function.\n\t// \n\t// This is used when adding number ordinal when formatting days in dates.\n\t// \n\t// E.g. \"January 1st\", \"February 2nd\".\n\t// \n\t// The function accepts day number, and returns a string to be added to the\n\t// day, like in default English translation, if we pass in 2, we will receive\n\t// \"nd\" back.\n\t\"_dateOrd\": function(day: number): string {\n\t\tlet res = \"th\";\n\t\tif ((day < 11) || (day > 13)) {\n\t\t\tswitch (day % 10) {\n\t\t\t\tcase 1:\n\t\t\t\t\tres = \"st\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tres = \"nd\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tres = \"rd\"\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t},\n\n\t// Various chart controls.\n\t// Shown as a tooltip on zoom out button.\n\t\"Zoom Out\": \"\",\n\n\t// Timeline buttons\n\t\"Play\": \"\",\n\t\"Stop\": \"\",\n\n\t// Chart's Legend screen reader title.\n\t\"Legend\": \"\",\n\n\t// Legend's item screen reader indicator.\n\t\"Press ENTER to toggle\": \"\",\n\n\t// Shown when the chart is busy loading something.\n\t\"Loading\": \"\",\n\n\t// Shown as the first button in the breadcrumb navigation, e.g.:\n\t// Home > First level > ...\n\t\"Home\": \"\",\n\n\t// Chart types.\n\t// Those are used as default screen reader titles for the main chart element\n\t// unless developer has set some more descriptive title.\n\t\"Chart\": \"\",\n\t\"Serial chart\": \"\",\n\t\"X/Y chart\": \"\",\n\t\"Pie chart\": \"\",\n\t\"Gauge chart\": \"\",\n\t\"Radar chart\": \"\",\n\t\"Sankey diagram\": \"\",\n\t\"Flow diagram\": \"\",\n\t\"Chord diagram\": \"\",\n\t\"TreeMap chart\": \"\",\n\t\"Force directed tree\": \"\",\n\t\"Sliced chart\": \"\",\n\n\t// Series types.\n\t// Used to name series by type for screen readers if they do not have their\n\t// name set.\n\t\"Series\": \"\",\n\t\"Candlestick Series\": \"\",\n\t\"OHLC Series\": \"\",\n\t\"Column Series\": \"\",\n\t\"Line Series\": \"\",\n\t\"Pie Slice Series\": \"\",\n\t\"Funnel Series\": \"\",\n\t\"Pyramid Series\": \"\",\n\t\"X/Y Series\": \"\",\n\n\t// Map-related stuff.\n\t\"Map\": \"\",\n\t\"Press ENTER to zoom in\": \"\",\n\t\"Press ENTER to zoom out\": \"\",\n\t\"Use arrow keys to zoom in and out\": \"\",\n\t\"Use plus and minus keys on your keyboard to zoom in and out\": \"\",\n\n\t// Export-related stuff.\n\t// These prompts are used in Export menu labels.\n\t// \n\t// \"Export\" is the top-level menu item.\n\t// \n\t// \"Image\", \"Data\", \"Print\" as second-level indicating type of export\n\t// operation.\n\t// \n\t// Leave actual format untranslated, unless you absolutely know that they\n\t// would convey more meaning in some other way.\n\t\"Export\": \"\",\n\t\"Image\": \"\",\n\t\"Data\": \"\",\n\t\"Print\": \"\",\n\t\"Press ENTER or use arrow keys to navigate\": \"\",\n\t\"Press ENTER to open\": \"\",\n\t\"Press ENTER to print.\": \"\",\n\t\"Press ENTER to export as %1.\": \"\",\n\t\"(Press ESC to close this message)\": \"\",\n\t\"Image Export Complete\": \"\",\n\t\"Export operation took longer than expected. Something might have gone wrong.\": \"\",\n\t\"Saved from\": \"\",\n\t\"PNG\": \"\",\n\t\"JPG\": \"\",\n\t\"GIF\": \"\",\n\t\"SVG\": \"\",\n\t\"PDF\": \"\",\n\t\"JSON\": \"\",\n\t\"CSV\": \"\",\n\t\"XLSX\": \"\",\n\t\"HTML\": \"\",\n\n\t// Scrollbar-related stuff.\n\t// \n\t// Scrollbar is a control which can zoom and pan the axes on the chart.\n\t// \n\t// Each scrollbar has two grips: left or right (for horizontal scrollbar) or\n\t// upper and lower (for vertical one).\n\t// \n\t// Prompts change in relation to whether Scrollbar is vertical or horizontal.\n\t// \n\t// The final section is used to indicate the current range of selection.\n\t\"Use TAB to select grip buttons or left and right arrows to change selection\": \"\",\n\t\"Use left and right arrows to move selection\": \"\",\n\t\"Use left and right arrows to move left selection\": \"\",\n\t\"Use left and right arrows to move right selection\": \"\",\n\t\"Use TAB select grip buttons or up and down arrows to change selection\": \"\",\n\t\"Use up and down arrows to move selection\": \"\",\n\t\"Use up and down arrows to move lower selection\": \"\",\n\t\"Use up and down arrows to move upper selection\": \"\",\n\t\"From %1 to %2\": \"\",\n\t\"From %1\": \"\",\n\t\"To %1\": \"\",\n\n\t// Data loader-related.\n\t\"No parser available for file: %1\": \"\",\n\t\"Error parsing file: %1\": \"\",\n\t\"Unable to load file: %1\": \"\",\n\t\"Invalid date\": \"\",\n\n\t// Common actions\n\t\"Close\": \"\",\n\t\"Minimize\": \"\"\n\n};","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","import {path} from \"d3-path\";\nimport array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport line from \"./line.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x0, y0, y1) {\n var x1 = null,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n x0 = typeof x0 === \"function\" ? x0 : (x0 === undefined) ? pointX : constant(+x0);\n y0 = typeof y0 === \"function\" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0);\n y1 = typeof y1 === \"function\" ? y1 : (y1 === undefined) ? pointY : constant(+y1);\n\n function area(data) {\n var i,\n j,\n k,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import {path} from \"d3-path\";\nimport array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"deps/\" + ({\"643\":\"pdfmake\",\"4297\":\"xlsx\",\"4384\":\"markerjs2\"}[chunkId] || chunkId) + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t4826: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) var result = runtime(__webpack_require__);\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_am5\"] = self[\"webpackChunk_am5\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","const Promise = window.Promise;\nconst promiseThen = Promise && Promise.prototype.then;\nconst promiseCatch = Promise && Promise.prototype.catch;\nconst promiseFinally = Promise && Promise.prototype.finally;\nconst promiseReject = Promise && Promise.reject;\nconst promiseResolve = Promise && Promise.resolve;\nconst promiseAllSettled = Promise && Promise.allSettled;\nconst promiseAll = Promise && Promise.all;\nconst promiseRace = Promise && Promise.race;\nconst fetch = window.fetch;\nconst startsWith = String.prototype.startsWith;\nconst endsWith = String.prototype.endsWith;\n\nexport default function () {\n\tif (Promise) {\n\t\twindow.Promise = Promise;\n\n\t\tif (promiseThen) { Promise.prototype.then = promiseThen; }\n\t\tif (promiseCatch) { Promise.prototype.catch = promiseCatch; }\n\t\tif (promiseFinally) { Promise.prototype.finally = promiseFinally; }\n\t\tif (promiseReject) { Promise.reject = promiseReject; }\n\t\tif (promiseResolve) { Promise.resolve = promiseResolve; }\n\t\tif (promiseAllSettled) { Promise.allSettled = promiseAllSettled; }\n\t\tif (promiseAll) { Promise.all = promiseAll; }\n\t\tif (promiseRace) { Promise.race = promiseRace; }\n\t}\n\n\tif (fetch) {\n\t\twindow.fetch = fetch;\n\t}\n\n\tif (startsWith) {\n\t\tString.prototype.startsWith = startsWith;\n\t}\n\n\tif (endsWith) {\n\t\tString.prototype.endsWith = endsWith;\n\t}\n};","import { Entity, IEntitySettings, IEntityPrivate } from \"../../core/util/Entity\";\nimport type { Sprite } from \"../../core/render/Sprite\";\nimport type { Series } from \"../../core/render/Series\";\n\nexport interface IBulletSettings extends IEntitySettings {\n\n\t/**\n\t * Horizontal location within target element.\n\t *\n\t * 0 - left, 1 - right, or anything inbetweeen.\n\t */\n\tlocationX?: number;\n\n\t/**\n\t * Vertical location within target element.\n\t *\n\t * 0 - top, 1 - bottom, or anything inbetweeen.\n\t */\n\tlocationY?: number;\n\n\t/**\n\t * A visual element of the bullet.\n\t */\n\tsprite: Sprite;\n\n\t/**\n\t * If set to `true`, the bullet will redraw its `sprite` element whenever\n\t * anything in its parent series changes.\n\t *\n\t * @default false\n\t */\n\tdynamic?: boolean;\n\n\t/**\n\t * If set to `true`, the bullet will be automatically rotated to face\n\t * direction of line it is attached to.\n\t *\n\t * NOTE: Works only in [[Flow]] and [[MapPointSeries]] (when [[MapPoint]] is\n\t * attached to a [[MapLine]]).\n\t *\n\t * @default false\n\t */\n\tautoRotate?: boolean;\n\n\t/**\n\t * If `autoRotate` is set to `true`, value of `autoRotateAngle` will be added\n\t * to the automatically-calculated angle.\n\t */\n\tautoRotateAngle?: number;\n\n}\n\nexport interface IBulletPrivate extends IEntityPrivate {\n\thidden?:boolean;\n}\n\n/**\n * A universal placeholder for bullet elements.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/bullets/} for more info\n */\nexport class Bullet extends Entity {\n\tpublic static className: string = \"Bullet\";\n\tpublic static classNames: Array = Entity.classNames.concat([Bullet.className]);\n\n\tdeclare public _settings: IBulletSettings;\n\tdeclare public _privateSettings: IBulletPrivate;\n\n\t// used by MapPolygons where one data item can have multiple bullets of the same kind\n\tpublic _index?: number;\n\n\t/**\n\t * Target series object if it's a bullet for series.\n\t */\n\tpublic series: Series | undefined;\n\n\tprotected _afterNew() {\n\t\t// Applying themes because bullet will not have parent\n\t\tsuper._afterNewApplyThemes();\n\t}\n\n\tpublic _beforeChanged() {\n\t\tsuper._beforeChanged();\n\n\t\tif (this.isDirty(\"sprite\")) {\n\t\t\tconst sprite = this.get(\"sprite\");\n\t\t\tif (sprite) {\n\t\t\t\tsprite.setAll({ position: \"absolute\", role: \"figure\" });\n\t\t\t\tthis._disposers.push(sprite);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"locationX\") || this.isDirty(\"locationY\")) {\n\t\t\tif (this.series) {\n\t\t\t\tthis.series._positionBullet(this);\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\r\n\r\nexport interface IEllipseSettings extends IGraphicsSettings {\r\n\r\n\t/**\r\n\t * The ellipse's major-axis radius. Must be non-negative.\r\n\t */\r\n\r\n\tradiusX: number\r\n\r\n\t/**\r\n\t * The ellipse's minor-axis radius. Must be non-negative.\r\n\t */\r\n\tradiusY: number\r\n}\r\n\r\nexport interface IEllipsePrivate extends IGraphicsPrivate {\r\n}\r\n\r\n/**\r\n * Draws a Ellipse.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\r\n * @important\r\n */\r\nexport class Ellipse extends Graphics {\r\n\r\n\tdeclare public _settings: IEllipseSettings;\r\n\tdeclare public _privateSettings: IEllipsePrivate;\r\n\r\n\tpublic static className: string = \"Ellipse\";\r\n\tpublic static classNames: Array = Graphics.classNames.concat([Ellipse.className]);\r\n\r\n\tpublic _beforeChanged() {\r\n\t\tsuper._beforeChanged();\r\n\r\n\t\tif (this.isDirty(\"radiusX\") || this.isDirty(\"radiusY\") || this.isDirty(\"rotation\")) {\r\n\t\t\tthis._clear = true;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic _changed() {\r\n\t\tsuper._changed();\r\n\r\n\t\tif (this._clear) {\r\n\t\t\tthis._display.drawEllipse(0, 0, Math.abs(this.get(\"radiusX\")), Math.abs(this.get(\"radiusY\")));\r\n\t\t}\r\n\t}\r\n}\r\n","import { Graphics, IGraphicsSettings, IGraphicsPrivate } from \"./Graphics\";\r\nimport type { Percent } from \"../../core/util/Percent\";\r\nimport * as $utils from \"../../core/util/Utils\";\r\n\r\nexport interface IStarSettings extends IGraphicsSettings {\r\n\r\n\t/**\r\n\t * Star's radius in pixels.\r\n\t */\r\n\tradius?: number;\r\n\r\n\t/**\r\n\t * Star's inner radius in pixels.\r\n\t */\r\n\tinnerRadius?: number | Percent;\r\n\r\n\t/**\r\n\t * Number of spikes\r\n\t */\r\n\tspikes?: number;\r\n\r\n}\r\n\r\nexport interface IStarPrivate extends IGraphicsPrivate {\r\n}\r\n\r\n/**\r\n * Draws a Star.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v5/concepts/common-elements/graphics/} for more info\r\n * @important\r\n */\r\nexport class Star extends Graphics {\r\n\r\n\tdeclare public _settings: IStarSettings;\r\n\tdeclare public _privateSettings: IStarPrivate;\r\n\r\n\tpublic static className: string = \"Star\";\r\n\tpublic static classNames: Array = Graphics.classNames.concat([Star.className]);\r\n\r\n\tpublic _beforeChanged() {\r\n\t\tsuper._beforeChanged();\r\n\r\n\t\tif (this.isDirty(\"radius\") || this.isDirty(\"innerRadius\") || this.isDirty(\"spikes\")) {\r\n\t\t\tthis._clear = true;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic _changed() {\r\n\t\tsuper._changed();\r\n\r\n\t\tif (this._clear) {\r\n\t\t\tconst display = this._display;\r\n\t\t\tconst r = this.get(\"radius\", 0);\r\n\t\t\tconst ir = $utils.relativeToValue(this.get(\"innerRadius\", 0), r);\r\n\t\t\tconst spikes = this.get(\"spikes\", 0);\r\n\t\t\tconst step = Math.PI / spikes;\r\n\t\t\tlet angle = Math.PI / 2 * 3;\r\n\r\n\t\t\tdisplay.moveTo(0, - r)\r\n\r\n\t\t\tfor (let i = 0; i < spikes; i++) {\r\n\t\t\t\tdisplay.lineTo(Math.cos(angle) * r, Math.sin(angle) * r)\r\n\t\t\t\tangle += step\r\n\r\n\t\t\t\tdisplay.lineTo(Math.cos(angle) * ir, Math.sin(angle) * ir)\r\n\t\t\t\tangle += step\r\n\t\t\t}\r\n\t\t\tdisplay.lineTo(0, -r)\r\n\t\t}\r\n\t}\r\n}\r\n","import type { IPoint } from \"../../core/util/IPoint\";\n\nimport { Container, IContainerSettings, IContainerPrivate } from \"./Container\";\nimport { Label } from \"../../core/render/Label\";\nimport { p100 } from \"../../core/util/Percent\";\nimport { RoundedRectangle } from \"../../core/render/RoundedRectangle\";\nimport { Template } from \"../../core/util/Template\";\nimport { ListTemplate } from \"../../core/util/List\";\nimport { Color } from \"../../core/util/Color\";\nimport { Tooltip } from \"../../core/render/Tooltip\";\nimport { LinearGradient } from \"../../core/render/gradients/LinearGradient\";\n\nimport * as $utils from \"../../core/util/Utils\";\nimport * as $type from \"../../core/util/Type\";\n\nexport interface IHeatLegendSettings extends IContainerSettings {\n\n\t/**\n\t * Starting (lowest value) color.\n\t */\n\tstartColor: Color;\n\n\t/**\n\t * Ending (highest value) color.\n\t */\n\tendColor: Color;\n\n\t/**\n\t * Start (lowest) value.\n\t */\n\tstartValue?: number;\n\n\t/**\n\t * End (highest) value.\n\t */\n\tendValue?: number;\n\n\t/**\n\t * Text for start label.\n\t */\n\tstartText?: string;\n\n\t/**\n\t * Text for end label.\n\t */\n\tendText?: string;\n\n\t/**\n\t * Number of steps\n\t *\n\t * @default 1\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/legend/heat-legend/#Gradient_or_steps} for more info\n\t */\n\tstepCount?: number;\n\n\t/**\n\t * Orientation of the heat legend.\n\t *\n\t * @see {@link https://www.amcharts.com/docs/v5/concepts/legend/heat-legend/#Orientation} for more info\n\t */\n\torientation: \"horizontal\" | \"vertical\";\n\n}\n\nexport interface IHeatLegendPrivate extends IContainerPrivate {\n}\n\n/**\n * Heat legend.\n *\n * @see {@link https://www.amcharts.com/docs/v5/concepts/legend/heat-legend/} for more info\n */\nexport class HeatLegend extends Container {\n\n\t/**\n\t * A [[Container]] that all labels are placed in.\n\t *\n\t * @default Container.new()\n\t */\n\tpublic readonly labelContainer: Container = this.children.push(Container.new(this._root, {}));\n\n\t/**\n\t * A [[Container]] that all markers are placed in.\n\t *\n\t * @default Container.new()\n\t */\n\tpublic readonly markerContainer: Container = this.children.push(Container.new(this._root, {}));\n\n\t/**\n\t * A start [[Label]].\n\t *\n\t * @default Label.new()\n\t */\n\tpublic readonly startLabel: Label = this.labelContainer.children.push(Label.new(this._root, { themeTags: [\"start\"] }));\n\n\t/**\n\t * An end [[Label]].\n\t *\n\t * @default Label.new()\n\t */\n\tpublic readonly endLabel: Label = this.labelContainer.children.push(Label.new(this._root, { themeTags: [\"end\"] }));\n\n\tpublic static className: string = \"HeatLegend\";\n\tpublic static classNames: Array = Container.classNames.concat([HeatLegend.className]);\n\n\tdeclare public _settings: IHeatLegendSettings;\n\tdeclare public _privateSettings: IHeatLegendPrivate;\n\n\n\tprotected _afterNew() {\n\t\tthis._settings.themeTags = $utils.mergeTags(this._settings.themeTags, [\"heatlegend\", this._settings.orientation]);\n\t\tsuper._afterNew();\n\t\tthis.set(\"tooltip\", Tooltip.new(this._root, {\n\t\t\tthemeTags: [\"heatlegend\"]\n\t\t}));\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic makeMarker(): RoundedRectangle {\n\t\tconst marker = this.markers.make();\n\t\tmarker.states.create(\"disabled\", {});\n\t\treturn marker;\n\t}\n\n\t/**\n\t * List of rectangle elements used for default legend markers.\n\t *\n\t * @default new ListTemplate\n\t */\n\tpublic readonly markers: ListTemplate = new ListTemplate(\n\t\tTemplate.new({}),\n\t\t() => RoundedRectangle._new(this._root, {\n\t\t\tthemeTags: $utils.mergeTags(this.markers.template.get(\"themeTags\", []), [this.get(\"orientation\"), \"heatlegend\", \"marker\"])\n\t\t}, [this.markers.template])\n\t);\n\n\n\t/**\n\t * Moves and shows tooltip at specific value.\n\t *\n\t * Can also specify optional text to show in tooltip, as well as the color.\n\t *\n\t * @param value Value\n\t * @param text Text\n\t * @param color Color\n\t */\n\tpublic showValue(value: number, text?: string, color?: Color) {\n\t\tconst tooltip = this.getTooltip();\n\t\tif (tooltip && $type.isNumber(value)) {\n\n\t\t\tconst startValue = this.get(\"startValue\", 0);\n\t\t\tconst endValue = this.get(\"endValue\", 1);\n\n\t\t\tconst c = (value - startValue) / (endValue - startValue);\n\t\t\tconst startColor = this.get(\"startColor\")!;\n\t\t\tconst endColor = this.get(\"endColor\")!;\n\n\t\t\tif (!text) {\n\t\t\t\ttext = this.getNumberFormatter().format(value);\n\t\t\t}\n\n\t\t\tif (!color) {\n\t\t\t\tcolor = Color.interpolate(c, startColor, endColor);\n\t\t\t}\n\n\t\t\ttooltip.label.set(\"text\", text);\n\t\t\tlet p:IPoint;\n\n\t\t\tif (this.get(\"orientation\") == \"vertical\") {\n\t\t\t\tp = this.markerContainer.toGlobal({ x: 0, y: this.innerHeight() * (1 - c) });\n\t\t\t}\n\t\t\telse {\n\t\t\t\tp = this.markerContainer.toGlobal({ x: this.innerWidth() * c, y: 0 });\n\t\t\t}\n\n\t\t\tlet background = tooltip.get(\"background\");\n\t\t\tif (background) {\n\t\t\t\tbackground.set(\"fill\", Color.interpolate(c, startColor, endColor))\n\t\t\t}\n\t\t\ttooltip.set(\"pointTo\", p);\n\t\t\ttooltip.show();\n\t\t}\n\t}\n\n\tpublic _prepareChildren() {\n\t\tsuper._prepareChildren();\n\n\t\tconst labelContainer = this.labelContainer;\n\t\tconst orientation = this.get(\"orientation\");\n\t\tconst startLabel = this.startLabel;\n\t\tconst endLabel = this.endLabel;\n\t\tconst tooltip = this.getTooltip();\n\n\t\tif (this.isDirty(\"orientation\")) {\n\t\t\tif (orientation == \"vertical\") {\n\t\t\t\tthis.markerContainer.setAll({ layout: this._root.verticalLayout, height: p100 });\n\t\t\t\tthis.set(\"layout\", this._root.horizontalLayout);\n\t\t\t\tstartLabel.setAll({ y: p100, x: undefined, centerY: p100, centerX: p100 });\n\t\t\t\tendLabel.setAll({ y: 0, x: undefined, centerY: 0, centerX: p100 });\n\t\t\t\tlabelContainer.setAll({ height: p100, width: undefined });\n\t\t\t\tif (tooltip) {\n\t\t\t\t\ttooltip.set(\"pointerOrientation\", \"horizontal\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.markerContainer.setAll({ layout: this._root.horizontalLayout, width: p100 });\n\t\t\t\tthis.set(\"layout\", this._root.verticalLayout);\n\t\t\t\tstartLabel.setAll({ x: 0, y: undefined, centerX: 0, centerY: 0 });\n\t\t\t\tendLabel.setAll({ x: p100, y: undefined, centerX: p100, centerY: 0 });\n\t\t\t\tlabelContainer.setAll({ width: p100, height: undefined });\n\t\t\t\tif (tooltip) {\n\t\t\t\t\ttooltip.set(\"pointerOrientation\", \"vertical\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"stepCount\")) {\n\t\t\tconst stepCount = this.get(\"stepCount\", 1);\n\t\t\tconst startColor = this.get(\"startColor\")!;\n\t\t\tconst endColor = this.get(\"endColor\")!;\n\t\t\tthis.markerContainer.children.clear();\n\t\t\tif (stepCount > 1) {\n\t\t\t\tfor (let i = 0; i < stepCount; i++) {\n\t\t\t\t\tconst marker = this.makeMarker();\n\n\t\t\t\t\tif (orientation == \"vertical\") {\n\t\t\t\t\t\tthis.markerContainer.children.moveValue(marker, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.markerContainer.children.push(marker);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (startColor && endColor) {\n\t\t\t\t\t\tmarker.set(\"fill\", Color.interpolate(i / stepCount, startColor, endColor));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (stepCount == 1) {\n\t\t\t\tconst marker = this.makeMarker();\n\t\t\t\tthis.markerContainer.children.push(marker);\n\t\t\t\tconst gradient = LinearGradient.new(this._root, { stops: [{ color: startColor }, { color: endColor }] });\n\n\t\t\t\tif (orientation == \"vertical\") {\n\t\t\t\t\tgradient.set(\"rotation\", 90);\n\t\t\t\t\tlet stops = gradient.get(\"stops\");\n\t\t\t\t\tif (stops) {\n\t\t\t\t\t\tstops.reverse();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tgradient.set(\"rotation\", 0);\n\t\t\t\t}\n\t\t\t\tif (startColor && endColor) {\n\t\t\t\t\tmarker.set(\"fillGradient\", gradient);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDirty(\"startText\") || this.isDirty(\"startValue\")) {\n\t\t\tstartLabel.set(\"text\", this.get(\"startText\", this.getNumberFormatter().format(this.get(\"startValue\", 0))));\n\t\t}\n\n\t\tif (this.isDirty(\"endText\") || this.isDirty(\"endValue\")) {\n\t\t\tendLabel.set(\"text\", this.get(\"endText\", this.getNumberFormatter().format(this.get(\"endValue\", 1))))\n\t\t}\n\t}\n}\n","import type { DataItem } from \"../../core/render/Component\";\nimport type { Entity, IEntitySettings } from \"../../core/util/Entity\";\nimport type { Color } from \"../../core/util/Color\";\n\nimport { Series, ISeriesSettings, ISeriesDataItem, ISeriesPrivate } from \"./Series\";\nimport { Container } from \"../../core/render/Container\";\nimport { Label } from \"../../core/render/Label\";\nimport { RoundedRectangle } from \"../../core/render/RoundedRectangle\";\nimport { Rectangle } from \"../../core/render/Rectangle\";\nimport { Template } from \"../../core/util/Template\";\nimport { ListTemplate } from \"../../core/util/List\";\n\nimport * as $utils from \"../../core/util/Utils\";\n\nexport interface ILegendDataItem extends ISeriesDataItem {\n\n\t/**\n\t * [[Container]] element holding all other legend item elements, labels,\n\t * markers, etc.\n\t */\n\titemContainer: Container;\n\n\t/**\n\t * Marker element.\n\t */\n\tmarker: Container;\n\n\t/**\n\t * Marker rectangle element.\n\t */\n\tmarkerRectangle: RoundedRectangle;\n\n\t/**\n\t * Label element.\n\t */\n\tlabel: Label;\n\n\t/**\n\t * Value label element.\n\t */\n\tvalueLabel: Label;\n\n\t/**\n\t * Marker fill color.\n\t */\n\tfill?: Color;\n\n\t/**\n\t * Marker stroke (outline) color.\n\t */\n\tstroke?: Color;\n\n\t/**\n\t * Name of the legend item.\n\t */\n\tname?: string;\n\n}\n\nexport interface ILegendItemSettings extends IEntitySettings {\n\tvisible?: boolean;\n}\n\n/**\n * @ignore\n */\nexport interface ILegendItem extends Entity {\n\t_settings: ILegendItemSettings;\n\tisHidden?: () => boolean;\n\tshow?: () => void;\n\thide?: () => void;\n\tcreateLegendMarker?: () => {}\n\tcomponent?: Series;\n\t// how to define that properties of dataItem should have legendDataItem?\n}\n\n//type ILegendDataItemSettings = { [K in keyof ILegendDataItem]?: string; };\n\nexport interface ILegendSettings extends ISeriesSettings {\n\n\t/**\n\t * If set to `true` the legend will not try to mimic appearance of the actual\n\t * item but rather show default square marker.\n\t *\n\t * @default false\n\t */\n\tuseDefaultMarker?: boolean;\n\n\t/**\n\t * A key to look up in data for a name of the data item.\n\t *\n\t */\n\tnameField?: string;\n\n\t/**\n\t * A key to look up in data for a fill of the data item.\n\t *\n\t */\n\tfillField?: string;\n\n\t/**\n\t * A key to look up in data for a stroke of the data item.\n\t *\n\t */\n\tstrokeField?: string;\n\n\t/**\n\t * Which legend item element will be clickable to toggle related chart item:\n\t * * `\"itemContainer\"` - the whole legend item (default).\n\t * * `\"marker\"` - legend item marker.\n\t * * `\"none\"` - disables toggling of legend item.\n\t *\n\t * @default \"itemContainer\"\n\t * @since 5.0.13\n\t */\n\tclickTarget?: \"itemContainer\" | \"marker\" | \"none\"\n\n}\n\nexport interface ILegendPrivate extends ISeriesPrivate {\n}\n\n/**\n * A universal legend control.\n *\n * @important\n * @see {@link https://www.amcharts.com/docs/v5/concepts/legend/} for more info\n */\nexport class Legend extends Series {\n\tprotected _afterNew() {\n\t\tthis._settings.themeTags = $utils.mergeTags(this._settings.themeTags, [\"legend\"]);\n\t\tthis.fields.push(\"name\", \"stroke\", \"fill\");\n\t\tsuper._afterNew();\n\t}\n\n\tpublic static className: string = \"Legend\";\n\tpublic static classNames: Array = Series.classNames.concat([Legend.className]);\n\n\tdeclare public _settings: ILegendSettings;\n\tdeclare public _privateSettings: ILegendPrivate;\n\tdeclare public _dataItemSettings: ILegendDataItem;\n\n\t/**\n\t * List of all [[Container]] elements for legend items.\n\t *\n\t * @default new ListTemplate\n\t */\n\tpublic readonly itemContainers: ListTemplate = new ListTemplate(\n\t\tTemplate.new({}),\n\t\t() => Container._new(this._root, {\n\t\t\tthemeTags: $utils.mergeTags(this.itemContainers.template.get(\"themeTags\", []), [\"legend\", \"item\"]),\n\t\t\tthemeTagsSelf: $utils.mergeTags(this.itemContainers.template.get(\"themeTagsSelf\", []), [\"itemcontainer\"]),\n\t\t\tbackground: Rectangle.new(this._root, {\n\t\t\t\tthemeTags: $utils.mergeTags(this.itemContainers.template.get(\"themeTags\", []), [\"legend\", \"item\", \"background\"]),\n\t\t\t\tthemeTagsSelf: $utils.mergeTags(this.itemContainers.template.get(\"themeTagsSelf\", []), [\"itemcontainer\"])\n\t\t\t})\n\t\t}, [this.itemContainers.template])\n\t);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic makeItemContainer(dataItem: DataItem): Container {\n\t\tconst itemContainer = this.children.push(this.itemContainers.make());\n\t\titemContainer._setDataItem(dataItem);\n\t\tthis.itemContainers.push(itemContainer);\n\t\titemContainer.states.create(\"disabled\", {});\n\t\treturn itemContainer;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic makeMarker(): Container {\n\t\tconst marker = this.markers.make();\n\t\tthis.markers.push(marker);\n\t\tmarker.states.create(\"disabled\", {});\n\t\treturn marker;\n\t}\n\n\t/**\n\t * List of legend marker elements.\n\t *\n\t * @default new ListTemplate\n\t */\n\tpublic readonly markers: ListTemplate = new ListTemplate(\n\t\tTemplate.new({}),\n\t\t() => Container._new(this._root, {\n\t\t\tthemeTags: $utils.mergeTags(this.markers.template.get(\"themeTags\", []), [\"legend\", \"marker\"])\n\t\t}, [this.markers.template])\n\t);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic makeLabel(): Label {\n\t\tconst label = this.labels.make();\n\t\tlabel.states.create(\"disabled\", {});\n\t\treturn label;\n\t}\n\n\t/**\n\t * List of legend label elements.\n\t *\n\t * @default new ListTemplate {\n\n\t/**\n\t * A reference to original [[XMLHttpRequest]].\n\t */\n\txhr: XMLHttpRequest;\n\n\t/**\n\t * Request response body.\n\t */\n\tresponse?: string;\n\n\t/**\n\t * Request response as Blob. (if set `responseType = \"blob\"`)\n\t */\n\tblob?: Blob;\n\n\t/**\n\t * Response `Content-Type`.\n\t */\n\ttype: string | null;\n\n\t/**\n\t * Was there an error?\n\t */\n\terror: boolean;\n\n\t/**\n\t * A target object that made the net load request.\n\t */\n\ttarget?: A;\n\n}\n\nexport interface INetRequestOptions {\n\n\t/**\n\t * Custom request headers to be added to HTTP(S) request.\n\t */\n\trequestHeaders?: { key: string, value: string }[];\n\n\t/**\n\t * Specify expected response type.\n\t *\n\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType} for more info\n\t */\n\tresponseType?: XMLHttpRequestResponseType;\n\n\t/**\n\t * Specify whether to send CORS credentials (defaults to `false`).\n\t *\n\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials} for more info\n\t */\n\twithCredentials?: boolean;\n}\n\n/**\n * Loads an external file via its URL.\n *\n * Please note that this is an asynchronous function.\n *\n * It will not return the result, but rather a `Promise`.\n *\n * You can use the `await` notion, or `then()`.\n *\n * ```TypeScript\n * // Using await\n * let response = await Net.load( \"http://www.my.com/data.json\" );\n * console.log( response.response );\n *\n * // Using then()\n * Net.load( \"http://www.my.com/data.json\" ).then( ( response ) => {\n * console.log( response.response );\n * } );\n * ```\n * ```JavaScript\n * // Using then()\n * Net.load( \"http://www.my.com/data.json\" ).then( function( response ) {\n * console.log( response.response );\n * } );\n * ```\n *\n * @async\n * @see {@link https://www.amcharts.com/docs/v5/concepts/data/net-load-utility/} for more info\n * @param url URL for the file to load\n * @param target A target element that is requesting the net load\n * @param options Request options\n * @return Result (Promise)\n */\nexport function load(url: string, target?: A, options?: INetRequestOptions): Promise> {\n\treturn new Promise>((success, error) => {\n\n\t\t// Is return type Blob?\n\t\tlet isBlob = options != null && options.responseType == \"blob\";\n\n\t\t// Create request and set up handlers\n\t\tlet xhr = new XMLHttpRequest();\n\t\txhr.onload = () => {\n\t\t\tif (xhr.status === 200) {\n\n\t\t\t\tlet response: Optional;\n\t\t\t\tlet blob: Optional;\n\n\t\t\t\tif (isBlob) {\n\t\t\t\t\tblob = xhr.response;\n\t\t\t\t\treadBlob(blob!).then((response: any) => {\n\t\t\t\t\t\tlet output: INetLoadResult = {\n\t\t\t\t\t\t\txhr: xhr,\n\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\tresponse: response,\n\t\t\t\t\t\t\tblob: blob,\n\t\t\t\t\t\t\ttype: xhr.getResponseHeader(\"Content-Type\"),\n\t\t\t\t\t\t\ttarget: target\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsuccess(output);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresponse = xhr.responseText || xhr.response\n\t\t\t\t}\n\n\t\t\t\tlet output: INetLoadResult = {\n\t\t\t\t\txhr: xhr,\n\t\t\t\t\terror: false,\n\t\t\t\t\tresponse: response,\n\t\t\t\t\tblob: blob,\n\t\t\t\t\ttype: xhr.getResponseHeader(\"Content-Type\"),\n\t\t\t\t\ttarget: target\n\t\t\t\t};\n\t\t\t\tsuccess(output);\n\t\t\t}\n\t\t\telse {\n\t\t\t\terror({\n\t\t\t\t\txhr: xhr,\n\t\t\t\t\terror: true,\n\t\t\t\t\ttype: xhr.getResponseHeader(\"Content-Type\"),\n\t\t\t\t\ttarget: target\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\txhr.onerror = () => {\n\t\t\terror({\n\t\t\t\txhr: xhr,\n\t\t\t\terror: true,\n\t\t\t\ttype: xhr.getResponseHeader(\"Content-Type\"),\n\t\t\t\ttarget: target\n\t\t\t});\n\t\t};\n\n\t\t// Open request\n\t\txhr.open(\"GET\", url, true);\n\n\t\tif (options && options.withCredentials) {\n\t\t\txhr.withCredentials = true;\n\t\t}\n\n\t\t// Process options\n\t\tif (options != null) {\n\n\t\t\tif (options.requestHeaders != null) {\n\t\t\t\tfor (let i = 0; i < options.requestHeaders.length; i++) {\n\t\t\t\t\tlet header = options.requestHeaders[i];\n\t\t\t\t\txhr.setRequestHeader(header.key, header.value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options.responseType != null) {\n\t\t\t\txhr.responseType = options.responseType;\n\t\t\t}\n\t\t}\n\n\t\t// Send request\n\t\txhr.send();\n\n\t});\n\n}\n\n/**\n * Returns textual representation of a Blob object.\n *\n * @param blob Target blob\n * @return Text promise\n */\nexport function readBlob(blob: Blob): Promise {\n\treturn new Promise((success, error) => {\n\t\tconst reader = new FileReader()\n\n\t\treader.onload = _event => {\n\t\t\tsuccess(reader.result);\n\t\t}\n\n\t\treader.onerror = (e) => {\n\t\t\terror(e);\n\t\t}\n\n\t\treader.readAsText(blob);\n\t});\n}\n","import fixPolyfills from \"./polyfill\";\nimport \"./core-js.js\";\nimport \"regenerator-runtime/runtime\";\nimport * as m from \"./../../dist/es2015/index.js\";\n\nexport const am5 = m;\n\n// TODO move all of this code into a different module and then import it\nfunction getCurrentScript() {\n\tif (document.currentScript) {\n\t\treturn document.currentScript;\n\n\t// Internet Explorer only\n\t} else {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\treturn scripts[scripts.length - 1];\n\t}\n}\n\nfunction dirpath(x) {\n\treturn /(.*\\/)[^\\/]*$/.exec(x)[1];\n}\n\n__webpack_public_path__ = dirpath(getCurrentScript().src);\n\nfixPolyfills();\n"],"sourceRoot":""}