{"version":3,"sources":["webpack:///./node_modules/@progress/kendo-ui/js/dataviz/core/kendo-core.js","webpack:///./node_modules/@progress/kendo-ui/js/dataviz/core/core.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","id","loaded","call","m","c","p","0","3","Error","892","895","899","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","f","define","apply","undefined","$","window","kendo","dataviz","drawing","util","Path","Group","Class","geometry","Rect","Circle","geometryTransform","transform","Segment","deepExtend","isFunction","__common_getter_js","getter","ARC","AXIS_LABEL_CLICK","BLACK","BOTTOM","CENTER","CIRCLE","COORD_PRECISION","CROSS","DATE","DEFAULT_FONT","DEFAULT_HEIGHT","DEFAULT_PRECISION","DEFAULT_WIDTH","END","FORMAT_REGEX","HEIGHT","HIGHLIGHT_ZINDEX","INSIDE","LEFT","MAX_VALUE","Number","MIN_VALUE","NONE","NOTE_CLICK","NOTE_HOVER","NOTE_LEAVE","OBJECT","OUTSIDE","RIGHT","ROUNDED_RECT","START","STRING","TOP","TRIANGLE","VALUE","WHITE","WIDTH","X","Y","DEFAULT_SERIES_OPACITY","constants","isArray","value","Array","addClass","element","classes","classArray","idx","length","className","indexOf","SPACE_REGEX","removeClass","replace","alignPathToPixel","path","offset","options","stroke","defined","width","i","segments","anchor","round","translate","clockwise","angle1","angle2","x","y","isNumber","isNaN","isString","convertableToNumber","isFinite","isObject","styleValue","SIZE_STYLES_REGEX","isSizeField","field","test","elementStyles","styles","stylesArray","result","style","getComputedStyle","parseFloat","field$1","getSpacing","defaultSpacing","spacing","top","right","bottom","left","defaultImplementation","format","toString","parseDate","Date","firstDay","current","IntlService","extend","register","userImplementation","Object","defineProperties","implementation","get","FORMAT_REPLACE_REGEX","FormatService","init","intlService","this","_intlService","auto","formatString","values","len","arguments","intl","match","concat","localeAuto","locale","index","placeholderFormat","parseInt","substring","fn","set","current$1","ChartService","chart","context","sender","rtl","Boolean","notify","name","args","trigger","isPannable","axis","pannable","lock","DomEventsBuilder","create","events","current$2","compile","template","TemplateService","services","getTemplate","content","grep","array","callback","push","hasClasses","classNames","names","split","HashMap","_map","inArray","interpolateValue","start","end","progress","prototype","_key","getTime","TRIGGER","InstanceObserver","observer","handlers","handlerMap","isDefaultPrevented","ref","callObserver","fnName","requiresHandlers","this$1","map","mousewheelDelta","e","delta","wheelDelta","Math","ceil","floor","detail","append","bindEvents","deg","elementOffset","elementSize","eventElement","eventCoordinates","last","limitValue","objectKey","rad","unbindEvents","valueOrDefault","FontLoader","setDefaultOptions","type","proto","sparseArrayLimits","arr","min","max","find","predicate","item","fetchFonts","fonts","state","depth","MAX_DEPTH","document","keys","forEach","key","loadFonts","promises","font","load","logToConsole","Promise","all","then","preloadFonts","Matrix","matrixRegexp","parseMatrix","matrixString","unit","members","Function","bind","transformMatrix","elementScale","matrix","parent","parentElement","parentMatrix","multiplyCopy","b","autoTextColor","color","isDark","Color","DELETED","LegacySet","_index","_values","slice","filter","has","add","delete","clear","size","SetWrapper","_set","Set","from","supportsSet","supported","createHashSet","autoMajorUnit","diff","abs","scale","pow","log","relativeValue","scaleMultiplier","Point","clone","equals","point","rotate","center","degrees","theta","cosT","cos","sinT","sin","cx","cy","multiply","a","distanceTo","dx","dy","sqrt","onCircle","angle","radius","radians","Box","x1","y1","x2","y2","box","height","move","wrap","targetBox","wrapPoint","arrayPoint","snapTo","alignTo","targetCenter","shrink","dw","dh","expand","pad","padding","unpad","containsPoint","points","getHash","join","overlaps","rotation","r1","rotatePoint","r2","r3","r4","toRect","hasSize","align","alignment","c1","c2","sizeFunc","Ring","innerRadius","startAngle","middle","setRadius","newRadius","radianAngle","ax","ay","adjacentBox","distance","sector","midAndle","midPoint","hw","hh","sa","ca","endAngle","vector","startPoint","startVector","endPoint","endVector","dist","getBBox","angles","allAngles","sort","numericComparer","startAngleIndex","endAngleIndex","Sector","DIRECTION_ANGLE","ShapeBuilder","createRing","arc","Arc","radiusX","radiusY","fromArc","close","innerEnd","pointAt","lineTo","ChartElement","children","initUserOptions","reflow","currentChild","destroy","animation","getRoot","getSender","service","getService","chartService","translateChildren","childrenCount","arguments$1","renderVisual","visible","createVisual","addVisual","renderChildren","createAnimation","renderComplete","visual","chartElement","appendVisual","zIndex","Animation","childVisual","noclip","clipRoot","stackRoot","stackVisual","isStackRoot","pos","visuals","sibling","here","insert","traverse","child","closest","matched","hasHighlight","highlight","createHighlight","toggleHighlight","show","opacity","customVisual","_highlight","highlightOptions","fill","highlightVisualArgs","series","dataItem","category","percentage","runningTotal","total","createGradientOverlay","gradientOptions","overlay","createGradient","closed","elements","supportsPointInactiveOpacity","BoxElement","margin","shrinkToFit","hasSetSize","borderWidth","border","reflowPaddingBox","vAlign","paddingBox","contentBox","hasBox","background","fromRect","visualStyle","dashType","cursor","ShapeElement","pointData","getElement","halfWidth","halfHeight","fromPoints","MultiPath","moveTo","rect","borderRadius","setCornerRadius","createElement","visualOptions","LINEAR","RADIAL","GRADIENTS","glass","stops","sharpBevel","roundedBevel","roundedGlass","supportVML","sharpGlass","bubbleShadow","boxDiff","r","s","d","g","h","boxes","RootElement","rootOptions","gradients","currentBox","createBackground","drawingGradient","hashCode","gradient","LinearGradient","innerRadialStops","RadialGradient","cleanGradients","_observers","usedSpace","currentStops","currentStop","FloatElement","_initDirection","vertical","groupAxis","elementAxis","groupSizeField","elementSizeField","groupSpacing","elementSpacing","vSpacing","reflowChildren","ref$1","groupOptions","groups","groupsSize","maxGroupElementsSize","groupsCount","groupsStart","alignStart","groupStart","groupIdx","group","groupElements","elementStart","groupElementsCount","elementSize$$1","groupElementStart","groupSize","elementBox","maxSize","groupElementsSize","DrawingText","Text","measureText","baseline","topLeft","rectToBox","origin","bottomRight","ROWS_SPLIT_REGEX","TextBox","data","_initContainer","_autoReflow","rows","String","floatElement","textOptions","container","rowIdx","text","trim","visualFn","_boxReflow","visualBox","visualContext","clippedBBox","normalBox","rotatedBox","rotationTransform","getDefaultVisual","boxCenter","Title","position","buildTitle","defaultOptions","title","titleOptions","AxisLabel","culture","click","widget","alignRotation","bbox","rotationMatrix","rotationOrigin","alignAxis","distanceAxis","axisAnchor","transformCopy","topRight","bottomLeft","alignEnd","distanceLeft","distanceRight","alignCenter","DEFAULT_ICON_SIZE","DEFAULT_LABEL_COLOR","Note","fields","render","hide","label","icon","childAlias","noteTemplate","aliasFor","marker","wrapperBox","lineStart","line","linePoints","createLine","defaultVisual","eventArgs","preventDefault","over","out","createAxisTick","tickOptions","tickX","tickY","tick","createAxisGridLine","gridLine","lineEnd","Axis","labels","majorTickSize","minorTickSize","minorTicks","minorTickType","majorTicks","majorTickType","initFields","_deferLabels","createLabels","createTitle","createNotes","labelsRange","skip","labelsCount","normalizeLabelRotation","labelOptions","step","clearLabels","autoRotateLabels","range","labelContext","count","createAxisLabel","clearTitle","lineBox","mirror","axisX","axisY","lineWidth","visualSize","notes","items","parseNoteValue","note","reverse","createPlotBands","gridLinesVisual","gridLines","_gridLines","createTicks","lineGroup","majorUnit","tickLineOptions","tickPositions","skipUnit","getMajorTickPositions","getMinorTickPositions","minorUnit","_alignLines","_lineGroup","getActualTickSize","tickSize","_backgroundPath","plotBands","plotArea","_plotbandGroup","altAxis","pane","axes","slotX","slotY","getSlot","to","createPlotBandLabel","bandRect","textbox","labelTemplate","createGridLines","minorGridLines","majorGridLines","axisLineVisible","linePos","lineOptions","sizeFn","titleSize","space","rootBox","boxSize","maxLabelSize","labelSize","arrangeTitle","arrangeLabels","arrangeNotes","getLabelsTickPositions","labelTickIndex","labelsBetweenTicks","tickIx","firstTickPosition","nextTickPosition","positionStart","positionEnd","positionLabel","labelBox","labelOffset","labelX","labelY","autoRotateLabelAngle","slotWidth","limit","labelAngle","idx$1","slot","shouldRenderNote","noteSlot","secondAxis","axisLabelText","tmpl","defaultText","templateContext","maxLabelOffset","lastLabel","offsetField","startPosition","endPosition","maxStartOffset","maxEndOffset","startTick","endTick","limitRange","rangeSize","minValue","maxValue","valueRange","seriesMin","seriesMax","justified","prepareUserOptions","axisCrossingValue","MILLISECONDS","SECONDS","MINUTES","HOURS","DAYS","WEEKS","MONTHS","YEARS","TIME_PER_MILLISECOND","TIME_PER_SECOND","TIME_PER_MINUTE","TIME_PER_HOUR","TIME_PER_DAY","TIME_PER_WEEK","TIME_PER_MONTH","TIME_PER_YEAR","TIME_PER_UNIT","absoluteDateDiff","offsetDiff","getTimezoneOffset","addTicks","date","ticks","toDate","startOfWeek","weekStartDay","daysToSubtract","day","getDay","adjustDST","hours","getHours","setHours","addHours","roundedDate","setMinutes","tzDiff","addDuration","dateValue","getFullYear","getMonth","getDate","getSeconds","setSeconds","getMilliseconds","setMilliseconds","floorDate","ceilDate","dateComparer","dateDiff","toTime","dateEquals","timeIndex","baseUnit","dateIndex","baseUnitStep","startDate","duration","lteDateIndex","sortedDates","low","high","currentDate","parseDates","dates","MIN_CATEGORY_POINTS_RANGE","CategoryAxis","_ticks","categoriesHash","copy","categories","srcCategories","definedMin","definedMax","rangeIndices","totalRange","totalRangeIndices","roundedRange","_seriesMax","scaleOptions","hideOutOfRangeLabels","valueAxis","firstLabel","getTicks","labelTicks","tickIndices","stepSize","indices","getTickPositions","positions","cache","hash","_hash","hasMinor","filterOutOfRangePositions","inRange","startIndex","endIndex","slotBox","singleSlot","p1","p2","limitSlot","limittedSlot","categoryIndex","pointCategoryIndex","startValue","getCategory","totalIndex","categoryAt","categoriesCount","translateRange","zoomRange","rate","totalMin","totalMax","scaleRange","dataItems","hideOutOfRangeNotes","pan","pointsRange","diffStart","diffEnd","rangeMin","rangeMax","_categoriesMap","currentRangeIndices","totalCount","mapCategories","map$$1","COORDINATE_LIMIT","DateLabelFormats","milliseconds","seconds","minutes","days","weeks","months","years","ZERO_THRESHOLD","AUTO","BASE_UNITS","FIT","categoryRange","_range","EmptyDateRange","displayIndices","displayRange","valueIndex","valuesCount","dateAt","DateRange","roundToBaseUnit","lowerEnd","roundToTotalStep","expandEnd","justifyEnd","valueStart","displayStart","next","valueEnd","displayEnd","_indices","minIdx","maxIdx","last$$1","upper","roundedStep","autoBaseUnit","startUnit","startStep","unitSteps","nextStep","categoryLimits","span","autoBaseUnitSteps","maxDateGroups","autoUnit","autoUnitIx","units","totalUnits","shift","defaultBaseUnit","lastCategory","minDiff","categoryIx","initUnit","toLowerCase","useDefault","DateCategoryAxis","dataRange","_parsed","panning","userSetBaseUnit","userSetBaseUnitStep","maxDivisions","divisionOptions","dataRangeOptions","divisionRange","rangeLabels","splice","rounds","isEmpty","totalLimits","panRange","datesRange","indicesRange","fit","autoBaseUnitStep","maxDiff","rangeDiff","baseUnitIndex","stepIndex","createRangeLabels","arrangeRangeLabels","position$1","autoRotateRangeLabels","hideOverlappingLabels","firstRangeLabel","clip","lastRangeLabel","i$1","overlaps$1","rangeLabel","unitFormat","dateFormats","createLabel","startText","endText","rotateLabel","dateRange","autoAxisMin","narrow","axisMin","autoAxisMax","axisMax","limitCoordinate","MIN_VALUE_RANGE","NumericAxis","autoOptions","autoAxisOptions","totalOptions","totalAxisOptions","axisOptions","totalMajorUnit","getDivisions","stepValue","lineSize","divisions","dir","startEdge","skipStep","getValue","valueOffset","endValue","isValidRange","newRange","narrowRange","autoMin","autoMax","roundToMajorUnit","remainderClose","clearNullValues","userOptions","userSetMin","userSetMax","userSetLimits","divisor","ratio","remainder","threshold","DateValueAxis","axisCrossingValues","applyDefaults","timeRange","exact","limittedRange","timeUnits","baseUnitTime","userMajorUnit","actualUnits","unitsToAdd","head","tail","DEFAULT_MAJOR_UNIT","LogarithmicAxis","base","autoAxisMax$1","autoAxisMin$1","initRange","logMin","logMax","floorMax","traverseMajorTicksPositions","tickPosition","traverseMinorTicksPositions","_lineOptions","power","ref$2","minorOptions","_minorIntervalOptions","minorStep","acceptOptionsRange","acceptNewRange","nextValue","difference","throwNegativeValuesError","logMaxRemainder","GridLinesMixin","majorAngles","minorAngles","skipMajor","majorGridLineAngles","renderMajorGridLines","minorGridLineAngles","renderMinorGridLines","renderGridLines","radiusCallback","circle","gridLineAngles","skipAngles","divs","intervals","altAxisVisible","alpha","intervalAngle","RadarCategoryAxis","reflowLabels","measureBox","skipOption","stepOption","divCount","divAngle","majorIntervals","minorIntervals","interval","minorAngle","minorRadius","band","plotBandSlot","ring","totalDivs","slotAngle","fromValue","slotStart","toValue","slots","PolarAxis","instanceOptions","tmp","atan2","PI","RadarNumericAxisMixin","polarAxis","bandStyle","shape","plotBandPoints","innerPoints","outerPoints","innerCircle","outerCircle","radarMajorGridLinePositions","radarMinorGridLinePositions","tickRadius","angleIx","angularDistance","midAngle","gamma","beta","axisType","RadarNumericAxis","minorSkipStep","RadarLogarithmicAxis","WEIGHT","EXTREMUM_ALLOWED_DEVIATION","CurveProcessor","process","dataPoints","removeDuplicates","initialControlPoint","lastControlPoint","p0","pop","tangent","controlOut","firstControlPoint","secondControlPoint","controlPoints","tangent$1","cp0","controlPoints$1","cp1","controlPoints$2","tangent$2","invertAxis","lineFunction","calculateFunction","isLine","xField","yField","restrict","switchOrientation","sign","monotonic","isMonotonicByField","numberSign","oldXField","restrictControlPoint","cp","p3","t1","t2","xValue","yValue","controlPoint","Gradients","jQuery","897","draw","SASS_THEMES","ExportMixin","skipLegacy","exportVisual","exportSVG","exportImage","exportPDF","svg","imageDataURL","Surface","exportGroup","support","canvas","css","display","appendTo","body","surface","image","_rootElement","toDataURL","remove","calendars","standard","Point2D","Box2D","mwDelta","originalEvent","898"],"mappings":"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","file":"js/chunk-vendors~ffda2946.2b3fa055.js","sourcesContent":["module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(899);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 892:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.drawing\");\n\n/***/ }),\n\n/***/ 895:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.core\");\n\n/***/ }),\n\n/***/ 899:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/***********************************************************************\n\t * WARNING: this file is auto-generated. If you change it directly,\n\t * your modifications will eventually be lost. The source code is in\n\t * `kendo-charts` repository, you should make your changes there and\n\t * run `src-modules/sync.sh` in this repository.\n\t */\n\t(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(895),\n\t __webpack_require__(892)\n\t ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\t(function ($) {\n\t/* jshint curly:false */\n\t/* jshint -W058 */\n\n\twindow.kendo.dataviz = window.kendo.dataviz || {};\n\tvar drawing = kendo.drawing;\n\tvar util = drawing.util;\n\tvar Path = drawing.Path;\n\tvar Group = drawing.Group;\n\tvar Class = kendo.Class;\n\tvar geometry = kendo.geometry;\n\tvar Rect = geometry.Rect;\n\tvar Circle = geometry.Circle;\n\tvar geometryTransform = geometry.transform;\n\tvar Segment = geometry.Segment;\n\tvar dataviz = kendo.dataviz;\n\n\tvar deepExtend = kendo.deepExtend;\n\tvar isFunction = kendo.isFunction;\n\tvar __common_getter_js = kendo.getter;\n\n\tvar ARC = \"arc\";\n\tvar AXIS_LABEL_CLICK = \"axisLabelClick\";\n\tvar BLACK = \"#000\";\n\tvar BOTTOM = \"bottom\";\n\tvar CENTER = \"center\";\n\tvar CIRCLE = \"circle\";\n\tvar COORD_PRECISION = 3;\n\tvar CROSS = \"cross\";\n\tvar DATE = \"date\";\n\tvar DEFAULT_FONT = \"12px sans-serif\";\n\tvar DEFAULT_HEIGHT = 400;\n\tvar DEFAULT_PRECISION = 10;\n\tvar DEFAULT_WIDTH = 600;\n\tvar END = \"end\";\n\tvar FORMAT_REGEX = /\\{\\d+:?/;\n\tvar HEIGHT = \"height\";\n\tvar HIGHLIGHT_ZINDEX = 100;\n\tvar INSIDE = \"inside\";\n\tvar LEFT = \"left\";\n\tvar MAX_VALUE = Number.MAX_VALUE;\n\tvar MIN_VALUE = -Number.MAX_VALUE;\n\tvar NONE = \"none\";\n\tvar NOTE_CLICK = \"noteClick\";\n\tvar NOTE_HOVER = \"noteHover\";\n\tvar NOTE_LEAVE = \"noteLeave\";\n\tvar OBJECT = \"object\";\n\tvar OUTSIDE = \"outside\";\n\tvar RIGHT = \"right\";\n\tvar ROUNDED_RECT = \"roundedRect\";\n\tvar START = \"start\";\n\tvar STRING = \"string\";\n\tvar TOP = \"top\";\n\tvar TRIANGLE = \"triangle\";\n\tvar VALUE = \"value\";\n\tvar WHITE = \"#fff\";\n\tvar WIDTH = \"width\";\n\tvar X = \"x\";\n\tvar Y = \"y\";\n\tvar DEFAULT_SERIES_OPACITY = 1;\n\n\tvar constants = {\n\t\tARC: ARC,\n\t\tAXIS_LABEL_CLICK: AXIS_LABEL_CLICK,\n\t\tBLACK: BLACK,\n\t\tBOTTOM: BOTTOM,\n\t\tCENTER: CENTER,\n\t\tCIRCLE: CIRCLE,\n\t\tCOORD_PRECISION: COORD_PRECISION,\n\t\tCROSS: CROSS,\n\t\tDATE: DATE,\n\t\tDEFAULT_FONT: DEFAULT_FONT,\n\t\tDEFAULT_HEIGHT: DEFAULT_HEIGHT,\n\t\tDEFAULT_PRECISION: DEFAULT_PRECISION,\n\t\tDEFAULT_WIDTH: DEFAULT_WIDTH,\n\t\tEND: END,\n\t\tFORMAT_REGEX: FORMAT_REGEX,\n\t\tHEIGHT: HEIGHT,\n\t\tHIGHLIGHT_ZINDEX: HIGHLIGHT_ZINDEX,\n\t\tINSIDE: INSIDE,\n\t\tLEFT: LEFT,\n\t\tMAX_VALUE: MAX_VALUE,\n\t\tMIN_VALUE: MIN_VALUE,\n\t\tNONE: NONE,\n\t\tNOTE_CLICK: NOTE_CLICK,\n\t\tNOTE_HOVER: NOTE_HOVER,\n\t\tNOTE_LEAVE: NOTE_LEAVE,\n\t\tOBJECT: OBJECT,\n\t\tOUTSIDE: OUTSIDE,\n\t\tRIGHT: RIGHT,\n\t\tROUNDED_RECT: ROUNDED_RECT,\n\t\tSTART: START,\n\t\tSTRING: STRING,\n\t\tTOP: TOP,\n\t\tTRIANGLE: TRIANGLE,\n\t\tVALUE: VALUE,\n\t\tWHITE: WHITE,\n\t\tWIDTH: WIDTH,\n\t\tX: X,\n\t\tY: Y,\n\t\tDEFAULT_SERIES_OPACITY: DEFAULT_SERIES_OPACITY\n\t};\n\n\tfunction isArray(value) {\n\t return Array.isArray(value);\n\t}\n\n\tfunction addClass(element, classes) {\n\t var classArray = isArray(classes) ? classes : [ classes ];\n\n\t for (var idx = 0; idx < classArray.length; idx++) {\n\t var className = classArray[idx];\n\t if (element.className.indexOf(className) === -1) {\n\t element.className += \" \" + className;\n\t }\n\t }\n\t}\n\n\tvar SPACE_REGEX = /\\s+/g;\n\n\tfunction removeClass(element, className) {\n\t if (element && element.className) {\n\t element.className = element.className.replace(className, \"\").replace(SPACE_REGEX, \" \");\n\t }\n\t}\n\n\tfunction alignPathToPixel(path) {\n\t var offset = 0.5;\n\t if (path.options.stroke && kendo.drawing.util.defined(path.options.stroke.width)) {\n\t if (path.options.stroke.width % 2 === 0) {\n\t offset = 0;\n\t }\n\t }\n\n\t for (var i = 0; i < path.segments.length; i++) {\n\t path.segments[i].anchor().round(0).translate(offset, offset);\n\t }\n\n\t return path;\n\t}\n\n\tfunction clockwise(angle1, angle2) {\n\t // True if angle2 is clockwise of angle1\n\t // assuming angles grow in clock-wise direction\n\t // (as in the pie and radar charts)\n\t return -angle1.x * angle2.y + angle1.y * angle2.x < 0;\n\t}\n\n\tfunction isNumber(value) {\n\t return typeof value === \"number\" && !isNaN(value);\n\t}\n\n\tfunction isString(value) {\n\t return typeof value === STRING;\n\t}\n\n\tfunction convertableToNumber(value) {\n\t return isNumber(value) || (isString(value) && isFinite(value));\n\t}\n\n\tfunction isObject(value) {\n\t return typeof value === \"object\";\n\t}\n\n\tfunction styleValue(value) {\n\t if (isNumber(value)) {\n\t return value + \"px\";\n\t }\n\t return value;\n\t}\n\n\tvar SIZE_STYLES_REGEX = /width|height|top|left|bottom|right/i;\n\n\tfunction isSizeField(field) {\n\t return SIZE_STYLES_REGEX.test(field);\n\t}\n\n\tfunction elementStyles(element, styles) {\n\t var stylesArray = isString(styles) ? [ styles ] : styles;\n\n\t if (isArray(stylesArray)) {\n\t var result = {};\n\t var style = window.getComputedStyle(element);\n\n\t for (var idx = 0; idx < stylesArray.length; idx++) {\n\t var field = stylesArray[idx];\n\t result[field] = isSizeField(field) ? parseFloat(style[field]) : style[field];\n\t }\n\n\t return result;\n\t } else if (isObject(styles)) {\n\t for (var field$1 in styles) {\n\t element.style[field$1] = styleValue(styles[field$1]);\n\t }\n\t }\n\t}\n\n\tfunction getSpacing(value, defaultSpacing) {\n\t if (defaultSpacing === void 0) { defaultSpacing = 0; }\n\n\t var spacing = { top: 0, right: 0, bottom: 0, left: 0 };\n\n\t if (typeof(value) === \"number\") {\n\t spacing[TOP] = spacing[RIGHT] = spacing[BOTTOM] = spacing[LEFT] = value;\n\t } else {\n\t spacing[TOP] = value[TOP] || defaultSpacing;\n\t spacing[RIGHT] = value[RIGHT] || defaultSpacing;\n\t spacing[BOTTOM] = value[BOTTOM] || defaultSpacing;\n\t spacing[LEFT] = value[LEFT] || defaultSpacing;\n\t }\n\n\t return spacing;\n\t}\n\n\tvar defaultImplementation = {\n\t format: function (format, value) { return value; },\n\n\t toString: function (value) { return value; },\n\n\t parseDate: function (value) { return new Date(value); },\n\n\t firstDay: function () { return 0; }\n\t};\n\n\tvar current = defaultImplementation;\n\n\tvar IntlService = Class.extend({\n\n\t});\n\n\tIntlService.register = function(userImplementation) {\n\t current = userImplementation;\n\t};\n\n\tif (Object.defineProperties) {\n\t Object.defineProperties(IntlService, {\n\t implementation: {\n\t get: function() {\n\t return current;\n\t }\n\t }\n\t });\n\t}\n\n\tvar FORMAT_REPLACE_REGEX = /\\{(\\d+)(:[^\\}]+)?\\}/g;\n\n\tvar FormatService = Class.extend({\n\t init: function(intlService) {\n\t this._intlService = intlService;\n\t },\n\n\t auto: function(formatString) {\n\t var values = [], len = arguments.length - 1;\n\t while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];\n\n\t var intl = this.intl;\n\n\t if (isString(formatString) && formatString.match(FORMAT_REGEX)) {\n\t return intl.format.apply(intl, [ formatString ].concat( values ));\n\t }\n\n\t return intl.toString(values[0], formatString);\n\t },\n\n\t localeAuto: function(formatString, values, locale) {\n\t var intl = this.intl;\n\t var result;\n\n\t if (isString(formatString) && formatString.match(FORMAT_REGEX)) {\n\t result = formatString.replace(FORMAT_REPLACE_REGEX, function(match, index, placeholderFormat) {\n\t var value = values[parseInt(index, 10)];\n\n\t return intl.toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\", locale);\n\t });\n\t } else {\n\t result = intl.toString(values[0], formatString, locale);\n\t }\n\n\t return result;\n\t }\n\t});\n\n\tif (Object.defineProperties) {\n\t Object.defineProperties(FormatService.fn, {\n\t intl: {\n\t get: function() {\n\t return this._intlService || IntlService.implementation;\n\t },\n\t set: function(value) {\n\t this._intlService = value;\n\t }\n\t }\n\t });\n\t}\n\n\tvar ChartService = Class.extend({\n\t init: function(chart, context) {\n\t if (context === void 0) { context = {}; }\n\n\t this._intlService = context.intlService;\n\t this.sender = context.sender || chart;\n\t this.format = new FormatService(context.intlService);\n\t this.chart = chart;\n\t this.rtl = Boolean(context.rtl);\n\t },\n\n\t notify: function(name, args) {\n\t if (this.chart) {\n\t this.chart.trigger(name, args);\n\t }\n\t },\n\n\t isPannable: function(axis) {\n\t var pannable = ((this.chart || {}).options || {}).pannable;\n\t return pannable && pannable.lock !== axis;\n\t }\n\t});\n\n\tif (Object.defineProperties) {\n\t Object.defineProperties(ChartService.fn, {\n\t intl: {\n\t get: function() {\n\t return this._intlService || IntlService.implementation;\n\t },\n\t set: function(value) {\n\t this._intlService = value;\n\t this.format.intl = value;\n\t }\n\t }\n\t });\n\t}\n\n\tvar current$1;\n\n\tvar DomEventsBuilder = Class.extend({\n\n\t});\n\n\tDomEventsBuilder.register = function(userImplementation) {\n\t current$1 = userImplementation;\n\t};\n\n\tDomEventsBuilder.create = function(element, events) {\n\t if (current$1) {\n\t return current$1.create(element, events);\n\t }\n\t};\n\n\tvar current$2 = {\n\t compile: function(template) {\n\t return template;\n\t }\n\t};\n\n\tvar TemplateService = Class.extend({\n\n\t});\n\n\tTemplateService.register = function(userImplementation) {\n\t current$2 = userImplementation;\n\t};\n\n\tTemplateService.compile = function(template) {\n\t return current$2.compile(template);\n\t};\n\n\tvar services = {\n\t\tChartService: ChartService,\n\t\tDomEventsBuilder: DomEventsBuilder,\n\t\tFormatService: FormatService,\n\t\tIntlService: IntlService,\n\t\tTemplateService: TemplateService\n\t};\n\n\tfunction getTemplate(options) {\n\t if (options === void 0) { options = {}; }\n\n\t var template;\n\t if (options.template) {\n\t options.template = template = TemplateService.compile(options.template);\n\t } else if (isFunction(options.content)) {\n\t template = options.content;\n\t }\n\n\t return template;\n\t}\n\n\tfunction grep(array, callback) {\n\t var length = array.length;\n\t var result = [];\n\t for (var idx = 0; idx < length; idx++) {\n\t if (callback(array[idx])) {\n\t result .push(array[idx]);\n\t }\n\t }\n\n\t return result;\n\t}\n\n\tfunction hasClasses(element, classNames) {\n\t if (element.className) {\n\t var names = classNames.split(\" \");\n\t for (var idx = 0; idx < names.length; idx++) {\n\t if (element.className.indexOf(names[idx]) !== -1) {\n\t return true;\n\t }\n\t }\n\t }\n\t}\n\n\tvar HashMap = function HashMap() {\n\t this._map = {};\n\t};\n\n\tHashMap.prototype.get = function get (name) {\n\t return this._map[this._key(name)];\n\t};\n\n\tHashMap.prototype.set = function set (name, value) {\n\t this._map[this._key(name)] = value;\n\t};\n\n\tHashMap.prototype._key = function _key (name) {\n\t return name instanceof Date ? name.getTime() : name;\n\t};\n\n\tfunction inArray(value, array) {\n\t if (array) {\n\t return array.indexOf(value) !== -1;\n\t }\n\t}\n\n\tfunction interpolateValue(start, end, progress) {\n\t return kendo.drawing.util.round(start + (end - start) * progress, COORD_PRECISION);\n\t}\n\n\tvar TRIGGER = 'trigger';\n\n\tvar InstanceObserver = Class.extend({\n\t init: function(observer, handlers) {\n\t this.observer = observer;\n\t this.handlerMap = deepExtend({}, this.handlerMap, handlers);\n\t },\n\n\t trigger: function(name, args) {\n\t var ref = this;\n\t var observer = ref.observer;\n\t var handlerMap = ref.handlerMap;\n\t var isDefaultPrevented;\n\t if (handlerMap[name]) {\n\t isDefaultPrevented = this.callObserver(handlerMap[name], args);\n\t } else if (observer[TRIGGER]) {\n\t isDefaultPrevented = this.callObserver(TRIGGER, name, args);\n\t }\n\n\t return isDefaultPrevented;\n\t },\n\n\t callObserver: function(fnName) {\n\t var args = [], len = arguments.length - 1;\n\t while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n\t return this.observer[fnName].apply(this.observer, args);\n\t },\n\n\t requiresHandlers: function(names) {\n\t var this$1 = this;\n\n\t if (this.observer.requiresHandlers) {\n\t return this.observer.requiresHandlers(names);\n\t }\n\n\t for (var idx = 0; idx < names.length; idx++) {\n\t if (this$1.handlerMap[names[idx]]) {\n\t return true;\n\t }\n\t }\n\t }\n\t});\n\n\tfunction map(array, callback) {\n\t var length = array.length;\n\t var result = [];\n\t for (var idx = 0; idx < length; idx++) {\n\t var value = callback(array[idx]);\n\t if (kendo.drawing.util.defined(value)) {\n\t result.push(value);\n\t }\n\t }\n\t return result;\n\t}\n\n\tfunction mousewheelDelta(e) {\n\t var delta = 0;\n\n\t if (e.wheelDelta) {\n\t delta = -e.wheelDelta / 120;\n\t delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t }\n\n\t if (e.detail) {\n\t delta = kendo.drawing.util.round(e.detail / 3);\n\t }\n\n\t return delta;\n\t}\n\n\tvar ref = kendo.drawing.util;\n\tvar append = ref.append;\n\tvar bindEvents = ref.bindEvents;\n\tvar defined = ref.defined;\n\tvar deg = ref.deg;\n\tvar elementOffset = ref.elementOffset;\n\tvar elementSize = ref.elementSize;\n\tvar eventElement = ref.eventElement;\n\tvar eventCoordinates = ref.eventCoordinates;\n\tvar last = ref.last;\n\tvar limitValue = ref.limitValue;\n\tvar objectKey = ref.objectKey;\n\tvar rad = ref.rad;\n\tvar round = ref.round;\n\tvar unbindEvents = ref.unbindEvents;\n\tvar valueOrDefault = ref.valueOrDefault;\n\n\tvar FontLoader = Class.extend({\n\n\t});\n\n\tFontLoader.fetchFonts = function(options, fonts, state) {\n\t if (state === void 0) { state = { depth: 0 }; }\n\n\t var MAX_DEPTH = 5;\n\n\t if (!options || state.depth > MAX_DEPTH || !document.fonts) {\n\t return;\n\t }\n\n\t Object.keys(options).forEach(function(key) {\n\t var value = options[key];\n\t if (key === \"dataSource\" || key[0] === \"$\" || !value) {\n\t return;\n\t }\n\n\t if (key === \"font\") {\n\t fonts.push(value);\n\t } else if (typeof value === \"object\") {\n\t state.depth++;\n\t FontLoader.fetchFonts(value, fonts, state);\n\t state.depth--;\n\t }\n\t });\n\t};\n\n\tFontLoader.loadFonts = function(fonts, callback) {\n\t var promises = [];\n\n\t if (fonts.length > 0 && document.fonts) {\n\t try {\n\t promises = fonts.map(function(font) {\n\t return document.fonts.load(font);\n\t });\n\t } catch (e) {\n\t // Silence font-loading errors\n\t kendo.logToConsole(e);\n\t }\n\n\t Promise.all(promises).then(callback, callback);\n\t } else {\n\t callback();\n\t }\n\t};\n\n\tFontLoader.preloadFonts = function(options, callback) {\n\t var fonts = [];\n\t FontLoader.fetchFonts(options, fonts);\n\n\t FontLoader.loadFonts(fonts, callback);\n\t};\n\n\tfunction setDefaultOptions(type, options) {\n\t var proto = type.prototype;\n\t if (proto.options) {\n\t proto.options = deepExtend({}, proto.options, options);\n\t } else {\n\t proto.options = options;\n\t }\n\t}\n\n\tfunction sparseArrayLimits(arr) {\n\t var min = MAX_VALUE;\n\t var max = MIN_VALUE;\n\n\t for (var idx = 0, length = arr.length; idx < length; idx++) {\n\t var value = arr[idx];\n\t if (value !== null && isFinite(value)) {\n\t min = Math.min(min, value);\n\t max = Math.max(max, value);\n\t }\n\t }\n\n\t return {\n\t min: min === MAX_VALUE ? undefined : min,\n\t max: max === MIN_VALUE ? undefined : max\n\t };\n\t}\n\n\tfunction find(array, predicate) {\n\t for (var i = 0; i < array.length; i++) {\n\t var item = array[i];\n\t if (predicate(item, i, array)) {\n\t return item;\n\t }\n\t }\n\t}\n\n\tvar Matrix = geometry.Matrix;\n\tvar matrixRegexp = /matrix\\((.*)\\)/;\n\n\tfunction parseMatrix(matrixString) {\n\t var match = matrixString.match(matrixRegexp);\n\t if (match === null || match.length !== 2) {\n\t return Matrix.unit();\n\t }\n\n\t var members = match[1].split(',').map(function (x) { return parseFloat(x); });\n\t return new (Function.prototype.bind.apply( Matrix, [ null ].concat( members) ));\n\t}\n\n\tfunction transformMatrix(element) {\n\t var transform = getComputedStyle(element).transform;\n\n\t if (transform === 'none') {\n\t return Matrix.unit();\n\t }\n\n\t return parseMatrix(transform);\n\t}\n\n\tfunction elementScale(element) {\n\t if (!element) {\n\t return Matrix.unit();\n\t }\n\n\t var matrix = transformMatrix(element);\n\t var parent = element.parentElement;\n\t while (parent) {\n\t var parentMatrix = transformMatrix(parent);\n\t matrix = matrix.multiplyCopy(parentMatrix);\n\t parent = parent.parentElement;\n\t }\n\n\t matrix.b = matrix.c = matrix.e = matrix.f = 0;\n\t return matrix;\n\t}\n\n\tfunction autoTextColor(color) {\n\t var isDark = new kendo.Color(color).isDark();\n\t if (isDark) {\n\t return WHITE;\n\t }\n\n\t return BLACK;\n\t}\n\n\tvar DELETED = {};\n\n\tvar LegacySet = Class.extend({\n\t init: function(values) {\n\t var this$1 = this;\n\n\t this._index = {};\n\t this._values = values ? values.slice(0) : [];\n\n\t for (var i = 0; i < this._values.length; i++) {\n\t this$1._index[this$1._values[i]] = i;\n\t }\n\t },\n\n\t values: function() {\n\t return this._values.filter(function (item) { return item !== DELETED; });\n\t },\n\n\t has: function(value) {\n\t return this._index[value] !== undefined;\n\t },\n\n\t add: function(value) {\n\t if (!this.has(value)) {\n\t this._index[value] = this._values.length;\n\t this._values.push(value);\n\t }\n\t },\n\n\t delete: function(value) {\n\t var index = this._index[value];\n\t if (index !== undefined) {\n\t this._values[index] = DELETED;\n\t delete this._index[value];\n\t }\n\t },\n\n\t clear: function() {\n\t this._index = {};\n\t this._values = [];\n\t }\n\t});\n\n\tif (Object.defineProperties) {\n\t Object.defineProperties(LegacySet.fn, {\n\t size: {\n\t get: function() {\n\t return this._values.length;\n\t }\n\t }\n\t });\n\t}\n\n\tvar SetWrapper = Class.extend({\n\t init: function(values) {\n\t this._set = new Set(values);\n\t },\n\n\t values: function() {\n\t return Array.from(this._set);\n\t },\n\n\t has: function(value) {\n\t return this._set.has(value);\n\t },\n\n\t add: function(value) {\n\t this._set.add(value);\n\t },\n\n\t delete: function(value) {\n\t this._set.delete(value);\n\t },\n\n\t clear: function() {\n\t this._set.clear();\n\t }\n\t});\n\n\tif (Object.defineProperties) {\n\t Object.defineProperties(SetWrapper.fn, {\n\t size: {\n\t get: function() {\n\t return this._set.size;\n\t }\n\t }\n\t });\n\t}\n\n\t// TODO: Drop LegacySet when removing support for IE10\n\tvar supportsSet = function () {\n\t var supported = false;\n\n\t if (typeof Set === 'function') {\n\t var set = new Set([1]);\n\t supported = set.has(1);\n\t }\n\n\t return supported;\n\t};\n\n\tfunction createHashSet(values) {\n\t if (supportsSet()) {\n\t return new SetWrapper(values);\n\t }\n\n\t return new LegacySet(values);\n\t}\n\n\tfunction autoMajorUnit(min, max) {\n\t var diff = round(max - min, DEFAULT_PRECISION - 1);\n\n\t if (diff === 0) {\n\t if (max === 0) {\n\t return 0.1;\n\t }\n\n\t diff = Math.abs(max);\n\t }\n\n\t var scale = Math.pow(10, Math.floor(Math.log(diff) / Math.log(10)));\n\t var relativeValue = round((diff / scale), DEFAULT_PRECISION);\n\t var scaleMultiplier = 1;\n\n\t if (relativeValue < 1.904762) {\n\t scaleMultiplier = 0.2;\n\t } else if (relativeValue < 4.761904) {\n\t scaleMultiplier = 0.5;\n\t } else if (relativeValue < 9.523809) {\n\t scaleMultiplier = 1;\n\t } else {\n\t scaleMultiplier = 2;\n\t }\n\n\t return round(scale * scaleMultiplier, DEFAULT_PRECISION);\n\t}\n\n\tvar Point = Class.extend({\n\t init: function(x, y) {\n\n\t this.x = x || 0;\n\t this.y = y || 0;\n\t },\n\n\t clone: function() {\n\t return new Point(this.x, this.y);\n\t },\n\n\t equals: function(point) {\n\t return point && this.x === point.x && this.y === point.y;\n\t },\n\n\t rotate: function(center, degrees) {\n\t var theta = rad(degrees);\n\t var cosT = Math.cos(theta);\n\t var sinT = Math.sin(theta);\n\t var cx = center.x;\n\t var cy = center.y;\n\t var ref = this;\n\t var x = ref.x;\n\t var y = ref.y;\n\n\t this.x = round(\n\t cx + (x - cx) * cosT + (y - cy) * sinT,\n\t COORD_PRECISION\n\t );\n\n\t this.y = round(\n\t cy + (y - cy) * cosT - (x - cx) * sinT,\n\t COORD_PRECISION\n\t );\n\n\t return this;\n\t },\n\n\t multiply: function(a) {\n\n\t this.x *= a;\n\t this.y *= a;\n\n\t return this;\n\t },\n\n\t distanceTo: function(point) {\n\t var dx = this.x - point.x;\n\t var dy = this.y - point.y;\n\n\t return Math.sqrt(dx * dx + dy * dy);\n\t }\n\t});\n\n\tPoint.onCircle = function(center, angle, radius) {\n\t var radians = rad(angle);\n\n\t return new Point(\n\t center.x - radius * Math.cos(radians),\n\t center.y - radius * Math.sin(radians)\n\t );\n\t};\n\n\tvar Box = Class.extend({\n\t init: function(x1, y1, x2, y2) {\n\n\t this.x1 = x1 || 0;\n\t this.y1 = y1 || 0;\n\t this.x2 = x2 || 0;\n\t this.y2 = y2 || 0;\n\t },\n\n\t equals: function(box) {\n\t return this.x1 === box.x1 && this.x2 === box.x2 &&\n\t this.y1 === box.y1 && this.y2 === box.y2;\n\t },\n\n\t width: function() {\n\t return this.x2 - this.x1;\n\t },\n\n\t height: function() {\n\t return this.y2 - this.y1;\n\t },\n\n\t translate: function(dx, dy) {\n\t this.x1 += dx;\n\t this.x2 += dx;\n\t this.y1 += dy;\n\t this.y2 += dy;\n\n\t return this;\n\t },\n\n\t move: function(x, y) {\n\t var height = this.height();\n\t var width = this.width();\n\n\t if (defined(x)) {\n\t this.x1 = x;\n\t this.x2 = this.x1 + width;\n\t }\n\n\t if (defined(y)) {\n\t this.y1 = y;\n\t this.y2 = this.y1 + height;\n\t }\n\n\t return this;\n\t },\n\n\t wrap: function(targetBox) {\n\t this.x1 = Math.min(this.x1, targetBox.x1);\n\t this.y1 = Math.min(this.y1, targetBox.y1);\n\t this.x2 = Math.max(this.x2, targetBox.x2);\n\t this.y2 = Math.max(this.y2, targetBox.y2);\n\n\t return this;\n\t },\n\n\t wrapPoint: function(point) {\n\t var arrayPoint = isArray(point);\n\t var x = arrayPoint ? point[0] : point.x;\n\t var y = arrayPoint ? point[1] : point.y;\n\t this.wrap(new Box(x, y, x, y));\n\n\t return this;\n\t },\n\n\t snapTo: function(targetBox, axis) {\n\n\t if (axis === X || !axis) {\n\t this.x1 = targetBox.x1;\n\t this.x2 = targetBox.x2;\n\t }\n\n\t if (axis === Y || !axis) {\n\t this.y1 = targetBox.y1;\n\t this.y2 = targetBox.y2;\n\t }\n\n\t return this;\n\t },\n\n\t alignTo: function(targetBox, anchor) {\n\t var height = this.height();\n\t var width = this.width();\n\t var axis = anchor === TOP || anchor === BOTTOM ? Y : X;\n\t var offset = axis === Y ? height : width;\n\n\t if (anchor === CENTER) {\n\t var targetCenter = targetBox.center();\n\t var center = this.center();\n\n\t this.x1 += targetCenter.x - center.x;\n\t this.y1 += targetCenter.y - center.y;\n\t } else if (anchor === TOP || anchor === LEFT) {\n\t this[axis + 1] = targetBox[axis + 1] - offset;\n\t } else {\n\t this[axis + 1] = targetBox[axis + 2];\n\t }\n\n\t this.x2 = this.x1 + width;\n\t this.y2 = this.y1 + height;\n\n\t return this;\n\t },\n\n\t shrink: function(dw, dh) {\n\n\t this.x2 -= dw;\n\t this.y2 -= dh;\n\n\t return this;\n\t },\n\n\t expand: function(dw, dh) {\n\t this.shrink(-dw, -dh);\n\t return this;\n\t },\n\n\t pad: function(padding) {\n\t var spacing = getSpacing(padding);\n\n\t this.x1 -= spacing.left;\n\t this.x2 += spacing.right;\n\t this.y1 -= spacing.top;\n\t this.y2 += spacing.bottom;\n\n\t return this;\n\t },\n\n\t unpad: function(padding) {\n\t var spacing = getSpacing(padding);\n\n\t spacing.left = -spacing.left;\n\t spacing.top = -spacing.top;\n\t spacing.right = -spacing.right;\n\t spacing.bottom = -spacing.bottom;\n\n\t return this.pad(spacing);\n\t },\n\n\t clone: function() {\n\t return new Box(this.x1, this.y1, this.x2, this.y2);\n\t },\n\n\t center: function() {\n\t return new Point(\n\t this.x1 + this.width() / 2,\n\t this.y1 + this.height() / 2\n\t );\n\t },\n\n\t containsPoint: function(point) {\n\n\t return point.x >= this.x1 && point.x <= this.x2 &&\n\t point.y >= this.y1 && point.y <= this.y2;\n\t },\n\n\t points: function() {\n\t return [\n\t new Point(this.x1, this.y1),\n\t new Point(this.x2, this.y1),\n\t new Point(this.x2, this.y2),\n\t new Point(this.x1, this.y2)\n\t ];\n\t },\n\n\t getHash: function() {\n\t return [ this.x1, this.y1, this.x2, this.y2 ].join(\",\");\n\t },\n\n\t overlaps: function(box) {\n\t return !(box.y2 < this.y1 || this.y2 < box.y1 || box.x2 < this.x1 || this.x2 < box.x1);\n\t },\n\n\t rotate: function(rotation) {\n\t var width = this.width();\n\t var height = this.height();\n\t var ref = this.center();\n\t var cx = ref.x;\n\t var cy = ref.y;\n\n\t var r1 = rotatePoint(0, 0, cx, cy, rotation);\n\t var r2 = rotatePoint(width, 0, cx, cy, rotation);\n\t var r3 = rotatePoint(width, height, cx, cy, rotation);\n\t var r4 = rotatePoint(0, height, cx, cy, rotation);\n\n\t width = Math.max(r1.x, r2.x, r3.x, r4.x) - Math.min(r1.x, r2.x, r3.x, r4.x);\n\t height = Math.max(r1.y, r2.y, r3.y, r4.y) - Math.min(r1.y, r2.y, r3.y, r4.y);\n\n\t this.x2 = this.x1 + width;\n\t this.y2 = this.y1 + height;\n\n\t return this;\n\t },\n\n\t toRect: function() {\n\t return new Rect([ this.x1, this.y1 ], [ this.width(), this.height() ]);\n\t },\n\n\t hasSize: function() {\n\t return this.width() !== 0 && this.height() !== 0;\n\t },\n\n\t align: function(targetBox, axis, alignment) {\n\t var c1 = axis + 1;\n\t var c2 = axis + 2;\n\t var sizeFunc = axis === X ? WIDTH : HEIGHT;\n\t var size = this[sizeFunc]();\n\n\t if (inArray(alignment, [ LEFT, TOP ])) {\n\t this[c1] = targetBox[c1];\n\t this[c2] = this[c1] + size;\n\t } else if (inArray(alignment, [ RIGHT, BOTTOM ])) {\n\t this[c2] = targetBox[c2];\n\t this[c1] = this[c2] - size;\n\t } else if (alignment === CENTER) {\n\t this[c1] = targetBox[c1] + (targetBox[sizeFunc]() - size) / 2;\n\t this[c2] = this[c1] + size;\n\t }\n\t }\n\t});\n\n\tfunction rotatePoint(x, y, cx, cy, angle) {\n\t var theta = rad(angle);\n\n\t return new Point(\n\t cx + (x - cx) * Math.cos(theta) + (y - cy) * Math.sin(theta),\n\t cy - (x - cx) * Math.sin(theta) + (y - cy) * Math.cos(theta)\n\t );\n\t}\n\n\tvar Ring = Class.extend({\n\t init: function(center, innerRadius, radius, startAngle, angle) {\n\n\t this.center = center;\n\t this.innerRadius = innerRadius;\n\t this.radius = radius;\n\t this.startAngle = startAngle;\n\t this.angle = angle;\n\t },\n\n\t clone: function() {\n\t return new Ring(this.center, this.innerRadius, this.radius, this.startAngle, this.angle);\n\t },\n\n\t middle: function() {\n\t return this.startAngle + this.angle / 2;\n\t },\n\n\t setRadius: function(newRadius, innerRadius) {\n\t if (innerRadius) {\n\t this.innerRadius = newRadius;\n\t } else {\n\t this.radius = newRadius;\n\t }\n\n\t return this;\n\t },\n\n\t point: function(angle, innerRadius) {\n\t var radianAngle = rad(angle);\n\t var ax = Math.cos(radianAngle);\n\t var ay = Math.sin(radianAngle);\n\t var radius = innerRadius ? this.innerRadius : this.radius;\n\t var x = round(this.center.x - (ax * radius), COORD_PRECISION);\n\t var y = round(this.center.y - (ay * radius), COORD_PRECISION);\n\n\t return new Point(x, y);\n\t },\n\n\t adjacentBox: function(distance, width, height) {\n\t var sector = this.clone().expand(distance);\n\t var midAndle = sector.middle();\n\t var midPoint = sector.point(midAndle);\n\t var hw = width / 2;\n\t var hh = height / 2;\n\t var sa = Math.sin(rad(midAndle));\n\t var ca = Math.cos(rad(midAndle));\n\t var x = midPoint.x - hw;\n\t var y = midPoint.y - hh;\n\n\t if (Math.abs(sa) < 0.9) {\n\t x += hw * -ca / Math.abs(ca);\n\t }\n\n\t if (Math.abs(ca) < 0.9) {\n\t y += hh * -sa / Math.abs(sa);\n\t }\n\n\t return new Box(x, y, x + width, y + height);\n\t },\n\n\t containsPoint: function(p) {\n\t var center = this.center;\n\t var innerRadius = this.innerRadius;\n\t var radius = this.radius;\n\t var startAngle = this.startAngle;\n\t var endAngle = this.startAngle + this.angle;\n\t var dx = p.x - center.x;\n\t var dy = p.y - center.y;\n\t var vector = new Point(dx, dy);\n\t var startPoint = this.point(startAngle);\n\t var startVector = new Point(startPoint.x - center.x, startPoint.y - center.y);\n\t var endPoint = this.point(endAngle);\n\t var endVector = new Point(endPoint.x - center.x, endPoint.y - center.y);\n\t var dist = round(dx * dx + dy * dy, COORD_PRECISION);\n\n\t return (startVector.equals(vector) || clockwise(startVector, vector)) &&\n\t !clockwise(endVector, vector) &&\n\t dist >= innerRadius * innerRadius && dist <= radius * radius;\n\t },\n\n\t getBBox: function() {\n\t var this$1 = this;\n\n\t var box = new Box(MAX_VALUE, MAX_VALUE, MIN_VALUE, MIN_VALUE);\n\t var startAngle = round(this.startAngle % 360);\n\t var endAngle = round((startAngle + this.angle) % 360);\n\t var innerRadius = this.innerRadius;\n\t var allAngles = [ 0, 90, 180, 270, startAngle, endAngle ].sort(numericComparer);\n\t var startAngleIndex = allAngles.indexOf(startAngle);\n\t var endAngleIndex = allAngles.indexOf(endAngle);\n\t var angles;\n\n\t if (startAngle === endAngle) {\n\t angles = allAngles;\n\t } else {\n\t if (startAngleIndex < endAngleIndex) {\n\t angles = allAngles.slice(startAngleIndex, endAngleIndex + 1);\n\t } else {\n\t angles = [].concat(\n\t allAngles.slice(0, endAngleIndex + 1),\n\t allAngles.slice(startAngleIndex, allAngles.length)\n\t );\n\t }\n\t }\n\n\t for (var i = 0; i < angles.length; i++) {\n\t var point = this$1.point(angles[i]);\n\t box.wrapPoint(point);\n\t box.wrapPoint(point, innerRadius);\n\t }\n\n\t if (!innerRadius) {\n\t box.wrapPoint(this.center);\n\t }\n\n\t return box;\n\t },\n\n\t expand: function(value) {\n\t this.radius += value;\n\t return this;\n\t }\n\t});\n\n\tfunction numericComparer(a, b) {\n\t return a - b;\n\t}\n\n\tvar Sector = Ring.extend({\n\t init: function(center, radius, startAngle, angle) {\n\t Ring.fn.init.call(this, center, 0, radius, startAngle, angle);\n\t },\n\n\t expand: function(value) {\n\t return Ring.fn.expand.call(this, value);\n\t },\n\n\t clone: function() {\n\t return new Sector(this.center, this.radius, this.startAngle, this.angle);\n\t },\n\n\t setRadius: function(newRadius) {\n\t this.radius = newRadius;\n\n\t return this;\n\t }\n\t});\n\n\tvar DIRECTION_ANGLE = 0.001; //any value that will make the endAngle bigger than the start angle will work here.\n\n\tvar ShapeBuilder = Class.extend({\n\t createRing: function(sector, options) {\n\t var startAngle = sector.startAngle + 180;\n\t var endAngle = sector.angle + startAngle;\n\n\t //required in order to avoid reversing the arc direction in cases like 0.000000000000001 + 100 === 100\n\t if (sector.angle > 0 && startAngle === endAngle) {\n\t endAngle += DIRECTION_ANGLE;\n\t }\n\n\t var center = new geometry.Point(sector.center.x, sector.center.y);\n\t var radius = Math.max(sector.radius, 0);\n\t var innerRadius = Math.max(sector.innerRadius, 0);\n\t var arc = new geometry.Arc(center, {\n\t startAngle: startAngle,\n\t endAngle: endAngle,\n\t radiusX: radius,\n\t radiusY: radius\n\t });\n\t var path = Path.fromArc(arc, options).close();\n\n\t if (innerRadius) {\n\t arc.radiusX = arc.radiusY = innerRadius;\n\t var innerEnd = arc.pointAt(endAngle);\n\t path.lineTo(innerEnd.x, innerEnd.y);\n\t path.arc(endAngle, startAngle, innerRadius, innerRadius, true);\n\t } else {\n\t path.lineTo(center.x, center.y);\n\t }\n\n\t return path;\n\t }\n\t});\n\n\tShapeBuilder.current = new ShapeBuilder();\n\n\tvar ChartElement = Class.extend({\n\t init: function(options) {\n\n\t this.children = [];\n\n\t this.options = deepExtend({}, this.options, this.initUserOptions(options));\n\t },\n\n\t initUserOptions: function(options) {\n\t return options;\n\t },\n\n\t reflow: function(targetBox) {\n\t var children = this.children;\n\t var box;\n\n\t for (var i = 0; i < children.length; i++) {\n\t var currentChild = children[i];\n\t currentChild.reflow(targetBox);\n\n\t box = box ? box.wrap(currentChild.box) : currentChild.box.clone();\n\t }\n\n\t this.box = box || targetBox;\n\t },\n\n\t destroy: function() {\n\t var children = this.children;\n\n\t if (this.animation) {\n\t this.animation.destroy();\n\t }\n\n\t for (var i = 0; i < children.length; i++) {\n\t children[i].destroy();\n\t }\n\t },\n\n\t getRoot: function() {\n\t var parent = this.parent;\n\n\t return parent ? parent.getRoot() : null;\n\t },\n\n\t getSender: function() {\n\t var service = this.getService();\n\t if (service) {\n\t return service.sender;\n\t }\n\t },\n\n\t getService: function() {\n\t var element = this;\n\t while (element) {\n\t if (element.chartService) {\n\t return element.chartService;\n\t }\n\t element = element.parent;\n\t }\n\t },\n\n\t translateChildren: function(dx, dy) {\n\t var children = this.children;\n\t var childrenCount = children.length;\n\n\t for (var i = 0; i < childrenCount; i++) {\n\t children[i].box.translate(dx, dy);\n\t }\n\t },\n\n\t append: function() {\n\t var arguments$1 = arguments;\n\t var this$1 = this;\n\n\t for (var i = 0; i < arguments.length; i++) {\n\t var item = arguments$1[i];\n\t this$1.children.push(item);\n\t item.parent = this$1;\n\t }\n\t },\n\n\t renderVisual: function() {\n\t if (this.options.visible === false) {\n\t return;\n\t }\n\n\t this.createVisual();\n\n\t this.addVisual();\n\n\t this.renderChildren();\n\n\t this.createAnimation();\n\t this.renderComplete();\n\t },\n\n\t addVisual: function() {\n\t if (this.visual) {\n\t this.visual.chartElement = this;\n\n\t if (this.parent) {\n\t this.parent.appendVisual(this.visual);\n\t }\n\t }\n\t },\n\n\t renderChildren: function() {\n\t var children = this.children;\n\t var length = children.length;\n\t for (var i = 0; i < length; i++) {\n\t children[i].renderVisual();\n\t }\n\t },\n\n\t createVisual: function() {\n\t this.visual = new Group({\n\t zIndex: this.options.zIndex,\n\t visible: valueOrDefault(this.options.visible, true)\n\t });\n\t },\n\n\t createAnimation: function() {\n\t if (this.visual && this.options.animation) {\n\t this.animation = drawing.Animation.create(\n\t this.visual, this.options.animation\n\t );\n\t }\n\t },\n\n\t appendVisual: function(childVisual) {\n\t if (!childVisual.chartElement) {\n\t childVisual.chartElement = this;\n\t }\n\n\t if (childVisual.options.noclip) {\n\t this.clipRoot().visual.append(childVisual);\n\t } else if (defined(childVisual.options.zIndex)) {\n\t this.stackRoot().stackVisual(childVisual);\n\t } else if (this.isStackRoot) {\n\t this.stackVisual(childVisual);\n\t } else if (this.visual) {\n\t this.visual.append(childVisual);\n\t } else {\n\t // Allow chart elements without visuals to\n\t // pass through child visuals\n\t this.parent.appendVisual(childVisual);\n\t }\n\t },\n\n\t clipRoot: function() {\n\t if (this.parent) {\n\t return this.parent.clipRoot();\n\t }\n\n\t return this;\n\t },\n\n\t stackRoot: function() {\n\t if (this.parent) {\n\t return this.parent.stackRoot();\n\t }\n\n\t return this;\n\t },\n\n\t stackVisual: function(childVisual) {\n\t var zIndex = childVisual.options.zIndex || 0;\n\t var visuals = this.visual.children;\n\t var length = visuals.length;\n\t var pos;\n\n\t for (pos = 0; pos < length; pos++) {\n\t var sibling = visuals[pos];\n\t var here = valueOrDefault(sibling.options.zIndex, 0);\n\t if (here > zIndex) {\n\t break;\n\t }\n\t }\n\n\t this.visual.insert(pos, childVisual);\n\t },\n\n\t traverse: function(callback) {\n\t var children = this.children;\n\t var length = children.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var child = children[i];\n\n\t callback(child);\n\t if (child.traverse) {\n\t child.traverse(callback);\n\t }\n\t }\n\t },\n\n\t closest: function(match) {\n\t var element = this;\n\t var matched = false;\n\n\t while (element && !matched) {\n\t matched = match(element);\n\n\t if (!matched) {\n\t element = element.parent;\n\t }\n\t }\n\n\t if (matched) {\n\t return element;\n\t }\n\t },\n\n\t renderComplete: function() {},\n\n\t hasHighlight: function() {\n\t var options = (this.options || {}).highlight;\n\t return !(!this.createHighlight || (options && options.visible === false));\n\t },\n\n\t toggleHighlight: function(show, opacity) {\n\t var this$1 = this;\n\n\t var options = (this.options || {}).highlight || {};\n\t var customVisual = options.visual;\n\t var highlight = this._highlight;\n\n\t if (!highlight) {\n\t var highlightOptions = {\n\t fill: {\n\t color: WHITE,\n\t opacity: opacity || 0.2\n\t },\n\t stroke: {\n\t color: WHITE,\n\t width: 1,\n\t opacity: opacity || 0.2\n\t }\n\t };\n\n\t if (customVisual) {\n\t highlight = this._highlight = customVisual(\n\t $.extend(this.highlightVisualArgs(), {\n\t createVisual: function () { return this$1.createHighlight(highlightOptions); },\n\t sender: this.getSender(),\n\t series: this.series,\n\t dataItem: this.dataItem,\n\t category: this.category,\n\t value: this.value,\n\t percentage: this.percentage,\n\t runningTotal: this.runningTotal,\n\t total: this.total\n\t }\n\t ));\n\n\t if (!highlight) {\n\t return;\n\t }\n\t } else {\n\t highlight = this._highlight = this.createHighlight(highlightOptions);\n\t }\n\n\t if (!defined(highlight.options.zIndex)) {\n\t highlight.options.zIndex = valueOrDefault(options.zIndex, this.options.zIndex);\n\t }\n\n\t this.appendVisual(highlight);\n\t }\n\n\t highlight.visible(show);\n\t },\n\n\t createGradientOverlay: function(element, options, gradientOptions) {\n\t var overlay = new Path($.extend({\n\t stroke: {\n\t color: \"none\"\n\t },\n\t fill: this.createGradient(gradientOptions),\n\t closed: element.options.closed\n\t }, options));\n\n\t overlay.segments.elements(element.segments.elements());\n\n\t return overlay;\n\t },\n\n\t createGradient: function(options) {\n\t if (this.parent) {\n\t return this.parent.createGradient(options);\n\t }\n\t },\n\n\t supportsPointInactiveOpacity: function() {\n\t return true;\n\t }\n\t});\n\n\tChartElement.prototype.options = { };\n\n\tvar BoxElement = ChartElement.extend({\n\t init: function(options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.options.margin = getSpacing(this.options.margin);\n\t this.options.padding = getSpacing(this.options.padding);\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var width = options.width;\n\t var height = options.height;\n\t var shrinkToFit = options.shrinkToFit;\n\t var hasSetSize = width && height;\n\t var margin = options.margin;\n\t var padding = options.padding;\n\t var borderWidth = options.border.width;\n\t var box;\n\n\t var reflowPaddingBox = function () {\n\t this$1.align(targetBox, X, options.align);\n\t this$1.align(targetBox, Y, options.vAlign);\n\t this$1.paddingBox = box.clone().unpad(margin).unpad(borderWidth);\n\t };\n\n\t var contentBox = targetBox.clone();\n\t if (hasSetSize) {\n\t contentBox.x2 = contentBox.x1 + width;\n\t contentBox.y2 = contentBox.y1 + height;\n\t }\n\n\t if (shrinkToFit) {\n\t contentBox.unpad(margin).unpad(borderWidth).unpad(padding);\n\t }\n\n\t ChartElement.fn.reflow.call(this, contentBox);\n\n\t if (hasSetSize) {\n\t box = this.box = new Box(0, 0, width, height);\n\t } else {\n\t box = this.box;\n\t }\n\n\t if (shrinkToFit && hasSetSize) {\n\t reflowPaddingBox();\n\t contentBox = this.contentBox = this.paddingBox.clone().unpad(padding);\n\t } else {\n\t contentBox = this.contentBox = box.clone();\n\t box.pad(padding).pad(borderWidth).pad(margin);\n\t reflowPaddingBox();\n\t }\n\n\t this.translateChildren(\n\t box.x1 - contentBox.x1 + margin.left + borderWidth + padding.left,\n\t box.y1 - contentBox.y1 + margin.top + borderWidth + padding.top\n\t );\n\n\t var children = this.children;\n\t for (var i = 0; i < children.length; i++) {\n\t var item = children[i];\n\t item.reflow(item.box);\n\t }\n\t },\n\n\t align: function(targetBox, axis, alignment) {\n\t this.box.align(targetBox, axis, alignment);\n\t },\n\n\t hasBox: function() {\n\t var options = this.options;\n\t return options.border.width || options.background;\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\n\t var options = this.options;\n\t if (options.visible && this.hasBox()) {\n\t this.visual.append(Path.fromRect(\n\t this.paddingBox.toRect(),\n\t this.visualStyle()\n\t ));\n\t }\n\t },\n\n\t visualStyle: function() {\n\t var options = this.options;\n\t var border = options.border || {};\n\n\t return {\n\t stroke: {\n\t width: border.width,\n\t color: border.color,\n\t opacity: valueOrDefault(border.opacity, options.opacity),\n\t dashType: border.dashType\n\t },\n\t fill: {\n\t color: options.background,\n\t opacity: options.opacity\n\t },\n\t cursor: options.cursor\n\t };\n\t }\n\t});\n\n\tsetDefaultOptions(BoxElement, {\n\t align: LEFT,\n\t vAlign: TOP,\n\t margin: {},\n\t padding: {},\n\t border: {\n\t color: BLACK,\n\t width: 0\n\t },\n\t background: \"\",\n\t shrinkToFit: false,\n\t width: 0,\n\t height: 0,\n\t visible: true\n\t});\n\n\tvar ShapeElement = BoxElement.extend({\n\t init: function(options, pointData) {\n\t BoxElement.fn.init.call(this, options);\n\n\t this.pointData = pointData;\n\t },\n\n\t getElement: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var box = ref.paddingBox;\n\t var type = options.type;\n\t var rotation = options.rotation;\n\t var center = box.center();\n\t var halfWidth = box.width() / 2;\n\t var halfHeight = box.height() / 2;\n\n\t if (!options.visible || !this.hasBox()) {\n\t return null;\n\t }\n\n\t var style = this.visualStyle();\n\t var element;\n\n\t if (type === CIRCLE) {\n\t element = new drawing.Circle(\n\t new Circle([\n\t round(box.x1 + halfWidth, COORD_PRECISION),\n\t round(box.y1 + halfHeight, COORD_PRECISION)\n\t ], Math.min(halfWidth, halfHeight)),\n\t style\n\t );\n\t } else if (type === TRIANGLE) {\n\t element = Path.fromPoints([\n\t [ box.x1 + halfWidth, box.y1 ],\n\t [ box.x1, box.y2 ],\n\t [ box.x2, box.y2 ]\n\t ], style).close();\n\t } else if (type === CROSS) {\n\t element = new drawing.MultiPath(style);\n\n\t element.moveTo(box.x1, box.y1).lineTo(box.x2, box.y2);\n\t element.moveTo(box.x1, box.y2).lineTo(box.x2, box.y1);\n\t } else {\n\t var rect = box.toRect();\n\t if (type === ROUNDED_RECT) {\n\t var borderRadius = valueOrDefault(options.borderRadius, rect.width() / 5);\n\t rect.setCornerRadius(borderRadius);\n\t }\n\n\t element = Path.fromRect(rect, style);\n\t }\n\n\t if (rotation) {\n\t element.transform(geometryTransform()\n\t .rotate(-rotation, [ center.x, center.y ])\n\t );\n\t }\n\n\t element.options.zIndex = options.zIndex;\n\n\t return element;\n\t },\n\n\t createElement: function() {\n\t var this$1 = this;\n\n\t var customVisual = this.options.visual;\n\t var pointData = this.pointData || {};\n\t var visual;\n\n\t if (customVisual) {\n\t visual = customVisual({\n\t value: pointData.value,\n\t dataItem: pointData.dataItem,\n\t sender: this.getSender(),\n\t series: pointData.series,\n\t category: pointData.category,\n\t rect: this.paddingBox.toRect(),\n\t options: this.visualOptions(),\n\t createVisual: function () { return this$1.getElement(); }\n\t });\n\t } else {\n\t visual = this.getElement();\n\t }\n\n\t return visual;\n\t },\n\n\t visualOptions: function() {\n\t var options = this.options;\n\t return {\n\t background: options.background,\n\t border: options.border,\n\t margin: options.margin,\n\t padding: options.padding,\n\t type: options.type,\n\t size: options.width,\n\t visible: options.visible\n\t };\n\t },\n\n\t createVisual: function() {\n\t this.visual = this.createElement();\n\t }\n\t});\n\n\tsetDefaultOptions(ShapeElement, {\n\t type: CIRCLE,\n\t align: CENTER,\n\t vAlign: CENTER\n\t});\n\n\tvar LINEAR = \"linear\";\n\tvar RADIAL = \"radial\";\n\n\tvar GRADIENTS = {\n\t glass: {\n\t type: LINEAR,\n\t rotation: 0,\n\t stops: [ {\n\t offset: 0,\n\t color: WHITE,\n\t opacity: 0\n\t }, {\n\t offset: 0.25,\n\t color: WHITE,\n\t opacity: 0.3\n\t }, {\n\t offset: 1,\n\t color: WHITE,\n\t opacity: 0\n\t } ]\n\t },\n\t sharpBevel: {\n\t type: RADIAL,\n\t stops: [ {\n\t offset: 0,\n\t color: WHITE,\n\t opacity: 0.55\n\t }, {\n\t offset: 0.65,\n\t color: WHITE,\n\t opacity: 0\n\t }, {\n\t offset: 0.95,\n\t color: WHITE,\n\t opacity: 0.25\n\t } ]\n\t },\n\t roundedBevel: {\n\t type: RADIAL,\n\t stops: [ {\n\t offset: 0.33,\n\t color: WHITE,\n\t opacity: 0.06\n\t }, {\n\t offset: 0.83,\n\t color: WHITE,\n\t opacity: 0.2\n\t }, {\n\t offset: 0.95,\n\t color: WHITE,\n\t opacity: 0\n\t } ]\n\t },\n\t roundedGlass: {\n\t type: RADIAL,\n\t supportVML: false,\n\t stops: [ {\n\t offset: 0,\n\t color: WHITE,\n\t opacity: 0\n\t }, {\n\t offset: 0.5,\n\t color: WHITE,\n\t opacity: 0.3\n\t }, {\n\t offset: 0.99,\n\t color: WHITE,\n\t opacity: 0\n\t } ]\n\t },\n\t sharpGlass: {\n\t type: RADIAL,\n\t supportVML: false,\n\t stops: [ {\n\t offset: 0,\n\t color: WHITE,\n\t opacity: 0.2\n\t }, {\n\t offset: 0.15,\n\t color: WHITE,\n\t opacity: 0.15\n\t }, {\n\t offset: 0.17,\n\t color: WHITE,\n\t opacity: 0.35\n\t }, {\n\t offset: 0.85,\n\t color: WHITE,\n\t opacity: 0.05\n\t }, {\n\t offset: 0.87,\n\t color: WHITE,\n\t opacity: 0.15\n\t }, {\n\t offset: 0.99,\n\t color: WHITE,\n\t opacity: 0\n\t } ]\n\t },\n\t bubbleShadow: {\n\t type: RADIAL,\n\t center: [ 0.5, 0.5 ],\n\t radius: 0.5\n\t }\n\t};\n\n\tfunction boxDiff(r, s) {\n\t if (r.x1 === s.x1 && r.y1 === s.y1 && r.x2 === s.x2 && r.y2 === s.y2) {\n\t return s;\n\t }\n\n\t var a = Math.min(r.x1, s.x1);\n\t var b = Math.max(r.x1, s.x1);\n\t var c = Math.min(r.x2, s.x2);\n\t var d = Math.max(r.x2, s.x2);\n\t var e = Math.min(r.y1, s.y1);\n\t var f = Math.max(r.y1, s.y1);\n\t var g = Math.min(r.y2, s.y2);\n\t var h = Math.max(r.y2, s.y2);\n\t var boxes = [];\n\n\t // X = intersection, 0-7 = possible difference areas\n\t // h +-+-+-+\n\t // . |5|6|7|\n\t // g +-+-+-+\n\t // . |3|X|4|\n\t // f +-+-+-+\n\t // . |0|1|2|\n\t // e +-+-+-+\n\t // . a b c d\n\n\t // we'll always have rectangles 1, 3, 4 and 6\n\t boxes[0] = new Box(b, e, c, f);\n\t boxes[1] = new Box(a, f, b, g);\n\t boxes[2] = new Box(c, f, d, g);\n\t boxes[3] = new Box(b, g, c, h);\n\n\t // decide which corners\n\t if (r.x1 === a && r.y1 === e || s.x1 === a && s.y1 === e) { // corners 0 and 7\n\t boxes[4] = new Box(a, e, b, f);\n\t boxes[5] = new Box(c, g, d, h);\n\t } else { // corners 2 and 5\n\t boxes[4] = new Box(c, e, d, f);\n\t boxes[5] = new Box(a, g, b, h);\n\t }\n\n\t return grep(boxes, function(box) {\n\t return box.height() > 0 && box.width() > 0;\n\t })[0];\n\t}\n\n\tvar RootElement = ChartElement.extend({\n\t init: function(options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t var rootOptions = this.options;\n\t rootOptions.width = parseInt(rootOptions.width, 10);\n\t rootOptions.height = parseInt(rootOptions.height, 10);\n\n\t this.gradients = {};\n\t },\n\n\t reflow: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var children = ref.children;\n\t var currentBox = new Box(0, 0, options.width, options.height);\n\n\t this.box = currentBox.unpad(options.margin);\n\n\t for (var i = 0; i < children.length; i++) {\n\t children[i].reflow(currentBox);\n\t currentBox = boxDiff(currentBox, children[i].box) || new Box();\n\t }\n\t },\n\n\t createVisual: function() {\n\t this.visual = new Group();\n\t this.createBackground();\n\t },\n\n\t createBackground: function() {\n\t var options = this.options;\n\t var border = options.border || {};\n\t var box = this.box.clone().pad(options.margin).unpad(border.width);\n\n\t var background = Path.fromRect(box.toRect(), {\n\t stroke: {\n\t color: border.width ? border.color : \"\",\n\t width: border.width,\n\t dashType: border.dashType\n\t },\n\t fill: {\n\t color: options.background,\n\t opacity: options.opacity\n\t },\n\t zIndex: -10\n\t });\n\n\t this.visual.append(background);\n\t },\n\n\t getRoot: function() {\n\t return this;\n\t },\n\n\t createGradient: function(options) {\n\t var gradients = this.gradients;\n\t var hashCode = objectKey(options);\n\t var gradient = GRADIENTS[options.gradient];\n\t var drawingGradient;\n\n\t if (gradients[hashCode]) {\n\t drawingGradient = gradients[hashCode];\n\t } else {\n\t var gradientOptions = $.extend({}, gradient, options);\n\t if (gradient.type === \"linear\") {\n\t drawingGradient = new drawing.LinearGradient(gradientOptions);\n\t } else {\n\t if (options.innerRadius) {\n\t gradientOptions.stops = innerRadialStops(gradientOptions);\n\t }\n\t drawingGradient = new drawing.RadialGradient(gradientOptions);\n\t drawingGradient.supportVML = gradient.supportVML !== false;\n\t }\n\t gradients[hashCode] = drawingGradient;\n\t }\n\n\t return drawingGradient;\n\t },\n\n\t cleanGradients: function() {\n\t var gradients = this.gradients;\n\t for (var hashCode in gradients) {\n\t gradients[hashCode]._observers = [];//add clear observers method in drawing ObserversMixin\n\t }\n\t },\n\n\t size: function() {\n\t var options = this.options;\n\t return new Box(0, 0, options.width, options.height);\n\t }\n\t});\n\n\tsetDefaultOptions(RootElement, {\n\t width: DEFAULT_WIDTH,\n\t height: DEFAULT_HEIGHT,\n\t background: WHITE,\n\t border: {\n\t color: BLACK,\n\t width: 0\n\t },\n\t margin: getSpacing(5),\n\t zIndex: -2\n\t});\n\n\tfunction innerRadialStops(options) {\n\t var stops = options.stops;\n\t var usedSpace = ((options.innerRadius / options.radius) * 100);\n\t var length = stops.length;\n\t var currentStops = [];\n\n\t for (var i = 0; i < length; i++) {\n\t var currentStop = $.extend({}, stops[i]);\n\t currentStop.offset = (currentStop.offset * (100 - usedSpace) + usedSpace) / 100;\n\t currentStops.push(currentStop);\n\t }\n\n\t return currentStops;\n\t}\n\n\tvar FloatElement = ChartElement.extend({\n\t init: function(options) {\n\t ChartElement.fn.init.call(this, options);\n\t this._initDirection();\n\t },\n\n\t _initDirection: function() {\n\t var options = this.options;\n\t if (options.vertical) {\n\t this.groupAxis = X;\n\t this.elementAxis = Y;\n\t this.groupSizeField = WIDTH;\n\t this.elementSizeField = HEIGHT;\n\t this.groupSpacing = options.spacing;\n\t this.elementSpacing = options.vSpacing;\n\t } else {\n\t this.groupAxis = Y;\n\t this.elementAxis = X;\n\t this.groupSizeField = HEIGHT;\n\t this.elementSizeField = WIDTH;\n\t this.groupSpacing = options.vSpacing;\n\t this.elementSpacing = options.spacing;\n\t }\n\t },\n\n\t reflow: function(targetBox) {\n\t this.box = targetBox.clone();\n\t this.reflowChildren();\n\t },\n\n\t reflowChildren: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var box = ref.box;\n\t var elementAxis = ref.elementAxis;\n\t var groupAxis = ref.groupAxis;\n\t var elementSizeField = ref.elementSizeField;\n\t var groupSizeField = ref.groupSizeField;\n\t var ref$1 = this.groupOptions();\n\t var groups = ref$1.groups;\n\t var groupsSize = ref$1.groupsSize;\n\t var maxGroupElementsSize = ref$1.maxGroupElementsSize;\n\t var groupsCount = groups.length;\n\t var groupsStart = box[groupAxis + 1] + this.alignStart(groupsSize, box[groupSizeField]());\n\n\t if (groupsCount) {\n\t var groupStart = groupsStart;\n\n\t for (var groupIdx = 0; groupIdx < groupsCount; groupIdx++) {\n\t var group = groups[groupIdx];\n\t var groupElements = group.groupElements;\n\t var elementStart = box[elementAxis + 1];\n\t var groupElementsCount = groupElements.length;\n\n\t for (var idx = 0; idx < groupElementsCount; idx++) {\n\t var element = groupElements[idx];\n\t var elementSize$$1 = this$1.elementSize(element);\n\t var groupElementStart = groupStart + this$1.alignStart(elementSize$$1[groupSizeField], group.groupSize);\n\n\t var elementBox = new Box();\n\t elementBox[groupAxis + 1] = groupElementStart;\n\t elementBox[groupAxis + 2] = groupElementStart + elementSize$$1[groupSizeField];\n\t elementBox[elementAxis + 1] = elementStart;\n\t elementBox[elementAxis + 2] = elementStart + elementSize$$1[elementSizeField];\n\n\t element.reflow(elementBox);\n\n\t elementStart += elementSize$$1[elementSizeField] + this$1.elementSpacing;\n\t }\n\t groupStart += group.groupSize + this$1.groupSpacing;\n\t }\n\t box[groupAxis + 1] = groupsStart;\n\t box[groupAxis + 2] = groupsStart + groupsSize;\n\t box[elementAxis + 2] = box[elementAxis + 1] + maxGroupElementsSize;\n\t }\n\t },\n\n\t alignStart: function(size, maxSize) {\n\t var start = 0;\n\t var align = this.options.align;\n\t if (align === RIGHT || align === BOTTOM) {\n\t start = maxSize - size;\n\t } else if (align === CENTER) {\n\t start = (maxSize - size) / 2;\n\t }\n\t return start;\n\t },\n\n\t groupOptions: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var box = ref.box;\n\t var children = ref.children;\n\t var elementSizeField = ref.elementSizeField;\n\t var groupSizeField = ref.groupSizeField;\n\t var elementSpacing = ref.elementSpacing;\n\t var groupSpacing = ref.groupSpacing;\n\t var maxSize = round(box[elementSizeField]());\n\t var childrenCount = children.length;\n\t var groups = [];\n\n\t var groupSize = 0;\n\t var groupElementsSize = 0;\n\t var groupsSize = 0;\n\t var maxGroupElementsSize = 0;\n\t var groupElements = [];\n\n\t for (var idx = 0; idx < childrenCount; idx++) {\n\t var element = children[idx];\n\t if (!element.box) {\n\t element.reflow(box);\n\t }\n\n\t var elementSize$$1 = this$1.elementSize(element);\n\t if (this$1.options.wrap && round(groupElementsSize + elementSpacing + elementSize$$1[elementSizeField]) > maxSize) {\n\t groups.push({\n\t groupElements: groupElements,\n\t groupSize: groupSize,\n\t groupElementsSize: groupElementsSize\n\t });\n\t maxGroupElementsSize = Math.max(maxGroupElementsSize, groupElementsSize);\n\t groupsSize += groupSpacing + groupSize;\n\t groupSize = 0;\n\t groupElementsSize = 0;\n\t groupElements = [];\n\t }\n\t groupSize = Math.max(groupSize, elementSize$$1[groupSizeField]);\n\t if (groupElementsSize > 0) {\n\t groupElementsSize += elementSpacing;\n\t }\n\t groupElementsSize += elementSize$$1[elementSizeField];\n\t groupElements.push(element);\n\t }\n\n\t groups.push({\n\t groupElements: groupElements,\n\t groupSize: groupSize,\n\t groupElementsSize: groupElementsSize\n\t });\n\t maxGroupElementsSize = Math.max(maxGroupElementsSize, groupElementsSize);\n\t groupsSize += groupSize;\n\n\t return {\n\t groups: groups,\n\t groupsSize: groupsSize,\n\t maxGroupElementsSize: maxGroupElementsSize\n\t };\n\t },\n\n\t elementSize: function(element) {\n\t return {\n\t width: element.box.width(),\n\t height: element.box.height()\n\t };\n\t },\n\n\t createVisual: function() {}\n\t});\n\n\tsetDefaultOptions(FloatElement, {\n\t vertical: true,\n\t wrap: true,\n\t vSpacing: 0,\n\t spacing: 0\n\t});\n\n\tvar DrawingText = drawing.Text;\n\n\tvar Text = ChartElement.extend({\n\t init: function(content, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.content = content;\n\n\t // Calculate size\n\t this.reflow(new Box());\n\t },\n\n\t reflow: function(targetBox) {\n\t var options = this.options;\n\t var size = options.size = util.measureText(this.content, { font: options.font });\n\n\t this.baseline = size.baseline;\n\n\t this.box = new Box(targetBox.x1, targetBox.y1,\n\t targetBox.x1 + size.width, targetBox.y1 + size.height);\n\t },\n\n\t createVisual: function() {\n\t var ref = this.options;\n\t var font = ref.font;\n\t var color = ref.color;\n\t var opacity = ref.opacity;\n\t var cursor = ref.cursor;\n\n\t this.visual = new DrawingText(this.content, this.box.toRect().topLeft(), {\n\t font: font,\n\t fill: { color: color, opacity: opacity },\n\t cursor: cursor\n\t });\n\t }\n\t});\n\n\tsetDefaultOptions(Text, {\n\t font: DEFAULT_FONT,\n\t color: BLACK\n\t});\n\n\tfunction rectToBox(rect) {\n\t var origin = rect.origin;\n\t var bottomRight = rect.bottomRight();\n\n\t return new Box(origin.x, origin.y, bottomRight.x, bottomRight.y);\n\t}\n\n\tvar ROWS_SPLIT_REGEX = /\\n/m;\n\n\tvar TextBox = BoxElement.extend({\n\t init: function(content, options, data) {\n\t BoxElement.fn.init.call(this, options);\n\t this.content = content;\n\t this.data = data;\n\n\t this._initContainer();\n\t if (this.options._autoReflow !== false) {\n\t this.reflow(new Box());\n\t }\n\t },\n\n\t _initContainer: function() {\n\t var options = this.options;\n\t var rows = String(this.content).split(ROWS_SPLIT_REGEX);\n\t var floatElement = new FloatElement({ vertical: true, align: options.align, wrap: false });\n\t var textOptions = deepExtend({ }, options, { opacity: 1, animation: null });\n\n\t this.container = floatElement;\n\t this.append(floatElement);\n\n\t for (var rowIdx = 0; rowIdx < rows.length; rowIdx++) {\n\t var text = new Text(rows[rowIdx].trim(), textOptions);\n\t floatElement.append(text);\n\t }\n\t },\n\n\t reflow: function(targetBox) {\n\t var options = this.options;\n\t var visualFn = options.visual;\n\t this.container.options.align = options.align;\n\n\t if (visualFn && !this._boxReflow) {\n\t var visualBox = targetBox;\n\t if (!visualBox.hasSize()) {\n\t this._boxReflow = true;\n\t this.reflow(visualBox);\n\t this._boxReflow = false;\n\t visualBox = this.box;\n\t }\n\t var visual = this.visual = visualFn(this.visualContext(visualBox));\n\n\t if (visual) {\n\t visualBox = rectToBox(visual.clippedBBox() || new Rect());\n\n\t visual.options.zIndex = options.zIndex;\n\t }\n\n\t this.box = this.contentBox = this.paddingBox = visualBox;\n\t } else {\n\t BoxElement.fn.reflow.call(this, targetBox);\n\n\t if (options.rotation) {\n\t var margin = getSpacing(options.margin);\n\t var box = this.box.unpad(margin);\n\n\t this.targetBox = targetBox;\n\t this.normalBox = box.clone();\n\n\t box = this.rotate();\n\t box.translate(margin.left - margin.right, margin.top - margin.bottom);\n\n\t this.rotatedBox = box.clone();\n\n\t box.pad(margin);\n\t }\n\t }\n\t },\n\n\t createVisual: function() {\n\t var options = this.options;\n\n\t this.visual = new Group({\n\t transform: this.rotationTransform(),\n\t zIndex: options.zIndex,\n\t noclip: options.noclip\n\t });\n\n\t if (this.hasBox()) {\n\t var box = Path.fromRect(this.paddingBox.toRect(), this.visualStyle());\n\t this.visual.append(box);\n\t }\n\t },\n\n\t renderVisual: function() {\n\t if (!this.options.visible) {\n\t return;\n\t }\n\n\t if (this.options.visual) {\n\t var visual = this.visual;\n\t if (visual && !defined(visual.options.noclip)) {\n\t visual.options.noclip = this.options.noclip;\n\t }\n\t this.addVisual();\n\t this.createAnimation();\n\t } else {\n\t BoxElement.fn.renderVisual.call(this);\n\t }\n\t },\n\n\t visualContext: function(targetBox) {\n\t var this$1 = this;\n\n\t var context = {\n\t text: this.content,\n\t rect: targetBox.toRect(),\n\t sender: this.getSender(),\n\t options: this.options,\n\t createVisual: function () {\n\t this$1._boxReflow = true;\n\t this$1.reflow(targetBox);\n\t this$1._boxReflow = false;\n\t return this$1.getDefaultVisual();\n\t }\n\t };\n\t if (this.data) {\n\t $.extend(context, this.data);\n\t }\n\n\t return context;\n\t },\n\n\t getDefaultVisual: function() {\n\t this.createVisual();\n\t this.renderChildren();\n\t var visual = this.visual;\n\t delete this.visual;\n\t return visual;\n\t },\n\n\t rotate: function() {\n\t var options = this.options;\n\t this.box.rotate(options.rotation);\n\t this.align(this.targetBox, X, options.align);\n\t this.align(this.targetBox, Y, options.vAlign);\n\t return this.box;\n\t },\n\n\t rotationTransform: function() {\n\t var rotation = this.options.rotation;\n\t if (!rotation) {\n\t return null;\n\t }\n\n\t var ref = this.normalBox.center();\n\t var cx = ref.x;\n\t var cy = ref.y;\n\t var boxCenter = this.rotatedBox.center();\n\n\t return geometryTransform()\n\t .translate(boxCenter.x - cx, boxCenter.y - cy)\n\t .rotate(rotation, [ cx, cy ]);\n\t }\n\t});\n\n\tvar Title = ChartElement.extend({\n\t init: function(options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.append(\n\t new TextBox(this.options.text, $.extend({}, this.options, {\n\t vAlign: this.options.position\n\t }))\n\t );\n\t },\n\n\t reflow: function(targetBox) {\n\t ChartElement.fn.reflow.call(this, targetBox);\n\t this.box.snapTo(targetBox, X);\n\t }\n\t});\n\n\tTitle.buildTitle = function(options, parent, defaultOptions) {\n\t var titleOptions = options;\n\n\t if (typeof options === \"string\") {\n\t titleOptions = { text: options };\n\t }\n\n\t titleOptions = $.extend({ visible: true }, defaultOptions, titleOptions);\n\n\t var title;\n\t if (titleOptions && titleOptions.visible && titleOptions.text) {\n\t title = new Title(titleOptions);\n\t parent.append(title);\n\t }\n\n\t return title;\n\t};\n\n\tsetDefaultOptions(Title, {\n\t color: BLACK,\n\t position: TOP,\n\t align: CENTER,\n\t margin: getSpacing(5),\n\t padding: getSpacing(5)\n\t});\n\n\tvar AxisLabel = TextBox.extend({\n\t init: function(value, text, index, dataItem, options) {\n\t TextBox.fn.init.call(this, text, options);\n\n\t this.text = text;\n\t this.value = value;\n\t this.index = index;\n\t this.dataItem = dataItem;\n\t this.reflow(new Box());\n\t },\n\n\t visualContext: function(targetBox) {\n\t var context = TextBox.fn.visualContext.call(this, targetBox);\n\n\t context.value = this.value;\n\t context.dataItem = this.dataItem;\n\t context.format = this.options.format;\n\t context.culture = this.options.culture;\n\n\t return context;\n\t },\n\n\t click: function(widget, e) {\n\n\t widget.trigger(AXIS_LABEL_CLICK, {\n\t element: eventElement(e),\n\t value: this.value,\n\t text: this.text,\n\t index: this.index,\n\t dataItem: this.dataItem,\n\t axis: this.parent.options\n\t });\n\t },\n\n\t rotate: function() {\n\t if (this.options.alignRotation !== CENTER) {\n\t var box = this.normalBox.toRect();\n\t var transform = this.rotationTransform();\n\n\t this.box = rectToBox(box.bbox(transform.matrix()));\n\t } else {\n\t TextBox.fn.rotate.call(this);\n\t }\n\n\t return this.box;\n\t },\n\n\t rotationTransform: function() {\n\t var options = this.options;\n\t var rotation = options.rotation;\n\t if (!rotation) {\n\t return null;\n\t }\n\n\t if (options.alignRotation === CENTER) {\n\t return TextBox.fn.rotationTransform.call(this);\n\t }\n\n\t var rotationMatrix = geometryTransform().rotate(rotation).matrix();\n\t var box = this.normalBox.toRect();\n\t var rect = this.targetBox.toRect();\n\n\t var rotationOrigin = options.rotationOrigin || TOP;\n\t var alignAxis = rotationOrigin === TOP || rotationOrigin === BOTTOM ? X : Y;\n\t var distanceAxis = rotationOrigin === TOP || rotationOrigin === BOTTOM ? Y : X;\n\t var axisAnchor = rotationOrigin === TOP || rotationOrigin === LEFT ? rect.origin : rect.bottomRight();\n\n\t var topLeft = box.topLeft().transformCopy(rotationMatrix);\n\t var topRight = box.topRight().transformCopy(rotationMatrix);\n\t var bottomRight = box.bottomRight().transformCopy(rotationMatrix);\n\t var bottomLeft = box.bottomLeft().transformCopy(rotationMatrix);\n\t var rotatedBox = Rect.fromPoints(topLeft, topRight, bottomRight, bottomLeft);\n\n\t var translate = {};\n\t translate[distanceAxis] = rect.origin[distanceAxis] - rotatedBox.origin[distanceAxis];\n\n\t var distanceLeft = Math.abs(topLeft[distanceAxis] + translate[distanceAxis] - axisAnchor[distanceAxis]);\n\t var distanceRight = Math.abs(topRight[distanceAxis] + translate[distanceAxis] - axisAnchor[distanceAxis]);\n\n\t var alignStart, alignEnd;\n\n\t if (round(distanceLeft, DEFAULT_PRECISION) === round(distanceRight, DEFAULT_PRECISION)) {\n\t alignStart = topLeft;\n\t alignEnd = topRight;\n\t } else if (distanceRight < distanceLeft) {\n\t alignStart = topRight;\n\t alignEnd = bottomRight;\n\t } else {\n\t alignStart = topLeft;\n\t alignEnd = bottomLeft;\n\t }\n\n\t var alignCenter = alignStart[alignAxis] + (alignEnd[alignAxis] - alignStart[alignAxis]) / 2;\n\t translate[alignAxis] = rect.center()[alignAxis] - alignCenter;\n\n\t return geometryTransform()\n\t .translate(translate.x, translate.y)\n\t .rotate(rotation);\n\t }\n\t});\n\n\tsetDefaultOptions(AxisLabel, {\n\t _autoReflow: false\n\t});\n\n\tvar DEFAULT_ICON_SIZE = 7;\n\tvar DEFAULT_LABEL_COLOR = \"#fff\";\n\n\tvar Note = BoxElement.extend({\n\t init: function(fields, options, chartService) {\n\t BoxElement.fn.init.call(this, options);\n\n\t this.fields = fields;\n\t this.chartService = chartService;\n\n\t this.render();\n\t },\n\n\t hide: function() {\n\t this.options.visible = false;\n\t },\n\n\t show: function() {\n\t this.options.visible = true;\n\t },\n\n\t render: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\n\t if (options.visible) {\n\t var label = options.label;\n\t var icon = options.icon;\n\t var box = new Box();\n\t var childAlias = function () { return this$1; };\n\t var size = icon.size;\n\t var text = this.fields.text;\n\t var width, height;\n\n\t if (defined(label) && label.visible) {\n\t var noteTemplate = getTemplate(label);\n\t if (noteTemplate) {\n\t text = noteTemplate(this.fields);\n\t } else if (label.format) {\n\t text = this.chartService.format.auto(label.format, text);\n\t }\n\n\t if (!label.color) {\n\t label.color = label.position === INSIDE ? DEFAULT_LABEL_COLOR : icon.background;\n\t }\n\n\t this.label = new TextBox(text, deepExtend({}, label));\n\t this.label.aliasFor = childAlias;\n\n\t if (label.position === INSIDE && !defined(size)) {\n\t if (icon.type === CIRCLE) {\n\t size = Math.max(this.label.box.width(), this.label.box.height());\n\t } else {\n\t width = this.label.box.width();\n\t height = this.label.box.height();\n\t }\n\t box.wrap(this.label.box);\n\t }\n\t }\n\n\t icon.width = width || size || DEFAULT_ICON_SIZE;\n\t icon.height = height || size || DEFAULT_ICON_SIZE;\n\n\t var marker = new ShapeElement(deepExtend({}, icon));\n\t marker.aliasFor = childAlias;\n\n\t this.marker = marker;\n\t this.append(marker);\n\n\t if (this.label) {\n\t this.append(this.label);\n\t }\n\n\t marker.reflow(new Box());\n\t this.wrapperBox = box.wrap(marker.box);\n\t }\n\t },\n\n\t reflow: function(targetBox) {\n\t var ref = this;\n\t var options = ref.options;\n\t var label = ref.label;\n\t var marker = ref.marker;\n\t var wrapperBox = ref.wrapperBox;\n\t var center = targetBox.center();\n\t var length = options.line.length;\n\t var position = options.position;\n\n\t // TODO: Review\n\t if (options.visible) {\n\t var lineStart, box, contentBox;\n\n\t if (inArray(position, [ LEFT, RIGHT ])) {\n\t if (position === LEFT) {\n\t contentBox = wrapperBox.alignTo(targetBox, position).translate(-length, targetBox.center().y - wrapperBox.center().y);\n\n\t if (options.line.visible) {\n\t lineStart = [ targetBox.x1, center.y ];\n\t this.linePoints = [\n\t lineStart,\n\t [ contentBox.x2, center.y ]\n\t ];\n\t box = contentBox.clone().wrapPoint(lineStart);\n\t }\n\t } else {\n\t contentBox = wrapperBox.alignTo(targetBox, position).translate(length, targetBox.center().y - wrapperBox.center().y);\n\n\t if (options.line.visible) {\n\t lineStart = [ targetBox.x2, center.y ];\n\t this.linePoints = [\n\t lineStart,\n\t [ contentBox.x1, center.y ]\n\t ];\n\t box = contentBox.clone().wrapPoint(lineStart);\n\t }\n\t }\n\t } else {\n\t if (position === BOTTOM) {\n\t contentBox = wrapperBox.alignTo(targetBox, position).translate(targetBox.center().x - wrapperBox.center().x, length);\n\n\t if (options.line.visible) {\n\t lineStart = [ center.x, targetBox.y2 ];\n\t this.linePoints = [\n\t lineStart,\n\t [ center.x, contentBox.y1 ]\n\t ];\n\t box = contentBox.clone().wrapPoint(lineStart);\n\t }\n\t } else {\n\t contentBox = wrapperBox.alignTo(targetBox, position).translate(targetBox.center().x - wrapperBox.center().x, -length);\n\n\t if (options.line.visible) {\n\t lineStart = [ center.x, targetBox.y1 ];\n\t this.linePoints = [\n\t lineStart,\n\t [ center.x, contentBox.y2 ]\n\t ];\n\t box = contentBox.clone().wrapPoint(lineStart);\n\t }\n\t }\n\t }\n\n\t if (marker) {\n\t marker.reflow(contentBox);\n\t }\n\n\t if (label) {\n\t label.reflow(contentBox);\n\t if (marker) {\n\t if (options.label.position === OUTSIDE) {\n\t label.box.alignTo(marker.box, position);\n\t }\n\t label.reflow(label.box);\n\t }\n\t }\n\n\t this.contentBox = contentBox;\n\t this.targetBox = targetBox;\n\t this.box = box || contentBox;\n\t }\n\t },\n\n\t createVisual: function() {\n\t BoxElement.fn.createVisual.call(this);\n\t this.visual.options.noclip = this.options.noclip;\n\n\t if (this.options.visible) {\n\t this.createLine();\n\t }\n\t },\n\n\t renderVisual: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var customVisual = options.visual;\n\t if (options.visible && customVisual) {\n\t this.visual = customVisual($.extend(this.fields, {\n\t sender: this.getSender(),\n\t rect: this.targetBox.toRect(),\n\t options: {\n\t background: options.background,\n\t border: options.background,\n\t icon: options.icon,\n\t label: options.label,\n\t line: options.line,\n\t position: options.position,\n\t visible: options.visible\n\t },\n\t createVisual: function () {\n\t this$1.createVisual();\n\t this$1.renderChildren();\n\t var defaultVisual = this$1.visual;\n\t delete this$1.visual;\n\t return defaultVisual;\n\t }\n\t }));\n\t this.addVisual();\n\t } else {\n\t BoxElement.fn.renderVisual.call(this);\n\t }\n\t },\n\n\t createLine: function() {\n\t var options = this.options.line;\n\n\t if (this.linePoints) {\n\t var path = Path.fromPoints(this.linePoints, {\n\t stroke: {\n\t color: options.color,\n\t width: options.width,\n\t dashType: options.dashType\n\t }\n\t });\n\n\t alignPathToPixel(path);\n\t this.visual.append(path);\n\t }\n\t },\n\n\t click: function(widget, e) {\n\t var args = this.eventArgs(e);\n\n\t if (!widget.trigger(NOTE_CLICK, args)) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t over: function(widget, e) {\n\t var args = this.eventArgs(e);\n\n\t if (!widget.trigger(NOTE_HOVER, args)) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t out: function(widget, e) {\n\t var args = this.eventArgs(e);\n\n\t widget.trigger(NOTE_LEAVE, args);\n\t },\n\n\t eventArgs: function(e) {\n\t var options = this.options;\n\n\t return $.extend(this.fields, {\n\t element: eventElement(e),\n\t text: defined(options.label) ? options.label.text : \"\",\n\t visual: this.visual\n\t });\n\t }\n\t});\n\n\tsetDefaultOptions(Note, {\n\t icon: {\n\t visible: true,\n\t type: CIRCLE\n\t },\n\t label: {\n\t position: INSIDE,\n\t visible: true,\n\t align: CENTER,\n\t vAlign: CENTER\n\t },\n\t line: {\n\t visible: true\n\t },\n\t visible: true,\n\t position: TOP,\n\t zIndex: 2\n\t});\n\n\tfunction createAxisTick(options, tickOptions) {\n\t var tickX = options.tickX;\n\t var tickY = options.tickY;\n\t var position = options.position;\n\n\t var tick = new Path({\n\t stroke: {\n\t width: tickOptions.width,\n\t color: tickOptions.color\n\t }\n\t });\n\n\t if (options.vertical) {\n\t tick.moveTo(tickX, position)\n\t .lineTo(tickX + tickOptions.size, position);\n\t } else {\n\t tick.moveTo(position, tickY)\n\t .lineTo(position, tickY + tickOptions.size);\n\t }\n\n\t alignPathToPixel(tick);\n\n\t return tick;\n\t}\n\n\tfunction createAxisGridLine(options, gridLine) {\n\t var lineStart = options.lineStart;\n\t var lineEnd = options.lineEnd;\n\t var position = options.position;\n\n\t var line = new Path({\n\t stroke: {\n\t width: gridLine.width,\n\t color: gridLine.color,\n\t dashType: gridLine.dashType\n\t }\n\t });\n\n\t if (options.vertical) {\n\t line.moveTo(lineStart, position)\n\t .lineTo(lineEnd, position);\n\t } else {\n\t line.moveTo(position, lineStart)\n\t .lineTo(position, lineEnd);\n\t }\n\n\t alignPathToPixel(line);\n\n\t return line;\n\t}\n\n\tvar Axis = ChartElement.extend({\n\t init: function(options, chartService) {\n\t if (chartService === void 0) { chartService = new ChartService(); }\n\n\t ChartElement.fn.init.call(this, options);\n\n\t this.chartService = chartService;\n\n\t if (!this.options.visible) {\n\t this.options = deepExtend({}, this.options, {\n\t labels: {\n\t visible: false\n\t },\n\t line: {\n\t visible: false\n\t },\n\t margin: 0,\n\t majorTickSize: 0,\n\t minorTickSize: 0\n\t });\n\t }\n\n\t this.options.minorTicks = deepExtend({}, {\n\t color: this.options.line.color,\n\t width: this.options.line.width,\n\t visible: this.options.minorTickType !== NONE\n\t }, this.options.minorTicks, {\n\t size: this.options.minorTickSize,\n\t align: this.options.minorTickType\n\t });\n\n\t this.options.majorTicks = deepExtend({}, {\n\t color: this.options.line.color,\n\t width: this.options.line.width,\n\t visible: this.options.majorTickType !== NONE\n\t }, this.options.majorTicks, {\n\t size: this.options.majorTickSize,\n\t align: this.options.majorTickType\n\t });\n\n\t this.initFields();\n\n\t if (!this.options._deferLabels) {\n\t this.createLabels();\n\t }\n\n\t this.createTitle();\n\t this.createNotes();\n\t },\n\n\t initFields: function() {\n\t },\n\n\t labelsRange: function() {\n\t return {\n\t min: this.options.labels.skip,\n\t max: this.labelsCount()\n\t };\n\t },\n\n\t normalizeLabelRotation: function(labelOptions) {\n\t var rotation = labelOptions.rotation;\n\n\t if (isObject(rotation)) {\n\t labelOptions.alignRotation = rotation.align;\n\t labelOptions.rotation = rotation.angle;\n\t }\n\t },\n\n\t createLabels: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var align = options.vertical ? RIGHT : CENTER;\n\t var labelOptions = deepExtend({ }, options.labels, {\n\t align: align,\n\t zIndex: options.zIndex\n\t });\n\t var step = Math.max(1, labelOptions.step);\n\n\t this.clearLabels();\n\n\t if (labelOptions.visible) {\n\t this.normalizeLabelRotation(labelOptions);\n\t if (labelOptions.rotation === \"auto\") {\n\t labelOptions.rotation = 0;\n\t options.autoRotateLabels = true;\n\t }\n\n\t var range = this.labelsRange();\n\t for (var idx = range.min; idx < range.max; idx += step) {\n\t var labelContext = { index: idx, count: range.max };\n\t var label = this$1.createAxisLabel(idx, labelOptions, labelContext);\n\t if (label) {\n\t this$1.append(label);\n\t this$1.labels.push(label);\n\t }\n\t }\n\t }\n\t },\n\n\t clearLabels: function() {\n\t this.children = grep(this.children, function (child) { return !(child instanceof AxisLabel); });\n\t this.labels = [];\n\t },\n\n\t clearTitle: function() {\n\t var this$1 = this;\n\n\t if (this.title) {\n\t this.children = grep(this.children, function (child) { return child !== this$1.title; });\n\t this.title = undefined;\n\t }\n\t },\n\n\t clear: function() {\n\t this.clearLabels();\n\t this.clearTitle();\n\t },\n\n\t lineBox: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var box = ref.box;\n\t var vertical = options.vertical;\n\t var mirror = options.labels.mirror;\n\t var axisX = mirror ? box.x1 : box.x2;\n\t var axisY = mirror ? box.y2 : box.y1;\n\t var lineWidth = options.line.width || 0;\n\n\t return vertical ?\n\t new Box(axisX, box.y1, axisX, box.y2 - lineWidth) :\n\t new Box(box.x1, axisY, box.x2 - lineWidth, axisY);\n\t },\n\n\t createTitle: function() {\n\t var options = this.options;\n\t var titleOptions = deepExtend({\n\t rotation: options.vertical ? -90 : 0,\n\t text: \"\",\n\t zIndex: 1,\n\t visualSize: true\n\t }, options.title);\n\n\t if (titleOptions.visible && titleOptions.text) {\n\t var title = new TextBox(titleOptions.text, titleOptions);\n\t this.append(title);\n\t this.title = title;\n\t }\n\t },\n\n\t createNotes: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var notes = options.notes;\n\t var items = notes.data || [];\n\n\t this.notes = [];\n\n\t for (var i = 0; i < items.length; i++) {\n\t var item = deepExtend({}, notes, items[i]);\n\t item.value = this$1.parseNoteValue(item.value);\n\n\t var note = new Note({\n\t value: item.value,\n\t text: item.label.text,\n\t dataItem: item\n\t }, item, this$1.chartService);\n\n\t if (note.options.visible) {\n\t if (defined(note.options.position)) {\n\t if (options.vertical && !inArray(note.options.position, [ LEFT, RIGHT ])) {\n\t note.options.position = options.reverse ? LEFT : RIGHT;\n\t } else if (!options.vertical && !inArray(note.options.position, [ TOP, BOTTOM ])) {\n\t note.options.position = options.reverse ? BOTTOM : TOP;\n\t }\n\t } else {\n\t if (options.vertical) {\n\t note.options.position = options.reverse ? LEFT : RIGHT;\n\t } else {\n\t note.options.position = options.reverse ? BOTTOM : TOP;\n\t }\n\t }\n\t this$1.append(note);\n\t this$1.notes.push(note);\n\t }\n\t }\n\t },\n\n\t parseNoteValue: function(value) {\n\t return value;\n\t },\n\n\t renderVisual: function() {\n\t ChartElement.fn.renderVisual.call(this);\n\n\t this.createPlotBands();\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\n\t this.createBackground();\n\t this.createLine();\n\t },\n\n\t gridLinesVisual: function() {\n\t var gridLines = this._gridLines;\n\t if (!gridLines) {\n\t gridLines = this._gridLines = new Group({\n\t zIndex: -2\n\t });\n\t this.appendVisual(this._gridLines);\n\t }\n\n\t return gridLines;\n\t },\n\n\t createTicks: function(lineGroup) {\n\t var options = this.options;\n\t var lineBox = this.lineBox();\n\t var mirror = options.labels.mirror;\n\t var majorUnit = options.majorTicks.visible ? options.majorUnit : 0;\n\t var tickLineOptions = {\n\t // TODO\n\t // _alignLines: options._alignLines,\n\t vertical: options.vertical\n\t };\n\n\t function render(tickPositions, tickOptions, skipUnit) {\n\t var count = tickPositions.length;\n\t var step = Math.max(1, tickOptions.step);\n\n\t if (tickOptions.visible) {\n\t for (var i = tickOptions.skip; i < count; i += step) {\n\t if (defined(skipUnit) && (i % skipUnit === 0)) {\n\t continue;\n\t }\n\n\t tickLineOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size;\n\t tickLineOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1;\n\t tickLineOptions.position = tickPositions[i];\n\n\t lineGroup.append(createAxisTick(tickLineOptions, tickOptions));\n\t }\n\t }\n\t }\n\n\t render(this.getMajorTickPositions(), options.majorTicks);\n\t render(this.getMinorTickPositions(), options.minorTicks, majorUnit / options.minorUnit);\n\t },\n\n\t createLine: function() {\n\t var options = this.options;\n\t var line = options.line;\n\t var lineBox = this.lineBox();\n\n\t if (line.width > 0 && line.visible) {\n\t var path = new Path({\n\t stroke: {\n\t width: line.width,\n\t color: line.color,\n\t dashType: line.dashType\n\t }\n\n\t /* TODO\n\t zIndex: line.zIndex,\n\t */\n\t });\n\n\t path.moveTo(lineBox.x1, lineBox.y1)\n\t .lineTo(lineBox.x2, lineBox.y2);\n\n\t if (options._alignLines) {\n\t alignPathToPixel(path);\n\t }\n\n\t var group = this._lineGroup = new Group();\n\t group.append(path);\n\n\t this.visual.append(group);\n\t this.createTicks(group);\n\t }\n\t },\n\n\t getActualTickSize: function() {\n\t var options = this.options;\n\t var tickSize = 0;\n\n\t if (options.majorTicks.visible && options.minorTicks.visible) {\n\t tickSize = Math.max(options.majorTicks.size, options.minorTicks.size);\n\t } else if (options.majorTicks.visible) {\n\t tickSize = options.majorTicks.size;\n\t } else if (options.minorTicks.visible) {\n\t tickSize = options.minorTicks.size;\n\t }\n\n\t return tickSize;\n\t },\n\n\t createBackground: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var box = ref.box;\n\t var background = options.background;\n\n\t if (background) {\n\t this._backgroundPath = Path.fromRect(box.toRect(), {\n\t fill: {\n\t color: background\n\t },\n\t stroke: null\n\t });\n\n\t this.visual.append(this._backgroundPath);\n\t }\n\t },\n\n\t createPlotBands: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var plotBands = options.plotBands || [];\n\t var vertical = options.vertical;\n\t var plotArea = this.plotArea;\n\n\t if (plotBands.length === 0) {\n\t return;\n\t }\n\n\t var group = this._plotbandGroup = new Group({\n\t zIndex: -1\n\t });\n\n\t var altAxis = grep(this.pane.axes, function (axis) { return axis.options.vertical !== this$1.options.vertical; })[0];\n\n\t for (var idx = 0; idx < plotBands.length; idx++) {\n\t var item = plotBands[idx];\n\t var slotX = (void 0), slotY = (void 0);\n\t var labelOptions = item.label;\n\t var label = (void 0);\n\n\t if (vertical) {\n\t slotX = (altAxis || plotArea.axisX).lineBox();\n\t slotY = this$1.getSlot(item.from, item.to, true);\n\t } else {\n\t slotX = this$1.getSlot(item.from, item.to, true);\n\t slotY = (altAxis || plotArea.axisY).lineBox();\n\t }\n\n\t if (labelOptions) {\n\t labelOptions.vAlign = labelOptions.position || LEFT;\n\t label = this$1.createPlotBandLabel(\n\t labelOptions,\n\t item,\n\t new Box(\n\t slotX.x1,\n\t slotY.y1,\n\t slotX.x2,\n\t slotY.y2\n\t )\n\n\t );\n\t }\n\n\t if (slotX.width() !== 0 && slotY.height() !== 0) {\n\t var bandRect = new Rect(\n\t [ slotX.x1, slotY.y1 ],\n\t [ slotX.width(), slotY.height() ]\n\t );\n\n\t var path = Path.fromRect(bandRect, {\n\t fill: {\n\t color: item.color,\n\t opacity: item.opacity\n\t },\n\t stroke: null\n\t });\n\n\t group.append(path);\n\t if (label) {\n\t group.append(label);\n\t }\n\t }\n\t }\n\n\t this.appendVisual(group);\n\t },\n\n\t createPlotBandLabel: function(label, item, box) {\n\n\t if (label.visible === false) {\n\t return null;\n\t }\n\n\t var text = label.text;\n\t var textbox;\n\n\t if (defined(label) && label.visible) {\n\t var labelTemplate = getTemplate(label);\n\t if (labelTemplate) {\n\t text = labelTemplate({ text: text, item: item });\n\t } else if (label.format) {\n\t text = this.chartService.format.auto(label.format, text);\n\t }\n\n\t if (!label.color) {\n\t label.color = this.options.labels.color;\n\t }\n\t }\n\n\t textbox = new TextBox(text, label);\n\t textbox.reflow(box);\n\t textbox.renderVisual();\n\n\t return textbox.visual;\n\t },\n\n\t createGridLines: function(altAxis) {\n\t var options = this.options;\n\t var minorGridLines = options.minorGridLines;\n\t var majorGridLines = options.majorGridLines;\n\t var minorUnit = options.minorUnit;\n\t var vertical = options.vertical;\n\t var axisLineVisible = altAxis.options.line.visible;\n\t var majorUnit = majorGridLines.visible ? options.majorUnit : 0;\n\t var lineBox = altAxis.lineBox();\n\t var linePos = lineBox[vertical ? \"y1\" : \"x1\"];\n\t var lineOptions = {\n\t lineStart: lineBox[vertical ? \"x1\" : \"y1\"],\n\t lineEnd: lineBox[vertical ? \"x2\" : \"y2\"],\n\t vertical: vertical\n\t };\n\t var majorTicks = [];\n\n\t var container = this.gridLinesVisual();\n\n\t function render(tickPositions, gridLine, skipUnit) {\n\t var count = tickPositions.length;\n\t var step = Math.max(1, gridLine.step);\n\n\t if (gridLine.visible) {\n\t for (var i = gridLine.skip; i < count; i += step) {\n\t var pos = round(tickPositions[i]);\n\t if (!inArray(pos, majorTicks)) {\n\t if (i % skipUnit !== 0 && (!axisLineVisible || linePos !== pos)) {\n\t lineOptions.position = pos;\n\t container.append(createAxisGridLine(lineOptions, gridLine));\n\n\t majorTicks.push(pos);\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t render(this.getMajorTickPositions(), majorGridLines);\n\t render(this.getMinorTickPositions(), minorGridLines, majorUnit / minorUnit);\n\n\t return container.children;\n\t },\n\n\t reflow: function(box) {\n\t var ref = this;\n\t var options = ref.options;\n\t var labels = ref.labels;\n\t var title = ref.title;\n\t var vertical = options.vertical;\n\t var count = labels.length;\n\t var sizeFn = vertical ? WIDTH : HEIGHT;\n\t var titleSize = title ? title.box[sizeFn]() : 0;\n\t var space = this.getActualTickSize() + options.margin + titleSize;\n\t var rootBox = (this.getRoot() || {}).box || box;\n\t var boxSize = rootBox[sizeFn]();\n\t var maxLabelSize = 0;\n\n\t for (var i = 0; i < count; i++) {\n\t var labelSize = labels[i].box[sizeFn]();\n\t if (labelSize + space <= boxSize) {\n\t maxLabelSize = Math.max(maxLabelSize, labelSize);\n\t }\n\t }\n\n\t if (vertical) {\n\t this.box = new Box(\n\t box.x1, box.y1,\n\t box.x1 + maxLabelSize + space, box.y2\n\t );\n\t } else {\n\t this.box = new Box(\n\t box.x1, box.y1,\n\t box.x2, box.y1 + maxLabelSize + space\n\t );\n\t }\n\n\t this.arrangeTitle();\n\t this.arrangeLabels();\n\t this.arrangeNotes();\n\t },\n\n\t getLabelsTickPositions: function() {\n\t return this.getMajorTickPositions();\n\t },\n\n\t labelTickIndex: function(label) {\n\t return label.index;\n\t },\n\n\t arrangeLabels: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var labels = ref.labels;\n\t var labelsBetweenTicks = this.labelsBetweenTicks();\n\t var vertical = options.vertical;\n\t var mirror = options.labels.mirror;\n\t var tickPositions = this.getLabelsTickPositions();\n\n\t for (var idx = 0; idx < labels.length; idx++) {\n\t var label = labels[idx];\n\t var tickIx = this$1.labelTickIndex(label);\n\t var labelSize = vertical ? label.box.height() : label.box.width();\n\t var firstTickPosition = tickPositions[tickIx];\n\t var nextTickPosition = tickPositions[tickIx + 1];\n\t var positionStart = (void 0), positionEnd = (void 0);\n\n\t if (vertical) {\n\t if (labelsBetweenTicks) {\n\t var middle = firstTickPosition + (nextTickPosition - firstTickPosition) / 2;\n\t positionStart = middle - (labelSize / 2);\n\t } else {\n\t positionStart = firstTickPosition - (labelSize / 2);\n\t }\n\n\t positionEnd = positionStart;\n\t } else {\n\t if (labelsBetweenTicks) {\n\t positionStart = firstTickPosition;\n\t positionEnd = nextTickPosition;\n\t } else {\n\t positionStart = firstTickPosition - (labelSize / 2);\n\t positionEnd = positionStart + labelSize;\n\t }\n\t }\n\n\t this$1.positionLabel(label, mirror, positionStart, positionEnd);\n\t }\n\t },\n\n\t positionLabel: function(label, mirror, positionStart, positionEnd) {\n\t if (positionEnd === void 0) { positionEnd = positionStart; }\n\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var lineBox = this.lineBox();\n\t var labelOffset = this.getActualTickSize() + options.margin;\n\t var labelBox;\n\n\t if (vertical) {\n\t var labelX = lineBox.x2;\n\n\t if (mirror) {\n\t labelX += labelOffset;\n\t label.options.rotationOrigin = LEFT;\n\t } else {\n\t labelX -= labelOffset + label.box.width();\n\t label.options.rotationOrigin = RIGHT;\n\t }\n\n\t labelBox = label.box.move(labelX, positionStart);\n\t } else {\n\t var labelY = lineBox.y1;\n\n\t if (mirror) {\n\t labelY -= labelOffset + label.box.height();\n\t label.options.rotationOrigin = BOTTOM;\n\t } else {\n\t labelY += labelOffset;\n\t label.options.rotationOrigin = TOP;\n\t }\n\n\t labelBox = new Box(\n\t positionStart, labelY,\n\t positionEnd, labelY + label.box.height()\n\t );\n\t }\n\n\t label.reflow(labelBox);\n\t },\n\n\t autoRotateLabelAngle: function(labelBox, slotWidth) {\n\t if (labelBox.width() < slotWidth) {\n\t return 0;\n\t }\n\n\t if (labelBox.height() > slotWidth) {\n\t return -90;\n\t }\n\n\t return -45;\n\t },\n\n\t autoRotateLabels: function() {\n\t var this$1 = this;\n\n\t if (!this.options.autoRotateLabels || this.options.vertical) {\n\t return false;\n\t }\n\n\t var tickPositions = this.getMajorTickPositions();\n\t var labels = this.labels;\n\t var limit = Math.min(labels.length, tickPositions.length - 1);\n\t var angle = 0;\n\n\t for (var idx = 0; idx < limit; idx++) {\n\t var width = Math.abs(tickPositions[idx + 1] - tickPositions[idx]);\n\t var labelBox = labels[idx].box;\n\t var labelAngle = this$1.autoRotateLabelAngle(labelBox, width);\n\n\t if (labelAngle !== 0) {\n\t angle = labelAngle;\n\t }\n\n\t if (angle === -90) {\n\t break;\n\t }\n\t }\n\n\t if (angle !== 0) {\n\t for (var idx$1 = 0; idx$1 < labels.length; idx$1++) {\n\t labels[idx$1].options.rotation = angle;\n\t labels[idx$1].reflow(new Box());\n\t }\n\n\t return true;\n\t }\n\t },\n\n\t arrangeTitle: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var title = ref.title;\n\t var mirror = options.labels.mirror;\n\t var vertical = options.vertical;\n\n\t if (title) {\n\t if (vertical) {\n\t title.options.align = mirror ? RIGHT : LEFT;\n\t title.options.vAlign = title.options.position;\n\t } else {\n\t title.options.align = title.options.position;\n\t title.options.vAlign = mirror ? TOP : BOTTOM;\n\t }\n\n\t title.reflow(this.box);\n\t }\n\t },\n\n\t arrangeNotes: function() {\n\t var this$1 = this;\n\n\t for (var idx = 0; idx < this.notes.length; idx++) {\n\t var item = this$1.notes[idx];\n\t var value = item.options.value;\n\t var slot = (void 0);\n\n\t if (defined(value)) {\n\t if (this$1.shouldRenderNote(value)) {\n\t item.show();\n\t } else {\n\t item.hide();\n\t }\n\n\t slot = this$1.noteSlot(value);\n\t } else {\n\t item.hide();\n\t }\n\n\t item.reflow(slot || this$1.lineBox());\n\t }\n\t },\n\n\t noteSlot: function(value) {\n\t return this.getSlot(value);\n\t },\n\n\t alignTo: function(secondAxis) {\n\t var lineBox = secondAxis.lineBox();\n\t var vertical = this.options.vertical;\n\t var pos = vertical ? Y : X;\n\n\t this.box.snapTo(lineBox, pos);\n\t if (vertical) {\n\t this.box.shrink(0, this.lineBox().height() - lineBox.height());\n\t } else {\n\t this.box.shrink(this.lineBox().width() - lineBox.width(), 0);\n\t }\n\t this.box[pos + 1] -= this.lineBox()[pos + 1] - lineBox[pos + 1];\n\t this.box[pos + 2] -= this.lineBox()[pos + 2] - lineBox[pos + 2];\n\t },\n\n\t axisLabelText: function(value, options, context) {\n\t var this$1 = this;\n\n\t var text;\n\t var tmpl = getTemplate(options);\n\t var defaultText = function () {\n\t if (!options.format) {\n\t return value;\n\t }\n\n\t return this$1.chartService.format.localeAuto(\n\t options.format, [ value ], options.culture\n\t );\n\t };\n\n\t if (tmpl) {\n\t var templateContext = $.extend({}, context, {\n\t get text() { return defaultText(); },\n\t value: value,\n\t format: options.format,\n\t culture: options.culture\n\t });\n\n\t text = tmpl(templateContext);\n\t } else {\n\t text = defaultText();\n\t }\n\n\t return text;\n\t },\n\n\t slot: function(from , to, limit) {\n\t var slot = this.getSlot(from, to, limit);\n\t if (slot) {\n\t return slot.toRect();\n\t }\n\t },\n\n\t contentBox: function() {\n\t var box = this.box.clone();\n\t var labels = this.labels;\n\t if (labels.length) {\n\t var axis = this.options.vertical ? Y : X;\n\t if (this.chartService.isPannable(axis)) {\n\t var offset = this.maxLabelOffset();\n\t box[axis + 1] -= offset.start;\n\t box[axis + 2] += offset.end;\n\t } else {\n\t if (labels[0].options.visible) {\n\t box.wrap(labels[0].box);\n\t }\n\t var lastLabel = labels[labels.length - 1];\n\t if (lastLabel.options.visible) {\n\t box.wrap(lastLabel.box);\n\t }\n\t }\n\t }\n\n\t return box;\n\t },\n\n\t maxLabelOffset: function() {\n\t var this$1 = this;\n\n\t var ref = this.options;\n\t var vertical = ref.vertical;\n\t var reverse = ref.reverse;\n\t var labelsBetweenTicks = this.labelsBetweenTicks();\n\t var tickPositions = this.getLabelsTickPositions();\n\t var offsetField = vertical ? Y : X;\n\t var labels = this.labels;\n\t var startPosition = reverse ? 1 : 0;\n\t var endPosition = reverse ? 0 : 1;\n\t var maxStartOffset = 0;\n\t var maxEndOffset = 0;\n\n\t for (var idx = 0; idx < labels.length; idx++) {\n\t var label = labels[idx];\n\t var tickIx = this$1.labelTickIndex(label);\n\t var startTick = (void 0), endTick = (void 0);\n\n\t if (labelsBetweenTicks) {\n\t startTick = tickPositions[tickIx + startPosition];\n\t endTick = tickPositions[tickIx + endPosition];\n\t } else {\n\t startTick = endTick = tickPositions[tickIx];\n\t }\n\n\t maxStartOffset = Math.max(maxStartOffset, startTick - label.box[offsetField + 1]);\n\t maxEndOffset = Math.max(maxEndOffset, label.box[offsetField + 2] - endTick);\n\t }\n\n\t return {\n\t start: maxStartOffset,\n\t end: maxEndOffset\n\t };\n\t },\n\n\t limitRange: function(from, to, min, max, offset) {\n\t var options = this.options;\n\n\t if ((from < min && offset < 0 && (!defined(options.min) || options.min <= min)) || (max < to && offset > 0 && (!defined(options.max) || max <= options.max))) {\n\t return null;\n\t }\n\n\t if ((to < min && offset > 0) || (max < from && offset < 0)) {\n\t return {\n\t min: from,\n\t max: to\n\t };\n\t }\n\n\t var rangeSize = to - from;\n\t var minValue = from;\n\t var maxValue = to;\n\n\t if (from < min && offset < 0) {\n\t minValue = limitValue(from, min, max);\n\t maxValue = limitValue(from + rangeSize, min + rangeSize, max);\n\t } else if (to > max && offset > 0) {\n\t maxValue = limitValue(to, min, max);\n\t minValue = limitValue(to - rangeSize, min, max - rangeSize);\n\t }\n\n\t return {\n\t min: minValue,\n\t max: maxValue\n\t };\n\t },\n\n\t valueRange: function() {\n\t return {\n\t min: this.seriesMin,\n\t max: this.seriesMax\n\t };\n\t },\n\n\t labelsBetweenTicks: function() {\n\t return !this.options.justified;\n\t },\n\n\t prepareUserOptions: function() {\n\t }\n\t});\n\n\tsetDefaultOptions(Axis, {\n\t labels: {\n\t visible: true,\n\t rotation: 0,\n\t mirror: false,\n\t step: 1,\n\t skip: 0\n\t },\n\t line: {\n\t width: 1,\n\t color: BLACK,\n\t visible: true\n\t },\n\t title: {\n\t visible: true,\n\t position: CENTER\n\t },\n\t majorTicks: {\n\t align: OUTSIDE,\n\t size: 4,\n\t skip: 0,\n\t step: 1\n\t },\n\t minorTicks: {\n\t align: OUTSIDE,\n\t size: 3,\n\t skip: 0,\n\t step: 1\n\t },\n\t axisCrossingValue: 0,\n\t majorTickType: OUTSIDE,\n\t minorTickType: NONE,\n\t majorGridLines: {\n\t skip: 0,\n\t step: 1\n\t },\n\t minorGridLines: {\n\t visible: false,\n\t width: 1,\n\t color: BLACK,\n\t skip: 0,\n\t step: 1\n\t },\n\t // TODO: Move to line or labels options\n\t margin: 5,\n\t visible: true,\n\t reverse: false,\n\t justified: true,\n\t notes: {\n\t label: {\n\t text: \"\"\n\t }\n\t },\n\n\t _alignLines: true,\n\t _deferLabels: false\n\t});\n\n\tvar MILLISECONDS = \"milliseconds\";\n\tvar SECONDS = \"seconds\";\n\tvar MINUTES = \"minutes\";\n\tvar HOURS = \"hours\";\n\tvar DAYS = \"days\";\n\tvar WEEKS = \"weeks\";\n\tvar MONTHS = \"months\";\n\tvar YEARS = \"years\";\n\n\tvar TIME_PER_MILLISECOND = 1;\n\tvar TIME_PER_SECOND = 1000;\n\tvar TIME_PER_MINUTE = 60 * TIME_PER_SECOND;\n\tvar TIME_PER_HOUR = 60 * TIME_PER_MINUTE;\n\tvar TIME_PER_DAY = 24 * TIME_PER_HOUR;\n\tvar TIME_PER_WEEK = 7 * TIME_PER_DAY;\n\tvar TIME_PER_MONTH = 31 * TIME_PER_DAY;\n\tvar TIME_PER_YEAR = 365 * TIME_PER_DAY;\n\tvar TIME_PER_UNIT = {\n\t \"years\": TIME_PER_YEAR,\n\t \"months\": TIME_PER_MONTH,\n\t \"weeks\": TIME_PER_WEEK,\n\t \"days\": TIME_PER_DAY,\n\t \"hours\": TIME_PER_HOUR,\n\t \"minutes\": TIME_PER_MINUTE,\n\t \"seconds\": TIME_PER_SECOND,\n\t \"milliseconds\": TIME_PER_MILLISECOND\n\t};\n\n\tfunction absoluteDateDiff(a, b) {\n\t var diff = a.getTime() - b;\n\t var offsetDiff = a.getTimezoneOffset() - b.getTimezoneOffset();\n\n\t return diff - (offsetDiff * TIME_PER_MINUTE);\n\t}\n\n\tfunction addTicks(date, ticks) {\n\t return new Date(date.getTime() + ticks);\n\t}\n\n\tfunction toDate(value) {\n\t var result;\n\n\t if (value instanceof Date) {\n\t result = value;\n\t } else if (value) {\n\t result = new Date(value);\n\t }\n\n\t return result;\n\t}\n\n\tfunction startOfWeek(date, weekStartDay) {\n\t if (weekStartDay === void 0) { weekStartDay = 0; }\n\n\t var daysToSubtract = 0;\n\t var day = date.getDay();\n\n\t if (!isNaN(day)) {\n\t while (day !== weekStartDay) {\n\t if (day === 0) {\n\t day = 6;\n\t } else {\n\t day--;\n\t }\n\n\t daysToSubtract++;\n\t }\n\t }\n\n\t return addTicks(date, -daysToSubtract * TIME_PER_DAY);\n\t}\n\n\tfunction adjustDST(date, hours) {\n\t if (hours === 0 && date.getHours() === 23) {\n\t date.setHours(date.getHours() + 2);\n\t return true;\n\t }\n\n\t return false;\n\t}\n\n\tfunction addHours(date, hours) {\n\t var roundedDate = new Date(date);\n\n\t roundedDate.setMinutes(0, 0, 0);\n\n\t var tzDiff = (date.getTimezoneOffset() - roundedDate.getTimezoneOffset()) * TIME_PER_MINUTE;\n\n\t return addTicks(roundedDate, tzDiff + hours * TIME_PER_HOUR);\n\t}\n\n\tfunction addDuration(dateValue, value, unit, weekStartDay) {\n\t var result = dateValue;\n\n\t if (dateValue) {\n\t var date = toDate(dateValue);\n\t var hours = date.getHours();\n\n\t if (unit === YEARS) {\n\t result = new Date(date.getFullYear() + value, 0, 1);\n\t adjustDST(result, 0);\n\t } else if (unit === MONTHS) {\n\t result = new Date(date.getFullYear(), date.getMonth() + value, 1);\n\t adjustDST(result, hours);\n\t } else if (unit === WEEKS) {\n\t result = addDuration(startOfWeek(date, weekStartDay), value * 7, DAYS);\n\t adjustDST(result, hours);\n\t } else if (unit === DAYS) {\n\t result = new Date(date.getFullYear(), date.getMonth(), date.getDate() + value);\n\t adjustDST(result, hours);\n\t } else if (unit === HOURS) {\n\t result = addHours(date, value);\n\t } else if (unit === MINUTES) {\n\t result = addTicks(date, value * TIME_PER_MINUTE);\n\n\t if (result.getSeconds() > 0) {\n\t result.setSeconds(0);\n\t }\n\t } else if (unit === SECONDS) {\n\t result = addTicks(date, value * TIME_PER_SECOND);\n\t } else if (unit === MILLISECONDS) {\n\t result = addTicks(date, value);\n\t }\n\n\t if (unit !== MILLISECONDS && result.getMilliseconds() > 0) {\n\t result.setMilliseconds(0);\n\t }\n\t }\n\n\t return result;\n\t}\n\n\tfunction floorDate(date, unit, weekStartDay) {\n\t return addDuration(toDate(date), 0, unit, weekStartDay);\n\t}\n\n\tfunction ceilDate(dateValue, unit, weekStartDay) {\n\t var date = toDate(dateValue);\n\n\t if (date && floorDate(date, unit, weekStartDay).getTime() === date.getTime()) {\n\t return date;\n\t }\n\n\t return addDuration(date, 1, unit, weekStartDay);\n\t}\n\n\tfunction dateComparer(a, b) {\n\t if (a && b) {\n\t return a.getTime() - b.getTime();\n\t }\n\n\t return -1;\n\t}\n\n\tfunction dateDiff(a, b) {\n\t return a.getTime() - b;\n\t}\n\n\tfunction toTime(value) {\n\t if (isArray(value)) {\n\t var result = [];\n\t for (var idx = 0; idx < value.length; idx++) {\n\t result.push(toTime(value[idx]));\n\t }\n\n\t return result;\n\t } else if (value) {\n\t return toDate(value).getTime();\n\t }\n\t}\n\n\tfunction dateEquals(a, b) {\n\t if (a && b) {\n\t return toTime(a) === toTime(b);\n\t }\n\n\t return a === b;\n\t}\n\n\tfunction timeIndex(date, start, baseUnit) {\n\t return absoluteDateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n\t}\n\n\tfunction dateIndex(value, start, baseUnit, baseUnitStep) {\n\t var date = toDate(value);\n\t var startDate = toDate(start);\n\t var index;\n\n\t if (baseUnit === MONTHS) {\n\t index = (date.getMonth() - startDate.getMonth() + (date.getFullYear() - startDate.getFullYear()) * 12) +\n\t timeIndex(date, new Date(date.getFullYear(), date.getMonth()), DAYS) / new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n\t } else if (baseUnit === YEARS) {\n\t index = date.getFullYear() - startDate.getFullYear() + dateIndex(date, new Date(date.getFullYear(), 0), MONTHS, 1) / 12;\n\t } else if (baseUnit === DAYS || baseUnit === WEEKS) {\n\t index = timeIndex(date, startDate, baseUnit);\n\t } else {\n\t index = dateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n\t }\n\n\t return index / baseUnitStep;\n\t}\n\n\tfunction duration(a, b, unit) {\n\t var diff;\n\n\t if (unit === YEARS) {\n\t diff = b.getFullYear() - a.getFullYear();\n\t } else if (unit === MONTHS) {\n\t diff = duration(a, b, YEARS) * 12 + b.getMonth() - a.getMonth();\n\t } else if (unit === DAYS) {\n\t diff = Math.floor(dateDiff(b, a) / TIME_PER_DAY);\n\t } else {\n\t diff = Math.floor(dateDiff(b, a) / TIME_PER_UNIT[unit]);\n\t }\n\n\t return diff;\n\t}\n\n\tfunction lteDateIndex(date, sortedDates) {\n\t var low = 0;\n\t var high = sortedDates.length - 1;\n\t var index;\n\n\t while (low <= high) {\n\t index = Math.floor((low + high) / 2);\n\t var currentDate = sortedDates[index];\n\n\t if (currentDate < date) {\n\t low = index + 1;\n\t continue;\n\t }\n\n\t if (currentDate > date) {\n\t high = index - 1;\n\t continue;\n\t }\n\n\t while (dateEquals(sortedDates[index - 1], date)) {\n\t index--;\n\t }\n\n\t return index;\n\t }\n\n\t if (sortedDates[index] <= date) {\n\t return index;\n\t }\n\n\t return index - 1;\n\t}\n\n\tfunction parseDate(intlService, date) {\n\t var result;\n\t if (isString(date)) {\n\t result = intlService.parseDate(date) || toDate(date);\n\t } else {\n\t result = toDate(date);\n\t }\n\t return result;\n\t}\n\n\tfunction parseDates(intlService, dates) {\n\t if (isArray(dates)) {\n\t var result = [];\n\t for (var idx = 0; idx < dates.length; idx++) {\n\t result.push(parseDate(intlService, dates[idx]));\n\t }\n\n\t return result;\n\t }\n\n\t return parseDate(intlService, dates);\n\t}\n\n\tfunction firstDay(options, intlService) {\n\t if (isNumber(options.weekStartDay)) {\n\t return options.weekStartDay;\n\t }\n\n\t if (intlService && intlService.firstDay) {\n\t return intlService.firstDay();\n\t }\n\n\t return 0;\n\t}\n\n\tvar MIN_CATEGORY_POINTS_RANGE = 0.01;\n\n\tfunction indexOf(value, arr) {\n\t if (value instanceof Date) {\n\t var length = arr.length;\n\t for (var idx = 0; idx < length; idx++) {\n\t if (dateEquals(arr[idx], value)) {\n\t return idx;\n\t }\n\t }\n\n\t return -1;\n\t }\n\n\t return arr.indexOf(value);\n\t}\n\n\tvar CategoryAxis = Axis.extend({\n\t initFields: function() {\n\t this._ticks = {};\n\t },\n\n\t categoriesHash: function() {\n\t return \"\";\n\t },\n\n\t clone: function() {\n\t var copy = new CategoryAxis($.extend({}, this.options, {\n\t categories: this.options.srcCategories\n\t }), this.chartService);\n\t copy.createLabels();\n\n\t return copy;\n\t },\n\n\t initUserOptions: function(options) {\n\t var categories = options.categories || [];\n\t var definedMin = defined(options.min);\n\t var definedMax = defined(options.max);\n\t options.srcCategories = options.categories = categories;\n\n\t if ((definedMin || definedMax) && categories.length) {\n\t var min = definedMin ? Math.floor(options.min) : 0;\n\t var max;\n\n\t if (definedMax) {\n\t max = options.justified ? Math.floor(options.max) + 1 : Math.ceil(options.max);\n\t } else {\n\t max = categories.length;\n\t }\n\n\t options.categories = options.categories.slice(min, max);\n\t }\n\n\t return options;\n\t },\n\n\t rangeIndices: function() {\n\t var options = this.options;\n\t var length = options.categories.length || 1;\n\t var min = isNumber(options.min) ? options.min % 1 : 0;\n\t var max;\n\n\t if (isNumber(options.max) && options.max % 1 !== 0 && options.max < this.totalRange().max) {\n\t max = length - (1 - options.max % 1);\n\t } else {\n\t max = length - (options.justified ? 1 : 0);\n\t }\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t },\n\n\t totalRangeIndices: function(limit) {\n\t var options = this.options;\n\t var min = isNumber(options.min) ? options.min : 0;\n\t var max;\n\n\t if (isNumber(options.max)) {\n\t max = options.max;\n\t } else if (isNumber(options.min)) {\n\t max = min + options.categories.length;\n\t } else {\n\t max = this.totalRange().max || 1;\n\t }\n\n\t if (limit) {\n\t var totalRange = this.totalRange();\n\t min = limitValue(min, 0, totalRange.max);\n\t max = limitValue(max, 0, totalRange.max);\n\t }\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t },\n\n\t range: function() {\n\t var options = this.options;\n\t var min = isNumber(options.min) ? options.min : 0;\n\t var max = isNumber(options.max) ? options.max : this.totalRange().max;\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t },\n\n\t roundedRange: function() {\n\t return this.range();\n\t },\n\n\t totalRange: function() {\n\t var options = this.options;\n\t return { min: 0, max: Math.max(this._seriesMax || 0, options.srcCategories.length) - (options.justified ? 1 : 0) };\n\t },\n\n\t scaleOptions: function() {\n\t var ref = this.rangeIndices();\n\t var min = ref.min;\n\t var max = ref.max;\n\t var lineBox = this.lineBox();\n\t var size = this.options.vertical ? lineBox.height() : lineBox.width();\n\t var scale = size / ((max - min) || 1);\n\n\t return {\n\t scale: scale * (this.options.reverse ? -1 : 1),\n\t box: lineBox,\n\t min: min,\n\t max: max\n\t };\n\t },\n\n\t arrangeLabels: function() {\n\t Axis.fn.arrangeLabels.call(this);\n\t this.hideOutOfRangeLabels();\n\t },\n\n\t hideOutOfRangeLabels: function() {\n\t var ref = this;\n\t var box = ref.box;\n\t var labels = ref.labels;\n\n\t if (labels.length > 0) {\n\t var valueAxis = this.options.vertical ? Y : X;\n\t var start = box[valueAxis + 1];\n\t var end = box[valueAxis + 2];\n\t var firstLabel = labels[0];\n\t var lastLabel = last(labels);\n\n\t if (firstLabel.box[valueAxis + 1] > end || firstLabel.box[valueAxis + 2] < start) {\n\t firstLabel.options.visible = false;\n\t }\n\t if (lastLabel.box[valueAxis + 1] > end || lastLabel.box[valueAxis + 2] < start) {\n\t lastLabel.options.visible = false;\n\t }\n\t }\n\t },\n\n\t getMajorTickPositions: function() {\n\t return this.getTicks().majorTicks;\n\t },\n\n\t getMinorTickPositions: function() {\n\t return this.getTicks().minorTicks;\n\t },\n\n\t getLabelsTickPositions: function() {\n\t return this.getTicks().labelTicks;\n\t },\n\n\t tickIndices: function(stepSize) {\n\t var ref = this.rangeIndices();\n\t var min = ref.min;\n\t var max = ref.max;\n\t var limit = Math.ceil(max);\n\t var current = Math.floor(min);\n\t var indices = [];\n\n\t while (current <= limit) {\n\t indices.push(current);\n\t current += stepSize;\n\t }\n\n\t return indices;\n\t },\n\n\t getTickPositions: function(stepSize) {\n\t var ref = this.options;\n\t var vertical = ref.vertical;\n\t var reverse = ref.reverse;\n\t var ref$1 = this.scaleOptions();\n\t var scale = ref$1.scale;\n\t var box = ref$1.box;\n\t var min = ref$1.min;\n\t var pos = box[(vertical ? Y : X) + (reverse ? 2 : 1)];\n\t var indices = this.tickIndices(stepSize);\n\t var positions = [];\n\n\t for (var idx = 0; idx < indices.length; idx++) {\n\t positions.push(pos + round(scale * (indices[idx] - min), COORD_PRECISION));\n\t }\n\n\t return positions;\n\t },\n\n\t getTicks: function() {\n\t var options = this.options;\n\t var cache = this._ticks;\n\t var range = this.rangeIndices();\n\t var lineBox = this.lineBox();\n\t var hash = lineBox.getHash() + range.min + \",\" + range.max + options.reverse + options.justified;\n\n\t if (cache._hash !== hash) {\n\t var hasMinor = options.minorTicks.visible || options.minorGridLines.visible;\n\t cache._hash = hash;\n\t cache.labelTicks = this.getTickPositions(1);\n\t cache.majorTicks = this.filterOutOfRangePositions(cache.labelTicks, lineBox);\n\t cache.minorTicks = hasMinor ? this.filterOutOfRangePositions(this.getTickPositions(0.5), lineBox) : [];\n\t }\n\n\t return cache;\n\t },\n\n\t filterOutOfRangePositions: function(positions, lineBox) {\n\t if (!positions.length) {\n\t return positions;\n\t }\n\n\t var axis = this.options.vertical ? Y : X;\n\t var inRange = function (position) { return lineBox[axis + 1] <= position && position <= lineBox[axis + 2]; };\n\n\t var end = positions.length - 1;\n\t var startIndex = 0;\n\t while (!inRange(positions[startIndex]) && startIndex <= end) {\n\t startIndex++;\n\t }\n\n\t var endIndex = end;\n\n\t while (!inRange(positions[endIndex]) && endIndex >= 0) {\n\t endIndex--;\n\t }\n\n\t return positions.slice(startIndex, endIndex + 1);\n\t },\n\n\t getSlot: function(from, to, limit) {\n\t var options = this.options;\n\t var reverse = options.reverse;\n\t var justified = options.justified;\n\t var vertical = options.vertical;\n\t var ref = this.scaleOptions();\n\t var scale = ref.scale;\n\t var box = ref.box;\n\t var min = ref.min;\n\t var valueAxis = vertical ? Y : X;\n\t var lineStart = box[valueAxis + (reverse ? 2 : 1)];\n\t var slotBox = box.clone();\n\t var singleSlot = !defined(to);\n\n\t var start = valueOrDefault(from, 0);\n\t var end = valueOrDefault(to, start);\n\t end = Math.max(end - 1, start);\n\n\t // Fixes transient bug caused by iOS 6.0 JIT\n\t // (one can never be too sure)\n\t end = Math.max(start, end);\n\n\t var p1 = lineStart + (start - min) * scale;\n\t var p2 = lineStart + (end + 1 - min) * scale;\n\n\t if (singleSlot && justified) {\n\t p2 = p1;\n\t }\n\n\t if (limit) {\n\t p1 = limitValue(p1, box[valueAxis + 1], box[valueAxis + 2]);\n\t p2 = limitValue(p2, box[valueAxis + 1], box[valueAxis + 2]);\n\t }\n\n\t slotBox[valueAxis + 1] = reverse ? p2 : p1;\n\t slotBox[valueAxis + 2] = reverse ? p1 : p2;\n\n\t return slotBox;\n\t },\n\n\t limitSlot: function(slot) {\n\t var vertical = this.options.vertical;\n\t var valueAxis = vertical ? Y : X;\n\t var lineBox = this.lineBox();\n\t var limittedSlot = slot.clone();\n\n\t limittedSlot[valueAxis + 1] = limitValue(slot[valueAxis + 1], lineBox[valueAxis + 1], lineBox[valueAxis + 2]);\n\t limittedSlot[valueAxis + 2] = limitValue(slot[valueAxis + 2], lineBox[valueAxis + 1], lineBox[valueAxis + 2]);\n\n\t return limittedSlot;\n\t },\n\n\t slot: function(from, to, limit) {\n\t var min = Math.floor(this.options.min || 0);\n\t var start = from;\n\t var end = to;\n\n\t if (typeof start === \"string\") {\n\t start = this.categoryIndex(start);\n\t } else if (isNumber(start)) {\n\t start -= min;\n\t }\n\n\t if (typeof end === \"string\") {\n\t end = this.categoryIndex(end);\n\t } else if (isNumber(end)) {\n\t end -= min;\n\t }\n\n\t return Axis.fn.slot.call(this, start, end, limit);\n\t },\n\n\t pointCategoryIndex: function(point) {\n\t var ref = this.options;\n\t var reverse = ref.reverse;\n\t var justified = ref.justified;\n\t var vertical = ref.vertical;\n\t var valueAxis = vertical ? Y : X;\n\t var ref$1 = this.scaleOptions();\n\t var scale = ref$1.scale;\n\t var box = ref$1.box;\n\t var min = ref$1.min;\n\t var max = ref$1.max;\n\t var startValue = reverse ? max : min;\n\t var lineStart = box[valueAxis + 1];\n\t var lineEnd = box[valueAxis + 2];\n\t var pos = point[valueAxis];\n\n\t if (pos < lineStart || pos > lineEnd) {\n\t return null;\n\t }\n\n\t var value = startValue + (pos - lineStart) / scale;\n\t var diff = value % 1;\n\n\t if (justified) {\n\t value = Math.round(value);\n\t } else if (diff === 0 && value > 0) {\n\t value--;\n\t }\n\n\t return Math.floor(value);\n\t },\n\n\t getCategory: function(point) {\n\t var index = this.pointCategoryIndex(point);\n\n\t if (index === null) {\n\t return null;\n\t }\n\n\t return this.options.categories[index];\n\t },\n\n\t categoryIndex: function(value) {\n\t return this.totalIndex(value) - Math.floor(this.options.min || 0);\n\t },\n\n\t categoryAt: function(index, total) {\n\t var options = this.options;\n\n\t return (total ? options.srcCategories : options.categories)[index];\n\t },\n\n\t categoriesCount: function() {\n\t return (this.options.categories || []).length;\n\t },\n\n\t translateRange: function(delta) {\n\t var options = this.options;\n\t var lineBox = this.lineBox();\n\t var size = options.vertical ? lineBox.height() : lineBox.width();\n\t var range = options.categories.length;\n\t var scale = size / range;\n\t var offset = round(delta / scale, DEFAULT_PRECISION);\n\n\t return {\n\t min: offset,\n\t max: range + offset\n\t };\n\t },\n\n\t zoomRange: function(rate) {\n\t var rangeIndices = this.totalRangeIndices();\n\t var ref = this.totalRange();\n\t var totalMin = ref.min;\n\t var totalMax = ref.max;\n\t var min = limitValue(rangeIndices.min + rate, totalMin, totalMax);\n\t var max = limitValue(rangeIndices.max - rate, totalMin, totalMax);\n\n\t if (max - min > 0) {\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t }\n\t },\n\n\t scaleRange: function(scale) {\n\t var range = this.options.categories.length;\n\t var delta = scale * range;\n\n\t return {\n\t min: -delta,\n\t max: range + delta\n\t };\n\t },\n\n\t labelsCount: function() {\n\t var labelsRange = this.labelsRange();\n\n\t return labelsRange.max - labelsRange.min;\n\t },\n\n\t labelsRange: function() {\n\t var options = this.options;\n\t var justified = options.justified;\n\t var labelOptions = options.labels;\n\t var ref = this.totalRangeIndices(true);\n\t var min = ref.min;\n\t var max = ref.max;\n\t var start = Math.floor(min);\n\n\t if (!justified) {\n\t min = Math.floor(min);\n\t max = Math.ceil(max);\n\t } else {\n\t min = Math.ceil(min);\n\t max = Math.floor(max);\n\t }\n\n\t var skip;\n\n\t if (min > labelOptions.skip) {\n\t skip = labelOptions.skip + labelOptions.step * Math.ceil((min - labelOptions.skip) / labelOptions.step);\n\t } else {\n\t skip = labelOptions.skip;\n\t }\n\n\t return {\n\t min: skip - start,\n\t max: (options.categories.length ? max + (justified ? 1 : 0) : 0) - start\n\t };\n\t },\n\n\t createAxisLabel: function(index, labelOptions, labelContext) {\n\t var options = this.options;\n\t var dataItem = options.dataItems ? options.dataItems[index] : null;\n\t var category = valueOrDefault(options.categories[index], \"\");\n\n\t labelContext.dataItem = dataItem;\n\t var text = this.axisLabelText(category, labelOptions, labelContext);\n\n\t return new AxisLabel(category, text, index, dataItem, labelOptions);\n\t },\n\n\t shouldRenderNote: function(value) {\n\t var range = this.totalRangeIndices();\n\n\t return Math.floor(range.min) <= value && value <= Math.ceil(range.max);\n\t },\n\n\t noteSlot: function(value) {\n\t var options = this.options;\n\t var index = value - Math.floor(options.min || 0);\n\t return this.getSlot(index);\n\t },\n\n\t arrangeNotes: function() {\n\t Axis.fn.arrangeNotes.call(this);\n\t this.hideOutOfRangeNotes();\n\t },\n\n\t hideOutOfRangeNotes: function() {\n\t var ref = this;\n\t var notes = ref.notes;\n\t var box = ref.box;\n\t if (notes && notes.length) {\n\t var valueAxis = this.options.vertical ? Y : X;\n\t var start = box[valueAxis + 1];\n\t var end = box[valueAxis + 2];\n\n\t for (var idx = 0; idx < notes.length; idx++) {\n\t var note = notes[idx];\n\t if (note.box && (end < note.box[valueAxis + 1] || note.box[valueAxis + 2] < start)) {\n\t note.hide();\n\t }\n\t }\n\t }\n\t },\n\n\t pan: function(delta) {\n\t var range = this.totalRangeIndices(true);\n\t var ref = this.scaleOptions();\n\t var scale = ref.scale;\n\t var offset = round(delta / scale, DEFAULT_PRECISION);\n\t var totalRange = this.totalRange();\n\t var min = range.min + offset;\n\t var max = range.max + offset;\n\n\t return this.limitRange(min, max, 0, totalRange.max, offset);\n\t },\n\n\t pointsRange: function(start, end) {\n\t var ref = this.options;\n\t var reverse = ref.reverse;\n\t var vertical = ref.vertical;\n\t var valueAxis = vertical ? Y : X;\n\t var range = this.totalRangeIndices(true);\n\t var ref$1 = this.scaleOptions();\n\t var scale = ref$1.scale;\n\t var box = ref$1.box;\n\t var lineStart = box[valueAxis + (reverse ? 2 : 1)];\n\n\t var diffStart = start[valueAxis] - lineStart;\n\t var diffEnd = end[valueAxis] - lineStart;\n\n\t var min = range.min + diffStart / scale;\n\t var max = range.min + diffEnd / scale;\n\t var rangeMin = Math.min(min, max);\n\t var rangeMax = Math.max(min, max);\n\n\t if (rangeMax - rangeMin >= MIN_CATEGORY_POINTS_RANGE) {\n\t return {\n\t min: rangeMin,\n\t max: rangeMax\n\t };\n\t }\n\t },\n\n\t valueRange: function() {\n\t return this.range();\n\t },\n\n\t totalIndex: function(value) {\n\t var options = this.options;\n\t var index = this._categoriesMap ?\n\t this._categoriesMap.get(value) : indexOf(value, options.srcCategories);\n\n\t return index;\n\t },\n\n\t currentRangeIndices: function() {\n\t var options = this.options;\n\t var min = 0;\n\n\t if (isNumber(options.min)) {\n\t min = Math.floor(options.min);\n\t }\n\n\t var max;\n\t if (isNumber(options.max)) {\n\t max = options.justified ? Math.floor(options.max) : Math.ceil(options.max) - 1;\n\t } else {\n\t max = this.totalCount() - 1;\n\t }\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t },\n\n\t mapCategories: function() {\n\t if (!this._categoriesMap) {\n\t var map$$1 = this._categoriesMap = new HashMap();\n\t var srcCategories = this.options.srcCategories;\n\t for (var idx = 0; idx < srcCategories.length; idx++) {\n\t map$$1.set(srcCategories[idx], idx);\n\t }\n\t }\n\t },\n\n\t totalCount: function() {\n\t return Math.max(this.options.srcCategories.length, this._seriesMax || 0);\n\t }\n\t});\n\n\tsetDefaultOptions(CategoryAxis, {\n\t type: \"category\",\n\t vertical: false,\n\t majorGridLines: {\n\t visible: false,\n\t width: 1,\n\t color: BLACK\n\t },\n\t labels: {\n\t zIndex: 1\n\t },\n\t justified: false,\n\t _deferLabels: true\n\t});\n\n\tvar COORDINATE_LIMIT = 300000;\n\n\tvar DateLabelFormats = {\n\t milliseconds: \"HH:mm:ss.fff\",\n\t seconds: \"HH:mm:ss\",\n\t minutes: \"HH:mm\",\n\t hours: \"HH:mm\",\n\t days: \"M/d\",\n\t weeks: \"M/d\",\n\t months: \"MMM 'yy\",\n\t years: \"yyyy\"\n\t};\n\n\tvar ZERO_THRESHOLD = 0.2;\n\n\tvar AUTO = \"auto\";\n\tvar BASE_UNITS = [\n\t MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS, WEEKS, MONTHS, YEARS\n\t];\n\tvar FIT = \"fit\";\n\n\tfunction categoryRange(categories) {\n\t var range = categories._range;\n\t if (!range) {\n\t range = categories._range = sparseArrayLimits(categories);\n\t range.min = toDate(range.min);\n\t range.max = toDate(range.max);\n\t }\n\n\t return range;\n\t}\n\n\tvar EmptyDateRange = Class.extend({\n\t init: function(options) {\n\t this.options = options;\n\t },\n\n\t displayIndices: function() {\n\t return {\n\t min: 0,\n\t max: 1\n\t };\n\t },\n\n\t displayRange: function() {\n\t return {};\n\t },\n\n\t total: function() {\n\t return {};\n\t },\n\n\t valueRange: function() {\n\t return {};\n\t },\n\n\t valueIndex: function() {\n\t return -1;\n\t },\n\n\t values: function() {\n\t return [];\n\t },\n\n\t totalIndex: function() {\n\t return -1;\n\t },\n\n\t valuesCount: function() {\n\t return 0;\n\t },\n\n\t totalCount: function() {\n\t return 0;\n\t },\n\n\t dateAt: function() {\n\t return null;\n\t }\n\t});\n\n\tvar DateRange = Class.extend({\n\t init: function(start, end, options) {\n\t this.options = options;\n\t options.baseUnitStep = options.baseUnitStep || 1;\n\n\t var roundToBaseUnit = options.roundToBaseUnit;\n\t var justified = options.justified;\n\n\t this.start = addDuration(start, 0, options.baseUnit, options.weekStartDay);\n\t var lowerEnd = this.roundToTotalStep(end);\n\t var expandEnd = !justified && dateEquals(end, lowerEnd) && !options.justifyEnd;\n\n\t this.end = this.roundToTotalStep(end, !justified, expandEnd ? 1 : 0);\n\n\t var min = options.min || start;\n\t this.valueStart = this.roundToTotalStep(min);\n\t this.displayStart = roundToBaseUnit ? this.valueStart : min;\n\n\t var max = options.max;\n\t if (!max) {\n\t this.valueEnd = lowerEnd;\n\t this.displayEnd = roundToBaseUnit || expandEnd ? this.end : end;\n\t } else {\n\t var next = !justified && dateEquals(max, this.roundToTotalStep(max)) ? -1 : 0;\n\t this.valueEnd = this.roundToTotalStep(max, false, next);\n\t this.displayEnd = roundToBaseUnit ? this.roundToTotalStep(max, !justified) : options.max;\n\t }\n\n\t if (this.valueEnd < this.valueStart) {\n\t this.valueEnd = this.valueStart;\n\t }\n\t if (this.displayEnd <= this.displayStart) {\n\t this.displayEnd = this.roundToTotalStep(this.displayStart, false, 1);\n\t }\n\t },\n\n\t displayRange: function() {\n\t return {\n\t min: this.displayStart,\n\t max: this.displayEnd\n\t };\n\t },\n\n\t displayIndices: function() {\n\t if (!this._indices) {\n\t var options = this.options;\n\n\t var baseUnit = options.baseUnit;\n\t var baseUnitStep = options.baseUnitStep;\n\n\t var minIdx = dateIndex(this.displayStart, this.valueStart, baseUnit, baseUnitStep);\n\t var maxIdx = dateIndex(this.displayEnd, this.valueStart, baseUnit, baseUnitStep);\n\n\t this._indices = { min: minIdx, max: maxIdx };\n\t }\n\n\t return this._indices;\n\t },\n\n\t total: function() {\n\t return {\n\t min: this.start,\n\t max: this.end\n\t };\n\t },\n\n\t totalCount: function() {\n\t var last$$1 = this.totalIndex(this.end);\n\n\t return last$$1 + (this.options.justified ? 1 : 0);\n\t },\n\n\t valueRange: function() {\n\t return {\n\t min: this.valueStart,\n\t max: this.valueEnd\n\t };\n\t },\n\n\t valueIndex: function(value) {\n\t var options = this.options;\n\t return Math.floor(dateIndex(value, this.valueStart, options.baseUnit, options.baseUnitStep));\n\t },\n\n\t totalIndex: function(value) {\n\t var options = this.options;\n\t return Math.floor(dateIndex(value, this.start, options.baseUnit, options.baseUnitStep));\n\t },\n\n\t dateIndex: function(value) {\n\t var options = this.options;\n\t return dateIndex(value, this.valueStart, options.baseUnit, options.baseUnitStep);\n\t },\n\n\t valuesCount: function() {\n\t var maxIdx = this.valueIndex(this.valueEnd);\n\n\t return maxIdx + 1;\n\t },\n\n\t values: function() {\n\t var values = this._values;\n\t if (!values) {\n\t var options = this.options;\n\t var range = this.valueRange();\n\t this._values = values = [];\n\n\t for (var date = range.min; date <= range.max;) {\n\t values.push(date);\n\t date = addDuration(date, options.baseUnitStep, options.baseUnit, options.weekStartDay);\n\t }\n\t }\n\n\t return values;\n\t },\n\n\t dateAt: function(index, total) {\n\t var options = this.options;\n\n\t return addDuration(total ? this.start : this.valueStart, options.baseUnitStep * index, options.baseUnit, options.weekStartDay);\n\t },\n\n\t roundToTotalStep: function(value, upper, next) {\n\t var ref = this.options;\n\t var baseUnit = ref.baseUnit;\n\t var baseUnitStep = ref.baseUnitStep;\n\t var weekStartDay = ref.weekStartDay;\n\t var start = this.start;\n\n\t var step = dateIndex(value, start, baseUnit, baseUnitStep);\n\t var roundedStep = upper ? Math.ceil(step) : Math.floor(step);\n\n\t if (next) {\n\t roundedStep += next;\n\t }\n\n\t return addDuration(start, roundedStep * baseUnitStep, baseUnit, weekStartDay);\n\t }\n\t});\n\n\tfunction autoBaseUnit(options, startUnit, startStep) {\n\t var categoryLimits = categoryRange(options.categories);\n\t var span = (options.max || categoryLimits.max) - (options.min || categoryLimits.min);\n\t var autoBaseUnitSteps = options.autoBaseUnitSteps;\n\t var maxDateGroups = options.maxDateGroups;\n\t var autoUnit = options.baseUnit === FIT;\n\t var autoUnitIx = startUnit ? BASE_UNITS.indexOf(startUnit) : 0;\n\t var baseUnit = autoUnit ? BASE_UNITS[autoUnitIx++] : options.baseUnit;\n\t var units = span / TIME_PER_UNIT[baseUnit];\n\t var totalUnits = units;\n\t var unitSteps, step, nextStep;\n\n\t while (!step || units >= maxDateGroups) {\n\t unitSteps = unitSteps || autoBaseUnitSteps[baseUnit].slice(0);\n\n\t do {\n\t nextStep = unitSteps.shift();\n\t } while (nextStep && startUnit === baseUnit && nextStep < startStep);\n\n\t if (nextStep) {\n\t step = nextStep;\n\t units = totalUnits / step;\n\t } else if (baseUnit === last(BASE_UNITS)) {\n\t step = Math.ceil(totalUnits / maxDateGroups);\n\t break;\n\t } else if (autoUnit) {\n\t baseUnit = BASE_UNITS[autoUnitIx++] || last(BASE_UNITS);\n\t totalUnits = span / TIME_PER_UNIT[baseUnit];\n\t unitSteps = null;\n\t } else {\n\t if (units > maxDateGroups) {\n\t step = Math.ceil(totalUnits / maxDateGroups);\n\t }\n\t break;\n\t }\n\t }\n\n\t options.baseUnitStep = step;\n\t options.baseUnit = baseUnit;\n\t}\n\n\tfunction defaultBaseUnit(options) {\n\t var categories = options.categories;\n\t var count = defined(categories) ? categories.length : 0;\n\t var minDiff = MAX_VALUE;\n\t var lastCategory, unit;\n\n\t for (var categoryIx = 0; categoryIx < count; categoryIx++) {\n\t var category = categories[categoryIx];\n\n\t if (category && lastCategory) {\n\t var diff = absoluteDateDiff(category, lastCategory);\n\t if (diff > 0) {\n\t minDiff = Math.min(minDiff, diff);\n\n\t if (minDiff >= TIME_PER_YEAR) {\n\t unit = YEARS;\n\t } else if (minDiff >= TIME_PER_MONTH - TIME_PER_DAY * 3) {\n\t unit = MONTHS;\n\t } else if (minDiff >= TIME_PER_WEEK) {\n\t unit = WEEKS;\n\t } else if (minDiff >= TIME_PER_DAY) {\n\t unit = DAYS;\n\t } else if (minDiff >= TIME_PER_HOUR) {\n\t unit = HOURS;\n\t } else if (minDiff >= TIME_PER_MINUTE) {\n\t unit = MINUTES;\n\t } else {\n\t unit = SECONDS;\n\t }\n\t }\n\t }\n\n\t lastCategory = category;\n\t }\n\n\t options.baseUnit = unit || DAYS;\n\t}\n\n\tfunction initUnit(options) {\n\t var baseUnit = (options.baseUnit || \"\").toLowerCase();\n\t var useDefault = baseUnit !== FIT && !inArray(baseUnit, BASE_UNITS);\n\n\t if (useDefault) {\n\t defaultBaseUnit(options);\n\t }\n\n\t if (baseUnit === FIT || options.baseUnitStep === AUTO) {\n\t autoBaseUnit(options);\n\t }\n\n\t return options;\n\t}\n\n\tvar DateCategoryAxis = CategoryAxis.extend({\n\t clone: function() {\n\t var copy = new DateCategoryAxis($.extend({}, this.options), this.chartService);\n\t copy.createLabels();\n\n\t return copy;\n\t },\n\n\t categoriesHash: function() {\n\t var start = this.dataRange.total().min;\n\t return this.options.baseUnit + this.options.baseUnitStep + start;\n\t },\n\n\t initUserOptions: function(options) {\n\t return options;\n\t },\n\n\t initFields: function() {\n\t CategoryAxis.fn.initFields.call(this);\n\n\t var chartService = this.chartService;\n\t var intlService = chartService.intl;\n\t var options = this.options;\n\n\t var categories = options.categories || [];\n\t if (!categories._parsed) {\n\t categories = parseDates(intlService, categories);\n\t categories._parsed = true;\n\t }\n\n\t options = deepExtend({\n\t roundToBaseUnit: true\n\t }, options, {\n\t categories: categories,\n\t min: parseDate(intlService, options.min),\n\t max: parseDate(intlService, options.max),\n\t weekStartDay: firstDay(options, intlService)\n\t });\n\n\t if (chartService.panning && chartService.isPannable(options.vertical ? Y : X)) {\n\t options.roundToBaseUnit = false;\n\t }\n\n\t options.userSetBaseUnit = options.userSetBaseUnit || options.baseUnit;\n\t options.userSetBaseUnitStep = options.userSetBaseUnitStep || options.baseUnitStep;\n\n\t this.options = options;\n\t options.srcCategories = categories;\n\n\t if (categories.length > 0) {\n\t var range = categoryRange(categories);\n\t var maxDivisions = options.maxDivisions;\n\n\t this.dataRange = new DateRange(range.min, range.max, initUnit(options));\n\n\t if (maxDivisions) {\n\t var dataRange = this.dataRange.displayRange();\n\n\t var divisionOptions = $.extend({}, options, {\n\t justified: true,\n\t roundToBaseUnit: false,\n\t baseUnit: 'fit',\n\t min: dataRange.min,\n\t max: dataRange.max,\n\t maxDateGroups: maxDivisions\n\t });\n\n\t var dataRangeOptions = this.dataRange.options;\n\n\t autoBaseUnit(divisionOptions, dataRangeOptions.baseUnit, dataRangeOptions.baseUnitStep);\n\n\t this.divisionRange = new DateRange(range.min, range.max, divisionOptions);\n\t } else {\n\t this.divisionRange = this.dataRange;\n\t }\n\n\t } else {\n\t options.baseUnit = options.baseUnit || DAYS;\n\t this.dataRange = this.divisionRange = new EmptyDateRange(options);\n\t }\n\n\t this.rangeLabels = [];\n\t },\n\n\t tickIndices: function(stepSize) {\n\t var ref = this;\n\t var dataRange = ref.dataRange;\n\t var divisionRange = ref.divisionRange;\n\t var valuesCount = divisionRange.valuesCount();\n\n\t if (!this.options.maxDivisions || !valuesCount) {\n\t return CategoryAxis.fn.tickIndices.call(this, stepSize);\n\t }\n\n\t var indices = [];\n\t var values = divisionRange.values();\n\t var offset = 0;\n\n\t if (!this.options.justified) {\n\t values = values.concat(divisionRange.dateAt(valuesCount));\n\t offset = 0.5;//align ticks to the center of not justified categories\n\t }\n\n\t for (var idx = 0; idx < values.length; idx++) {\n\t indices.push(dataRange.dateIndex(values[idx]) + offset);\n\t if (stepSize !== 1 && idx >= 1) {\n\t var last$$1 = indices.length - 1;\n\t indices.splice(idx, 0, indices[last$$1 - 1] + (indices[last$$1] - indices[last$$1 - 1]) * stepSize);\n\t }\n\t }\n\n\t return indices;\n\t },\n\n\t shouldRenderNote: function(value) {\n\t var range = this.range();\n\t var categories = this.options.categories || [];\n\n\t return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0 && categories.length;\n\t },\n\n\t parseNoteValue: function(value) {\n\t return parseDate(this.chartService.intl, value);\n\t },\n\n\t noteSlot: function(value) {\n\t return this.getSlot(value);\n\t },\n\n\t translateRange: function(delta) {\n\t var options = this.options;\n\t var baseUnit = options.baseUnit;\n\t var weekStartDay = options.weekStartDay;\n\t var vertical = options.vertical;\n\t var lineBox = this.lineBox();\n\t var size = vertical ? lineBox.height() : lineBox.width();\n\t var range = this.range();\n\t var scale = size / (range.max - range.min);\n\t var offset = round(delta / scale, DEFAULT_PRECISION);\n\n\t if (range.min && range.max) {\n\t var from = addTicks(options.min || range.min, offset);\n\t var to = addTicks(options.max || range.max, offset);\n\n\t range = {\n\t min: addDuration(from, 0, baseUnit, weekStartDay),\n\t max: addDuration(to, 0, baseUnit, weekStartDay)\n\t };\n\t }\n\n\t return range;\n\t },\n\n\t scaleRange: function(delta) {\n\t var rounds = Math.abs(delta);\n\t var result = this.range();\n\t var from = result.min;\n\t var to = result.max;\n\n\t if (from && to) {\n\t while (rounds--) {\n\t var range = dateDiff(from, to);\n\t var step = Math.round(range * 0.1);\n\t if (delta < 0) {\n\t from = addTicks(from, step);\n\t to = addTicks(to, -step);\n\t } else {\n\t from = addTicks(from, -step);\n\t to = addTicks(to, step);\n\t }\n\t }\n\n\t result = { min: from, max: to };\n\t }\n\n\t return result;\n\t },\n\n\t labelsRange: function() {\n\t return {\n\t min: this.options.labels.skip,\n\t max: this.divisionRange.valuesCount()\n\t };\n\t },\n\n\t pan: function(delta) {\n\t if (this.isEmpty()) {\n\t return null;\n\t }\n\n\t var options = this.options;\n\t var lineBox = this.lineBox();\n\t var size = options.vertical ? lineBox.height() : lineBox.width();\n\t var ref = this.dataRange.displayRange();\n\t var min = ref.min;\n\t var max = ref.max;\n\t var totalLimits = this.dataRange.total();\n\t var scale = size / (max - min);\n\t var offset = round(delta / scale, DEFAULT_PRECISION) * (options.reverse ? -1 : 1);\n\t var from = addTicks(min, offset);\n\t var to = addTicks(max, offset);\n\n\t var panRange = this.limitRange(toTime(from), toTime(to), toTime(totalLimits.min), toTime(totalLimits.max), offset);\n\n\t if (panRange) {\n\t panRange.min = toDate(panRange.min);\n\t panRange.max = toDate(panRange.max);\n\t panRange.baseUnit = options.baseUnit;\n\t panRange.baseUnitStep = options.baseUnitStep || 1;\n\t panRange.userSetBaseUnit = options.userSetBaseUnit;\n\t panRange.userSetBaseUnitStep = options.userSetBaseUnitStep;\n\n\t return panRange;\n\t }\n\t },\n\n\t pointsRange: function(start, end) {\n\t if (this.isEmpty()) {\n\t return null;\n\t }\n\n\t var pointsRange = CategoryAxis.fn.pointsRange.call(this, start, end);\n\t var datesRange = this.dataRange.displayRange();\n\t var indicesRange = this.dataRange.displayIndices();\n\t var scale = dateDiff(datesRange.max, datesRange.min) / (indicesRange.max - indicesRange.min);\n\t var options = this.options;\n\n\t var min = addTicks(datesRange.min, pointsRange.min * scale);\n\t var max = addTicks(datesRange.min, pointsRange.max * scale);\n\n\t return {\n\t min: min,\n\t max: max,\n\t baseUnit: options.userSetBaseUnit || options.baseUnit,\n\t baseUnitStep: options.userSetBaseUnitStep || options.baseUnitStep\n\t };\n\t },\n\n\t zoomRange: function(delta) {\n\t if (this.isEmpty()) {\n\t return null;\n\t }\n\n\t var options = this.options;\n\t var fit = options.userSetBaseUnit === FIT;\n\t var totalLimits = this.dataRange.total();\n\t var ref = this.dataRange.displayRange();\n\t var rangeMin = ref.min;\n\t var rangeMax = ref.max;\n\t var ref$1 = this.dataRange.options;\n\t var weekStartDay = ref$1.weekStartDay;\n\t var baseUnit = ref$1.baseUnit;\n\t var baseUnitStep = ref$1.baseUnitStep;\n\t var min = addDuration(rangeMin, delta * baseUnitStep, baseUnit, weekStartDay);\n\t var max = addDuration(rangeMax, -delta * baseUnitStep, baseUnit, weekStartDay);\n\n\t if (fit) {\n\t var autoBaseUnitSteps = options.autoBaseUnitSteps;\n\t var maxDateGroups = options.maxDateGroups;\n\n\t var maxDiff = last(autoBaseUnitSteps[baseUnit]) * maxDateGroups * TIME_PER_UNIT[baseUnit];\n\t var rangeDiff = dateDiff(rangeMax, rangeMin);\n\t var diff = dateDiff(max, min);\n\t var baseUnitIndex = BASE_UNITS.indexOf(baseUnit);\n\t var autoBaseUnitStep, ticks;\n\n\t if (diff < TIME_PER_UNIT[baseUnit] && baseUnit !== MILLISECONDS) {\n\t baseUnit = BASE_UNITS[baseUnitIndex - 1];\n\t autoBaseUnitStep = last(autoBaseUnitSteps[baseUnit]);\n\t ticks = (rangeDiff - (maxDateGroups - 1) * autoBaseUnitStep * TIME_PER_UNIT[baseUnit]) / 2;\n\t min = addTicks(rangeMin, ticks);\n\t max = addTicks(rangeMax, -ticks);\n\n\t } else if (diff > maxDiff && baseUnit !== YEARS) {\n\t var stepIndex = 0;\n\n\t do {\n\t baseUnitIndex++;\n\t baseUnit = BASE_UNITS[baseUnitIndex];\n\t stepIndex = 0;\n\t ticks = 2 * TIME_PER_UNIT[baseUnit];\n\t do {\n\t autoBaseUnitStep = autoBaseUnitSteps[baseUnit][stepIndex];\n\t stepIndex++;\n\t } while (stepIndex < autoBaseUnitSteps[baseUnit].length && ticks * autoBaseUnitStep < rangeDiff);\n\t } while (baseUnit !== YEARS && ticks * autoBaseUnitStep < rangeDiff);\n\n\t ticks = (ticks * autoBaseUnitStep - rangeDiff) / 2;\n\t if (ticks > 0) {\n\t min = addTicks(rangeMin, -ticks);\n\t max = addTicks(rangeMax, ticks);\n\t min = addTicks(min, limitValue(max, totalLimits.min, totalLimits.max) - max);\n\t max = addTicks(max, limitValue(min, totalLimits.min, totalLimits.max) - min);\n\t }\n\t }\n\t }\n\n\t if (min < totalLimits.min) {\n\t min = totalLimits.min;\n\t }\n\t if (max > totalLimits.max) {\n\t max = totalLimits.max;\n\t }\n\n\t if (min && max && dateDiff(max, min) > 0) {\n\t return {\n\t min: min,\n\t max: max,\n\t baseUnit: options.userSetBaseUnit || options.baseUnit,\n\t baseUnitStep: options.userSetBaseUnitStep || options.baseUnitStep\n\t };\n\t }\n\t },\n\n\t range: function() {\n\t return this.dataRange.displayRange();\n\t },\n\n\t createLabels: function() {\n\t CategoryAxis.fn.createLabels.call(this);\n\t this.createRangeLabels();\n\t },\n\n\t clearLabels: function() {\n\t CategoryAxis.fn.clearLabels.call(this);\n\t this.rangeLabels = [];\n\t },\n\n\t arrangeLabels: function() {\n\t this.arrangeRangeLabels();\n\t CategoryAxis.fn.arrangeLabels.call(this);\n\t },\n\n\t arrangeRangeLabels: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var rangeLabels = ref.rangeLabels;\n\t if (rangeLabels.length === 0) {\n\t return;\n\t }\n\n\t var lineBox = this.lineBox();\n\t var vertical = options.vertical;\n\t var mirror = options.rangeLabels.mirror || options.labels.mirror;\n\n\t var firstLabel = rangeLabels[0];\n\t if (firstLabel) {\n\t var position = vertical ? lineBox.y1 - (firstLabel.box.height() / 2) : lineBox.x1;\n\t this.positionLabel(firstLabel, mirror, position);\n\t }\n\n\t var lastLabel = rangeLabels[1];\n\t if (lastLabel) {\n\t var position$1 = vertical ? lineBox.y2 - (lastLabel.box.height() / 2) : lineBox.x2;\n\t this.positionLabel(lastLabel, mirror, position$1);\n\t }\n\t },\n\n\t autoRotateLabels: function() {\n\t CategoryAxis.fn.autoRotateLabels.call(this);\n\t this.autoRotateRangeLabels();\n\t },\n\n\t hideOutOfRangeLabels: function() {\n\t CategoryAxis.fn.hideOutOfRangeLabels.call(this);\n\t this.hideOverlappingLabels();\n\t },\n\n\t hideOverlappingLabels: function() {\n\t var ref = this;\n\t var rangeLabels = ref.rangeLabels;\n\t var labels = ref.labels;\n\t if (rangeLabels.length === 0) {\n\t return;\n\t }\n\n\t function clip(rangeLabel, label) {\n\t if (!label.options.visible || label.box.overlaps(rangeLabel.box)) {\n\t label.options.visible = false;\n\t return true;\n\t }\n\n\t return false;\n\t }\n\n\t var firstRangeLabel = rangeLabels[0];\n\t if (firstRangeLabel && firstRangeLabel.options.visible) {\n\t for (var i = 0; i < labels.length; i++) {\n\t var overlaps = clip(firstRangeLabel, labels[i]);\n\t if (!overlaps) {\n\t break;\n\t }\n\t }\n\t }\n\n\t var lastRangeLabel = rangeLabels[1];\n\t if (lastRangeLabel && lastRangeLabel.options.visible) {\n\t for (var i$1 = labels.length - 1; i$1 > 0; --i$1) {\n\t var overlaps$1 = clip(lastRangeLabel, labels[i$1]);\n\t if (!overlaps$1) {\n\t break;\n\t }\n\t }\n\t }\n\t },\n\n\t contentBox: function() {\n\t var box = CategoryAxis.fn.contentBox.call(this);\n\t var rangeLabels = this.rangeLabels;\n\n\t for (var i = 0; i < rangeLabels.length; i++) {\n\t var label = rangeLabels[i];\n\t if (label.options.visible) {\n\t box.wrap(label.box);\n\t }\n\t }\n\n\t return box;\n\t },\n\n\t createAxisLabel: function(index, labelOptions, labelContext) {\n\t if (labelContext === void 0) { labelContext = {}; }\n\n\t var options = this.options;\n\t var dataItem = options.dataItems && !options.maxDivisions ? options.dataItems[index] : null;\n\t var date = this.divisionRange.dateAt(index);\n\t var unitFormat = labelOptions.dateFormats[this.divisionRange.options.baseUnit];\n\n\t labelOptions.format = labelOptions.format || unitFormat;\n\t labelContext.dataItem = dataItem;\n\n\t var text = this.axisLabelText(date, labelOptions, labelContext);\n\t if (text) {\n\t return new AxisLabel(date, text, index, dataItem, labelOptions);\n\t }\n\t },\n\n\t createRangeLabels: function() {\n\t var this$1 = this;\n\n\t var ref = this.divisionRange;\n\t var displayStart = ref.displayStart;\n\t var displayEnd = ref.displayEnd;\n\t var options = this.options;\n\t var labelOptions = $.extend({}, options.labels, options.rangeLabels, {\n\t align: CENTER,\n\t zIndex: options.zIndex\n\t });\n\n\t if (labelOptions.visible !== true) {\n\t return;\n\t }\n\n\t this.normalizeLabelRotation(labelOptions);\n\t labelOptions.alignRotation = CENTER;\n\n\t if (labelOptions.rotation === \"auto\") {\n\t labelOptions.rotation = 0;\n\t options.autoRotateRangeLabels = true;\n\t }\n\n\t var unitFormat = labelOptions.dateFormats[this.divisionRange.options.baseUnit];\n\t labelOptions.format = labelOptions.format || unitFormat;\n\n\t var createLabel = function (index, date, text) {\n\t if (text) {\n\t var label = new AxisLabel(date, text, index, null, labelOptions);\n\t this$1.append(label);\n\t this$1.rangeLabels.push(label);\n\t }\n\t };\n\n\t var startText = this.axisLabelText(displayStart, labelOptions, { index: 0, count: 2 });\n\t createLabel(0, displayStart, startText);\n\n\t var endText = this.axisLabelText(displayEnd, labelOptions, { index: 1, count: 2 });\n\t createLabel(1, displayEnd, endText);\n\t },\n\n\t autoRotateRangeLabels: function() {\n\t var this$1 = this;\n\n\t var labels = this.rangeLabels;\n\t if (!this.options.autoRotateRangeLabels || this.options.vertical || labels.length !== 2) {\n\t return;\n\t }\n\n\t var rotateLabel = function (label, tickPositions, index) {\n\t var width = Math.abs(tickPositions[index + 1] - tickPositions[index]) * 2;\n\t var angle = this$1.autoRotateLabelAngle(label.box, width);\n\t if (angle !== 0) {\n\t label.options.rotation = angle;\n\t label.reflow(new Box());\n\t }\n\t };\n\n\t var tickPositions = this.getMajorTickPositions();\n\t rotateLabel(labels[0], tickPositions, 0);\n\t rotateLabel(labels[1], tickPositions, tickPositions.length - 2);\n\t },\n\n\t categoryIndex: function(value) {\n\t return this.dataRange.valueIndex(value);\n\t },\n\n\t slot: function(from, to, limit) {\n\t var dateRange = this.dataRange;\n\t var start = from;\n\t var end = to;\n\n\t if (start instanceof Date) {\n\t start = dateRange.dateIndex(start);\n\t }\n\n\t if (end instanceof Date) {\n\t end = dateRange.dateIndex(end);\n\t }\n\n\t var slot = this.getSlot(start, end, limit);\n\t if (slot) {\n\t return slot.toRect();\n\t }\n\t },\n\n\t getSlot: function(a, b, limit) {\n\t var start = a;\n\t var end = b;\n\n\t if (typeof start === OBJECT) {\n\t start = this.categoryIndex(start);\n\t }\n\n\t if (typeof end === OBJECT) {\n\t end = this.categoryIndex(end);\n\t }\n\n\t return CategoryAxis.fn.getSlot.call(this, start, end, limit);\n\t },\n\n\t valueRange: function() {\n\t var options = this.options;\n\t var range = categoryRange(options.srcCategories);\n\n\t return {\n\t min: toDate(range.min),\n\t max: toDate(range.max)\n\t };\n\t },\n\n\t categoryAt: function(index, total) {\n\t return this.dataRange.dateAt(index, total);\n\t },\n\n\t categoriesCount: function() {\n\t return this.dataRange.valuesCount();\n\t },\n\n\t rangeIndices: function() {\n\t return this.dataRange.displayIndices();\n\t },\n\n\t labelsBetweenTicks: function() {\n\t return !this.divisionRange.options.justified;\n\t },\n\n\t prepareUserOptions: function() {\n\t if (this.isEmpty()) {\n\t return;\n\t }\n\n\t this.options.categories = this.dataRange.values();\n\t },\n\n\t getCategory: function(point) {\n\t var index = this.pointCategoryIndex(point);\n\n\t if (index === null) {\n\t return null;\n\t }\n\n\t return this.dataRange.dateAt(index);\n\t },\n\n\t totalIndex: function(value) {\n\t return this.dataRange.totalIndex(value);\n\t },\n\n\t currentRangeIndices: function() {\n\t var range = this.dataRange.valueRange();\n\t return {\n\t min: this.dataRange.totalIndex(range.min),\n\t max: this.dataRange.totalIndex(range.max)\n\t };\n\t },\n\n\t totalRange: function() {\n\t return this.dataRange.total();\n\t },\n\n\t totalCount: function() {\n\t return this.dataRange.totalCount();\n\t },\n\n\t isEmpty: function() {\n\t return !this.options.srcCategories.length;\n\t },\n\n\t roundedRange: function() {\n\t if (this.options.roundToBaseUnit !== false || this.isEmpty()) {\n\t return this.range();\n\t }\n\n\t var options = this.options;\n\t var datesRange = categoryRange(options.srcCategories);\n\n\t var dateRange = new DateRange(datesRange.min, datesRange.max, $.extend({}, options, {\n\t justified: false,\n\t roundToBaseUnit: true,\n\t justifyEnd: options.justified\n\t }));\n\n\t return dateRange.displayRange();\n\t }\n\t});\n\n\tsetDefaultOptions(DateCategoryAxis, {\n\t type: DATE,\n\t labels: {\n\t dateFormats: DateLabelFormats\n\t },\n\t rangeLabels: {\n\t visible: false\n\t },\n\t autoBaseUnitSteps: {\n\t milliseconds: [ 1, 10, 100 ],\n\t seconds: [ 1, 2, 5, 15, 30 ],\n\t minutes: [ 1, 2, 5, 15, 30 ],\n\t hours: [ 1, 2, 3 ],\n\t days: [ 1, 2, 3 ],\n\t weeks: [ 1, 2 ],\n\t months: [ 1, 2, 3, 6 ],\n\t years: [ 1, 2, 3, 5, 10, 25, 50 ]\n\t },\n\t maxDateGroups: 10\n\t});\n\n\tfunction autoAxisMin(min, max, narrow) {\n\t if (!min && !max) {\n\t return 0;\n\t }\n\n\t var axisMin;\n\n\t if (min >= 0 && max >= 0) {\n\t var minValue = min === max ? 0 : min;\n\n\t var diff = (max - minValue) / max;\n\t if (narrow === false || (!narrow && diff > ZERO_THRESHOLD)) {\n\t return 0;\n\t }\n\n\t axisMin = Math.max(0, minValue - ((max - minValue) / 2));\n\t } else {\n\t axisMin = min;\n\t }\n\n\t return axisMin;\n\t}\n\n\tfunction autoAxisMax(min, max, narrow) {\n\t if (!min && !max) {\n\t return 1;\n\t }\n\n\t var axisMax;\n\n\t if (min <= 0 && max <= 0) {\n\t var maxValue = min === max ? 0 : max;\n\n\t var diff = Math.abs((maxValue - min) / maxValue);\n\t if (narrow === false || (!narrow && diff > ZERO_THRESHOLD)) {\n\t return 0;\n\t }\n\n\t axisMax = Math.min(0, maxValue - ((min - maxValue) / 2));\n\t } else {\n\t axisMax = max;\n\t }\n\n\t return axisMax;\n\t}\n\n\tfunction floor(value, step) {\n\t return round(Math.floor(value / step) * step, DEFAULT_PRECISION);\n\t}\n\n\tfunction ceil(value, step) {\n\t return round(Math.ceil(value / step) * step, DEFAULT_PRECISION);\n\t}\n\n\tfunction limitCoordinate(value) {\n\t return Math.max(Math.min(value, COORDINATE_LIMIT), -COORDINATE_LIMIT);\n\t}\n\n\tvar MIN_VALUE_RANGE = Math.pow(10, -DEFAULT_PRECISION + 1);\n\n\tvar NumericAxis = Axis.extend({\n\t init: function(seriesMin, seriesMax, options, chartService) {\n\t Axis.fn.init.call(this, $.extend({}, options, {\n\t seriesMin: seriesMin,\n\t seriesMax: seriesMax\n\t }), chartService);\n\t },\n\n\t initUserOptions: function(options) {\n\t var autoOptions = autoAxisOptions(options.seriesMin, options.seriesMax, options);\n\t this.totalOptions = totalAxisOptions(autoOptions, options);\n\n\t return axisOptions(autoOptions, options);\n\t },\n\n\t initFields: function() {\n\t this.totalMin = this.totalOptions.min;\n\t this.totalMax = this.totalOptions.max;\n\t this.totalMajorUnit = this.totalOptions.majorUnit;\n\t this.seriesMin = this.options.seriesMin;\n\t this.seriesMax = this.options.seriesMax;\n\t },\n\n\t clone: function() {\n\t return new NumericAxis(\n\t this.seriesMin,\n\t this.seriesMax,\n\t $.extend({}, this.options),\n\t this.chartService\n\t );\n\t },\n\n\t startValue: function() {\n\t return 0;\n\t },\n\n\t range: function() {\n\t var options = this.options;\n\t return { min: options.min, max: options.max };\n\t },\n\n\t getDivisions: function(stepValue) {\n\t if (stepValue === 0) {\n\t return 1;\n\t }\n\n\t var options = this.options;\n\t var range = options.max - options.min;\n\n\t return Math.floor(round(range / stepValue, COORD_PRECISION)) + 1;\n\t },\n\n\t getTickPositions: function(unit, skipUnit) {\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var reverse = options.reverse;\n\t var lineBox = this.lineBox();\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var range = options.max - options.min;\n\t var scale = lineSize / range;\n\t var step = unit * scale;\n\t var divisions = this.getDivisions(unit);\n\t var dir = (vertical ? -1 : 1) * (reverse ? -1 : 1);\n\t var startEdge = dir === 1 ? 1 : 2;\n\t var positions = [];\n\t var pos = lineBox[(vertical ? Y : X) + startEdge];\n\t var skipStep = 0;\n\n\t if (skipUnit) {\n\t skipStep = skipUnit / unit;\n\t }\n\n\t for (var idx = 0; idx < divisions; idx++) {\n\t if (idx % skipStep !== 0) {\n\t positions.push(round(pos, COORD_PRECISION));\n\t }\n\n\t pos = pos + step * dir;\n\t }\n\n\t return positions;\n\t },\n\n\t getMajorTickPositions: function() {\n\t return this.getTickPositions(this.options.majorUnit);\n\t },\n\n\t getMinorTickPositions: function() {\n\t return this.getTickPositions(this.options.minorUnit);\n\t },\n\n\t getSlot: function(a, b, limit) {\n\t if (limit === void 0) { limit = false; }\n\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var reverse = options.reverse;\n\t var valueAxis = vertical ? Y : X;\n\t var lineBox = this.lineBox();\n\t var lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var dir = reverse ? -1 : 1;\n\t var step = dir * (lineSize / (options.max - options.min));\n\t var slotBox = new Box(lineBox.x1, lineBox.y1, lineBox.x1, lineBox.y1);\n\n\t var start = a;\n\t var end = b;\n\n\t if (!defined(start)) {\n\t start = end || 0;\n\t }\n\n\t if (!defined(end)) {\n\t end = start || 0;\n\t }\n\n\t if (limit) {\n\t start = Math.max(Math.min(start, options.max), options.min);\n\t end = Math.max(Math.min(end, options.max), options.min);\n\t }\n\n\t var p1, p2;\n\n\t if (vertical) {\n\t p1 = options.max - Math.max(start, end);\n\t p2 = options.max - Math.min(start, end);\n\t } else {\n\t p1 = Math.min(start, end) - options.min;\n\t p2 = Math.max(start, end) - options.min;\n\t }\n\n\t slotBox[valueAxis + 1] = limitCoordinate(lineStart + step * (reverse ? p2 : p1));\n\t slotBox[valueAxis + 2] = limitCoordinate(lineStart + step * (reverse ? p1 : p2));\n\n\t return slotBox;\n\t },\n\n\t getValue: function(point) {\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var reverse = options.reverse;\n\t var max = Number(options.max);\n\t var min = Number(options.min);\n\t var valueAxis = vertical ? Y : X;\n\t var lineBox = this.lineBox();\n\t var lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var dir = reverse ? -1 : 1;\n\t var offset = dir * (point[valueAxis] - lineStart);\n\t var step = (max - min) / lineSize;\n\t var valueOffset = offset * step;\n\n\t if (offset < 0 || offset > lineSize) {\n\t return null;\n\t }\n\n\t var value = vertical ?\n\t max - valueOffset :\n\t min + valueOffset;\n\n\t return round(value, DEFAULT_PRECISION);\n\t },\n\n\t translateRange: function(delta) {\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var reverse = options.reverse;\n\t var max = options.max;\n\t var min = options.min;\n\t var lineBox = this.lineBox();\n\t var size = vertical ? lineBox.height() : lineBox.width();\n\t var range = max - min;\n\t var scale = size / range;\n\t var offset = round(delta / scale, DEFAULT_PRECISION);\n\n\t if ((vertical || reverse) && !(vertical && reverse )) {\n\t offset = -offset;\n\t }\n\n\t return {\n\t min: min + offset,\n\t max: max + offset,\n\t offset: offset\n\t };\n\t },\n\n\t scaleRange: function(delta) {\n\t var options = this.options;\n\t var offset = -delta * options.majorUnit;\n\n\t return {\n\t min: options.min - offset,\n\t max: options.max + offset\n\t };\n\t },\n\n\t labelsCount: function() {\n\t return this.getDivisions(this.options.majorUnit);\n\t },\n\n\t createAxisLabel: function(index, labelOptions, labelContext) {\n\t var options = this.options;\n\t var value = round(options.min + (index * options.majorUnit), DEFAULT_PRECISION);\n\t var text = this.axisLabelText(value, labelOptions, labelContext);\n\n\t return new AxisLabel(value, text, index, null, labelOptions);\n\t },\n\n\t shouldRenderNote: function(value) {\n\t var range = this.range();\n\t return range.min <= value && value <= range.max;\n\t },\n\n\t pan: function(delta) {\n\t var range = this.translateRange(delta);\n\t return this.limitRange(range.min, range.max, this.totalMin, this.totalMax, range.offset);\n\t },\n\n\t pointsRange: function(start, end) {\n\t var startValue = this.getValue(start);\n\t var endValue = this.getValue(end);\n\t var min = Math.min(startValue, endValue);\n\t var max = Math.max(startValue, endValue);\n\n\t if (this.isValidRange(min, max)) {\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t }\n\t },\n\n\t zoomRange: function(delta) {\n\t var ref = this;\n\t var totalMin = ref.totalMin;\n\t var totalMax = ref.totalMax;\n\t var newRange = this.scaleRange(delta);\n\t var min = limitValue(newRange.min, totalMin, totalMax);\n\t var max = limitValue(newRange.max, totalMin, totalMax);\n\n\t if (this.isValidRange(min, max)) {\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t }\n\t },\n\n\t isValidRange: function(min, max) {\n\t return max - min > MIN_VALUE_RANGE;\n\t }\n\t});\n\n\tfunction autoAxisOptions(seriesMin, seriesMax, options) {\n\t var narrowRange = options.narrowRange;\n\n\t var autoMin = autoAxisMin(seriesMin, seriesMax, narrowRange);\n\t var autoMax = autoAxisMax(seriesMin, seriesMax, narrowRange);\n\n\t var majorUnit = autoMajorUnit(autoMin, autoMax);\n\t var autoOptions = {\n\t majorUnit: majorUnit\n\t };\n\n\t if (options.roundToMajorUnit !== false) {\n\t if (autoMin < 0 && remainderClose(autoMin, majorUnit, 1 / 3)) {\n\t autoMin -= majorUnit;\n\t }\n\n\t if (autoMax > 0 && remainderClose(autoMax, majorUnit, 1 / 3)) {\n\t autoMax += majorUnit;\n\t }\n\t }\n\n\t autoOptions.min = floor(autoMin, majorUnit);\n\t autoOptions.max = ceil(autoMax, majorUnit);\n\n\t return autoOptions;\n\t}\n\n\tfunction totalAxisOptions(autoOptions, options) {\n\t return {\n\t min: defined(options.min) ? Math.min(autoOptions.min, options.min) : autoOptions.min,\n\t max: defined(options.max) ? Math.max(autoOptions.max, options.max) : autoOptions.max,\n\t majorUnit: autoOptions.majorUnit\n\t };\n\t}\n\n\tfunction clearNullValues(options, fields) {\n\t for (var idx = 0; idx < fields.length; idx++) {\n\t var field = fields[idx];\n\t if (options[field] === null) {\n\t options[field] = undefined;\n\t }\n\t }\n\t}\n\n\tfunction axisOptions(autoOptions, userOptions) {\n\t var options = userOptions;\n\t var userSetMin, userSetMax;\n\n\t if (userOptions) {\n\t clearNullValues(userOptions, [ 'min', 'max' ]);\n\n\t userSetMin = defined(userOptions.min);\n\t userSetMax = defined(userOptions.max);\n\n\t var userSetLimits = userSetMin || userSetMax;\n\n\t if (userSetLimits) {\n\t if (userOptions.min === userOptions.max) {\n\t if (userOptions.min > 0) {\n\t userOptions.min = 0;\n\t } else {\n\t userOptions.max = 1;\n\t }\n\t }\n\t }\n\n\t if (userOptions.majorUnit) {\n\t autoOptions.min = floor(autoOptions.min, userOptions.majorUnit);\n\t autoOptions.max = ceil(autoOptions.max, userOptions.majorUnit);\n\t } else if (userSetLimits) {\n\t options = deepExtend(autoOptions, userOptions);\n\n\t // Determine an auto major unit after min/max have been set\n\t autoOptions.majorUnit = autoMajorUnit(options.min, options.max);\n\t }\n\t }\n\n\t autoOptions.minorUnit = (options.majorUnit || autoOptions.majorUnit) / 5;\n\n\t var result = deepExtend(autoOptions, options);\n\t if (result.min >= result.max) {\n\t if (userSetMin && !userSetMax) {\n\t result.max = result.min + result.majorUnit;\n\t } else if (!userSetMin && userSetMax) {\n\t result.min = result.max - result.majorUnit;\n\t }\n\t }\n\n\t return result;\n\t}\n\n\tfunction remainderClose(value, divisor, ratio) {\n\t var remainder = round(Math.abs(value % divisor), DEFAULT_PRECISION);\n\t var threshold = divisor * (1 - ratio);\n\n\t return remainder === 0 || remainder > threshold;\n\t}\n\n\tsetDefaultOptions(NumericAxis, {\n\t type: \"numeric\",\n\t min: 0,\n\t max: 1,\n\t vertical: true,\n\t majorGridLines: {\n\t visible: true,\n\t width: 1,\n\t color: BLACK\n\t },\n\t labels: {\n\t format: \"#.####################\"\n\t },\n\t zIndex: 1\n\t});\n\n\tvar DateValueAxis = Axis.extend({\n\t init: function(seriesMin, seriesMax, axisOptions, chartService) {\n\t var min = toDate(seriesMin);\n\t var max = toDate(seriesMax);\n\n\t var intlService = chartService.intl;\n\t var options = axisOptions || {};\n\t options = deepExtend(options || {}, {\n\t min: parseDate(intlService, options.min),\n\t max: parseDate(intlService, options.max),\n\t axisCrossingValue: parseDates(intlService, options.axisCrossingValues || options.axisCrossingValue),\n\t weekStartDay: firstDay(options, intlService)\n\t });\n\t options = applyDefaults(min, max, options);\n\n\t Axis.fn.init.call(this, options, chartService);\n\n\t this.intlService = intlService;\n\t this.seriesMin = min;\n\t this.seriesMax = max;\n\n\t var weekStartDay = options.weekStartDay || 0;\n\t this.totalMin = toTime(floorDate(toTime(min) - 1, options.baseUnit, weekStartDay));\n\t this.totalMax = toTime(ceilDate(toTime(max) + 1, options.baseUnit, weekStartDay));\n\t },\n\n\t clone: function() {\n\t return new DateValueAxis(this.seriesMin, this.seriesMax, $.extend({}, this.options), this.chartService);\n\t },\n\n\t range: function() {\n\t var options = this.options;\n\t return { min: options.min, max: options.max };\n\t },\n\n\t getDivisions: function(stepValue) {\n\t var options = this.options;\n\n\t return Math.floor(\n\t duration(options.min, options.max, options.baseUnit) / stepValue + 1\n\t );\n\t },\n\n\t getTickPositions: function(step) {\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var lineBox = this.lineBox();\n\t var dir = (vertical ? -1 : 1) * (options.reverse ? -1 : 1);\n\t var startEdge = dir === 1 ? 1 : 2;\n\t var start = lineBox[(vertical ? Y : X) + startEdge];\n\t var divisions = this.getDivisions(step);\n\t var timeRange = dateDiff(options.max, options.min);\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var scale = lineSize / timeRange;\n\t var weekStartDay = options.weekStartDay || 0;\n\n\t var positions = [ start ];\n\t for (var i = 1; i < divisions; i++) {\n\t var date = addDuration(options.min, i * step, options.baseUnit, weekStartDay);\n\t var pos = start + dateDiff(date, options.min) * scale * dir;\n\n\t positions.push(round(pos, COORD_PRECISION));\n\t }\n\n\t return positions;\n\t },\n\n\t getMajorTickPositions: function() {\n\t return this.getTickPositions(this.options.majorUnit);\n\t },\n\n\t getMinorTickPositions: function() {\n\t return this.getTickPositions(this.options.minorUnit);\n\t },\n\n\t getSlot: function(a, b, limit) {\n\t return NumericAxis.prototype.getSlot.call(\n\t this, parseDate(this.intlService, a), parseDate(this.intlService, b), limit\n\t );\n\t },\n\n\t getValue: function(point) {\n\t var value = NumericAxis.prototype.getValue.call(this, point);\n\n\t return value !== null ? toDate(value) : null;\n\t },\n\n\t labelsCount: function() {\n\t return this.getDivisions(this.options.majorUnit);\n\t },\n\n\t createAxisLabel: function(index, labelOptions, labelContext) {\n\t var options = this.options;\n\t var offset = index * options.majorUnit;\n\t var weekStartDay = options.weekStartDay || 0;\n\t var date = options.min;\n\n\t if (offset > 0) {\n\t date = addDuration(date, offset, options.baseUnit, weekStartDay);\n\t }\n\n\t var unitFormat = labelOptions.dateFormats[options.baseUnit];\n\t labelOptions.format = labelOptions.format || unitFormat;\n\n\t var text = this.axisLabelText(date, labelOptions, labelContext);\n\t return new AxisLabel(date, text, index, null, labelOptions);\n\t },\n\n\t translateRange: function(delta, exact) {\n\t var options = this.options;\n\t var baseUnit = options.baseUnit;\n\t var weekStartDay = options.weekStartDay || 0;\n\t var lineBox = this.lineBox();\n\t var size = options.vertical ? lineBox.height() : lineBox.width();\n\t var range = this.range();\n\t var scale = size / dateDiff(range.max, range.min);\n\t var offset = round(delta / scale, DEFAULT_PRECISION) * (options.reverse ? -1 : 1);\n\t var from = addTicks(options.min, offset);\n\t var to = addTicks(options.max, offset);\n\n\t if (!exact) {\n\t from = addDuration(from, 0, baseUnit, weekStartDay);\n\t to = addDuration(to, 0, baseUnit, weekStartDay);\n\t }\n\n\t return {\n\t min: from,\n\t max: to,\n\t offset: offset\n\t };\n\t },\n\n\t scaleRange: function(delta) {\n\t var ref = this.options;\n\t var from = ref.min;\n\t var to = ref.max;\n\t var rounds = Math.abs(delta);\n\n\t while (rounds--) {\n\t var range = dateDiff(from, to);\n\t var step = Math.round(range * 0.1);\n\t if (delta < 0) {\n\t from = addTicks(from, step);\n\t to = addTicks(to, -step);\n\t } else {\n\t from = addTicks(from, -step);\n\t to = addTicks(to, step);\n\t }\n\t }\n\n\t return { min: from, max: to };\n\t },\n\n\t shouldRenderNote: function(value) {\n\t var range = this.range();\n\n\t return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0;\n\t },\n\n\t pan: function(delta) {\n\t var range = this.translateRange(delta, true);\n\t var limittedRange = this.limitRange(toTime(range.min), toTime(range.max), this.totalMin, this.totalMax, range.offset);\n\n\t if (limittedRange) {\n\t return {\n\t min: toDate(limittedRange.min),\n\t max: toDate(limittedRange.max)\n\t };\n\t }\n\t },\n\n\t pointsRange: function(start, end) {\n\t var startValue = this.getValue(start);\n\t var endValue = this.getValue(end);\n\t var min = Math.min(startValue, endValue);\n\t var max = Math.max(startValue, endValue);\n\n\t return {\n\t min: toDate(min),\n\t max: toDate(max)\n\t };\n\t },\n\n\t zoomRange: function(delta) {\n\t var range = this.scaleRange(delta);\n\t var min = toDate(limitValue(toTime(range.min), this.totalMin, this.totalMax));\n\t var max = toDate(limitValue(toTime(range.max), this.totalMin, this.totalMax));\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t }\n\t});\n\n\tfunction timeUnits(delta) {\n\t var unit = HOURS;\n\n\t if (delta >= TIME_PER_YEAR) {\n\t unit = YEARS;\n\t } else if (delta >= TIME_PER_MONTH) {\n\t unit = MONTHS;\n\t } else if (delta >= TIME_PER_WEEK) {\n\t unit = WEEKS;\n\t } else if (delta >= TIME_PER_DAY) {\n\t unit = DAYS;\n\t }\n\n\t return unit;\n\t}\n\n\tfunction applyDefaults(seriesMin, seriesMax, options) {\n\t var min = options.min || seriesMin;\n\t var max = options.max || seriesMax;\n\t var baseUnit = options.baseUnit || (max && min ? timeUnits(absoluteDateDiff(max, min)) : HOURS);\n\t var baseUnitTime = TIME_PER_UNIT[baseUnit];\n\t var weekStartDay = options.weekStartDay || 0;\n\t var autoMin = floorDate(toTime(min) - 1, baseUnit, weekStartDay) || toDate(max);\n\t var autoMax = ceilDate(toTime(max) + 1, baseUnit, weekStartDay);\n\t var userMajorUnit = options.majorUnit ? options.majorUnit : undefined;\n\t var majorUnit = userMajorUnit || ceil(\n\t autoMajorUnit(autoMin.getTime(), autoMax.getTime()),\n\t baseUnitTime\n\t ) / baseUnitTime;\n\t var actualUnits = duration(autoMin, autoMax, baseUnit);\n\t var totalUnits = ceil(actualUnits, majorUnit);\n\t var unitsToAdd = totalUnits - actualUnits;\n\t var head = Math.floor(unitsToAdd / 2);\n\t var tail = unitsToAdd - head;\n\n\t if (!options.baseUnit) {\n\t delete options.baseUnit;\n\t }\n\n\t options.baseUnit = options.baseUnit || baseUnit;\n\t options.min = options.min || addDuration(autoMin, -head, baseUnit, weekStartDay);\n\t options.max = options.max || addDuration(autoMax, tail, baseUnit, weekStartDay);\n\t options.minorUnit = options.minorUnit || majorUnit / 5;\n\t options.majorUnit = majorUnit;\n\n\t return options;\n\t}\n\n\tsetDefaultOptions(DateValueAxis, {\n\t type: DATE,\n\t majorGridLines: {\n\t visible: true,\n\t width: 1,\n\t color: BLACK\n\t },\n\t labels: {\n\t dateFormats: DateLabelFormats\n\t }\n\t});\n\n\tvar DEFAULT_MAJOR_UNIT = 10;\n\n\tvar LogarithmicAxis = Axis.extend({\n\t init: function(seriesMin, seriesMax, options, chartService) {\n\n\t var axisOptions = deepExtend({ majorUnit: DEFAULT_MAJOR_UNIT, min: seriesMin, max: seriesMax }, options);\n\t var base = axisOptions.majorUnit;\n\t var autoMax = autoAxisMax$1(seriesMax, base);\n\t var autoMin = autoAxisMin$1(seriesMin, seriesMax, axisOptions);\n\t var range = initRange(autoMin, autoMax, axisOptions, options);\n\n\t axisOptions.max = range.max;\n\t axisOptions.min = range.min;\n\t axisOptions.minorUnit = options.minorUnit || round(base - 1, DEFAULT_PRECISION);\n\n\t Axis.fn.init.call(this, axisOptions, chartService);\n\n\t this.totalMin = defined(options.min) ? Math.min(autoMin, options.min) : autoMin;\n\t this.totalMax = defined(options.max) ? Math.max(autoMax, options.max) : autoMax;\n\t this.logMin = round(log(range.min, base), DEFAULT_PRECISION);\n\t this.logMax = round(log(range.max, base), DEFAULT_PRECISION);\n\t this.seriesMin = seriesMin;\n\t this.seriesMax = seriesMax;\n\n\t this.createLabels();\n\t },\n\n\t clone: function() {\n\t return new LogarithmicAxis(\n\t this.seriesMin,\n\t this.seriesMax,\n\t $.extend({}, this.options),\n\t this.chartService\n\t );\n\t },\n\n\t startValue: function() {\n\t return this.options.min;\n\t },\n\n\t getSlot: function(a, b, limit) {\n\t var ref = this;\n\t var options = ref.options;\n\t var logMin = ref.logMin;\n\t var logMax = ref.logMax;\n\t var reverse = options.reverse;\n\t var vertical = options.vertical;\n\t var base = options.majorUnit;\n\t var valueAxis = vertical ? Y : X;\n\t var lineBox = this.lineBox();\n\t var lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var dir = reverse ? -1 : 1;\n\t var step = dir * (lineSize / (logMax - logMin));\n\t var slotBox = new Box(lineBox.x1, lineBox.y1, lineBox.x1, lineBox.y1);\n\t var start = a;\n\t var end = b;\n\n\t if (!defined(start)) {\n\t start = end || 1;\n\t }\n\n\t if (!defined(end)) {\n\t end = start || 1;\n\t }\n\n\t if (start <= 0 || end <= 0) {\n\t return null;\n\t }\n\n\t if (limit) {\n\t start = Math.max(Math.min(start, options.max), options.min);\n\t end = Math.max(Math.min(end, options.max), options.min);\n\t }\n\n\t start = log(start, base);\n\t end = log(end, base);\n\n\t var p1, p2;\n\n\t if (vertical) {\n\t p1 = logMax - Math.max(start, end);\n\t p2 = logMax - Math.min(start, end);\n\t } else {\n\t p1 = Math.min(start, end) - logMin;\n\t p2 = Math.max(start, end) - logMin;\n\t }\n\n\t slotBox[valueAxis + 1] = limitCoordinate(lineStart + step * (reverse ? p2 : p1));\n\t slotBox[valueAxis + 2] = limitCoordinate(lineStart + step * (reverse ? p1 : p2));\n\n\t return slotBox;\n\t },\n\n\t getValue: function(point) {\n\t var ref = this;\n\t var options = ref.options;\n\t var logMin = ref.logMin;\n\t var logMax = ref.logMax;\n\t var reverse = options.reverse;\n\t var vertical = options.vertical;\n\t var base = options.majorUnit;\n\t var lineBox = this.lineBox();\n\t var dir = vertical === reverse ? 1 : -1;\n\t var startEdge = dir === 1 ? 1 : 2;\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var step = ((logMax - logMin) / lineSize);\n\t var valueAxis = vertical ? Y : X;\n\t var lineStart = lineBox[valueAxis + startEdge];\n\t var offset = dir * (point[valueAxis] - lineStart);\n\t var valueOffset = offset * step;\n\n\t if (offset < 0 || offset > lineSize) {\n\t return null;\n\t }\n\n\t var value = logMin + valueOffset;\n\n\t return round(Math.pow(base, value), DEFAULT_PRECISION);\n\t },\n\n\t range: function() {\n\t var options = this.options;\n\t return { min: options.min, max: options.max };\n\t },\n\n\t scaleRange: function(delta) {\n\t var base = this.options.majorUnit;\n\t var offset = -delta;\n\n\t return {\n\t min: Math.pow(base, this.logMin - offset),\n\t max: Math.pow(base, this.logMax + offset)\n\t };\n\t },\n\n\t translateRange: function(delta) {\n\t var ref = this;\n\t var options = ref.options;\n\t var logMin = ref.logMin;\n\t var logMax = ref.logMax;\n\t var reverse = options.reverse;\n\t var vertical = options.vertical;\n\t var base = options.majorUnit;\n\t var lineBox = this.lineBox();\n\t var size = vertical ? lineBox.height() : lineBox.width();\n\t var scale = size / (logMax - logMin);\n\t var offset = round(delta / scale, DEFAULT_PRECISION);\n\n\t if ((vertical || reverse) && !(vertical && reverse )) {\n\t offset = -offset;\n\t }\n\n\t return {\n\t min: Math.pow(base, logMin + offset),\n\t max: Math.pow(base, logMax + offset),\n\t offset: offset\n\t };\n\t },\n\n\t labelsCount: function() {\n\t var floorMax = Math.floor(this.logMax);\n\t var count = Math.floor(floorMax - this.logMin) + 1;\n\n\t return count;\n\t },\n\n\t getMajorTickPositions: function() {\n\t var ticks = [];\n\n\t this.traverseMajorTicksPositions(function (position) {\n\t ticks.push(position);\n\t }, { step: 1, skip: 0 });\n\n\t return ticks;\n\t },\n\n\t createTicks: function(lineGroup) {\n\t var options = this.options;\n\t var majorTicks = options.majorTicks;\n\t var minorTicks = options.minorTicks;\n\t var vertical = options.vertical;\n\t var mirror = options.labels.mirror;\n\t var lineBox = this.lineBox();\n\t var ticks = [];\n\t var tickLineOptions = {\n\t // TODO\n\t // _alignLines: options._alignLines,\n\t vertical: vertical\n\t };\n\n\t function render(tickPosition, tickOptions) {\n\t tickLineOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size;\n\t tickLineOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1;\n\t tickLineOptions.position = tickPosition;\n\n\t lineGroup.append(createAxisTick(tickLineOptions, tickOptions));\n\t }\n\n\t if (majorTicks.visible) {\n\t this.traverseMajorTicksPositions(render, majorTicks);\n\t }\n\n\t if (minorTicks.visible) {\n\t this.traverseMinorTicksPositions(render, minorTicks);\n\t }\n\n\t return ticks;\n\t },\n\n\t createGridLines: function(altAxis) {\n\t var options = this.options;\n\t var minorGridLines = options.minorGridLines;\n\t var majorGridLines = options.majorGridLines;\n\t var vertical = options.vertical;\n\t var lineBox = altAxis.lineBox();\n\t var lineOptions = {\n\t lineStart: lineBox[vertical ? \"x1\" : \"y1\"],\n\t lineEnd: lineBox[vertical ? \"x2\" : \"y2\"],\n\t vertical: vertical\n\t };\n\t var majorTicks = [];\n\n\t var container = this.gridLinesVisual();\n\t function render(tickPosition, gridLine) {\n\t if (!inArray(tickPosition, majorTicks)) {\n\t lineOptions.position = tickPosition;\n\t container.append(createAxisGridLine(lineOptions, gridLine));\n\n\t majorTicks.push(tickPosition);\n\t }\n\t }\n\n\t if (majorGridLines.visible) {\n\t this.traverseMajorTicksPositions(render, majorGridLines);\n\t }\n\n\t if (minorGridLines.visible) {\n\t this.traverseMinorTicksPositions(render, minorGridLines);\n\t }\n\n\t return container.children;\n\t },\n\n\t traverseMajorTicksPositions: function(callback, tickOptions) {\n\t var ref = this._lineOptions();\n\t var lineStart = ref.lineStart;\n\t var step = ref.step;\n\t var ref$1 = this;\n\t var logMin = ref$1.logMin;\n\t var logMax = ref$1.logMax;\n\n\t for (var power = Math.ceil(logMin) + tickOptions.skip; power <= logMax; power += tickOptions.step) {\n\t var position = round(lineStart + step * (power - logMin), DEFAULT_PRECISION);\n\t callback(position, tickOptions);\n\t }\n\t },\n\n\t traverseMinorTicksPositions: function(callback, tickOptions) {\n\t var this$1 = this;\n\n\t var ref = this.options;\n\t var min = ref.min;\n\t var max = ref.max;\n\t var minorUnit = ref.minorUnit;\n\t var base = ref.majorUnit;\n\t var ref$1 = this._lineOptions();\n\t var lineStart = ref$1.lineStart;\n\t var step = ref$1.step;\n\t var ref$2 = this;\n\t var logMin = ref$2.logMin;\n\t var logMax = ref$2.logMax;\n\t var start = Math.floor(logMin);\n\n\t for (var power = start; power < logMax; power++) {\n\t var minorOptions = this$1._minorIntervalOptions(power);\n\t for (var idx = tickOptions.skip; idx < minorUnit; idx += tickOptions.step) {\n\t var value = minorOptions.value + idx * minorOptions.minorStep;\n\t if (value > max) {\n\t break;\n\t }\n\t if (value >= min) {\n\t var position = round(lineStart + step * (log(value, base) - logMin), DEFAULT_PRECISION);\n\t callback(position, tickOptions);\n\t }\n\t }\n\t }\n\t },\n\n\t createAxisLabel: function(index, labelOptions, labelContext) {\n\t var power = Math.ceil(this.logMin + index);\n\t var value = Math.pow(this.options.majorUnit, power);\n\t var text = this.axisLabelText(value, labelOptions, labelContext);\n\n\t return new AxisLabel(value, text, index, null, labelOptions);\n\t },\n\n\t shouldRenderNote: function(value) {\n\t var range = this.range();\n\t return range.min <= value && value <= range.max;\n\t },\n\n\t pan: function(delta) {\n\t var range = this.translateRange(delta);\n\t return this.limitRange(range.min, range.max, this.totalMin, this.totalMax, range.offset);\n\t },\n\n\t pointsRange: function(start, end) {\n\t var startValue = this.getValue(start);\n\t var endValue = this.getValue(end);\n\t var min = Math.min(startValue, endValue);\n\t var max = Math.max(startValue, endValue);\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t },\n\n\t zoomRange: function(delta) {\n\t var ref = this;\n\t var options = ref.options;\n\t var totalMin = ref.totalMin;\n\t var totalMax = ref.totalMax;\n\t var newRange = this.scaleRange(delta);\n\t var min = limitValue(newRange.min, totalMin, totalMax);\n\t var max = limitValue(newRange.max, totalMin, totalMax);\n\t var base = options.majorUnit;\n\t var acceptOptionsRange = max > min && options.min && options.max && (round(log(options.max, base) - log(options.min, base), DEFAULT_PRECISION) < 1);\n\t var acceptNewRange = !(options.min === totalMin && options.max === totalMax) && round(log(max, base) - log(min, base), DEFAULT_PRECISION) >= 1;\n\n\t if (acceptOptionsRange || acceptNewRange) {\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t }\n\t },\n\n\t _minorIntervalOptions: function(power) {\n\t var ref = this.options;\n\t var minorUnit = ref.minorUnit;\n\t var base = ref.majorUnit;\n\t var value = Math.pow(base, power);\n\t var nextValue = Math.pow(base, power + 1);\n\t var difference = nextValue - value;\n\t var minorStep = difference / minorUnit;\n\n\t return {\n\t value: value,\n\t minorStep: minorStep\n\t };\n\t },\n\n\t _lineOptions: function() {\n\t var ref = this.options;\n\t var reverse = ref.reverse;\n\t var vertical = ref.vertical;\n\t var valueAxis = vertical ? Y : X;\n\t var lineBox = this.lineBox();\n\t var dir = vertical === reverse ? 1 : -1;\n\t var startEdge = dir === 1 ? 1 : 2;\n\t var lineSize = vertical ? lineBox.height() : lineBox.width();\n\t var step = dir * (lineSize / (this.logMax - this.logMin));\n\t var lineStart = lineBox[valueAxis + startEdge];\n\n\t return {\n\t step: step,\n\t lineStart: lineStart,\n\t lineBox: lineBox\n\t };\n\t }\n\t});\n\n\tfunction initRange(autoMin, autoMax, axisOptions, options) {\n\t var min = axisOptions.min;\n\t var max = axisOptions.max;\n\n\t if (defined(axisOptions.axisCrossingValue) && axisOptions.axisCrossingValue <= 0) {\n\t throwNegativeValuesError();\n\t }\n\n\t if (!defined(options.max)) {\n\t max = autoMax;\n\t } else if (options.max <= 0) {\n\t throwNegativeValuesError();\n\t }\n\n\t if (!defined(options.min)) {\n\t min = autoMin;\n\t } else if (options.min <= 0) {\n\t throwNegativeValuesError();\n\t }\n\n\t return {\n\t min: min,\n\t max: max\n\t };\n\t}\n\n\tfunction autoAxisMin$1(min, max, options) {\n\t var base = options.majorUnit;\n\t var autoMin = min;\n\t if (min <= 0) {\n\t autoMin = max <= 1 ? Math.pow(base, -2) : 1;\n\t } else if (!options.narrowRange) {\n\t autoMin = Math.pow(base, Math.floor(log(min, base)));\n\t }\n\t return autoMin;\n\t}\n\n\tfunction autoAxisMax$1(max, base) {\n\t var logMaxRemainder = round(log(max, base), DEFAULT_PRECISION) % 1;\n\t var autoMax;\n\t if (max <= 0) {\n\t autoMax = base;\n\t } else if (logMaxRemainder !== 0 && (logMaxRemainder < 0.3 || logMaxRemainder > 0.9)) {\n\t autoMax = Math.pow(base, log(max, base) + 0.2);\n\t } else {\n\t autoMax = Math.pow(base, Math.ceil(log(max, base)));\n\t }\n\n\t return autoMax;\n\t}\n\n\tfunction throwNegativeValuesError() {\n\t throw new Error(\"Non positive values cannot be used for a logarithmic axis\");\n\t}\n\n\tfunction log(y, x) {\n\t return Math.log(y) / Math.log(x);\n\t}\n\n\tsetDefaultOptions(LogarithmicAxis, {\n\t type: \"log\",\n\t majorUnit: DEFAULT_MAJOR_UNIT,\n\t minorUnit: 1,\n\t axisCrossingValue: 1,\n\t vertical: true,\n\t majorGridLines: {\n\t visible: true,\n\t width: 1,\n\t color: BLACK\n\t },\n\t zIndex: 1,\n\t _deferLabels: true\n\t});\n\n\tvar GridLinesMixin = {\n\t createGridLines: function(altAxis) {\n\t var options = this.options;\n\t var radius = Math.abs(this.box.center().y - altAxis.lineBox().y1);\n\t var gridLines = [];\n\t var skipMajor = false;\n\t var majorAngles, minorAngles;\n\n\t if (options.majorGridLines.visible) {\n\t majorAngles = this.majorGridLineAngles(altAxis);\n\t skipMajor = true;\n\n\t gridLines = this.renderMajorGridLines(\n\t majorAngles, radius, options.majorGridLines\n\t );\n\t }\n\n\t if (options.minorGridLines.visible) {\n\t minorAngles = this.minorGridLineAngles(altAxis, skipMajor);\n\n\t append(gridLines, this.renderMinorGridLines(\n\t minorAngles, radius, options.minorGridLines, altAxis, skipMajor\n\t ));\n\t }\n\n\t return gridLines;\n\t },\n\n\t renderMajorGridLines: function(angles, radius, options) {\n\t return this.renderGridLines(angles, radius, options);\n\t },\n\n\t renderMinorGridLines: function(angles, radius, options, altAxis, skipMajor) {\n\t var radiusCallback = this.radiusCallback && this.radiusCallback(radius, altAxis, skipMajor);\n\t return this.renderGridLines(angles, radius, options, radiusCallback);\n\t },\n\n\t renderGridLines: function(angles, radius, options, radiusCallback) {\n\t var style = {\n\t stroke: {\n\t width: options.width,\n\t color: options.color,\n\t dashType: options.dashType\n\t }\n\t };\n\n\t var center = this.box.center();\n\t var circle = new Circle([ center.x, center.y ], radius);\n\t var container = this.gridLinesVisual();\n\n\t for (var i = 0; i < angles.length; i++) {\n\t var line = new Path(style);\n\t if (radiusCallback) {\n\t circle.radius = radiusCallback(angles[i]);\n\t }\n\n\t line.moveTo(circle.center)\n\t .lineTo(circle.pointAt(angles[i] + 180));\n\n\t container.append(line);\n\t }\n\n\t return container.children;\n\t },\n\n\t gridLineAngles: function(altAxis, size, skip, step, skipAngles) {\n\t var this$1 = this;\n\n\t var divs = this.intervals(size, skip, step, skipAngles);\n\t var options = altAxis.options;\n\t var altAxisVisible = options.visible && (options.line || {}).visible !== false;\n\n\t return map(divs, function (d) {\n\t var alpha = this$1.intervalAngle(d);\n\n\t if (!altAxisVisible || alpha !== 90) {\n\t return alpha;\n\t }\n\t });\n\t }\n\t};\n\n\tvar RadarCategoryAxis = CategoryAxis.extend({\n\t range: function() {\n\t return { min: 0, max: this.options.categories.length };\n\t },\n\n\t reflow: function(box) {\n\t this.box = box;\n\t this.reflowLabels();\n\t },\n\n\t lineBox: function() {\n\t return this.box;\n\t },\n\n\t reflowLabels: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var labels = ref.labels;\n\t var labelOptions = ref.options.labels;\n\t var skip = labelOptions.skip || 0;\n\t var step = labelOptions.step || 1;\n\t var measureBox = new Box();\n\n\t for (var i = 0; i < labels.length; i++) {\n\t labels[i].reflow(measureBox);\n\t var labelBox = labels[i].box;\n\n\t labels[i].reflow(this$1.getSlot(skip + i * step).adjacentBox(\n\t 0, labelBox.width(), labelBox.height()\n\t ));\n\t }\n\t },\n\n\t intervals: function(size, skipOption, stepOption, skipAngles) {\n\t if (skipAngles === void 0) { skipAngles = false; }\n\n\t var options = this.options;\n\t var categories = options.categories.length;\n\t var divCount = categories / size || 1;\n\t var divAngle = 360 / divCount;\n\t var skip = skipOption || 0;\n\t var step = stepOption || 1;\n\t var divs = [];\n\t var angle = 0;\n\n\t for (var i = skip; i < divCount; i += step) {\n\t if (options.reverse) {\n\t angle = 360 - i * divAngle;\n\t } else {\n\t angle = i * divAngle;\n\t }\n\n\t angle = round(angle, COORD_PRECISION) % 360;\n\n\t if (!(skipAngles && inArray(angle, skipAngles))) {\n\t divs.push(angle);\n\t }\n\t }\n\n\t return divs;\n\t },\n\n\t majorIntervals: function() {\n\t return this.intervals(1);\n\t },\n\n\t minorIntervals: function() {\n\t return this.intervals(0.5);\n\t },\n\n\t intervalAngle: function(interval) {\n\t return (360 + interval + this.options.startAngle) % 360;\n\t },\n\n\t majorAngles: function() {\n\t var this$1 = this;\n\n\t return map(this.majorIntervals(), function (interval) { return this$1.intervalAngle(interval); });\n\t },\n\n\t createLine: function() {\n\t return [];\n\t },\n\n\t majorGridLineAngles: function(altAxis) {\n\t var majorGridLines = this.options.majorGridLines;\n\t return this.gridLineAngles(altAxis, 1, majorGridLines.skip, majorGridLines.step);\n\t },\n\n\t minorGridLineAngles: function(altAxis, skipMajor) {\n\t var ref = this.options;\n\t var minorGridLines = ref.minorGridLines;\n\t var majorGridLines = ref.majorGridLines;\n\t var majorGridLineAngles = skipMajor ? this.intervals(1, majorGridLines.skip, majorGridLines.step) : null;\n\n\t return this.gridLineAngles(altAxis, 0.5, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);\n\t },\n\n\t radiusCallback: function(radius, altAxis, skipMajor) {\n\t if (altAxis.options.type !== ARC) {\n\t var minorAngle = rad(360 / (this.options.categories.length * 2));\n\t var minorRadius = Math.cos(minorAngle) * radius;\n\t var majorAngles = this.majorAngles();\n\n\t var radiusCallback = function(angle) {\n\t if (!skipMajor && inArray(angle, majorAngles)) {\n\t return radius;\n\t }\n\n\t return minorRadius;\n\t };\n\t return radiusCallback;\n\t }\n\t },\n\n\t createPlotBands: function() {\n\t var this$1 = this;\n\n\t var plotBands = this.options.plotBands || [];\n\n\t var group = this._plotbandGroup = new Group({\n\t zIndex: -1\n\t });\n\n\t for (var i = 0; i < plotBands.length; i++) {\n\t var band = plotBands[i];\n\t var slot = this$1.plotBandSlot(band);\n\t var singleSlot = this$1.getSlot(band.from);\n\n\t var head = band.from - Math.floor(band.from);\n\t slot.startAngle += head * singleSlot.angle;\n\n\t var tail = Math.ceil(band.to) - band.to;\n\t slot.angle -= (tail + head) * singleSlot.angle;\n\n\t var ring = ShapeBuilder.current.createRing(slot, {\n\t fill: {\n\t color: band.color,\n\t opacity: band.opacity\n\t },\n\t stroke: {\n\t opacity: band.opacity\n\t }\n\t });\n\t group.append(ring);\n\t }\n\n\t this.appendVisual(group);\n\t },\n\n\t plotBandSlot: function(band) {\n\t return this.getSlot(band.from, band.to - 1);\n\t },\n\n\t getSlot: function(from, to) {\n\t var options = this.options;\n\t var justified = options.justified;\n\t var box = this.box;\n\t var divs = this.majorAngles();\n\t var totalDivs = divs.length;\n\t var slotAngle = 360 / totalDivs;\n\t var fromValue = from;\n\n\t if (options.reverse && !justified) {\n\t fromValue = (fromValue + 1) % totalDivs;\n\t }\n\n\t fromValue = limitValue(Math.floor(fromValue), 0, totalDivs - 1);\n\t var slotStart = divs[fromValue];\n\n\t if (justified) {\n\t slotStart = slotStart - slotAngle / 2;\n\n\t if (slotStart < 0) {\n\t slotStart += 360;\n\t }\n\t }\n\n\t var toValue = limitValue(Math.ceil(to || fromValue), fromValue, totalDivs - 1);\n\t var slots = toValue - fromValue + 1;\n\t var angle = slotAngle * slots;\n\n\t return new Ring(box.center(), 0, box.height() / 2, slotStart, angle);\n\t },\n\n\t slot: function(from, to) {\n\t var slot = this.getSlot(from, to);\n\t var startAngle = slot.startAngle + 180;\n\t var endAngle = startAngle + slot.angle;\n\n\t return new geometry.Arc([ slot.center.x, slot.center.y ], {\n\t startAngle: startAngle,\n\t endAngle: endAngle,\n\t radiusX: slot.radius,\n\t radiusY: slot.radius\n\t });\n\t },\n\n\t pointCategoryIndex: function(point) {\n\t var this$1 = this;\n\n\t var length = this.options.categories.length;\n\t var index = null;\n\n\t for (var i = 0; i < length; i++) {\n\t var slot = this$1.getSlot(i);\n\t if (slot.containsPoint(point)) {\n\t index = i;\n\t break;\n\t }\n\t }\n\n\t return index;\n\t }\n\t});\n\n\tsetDefaultOptions(RadarCategoryAxis, {\n\t startAngle: 90,\n\t labels: {\n\t margin: getSpacing(10)\n\t },\n\t majorGridLines: {\n\t visible: true\n\t },\n\t justified: true\n\t});\n\tdeepExtend(RadarCategoryAxis.prototype, GridLinesMixin);\n\n\tvar PolarAxis = Axis.extend({\n\t init: function(options, chartService) {\n\t Axis.fn.init.call(this, options, chartService);\n\n\t var instanceOptions = this.options;\n\n\t instanceOptions.minorUnit = instanceOptions.minorUnit || instanceOptions.majorUnit / 2;\n\t },\n\n\t getDivisions: function(stepValue) {\n\t return NumericAxis.prototype.getDivisions.call(this, stepValue) - 1;\n\t },\n\n\t reflow: function(box) {\n\t this.box = box;\n\t this.reflowLabels();\n\t },\n\n\t reflowLabels: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var labels = ref.labels;\n\t var labelOptions = ref.options.labels;\n\t var skip = labelOptions.skip || 0;\n\t var step = labelOptions.step || 1;\n\n\t var measureBox = new Box();\n\t var divs = this.intervals(options.majorUnit, skip, step);\n\n\t for (var i = 0; i < labels.length; i++) {\n\t labels[i].reflow(measureBox);\n\t var labelBox = labels[i].box;\n\n\t labels[i].reflow(this$1.getSlot(divs[i]).adjacentBox(0, labelBox.width(), labelBox.height()));\n\t }\n\t },\n\n\t lineBox: function() {\n\t return this.box;\n\t },\n\n\t intervals: function(size, skipOption, stepOption, skipAngles) {\n\t if (skipAngles === void 0) { skipAngles = false; }\n\n\t var min = this.options.min;\n\t var divisions = this.getDivisions(size);\n\t var divs = [];\n\t var skip = skipOption || 0;\n\t var step = stepOption || 1;\n\n\t for (var i = skip; i < divisions; i += step) {\n\t var current = (360 + min + i * size) % 360;\n\t if (!(skipAngles && inArray(current, skipAngles))) {\n\t divs.push(current);\n\t }\n\t }\n\n\t return divs;\n\t },\n\n\t majorIntervals: function() {\n\t return this.intervals(this.options.majorUnit);\n\t },\n\n\t minorIntervals: function() {\n\t return this.intervals(this.options.minorUnit);\n\t },\n\n\t intervalAngle: function(i) {\n\t return (540 - i - this.options.startAngle) % 360;\n\t },\n\n\t createLine: function() {\n\t return [];\n\t },\n\n\t majorGridLineAngles: function(altAxis) {\n\t var majorGridLines = this.options.majorGridLines;\n\t return this.gridLineAngles(altAxis, this.options.majorUnit, majorGridLines.skip, majorGridLines.step);\n\t },\n\n\t minorGridLineAngles: function(altAxis, skipMajor) {\n\t var options = this.options;\n\t var minorGridLines = options.minorGridLines;\n\t var majorGridLines = options.majorGridLines;\n\t var majorGridLineAngles = skipMajor ? this.intervals(options.majorUnit, majorGridLines.skip, majorGridLines.step) : null;\n\n\t return this.gridLineAngles(altAxis, options.minorUnit, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);\n\t },\n\n\t plotBandSlot: function(band) {\n\t return this.getSlot(band.from, band.to);\n\t },\n\n\t getSlot: function(a, b) {\n\t var ref = this;\n\t var options = ref.options;\n\t var box = ref.box;\n\t var startAngle = options.startAngle;\n\t var start = limitValue(a, options.min, options.max);\n\t var end = limitValue(b || start, start, options.max);\n\n\t if (options.reverse) {\n\t start *= -1;\n\t end *= -1;\n\t }\n\n\t start = (540 - start - startAngle) % 360;\n\t end = (540 - end - startAngle) % 360;\n\n\t if (end < start) {\n\t var tmp = start;\n\t start = end;\n\t end = tmp;\n\t }\n\n\t return new Ring(box.center(), 0, box.height() / 2, start, end - start);\n\t },\n\n\t slot: function(from, to) {\n\t if (to === void 0) { to = from; }\n\n\t var options = this.options;\n\t var start = 360 - options.startAngle;\n\t var slot = this.getSlot(from, to);\n\t var min = Math.min(from, to);\n\t var max = Math.max(from, to);\n\t var startAngle, endAngle;\n\n\t if (options.reverse) {\n\t startAngle = min;\n\t endAngle = max;\n\t } else {\n\t startAngle = 360 - max;\n\t endAngle = 360 - min;\n\t }\n\n\t startAngle = (startAngle + start) % 360;\n\t endAngle = (endAngle + start) % 360;\n\n\t return new geometry.Arc([ slot.center.x, slot.center.y ], {\n\t startAngle: startAngle,\n\t endAngle: endAngle,\n\t radiusX: slot.radius,\n\t radiusY: slot.radius\n\t });\n\t },\n\n\t getValue: function(point) {\n\t var options = this.options;\n\t var center = this.box.center();\n\t var dx = point.x - center.x;\n\t var dy = point.y - center.y;\n\t var theta = Math.round(deg(Math.atan2(dy, dx)));\n\t var start = options.startAngle;\n\n\t if (!options.reverse) {\n\t theta *= -1;\n\t start *= -1;\n\t }\n\n\t return (theta + start + 360) % 360;\n\t },\n\n\t valueRange: function() {\n\t return {\n\t min: 0,\n\t max: Math.PI * 2\n\t };\n\t }\n\t});\n\n\tsetDefaultOptions(PolarAxis, {\n\t type: \"polar\",\n\t startAngle: 0,\n\t reverse: false,\n\t majorUnit: 60,\n\t min: 0,\n\t max: 360,\n\t labels: {\n\t margin: getSpacing(10)\n\t },\n\t majorGridLines: {\n\t color: BLACK,\n\t visible: true,\n\t width: 1\n\t },\n\t minorGridLines: {\n\t color: \"#aaa\"\n\t }\n\t});\n\n\tdeepExtend(PolarAxis.prototype, GridLinesMixin, {\n\t createPlotBands: RadarCategoryAxis.prototype.createPlotBands,\n\t majorAngles: RadarCategoryAxis.prototype.majorAngles,\n\t range: NumericAxis.prototype.range,\n\t labelsCount: NumericAxis.prototype.labelsCount,\n\t createAxisLabel: NumericAxis.prototype.createAxisLabel\n\t});\n\n\tvar RadarNumericAxisMixin = {\n\t options: {\n\t majorGridLines: {\n\t visible: true\n\t }\n\t },\n\n\t createPlotBands: function() {\n\t var this$1 = this;\n\n\t var ref = this.options;\n\t var type = ref.majorGridLines.type;\n\t var plotBands = ref.plotBands; if (plotBands === void 0) { plotBands = []; }\n\t var altAxis = this.plotArea.polarAxis;\n\t var majorAngles = altAxis.majorAngles();\n\t var center = altAxis.box.center();\n\t var group = this._plotbandGroup = new Group({\n\t zIndex: -1\n\t });\n\n\t for (var i = 0; i < plotBands.length; i++) {\n\t var band = plotBands[i];\n\t var bandStyle = {\n\t fill: {\n\t color: band.color,\n\t opacity: band.opacity\n\t },\n\t stroke: {\n\t opacity: band.opacity\n\t }\n\t };\n\n\t var slot = this$1.getSlot(band.from, band.to, true);\n\t var ring = new Ring(center, center.y - slot.y2, center.y - slot.y1, 0, 360);\n\n\t var shape = (void 0);\n\t if (type === ARC) {\n\t shape = ShapeBuilder.current.createRing(ring, bandStyle);\n\t } else {\n\t shape = Path.fromPoints(this$1.plotBandPoints(ring, majorAngles), bandStyle).close();\n\t }\n\n\t group.append(shape);\n\t }\n\n\t this.appendVisual(group);\n\t },\n\n\t plotBandPoints: function(ring, angles) {\n\t var innerPoints = [];\n\t var outerPoints = [];\n\t var center = [ ring.center.x, ring.center.y ];\n\t var innerCircle = new Circle(center, ring.innerRadius);\n\t var outerCircle = new Circle(center, ring.radius);\n\n\t for (var i = 0; i < angles.length; i++) {\n\t innerPoints.push(innerCircle.pointAt(angles[i] + 180));\n\t outerPoints.push(outerCircle.pointAt(angles[i] + 180));\n\t }\n\n\t innerPoints.reverse();\n\t innerPoints.push(innerPoints[0]);\n\t outerPoints.push(outerPoints[0]);\n\n\t return outerPoints.concat(innerPoints);\n\t },\n\n\t createGridLines: function(altAxis) {\n\t var options = this.options;\n\t var majorTicks = this.radarMajorGridLinePositions();\n\t var majorAngles = altAxis.majorAngles();\n\t var center = altAxis.box.center();\n\t var gridLines = [];\n\n\t if (options.majorGridLines.visible) {\n\t gridLines = this.renderGridLines(\n\t center, majorTicks, majorAngles, options.majorGridLines\n\t );\n\t }\n\n\t if (options.minorGridLines.visible) {\n\t var minorTicks = this.radarMinorGridLinePositions();\n\t append(gridLines, this.renderGridLines(\n\t center, minorTicks, majorAngles, options.minorGridLines\n\t ));\n\t }\n\n\t return gridLines;\n\t },\n\n\t renderGridLines: function(center, ticks, angles, options) {\n\t var style = {\n\t stroke: {\n\t width: options.width,\n\t color: options.color,\n\t dashType: options.dashType\n\t }\n\t };\n\t var skip = options.skip; if (skip === void 0) { skip = 0; }\n\t var step = options.step; if (step === void 0) { step = 0; }\n\t var container = this.gridLinesVisual();\n\n\t for (var tickIx = skip; tickIx < ticks.length; tickIx += step) {\n\t var tickRadius = center.y - ticks[tickIx];\n\t if (tickRadius > 0) {\n\t var circle = new Circle([ center.x, center.y ], tickRadius);\n\t if (options.type === ARC) {\n\t container.append(new drawing.Circle(circle, style));\n\t } else {\n\t var line = new Path(style);\n\t for (var angleIx = 0; angleIx < angles.length; angleIx++) {\n\t line.lineTo(circle.pointAt(angles[angleIx] + 180));\n\t }\n\n\t line.close();\n\t container.append(line);\n\t }\n\t }\n\t }\n\n\t return container.children;\n\t },\n\n\t getValue: function(point) {\n\t var lineBox = this.lineBox();\n\t var altAxis = this.plotArea.polarAxis;\n\t var majorAngles = altAxis.majorAngles();\n\t var center = altAxis.box.center();\n\t var radius = point.distanceTo(center);\n\t var distance = radius;\n\n\t if (this.options.majorGridLines.type !== ARC && majorAngles.length > 1) {\n\t var dx = point.x - center.x;\n\t var dy = point.y - center.y;\n\t var theta = (deg(Math.atan2(dy, dx)) + 540) % 360;\n\n\t majorAngles.sort(function(a, b) {\n\t return angularDistance(a, theta) - angularDistance(b, theta);\n\t });\n\n\t // Solve triangle (center, point, axis X) using one side (radius) and two angles.\n\t // Angles are derived from triangle (center, point, gridline X)\n\t var midAngle = angularDistance(majorAngles[0], majorAngles[1]) / 2;\n\t var alpha = angularDistance(theta, majorAngles[0]);\n\t var gamma = 90 - midAngle;\n\t var beta = 180 - alpha - gamma;\n\n\t distance = radius * (Math.sin(rad(beta)) / Math.sin(rad(gamma)));\n\t }\n\n\t return this.axisType().prototype.getValue.call(\n\t this, new Point(lineBox.x1, lineBox.y2 - distance)\n\t );\n\t }\n\t};\n\n\tfunction angularDistance(a, b) {\n\t return 180 - Math.abs(Math.abs(a - b) - 180);\n\t}\n\n\tvar RadarNumericAxis = NumericAxis.extend({\n\t radarMajorGridLinePositions: function() {\n\t return this.getTickPositions(this.options.majorUnit);\n\t },\n\n\t radarMinorGridLinePositions: function() {\n\t var options = this.options;\n\t var minorSkipStep = 0;\n\n\t if (options.majorGridLines.visible) {\n\t minorSkipStep = options.majorUnit;\n\t }\n\t return this.getTickPositions(options.minorUnit, minorSkipStep);\n\t },\n\n\t axisType: function() {\n\t return NumericAxis;\n\t }\n\t});\n\n\tdeepExtend(RadarNumericAxis.prototype, RadarNumericAxisMixin);\n\n\tvar RadarLogarithmicAxis = LogarithmicAxis.extend({\n\t radarMajorGridLinePositions: function() {\n\t var positions = [];\n\n\t this.traverseMajorTicksPositions(function(position) {\n\t positions.push(position);\n\t }, this.options.majorGridLines);\n\n\t return positions;\n\t },\n\n\t radarMinorGridLinePositions: function() {\n\t var positions = [];\n\n\t this.traverseMinorTicksPositions(function(position) {\n\t positions.push(position);\n\t }, this.options.minorGridLines);\n\n\t return positions;\n\t },\n\n\t axisType: function() {\n\t return LogarithmicAxis;\n\t }\n\t});\n\n\tdeepExtend(RadarLogarithmicAxis.prototype, RadarNumericAxisMixin);\n\n\tvar WEIGHT = 0.333;\n\tvar EXTREMUM_ALLOWED_DEVIATION = 0.01;\n\n\tvar CurveProcessor = Class.extend({\n\t init: function(closed) {\n\n\t this.closed = closed;\n\t },\n\n\t process: function(dataPoints) {\n\t var this$1 = this;\n\n\t var points = dataPoints.slice(0);\n\t var segments = [];\n\t var closed = this.closed;\n\t var length = points.length;\n\n\t if (length > 2) {\n\t this.removeDuplicates(0, points);\n\t length = points.length;\n\t }\n\n\t if (length < 2 || (length === 2 && points[0].equals(points[1]))) {\n\t return segments;\n\t }\n\n\t var p0 = points[0];\n\t var p1 = points[1];\n\t var p2 = points[2];\n\n\t segments.push(new Segment(p0));\n\n\t while (p0.equals(points[length - 1])) {\n\t closed = true;\n\t points.pop();\n\t length--;\n\t }\n\n\t if (length === 2) {\n\t var tangent = this.tangent(p0,p1, X, Y);\n\n\t last(segments).controlOut(\n\t this.firstControlPoint(tangent, p0, p1, X, Y)\n\t );\n\n\t segments.push(new Segment(\n\t p1,\n\t this.secondControlPoint(tangent, p0, p1, X, Y)\n\t ));\n\n\t return segments;\n\t }\n\n\t var initialControlPoint, lastControlPoint;\n\n\t if (closed) {\n\t p0 = points[length - 1]; p1 = points[0]; p2 = points[1];\n\t var controlPoints = this.controlPoints(p0, p1, p2);\n\t initialControlPoint = controlPoints[1];\n\t lastControlPoint = controlPoints[0];\n\t } else {\n\t var tangent$1 = this.tangent(p0, p1, X,Y);\n\t initialControlPoint = this.firstControlPoint(tangent$1, p0, p1, X, Y);\n\t }\n\n\t var cp0 = initialControlPoint;\n\t for (var idx = 0; idx <= length - 3; idx++) {\n\t this$1.removeDuplicates(idx, points);\n\t length = points.length;\n\t if (idx + 3 <= length) {\n\t p0 = points[idx]; p1 = points[idx + 1]; p2 = points[idx + 2];\n\t var controlPoints$1 = this$1.controlPoints(p0,p1,p2);\n\n\t last(segments).controlOut(cp0);\n\t cp0 = controlPoints$1[1];\n\n\t var cp1 = controlPoints$1[0];\n\t segments.push(new Segment(p1, cp1));\n\t }\n\t }\n\n\t if (closed) {\n\t p0 = points[length - 2]; p1 = points[length - 1]; p2 = points[0];\n\t var controlPoints$2 = this.controlPoints(p0, p1, p2);\n\n\t last(segments).controlOut(cp0);\n\t segments.push(new Segment(\n\t p1,\n\t controlPoints$2[0]\n\t ));\n\n\t last(segments).controlOut(controlPoints$2[1]);\n\t segments.push(new Segment(\n\t p2,\n\t lastControlPoint\n\t ));\n\t } else {\n\t var tangent$2 = this.tangent(p1, p2, X, Y);\n\n\t last(segments).controlOut(cp0);\n\t segments.push(new Segment(\n\t p2,\n\t this.secondControlPoint(tangent$2, p1, p2, X, Y)\n\t ));\n\t }\n\n\t return segments;\n\t },\n\n\t removeDuplicates: function(idx, points) {\n\t while (points[idx + 1] && (points[idx].equals(points[idx + 1]) || points[idx + 1].equals(points[idx + 2]))) {\n\t points.splice(idx + 1, 1);\n\t }\n\t },\n\n\t invertAxis: function(p0, p1, p2) {\n\t var invertAxis = false;\n\n\t if (p0.x === p1.x) {\n\t invertAxis = true;\n\t } else if (p1.x === p2.x) {\n\t if ((p1.y < p2.y && p0.y <= p1.y) || (p2.y < p1.y && p1.y <= p0.y)) {\n\t invertAxis = true;\n\t }\n\t } else {\n\t var fn = this.lineFunction(p0,p1);\n\t var y2 = this.calculateFunction(fn, p2.x);\n\t if (!(p0.y <= p1.y && p2.y <= y2) &&\n\t !(p1.y <= p0.y && p2.y >= y2)) {\n\t invertAxis = true;\n\t }\n\t }\n\n\t return invertAxis;\n\t },\n\n\t isLine: function(p0, p1, p2) {\n\t var fn = this.lineFunction(p0, p1);\n\t var y2 = this.calculateFunction(fn, p2.x);\n\n\t return (p0.x === p1.x && p1.x === p2.x) || round(y2, 1) === round(p2.y, 1);\n\t },\n\n\t lineFunction: function(p1, p2) {\n\t var a = (p2.y - p1.y) / (p2.x - p1.x);\n\t var b = p1.y - a * p1.x;\n\n\t return [ b, a ];\n\t },\n\n\t controlPoints: function(p0, p1, p2) {\n\t var xField = X;\n\t var yField = Y;\n\t var restrict = false;\n\t var switchOrientation = false;\n\t var tangent;\n\n\t if (this.isLine(p0, p1, p2)) {\n\t tangent = this.tangent(p0, p1, X, Y);\n\t } else {\n\t var monotonic = {\n\t x: this.isMonotonicByField(p0, p1, p2, X),\n\t y: this.isMonotonicByField(p0, p1, p2, Y)\n\t };\n\n\t if (monotonic.x && monotonic.y) {\n\t tangent = this.tangent(p0, p2, X, Y);\n\t restrict = true;\n\t } else {\n\t if (this.invertAxis(p0, p1, p2)) {\n\t xField = Y;\n\t yField = X;\n\t }\n\n\t if (monotonic[xField]) {\n\t tangent = 0;\n\t } else {\n\t var sign;\n\t if ((p2[yField] < p0[yField] && p0[yField] <= p1[yField]) ||\n\t (p0[yField] < p2[yField] && p1[yField] <= p0[yField])) {\n\t sign = numberSign((p2[yField] - p0[yField]) * (p1[xField] - p0[xField]));\n\t } else {\n\t sign = -numberSign((p2[xField] - p0[xField]) * (p1[yField] - p0[yField]));\n\t }\n\n\t tangent = EXTREMUM_ALLOWED_DEVIATION * sign;\n\t switchOrientation = true;\n\t }\n\t }\n\t }\n\n\t var secondControlPoint = this.secondControlPoint(tangent, p0, p1, xField, yField);\n\n\t if (switchOrientation) {\n\t var oldXField = xField;\n\t xField = yField;\n\t yField = oldXField;\n\t }\n\n\t var firstControlPoint = this.firstControlPoint(tangent, p1, p2, xField, yField);\n\n\t if (restrict) {\n\t this.restrictControlPoint(p0, p1, secondControlPoint, tangent);\n\t this.restrictControlPoint(p1, p2, firstControlPoint, tangent);\n\t }\n\n\t return [ secondControlPoint, firstControlPoint ];\n\t },\n\n\t restrictControlPoint: function(p1, p2, cp, tangent) {\n\t if (p1.y < p2.y) {\n\t if (p2.y < cp.y) {\n\t cp.x = p1.x + (p2.y - p1.y) / tangent;\n\t cp.y = p2.y;\n\t } else if (cp.y < p1.y) {\n\t cp.x = p2.x - (p2.y - p1.y) / tangent;\n\t cp.y = p1.y;\n\t }\n\t } else {\n\t if (cp.y < p2.y) {\n\t cp.x = p1.x - (p1.y - p2.y) / tangent;\n\t cp.y = p2.y;\n\t } else if (p1.y < cp.y) {\n\t cp.x = p2.x + (p1.y - p2.y) / tangent;\n\t cp.y = p1.y;\n\t }\n\t }\n\t },\n\n\t tangent: function(p0, p1, xField, yField) {\n\t var x = p1[xField] - p0[xField];\n\t var y = p1[yField] - p0[yField];\n\t var tangent;\n\n\t if (x === 0) {\n\t tangent = 0;\n\t } else {\n\t tangent = y / x;\n\t }\n\n\t return tangent;\n\t },\n\n\t isMonotonicByField: function(p0, p1, p2, field) {\n\t return (p2[field] > p1[field] && p1[field] > p0[field]) ||\n\t (p2[field] < p1[field] && p1[field] < p0[field]);\n\t },\n\n\t firstControlPoint: function(tangent, p0, p3, xField, yField) {\n\t var t1 = p0[xField];\n\t var t2 = p3[xField];\n\t var distance = (t2 - t1) * WEIGHT;\n\n\t return this.point(t1 + distance, p0[yField] + distance * tangent, xField, yField);\n\t },\n\n\t secondControlPoint: function(tangent, p0, p3, xField, yField) {\n\t var t1 = p0[xField];\n\t var t2 = p3[xField];\n\t var distance = (t2 - t1) * WEIGHT;\n\n\t return this.point(t2 - distance, p3[yField] - distance * tangent, xField, yField);\n\t },\n\n\t point: function(xValue, yValue, xField, yField) {\n\t var controlPoint = new geometry.Point();\n\t controlPoint[xField] = xValue;\n\t controlPoint[yField] = yValue;\n\n\t return controlPoint;\n\t },\n\n\t calculateFunction: function(fn, x) {\n\t var length = fn.length;\n\t var result = 0;\n\n\t for (var i = 0; i < length; i++) {\n\t result += Math.pow(x,i) * fn[i];\n\t }\n\t return result;\n\t }\n\t});\n\n\tfunction numberSign(value) {\n\t return value <= 0 ? -1 : 1;\n\t}\n\n\tdataviz.Gradients = GRADIENTS;\n\n\tkendo.deepExtend(kendo.dataviz, {\n\t constants: constants,\n\t services: services,\n\t autoMajorUnit: autoMajorUnit,\n\t Point: Point,\n\t Box: Box,\n\t Ring: Ring,\n\t Sector: Sector,\n\t ShapeBuilder: ShapeBuilder,\n\t ShapeElement: ShapeElement,\n\t ChartElement: ChartElement,\n\t BoxElement: BoxElement,\n\t RootElement: RootElement,\n\t FloatElement: FloatElement,\n\t Text: Text,\n\t TextBox: TextBox,\n\t Title: Title,\n\t AxisLabel: AxisLabel,\n\t Axis: Axis,\n\t Note: Note,\n\t CategoryAxis: CategoryAxis,\n\t DateCategoryAxis: DateCategoryAxis,\n\t DateValueAxis: DateValueAxis,\n\t NumericAxis: NumericAxis,\n\t LogarithmicAxis: LogarithmicAxis,\n\t PolarAxis: PolarAxis,\n\t RadarCategoryAxis: RadarCategoryAxis,\n\t RadarNumericAxis: RadarNumericAxis,\n\t RadarLogarithmicAxis: RadarLogarithmicAxis,\n\t CurveProcessor: CurveProcessor,\n\t rectToBox: rectToBox,\n\t addClass: addClass,\n\t removeClass: removeClass,\n\t alignPathToPixel: alignPathToPixel,\n\t clockwise: clockwise,\n\t convertableToNumber: convertableToNumber,\n\t deepExtend: deepExtend,\n\t elementStyles: elementStyles,\n\t getSpacing: getSpacing,\n\t getTemplate: getTemplate,\n\t getter: __common_getter_js,\n\t grep: grep,\n\t hasClasses: hasClasses,\n\t HashMap: HashMap,\n\t inArray: inArray,\n\t interpolateValue: interpolateValue,\n\t InstanceObserver: InstanceObserver,\n\t isArray: isArray,\n\t isFunction: isFunction,\n\t isNumber: isNumber,\n\t isObject: isObject,\n\t isString: isString,\n\t map: map,\n\t mousewheelDelta: mousewheelDelta,\n\t FontLoader: FontLoader,\n\t setDefaultOptions: setDefaultOptions,\n\t sparseArrayLimits: sparseArrayLimits,\n\t styleValue: styleValue,\n\t find: find,\n\t elementScale: elementScale,\n\t autoTextColor: autoTextColor,\n\t createHashSet: createHashSet,\n\t append: append,\n\t bindEvents: bindEvents,\n\t Class: Class,\n\t defined: defined,\n\t deg: deg,\n\t elementOffset: elementOffset,\n\t elementSize: elementSize,\n\t eventElement: eventElement,\n\t eventCoordinates: eventCoordinates,\n\t last: last,\n\t limitValue: limitValue,\n\t logToConsole: kendo.logToConsole,\n\t objectKey: objectKey,\n\t rad: rad,\n\t round: round,\n\t unbindEvents: unbindEvents,\n\t valueOrDefault: valueOrDefault,\n\t absoluteDateDiff: absoluteDateDiff,\n\t addDuration: addDuration,\n\t addTicks: addTicks,\n\t ceilDate: ceilDate,\n\t dateComparer: dateComparer,\n\t dateDiff: dateDiff,\n\t dateEquals: dateEquals,\n\t dateIndex: dateIndex,\n\t duration: duration,\n\t floorDate: floorDate,\n\t lteDateIndex: lteDateIndex,\n\t startOfWeek: startOfWeek,\n\t toDate: toDate,\n\t parseDate: parseDate,\n\t parseDates: parseDates,\n\t toTime: toTime,\n\t firstDay: firstDay\n\t});\n\n\t})(window.kendo.jQuery);\n\n\t}, __webpack_require__(3));\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(897);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 897:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(898)\n\t ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\t(function ($) {\n\n\t var dataviz = kendo.dataviz;\n\t var services = dataviz.services;\n\t var draw = kendo.drawing;\n\n\t dataviz.SASS_THEMES = [\"sass\", \"default-v2\", \"bootstrap-v4\", \"material-v2\"];\n\n\t dataviz.ExportMixin = {\n\t extend: function(proto, skipLegacy) {\n\t if (!proto.exportVisual) {\n\t throw new Error(\"Mixin target has no exportVisual method defined.\");\n\t }\n\n\t proto.exportSVG = this.exportSVG;\n\t proto.exportImage = this.exportImage;\n\t proto.exportPDF = this.exportPDF;\n\n\t if (!skipLegacy) {\n\t proto.svg = this.svg;\n\t proto.imageDataURL = this.imageDataURL;\n\t }\n\t },\n\n\t exportSVG: function(options) {\n\t return draw.exportSVG(this.exportVisual(), options);\n\t },\n\n\t exportImage: function(options) {\n\t return draw.exportImage(this.exportVisual(options), options);\n\t },\n\n\t exportPDF: function(options) {\n\t return draw.exportPDF(this.exportVisual(), options);\n\t },\n\n\t svg: function() {\n\t if (draw.svg.Surface) {\n\t return draw.svg.exportGroup(this.exportVisual());\n\t } else {\n\t throw new Error(\"SVG Export failed. Unable to export instantiate kendo.drawing.svg.Surface\");\n\t }\n\t },\n\n\t imageDataURL: function() {\n\t if (!kendo.support.canvas) {\n\t return null;\n\t }\n\n\t if (draw.canvas.Surface) {\n\t var container = $(\"
\").css({\n\t display: \"none\",\n\t width: this.element.width(),\n\t height: this.element.height()\n\t }).appendTo(document.body);\n\n\t var surface = new draw.canvas.Surface(container[0]);\n\t surface.draw(this.exportVisual());\n\t var image = surface._rootElement.toDataURL();\n\n\t surface.destroy();\n\t container.remove();\n\n\t return image;\n\t } else {\n\t throw new Error(\"Image Export failed. Unable to export instantiate kendo.drawing.canvas.Surface\");\n\t }\n\t }\n\t };\n\n\t services.IntlService.register({\n\t format: function(format) {\n\t return kendo.format.apply(null, [format].concat(Array.prototype.slice.call(arguments, 1)));\n\t },\n\t toString: kendo.toString,\n\t parseDate: kendo.parseDate,\n\t firstDay: function() {\n\t return kendo.culture().calendars.standard.firstDay;\n\t }\n\t });\n\n\t services.TemplateService.register({\n\t compile: kendo.template\n\t });\n\n\t dataviz.Point2D = dataviz.Point;\n\t dataviz.Box2D = dataviz.Box;\n\t dataviz.mwDelta = function(e) {\n\t return dataviz.mousewheelDelta(e.originalEvent);\n\t };\n\n\t})(window.kendo.jQuery);\n\n\t}, __webpack_require__(3));\n\n/***/ }),\n\n/***/ 898:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo-core\");\n\n/***/ })\n\n/******/ });"],"sourceRoot":""}