{"version":3,"file":"kendo.drawing.min.js","names":["factory","define","amd","$","window","kendo","jQuery","drawing","util","deepExtend","createPromise","Deferred","promiseAll","promises","when","apply","extendStatic","dest","src","__proto__","member","hasOwnProperty","LRUCache","Class","extend","init","size","this","_size","_length","_map","put","key","value","map","entry","_head","_tail","newer","older","get","REPLACE_REGEX","normalizeText","text","String","replace","objectKey","object","parts","push","sort","join","hashKey","str","hash","i","length","charCodeAt","defaultMeasureBox","DEFAULT_OPTIONS","baselineMarkerSize","document","createElement","style","cssText","TextMetrics","options","_cache","measure","width","height","baseline","cacheKey","cachedResult","measureBox","box","baselineMarker","_baselineMarker","cloneNode","textStr","textContent","appendChild","body","offsetWidth","offsetHeight","offsetTop","parentNode","removeChild","marker","current","measureText","kendoDrawingUtil","kendoUtil","supportBrowser","support","browser","HasObservers","Class$$1","arguments","prototype","Object","create","constructor","fn","observers","_observers","addObserver","element","removeObserver","index","indexOf","splice","trigger","methodName","event","_suspended","idx","observer","optionsChange","e","geometryChange","suspend","resume","Math","max","_observerField","field","append$1$1","first","second","literals","arabicToRoman","n","values","roman","shift","defined","defId","definitionId","DEG_TO_RAD","PI","MAX_NUM","Number","MAX_VALUE","MIN_NUM","deg","radians","fromCharCode","KEY_STR","encodeBase64","input","output","utfInput","code","hi","low","isNaN","encodeUTF8","chr1","chr2","chr3","enc1","enc2","enc3","enc4","charAt","eventCoordinates","x","location","y","pageX","clientX","pageY","clientY","eventElement","touch","initialTouch","target","isTransparent","color","last","array","limitValue","min","mergeSort","a","cmp","slice","m","floor","left","right","b","r","ai","bi","merge","now","Date","getTime","rad","degrees","round","precision","p","power","pow","valueOrDefault","defaultValue","bindEvents","events","eventName","eventNames","trim","split","addEventListener","elementOffset","getBoundingClientRect","documentElement","top","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","elementStyles","styles","result","getComputedStyle","stylesArray","Array","isArray","getPixels","elementSize","size$1","parseInt","unbindEvents","name","removeEventListener","elementPadding","ref","paddingLeft","paddingTop","parseFloat","Matrix","c","d","f","call","multiplyCopy","matrix","invert","g","h","det","clone","equals","other","toArray","toString","separator","translate","unit","rotate","angle","cos","sin","scale","scaleX","scaleY","IDENTITY","matrixRegexp","transformMatrix","transform","matrixString","match","members","Function","bind","concat","parseMatrix","elementScale","parent","parentElement","parentMatrix","append","toString$1","OptionsStore","HasObservers$$1","prefix","_wrap","set","_set","composite","parentObj","fieldName","obj","_clear","type","wrapped","setAccessor","getAccessor","withAccessors","TBase","names","fields","capitalized","toUpperCase","substring","defineAccessors","toMatrix","transformation","Point","superclass","staticAccessors","ZERO","origin","originPoint","translateWith","point","move","scaleCopy","transformCopy","distanceTo","dx","dy","sqrt","digits","doRound","arg0","arg1","arguments$1","minX","minY","maxX","maxY","minPoint","maxPoint","defineProperties","Size","Rect","cornerRadius","setOrigin","setSize","setCornerRadius","getOrigin","radius","getCornerRadius","getSize","topLeft","bottomRight","topRight","bottomLeft","center","bbox","tl","tr","br","bl","fromPoints","expand","expandCopy","containsPoint","_isOnPath","rectOuter","rectInner","union","intersect","rect1","bottom","rect2","Transformation","_matrix","_optionsChange","multiply","transform$1","Element$1","Element","_initOptions","prototypeAccessors","nodeType","clip","id","parentTransform","currentTransform","combinedMatrix","elementMatrix","visible","opacity","clippedBBox","_clippedBBox","transformedPoint","_hasFill","_containsPoint","_hasStroke","fill","stroke","ellipseExtremeAngles","rx","ry","extremeX","extremeY","atan2","PI_DIV_2","Circle$2","Circle","setCenter","setRadius","getCenter","pointAt","_pointAt","extremeAngles","currentPointX","currentPointY","currentPoint","pointDistance","paintable","anonymous","newFill","IDENTITY_MATRIX_HASH","measurable","matrixHash","_bboxCache","_matrixHash","_bbox","strokeWidth","geometryAccessor","withGeometry","defineGeometryAccessors","geometry","rawBBox","_geometry","PRECISION","close$1","tolerance","abs","closeOrLess","pow$1","Arc$2","Arc","radiusX","radiusY","startAngle","endAngle","anticlockwise","xRotation","radian","curvePoints","dir","interval","_arcInterval","intervalAngle","subIntervalsCount","ceil","subIntervalAngle","currentAngle","nextAngle","points","_intervalCurvePoints","cp1","cp2","p2","endPoint","currentAngleX","bboxStartAngle","currentAngleY","oldStart","p1","p1Derivative","_derivativeAt","p2Derivative","t","distance","angleRad","pointRadius","startPoint","intersection","p0","p3","s1x","s2x","s1y","s2y","nx","ny","s","lineIntersection","calculateAngle","inAngleRange","start","end","largeArc","swipe","rotation","arcParameters","parameters","x1","y1","x2","y2","cosine","sine","xT","yT","sign","xt2","yt2","rx2","ry2","delta","constT","cxT","cyT","cx","cy","uX","uY","vX","vY","acos","angleCosine","signEndAngle","normalizeArcParameters","pop","unshift","ElementsArray","_splice","elements","_change","_add","_remove","howMany","_clearObserver","_setObserver","GeometryElementsArray","ElementsArray$$1","isOutOfEndPoint","controlPoint","calculateCurveAt","t1","toCubicPolynomial","ComplexNumber","real","img","add","cNumber","addConstant","negate","multiplyConstant","nthRoot","rad$$1","nthR","isReal","numberSign$1","solveCubicEquation","squareRoot","solveQuadraticEquation","y3","z1","z2","q","Q","b3a","hasRootsInRange","rootField","range","polynomial","roots","lineIntersectionsCount","intersects","inRange","pointAccessor","withPoints","definePointAccessors","Segment","anchor","controlIn","controlOut","bboxTo","toSegment","segmentAnchor","toSegmentAnchor","_curveBoundingBox","_lineBoundingBox","extremesX","_curveExtremesFor","extremesY","xLimits","arrayLimits","yLimits","extremes","_curveExtremes","x3","x4","t2","_intersectionsTo","segment","intersectionsCount","rayIntersection","count","curveIntersectionsCount","_isOnCurveTo","endSegment","p4","rotatedPoints","_isOnLineTo","_isOnPathTo","arr","X","Y","removeDuplicates","lineFunction","getControlPoints","tangent","xField","yField","restrict","switchOrientation","calculateFunction","isLine","getTangent","monotonic","isMonotonicByField","invertAxis","numberSign","secondCP","secondControlPoint","oldXField","firstCP","firstControlPoint","restrictControlPoint","cp","xValue","yValue","ShapeMap","l","path","position","isRelative","lineTo","curveTo","v","toLineParamaters","arcTo","lastControlIn","previousCommand","paths","segments","reflectionPoint","cubicControlPoints","quadraticToCubicControlPoints","isVertical","insertPosition","third","scaledPoint","SEGMENT_REGEX","SPLIT_REGEX","parsePath","pathInstance","params","closePath","command","toLowerCase","number","parseParameters","moveTo","close","Error","elementsBoundingBox","applyTransform","boundingBox","elementBoundingBox","elementsClippedBoundingBox","SPACE","Path","lineJoin","point$$1","lastSegment","arc","_addArcSegments","closed","segmentStart","segmentEnd","currentType","print","len","previous","pathWidth","segmentBox","parse","MultiPath","fromRect","rect","curveFromPoints","pointsIn","initialControlPoint","lastControlPoint","controlPoints","cp0","controlPoints$1","controlPoints$2","tangent$2","pointsToCurve","fromArc","prototypeAccessors$1","toPath","Text","content","font","pos","Image$1","Image","_rect","traversable","childrenField","traverse","callback","children","child","Group","childrenChange","action","items","_reparent","insert","insertAt","remove","removeAt","clear","newParent","translateToPoint","transofrm","alignStart","align","axis","sizeField","alignStartReverse","alignContent","justifyContent","alignItems","spacing","orientation","lineSpacing","wrap","revers","forEach","forEachReverse","Layout","Group$$1","_fieldMap","_initMap","fieldMap","groupsSizeField","groupAxis","groupsAxis","reverse","justifyAlign","reflow","elementStart","group","groupBox","_initGroups","groups","groupsSize","ref$1","groupOrigin","elementOrigin","groupStart","arrangeElements","groupIdx","lineSize","bboxes","scaledStart","newStart","this$1$1","_newGroup","addGroup","_addToGroup","Rect$2","Rect$$1","alignElements","alignment","stackElements","stackAxis","otherAxis","previousBBox","createStackElements","wrapElements","stacks","maxSize","stack","stackSize","addElementToStack","getStacks","startElement","elementIdx","StopsArray","optionsAccessor","GradientStop","offset","arg","defineOptionsAccessors","Gradient","stops","_createStops","_userSpace","userSpace","addStop","removeStop","stop","LinearGradient","RadialGradient","_radius","_fallbackFill","fallbackFill","instance","instance$1","easingFunctions","swing","linear","easeOutElastic","time","diff","asin","AnimationFactory","_items","register","Animation","_options","duration","easing","setup","step","play","delay","finish","abort","setTimeout","loop","_stopped","wallTime","easingPosition","animationFrame","destroy","PathParser","BaseNode","srcElement","childNodes","observe","load","node","removeSelf","invalidate","Surface$2","Observable$$1","Surface","_kendoExportVisual","exportVisual","_click","_handler","_mouseenter","_mouseleave","_mousemove","_visual","_enableTracking","draw","unbind","eventTarget","domNode","_kendoNode","currentSize","_resize","resize","force","suspendTracking","_suspendedTracking","resumeTracking","originalEvent","_elementOffset","padding","_surfacePoint","coord","inverseTransform","Observable","renderAttr","renderAllAttr","attrs","renderStyle","NODE_MAP","SVG_NS","NONE","renderSVG","container","svg","innerHTML","testContainer","hasParser","DOMParser","firstChild","namespaceURI","chartDoc","parseFromString","importedDoc","adoptNode","renderSVG$1","TRANSFORM","DefinitionMap","isDefinition","Node","BaseNode$$1","definitions","clearDefinitions","childNode","createDefinitions","attachTo","root","domElement","render","insertBefore","setElement","nodes","childElement","template","renderChildren","css","updateDefinition","attr","removeAttr","setAttribute","allAttr","allCss","removeAttribute","mapTransform","renderTransform","transformChange","mapStyle","cursor","renderOpacity","renderId","hasDefinitions","definition","definitionChange","refUrl","renderDefinitions","mapDefinitions","skipBaseHref","baseHref","baseUrl","base","getElementsByTagName","href","url","msie","hashIndex","GradientStopNode","Node$$1","renderOffset","GradientNode","loadStops","stopNode","mapCoordinates","renderCoordinates","mapSpace","LinearGradientNode","GradientNode$$1","RadialGradientNode","ClipNode","DefinitionNode","definitionMap","addDefinitions","removeDefinitions","createDefinition","item","addDefinition","mapItem","removeDefinition","RootNode","defs","firstElementChild","DASH_ARRAYS","dot","dash","longdash","dashdot","longdashdot","longdashdotdot","SOLID","BUTT","ATTRIBUTE_MAP","PathNode","renderData","mapFill","mapStroke","undefined","renderLinecap","dashType","renderDashType","renderStroke","dashArray","lineCap","renderFill","ArcNode","PathNode$$1","CircleNode","GroupNode","ImageNode","mapPosition","mapSource","renderPosition","encode","htmlEncode","renderSource","MultiPathNode","RectNode","ENTITY_REGEX","decodeEntities","test","_element","lastIndex","innerText","TextNode","setY","renderContent","renderTextAnchor","rtl","edge","Surface$3","BaseSurface","_root","direction","_template","_rootElement","ctm","getScreenCTM","alignToScreen","click","mouseover","mouseout","mousemove","viewBox","_offset","visual","NODE_MAP$2","renderPath","ctx","prevOut","bezierCurveTo","Node$2","initClip","clearClip","setClip","beginPath","setTransform","loadElements","cors","setOpacity","globalAlpha","opactity","GroupNode$2","renderTo","save","restore","RootNode$2","canvas","getContext","invalidateHandler","_invalidate","throttle","_rescale","_devicePixelRatio","devicePixelRatio","fixedScale","clearRect","QuadRoot","shapes","shape","_quadNode","pointShapes","QuadNode","QuadRoot$$1","inBounds","nodeRect","nodeBottomRight","inserted","_initChildren","halfWidth","halfHeight","ROOT_SIZE","ShapesQuadTree","initRoots","rootMap","rootElements","pointShape","sectorRoot","assignZindex","zIndexComparer","zIndex","levelWeight","parents","_zIndex","bboxChange","_insertShape","elementsArray","_insert","sectors","getSectors","inRoot","bottomX","bottomY","SurfaceCursor","surface","_resetCursor","_shapeCursor","_current","_defaultCursor","_getCursor","_setCursor","PathNode$2","renderPoints","setLineDash","setLineCap","setLineJoin","setFill","setStroke","hasFill","setGradientFill","fillStyle","gradient","createLinearGradient","createRadialGradient","parseColor","addColorStop","toCssRgba","addGradientStops","strokeStyle","lineWidth","mozDash","webkitLineDash","ArcNode$2","CircleNode$2","ImageNode$2","onLoad","onError","loading","crossOrigin","complete","onload","onerror","state","drawImage","resolve","reject","MultiPathNode$2","RectNode$2","TextNode$2","textAlign","fillText","strokeText","instance$2","support$1","Surface$4","_mouseTrackHandler","_trackMouse","_searchTree","_cursor","image","rootElement","loadingStates","promise","resolveDataURL","data","toDataURL","then","currentShape","_currentShape","hasDocument","SurfaceFactory","implementation","hasFeature","preferred","logToConsole","navigator","exportGroup","rootGroup","exportRoot","svg$1","slice$1$1","thing","KENDO_PSEUDO_ELEMENT","IMAGE_CACHE","nodeInfo","microsoft","TextRect","Text$$1","_pdfRect","setCSS","el","keys","matches","selector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","closest","cloneNodes","$el","$clone","tagName","checked","selected","nextSibling","dive","canvases","canvas$$1","orig","cache","parseBackgroundImage","tok_linear_gradient","tok_percent","tok_length","tok_keyword","tok_angle","tok_whitespace","tok_popen","tok_pclose","tok_comma","tok_url","tok_content","cache1","cache2","tok","read","token","exec","substr","skip_ws","read_stop","percent","toRGB","propName","to1","to2","num","parseAngle","to","read_linear_gradient","read_url","splitProperty","ret","last$$1","in_paren","in_string","looking_at","getFontURL","getFontHeight","getFontFaces","doc","styleSheets","doStylesheet","ss","rules","cssRules","ex","styleSheet","family","getPropertyValue","bold","italic","findFonts","addRule","addRules","rule","reduce","incCounter","inc","getPrototypeOf","resetCounter","val","doCounters","def","updateCounters","counterReset","counterIncrement","parseColor$1","whenImagesAreActuallyLoaded","pending","next","images","cacheImages","urls","getComputedStyle$1","bg","alphaNumeral","pushNodeInfo","decoration","prop","createsStackingContext","_stackingContext","popNodeInfo","updateClipbox","_clipbox","pseudoElt","defa","webkit","mozilla","opera","pleaseSetPropertyValue","important","setProperty","getBorder","side","saveStyle","func","prev","getBorderRadius","sanitizeRadius","getContentBox","innerBox","wt","wr","wb","wl","radiansToDegrees","setTransform$1","setClipping","clipPath","addArcToPath","adjustBorderRadiusForBox","rTL","rTR","rBR","rBL","tl_x","tl_y","tr_x","tr_y","br_x","br_y","bl_x","bl_y","elementRoundBox","bt","bb","pt","pr","pb","pl","roundBox","rTL0","rTR0","rBR0","rBL0","tmp","formatCounter","evalPseudoElementContent","displayCounter","getAllCounters","getCounter","getAttribute","getCssText","_renderWithPseudoElements","fake","pseudo","saveClass","className","_renderElement","kind","place","psel","ownerDocument","backgroundColor","textOverflow","saveTextOverflow","backgroundImage","backgroundRepeat","backgroundPosition","backgroundOrigin","backgroundSize","version","currentStyle","boxes","cells","innerbox","display","getClientRects","table","tableBorderLeft","tableBorderTop","tableBox","firstCellBox","rows","adjustBoxes","drawOneBox","_avoidLinks","createRange","selectNodeContents","_pdfLink","listStyleType","listStylePosition","_drawBullet","bullet","boxSizing","renderElement","elementIndex","k","fontSize","lineHeight","paddingRight","fontFamily","disc","circle","square","drawBullet","clipit","isFormField","widget","widgetInstance","exportDOMVisual","wrap$$1","maybeRenderWidget","renderContents","drawEdge","Wtop","Wleft","Wright","rl","rr","transform$$1","drawRoundCorner","ri","drawOneBackground","background","drawBackgroundImage","pxlen","scaledAngle","atan","tan","implicit","console","log","img_width","img_height","renderBG","aspect_ratio","orgBox","rewX","rewY","repeatX","isFirst","isLast","drawBackground","shouldDrawLeft","shouldDrawRight","inv","renderImage","zIndexSort","sa","sb","za","zb","pa","renderFormField","tag","renderCheckbox","option","whiteSpace","overflow","multiple","selectedOptions","selectedIndex","getSelectedOption","xml","serializer","XMLSerializer","serializeToString","svg$$1","serializeSVG","floats","positioned","renderText","floating","cb","search","isJustified","columnCount","textTransform","estimateLineLength","prevLineBottom","underline","lineThrough","overline","hasDecoration","doChunk","selectNode","line","ypos","actuallyGetRangeBoundingRect","chrome","safari","rectangles","Infinity","done","origStart","setStart","setEnd","found","findEOL","eol","startOffset","cc","indent","drawText","visibility","getTransform","main","_dom_zIndex","groupInStackingContext","mmul","a1","b1","c1","d1","e1","f1","a2","b2","c2","d2","exportImage","defaults","surfaceOptions","exportSVG","raw","vAlign","vStack","vWrap","fit","rectSize","drawDOM","pdf","defineFont","doOne","cls","avoidLinks","classList","word","removeClass","forceBreak","forcePageBreak","hasPaperSize","paperSize","paperOptions","getPaperOptions","pageWidth","pageHeight","margin","hasMargin","Boolean","multiPage","_ignoreMargin","div","makeTemplate","pages","copy","_destructive","adjust","tfoot","ol","li","beforePageBreak","doPageBreak","splitElement","page","makePage","pageNum","totalPages","keepTogether","tableLayout","bottomPadding","bottomBorder","saveAdjust","breakAtElement","fall","fallsOnMargin","splitText","firstInParent","colgroup","thead","grid","gridHead","querySelector","repeatHeaders","setStartBefore","setEndBefore","extractContents","preventBulletOnListItem","pageClassName","available","nextnode","findEOP","endOffset","handlePageBreaks","progress","canceled","cancel","dataviz","Color","NS","utils","outerWidth","_outerWidth","outerHeight","_outerHeight","SurfaceTooltip","_tooltipOptions","popupOptions","appendTo","animation","copyAnchorStyles","collision","_openPopupHandler","_openPopup","_bindEvents","showOn","autoHide","hideDelay","showAfter","_showHandler","_showEvent","_surfaceLeaveHandler","_surfaceLeave","_mouseleaveHandler","_mousemoveHandler","on","_hideClick","_tooltipLeave","getPopup","popup","ui","Popup","off","clearTimeout","_timeout","shared","_tooltipShape","tooltip","_updateContent","isFunction","html","_position","tooltipOffset","_instance","surfaceOffset","show","_show","hide","_showTimeout","preventDefault","_autoHide","_measure","open","_closeButton","addClass","wrapper","_popupRelatedTarget","relatedTarget","DrawingSurface","Widget","_triggerInstanceHandler","_triggerInstanceEvent","_bindHandler","hideTooltip","_tooltip","showTooltip","plugin"],"sources":["kendo.drawing.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.color', 'kendo.popup'], factory) :\n factory();\n})((function () {\n (function($) {\n\n function createPromise() {\n return $.Deferred();\n }\n\n function promiseAll(promises) {\n return $.when.apply($, promises);\n }\n\n function extendStatic(dest, src) {\n if (!src) {\n return;\n }\n\n if (typeof src.__proto__ === 'function') {\n dest.__proto__ = src;\n } else {\n for (var member in src) {\n if (src.hasOwnProperty(member)) {\n dest[member] = src[member];\n }\n }\n }\n }\n\n kendo.drawing.util = kendo.drawing.util || {};\n kendo.deepExtend(kendo.drawing.util, {\n createPromise: createPromise,\n promiseAll: promiseAll,\n extendStatic: extendStatic\n });\n\n })(window.kendo.jQuery);\n\n /***********************************************************************\n * WARNING: this file is auto-generated. If you change it directly,\n * your modifications will eventually be lost. The source code is in\n * `kendo-drawing` repository, you should make your changes there and\n * run `src-modules/sync.sh` in this repository.\n */\n\n (function($) {\n /* eslint-disable space-before-blocks, space-before-function-paren */\n\n window.kendo.util = window.kendo.util || {};\n\n var LRUCache = kendo.Class.extend({\n init: function(size) {\n\n this._size = size;\n this._length = 0;\n this._map = {};\n },\n\n put: function(key, value) {\n var map = this._map;\n var entry = { key: key, value: value };\n\n map[key] = entry;\n\n if (!this._head) {\n this._head = this._tail = entry;\n } else {\n this._tail.newer = entry;\n entry.older = this._tail;\n this._tail = entry;\n }\n\n if (this._length >= this._size) {\n map[this._head.key] = null;\n this._head = this._head.newer;\n this._head.older = null;\n } else {\n this._length++;\n }\n },\n\n get: function(key) {\n var entry = this._map[key];\n\n if (entry) {\n if (entry === this._head && entry !== this._tail) {\n this._head = entry.newer;\n this._head.older = null;\n }\n\n if (entry !== this._tail) {\n if (entry.older) {\n entry.older.newer = entry.newer;\n entry.newer.older = entry.older;\n }\n\n entry.older = this._tail;\n entry.newer = null;\n\n this._tail.newer = entry;\n this._tail = entry;\n }\n\n return entry.value;\n }\n }\n });\n\n var REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\n var SPACE = ' ';\n\n function normalizeText(text) {\n return String(text).replace(REPLACE_REGEX, SPACE);\n }\n\n function objectKey(object) {\n var parts = [];\n for (var key in object) {\n parts.push(key + object[key]);\n }\n\n return parts.sort().join(\"\");\n }\n\n // Computes FNV-1 hash\n // See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function\n function hashKey(str) {\n // 32-bit FNV-1 offset basis\n // See http://isthe.com/chongo/tech/comp/fnv/#FNV-param\n var hash = 0x811C9DC5;\n\n for (var i = 0; i < str.length; ++i) {\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n hash ^= str.charCodeAt(i);\n }\n\n return hash >>> 0;\n }\n\n function zeroSize() {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n var DEFAULT_OPTIONS = {\n baselineMarkerSize: 1\n };\n\n var defaultMeasureBox;\n\n if (typeof document !== \"undefined\") {\n defaultMeasureBox = document.createElement(\"div\");\n defaultMeasureBox.style.cssText = \"position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;\" +\n \"padding: 0 !important; margin: 0 !important; border: 0 !important;\" +\n \"line-height: normal !important; visibility: hidden !important; white-space: pre!important;\";\n }\n\n var TextMetrics = kendo.Class.extend({\n init: function(options) {\n\n this._cache = new LRUCache(1000);\n this.options = $.extend({}, DEFAULT_OPTIONS, options);\n },\n\n measure: function(text, style, options) {\n if (options === void 0) { options = {}; }\n\n if (typeof text === 'undefined' || text === null) {\n return zeroSize();\n }\n\n var styleKey = objectKey(style);\n var cacheKey = hashKey(text + styleKey);\n var cachedResult = this._cache.get(cacheKey);\n\n if (cachedResult) {\n return cachedResult;\n }\n\n var size = zeroSize();\n var measureBox = options.box || defaultMeasureBox;\n var baselineMarker = this._baselineMarker().cloneNode(false);\n\n for (var key in style) {\n var value = style[key];\n if (typeof value !== \"undefined\") {\n measureBox.style[key] = value;\n }\n }\n\n var textStr = options.normalizeText !== false ? normalizeText(text) : String(text);\n\n measureBox.textContent = textStr;\n measureBox.appendChild(baselineMarker);\n document.body.appendChild(measureBox);\n\n if (textStr.length) {\n size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\n size.height = measureBox.offsetHeight;\n size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\n }\n\n if (size.width > 0 && size.height > 0) {\n this._cache.put(cacheKey, size);\n }\n\n measureBox.parentNode.removeChild(measureBox);\n\n return size;\n },\n\n _baselineMarker: function() {\n var marker = document.createElement(\"div\");\n marker.style.cssText = \"display: inline-block; vertical-align: baseline;width: \" +\n this.options.baselineMarkerSize + \"px; height: \" + this.options.baselineMarkerSize + \"px;overflow: hidden;\";\n\n return marker;\n }\n });\n\n TextMetrics.current = new TextMetrics();\n\n function measureText(text, style, measureBox) {\n return TextMetrics.current.measure(text, style, measureBox);\n }\n\n kendo.deepExtend(kendo.util, {\n LRUCache: LRUCache,\n TextMetrics: TextMetrics,\n measureText: measureText,\n objectKey: objectKey,\n hashKey: hashKey,\n normalizeText: normalizeText\n });\n\n })(window.kendo.jQuery);\n\n /***********************************************************************\n * WARNING: this file is auto-generated. If you change it directly,\n * your modifications will eventually be lost. The source code is in\n * `kendo-drawing` repository, you should make your changes there and\n * run `src-modules/sync.sh` in this repository.\n */\n\n (function($) {\n /* eslint-disable space-before-blocks, space-before-function-paren */\n\n window.kendo = window.kendo || {};\n var kendoDrawing = kendo.drawing;\n var kendoDrawingUtil = kendoDrawing.util;\n var extendStatic = kendoDrawingUtil.extendStatic;\n var Class = kendo.Class;\n var kendoUtil = kendo.util;\n var support = kendo.support;\n var supportBrowser = support.browser;\n\n var createPromise = kendoDrawingUtil.createPromise;\n var promiseAll = kendoDrawingUtil.promiseAll;\n\n var HasObservers = (function (Class$$1) {\n function HasObservers () {\n Class$$1.apply(this, arguments);\n }\n\n extendStatic(HasObservers, Class$$1);\n HasObservers.prototype = Object.create( Class$$1 && Class$$1.prototype );\n HasObservers.prototype.constructor = HasObservers;\n HasObservers.fn = HasObservers.prototype;\n HasObservers.fn.init = HasObservers.fn.constructor;\n\n HasObservers.prototype.observers = function observers () {\n this._observers = this._observers || [];\n return this._observers;\n };\n\n HasObservers.prototype.addObserver = function addObserver (element) {\n if (!this._observers) {\n this._observers = [ element ];\n } else {\n this._observers.push(element);\n }\n return this;\n };\n\n HasObservers.prototype.removeObserver = function removeObserver (element) {\n var observers = this.observers();\n var index = observers.indexOf(element);\n if (index !== -1) {\n observers.splice(index, 1);\n }\n return this;\n };\n\n HasObservers.prototype.trigger = function trigger (methodName, event) {\n var observers = this._observers;\n\n if (observers && !this._suspended) {\n for (var idx = 0; idx < observers.length; idx++) {\n var observer = observers[idx];\n if (observer[methodName]) {\n observer[methodName](event);\n }\n }\n }\n return this;\n };\n\n HasObservers.prototype.optionsChange = function optionsChange (e) {\n if (e === void 0) { e = {}; }\n\n e.element = this;\n this.trigger(\"optionsChange\", e);\n };\n\n HasObservers.prototype.geometryChange = function geometryChange () {\n this.trigger(\"geometryChange\", {\n element: this\n });\n };\n\n HasObservers.prototype.suspend = function suspend () {\n this._suspended = (this._suspended || 0) + 1;\n return this;\n };\n\n HasObservers.prototype.resume = function resume () {\n this._suspended = Math.max((this._suspended || 0) - 1, 0);\n return this;\n };\n\n HasObservers.prototype._observerField = function _observerField (field, value) {\n if (this[field]) {\n this[field].removeObserver(this);\n }\n this[field] = value;\n value.addObserver(this);\n };\n\n return HasObservers;\n }(Class));\n\n function append$1$1(first, second) {\n first.push.apply(first, second);\n return first;\n }\n\n /* eslint-disable key-spacing,no-multi-spaces,no-param-reassign */\n\n var literals = {\n 1 : \"i\", 10 : \"x\", 100 : \"c\",\n 2 : \"ii\", 20 : \"xx\", 200 : \"cc\",\n 3 : \"iii\", 30 : \"xxx\", 300 : \"ccc\",\n 4 : \"iv\", 40 : \"xl\", 400 : \"cd\",\n 5 : \"v\", 50 : \"l\", 500 : \"d\",\n 6 : \"vi\", 60 : \"lx\", 600 : \"dc\",\n 7 : \"vii\", 70 : \"lxx\", 700 : \"dcc\",\n 8 : \"viii\", 80 : \"lxxx\", 800 : \"dccc\",\n 9 : \"ix\", 90 : \"xc\", 900 : \"cm\",\n 1000 : \"m\"\n };\n\n function arabicToRoman(n) {\n var values = [ 1000,\n 900 , 800, 700, 600, 500, 400, 300, 200, 100,\n 90 , 80 , 70 , 60 , 50 , 40 , 30 , 20 , 10 ,\n 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ];\n\n var roman = \"\";\n while (n > 0) {\n if (n < values[0]) {\n values.shift();\n } else {\n roman += literals[values[0]];\n n -= values[0];\n }\n }\n return roman;\n }\n\n var UNDEFINED = \"undefined\";\n\n function defined(value) {\n return typeof value !== UNDEFINED;\n }\n\n var defId = 1;\n\n function definitionId() {\n return \"kdef\" + defId++;\n }\n\n var DEG_TO_RAD = Math.PI / 180;\n var MAX_NUM = Number.MAX_VALUE;\n var MIN_NUM = -Number.MAX_VALUE;\n\n function deg(radians) {\n return radians / DEG_TO_RAD;\n }\n\n var fromCharCode = String.fromCharCode;\n\n // Encodes a string as UTF-8\n function encodeUTF8(input) {\n var output = \"\";\n\n for (var i = 0; i < input.length; i++) {\n var code = input.charCodeAt(i);\n\n if (0xD800 <= code && code <= 0xDBFF) {\n var hi = code;\n var low = input.charCodeAt(++i);\n\n if (!isNaN(low)) {\n // Combine high and low surrogate\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n code = (hi - 0xD800) * 0x400 +\n (low - 0xDC00) + 0x10000;\n }\n }\n\n if (code < 0x80) {\n // One byte\n output += fromCharCode(code);\n } else if (code < 0x800) {\n // Two bytes\n output += fromCharCode(0xC0 | (code >>> 6));\n output += fromCharCode(0x80 | (code & 0x3f));\n } else if (code < 0x10000) {\n // Three bytes\n output += fromCharCode(0xE0 | (code >>> 12));\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\n output += fromCharCode(0x80 | (code & 0x3f));\n } else if (code < 0x10FFFF) {\n // Four bytes\n output += fromCharCode(0xF0 | (code >>> 18));\n output += fromCharCode(0x80 | (code >>> 12 & 0x3f));\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\n output += fromCharCode(0x80 | (code & 0x3f));\n }\n }\n\n return output;\n }\n\n // Encodes a string as UTF-16 big-endian\n\n var KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n function encodeBase64(input) {\n var output = \"\";\n var i = 0;\n\n var utfInput = encodeUTF8(input);\n\n while (i < utfInput.length) {\n var chr1 = utfInput.charCodeAt(i++);\n var chr2 = utfInput.charCodeAt(i++);\n var chr3 = utfInput.charCodeAt(i++);\n\n var enc1 = chr1 >> 2;\n var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n var enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output +\n KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) +\n KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\n }\n\n return output;\n }\n\n function eventCoordinates(e) {\n if (defined((e.x || {}).location)) {\n return {\n x: e.x.location,\n y: e.y.location\n };\n }\n\n return {\n x: e.pageX || e.clientX || 0,\n y: e.pageY || e.clientY || 0\n };\n }\n\n function eventElement(e) {\n if (e === void 0) { e = {}; }\n\n return e.touch ? e.touch.initialTouch : e.target;\n }\n\n function isTransparent(color) {\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\n }\n\n function last(array) {\n if (array) {\n return array[array.length - 1];\n }\n }\n\n function limitValue(value, min, max) {\n return Math.max(Math.min(value, max), min);\n }\n\n /* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\n /* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\n /* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty */\n /* eslint-disable no-param-reassign, no-var, block-scoped-var */\n\n // mergeSort is stable.\n function mergeSort(a, cmp) {\n if (a.length < 2) {\n return a.slice();\n }\n function merge(a, b) {\n var r = [], ai = 0, bi = 0, i = 0;\n while (ai < a.length && bi < b.length) {\n if (cmp(a[ai], b[bi]) <= 0) {\n r[i++] = a[ai++];\n } else {\n r[i++] = b[bi++];\n }\n }\n if (ai < a.length) {\n r.push.apply(r, a.slice(ai));\n }\n if (bi < b.length) {\n r.push.apply(r, b.slice(bi));\n }\n return r;\n }\n return (function sort(a) {\n if (a.length <= 1) {\n return a;\n }\n var m = Math.floor(a.length / 2);\n var left = a.slice(0, m);\n var right = a.slice(m);\n left = sort(left);\n right = sort(right);\n return merge(left, right);\n })(a);\n }\n\n var now = Date.now || function() {\n return new Date().getTime();\n };\n\n function rad(degrees) {\n return degrees * DEG_TO_RAD;\n }\n\n function pow(p) {\n if (p) {\n return Math.pow(10, p);\n }\n\n return 1;\n }\n\n function round(value, precision) {\n var power = pow(precision);\n return Math.round(value * power) / power;\n }\n\n function valueOrDefault(value, defaultValue) {\n return defined(value) ? value : defaultValue;\n }\n\n function bindEvents(element, events) {\n for (var eventName in events) {\n var eventNames = eventName.trim().split(\" \");\n for (var idx = 0; idx < eventNames.length; idx++) {\n element.addEventListener(eventNames[idx], events[eventName], false);\n }\n }\n }\n\n function elementOffset(element) {\n var box = element.getBoundingClientRect();\n\n var documentElement = document.documentElement;\n\n return {\n top: box.top + (window.pageYOffset || documentElement.scrollTop) - (documentElement.clientTop || 0),\n left: box.left + (window.pageXOffset || documentElement.scrollLeft) - (documentElement.clientLeft || 0)\n };\n }\n\n function elementStyles(element, styles) {\n var result = {};\n var style = window.getComputedStyle(element) || {};\n var stylesArray = Array.isArray(styles) ? styles : [ styles ];\n\n for (var idx = 0; idx < stylesArray.length; idx++) {\n var field = stylesArray[idx];\n result[field] = style[field];\n }\n\n return result;\n }\n\n function getPixels(value) {\n if (isNaN(value)) {\n return value;\n }\n return value + \"px\";\n }\n\n function elementSize(element, size) {\n if (size) {\n var width = size.width;\n var height = size.height;\n\n if (defined(width)) {\n element.style.width = getPixels(width);\n }\n\n if (defined(height)) {\n element.style.height = getPixels(height);\n }\n\n } else {\n var size$1 = elementStyles(element, [ 'width', 'height' ]);\n\n return {\n width: parseInt(size$1.width, 10),\n height: parseInt(size$1.height, 10)\n };\n }\n }\n\n function unbindEvents(element, events) {\n if (events === void 0) { events = {}; }\n\n for (var name in events) {\n var eventNames = name.trim().split(\" \");\n for (var idx = 0; idx < eventNames.length; idx++) {\n element.removeEventListener(eventNames[idx], events[name], false);\n }\n }\n }\n\n function elementPadding(element) {\n var ref = elementStyles(element, [ \"paddingLeft\", \"paddingTop\" ]);\n var paddingLeft = ref.paddingLeft;\n var paddingTop = ref.paddingTop;\n return {\n top: parseFloat(paddingTop),\n left: parseFloat(paddingLeft)\n };\n }\n\n var Matrix = (function (Class$$1) {\n function Matrix(a, b, c, d, e, f) {\n if (a === void 0) { a = 0; }\n if (b === void 0) { b = 0; }\n if (c === void 0) { c = 0; }\n if (d === void 0) { d = 0; }\n if (e === void 0) { e = 0; }\n if (f === void 0) { f = 0; }\n\n Class$$1.call(this);\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n }\n\n extendStatic(Matrix, Class$$1);\n Matrix.prototype = Object.create( Class$$1 && Class$$1.prototype );\n Matrix.prototype.constructor = Matrix;\n Matrix.fn = Matrix.prototype;\n Matrix.fn.init = Matrix.fn.constructor;\n\n Matrix.prototype.multiplyCopy = function multiplyCopy (matrix) {\n return new Matrix(\n this.a * matrix.a + this.c * matrix.b,\n this.b * matrix.a + this.d * matrix.b,\n this.a * matrix.c + this.c * matrix.d,\n this.b * matrix.c + this.d * matrix.d,\n this.a * matrix.e + this.c * matrix.f + this.e,\n this.b * matrix.e + this.d * matrix.f + this.f\n );\n };\n\n Matrix.prototype.invert = function invert () {\n var ref = this;\n var a = ref.a;\n var b = ref.b;\n var d = ref.c;\n var e = ref.d;\n var g = ref.e;\n var h = ref.f;\n var det = a * e - b * d;\n\n if (det === 0) {\n return null;\n }\n\n return new Matrix(e / det, -b / det, -d / det, a / det,\n (d * h - e * g) / det, (b * g - a * h) / det);\n };\n\n Matrix.prototype.clone = function clone () {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n };\n\n Matrix.prototype.equals = function equals (other) {\n if (!other) {\n return false;\n }\n\n return this.a === other.a && this.b === other.b &&\n this.c === other.c && this.d === other.d &&\n this.e === other.e && this.f === other.f;\n };\n\n Matrix.prototype.round = function round$1 (precision) {\n this.a = round(this.a, precision);\n this.b = round(this.b, precision);\n this.c = round(this.c, precision);\n this.d = round(this.d, precision);\n this.e = round(this.e, precision);\n this.f = round(this.f, precision);\n\n return this;\n };\n\n Matrix.prototype.toArray = function toArray (precision) {\n var result = [ this.a, this.b, this.c, this.d, this.e, this.f ];\n\n if (defined(precision)) {\n for (var i = 0; i < result.length; i++) {\n result[i] = round(result[i], precision);\n }\n }\n\n return result;\n };\n\n Matrix.prototype.toString = function toString (precision, separator) {\n if (separator === void 0) { separator = \",\"; }\n\n return this.toArray(precision).join(separator);\n };\n\n Matrix.translate = function translate (x, y) {\n return new Matrix(1, 0, 0, 1, x, y);\n };\n\n Matrix.unit = function unit () {\n return new Matrix(1, 0, 0, 1, 0, 0);\n };\n\n Matrix.rotate = function rotate (angle, x, y) {\n var matrix = new Matrix();\n matrix.a = Math.cos(rad(angle));\n matrix.b = Math.sin(rad(angle));\n matrix.c = -matrix.b;\n matrix.d = matrix.a;\n matrix.e = (x - x * matrix.a + y * matrix.b) || 0;\n matrix.f = (y - y * matrix.a - x * matrix.b) || 0;\n\n return matrix;\n };\n\n Matrix.scale = function scale (scaleX, scaleY) {\n return new Matrix(scaleX, 0, 0, scaleY, 0, 0);\n };\n\n return Matrix;\n }(Class));\n\n Matrix.IDENTITY = Matrix.unit();\n\n var matrixRegexp = /matrix\\((.*)\\)/;\n\n function parseMatrix(matrixString) {\n var match = matrixString.match(matrixRegexp);\n if (match === null || match.length !== 2) {\n return Matrix.unit();\n }\n\n var members = match[1].split(',').map(function (x) { return parseFloat(x); });\n return new (Function.prototype.bind.apply( Matrix, [ null ].concat( members) ));\n }\n\n function transformMatrix(element) {\n var transform = getComputedStyle(element).transform;\n\n if (transform === 'none') {\n return Matrix.unit();\n }\n\n return parseMatrix(transform);\n }\n\n function elementScale(element) {\n if (!element) {\n return Matrix.unit();\n }\n\n var matrix = transformMatrix(element);\n var parent = element.parentElement;\n while (parent) {\n var parentMatrix = transformMatrix(parent);\n matrix = matrix.multiplyCopy(parentMatrix);\n parent = parent.parentElement;\n }\n\n matrix.b = matrix.c = matrix.e = matrix.f = 0;\n return matrix;\n }\n\n var util = {\n \tappend: append$1$1,\n \tarabicToRoman: arabicToRoman,\n \tcreatePromise: createPromise,\n \tdefined: defined,\n \tdefinitionId: definitionId,\n \tdeg: deg,\n \tencodeBase64: encodeBase64,\n \teventCoordinates: eventCoordinates,\n \teventElement: eventElement,\n \tisTransparent: isTransparent,\n \tlast: last,\n \tlimitValue: limitValue,\n \tmergeSort: mergeSort,\n \tnow: now,\n \tpromiseAll: promiseAll,\n \trad: rad,\n \tround: round,\n \tvalueOrDefault: valueOrDefault,\n \tbindEvents: bindEvents,\n \telementOffset: elementOffset,\n \telementSize: elementSize,\n \telementStyles: elementStyles,\n \tunbindEvents: unbindEvents,\n \telementPadding: elementPadding,\n \telementScale: elementScale,\n \tDEG_TO_RAD: DEG_TO_RAD,\n \tMAX_NUM: MAX_NUM,\n \tMIN_NUM: MIN_NUM\n };\n\n var toString$1 = {}.toString;\n\n var OptionsStore = (function (HasObservers$$1) {\n function OptionsStore(options, prefix) {\n var this$1$1 = this;\n if (prefix === void 0) { prefix = \"\"; }\n\n HasObservers$$1.call(this);\n\n this.prefix = prefix;\n\n for (var field in options) {\n var member = options[field];\n member = this$1$1._wrap(member, field);\n this$1$1[field] = member;\n }\n }\n\n extendStatic(OptionsStore, HasObservers$$1);\n OptionsStore.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\n OptionsStore.prototype.constructor = OptionsStore;\n OptionsStore.fn = OptionsStore.prototype;\n OptionsStore.fn.init = OptionsStore.fn.constructor;\n\n OptionsStore.prototype.get = function get (field) {\n var parts = field.split(\".\");\n var result = this;\n\n while (parts.length && result) {\n var part = parts.shift();\n result = result[part];\n }\n\n return result;\n };\n\n OptionsStore.prototype.set = function set (field, value) {\n var current = this.get(field);\n\n if (current !== value) {\n this._set(field, this._wrap(value, field));\n this.optionsChange({\n field: this.prefix + field,\n value: value\n });\n }\n };\n\n OptionsStore.prototype._set = function _set (field, value) {\n var this$1$1 = this;\n\n var composite = field.indexOf(\".\") >= 0;\n var parentObj = this;\n var fieldName = field;\n\n if (composite) {\n var parts = fieldName.split(\".\");\n var prefix = this.prefix;\n\n while (parts.length > 1) {\n fieldName = parts.shift();\n prefix += fieldName + \".\";\n\n var obj = parentObj[fieldName];\n\n if (!obj) {\n obj = new OptionsStore({}, prefix);\n obj.addObserver(this$1$1);\n parentObj[fieldName] = obj;\n }\n parentObj = obj;\n }\n fieldName = parts[0];\n }\n\n parentObj._clear(fieldName);\n parentObj[fieldName] = value;\n };\n\n OptionsStore.prototype._clear = function _clear (field) {\n var current = this[field];\n if (current && current.removeObserver) {\n current.removeObserver(this);\n }\n };\n\n OptionsStore.prototype._wrap = function _wrap (object, field) {\n var type = toString$1.call(object);\n var wrapped = object;\n\n if (wrapped !== null && defined(wrapped) && type === \"[object Object]\") {\n if (!(object instanceof OptionsStore) && !(object instanceof Class)) {\n wrapped = new OptionsStore(wrapped, this.prefix + field + \".\");\n }\n\n wrapped.addObserver(this);\n }\n\n return wrapped;\n };\n\n return OptionsStore;\n }(HasObservers));\n\n function setAccessor(field) {\n return function(value) {\n if (this[field] !== value) {\n this[field] = value;\n this.geometryChange();\n }\n\n return this;\n };\n }\n\n function getAccessor(field) {\n return function() {\n return this[field];\n };\n }\n\n function defineAccessors(fn, fields) {\n for (var i = 0; i < fields.length; i++) {\n var name = fields[i];\n var capitalized = name.charAt(0).toUpperCase() +\n name.substring(1, name.length);\n\n fn[\"set\" + capitalized] = setAccessor(name);\n fn[\"get\" + capitalized] = getAccessor(name);\n }\n }\n\n var withAccessors = function (TBase, names) {\n var result = (function (TBase) {\n function result () {\n TBase.apply(this, arguments);\n }extendStatic(result, TBase);\n result.prototype = Object.create( TBase && TBase.prototype );\n result.prototype.constructor = result;\n result.fn = result.prototype;\n result.fn.init = result.fn.constructor;\n\n return result;\n }(TBase));\n defineAccessors(result.prototype, names);\n\n return result;\n };\n\n function toMatrix(transformation) {\n if (transformation && typeof transformation.matrix === \"function\") {\n return transformation.matrix();\n }\n\n return transformation;\n }\n\n var Point = (function (superclass) {\n function Point(x, y) {\n superclass.call(this);\n\n this.x = x || 0;\n this.y = y || 0;\n }\n\n extendStatic(Point, superclass);\n Point.prototype = Object.create( superclass && superclass.prototype );\n Point.prototype.constructor = Point;\n Point.fn = Point.prototype;\n Point.fn.init = Point.fn.constructor;\n\n var staticAccessors = { ZERO: {} };\n\n Point.prototype.equals = function equals (other) {\n return other && other.x === this.x && other.y === this.y;\n };\n\n Point.prototype.clone = function clone () {\n return new Point(this.x, this.y);\n };\n\n Point.prototype.rotate = function rotate (angle, origin) {\n var originPoint = Point.create(origin) || Point.ZERO;\n\n return this.transform(Matrix.rotate(angle, originPoint.x, originPoint.y));\n };\n\n Point.prototype.translate = function translate (x, y) {\n this.x += x;\n this.y += y;\n\n this.geometryChange();\n\n return this;\n };\n\n Point.prototype.translateWith = function translateWith (point) {\n return this.translate(point.x, point.y);\n };\n\n Point.prototype.move = function move (x, y) {\n this.x = this.y = 0;\n return this.translate(x, y);\n };\n\n Point.prototype.scale = function scale (scaleX, scaleY) {\n if (scaleY === void 0) { scaleY = scaleX; }\n\n this.x *= scaleX;\n this.y *= scaleY;\n\n this.geometryChange();\n\n return this;\n };\n\n Point.prototype.scaleCopy = function scaleCopy (scaleX, scaleY) {\n return this.clone().scale(scaleX, scaleY);\n };\n\n Point.prototype.transform = function transform (transformation) {\n var matrix = toMatrix(transformation);\n var ref = this;\n var x = ref.x;\n var y = ref.y;\n\n this.x = matrix.a * x + matrix.c * y + matrix.e;\n this.y = matrix.b * x + matrix.d * y + matrix.f;\n\n this.geometryChange();\n\n return this;\n };\n\n Point.prototype.transformCopy = function transformCopy (transformation) {\n var point = this.clone();\n\n if (transformation) {\n point.transform(transformation);\n }\n\n return point;\n };\n\n Point.prototype.distanceTo = function distanceTo (point) {\n var dx = this.x - point.x;\n var dy = this.y - point.y;\n\n return Math.sqrt(dx * dx + dy * dy);\n };\n\n Point.prototype.round = function round$1 (digits) {\n this.x = round(this.x, digits);\n this.y = round(this.y, digits);\n\n this.geometryChange();\n\n return this;\n };\n\n Point.prototype.toArray = function toArray (digits) {\n var doRound = defined(digits);\n var x = doRound ? round(this.x, digits) : this.x;\n var y = doRound ? round(this.y, digits) : this.y;\n\n return [ x, y ];\n };\n\n Point.prototype.toString = function toString (digits, separator) {\n if (separator === void 0) { separator = \" \"; }\n\n var ref = this;\n var x = ref.x;\n var y = ref.y;\n\n if (defined(digits)) {\n x = round(x, digits);\n y = round(y, digits);\n }\n\n return x + separator + y;\n };\n\n Point.create = function create (arg0, arg1) {\n if (defined(arg0)) {\n if (arg0 instanceof Point) {\n return arg0;\n } else if (arguments.length === 1 && arg0.length === 2) {\n return new Point(arg0[0], arg0[1]);\n }\n\n return new Point(arg0, arg1);\n }\n };\n\n Point.min = function min () {\n var arguments$1 = arguments;\n\n var minX = MAX_NUM;\n var minY = MAX_NUM;\n\n for (var i = 0; i < arguments.length; i++) {\n var point = arguments$1[i];\n minX = Math.min(point.x, minX);\n minY = Math.min(point.y, minY);\n }\n\n return new Point(minX, minY);\n };\n\n Point.max = function max () {\n var arguments$1 = arguments;\n\n var maxX = MIN_NUM;\n var maxY = MIN_NUM;\n\n for (var i = 0; i < arguments.length; i++) {\n var point = arguments$1[i];\n maxX = Math.max(point.x, maxX);\n maxY = Math.max(point.y, maxY);\n }\n\n return new Point(maxX, maxY);\n };\n\n Point.minPoint = function minPoint () {\n return new Point(MIN_NUM, MIN_NUM);\n };\n\n Point.maxPoint = function maxPoint () {\n return new Point(MAX_NUM, MAX_NUM);\n };\n\n staticAccessors.ZERO.get = function () {\n return new Point(0, 0);\n };\n\n Object.defineProperties( Point, staticAccessors );\n\n return Point;\n }(withAccessors(HasObservers, [ \"x\", \"y\" ])));\n\n var Size = (function (superclass) {\n function Size(width, height) {\n superclass.call(this);\n\n this.width = width || 0;\n this.height = height || 0;\n }\n\n extendStatic(Size, superclass);\n Size.prototype = Object.create( superclass && superclass.prototype );\n Size.prototype.constructor = Size;\n Size.fn = Size.prototype;\n Size.fn.init = Size.fn.constructor;\n\n var staticAccessors = { ZERO: {} };\n\n Size.prototype.equals = function equals (other) {\n return other && other.width === this.width && other.height === this.height;\n };\n\n Size.prototype.clone = function clone () {\n return new Size(this.width, this.height);\n };\n\n Size.prototype.toArray = function toArray (digits) {\n var doRound = defined(digits);\n var width = doRound ? round(this.width, digits) : this.width;\n var height = doRound ? round(this.height, digits) : this.height;\n\n return [ width, height ];\n };\n\n Size.create = function create (arg0, arg1) {\n if (defined(arg0)) {\n if (arg0 instanceof Size) {\n return arg0;\n } else if (arguments.length === 1 && arg0.length === 2) {\n return new Size(arg0[0], arg0[1]);\n }\n\n return new Size(arg0, arg1);\n }\n };\n\n staticAccessors.ZERO.get = function () {\n return new Size(0, 0);\n };\n\n Object.defineProperties( Size, staticAccessors );\n\n return Size;\n }(withAccessors(HasObservers, [ \"width\", \"height\" ])));\n\n var Rect = (function (HasObservers$$1) {\n function Rect(origin, size, cornerRadius) {\n if (origin === void 0) { origin = new Point(); }\n if (size === void 0) { size = new Size(); }\n if (cornerRadius === void 0) { cornerRadius = 0; }\n\n HasObservers$$1.call(this);\n\n this.setOrigin(origin);\n this.setSize(size);\n this.setCornerRadius(cornerRadius);\n }\n\n extendStatic(Rect, HasObservers$$1);\n Rect.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\n Rect.prototype.constructor = Rect;\n Rect.fn = Rect.prototype;\n Rect.fn.init = Rect.fn.constructor;\n\n Rect.prototype.clone = function clone () {\n return new Rect(\n this.origin.clone(),\n this.size.clone()\n );\n };\n\n Rect.prototype.equals = function equals (other) {\n return other &&\n other.origin.equals(this.origin) &&\n other.size.equals(this.size);\n };\n\n Rect.prototype.setOrigin = function setOrigin (value) {\n this._observerField(\"origin\", Point.create(value));\n this.geometryChange();\n return this;\n };\n\n Rect.prototype.getOrigin = function getOrigin () {\n return this.origin;\n };\n\n Rect.prototype.setCornerRadius = function setCornerRadius (radius) {\n this.cornerRadius = Array.isArray(radius) ? radius : [ radius, radius ];\n\n this.geometryChange();\n return this;\n };\n\n Rect.prototype.getCornerRadius = function getCornerRadius () {\n return this.cornerRadius;\n };\n\n Rect.prototype.setSize = function setSize (value) {\n this._observerField(\"size\", Size.create(value));\n this.geometryChange();\n return this;\n };\n\n Rect.prototype.getSize = function getSize () {\n return this.size;\n };\n\n Rect.prototype.width = function width () {\n return this.size.width;\n };\n\n Rect.prototype.height = function height () {\n return this.size.height;\n };\n\n Rect.prototype.topLeft = function topLeft () {\n return this.origin.clone();\n };\n\n Rect.prototype.bottomRight = function bottomRight () {\n return this.origin.clone().translate(this.width(), this.height());\n };\n\n Rect.prototype.topRight = function topRight () {\n return this.origin.clone().translate(this.width(), 0);\n };\n\n Rect.prototype.bottomLeft = function bottomLeft () {\n return this.origin.clone().translate(0, this.height());\n };\n\n Rect.prototype.center = function center () {\n return this.origin.clone().translate(this.width() / 2, this.height() / 2);\n };\n\n Rect.prototype.bbox = function bbox (matrix) {\n var tl = this.topLeft().transformCopy(matrix);\n var tr = this.topRight().transformCopy(matrix);\n var br = this.bottomRight().transformCopy(matrix);\n var bl = this.bottomLeft().transformCopy(matrix);\n\n return Rect.fromPoints(tl, tr, br, bl);\n };\n\n Rect.prototype.transformCopy = function transformCopy (m) {\n return Rect.fromPoints(\n this.topLeft().transform(m),\n this.bottomRight().transform(m)\n );\n };\n\n Rect.prototype.expand = function expand (x, y) {\n if (y === void 0) { y = x; }\n\n this.size.width += 2 * x;\n this.size.height += 2 * y;\n\n this.origin.translate(-x, -y);\n\n return this;\n };\n\n Rect.prototype.expandCopy = function expandCopy (x, y) {\n return this.clone().expand(x, y);\n };\n\n Rect.prototype.containsPoint = function containsPoint (point) {\n var origin = this.origin;\n var bottomRight = this.bottomRight();\n return !(point.x < origin.x || point.y < origin.y || bottomRight.x < point.x || bottomRight.y < point.y);\n };\n\n Rect.prototype._isOnPath = function _isOnPath (point, width) {\n var rectOuter = this.expandCopy(width, width);\n var rectInner = this.expandCopy(-width, -width);\n\n return rectOuter.containsPoint(point) && !rectInner.containsPoint(point);\n };\n\n Rect.fromPoints = function fromPoints () {\n var topLeft = Point.min.apply(null, arguments);\n var bottomRight = Point.max.apply(null, arguments);\n var size = new Size(\n bottomRight.x - topLeft.x,\n bottomRight.y - topLeft.y\n );\n\n return new Rect(topLeft, size);\n };\n\n Rect.union = function union (a, b) {\n return Rect.fromPoints(\n Point.min(a.topLeft(), b.topLeft()),\n Point.max(a.bottomRight(), b.bottomRight())\n );\n };\n\n Rect.intersect = function intersect (a, b) {\n var rect1 = {\n left: a.topLeft().x,\n top: a.topLeft().y,\n right: a.bottomRight().x,\n bottom: a.bottomRight().y\n };\n\n var rect2 = {\n left: b.topLeft().x,\n top: b.topLeft().y,\n right: b.bottomRight().x,\n bottom: b.bottomRight().y\n };\n\n if (rect1.left <= rect2.right &&\n rect2.left <= rect1.right &&\n rect1.top <= rect2.bottom &&\n rect2.top <= rect1.bottom) {\n return Rect.fromPoints(\n new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.top, rect2.top)),\n new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.bottom, rect2.bottom))\n );\n }\n };\n\n return Rect;\n }(HasObservers));\n\n var Transformation = (function (HasObservers$$1) {\n function Transformation(matrix) {\n if (matrix === void 0) { matrix = Matrix.unit(); }\n\n HasObservers$$1.call(this);\n\n this._matrix = matrix;\n }\n\n extendStatic(Transformation, HasObservers$$1);\n Transformation.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\n Transformation.prototype.constructor = Transformation;\n Transformation.fn = Transformation.prototype;\n Transformation.fn.init = Transformation.fn.constructor;\n\n Transformation.prototype.clone = function clone () {\n return new Transformation(\n this._matrix.clone()\n );\n };\n\n Transformation.prototype.equals = function equals (other) {\n return other &&\n other._matrix.equals(this._matrix);\n };\n\n Transformation.prototype.translate = function translate (x, y) {\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y));\n\n this._optionsChange();\n return this;\n };\n\n Transformation.prototype.scale = function scale (scaleX, scaleY, origin) {\n if (scaleY === void 0) { scaleY = scaleX; }\n if (origin === void 0) { origin = null; }\n\n var originPoint = origin;\n\n if (originPoint) {\n originPoint = Point.create(originPoint);\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(originPoint.x, originPoint.y));\n }\n\n this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY));\n\n if (originPoint) {\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(-originPoint.x, -originPoint.y));\n }\n\n this._optionsChange();\n return this;\n };\n\n Transformation.prototype.rotate = function rotate (angle, origin) {\n var originPoint = Point.create(origin) || Point.ZERO;\n\n this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, originPoint.x, originPoint.y));\n\n this._optionsChange();\n return this;\n };\n\n Transformation.prototype.multiply = function multiply (transformation) {\n var matrix = toMatrix(transformation);\n\n this._matrix = this._matrix.multiplyCopy(matrix);\n\n this._optionsChange();\n return this;\n };\n\n Transformation.prototype.matrix = function matrix (value) {\n if (value) {\n this._matrix = value;\n this._optionsChange();\n return this;\n }\n\n return this._matrix;\n };\n\n Transformation.prototype._optionsChange = function _optionsChange () {\n this.optionsChange({\n field: \"transform\",\n value: this\n });\n };\n\n return Transformation;\n }(HasObservers));\n\n function transform$1(matrix) {\n if (matrix === null) {\n return null;\n }\n\n if (matrix instanceof Transformation) {\n return matrix;\n }\n\n return new Transformation(matrix);\n }\n\n var Element$1 = (function (HasObservers$$1) {\n function Element(options) {\n HasObservers$$1.call(this);\n\n this._initOptions(options);\n }\n\n extendStatic(Element, HasObservers$$1);\n Element.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\n Element.prototype.constructor = Element;\n Element.fn = Element.prototype;\n Element.fn.init = Element.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Rect\";\n };\n\n Element.prototype._initOptions = function _initOptions (options) {\n if (options === void 0) { options = {}; }\n\n var clip = options.clip;\n var transform = options.transform;\n\n if (transform) {\n options.transform = transform$1(transform);\n }\n\n if (clip && !clip.id) {\n clip.id = definitionId();\n }\n\n this.options = new OptionsStore(options);\n this.options.addObserver(this);\n };\n\n Element.prototype.transform = function transform (value) {\n if (defined(value)) {\n this.options.set(\"transform\", transform$1(value));\n } else {\n return this.options.get(\"transform\");\n }\n };\n\n Element.prototype.parentTransform = function parentTransform () {\n var element = this;\n var parentMatrix;\n\n while (element.parent) {\n element = element.parent;\n var transformation = element.transform();\n if (transformation) {\n parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit());\n }\n }\n\n if (parentMatrix) {\n return transform$1(parentMatrix);\n }\n };\n\n Element.prototype.currentTransform = function currentTransform (parentTransform) {\n if (parentTransform === void 0) { parentTransform = this.parentTransform(); }\n\n var elementTransform = this.transform();\n var elementMatrix = toMatrix(elementTransform);\n\n var parentMatrix = toMatrix(parentTransform);\n var combinedMatrix;\n\n if (elementMatrix && parentMatrix) {\n combinedMatrix = parentMatrix.multiplyCopy(elementMatrix);\n } else {\n combinedMatrix = elementMatrix || parentMatrix;\n }\n\n if (combinedMatrix) {\n return transform$1(combinedMatrix);\n }\n };\n\n Element.prototype.visible = function visible (value) {\n if (defined(value)) {\n this.options.set(\"visible\", value);\n return this;\n }\n\n return this.options.get(\"visible\") !== false;\n };\n\n Element.prototype.clip = function clip (value) {\n var options = this.options;\n if (defined(value)) {\n if (value && !value.id) {\n value.id = definitionId();\n }\n options.set(\"clip\", value);\n return this;\n }\n\n return options.get(\"clip\");\n };\n\n Element.prototype.opacity = function opacity (value) {\n if (defined(value)) {\n this.options.set(\"opacity\", value);\n return this;\n }\n\n return valueOrDefault(this.options.get(\"opacity\"), 1);\n };\n\n Element.prototype.clippedBBox = function clippedBBox (transformation) {\n var bbox = this._clippedBBox(transformation);\n if (bbox) {\n var clip = this.clip();\n return clip ? Rect.intersect(bbox, clip.bbox(transformation)) : bbox;\n }\n };\n\n Element.prototype.containsPoint = function containsPoint (point, parentTransform) {\n if (this.visible()) {\n var transform = this.currentTransform(parentTransform);\n var transformedPoint = point;\n if (transform) {\n transformedPoint = point.transformCopy(transform.matrix().invert());\n }\n return (this._hasFill() && this._containsPoint(transformedPoint)) || (this._isOnPath && this._hasStroke() && this._isOnPath(transformedPoint));\n }\n return false;\n };\n\n Element.prototype._hasFill = function _hasFill () {\n var fill = this.options.fill;\n return fill && !isTransparent(fill.color);\n };\n\n Element.prototype._hasStroke = function _hasStroke () {\n var stroke = this.options.stroke;\n return stroke && stroke.width > 0 && !isTransparent(stroke.color);\n };\n\n Element.prototype._clippedBBox = function _clippedBBox (transformation) {\n return this.bbox(transformation);\n };\n\n Object.defineProperties( Element.prototype, prototypeAccessors );\n\n return Element;\n }(HasObservers));\n\n function ellipseExtremeAngles(center, rx, ry, matrix) {\n var extremeX = 0;\n var extremeY = 0;\n\n if (matrix) {\n extremeX = Math.atan2(matrix.c * ry, matrix.a * rx);\n if (matrix.b !== 0) {\n extremeY = Math.atan2(matrix.d * ry, matrix.b * rx);\n }\n }\n\n return {\n x: extremeX,\n y: extremeY\n };\n }\n\n var PI_DIV_2 = Math.PI / 2;\n\n var Circle$2 = (function (superclass) {\n function Circle(center, radius) {\n if (center === void 0) { center = new Point(); }\n if (radius === void 0) { radius = 0; }\n\n superclass.call(this);\n\n this.setCenter(center);\n this.setRadius(radius);\n }\n\n extendStatic(Circle, superclass);\n Circle.prototype = Object.create( superclass && superclass.prototype );\n Circle.prototype.constructor = Circle;\n Circle.fn = Circle.prototype;\n Circle.fn.init = Circle.fn.constructor;\n\n Circle.prototype.setCenter = function setCenter (value) {\n this._observerField(\"center\", Point.create(value));\n this.geometryChange();\n return this;\n };\n\n Circle.prototype.getCenter = function getCenter () {\n return this.center;\n };\n\n Circle.prototype.equals = function equals (other) {\n return other &&\n other.center.equals(this.center) &&\n other.radius === this.radius;\n };\n\n Circle.prototype.clone = function clone () {\n return new Circle(this.center.clone(), this.radius);\n };\n\n Circle.prototype.pointAt = function pointAt (angle) {\n return this._pointAt(rad(angle));\n };\n\n Circle.prototype.bbox = function bbox (matrix) {\n var this$1$1 = this;\n\n var extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix);\n var minPoint = Point.maxPoint();\n var maxPoint = Point.minPoint();\n\n for (var i = 0; i < 4; i++) {\n var currentPointX = this$1$1._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\n var currentPointY = this$1$1._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix);\n var currentPoint = new Point(currentPointX.x, currentPointY.y);\n\n minPoint = Point.min(minPoint, currentPoint);\n maxPoint = Point.max(maxPoint, currentPoint);\n }\n\n return Rect.fromPoints(minPoint, maxPoint);\n };\n\n Circle.prototype._pointAt = function _pointAt (angle) {\n var ref = this;\n var center = ref.center;\n var radius = ref.radius;\n\n return new Point(\n center.x + radius * Math.cos(angle),\n center.y + radius * Math.sin(angle)\n );\n };\n\n Circle.prototype.containsPoint = function containsPoint (point) {\n var ref = this;\n var center = ref.center;\n var radius = ref.radius;\n var inCircle = Math.pow(point.x - center.x, 2) +\n Math.pow(point.y - center.y, 2) <= Math.pow(radius, 2);\n return inCircle;\n };\n\n Circle.prototype._isOnPath = function _isOnPath (point, width) {\n var ref = this;\n var center = ref.center;\n var radius = ref.radius;\n var pointDistance = center.distanceTo(point);\n\n return radius - width <= pointDistance && pointDistance <= radius + width;\n };\n\n return Circle;\n }(withAccessors(HasObservers, [ \"radius\" ])));\n\n var GRADIENT = \"Gradient\";\n\n var paintable = function (TBase) { return (\n (function (TBase) {\n function anonymous () {\n TBase.apply(this, arguments);\n }\n\n extendStatic(anonymous, TBase);\n anonymous.prototype = Object.create( TBase && TBase.prototype );\n anonymous.prototype.constructor = anonymous;\n anonymous.fn = anonymous.prototype;\n anonymous.fn.init = anonymous.fn.constructor;\n\n anonymous.prototype.fill = function fill (color, opacity) {\n var options = this.options;\n\n if (defined(color)) {\n if (color && color.nodeType !== GRADIENT) {\n var newFill = {\n color: color\n };\n if (defined(opacity)) {\n newFill.opacity = opacity;\n }\n options.set(\"fill\", newFill);\n } else {\n options.set(\"fill\", color);\n }\n\n return this;\n }\n\n return options.get(\"fill\");\n };\n\n anonymous.prototype.stroke = function stroke (color, width, opacity) {\n if (defined(color)) {\n this.options.set(\"stroke.color\", color);\n\n if (defined(width)) {\n this.options.set(\"stroke.width\", width);\n }\n\n if (defined(opacity)) {\n this.options.set(\"stroke.opacity\", opacity);\n }\n\n return this;\n }\n\n return this.options.get(\"stroke\");\n };\n\n return anonymous;\n }(TBase))\n ); };\n\n var IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\n\n var measurable = function (TBase) { return (\n (function (TBase) {\n function anonymous () {\n TBase.apply(this, arguments);\n }\n\n extendStatic(anonymous, TBase);\n anonymous.prototype = Object.create( TBase && TBase.prototype );\n anonymous.prototype.constructor = anonymous;\n anonymous.fn = anonymous.prototype;\n anonymous.fn.init = anonymous.fn.constructor;\n\n anonymous.prototype.bbox = function bbox (transformation) {\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\n var matrixHash = combinedMatrix ? combinedMatrix.toString() : IDENTITY_MATRIX_HASH;\n var bbox;\n\n if (this._bboxCache && this._matrixHash === matrixHash) {\n bbox = this._bboxCache.clone();\n } else {\n bbox = this._bbox(combinedMatrix);\n this._bboxCache = bbox ? bbox.clone() : null;\n this._matrixHash = matrixHash;\n }\n\n var strokeWidth = this.options.get(\"stroke.width\");\n if (strokeWidth && bbox) {\n bbox.expand(strokeWidth / 2);\n }\n\n return bbox;\n };\n\n anonymous.prototype.geometryChange = function geometryChange () {\n delete this._bboxCache;\n this.trigger(\"geometryChange\", {\n element: this\n });\n };\n\n return anonymous;\n }(TBase))\n ); };\n\n function geometryAccessor(name) {\n var fieldName = \"_\" + name;\n return function(value) {\n if (defined(value)) {\n this._observerField(fieldName, value);\n this.geometryChange();\n return this;\n }\n\n return this[fieldName];\n };\n }\n\n function defineGeometryAccessors(fn, names) {\n for (var i = 0; i < names.length; i++) {\n fn[names[i]] = geometryAccessor(names[i]);\n }\n }\n\n var withGeometry = function (TBase, names) {\n if (names === void 0) { names = [ \"geometry\" ]; }\n\n var result = (function (TBase) {\n function result () {\n TBase.apply(this, arguments);\n }extendStatic(result, TBase);\n result.prototype = Object.create( TBase && TBase.prototype );\n result.prototype.constructor = result;\n result.fn = result.prototype;\n result.fn.init = result.fn.constructor;\n\n return result;\n }(TBase));\n defineGeometryAccessors(result.prototype, names);\n\n return result;\n };\n\n var DEFAULT_STROKE = \"#000\";\n\n var Circle = (function (superclass) {\n function Circle(geometry, options) {\n if (geometry === void 0) { geometry = new Circle$2(); }\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.geometry(geometry);\n\n if (!defined(this.options.stroke)) {\n this.stroke(DEFAULT_STROKE);\n }\n }\n\n extendStatic(Circle, superclass);\n Circle.prototype = Object.create( superclass && superclass.prototype );\n Circle.prototype.constructor = Circle;\n Circle.fn = Circle.prototype;\n Circle.fn.init = Circle.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Circle\";\n };\n\n Circle.prototype.rawBBox = function rawBBox () {\n return this._geometry.bbox();\n };\n\n Circle.prototype._bbox = function _bbox (matrix) {\n return this._geometry.bbox(matrix);\n };\n\n Circle.prototype._containsPoint = function _containsPoint (point) {\n return this.geometry().containsPoint(point);\n };\n\n Circle.prototype._isOnPath = function _isOnPath (point) {\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n };\n\n Object.defineProperties( Circle.prototype, prototypeAccessors );\n\n return Circle;\n }(paintable(measurable(withGeometry(Element$1)))));\n\n var PRECISION = 10;\n\n function close$1(a, b, tolerance) {\n if (tolerance === void 0) { tolerance = PRECISION; }\n\n return round(Math.abs(a - b), tolerance) === 0;\n }\n\n function closeOrLess(a, b, tolerance) {\n return a < b || close$1(a, b, tolerance);\n }\n\n function lineIntersection(p0, p1, p2, p3) {\n var s1x = p1.x - p0.x;\n var s2x = p3.x - p2.x;\n var s1y = p1.y - p0.y;\n var s2y = p3.y - p2.y;\n var nx = p0.x - p2.x;\n var ny = p0.y - p2.y;\n var d = s1x * s2y - s2x * s1y;\n var s = (s1x * ny - s1y * nx) / d;\n var t = (s2x * ny - s2y * nx) / d;\n\n if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n return new Point(p0.x + t * s1x, p0.y + t * s1y);\n }\n }\n\n var MAX_INTERVAL = 45;\n var pow$1 = Math.pow;\n var accessors = [ \"radiusX\", \"radiusY\", \"startAngle\", \"endAngle\", \"anticlockwise\" ];\n\n var Arc$2 = (function (superclass) {\n function Arc(center, options) {\n if (center === void 0) { center = new Point(); }\n if (options === void 0) { options = {}; }\n\n superclass.call(this);\n\n this.setCenter(center);\n\n this.radiusX = options.radiusX;\n this.radiusY = options.radiusY || options.radiusX;\n this.startAngle = options.startAngle;\n this.endAngle = options.endAngle;\n this.anticlockwise = options.anticlockwise || false;\n this.xRotation = options.xRotation;\n }\n\n extendStatic(Arc, superclass);\n Arc.prototype = Object.create( superclass && superclass.prototype );\n Arc.prototype.constructor = Arc;\n Arc.fn = Arc.prototype;\n Arc.fn.init = Arc.fn.constructor;\n\n Arc.prototype.clone = function clone () {\n return new Arc(this.center, {\n radiusX: this.radiusX,\n radiusY: this.radiusY,\n startAngle: this.startAngle,\n endAngle: this.endAngle,\n anticlockwise: this.anticlockwise\n });\n };\n\n Arc.prototype.setCenter = function setCenter (value) {\n this._observerField(\"center\", Point.create(value));\n this.geometryChange();\n return this;\n };\n\n Arc.prototype.getCenter = function getCenter () {\n return this.center;\n };\n\n Arc.prototype.pointAt = function pointAt (angle) {\n var center = this.center;\n var radian = rad(angle);\n\n return new Point(\n center.x + this.radiusX * Math.cos(radian),\n center.y + this.radiusY * Math.sin(radian)\n );\n };\n\n Arc.prototype.curvePoints = function curvePoints () {\n var this$1$1 = this;\n\n var startAngle = this.startAngle;\n var dir = this.anticlockwise ? -1 : 1;\n var curvePoints = [ this.pointAt(startAngle) ];\n var interval = this._arcInterval();\n var intervalAngle = interval.endAngle - interval.startAngle;\n var subIntervalsCount = Math.ceil(intervalAngle / MAX_INTERVAL);\n var subIntervalAngle = intervalAngle / subIntervalsCount;\n var currentAngle = startAngle;\n var transformation;\n if (this.xRotation) {\n transformation = transform$1().rotate(this.xRotation, this.center);\n }\n\n for (var i = 1; i <= subIntervalsCount; i++) {\n var nextAngle = currentAngle + dir * subIntervalAngle;\n var points = this$1$1._intervalCurvePoints(currentAngle, nextAngle, transformation);\n\n curvePoints.push(points.cp1, points.cp2, points.p2);\n currentAngle = nextAngle;\n }\n\n return curvePoints;\n };\n\n Arc.prototype.bbox = function bbox (matrix) {\n var this$1$1 = this;\n\n var interval = this._arcInterval();\n var startAngle = interval.startAngle;\n var endAngle = interval.endAngle;\n var extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix);\n var extremeX = deg(extremeAngles.x);\n var extremeY = deg(extremeAngles.y);\n var endPoint = this.pointAt(endAngle).transformCopy(matrix);\n var currentAngleX = bboxStartAngle(extremeX, startAngle);\n var currentAngleY = bboxStartAngle(extremeY, startAngle);\n var currentPoint = this.pointAt(startAngle).transformCopy(matrix);\n var minPoint = Point.min(currentPoint, endPoint);\n var maxPoint = Point.max(currentPoint, endPoint);\n\n while (currentAngleX < endAngle || currentAngleY < endAngle) {\n var currentPointX = (void 0);\n if (currentAngleX < endAngle) {\n currentPointX = this$1$1.pointAt(currentAngleX).transformCopy(matrix);\n currentAngleX += 90;\n }\n\n var currentPointY = (void 0);\n if (currentAngleY < endAngle) {\n currentPointY = this$1$1.pointAt(currentAngleY).transformCopy(matrix);\n currentAngleY += 90;\n }\n\n currentPoint = new Point(currentPointX.x, currentPointY.y);\n minPoint = Point.min(minPoint, currentPoint);\n maxPoint = Point.max(maxPoint, currentPoint);\n }\n\n return Rect.fromPoints(minPoint, maxPoint);\n };\n\n Arc.prototype._arcInterval = function _arcInterval () {\n var ref = this;\n var startAngle = ref.startAngle;\n var endAngle = ref.endAngle;\n var anticlockwise = ref.anticlockwise;\n\n if (anticlockwise) {\n var oldStart = startAngle;\n startAngle = endAngle;\n endAngle = oldStart;\n }\n\n if (startAngle > endAngle || (anticlockwise && startAngle === endAngle)) {\n endAngle += 360;\n }\n\n return {\n startAngle: startAngle,\n endAngle: endAngle\n };\n };\n\n Arc.prototype._intervalCurvePoints = function _intervalCurvePoints (startAngle, endAngle, transformation) {\n var p1 = this.pointAt(startAngle);\n var p2 = this.pointAt(endAngle);\n var p1Derivative = this._derivativeAt(startAngle);\n var p2Derivative = this._derivativeAt(endAngle);\n var t = (rad(endAngle) - rad(startAngle)) / 3;\n var cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y);\n var cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y);\n if (transformation) {\n p1.transform(transformation);\n p2.transform(transformation);\n cp1.transform(transformation);\n cp2.transform(transformation);\n }\n\n return {\n p1: p1,\n cp1: cp1,\n cp2: cp2,\n p2: p2\n };\n };\n\n Arc.prototype._derivativeAt = function _derivativeAt (angle) {\n var radian = rad(angle);\n\n return new Point(-this.radiusX * Math.sin(radian), this.radiusY * Math.cos(radian));\n };\n\n Arc.prototype.containsPoint = function containsPoint (point) {\n var interval = this._arcInterval();\n var intervalAngle = interval.endAngle - interval.startAngle;\n var ref = this;\n var center = ref.center;\n var radiusX = ref.radiusX;\n var radiusY = ref.radiusY;\n var distance = center.distanceTo(point);\n var angleRad = Math.atan2(point.y - center.y, point.x - center.x);\n var pointRadius = (radiusX * radiusY) /\n Math.sqrt(pow$1(radiusX, 2) * pow$1(Math.sin(angleRad), 2) + pow$1(radiusY, 2) * pow$1(Math.cos(angleRad), 2));\n var startPoint = this.pointAt(this.startAngle).round(PRECISION);\n var endPoint = this.pointAt(this.endAngle).round(PRECISION);\n var intersection = lineIntersection(center, point.round(PRECISION), startPoint, endPoint);\n var containsPoint;\n\n if (intervalAngle < 180) {\n containsPoint = intersection && closeOrLess(center.distanceTo(intersection), distance) && closeOrLess(distance, pointRadius);\n } else {\n var angle = calculateAngle(center.x, center.y, radiusX, radiusY, point.x, point.y);\n if (angle !== 360) {\n angle = (360 + angle) % 360;\n }\n\n var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n containsPoint = (inAngleRange && closeOrLess(distance, pointRadius)) || (!inAngleRange && (!intersection || intersection.equals(point)));\n }\n return containsPoint;\n };\n\n Arc.prototype._isOnPath = function _isOnPath (point, width) {\n var interval = this._arcInterval();\n var center = this.center;\n var angle = calculateAngle(center.x, center.y, this.radiusX, this.radiusY, point.x, point.y);\n if (angle !== 360) {\n angle = (360 + angle) % 360;\n }\n\n var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n\n return inAngleRange && this.pointAt(angle).distanceTo(point) <= width;\n };\n\n Arc.fromPoints = function fromPoints (start, end, rx, ry, largeArc, swipe, rotation) {// eslint-disable-line max-params\n var arcParameters = normalizeArcParameters({\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n rx: rx,\n ry: ry,\n largeArc: largeArc,\n swipe: swipe,\n rotation: rotation\n });\n\n return new Arc(arcParameters.center, {\n startAngle: arcParameters.startAngle,\n endAngle: arcParameters.endAngle,\n radiusX: arcParameters.radiusX,\n radiusY: arcParameters.radiusY,\n xRotation: arcParameters.xRotation,\n anticlockwise: swipe === 0\n });\n };\n\n return Arc;\n }(withAccessors(HasObservers, accessors)));\n\n function calculateAngle(cx, cy, rx, ry, x, y) {\n var cos = round((x - cx) / rx, 3);\n var sin = round((y - cy) / ry, 3);\n\n return round(deg(Math.atan2(sin, cos)));\n }\n\n function normalizeArcParameters(parameters) {\n var x1 = parameters.x1;\n var y1 = parameters.y1;\n var x2 = parameters.x2;\n var y2 = parameters.y2;\n var rx = parameters.rx;\n var ry = parameters.ry;\n var largeArc = parameters.largeArc;\n var swipe = parameters.swipe;\n var rotation = parameters.rotation; if (rotation === void 0) { rotation = 0; }\n\n var radians = rad(rotation);\n var cosine = Math.cos(radians);\n var sine = Math.sin(radians);\n\n var xT = cosine * (x1 - x2) / 2 + sine * (y1 - y2) / 2;\n var yT = -sine * (x1 - x2) / 2 + cosine * (y1 - y2) / 2;\n\n var sign = largeArc !== swipe ? 1 : -1;\n\n var xt2 = Math.pow(xT, 2);\n var yt2 = Math.pow(yT, 2);\n var rx2 = Math.pow(rx, 2);\n var ry2 = Math.pow(ry, 2);\n\n var delta = xt2 / rx2 + yt2 / ry2;\n\n if (delta > 1) {\n delta = Math.sqrt(xt2 / rx2 + yt2 / ry2);\n rx = delta * rx;\n rx2 = Math.pow(rx, 2);\n\n ry = delta * ry;\n ry2 = Math.pow(ry, 2);\n }\n\n var constT = sign * Math.sqrt((rx2 * ry2 - rx2 * yt2 - ry2 * xt2) / (rx2 * yt2 + ry2 * xt2));\n // due to rounding errors the value could become NaN even after radii correction\n if (isNaN(constT)) {\n constT = 0;\n }\n\n var cxT = constT * (rx * yT) / ry;\n var cyT = - constT * (ry * xT) / rx;\n\n var cx = cosine * cxT - sine * cyT + (x1 + x2) / 2;\n var cy = sine * cxT + cosine * cyT + (y1 + y2) / 2;\n\n var uX = (xT - cxT) / rx;\n var uY = (yT - cyT) / ry;\n var vX = -(xT + cxT) / rx;\n var vY = -(yT + cyT) / ry;\n\n var startAngle = (uY >= 0 ? 1 : -1) * deg(Math.acos(uX / Math.sqrt(uX * uX + uY * uY)));\n\n var angleCosine = round((uX * vX + uY * vY) / (Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY)), 10);\n var angle = (uX * vY - uY * vX >= 0 ? 1 : -1) * deg(Math.acos(angleCosine));\n\n if (!swipe && angle > 0) {\n angle -= 360;\n }\n\n if (swipe && angle < 0) {\n angle += 360;\n }\n var endAngle = startAngle + angle;\n var signEndAngle = endAngle >= 0 ? 1 : -1;\n endAngle = (Math.abs(endAngle) % 360) * signEndAngle;\n\n return {\n center: new Point(cx, cy),\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: rx,\n radiusY: ry,\n xRotation: rotation\n };\n }\n\n function bboxStartAngle(angle, start) {\n var startAngle = angle;\n\n while (startAngle < start) {\n startAngle += 90;\n }\n\n return startAngle;\n }\n\n var push = [].push;\n var pop = [].pop;\n var splice = [].splice;\n var shift = [].shift;\n var slice = [].slice;\n var unshift = [].unshift;\n\n var ElementsArray = (function (HasObservers$$1) {\n function ElementsArray(array) {\n if (array === void 0) { array = []; }\n\n HasObservers$$1.call(this);\n\n this.length = 0;\n this._splice(0, array.length, array);\n }\n\n extendStatic(ElementsArray, HasObservers$$1);\n ElementsArray.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\n ElementsArray.prototype.constructor = ElementsArray;\n ElementsArray.fn = ElementsArray.prototype;\n ElementsArray.fn.init = ElementsArray.fn.constructor;\n\n ElementsArray.prototype.elements = function elements (value) {\n if (value) {\n this._splice(0, this.length, value);\n\n this._change();\n return this;\n }\n\n return this.slice(0);\n };\n\n ElementsArray.prototype.push = function push$1 () {\n var elements = arguments;\n var result = push.apply(this, elements);\n\n this._add(elements);\n\n return result;\n };\n\n ElementsArray.prototype.slice = function slice$1 () {\n return slice.call(this);\n };\n\n ElementsArray.prototype.pop = function pop$1 () {\n var length = this.length;\n var result = pop.apply(this);\n\n if (length) {\n this._remove([ result ]);\n }\n\n return result;\n };\n\n ElementsArray.prototype.splice = function splice$1 (index, howMany) {\n var elements = slice.call(arguments, 2);\n var result = this._splice(index, howMany, elements);\n\n this._change();\n\n return result;\n };\n\n ElementsArray.prototype.shift = function shift$1 () {\n var length = this.length;\n var result = shift.apply(this);\n\n if (length) {\n this._remove([ result ]);\n }\n\n return result;\n };\n\n ElementsArray.prototype.unshift = function unshift$1 () {\n var elements = arguments;\n var result = unshift.apply(this, elements);\n\n this._add(elements);\n\n return result;\n };\n\n ElementsArray.prototype.indexOf = function indexOf (element) {\n var this$1$1 = this;\n\n var length = this.length;\n\n for (var idx = 0; idx < length; idx++) {\n if (this$1$1[idx] === element) {\n return idx;\n }\n }\n return -1;\n };\n\n ElementsArray.prototype._splice = function _splice (index, howMany, elements) {\n var result = splice.apply(this, [ index, howMany ].concat(elements));\n\n this._clearObserver(result);\n this._setObserver(elements);\n\n return result;\n };\n\n ElementsArray.prototype._add = function _add (elements) {\n this._setObserver(elements);\n this._change();\n };\n\n ElementsArray.prototype._remove = function _remove (elements) {\n this._clearObserver(elements);\n this._change();\n };\n\n ElementsArray.prototype._setObserver = function _setObserver (elements) {\n var this$1$1 = this;\n\n for (var idx = 0; idx < elements.length; idx++) {\n elements[idx].addObserver(this$1$1);\n }\n };\n\n ElementsArray.prototype._clearObserver = function _clearObserver (elements) {\n var this$1$1 = this;\n\n for (var idx = 0; idx < elements.length; idx++) {\n elements[idx].removeObserver(this$1$1);\n }\n };\n\n ElementsArray.prototype._change = function _change () {};\n\n return ElementsArray;\n }(HasObservers));\n\n var GeometryElementsArray = (function (ElementsArray$$1) {\n function GeometryElementsArray () {\n ElementsArray$$1.apply(this, arguments);\n }\n\n extendStatic(GeometryElementsArray, ElementsArray$$1);\n GeometryElementsArray.prototype = Object.create( ElementsArray$$1 && ElementsArray$$1.prototype );\n GeometryElementsArray.prototype.constructor = GeometryElementsArray;\n GeometryElementsArray.fn = GeometryElementsArray.prototype;\n GeometryElementsArray.fn.init = GeometryElementsArray.fn.constructor;\n\n GeometryElementsArray.prototype._change = function _change () {\n this.geometryChange();\n };\n\n return GeometryElementsArray;\n }(ElementsArray));\n\n function isOutOfEndPoint(endPoint, controlPoint, point) {\n var angle = deg(Math.atan2(controlPoint.y - endPoint.y, controlPoint.x - endPoint.x));\n var rotatedPoint = point.transformCopy(transform$1().rotate(-angle, endPoint));\n\n return rotatedPoint.x < endPoint.x;\n }\n\n function calculateCurveAt(t, field, points) {\n var t1 = 1 - t;\n return Math.pow(t1, 3) * points[0][field] +\n 3 * Math.pow(t1, 2) * t * points[1][field] +\n 3 * Math.pow(t, 2) * t1 * points[2][field] +\n Math.pow(t, 3) * points[3][field];\n }\n\n function toCubicPolynomial(points, field) {\n return [ -points[0][field] + 3 * points[1][field] - 3 * points[2][field] + points[3][field],\n 3 * (points[0][field] - 2 * points[1][field] + points[2][field]),\n 3 * (-points[0][field] + points[1][field]),\n points[0][field]\n ];\n }\n\n var ComplexNumber = (function (Class$$1) {\n function ComplexNumber(real, img) {\n if (real === void 0) { real = 0; }\n if (img === void 0) { img = 0; }\n\n Class$$1.call(this);\n\n this.real = real;\n this.img = img;\n }\n\n extendStatic(ComplexNumber, Class$$1);\n ComplexNumber.prototype = Object.create( Class$$1 && Class$$1.prototype );\n ComplexNumber.prototype.constructor = ComplexNumber;\n ComplexNumber.fn = ComplexNumber.prototype;\n ComplexNumber.fn.init = ComplexNumber.fn.constructor;\n\n ComplexNumber.prototype.add = function add (cNumber) {\n return new ComplexNumber(round(this.real + cNumber.real, PRECISION), round(this.img + cNumber.img, PRECISION));\n };\n\n ComplexNumber.prototype.addConstant = function addConstant (value) {\n return new ComplexNumber(this.real + value, this.img);\n };\n\n ComplexNumber.prototype.negate = function negate () {\n return new ComplexNumber(-this.real, -this.img);\n };\n\n ComplexNumber.prototype.multiply = function multiply (cNumber) {\n return new ComplexNumber(this.real * cNumber.real - this.img * cNumber.img,\n this.real * cNumber.img + this.img * cNumber.real);\n };\n\n ComplexNumber.prototype.multiplyConstant = function multiplyConstant (value) {\n return new ComplexNumber(this.real * value, this.img * value);\n };\n\n ComplexNumber.prototype.nthRoot = function nthRoot (n) {\n var rad$$1 = Math.atan2(this.img, this.real);\n var r = Math.sqrt(Math.pow(this.img, 2) + Math.pow(this.real, 2));\n var nthR = Math.pow(r, 1 / n);\n\n return new ComplexNumber(nthR * Math.cos(rad$$1 / n), nthR * Math.sin(rad$$1 / n)); //Moivre's formula\n };\n\n ComplexNumber.prototype.equals = function equals (cNumber) {\n return this.real === cNumber.real && this.img === cNumber.img;\n };\n\n ComplexNumber.prototype.isReal = function isReal () {\n return this.img === 0;\n };\n\n return ComplexNumber;\n }(Class));\n\n function numberSign$1(x) {\n return x < 0 ? -1 : 1;\n }\n\n function solveQuadraticEquation(a, b, c) {\n var squareRoot = Math.sqrt(Math.pow(b, 2) - 4 * a * c);\n return [\n (-b + squareRoot) / (2 * a),\n (-b - squareRoot) / (2 * a)\n ];\n }\n\n //Cardano's formula\n function solveCubicEquation(a, b, c, d) {\n if (a === 0) {\n return solveQuadraticEquation(b, c, d);\n }\n\n var p = (3 * a * c - Math.pow(b, 2)) / (3 * Math.pow(a, 2));\n var q = (2 * Math.pow(b, 3) - 9 * a * b * c + 27 * Math.pow(a, 2) * d) / (27 * Math.pow(a, 3));\n var Q = Math.pow(p / 3, 3) + Math.pow(q / 2, 2);\n var i = new ComplexNumber(0,1);\n var b3a = -b / (3 * a);\n var x1, x2, y1, y2, y3, z1, z2;\n\n if (Q < 0) {\n x1 = new ComplexNumber(-q / 2, Math.sqrt(-Q)).nthRoot(3);\n x2 = new ComplexNumber(-q / 2, - Math.sqrt(-Q)).nthRoot(3);\n } else {\n x1 = -q / 2 + Math.sqrt(Q);\n x1 = new ComplexNumber(numberSign$1(x1) * Math.pow(Math.abs(x1), 1 / 3));\n x2 = -q / 2 - Math.sqrt(Q);\n x2 = new ComplexNumber(numberSign$1(x2) * Math.pow(Math.abs(x2), 1 / 3));\n }\n\n y1 = x1.add(x2);\n\n z1 = x1.add(x2).multiplyConstant(-1 / 2);\n z2 = x1.add(x2.negate()).multiplyConstant(Math.sqrt(3) / 2);\n\n y2 = z1.add(i.multiply(z2));\n y3 = z1.add(i.negate().multiply(z2));\n\n var result = [];\n\n if (y1.isReal()) {\n result.push(round(y1.real + b3a, PRECISION));\n }\n if (y2.isReal()) {\n result.push(round(y2.real + b3a, PRECISION));\n }\n if (y3.isReal()) {\n result.push(round(y3.real + b3a, PRECISION));\n }\n\n return result;\n }\n\n function hasRootsInRange(points, point, field, rootField, range) {\n var polynomial = toCubicPolynomial(points, rootField);\n var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point[rootField]);\n var intersection;\n\n for (var idx = 0; idx < roots.length; idx++) {\n if (0 <= roots[idx] && roots[idx] <= 1) {\n intersection = calculateCurveAt(roots[idx], field, points);\n if (Math.abs(intersection - point[field]) <= range) {\n return true;\n }\n }\n }\n }\n\n function curveIntersectionsCount(points, point, bbox) {\n var polynomial = toCubicPolynomial(points, \"x\");\n var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point.x);\n var rayIntersection, intersectsRay;\n var count = 0;\n for (var i = 0; i < roots.length; i++) {\n rayIntersection = calculateCurveAt(roots[i], \"y\", points);\n intersectsRay = close$1(rayIntersection, point.y) || rayIntersection > point.y;\n if (intersectsRay && (((roots[i] === 0 || roots[i] === 1) && bbox.bottomRight().x > point.x) || (0 < roots[i] && roots[i] < 1))) {\n count++;\n }\n }\n\n return count;\n }\n\n function lineIntersectionsCount(a, b, point) {\n var intersects;\n if (a.x !== b.x) {\n var minX = Math.min(a.x, b.x);\n var maxX = Math.max(a.x, b.x);\n var minY = Math.min(a.y, b.y);\n var maxY = Math.max(a.y, b.y);\n var inRange = minX <= point.x && point.x < maxX;\n\n if (minY === maxY) {\n intersects = point.y <= minY && inRange;\n } else {\n intersects = inRange && (((maxY - minY) * ((a.x - b.x) * (a.y - b.y) > 0 ? point.x - minX : maxX - point.x)) / (maxX - minX) + minY - point.y) >= 0;\n }\n }\n\n return intersects ? 1 : 0;\n }\n\n function pointAccessor(name) {\n var fieldName = \"_\" + name;\n return function(value) {\n if (defined(value)) {\n this._observerField(fieldName, Point.create(value));\n this.geometryChange();\n return this;\n }\n\n return this[fieldName];\n };\n }\n\n function definePointAccessors(fn, names) {\n for (var i = 0; i < names.length; i++) {\n fn[names[i]] = pointAccessor(names[i]);\n }\n }\n\n var withPoints = function (TBase, names) {\n var result = (function (TBase) {\n function result () {\n TBase.apply(this, arguments);\n }extendStatic(result, TBase);\n result.prototype = Object.create( TBase && TBase.prototype );\n result.prototype.constructor = result;\n result.fn = result.prototype;\n result.fn.init = result.fn.constructor;\n\n return result;\n }(TBase));\n definePointAccessors(result.prototype, names);\n\n return result;\n };\n\n var points = [ \"anchor\", \"controlIn\", \"controlOut\" ];\n\n var Segment = (function (superclass) {\n function Segment(anchor, controlIn, controlOut) {\n superclass.call(this);\n\n this.anchor(anchor || new Point());\n this.controlIn(controlIn);\n this.controlOut(controlOut);\n }\n\n extendStatic(Segment, superclass);\n Segment.prototype = Object.create( superclass && superclass.prototype );\n Segment.prototype.constructor = Segment;\n Segment.fn = Segment.prototype;\n Segment.fn.init = Segment.fn.constructor;\n\n Segment.prototype.bboxTo = function bboxTo (toSegment, matrix) {\n var segmentAnchor = this.anchor().transformCopy(matrix);\n var toSegmentAnchor = toSegment.anchor().transformCopy(matrix);\n var rect;\n\n if (this.controlOut() && toSegment.controlIn()) {\n rect = this._curveBoundingBox(\n segmentAnchor, this.controlOut().transformCopy(matrix),\n toSegment.controlIn().transformCopy(matrix), toSegmentAnchor\n );\n } else {\n rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor);\n }\n\n return rect;\n };\n\n Segment.prototype._lineBoundingBox = function _lineBoundingBox (p1, p2) {\n return Rect.fromPoints(p1, p2);\n };\n\n Segment.prototype._curveBoundingBox = function _curveBoundingBox (p1, cp1, cp2, p2) {\n var points = [ p1, cp1, cp2, p2 ];\n var extremesX = this._curveExtremesFor(points, \"x\");\n var extremesY = this._curveExtremesFor(points, \"y\");\n var xLimits = arrayLimits([ extremesX.min, extremesX.max, p1.x, p2.x ]);\n var yLimits = arrayLimits([ extremesY.min, extremesY.max, p1.y, p2.y ]);\n\n return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max));\n };\n\n Segment.prototype._curveExtremesFor = function _curveExtremesFor (points, field) {\n var extremes = this._curveExtremes(\n points[0][field], points[1][field],\n points[2][field], points[3][field]\n );\n\n return {\n min: calculateCurveAt(extremes.min, field, points),\n max: calculateCurveAt(extremes.max, field, points)\n };\n };\n\n Segment.prototype._curveExtremes = function _curveExtremes (x1, x2, x3, x4) {\n var a = x1 - 3 * x2 + 3 * x3 - x4;\n var b = - 2 * (x1 - 2 * x2 + x3);\n var c = x1 - x2;\n var sqrt = Math.sqrt(b * b - 4 * a * c);\n var t1 = 0;\n var t2 = 1;\n\n if (a === 0) {\n if (b !== 0) {\n t1 = t2 = -c / b;\n }\n } else if (!isNaN(sqrt)) {\n t1 = (- b + sqrt) / (2 * a);\n t2 = (- b - sqrt) / (2 * a);\n }\n\n var min = Math.max(Math.min(t1, t2), 0);\n if (min < 0 || min > 1) {\n min = 0;\n }\n\n var max = Math.min(Math.max(t1, t2), 1);\n if (max > 1 || max < 0) {\n max = 1;\n }\n\n return {\n min: min,\n max: max\n };\n };\n\n Segment.prototype._intersectionsTo = function _intersectionsTo (segment, point) {\n var intersectionsCount;\n if (this.controlOut() && segment.controlIn()) {\n intersectionsCount = curveIntersectionsCount([ this.anchor(), this.controlOut(), segment.controlIn(), segment.anchor() ], point, this.bboxTo(segment));\n } else {\n intersectionsCount = lineIntersectionsCount(this.anchor(), segment.anchor(), point);\n }\n return intersectionsCount;\n };\n\n Segment.prototype._isOnCurveTo = function _isOnCurveTo (segment, point, width, endSegment) {\n var bbox = this.bboxTo(segment).expand(width, width);\n if (bbox.containsPoint(point)) {\n var p1 = this.anchor();\n var p2 = this.controlOut();\n var p3 = segment.controlIn();\n var p4 = segment.anchor();\n\n if (endSegment === \"start\" && p1.distanceTo(point) <= width) {\n return !isOutOfEndPoint(p1, p2, point);\n } else if (endSegment === \"end\" && p4.distanceTo(point) <= width) {\n return !isOutOfEndPoint(p4, p3, point);\n }\n\n //the approach is not entirely correct but is close and the alternatives are solving a 6th degree polynomial or testing the segment points\n var points = [ p1, p2, p3, p4 ];\n if (hasRootsInRange(points, point, \"x\", \"y\", width) || hasRootsInRange(points, point, \"y\", \"x\", width)) {\n return true;\n }\n var rotation = transform$1().rotate(45, point);\n var rotatedPoints = [ p1.transformCopy(rotation), p2.transformCopy(rotation), p3.transformCopy(rotation), p4.transformCopy(rotation) ];\n return hasRootsInRange(rotatedPoints, point, \"x\", \"y\", width) || hasRootsInRange(rotatedPoints, point, \"y\", \"x\", width);\n }\n };\n\n Segment.prototype._isOnLineTo = function _isOnLineTo (segment, point, width) {\n var p1 = this.anchor();\n var p2 = segment.anchor();\n var angle = deg(Math.atan2(p2.y - p1.y, p2.x - p1.x));\n var rect = new Rect([ p1.x, p1.y - width / 2 ], [ p1.distanceTo(p2), width ]);\n return rect.containsPoint(point.transformCopy(transform$1().rotate(-angle, p1)));\n };\n\n Segment.prototype._isOnPathTo = function _isOnPathTo (segment, point, width, endSegment) {\n var isOnPath;\n if (this.controlOut() && segment.controlIn()) {\n isOnPath = this._isOnCurveTo(segment, point, width / 2, endSegment);\n } else {\n isOnPath = this._isOnLineTo(segment, point, width);\n }\n return isOnPath;\n };\n\n return Segment;\n }(withPoints(HasObservers, points)));\n\n function arrayLimits(arr) {\n var length = arr.length;\n var min = MAX_NUM;\n var max = MIN_NUM;\n\n for (var i = 0; i < length; i ++) {\n max = Math.max(max, arr[i]);\n min = Math.min(min, arr[i]);\n }\n\n return {\n min: min,\n max: max\n };\n }\n\n var geometry = {\n \tCircle: Circle$2,\n \tArc: Arc$2,\n \tRect: Rect,\n \tPoint: Point,\n \tSegment: Segment,\n \tMatrix: Matrix,\n \tSize: Size,\n \ttoMatrix: toMatrix,\n \tTransformation: Transformation,\n \ttransform: transform$1\n };\n\n var WEIGHT = 0.333;\n var EXTREMUM_ALLOWED_DEVIATION = 0.01;\n var X = \"x\";\n var Y = \"y\";\n\n function pointsToCurve(pointsIn, closed) {\n var points = pointsIn.slice(0);\n var segments = [];\n var length = points.length;\n\n if (length > 2) {\n removeDuplicates(0, points);\n length = points.length;\n }\n\n if (length < 2 || (length === 2 && points[0].equals(points[1]))) {\n return segments;\n }\n\n var p0 = points[0];\n var p1 = points[1];\n var p2 = points[2];\n\n segments.push(new Segment(p0));\n\n while (p0.equals(points[length - 1])) {\n closed = true;\n points.pop();\n length--;\n }\n\n if (length === 2) {\n var tangent = getTangent(p0,p1, X, Y);\n\n last(segments).controlOut(\n firstControlPoint(tangent, p0, p1, X, Y)\n );\n\n segments.push(new Segment(\n p1,\n secondControlPoint(tangent, p0, p1, X, Y)\n ));\n\n return segments;\n }\n\n var initialControlPoint, lastControlPoint;\n\n if (closed) {\n p0 = points[length - 1]; p1 = points[0]; p2 = points[1];\n var controlPoints = getControlPoints(p0, p1, p2);\n initialControlPoint = controlPoints[1];\n lastControlPoint = controlPoints[0];\n } else {\n var tangent$1 = getTangent(p0, p1, X,Y);\n initialControlPoint = firstControlPoint(tangent$1, p0, p1, X, Y);\n }\n\n var cp0 = initialControlPoint;\n for (var idx = 0; idx <= length - 3; idx++) {\n removeDuplicates(idx, points);\n length = points.length;\n if (idx + 3 <= length) {\n p0 = points[idx]; p1 = points[idx + 1]; p2 = points[idx + 2];\n var controlPoints$1 = getControlPoints(p0,p1,p2);\n\n last(segments).controlOut(cp0);\n cp0 = controlPoints$1[1];\n\n var cp1 = controlPoints$1[0];\n segments.push(new Segment(p1, cp1));\n }\n }\n\n if (closed) {\n p0 = points[length - 2]; p1 = points[length - 1]; p2 = points[0];\n var controlPoints$2 = getControlPoints(p0, p1, p2);\n\n last(segments).controlOut(cp0);\n segments.push(new Segment(\n p1,\n controlPoints$2[0]\n ));\n\n last(segments).controlOut(controlPoints$2[1]);\n segments.push(new Segment(\n p2,\n lastControlPoint\n ));\n } else {\n var tangent$2 = getTangent(p1, p2, X, Y);\n\n last(segments).controlOut(cp0);\n segments.push(new Segment(\n p2,\n secondControlPoint(tangent$2, p1, p2, X, Y)\n ));\n }\n\n return segments;\n }\n\n function removeDuplicates(idx, points) {\n while (points[idx + 1] && (points[idx].equals(points[idx + 1]) || points[idx + 1].equals(points[idx + 2]))) {\n points.splice(idx + 1, 1);\n }\n }\n\n function invertAxis(p0, p1, p2) {\n var invertAxis = false;\n\n if (p0.x === p1.x) {\n invertAxis = true;\n } else if (p1.x === p2.x) {\n if ((p1.y < p2.y && p0.y <= p1.y) || (p2.y < p1.y && p1.y <= p0.y)) {\n invertAxis = true;\n }\n } else {\n var fn = lineFunction(p0,p1);\n var y2 = calculateFunction(fn, p2.x);\n if (!(p0.y <= p1.y && p2.y <= y2) &&\n !(p1.y <= p0.y && p2.y >= y2)) {\n invertAxis = true;\n }\n }\n\n return invertAxis;\n }\n\n function isLine(p0, p1, p2) {\n var fn = lineFunction(p0, p1);\n var y2 = calculateFunction(fn, p2.x);\n\n return (p0.x === p1.x && p1.x === p2.x) || round(y2, 1) === round(p2.y, 1);\n }\n\n function lineFunction(p1, p2) {\n var a = (p2.y - p1.y) / (p2.x - p1.x);\n var b = p1.y - a * p1.x;\n\n return [ b, a ];\n }\n\n function getControlPoints(p0, p1, p2) {\n var xField = X;\n var yField = Y;\n var restrict = false;\n var switchOrientation = false;\n var tangent;\n\n if (isLine(p0, p1, p2)) {\n tangent = getTangent(p0, p1, X, Y);\n } else {\n var monotonic = {\n x: isMonotonicByField(p0, p1, p2, X),\n y: isMonotonicByField(p0, p1, p2, Y)\n };\n\n if (monotonic.x && monotonic.y) {\n tangent = getTangent(p0, p2, X, Y);\n restrict = true;\n } else {\n if (invertAxis(p0, p1, p2)) {\n xField = Y;\n yField = X;\n }\n\n if (monotonic[xField]) {\n tangent = 0;\n } else {\n var sign;\n if ((p2[yField] < p0[yField] && p0[yField] <= p1[yField]) ||\n (p0[yField] < p2[yField] && p1[yField] <= p0[yField])) {\n sign = numberSign((p2[yField] - p0[yField]) * (p1[xField] - p0[xField]));\n } else {\n sign = -numberSign((p2[xField] - p0[xField]) * (p1[yField] - p0[yField]));\n }\n\n tangent = EXTREMUM_ALLOWED_DEVIATION * sign;\n switchOrientation = true;\n }\n }\n }\n\n var secondCP = secondControlPoint(tangent, p0, p1, xField, yField);\n\n if (switchOrientation) {\n var oldXField = xField;\n xField = yField;\n yField = oldXField;\n }\n\n var firstCP = firstControlPoint(tangent, p1, p2, xField, yField);\n\n if (restrict) {\n restrictControlPoint(p0, p1, secondCP, tangent);\n restrictControlPoint(p1, p2, firstCP, tangent);\n }\n\n return [ secondCP, firstCP ];\n }\n\n function restrictControlPoint(p1, p2, cp, tangent) {\n if (p1.y < p2.y) {\n if (p2.y < cp.y) {\n cp.x = p1.x + (p2.y - p1.y) / tangent;\n cp.y = p2.y;\n } else if (cp.y < p1.y) {\n cp.x = p2.x - (p2.y - p1.y) / tangent;\n cp.y = p1.y;\n }\n } else {\n if (cp.y < p2.y) {\n cp.x = p1.x - (p1.y - p2.y) / tangent;\n cp.y = p2.y;\n } else if (p1.y < cp.y) {\n cp.x = p2.x + (p1.y - p2.y) / tangent;\n cp.y = p1.y;\n }\n }\n }\n\n function getTangent(p0, p1, xField, yField) {\n var x = p1[xField] - p0[xField];\n var y = p1[yField] - p0[yField];\n var tangent;\n\n if (x === 0) {\n tangent = 0;\n } else {\n tangent = y / x;\n }\n\n return tangent;\n }\n\n function isMonotonicByField(p0, p1, p2, field) {\n return (p2[field] > p1[field] && p1[field] > p0[field]) ||\n (p2[field] < p1[field] && p1[field] < p0[field]);\n }\n\n function firstControlPoint(tangent, p0, p3, xField, yField) {\n var t1 = p0[xField];\n var t2 = p3[xField];\n var distance = (t2 - t1) * WEIGHT;\n\n return point(t1 + distance, p0[yField] + distance * tangent, xField, yField);\n }\n\n function secondControlPoint(tangent, p0, p3, xField, yField) {\n var t1 = p0[xField];\n var t2 = p3[xField];\n var distance = (t2 - t1) * WEIGHT;\n\n return point(t2 - distance, p3[yField] - distance * tangent, xField, yField);\n }\n\n function point(xValue, yValue, xField, yField) {\n var controlPoint = new Point();\n controlPoint[xField] = xValue;\n controlPoint[yField] = yValue;\n\n return controlPoint;\n }\n\n function calculateFunction(fn, x) {\n var length = fn.length;\n var result = 0;\n\n for (var i = 0; i < length; i++) {\n result += Math.pow(x,i) * fn[i];\n }\n return result;\n }\n\n function numberSign(value) {\n return value <= 0 ? -1 : 1;\n }\n\n var ShapeMap = {\n l: function(path, options) {\n var parameters = options.parameters;\n var position = options.position;\n\n for (var i = 0; i < parameters.length; i += 2) {\n var point = new Point(parameters[i], parameters[i + 1]);\n\n if (options.isRelative) {\n point.translateWith(position);\n }\n\n path.lineTo(point.x, point.y);\n\n position.x = point.x;\n position.y = point.y;\n }\n },\n\n c: function(path, options) {\n var parameters = options.parameters;\n var position = options.position;\n\n for (var i = 0; i < parameters.length; i += 6) {\n var controlOut = new Point(parameters[i], parameters[i + 1]);\n var controlIn = new Point(parameters[i + 2], parameters[i + 3]);\n var point = new Point(parameters[i + 4], parameters[i + 5]);\n if (options.isRelative) {\n controlIn.translateWith(position);\n controlOut.translateWith(position);\n point.translateWith(position);\n }\n\n path.curveTo(controlOut, controlIn, point);\n\n position.x = point.x;\n position.y = point.y;\n }\n },\n\n v: function(path, options) {\n var value = options.isRelative ? 0 : options.position.x;\n\n toLineParamaters(options.parameters, true, value);\n this.l(path, options);\n },\n\n h: function(path, options) {\n var value = options.isRelative ? 0 : options.position.y;\n\n toLineParamaters(options.parameters, false, value);\n this.l(path, options);\n },\n\n a: function(path, options) {\n var parameters = options.parameters;\n var position = options.position;\n\n for (var i = 0; i < parameters.length; i += 7) {\n var radiusX = parameters[i];\n var radiusY = parameters[i + 1];\n var rotation = parameters[i + 2];\n var largeArc = parameters[i + 3];\n var swipe = parameters[i + 4];\n var endPoint = new Point(parameters[i + 5], parameters[i + 6]);\n\n if (options.isRelative) {\n endPoint.translateWith(position);\n }\n if (position.x !== endPoint.x || position.y !== endPoint.y) {\n path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe, rotation);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n }\n },\n\n s: function(path, options) {\n var parameters = options.parameters;\n var position = options.position;\n var previousCommand = options.previousCommand;\n var lastControlIn;\n\n if (previousCommand === \"s\" || previousCommand === \"c\") {\n lastControlIn = last(last(path.paths).segments).controlIn();\n }\n\n for (var i = 0; i < parameters.length; i += 4) {\n var controlIn = new Point(parameters[i], parameters[i + 1]);\n var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n var controlOut = (void 0);\n\n if (options.isRelative) {\n controlIn.translateWith(position);\n endPoint.translateWith(position);\n }\n\n if (lastControlIn) {\n controlOut = reflectionPoint(lastControlIn, position);\n } else {\n controlOut = position.clone();\n }\n\n lastControlIn = controlIn;\n\n path.curveTo(controlOut, controlIn, endPoint);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n },\n\n q: function(path, options) {\n var parameters = options.parameters;\n var position = options.position;\n\n for (var i = 0; i < parameters.length; i += 4) {\n var controlPoint = new Point(parameters[i], parameters[i + 1]);\n var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n\n if (options.isRelative) {\n controlPoint.translateWith(position);\n endPoint.translateWith(position);\n }\n\n var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n },\n\n t: function(path, options) {\n var parameters = options.parameters;\n var position = options.position;\n var previousCommand = options.previousCommand;\n var controlPoint;\n\n if (previousCommand === \"q\" || previousCommand === \"t\") {\n var lastSegment = last(last(path.paths).segments);\n controlPoint = lastSegment.controlIn().clone()\n .translateWith(position.scaleCopy(-1 / 3))\n .scale(3 / 2);\n }\n\n for (var i = 0; i < parameters.length; i += 2) {\n var endPoint = new Point(parameters[i], parameters[i + 1]);\n if (options.isRelative) {\n endPoint.translateWith(position);\n }\n\n if (controlPoint) {\n controlPoint = reflectionPoint(controlPoint, position);\n } else {\n controlPoint = position.clone();\n }\n\n var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n }\n };\n\n function toLineParamaters(parameters, isVertical, value) {\n var insertPosition = isVertical ? 0 : 1;\n\n for (var i = 0; i < parameters.length; i += 2) {\n parameters.splice(i + insertPosition, 0, value);\n }\n }\n\n function reflectionPoint(point, center) {\n if (point && center) {\n return center.scaleCopy(2).translate(-point.x, -point.y);\n }\n }\n\n var third = 1 / 3;\n\n function quadraticToCubicControlPoints(position, controlPoint, endPoint) {\n var scaledPoint = controlPoint.clone().scale(2 / 3);\n return {\n controlOut: scaledPoint.clone().translateWith(position.scaleCopy(third)),\n controlIn: scaledPoint.translateWith(endPoint.scaleCopy(third))\n };\n }\n\n var SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\n var SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\n var MOVE = \"m\";\n var CLOSE = \"z\";\n\n function parseParameters(str) {\n var parameters = [];\n str.replace(SPLIT_REGEX, function(match, number) {\n parameters.push(parseFloat(number));\n });\n return parameters;\n }\n\n function parsePath(pathInstance, str) {\n var position = new Point();\n var previousCommand;\n\n str.replace(SEGMENT_REGEX, function (match, element, params, closePath) {\n var command = element.toLowerCase();\n var isRelative = command === element;\n var parameters = parseParameters(params.trim());\n\n if (command === MOVE) {\n if (isRelative) {\n position.x += parameters[0];\n position.y += parameters[1];\n } else {\n position.x = parameters[0];\n position.y = parameters[1];\n }\n\n pathInstance.moveTo(position.x, position.y);\n\n if (parameters.length > 2) {\n command = \"l\";\n parameters.splice(0, 2);\n }\n }\n\n if (ShapeMap[command]) {\n ShapeMap[command](\n pathInstance, {\n parameters: parameters,\n position: position,\n isRelative: isRelative,\n previousCommand: previousCommand\n }\n );\n\n if (closePath && closePath.toLowerCase() === CLOSE) {\n pathInstance.close();\n }\n } else if (command !== MOVE) {\n throw new Error(\"Error while parsing SVG path. Unsupported command: \" + command);\n }\n\n previousCommand = command;\n });\n\n return pathInstance;\n }\n\n function elementsBoundingBox(elements, applyTransform, transformation) {\n var boundingBox;\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i];\n if (element.visible()) {\n var elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox();\n if (elementBoundingBox) {\n if (boundingBox) {\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\n } else {\n boundingBox = elementBoundingBox;\n }\n }\n }\n }\n\n return boundingBox;\n }\n\n function elementsClippedBoundingBox(elements, transformation) {\n var boundingBox;\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i];\n if (element.visible()) {\n var elementBoundingBox = element.clippedBBox(transformation);\n if (elementBoundingBox) {\n if (boundingBox) {\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\n } else {\n boundingBox = elementBoundingBox;\n }\n }\n }\n }\n\n return boundingBox;\n }\n\n var SPACE = ' ';\n var printPoints = function (precision) { return function () {\n var arguments$1 = arguments;\n\n var points = [], len = arguments.length;\n while ( len-- ) { points[ len ] = arguments$1[ len ]; }\n\n return points.map(function (p) { return p.toString(precision); }).join(SPACE);\n } };\n var segmentType = function (segmentStart, segmentEnd) { return segmentStart.controlOut() && segmentEnd.controlIn() ? 'C' : 'L'; };\n\n var Path = (function (superclass) {\n function Path(options) {\n superclass.call(this, options);\n this.segments = new GeometryElementsArray();\n this.segments.addObserver(this);\n\n if (!defined(this.options.stroke)) {\n this.stroke('#000');\n\n if (!defined(this.options.stroke.lineJoin)) {\n this.options.set('stroke.lineJoin', 'miter');\n }\n }\n }\n\n extendStatic(Path, superclass);\n Path.prototype = Object.create( superclass && superclass.prototype );\n Path.prototype.constructor = Path;\n Path.fn = Path.prototype;\n Path.fn.init = Path.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return 'Path';\n };\n\n Path.prototype.moveTo = function moveTo (x, y) {\n this.suspend();\n this.segments.elements([]);\n this.resume();\n\n this.lineTo(x, y);\n\n return this;\n };\n\n Path.prototype.lineTo = function lineTo (x, y) {\n var point$$1 = defined(y) ? new Point(x, y) : x;\n var segment = new Segment(point$$1);\n\n this.segments.push(segment);\n\n return this;\n };\n\n Path.prototype.curveTo = function curveTo (controlOut, controlIn, point$$1) {\n if (this.segments.length > 0) {\n var lastSegment = last(this.segments);\n var segment = new Segment(point$$1, controlIn);\n this.suspend();\n lastSegment.controlOut(controlOut);\n this.resume();\n\n this.segments.push(segment);\n }\n\n return this;\n };\n\n Path.prototype.arc = function arc (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n if (this.segments.length > 0) {\n var lastSegment = last(this.segments);\n var anchor = lastSegment.anchor();\n var start = rad(startAngle);\n var center = new Point(anchor.x - radiusX * Math.cos(start),\n anchor.y - radiusY * Math.sin(start));\n var arc = new Arc$2(center, {\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: radiusX,\n radiusY: radiusY,\n anticlockwise: anticlockwise\n });\n\n this._addArcSegments(arc);\n }\n\n return this;\n };\n\n Path.prototype.arcTo = function arcTo (end, rx, ry, largeArc, swipe, rotation) {\n if (this.segments.length > 0) {\n var lastSegment = last(this.segments);\n var anchor = lastSegment.anchor();\n var arc = Arc$2.fromPoints(anchor, Point.create(end), rx, ry, largeArc, swipe, rotation);\n\n this._addArcSegments(arc);\n }\n return this;\n };\n\n Path.prototype._addArcSegments = function _addArcSegments (arc) {\n var this$1$1 = this;\n\n this.suspend();\n\n var curvePoints = arc.curvePoints();\n\n for (var i = 1; i < curvePoints.length; i += 3) {\n this$1$1.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n }\n\n this.resume();\n this.geometryChange();\n };\n\n Path.prototype.close = function close () {\n this.options.closed = true;\n this.geometryChange();\n\n return this;\n };\n\n Path.prototype.rawBBox = function rawBBox () {\n return this._bbox();\n };\n\n Path.prototype.toString = function toString (digits) {\n var output = '';\n\n var segments = this.segments;\n var length = segments.length;\n if (length > 0) {\n var parts = [];\n var print = printPoints(digits);\n var currentType;\n\n for (var i = 1; i < length; i++) {\n var type = segmentType(segments[i - 1], segments[i]);\n if (type !== currentType) {\n currentType = type;\n parts.push(type);\n }\n\n if (type === 'L') {\n parts.push(print(segments[i].anchor()));\n } else {\n parts.push(print(\n segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor()\n ));\n }\n }\n\n output = 'M' + print(segments[0].anchor()) + SPACE + parts.join(SPACE);\n if (this.options.closed) {\n output += 'Z';\n }\n }\n\n return output;\n };\n\n Path.prototype._containsPoint = function _containsPoint (point$$1) {\n var segments = this.segments;\n var length = segments.length;\n var intersectionsCount = 0;\n var previous, current;\n\n for (var idx = 1; idx < length; idx++) {\n previous = segments[idx - 1];\n current = segments[idx];\n intersectionsCount += previous._intersectionsTo(current, point$$1);\n }\n\n if (this.options.closed || !segments[0].anchor().equals(segments[length - 1].anchor())) {\n intersectionsCount += lineIntersectionsCount(segments[0].anchor(), segments[length - 1].anchor(), point$$1);\n }\n\n return intersectionsCount % 2 !== 0;\n };\n\n Path.prototype._isOnPath = function _isOnPath (point$$1, width) {\n var segments = this.segments;\n var length = segments.length;\n var pathWidth = width || this.options.stroke.width;\n\n if (length > 1) {\n if (segments[0]._isOnPathTo(segments[1], point$$1, pathWidth, 'start')) {\n return true;\n }\n\n for (var idx = 2; idx <= length - 2; idx++) {\n if (segments[idx - 1]._isOnPathTo(segments[idx], point$$1, pathWidth)) {\n return true;\n }\n }\n\n if (segments[length - 2]._isOnPathTo(segments[length - 1], point$$1, pathWidth, 'end')) {\n return true;\n }\n }\n return false;\n };\n\n Path.prototype._bbox = function _bbox (matrix) {\n var segments = this.segments;\n var length = segments.length;\n var boundingBox;\n\n if (length === 1) {\n var anchor = segments[0].anchor().transformCopy(matrix);\n boundingBox = new Rect(anchor, Size.ZERO);\n } else if (length > 0) {\n for (var i = 1; i < length; i++) {\n var segmentBox = segments[i - 1].bboxTo(segments[i], matrix);\n if (boundingBox) {\n boundingBox = Rect.union(boundingBox, segmentBox);\n } else {\n boundingBox = segmentBox;\n }\n }\n }\n\n return boundingBox;\n };\n\n Path.parse = function parse (str, options) {\n return MultiPath.parse(str, options);\n };\n\n Path.fromRect = function fromRect (rect, options) {\n var path = new Path(options);\n var ref = rect.cornerRadius;\n var rx = ref[0];\n var ry = ref[1];\n\n if (rx === 0 && ry === 0) {\n path.moveTo(rect.topLeft())\n .lineTo(rect.topRight())\n .lineTo(rect.bottomRight())\n .lineTo(rect.bottomLeft())\n .close();\n } else {\n var origin = rect.origin;\n var x = origin.x;\n var y = origin.y;\n var width = rect.width();\n var height = rect.height();\n rx = limitValue(rx, 0, width / 2);\n ry = limitValue(ry, 0, height / 2);\n\n path.moveTo(x + rx, y)\n .lineTo(x + width - rx, y)\n .arcTo([ x + width, y + ry ], rx, ry, false)\n .lineTo(x + width, y + height - ry)\n .arcTo([ x + width - rx, y + height ], rx, ry, false)\n .lineTo(x + rx, y + height)\n .arcTo([ x, y + height - ry ], rx, ry, false)\n .lineTo(x, y + ry)\n .arcTo([ x + rx, y ], rx, ry, false);\n }\n\n return path;\n };\n\n Path.fromPoints = function fromPoints (points, options) {\n if (points) {\n var path = new Path(options);\n\n for (var i = 0; i < points.length; i++) {\n var point$$1 = Point.create(points[i]);\n if (point$$1) {\n if (i === 0) {\n path.moveTo(point$$1);\n } else {\n path.lineTo(point$$1);\n }\n }\n }\n\n return path;\n }\n };\n\n Path.curveFromPoints = function curveFromPoints (points, options) {\n if (points) {\n var segments = pointsToCurve(points);\n var path = new Path(options);\n path.segments.push.apply(path.segments, segments);\n\n return path;\n }\n };\n\n Path.fromArc = function fromArc (arc, options) {\n var path = new Path(options);\n var startAngle = arc.startAngle;\n var start = arc.pointAt(startAngle);\n path.moveTo(start.x, start.y);\n path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise);\n return path;\n };\n\n Object.defineProperties( Path.prototype, prototypeAccessors );\n\n return Path;\n }(paintable(measurable(Element$1))));\n\n var MultiPath = (function (superclass) {\n function MultiPath(options) {\n superclass.call(this, options);\n this.paths = new GeometryElementsArray();\n this.paths.addObserver(this);\n\n if (!defined(this.options.stroke)) {\n this.stroke('#000');\n }\n }\n\n extendStatic(MultiPath, superclass);\n MultiPath.prototype = Object.create( superclass && superclass.prototype );\n MultiPath.prototype.constructor = MultiPath;\n MultiPath.fn = MultiPath.prototype;\n MultiPath.fn.init = MultiPath.fn.constructor;\n\n var prototypeAccessors$1 = { nodeType: {} };\n\n MultiPath.parse = function parse (str, options) {\n var instance = new MultiPath(options);\n return parsePath(instance, str);\n };\n\n MultiPath.prototype.toString = function toString (digits) {\n var paths = this.paths;\n var output = '';\n\n if (paths.length > 0) {\n var result = [];\n\n for (var i = 0; i < paths.length; i++) {\n result.push(paths[i].toString(digits));\n }\n\n output = result.join(SPACE);\n }\n\n return output;\n };\n\n prototypeAccessors$1.nodeType.get = function () {\n return 'MultiPath';\n };\n\n MultiPath.prototype.moveTo = function moveTo (x, y) {\n var path = new Path();\n path.moveTo(x, y);\n\n this.paths.push(path);\n\n return this;\n };\n\n MultiPath.prototype.lineTo = function lineTo (x, y) {\n if (this.paths.length > 0) {\n last(this.paths).lineTo(x, y);\n }\n\n return this;\n };\n\n MultiPath.prototype.curveTo = function curveTo (controlOut, controlIn, point$$1) {\n if (this.paths.length > 0) {\n last(this.paths).curveTo(controlOut, controlIn, point$$1);\n }\n\n return this;\n };\n\n MultiPath.prototype.arc = function arc (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n if (this.paths.length > 0) {\n last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise);\n }\n\n return this;\n };\n\n MultiPath.prototype.arcTo = function arcTo (end, rx, ry, largeArc, swipe, rotation) {\n if (this.paths.length > 0) {\n last(this.paths).arcTo(end, rx, ry, largeArc, swipe, rotation);\n }\n\n return this;\n };\n\n MultiPath.prototype.close = function close () {\n if (this.paths.length > 0) {\n last(this.paths).close();\n }\n\n return this;\n };\n\n MultiPath.prototype._bbox = function _bbox (matrix) {\n return elementsBoundingBox(this.paths, true, matrix);\n };\n\n MultiPath.prototype.rawBBox = function rawBBox () {\n return elementsBoundingBox(this.paths, false);\n };\n\n MultiPath.prototype._containsPoint = function _containsPoint (point$$1) {\n var paths = this.paths;\n\n for (var idx = 0; idx < paths.length; idx++) {\n if (paths[idx]._containsPoint(point$$1)) {\n return true;\n }\n }\n return false;\n };\n\n MultiPath.prototype._isOnPath = function _isOnPath (point$$1) {\n var paths = this.paths;\n var width = this.options.stroke.width;\n\n for (var idx = 0; idx < paths.length; idx++) {\n if (paths[idx]._isOnPath(point$$1, width)) {\n return true;\n }\n }\n return false;\n };\n\n MultiPath.prototype._clippedBBox = function _clippedBBox (transformation) {\n return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation));\n };\n\n Object.defineProperties( MultiPath.prototype, prototypeAccessors$1 );\n\n return MultiPath;\n }(paintable(measurable(Element$1))));\n\n var DEFAULT_STROKE$1 = \"#000\";\n\n var Arc = (function (superclass) {\n function Arc(geometry, options) {\n if (geometry === void 0) { geometry = new Arc$2(); }\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.geometry(geometry);\n\n if (!defined(this.options.stroke)) {\n this.stroke(DEFAULT_STROKE$1);\n }\n }\n\n extendStatic(Arc, superclass);\n Arc.prototype = Object.create( superclass && superclass.prototype );\n Arc.prototype.constructor = Arc;\n Arc.fn = Arc.prototype;\n Arc.fn.init = Arc.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Arc\";\n };\n\n Arc.prototype._bbox = function _bbox (matrix) {\n return this._geometry.bbox(matrix);\n };\n\n Arc.prototype.rawBBox = function rawBBox () {\n return this.geometry().bbox();\n };\n\n Arc.prototype.toPath = function toPath () {\n var path = new Path();\n var curvePoints = this.geometry().curvePoints();\n\n if (curvePoints.length > 0) {\n path.moveTo(curvePoints[0].x, curvePoints[0].y);\n\n for (var i = 1; i < curvePoints.length; i += 3) {\n path.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n }\n }\n\n return path;\n };\n\n Arc.prototype._containsPoint = function _containsPoint (point) {\n return this.geometry().containsPoint(point);\n };\n\n Arc.prototype._isOnPath = function _isOnPath (point) {\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n };\n\n Object.defineProperties( Arc.prototype, prototypeAccessors );\n\n return Arc;\n }(paintable(measurable(withGeometry(Element$1)))));\n\n var DEFAULT_FONT = \"12px sans-serif\";\n var DEFAULT_FILL = \"#000\";\n\n var Text = (function (superclass) {\n function Text(content, position, options) {\n if (position === void 0) { position = new Point(); }\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.content(content);\n this.position(position);\n\n if (!this.options.font) {\n this.options.font = DEFAULT_FONT;\n }\n\n if (!defined(this.options.fill)) {\n this.fill(DEFAULT_FILL);\n }\n }\n\n extendStatic(Text, superclass);\n Text.prototype = Object.create( superclass && superclass.prototype );\n Text.prototype.constructor = Text;\n Text.fn = Text.prototype;\n Text.fn.init = Text.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Text\";\n };\n\n Text.prototype.content = function content (value) {\n if (defined(value)) {\n this.options.set(\"content\", value);\n return this;\n }\n\n return this.options.get(\"content\");\n };\n\n Text.prototype.measure = function measure () {\n var metrics = kendoUtil.measureText(this.content(), {\n font: this.options.get(\"font\")\n });\n\n return metrics;\n };\n\n Text.prototype.rect = function rect () {\n var size = this.measure();\n var pos = this.position().clone();\n return new Rect(pos, [ size.width, size.height ]);\n };\n\n Text.prototype.bbox = function bbox (transformation) {\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\n return this.rect().bbox(combinedMatrix);\n };\n\n Text.prototype.rawBBox = function rawBBox () {\n return this.rect().bbox();\n };\n\n Text.prototype._containsPoint = function _containsPoint (point) {\n return this.rect().containsPoint(point);\n };\n\n Object.defineProperties( Text.prototype, prototypeAccessors );\n\n return Text;\n }(paintable(withPoints(Element$1, [ \"position\" ]))));\n\n var Image$1 = (function (superclass) {\n function Image(src, rect, options) {\n if (rect === void 0) { rect = new Rect(); }\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.src(src);\n this.rect(rect);\n }\n\n extendStatic(Image, superclass);\n Image.prototype = Object.create( superclass && superclass.prototype );\n Image.prototype.constructor = Image;\n Image.fn = Image.prototype;\n Image.fn.init = Image.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Image\";\n };\n\n Image.prototype.src = function src (value) {\n if (defined(value)) {\n this.options.set(\"src\", value);\n return this;\n }\n\n return this.options.get(\"src\");\n };\n\n Image.prototype.bbox = function bbox (transformation) {\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\n return this._rect.bbox(combinedMatrix);\n };\n\n Image.prototype.rawBBox = function rawBBox () {\n return this._rect.bbox();\n };\n\n Image.prototype._containsPoint = function _containsPoint (point) {\n return this._rect.containsPoint(point);\n };\n\n Image.prototype._hasFill = function _hasFill () {\n return this.src();\n };\n\n Object.defineProperties( Image.prototype, prototypeAccessors );\n\n return Image;\n }(withGeometry(Element$1, [ \"rect\" ])));\n\n var traversable = function (TBase, childrenField) { return (\n (function (TBase) {\n function anonymous () {\n TBase.apply(this, arguments);\n }\n\n extendStatic(anonymous, TBase);\n anonymous.prototype = Object.create( TBase && TBase.prototype );\n anonymous.prototype.constructor = anonymous;\n anonymous.fn = anonymous.prototype;\n anonymous.fn.init = anonymous.fn.constructor;\n\n anonymous.prototype.traverse = function traverse (callback) {\n var children = this[childrenField];\n\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n\n if (child.traverse) {\n child.traverse(callback);\n } else {\n callback(child);\n }\n }\n\n return this;\n };\n\n return anonymous;\n }(TBase))\n ); };\n\n var Group = (function (superclass) {\n function Group(options) {\n superclass.call(this, options);\n this.children = [];\n }\n\n extendStatic(Group, superclass);\n Group.prototype = Object.create( superclass && superclass.prototype );\n Group.prototype.constructor = Group;\n Group.fn = Group.prototype;\n Group.fn.init = Group.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Group\";\n };\n\n Group.prototype.childrenChange = function childrenChange (action, items, index) {\n this.trigger(\"childrenChange\",{\n action: action,\n items: items,\n index: index\n });\n };\n\n Group.prototype.append = function append$1 () {\n append$1$1(this.children, arguments);\n this._reparent(arguments, this);\n\n this.childrenChange(\"add\", arguments);\n\n return this;\n };\n\n Group.prototype.insert = function insert (index, element) {\n this.children.splice(index, 0, element);\n element.parent = this;\n\n this.childrenChange(\"add\", [ element ], index);\n\n return this;\n };\n\n Group.prototype.insertAt = function insertAt (element, index) {\n return this.insert(index, element);\n };\n\n Group.prototype.remove = function remove (element) {\n var index = this.children.indexOf(element);\n if (index >= 0) {\n this.children.splice(index, 1);\n element.parent = null;\n this.childrenChange(\"remove\", [ element ], index);\n }\n\n return this;\n };\n\n Group.prototype.removeAt = function removeAt (index) {\n if (0 <= index && index < this.children.length) {\n var element = this.children[index];\n this.children.splice(index, 1);\n element.parent = null;\n this.childrenChange(\"remove\", [ element ], index);\n }\n\n return this;\n };\n\n Group.prototype.clear = function clear () {\n var items = this.children;\n this.children = [];\n this._reparent(items, null);\n\n this.childrenChange(\"remove\", items, 0);\n\n return this;\n };\n\n Group.prototype.bbox = function bbox (transformation) {\n return elementsBoundingBox(this.children, true, this.currentTransform(transformation));\n };\n\n Group.prototype.rawBBox = function rawBBox () {\n return elementsBoundingBox(this.children, false);\n };\n\n Group.prototype._clippedBBox = function _clippedBBox (transformation) {\n return elementsClippedBoundingBox(this.children, this.currentTransform(transformation));\n };\n\n Group.prototype.currentTransform = function currentTransform (transformation) {\n return Element$1.prototype.currentTransform.call(this, transformation) || null;\n };\n\n Group.prototype.containsPoint = function containsPoint (point, parentTransform) {\n if (this.visible()) {\n var children = this.children;\n var transform = this.currentTransform(parentTransform);\n for (var idx = 0; idx < children.length; idx++) {\n if (children[idx].containsPoint(point, transform)) {\n return true;\n }\n }\n }\n return false;\n };\n\n Group.prototype._reparent = function _reparent (elements, newParent) {\n var this$1$1 = this;\n\n for (var i = 0; i < elements.length; i++) {\n var child = elements[i];\n var parent = child.parent;\n if (parent && parent !== this$1$1 && parent.remove) {\n parent.remove(child);\n }\n\n child.parent = newParent;\n }\n };\n\n Object.defineProperties( Group.prototype, prototypeAccessors );\n\n return Group;\n }(traversable(Element$1, \"children\")));\n\n function translateToPoint(point, bbox, element) {\n var transofrm = element.transform() || transform$1();\n var matrix = transofrm.matrix();\n matrix.e += point.x - bbox.origin.x;\n matrix.f += point.y - bbox.origin.y;\n\n transofrm.matrix(matrix);\n element.transform(transofrm);\n }\n\n function alignStart(size, rect, align, axis, sizeField) {\n var start;\n if (align === \"start\") {\n start = rect.origin[axis];\n } else if (align === \"end\") {\n start = rect.origin[axis] + rect.size[sizeField] - size;\n } else {\n start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\n }\n\n return start;\n }\n\n function alignStartReverse(size, rect, align, axis, sizeField) {\n var start;\n if (align === \"start\") {\n start = rect.origin[axis] + rect.size[sizeField] - size;\n } else if (align === \"end\") {\n start = rect.origin[axis];\n } else {\n start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\n }\n\n return start;\n }\n\n var DEFAULT_OPTIONS = {\n alignContent: \"start\",\n justifyContent: \"start\",\n alignItems: \"start\",\n spacing: 0,\n orientation: \"horizontal\",\n lineSpacing: 0,\n wrap: true,\n revers: false\n };\n\n var forEach = function (elements, callback) {\n elements.forEach(callback);\n };\n\n var forEachReverse = function (elements, callback) {\n var length = elements.length;\n\n for (var idx = length - 1; idx >= 0; idx--) {\n callback(elements[idx], idx);\n }\n };\n\n var Layout = (function (Group$$1) {\n function Layout(rect, options) {\n Group$$1.call(this, $.extend({}, DEFAULT_OPTIONS, options));\n this._rect = rect;\n this._fieldMap = {};\n }\n\n extendStatic(Layout, Group$$1);\n Layout.prototype = Object.create( Group$$1 && Group$$1.prototype );\n Layout.prototype.constructor = Layout;\n Layout.fn = Layout.prototype;\n Layout.fn.init = Layout.fn.constructor;\n\n Layout.prototype.rect = function rect (value) {\n if (value) {\n this._rect = value;\n return this;\n }\n\n return this._rect;\n };\n\n Layout.prototype._initMap = function _initMap () {\n var options = this.options;\n var fieldMap = this._fieldMap;\n if (options.orientation === \"horizontal\") {\n fieldMap.sizeField = \"width\";\n fieldMap.groupsSizeField = \"height\";\n fieldMap.groupAxis = \"x\";\n fieldMap.groupsAxis = \"y\";\n } else {\n fieldMap.sizeField = \"height\";\n fieldMap.groupsSizeField = \"width\";\n fieldMap.groupAxis = \"y\";\n fieldMap.groupsAxis = \"x\";\n }\n\n if (options.reverse) {\n this.forEach = forEachReverse;\n this.justifyAlign = alignStartReverse;\n } else {\n this.forEach = forEach;\n this.justifyAlign = alignStart;\n }\n };\n\n Layout.prototype.reflow = function reflow () {\n var this$1$1 = this;\n\n if (!this._rect || this.children.length === 0) {\n return;\n }\n this._initMap();\n\n if (this.options.transform) {\n this.transform(null);\n }\n\n var options = this.options;\n var rect = this._rect;\n var ref = this._initGroups();\n var groups = ref.groups;\n var groupsSize = ref.groupsSize;\n var ref$1 = this._fieldMap;\n var sizeField = ref$1.sizeField;\n var groupsSizeField = ref$1.groupsSizeField;\n var groupAxis = ref$1.groupAxis;\n var groupsAxis = ref$1.groupsAxis;\n var groupOrigin = new Point();\n var elementOrigin = new Point();\n var size = new Size();\n var groupStart = alignStart(groupsSize, rect, options.alignContent, groupsAxis, groupsSizeField);\n var elementStart, group, groupBox;\n\n var arrangeElements = function (bbox, idx) {\n var element = group.elements[idx];\n\n elementOrigin[groupAxis] = elementStart;\n elementOrigin[groupsAxis] = alignStart(bbox.size[groupsSizeField], groupBox, options.alignItems, groupsAxis, groupsSizeField);\n translateToPoint(elementOrigin, bbox, element);\n elementStart += bbox.size[sizeField] + options.spacing;\n };\n\n for (var groupIdx = 0; groupIdx < groups.length; groupIdx++) {\n group = groups[groupIdx];\n groupOrigin[groupAxis] = elementStart = this$1$1.justifyAlign(group.size, rect, options.justifyContent, groupAxis, sizeField);\n groupOrigin[groupsAxis] = groupStart;\n size[sizeField] = group.size;\n size[groupsSizeField] = group.lineSize;\n groupBox = new Rect(groupOrigin, size);\n this$1$1.forEach(group.bboxes, arrangeElements);\n\n groupStart += group.lineSize + options.lineSpacing;\n }\n\n if (!options.wrap && group.size > rect.size[sizeField]) {\n var scale = rect.size[sizeField] / groupBox.size[sizeField];\n var scaledStart = groupBox.topLeft().scale(scale, scale);\n var scaledSize = groupBox.size[groupsSizeField] * scale;\n var newStart = alignStart(scaledSize, rect, options.alignContent, groupsAxis, groupsSizeField);\n var transform = transform$1();\n if (groupAxis === \"x\") {\n transform.translate(rect.origin.x - scaledStart.x, newStart - scaledStart.y);\n } else {\n transform.translate(newStart - scaledStart.x, rect.origin.y - scaledStart.y);\n }\n transform.scale(scale, scale);\n\n this.transform(transform);\n }\n };\n\n Layout.prototype._initGroups = function _initGroups () {\n var this$1$1 = this;\n\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var lineSpacing = options.lineSpacing;\n var wrap = options.wrap;\n var spacing = options.spacing;\n var sizeField = this._fieldMap.sizeField;\n var group = this._newGroup();\n var groups = [];\n var addGroup = function() {\n groups.push(group);\n groupsSize += group.lineSize + lineSpacing;\n };\n var groupsSize = -lineSpacing;\n\n for (var idx = 0; idx < children.length; idx++) {\n var element = children[idx];\n var bbox = children[idx].clippedBBox();\n if (element.visible() && bbox) {\n if (wrap && group.size + bbox.size[sizeField] + spacing > this$1$1._rect.size[sizeField]) {\n if (group.bboxes.length === 0) {\n this$1$1._addToGroup(group, bbox, element);\n addGroup();\n group = this$1$1._newGroup();\n } else {\n addGroup();\n group = this$1$1._newGroup();\n this$1$1._addToGroup(group, bbox, element);\n }\n } else {\n this$1$1._addToGroup(group, bbox, element);\n }\n }\n }\n\n if (group.bboxes.length) {\n addGroup();\n }\n\n return {\n groups: groups,\n groupsSize: groupsSize\n };\n };\n\n Layout.prototype._addToGroup = function _addToGroup (group, bbox, element) {\n group.size += bbox.size[this._fieldMap.sizeField] + this.options.spacing;\n group.lineSize = Math.max(bbox.size[this._fieldMap.groupsSizeField], group.lineSize);\n group.bboxes.push(bbox);\n group.elements.push(element);\n };\n\n Layout.prototype._newGroup = function _newGroup () {\n return {\n lineSize: 0,\n size: -this.options.spacing,\n bboxes: [],\n elements: []\n };\n };\n\n return Layout;\n }(Group));\n\n var Rect$2 = (function (superclass) {\n function Rect$$1(geometry, options) {\n if (geometry === void 0) { geometry = new Rect(); }\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.geometry(geometry);\n\n if (!defined(this.options.stroke)) {\n this.stroke(\"#000\");\n }\n }\n\n extendStatic(Rect$$1, superclass);\n Rect$$1.prototype = Object.create( superclass && superclass.prototype );\n Rect$$1.prototype.constructor = Rect$$1;\n Rect$$1.fn = Rect$$1.prototype;\n Rect$$1.fn.init = Rect$$1.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Rect\";\n };\n\n Rect$$1.prototype._bbox = function _bbox (matrix) {\n return this._geometry.bbox(matrix);\n };\n\n Rect$$1.prototype.rawBBox = function rawBBox () {\n return this._geometry.bbox();\n };\n\n Rect$$1.prototype._containsPoint = function _containsPoint (point) {\n return this._geometry.containsPoint(point);\n };\n\n Rect$$1.prototype._isOnPath = function _isOnPath (point) {\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n };\n\n Object.defineProperties( Rect$$1.prototype, prototypeAccessors );\n\n return Rect$$1;\n }(paintable(measurable(withGeometry(Element$1)))));\n\n function alignElements(elements, rect, alignment, axis, sizeField) {\n for (var idx = 0; idx < elements.length; idx++) {\n var bbox = elements[idx].clippedBBox();\n if (bbox) {\n var point = bbox.origin.clone();\n point[axis] = alignStart(bbox.size[sizeField], rect, alignment || \"start\", axis, sizeField);\n translateToPoint(point, bbox, elements[idx]);\n }\n }\n }\n\n function align(elements, rect, alignment) {\n alignElements(elements, rect, alignment, \"x\", \"width\");\n }\n\n function vAlign(elements, rect, alignment) {\n alignElements(elements, rect, alignment, \"y\", \"height\");\n }\n\n function stackElements(elements, stackAxis, otherAxis, sizeField) {\n if (elements.length > 1) {\n var origin = new Point();\n var previousBBox = elements[0].bbox;\n\n for (var idx = 1; idx < elements.length; idx++) {\n var element = elements[idx].element;\n var bbox = elements[idx].bbox;\n origin[stackAxis] = previousBBox.origin[stackAxis] + previousBBox.size[sizeField];\n origin[otherAxis] = bbox.origin[otherAxis];\n translateToPoint(origin, bbox, element);\n bbox.origin[stackAxis] = origin[stackAxis];\n previousBBox = bbox;\n }\n }\n }\n\n function createStackElements(elements) {\n var stackElements = [];\n\n for (var idx = 0; idx < elements.length; idx++) {\n var element = elements[idx];\n var bbox = element.clippedBBox();\n if (bbox) {\n stackElements.push({\n element: element,\n bbox: bbox\n });\n }\n }\n\n return stackElements;\n }\n\n function stack(elements) {\n stackElements(createStackElements(elements), \"x\", \"y\", \"width\");\n }\n\n function vStack(elements) {\n stackElements(createStackElements(elements), \"y\", \"x\", \"height\");\n }\n\n function getStacks(elements, rect, sizeField) {\n var maxSize = rect.size[sizeField];\n var stacks = [];\n var stack = [];\n var stackSize = 0;\n var element, bbox;\n\n var addElementToStack = function() {\n stack.push({\n element: element,\n bbox: bbox\n });\n };\n\n for (var idx = 0; idx < elements.length; idx++) {\n element = elements[idx];\n\n bbox = element.clippedBBox();\n if (bbox) {\n var size = bbox.size[sizeField];\n if (stackSize + size > maxSize) {\n if (stack.length) {\n stacks.push(stack);\n stack = [];\n addElementToStack();\n stackSize = size;\n } else {\n addElementToStack();\n stacks.push(stack);\n stack = [];\n stackSize = 0;\n }\n } else {\n addElementToStack();\n stackSize += size;\n }\n }\n }\n\n if (stack.length) {\n stacks.push(stack);\n }\n\n return stacks;\n }\n\n function wrapElements(elements, rect, axis, otherAxis, sizeField) {\n var stacks = getStacks(elements, rect, sizeField);\n var origin = rect.origin.clone();\n var result = [];\n\n for (var idx = 0; idx < stacks.length; idx++) {\n var stack = stacks[idx];\n var startElement = stack[0];\n origin[otherAxis] = startElement.bbox.origin[otherAxis];\n translateToPoint(origin, startElement.bbox, startElement.element);\n startElement.bbox.origin[axis] = origin[axis];\n stackElements(stack, axis, otherAxis, sizeField);\n result.push([]);\n for (var elementIdx = 0; elementIdx < stack.length; elementIdx++) {\n result[idx].push(stack[elementIdx].element);\n }\n }\n return result;\n }\n\n function wrap(elements, rect) {\n return wrapElements(elements, rect, \"x\", \"y\", \"width\");\n }\n\n function vWrap(elements, rect) {\n return wrapElements(elements, rect, \"y\", \"x\", \"height\");\n }\n\n function fit(element, rect) {\n var bbox = element.clippedBBox();\n if (bbox) {\n var elementSize = bbox.size;\n var rectSize = rect.size;\n if (rectSize.width < elementSize.width || rectSize.height < elementSize.height) {\n var scale = Math.min(rectSize.width / elementSize.width, rectSize.height / elementSize.height);\n var transform = element.transform() || transform$1();\n transform.scale(scale, scale);\n element.transform(transform);\n }\n }\n }\n\n var StopsArray = (function (ElementsArray$$1) {\n function StopsArray () {\n ElementsArray$$1.apply(this, arguments);\n }\n\n extendStatic(StopsArray, ElementsArray$$1);\n StopsArray.prototype = Object.create( ElementsArray$$1 && ElementsArray$$1.prototype );\n StopsArray.prototype.constructor = StopsArray;\n StopsArray.fn = StopsArray.prototype;\n StopsArray.fn.init = StopsArray.fn.constructor;\n\n StopsArray.prototype._change = function _change () {\n this.optionsChange({\n field: \"stops\"\n });\n };\n\n return StopsArray;\n }(ElementsArray));\n\n function optionsAccessor(name) {\n return function(value) {\n if (defined(value)) {\n this.options.set(name, value);\n return this;\n }\n\n return this.options.get(name);\n };\n }\n\n function defineOptionsAccessors(fn, names) {\n for (var i = 0; i < names.length; i++) {\n fn[names[i]] = optionsAccessor(names[i]);\n }\n }\n\n var withOptions = function (TBase, names) {\n var result = (function (TBase) {\n function result () {\n TBase.apply(this, arguments);\n }extendStatic(result, TBase);\n result.prototype = Object.create( TBase && TBase.prototype );\n result.prototype.constructor = result;\n result.fn = result.prototype;\n result.fn.init = result.fn.constructor;\n\n return result;\n }(TBase));\n defineOptionsAccessors(result.prototype, names);\n\n return result;\n };\n\n var options = [ \"offset\", \"color\", \"opacity\" ];\n\n var GradientStop = (function (superclass) {\n function GradientStop(offset, color, opacity) {\n superclass.call(this);\n\n this.options = new OptionsStore({\n offset: offset,\n color: color,\n opacity: defined(opacity) ? opacity : 1\n });\n\n this.options.addObserver(this);\n }\n\n extendStatic(GradientStop, superclass);\n GradientStop.prototype = Object.create( superclass && superclass.prototype );\n GradientStop.prototype.constructor = GradientStop;\n GradientStop.fn = GradientStop.prototype;\n GradientStop.fn.init = GradientStop.fn.constructor;\n\n GradientStop.create = function create (arg) {\n if (defined(arg)) {\n var stop;\n if (arg instanceof GradientStop) {\n stop = arg;\n } else if (arg.length > 1) {\n stop = new GradientStop(arg[0], arg[1], arg[2]);\n } else {\n stop = new GradientStop(arg.offset, arg.color, arg.opacity);\n }\n\n return stop;\n }\n };\n\n return GradientStop;\n }(withOptions(HasObservers, options)));\n\n var Gradient = (function (HasObservers$$1) {\n function Gradient(options) {\n if (options === void 0) { options = {}; }\n\n HasObservers$$1.call(this);\n\n this.stops = new StopsArray(this._createStops(options.stops));\n this.stops.addObserver(this);\n this._userSpace = options.userSpace;\n this.id = definitionId();\n }\n\n extendStatic(Gradient, HasObservers$$1);\n Gradient.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\n Gradient.prototype.constructor = Gradient;\n Gradient.fn = Gradient.prototype;\n Gradient.fn.init = Gradient.fn.constructor;\n\n var prototypeAccessors = { nodeType: {} };\n\n prototypeAccessors.nodeType.get = function () {\n return \"Gradient\";\n };\n\n Gradient.prototype.userSpace = function userSpace (value) {\n if (defined(value)) {\n this._userSpace = value;\n this.optionsChange();\n return this;\n }\n\n return this._userSpace;\n };\n\n Gradient.prototype._createStops = function _createStops (stops) {\n if (stops === void 0) { stops = []; }\n\n var result = [];\n for (var idx = 0; idx < stops.length; idx++) {\n result.push(GradientStop.create(stops[idx]));\n }\n\n return result;\n };\n\n Gradient.prototype.addStop = function addStop (offset, color, opacity) {\n this.stops.push(new GradientStop(offset, color, opacity));\n };\n\n Gradient.prototype.removeStop = function removeStop (stop) {\n var index = this.stops.indexOf(stop);\n if (index >= 0) {\n this.stops.splice(index, 1);\n }\n };\n\n Gradient.prototype.optionsChange = function optionsChange (e) {\n this.trigger(\"optionsChange\", {\n field: \"gradient\" + (e ? \".\" + e.field : \"\"),\n value: this\n });\n };\n\n Gradient.prototype.geometryChange = function geometryChange () {\n this.optionsChange();\n };\n\n Object.defineProperties( Gradient.prototype, prototypeAccessors );\n\n return Gradient;\n }(HasObservers));\n\n var points$1 = [ \"start\", \"end\" ];\n\n var LinearGradient = (function (superclass) {\n function LinearGradient(options) {\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.start(options.start || new Point());\n this.end(options.end || new Point(1, 0));\n }\n\n extendStatic(LinearGradient, superclass);\n LinearGradient.prototype = Object.create( superclass && superclass.prototype );\n LinearGradient.prototype.constructor = LinearGradient;\n LinearGradient.fn = LinearGradient.prototype;\n LinearGradient.fn.init = LinearGradient.fn.constructor;\n\n return LinearGradient;\n }(withPoints(Gradient, points$1)));\n\n var RadialGradient = (function (superclass) {\n function RadialGradient(options) {\n if (options === void 0) { options = {}; }\n\n superclass.call(this, options);\n\n this.center(options.center || new Point());\n this._radius = defined(options.radius) ? options.radius : 1;\n this._fallbackFill = options.fallbackFill;\n }\n\n extendStatic(RadialGradient, superclass);\n RadialGradient.prototype = Object.create( superclass && superclass.prototype );\n RadialGradient.prototype.constructor = RadialGradient;\n RadialGradient.fn = RadialGradient.prototype;\n RadialGradient.fn.init = RadialGradient.fn.constructor;\n\n RadialGradient.prototype.radius = function radius (value) {\n if (defined(value)) {\n this._radius = value;\n this.geometryChange();\n return this;\n }\n\n return this._radius;\n };\n\n RadialGradient.prototype.fallbackFill = function fallbackFill (value) {\n if (defined(value)) {\n this._fallbackFill = value;\n this.optionsChange();\n return this;\n }\n\n return this._fallbackFill;\n };\n\n return RadialGradient;\n }(withPoints(Gradient, [ \"center\" ])));\n\n function swing(position) {\n return 0.5 - Math.cos(position * Math.PI) / 2;\n }\n\n function linear(position) {\n return position;\n }\n\n function easeOutElastic(position, time, start, diff) {\n var s = 1.70158,\n p = 0,\n a = diff;\n\n if (position === 0) {\n return start;\n }\n\n if (position === 1) {\n return start + diff;\n }\n\n if (!p) {\n p = 0.5;\n }\n\n if (a < Math.abs(diff)) {\n a = diff;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(diff / a);\n }\n\n return a * Math.pow(2, -10 * position) *\n Math.sin((Number(position) - s) * (1.1 * Math.PI) / p) + diff + start;\n }\n\n var easingFunctions = {\n \tswing: swing,\n \tlinear: linear,\n \teaseOutElastic: easeOutElastic\n };\n\n var instance;\n\n var AnimationFactory = (function (Class$$1) {\n function AnimationFactory() {\n Class$$1.call(this);\n\n this._items = [];\n }\n\n extendStatic(AnimationFactory, Class$$1);\n AnimationFactory.prototype = Object.create( Class$$1 && Class$$1.prototype );\n AnimationFactory.prototype.constructor = AnimationFactory;\n AnimationFactory.fn = AnimationFactory.prototype;\n AnimationFactory.fn.init = AnimationFactory.fn.constructor;\n\n var staticAccessors = { current: {} };\n\n staticAccessors.current.get = function () {\n if (!instance) {\n instance = new AnimationFactory();\n }\n\n return instance;\n };\n\n AnimationFactory.prototype.register = function register (name, type) {\n this._items.push({\n name: name,\n type: type\n });\n };\n\n AnimationFactory.prototype.create = function create (element, options) {\n var items = this._items;\n var match;\n\n if (options && options.type) {\n var type = options.type.toLowerCase();\n for (var i = 0; i < items.length; i++) {\n if (items[i].name.toLowerCase() === type) {\n match = items[i];\n break;\n }\n }\n }\n\n if (match) {\n return new match.type(element, options);\n }\n };\n\n Object.defineProperties( AnimationFactory, staticAccessors );\n\n return AnimationFactory;\n }(Class));\n\n var Animation = (function (Class$$1) {\n function Animation(element, options) {\n Class$$1.call(this);\n\n this.options = $.extend({}, this.options, options);\n this.element = element;\n }\n\n extendStatic(Animation, Class$$1);\n Animation.prototype = Object.create( Class$$1 && Class$$1.prototype );\n Animation.prototype.constructor = Animation;\n Animation.fn = Animation.prototype;\n Animation.fn.init = Animation.fn.constructor;\n\n var prototypeAccessors = { options: {} };\n\n Animation.create = function create (type, element, options) {\n return AnimationFactory.current.create(type, element, options);\n };\n\n prototypeAccessors.options.get = function () {\n return this._options || {\n duration: 500,\n easing: \"swing\"\n };\n };\n\n prototypeAccessors.options.set = function (value) {\n this._options = value;\n };\n\n Animation.prototype.setup = function setup () {};\n Animation.prototype.step = function step () {};\n\n Animation.prototype.play = function play () {\n var this$1$1 = this;\n\n var options = this.options;\n var duration = options.duration;\n var delay = options.delay; if (delay === void 0) { delay = 0; }\n var easing = easingFunctions[options.easing];\n var start = now() + delay;\n var finish = start + duration;\n\n if (duration === 0) {\n this.step(1);\n this.abort();\n } else {\n setTimeout(function () {\n var loop = function () {\n if (this$1$1._stopped) {\n return;\n }\n\n var wallTime = now();\n\n var time = limitValue(wallTime - start, 0, duration);\n var position = time / duration;\n var easingPosition = easing(position, time, 0, 1, duration);\n\n this$1$1.step(easingPosition);\n\n if (wallTime < finish) {\n kendo.animationFrame(loop);\n } else {\n this$1$1.abort();\n }\n };\n\n loop();\n }, delay);\n }\n };\n\n Animation.prototype.abort = function abort () {\n this._stopped = true;\n };\n\n Animation.prototype.destroy = function destroy () {\n this.abort();\n };\n\n Object.defineProperties( Animation.prototype, prototypeAccessors );\n\n return Animation;\n }(Class));\n\n var instance$1;\n\n var PathParser = (function (Class$$1) {\n function PathParser () {\n Class$$1.apply(this, arguments);\n }\n\n extendStatic(PathParser, Class$$1);\n PathParser.prototype = Object.create( Class$$1 && Class$$1.prototype );\n PathParser.prototype.constructor = PathParser;\n PathParser.fn = PathParser.prototype;\n PathParser.fn.init = PathParser.fn.constructor;\n\n var staticAccessors = { current: {} };\n\n staticAccessors.current.get = function () {\n if (!instance$1) {\n instance$1 = new PathParser();\n }\n\n return instance$1;\n };\n\n PathParser.prototype.parse = function parse (str, options) {\n var multiPath = new MultiPath(options);\n return parsePath(multiPath, str);\n };\n\n Object.defineProperties( PathParser, staticAccessors );\n\n return PathParser;\n }(Class));\n\n var BaseNode = (function (Class$$1) {\n function BaseNode(srcElement) {\n Class$$1.call(this);\n\n this.childNodes = [];\n this.parent = null;\n\n if (srcElement) {\n this.srcElement = srcElement;\n this.observe();\n }\n }\n\n extendStatic(BaseNode, Class$$1);\n BaseNode.prototype = Object.create( Class$$1 && Class$$1.prototype );\n BaseNode.prototype.constructor = BaseNode;\n BaseNode.fn = BaseNode.prototype;\n BaseNode.fn.init = BaseNode.fn.constructor;\n\n BaseNode.prototype.destroy = function destroy () {\n var this$1$1 = this;\n\n if (this.srcElement) {\n this.srcElement.removeObserver(this);\n }\n\n var children = this.childNodes;\n for (var i = 0; i < children.length; i++) {\n this$1$1.childNodes[i].destroy();\n }\n\n this.parent = null;\n };\n\n BaseNode.prototype.load = function load () {};\n\n BaseNode.prototype.observe = function observe () {\n if (this.srcElement) {\n this.srcElement.addObserver(this);\n }\n };\n\n BaseNode.prototype.append = function append (node) {\n this.childNodes.push(node);\n node.parent = this;\n };\n\n BaseNode.prototype.insertAt = function insertAt (node, pos) {\n this.childNodes.splice(pos, 0, node);\n node.parent = this;\n };\n\n BaseNode.prototype.remove = function remove (index, count) {\n var this$1$1 = this;\n\n var end = index + count;\n for (var i = index; i < end; i++) {\n this$1$1.childNodes[i].removeSelf();\n }\n this.childNodes.splice(index, count);\n };\n\n BaseNode.prototype.removeSelf = function removeSelf () {\n this.clear();\n this.destroy();\n };\n\n BaseNode.prototype.clear = function clear () {\n this.remove(0, this.childNodes.length);\n };\n\n BaseNode.prototype.invalidate = function invalidate () {\n if (this.parent) {\n this.parent.invalidate();\n }\n };\n\n BaseNode.prototype.geometryChange = function geometryChange () {\n this.invalidate();\n };\n\n BaseNode.prototype.optionsChange = function optionsChange () {\n this.invalidate();\n };\n\n BaseNode.prototype.childrenChange = function childrenChange (e) {\n if (e.action === \"add\") {\n this.load(e.items, e.index);\n } else if (e.action === \"remove\") {\n this.remove(e.index, e.items.length);\n }\n\n this.invalidate();\n };\n\n return BaseNode;\n }(Class));\n\n var events = [\n \"click\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"resize\"\n ];\n\n var Surface$2 = (function (Observable$$1) {\n function Surface(element, options) {\n Observable$$1.call(this);\n\n this.options = $.extend({}, options);\n this.element = element;\n this.element._kendoExportVisual = this.exportVisual.bind(this);\n\n this._click = this._handler(\"click\");\n this._mouseenter = this._handler(\"mouseenter\");\n this._mouseleave = this._handler(\"mouseleave\");\n this._mousemove = this._handler(\"mousemove\");\n\n this._visual = new Group();\n\n elementSize(element, this.options);\n\n this.bind(events, this.options);\n\n this._enableTracking();\n }\n\n extendStatic(Surface, Observable$$1);\n Surface.prototype = Object.create( Observable$$1 && Observable$$1.prototype );\n Surface.prototype.constructor = Surface;\n Surface.fn = Surface.prototype;\n Surface.fn.init = Surface.fn.constructor;\n\n Surface.prototype.draw = function draw (element) {\n this._visual.children.push(element);\n };\n\n Surface.prototype.clear = function clear () {\n this._visual.children = [];\n };\n\n Surface.prototype.destroy = function destroy () {\n this._visual = null;\n this.element._kendoExportVisual = null;\n this.unbind();\n };\n\n Surface.prototype.eventTarget = function eventTarget (e) {\n var this$1$1 = this;\n\n var domNode = eventElement(e);\n var node;\n\n while (!node && domNode) {\n node = domNode._kendoNode;\n if (domNode === this$1$1.element) {\n break;\n }\n\n domNode = domNode.parentElement;\n }\n\n if (node) {\n return node.srcElement;\n }\n };\n\n Surface.prototype.exportVisual = function exportVisual () {\n return this._visual;\n };\n\n Surface.prototype.getSize = function getSize () {\n return elementSize(this.element);\n };\n\n Surface.prototype.currentSize = function currentSize (size) {\n if (size) {\n this._size = size;\n } else {\n return this._size;\n }\n };\n\n Surface.prototype.setSize = function setSize (size) {\n elementSize(this.element, size);\n\n this.currentSize(size);\n this._resize();\n };\n\n Surface.prototype.resize = function resize (force) {\n var size = this.getSize();\n var currentSize = this.currentSize();\n\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n this.currentSize(size);\n this._resize(size, force);\n this.trigger(\"resize\", size);\n }\n };\n\n Surface.prototype.size = function size (value) {\n if (!value) {\n return this.getSize();\n }\n\n this.setSize(value);\n };\n\n Surface.prototype.suspendTracking = function suspendTracking () {\n this._suspendedTracking = true;\n };\n\n Surface.prototype.resumeTracking = function resumeTracking () {\n this._suspendedTracking = false;\n };\n\n Surface.prototype._enableTracking = function _enableTracking () {};\n\n Surface.prototype._resize = function _resize () {};\n\n Surface.prototype._handler = function _handler (eventName) {\n var this$1$1 = this;\n\n return function (e) {\n var node = this$1$1.eventTarget(e);\n if (node && !this$1$1._suspendedTracking) {\n this$1$1.trigger(eventName, {\n element: node,\n originalEvent: e,\n type: eventName\n });\n }\n };\n };\n\n Surface.prototype._elementOffset = function _elementOffset () {\n var element = this.element;\n var padding = elementPadding(element);\n var ref = elementOffset(element);\n var left = ref.left;\n var top = ref.top;\n\n return {\n left: left + padding.left,\n top: top + padding.top\n };\n };\n\n Surface.prototype._surfacePoint = function _surfacePoint (e) {\n var offset = this._elementOffset();\n var coord = eventCoordinates(e);\n var x = coord.x - offset.left;\n var y = coord.y - offset.top;\n\n var inverseTransform = elementScale(this.element).invert();\n var point = new Point(\n x,\n y\n ).transform(inverseTransform);\n\n return point;\n };\n\n return Surface;\n }(kendo.Observable));\n\n function renderAttr(name, value) {\n return (defined(value) && value !== null) ? (\" \" + name + \"=\\\"\" + value + \"\\\" \") : \"\";\n }\n\n function renderAllAttr(attrs) {\n var output = \"\";\n for (var i = 0; i < attrs.length; i++) {\n output += renderAttr(attrs[i][0], attrs[i][1]);\n }\n\n return output;\n }\n\n function renderStyle(attrs) {\n var output = \"\";\n for (var i = 0; i < attrs.length; i++) {\n var value = attrs[i][1];\n if (defined(value)) {\n output += attrs[i][0] + \":\" + value + \";\";\n }\n }\n\n if (output !== \"\") {\n return output;\n }\n }\n\n var NODE_MAP = {};\n\n var SVG_NS = \"http://www.w3.org/2000/svg\";\n var NONE = \"none\";\n var POINT_DIGITS = 3;\n\n var renderSVG = function(container, svg) {\n container.innerHTML = svg;\n };\n\n if (typeof document !== \"undefined\") {\n var testFragment = \"\";\n var testContainer = document.createElement(\"div\");\n var hasParser = typeof DOMParser !== \"undefined\";\n\n testContainer.innerHTML = testFragment;\n\n if (hasParser && testContainer.firstChild.namespaceURI !== SVG_NS) {\n renderSVG = function(container, svg) {\n var parser = new DOMParser();\n var chartDoc = parser.parseFromString(svg, \"text/xml\");\n var importedDoc = document.adoptNode(chartDoc.documentElement);\n\n container.innerHTML = \"\";\n container.appendChild(importedDoc);\n };\n }\n }\n\n var renderSVG$1 = renderSVG;\n\n var TRANSFORM = \"transform\";\n var DefinitionMap = {\n clip: \"clip-path\",\n fill: \"fill\"\n };\n\n function isDefinition(type, value) {\n return type === \"clip\" || (type === \"fill\" && (!value || value.nodeType === \"Gradient\"));\n }\n\n function baseUrl() {\n var base = document.getElementsByTagName(\"base\")[0];\n var href = document.location.href;\n var url = \"\";\n\n if (base && !(supportBrowser || {}).msie) {\n var hashIndex = href.indexOf(\"#\");\n if (hashIndex !== -1) {\n href = href.substring(0, hashIndex);\n }\n\n url = href;\n }\n\n return url;\n }\n\n var Node = (function (BaseNode$$1) {\n function Node(srcElement, options) {\n BaseNode$$1.call(this, srcElement);\n this.definitions = {};\n\n this.options = options;\n }\n\n extendStatic(Node, BaseNode$$1);\n Node.prototype = Object.create( BaseNode$$1 && BaseNode$$1.prototype );\n Node.prototype.constructor = Node;\n Node.fn = Node.prototype;\n Node.fn.init = Node.fn.constructor;\n\n Node.prototype.destroy = function destroy () {\n if (this.element) {\n this.element._kendoNode = null;\n this.element = null;\n }\n\n this.clearDefinitions();\n BaseNode$$1.prototype.destroy.call(this);\n };\n\n Node.prototype.load = function load (elements, pos) {\n var this$1$1 = this;\n\n for (var i = 0; i < elements.length; i++) {\n var srcElement = elements[i];\n var children = srcElement.children;\n\n var childNode = new NODE_MAP[srcElement.nodeType](srcElement, this$1$1.options);\n\n if (defined(pos)) {\n this$1$1.insertAt(childNode, pos);\n } else {\n this$1$1.append(childNode);\n }\n\n childNode.createDefinitions();\n\n if (children && children.length > 0) {\n childNode.load(children);\n }\n\n var element = this$1$1.element;\n if (element) {\n childNode.attachTo(element, pos);\n }\n }\n };\n\n Node.prototype.root = function root () {\n var root = this;\n\n while (root.parent) {\n root = root.parent;\n }\n\n return root;\n };\n\n Node.prototype.attachTo = function attachTo (domElement, pos) {\n var container = document.createElement(\"div\");\n renderSVG$1(container,\n \"\" +\n this.render() +\n \"\"\n );\n\n var element = container.firstChild.firstChild;\n if (element) {\n if (defined(pos)) {\n domElement.insertBefore(element, domElement.childNodes[pos] || null);\n } else {\n domElement.appendChild(element);\n }\n this.setElement(element);\n }\n };\n\n Node.prototype.setElement = function setElement (element) {\n if (this.element) {\n this.element._kendoNode = null;\n }\n\n this.element = element;\n this.element._kendoNode = this;\n\n var nodes = this.childNodes;\n for (var i = 0; i < nodes.length; i++) {\n var childElement = element.childNodes[i];\n nodes[i].setElement(childElement);\n }\n };\n\n Node.prototype.clear = function clear () {\n this.clearDefinitions();\n\n if (this.element) {\n this.element.innerHTML = \"\";\n }\n\n var children = this.childNodes;\n for (var i = 0; i < children.length; i++) {\n children[i].destroy();\n }\n\n this.childNodes = [];\n };\n\n Node.prototype.removeSelf = function removeSelf () {\n if (this.element) {\n var parentNode = this.element.parentNode;\n if (parentNode) {\n parentNode.removeChild(this.element);\n }\n this.element = null;\n }\n\n BaseNode$$1.prototype.removeSelf.call(this);\n };\n\n Node.prototype.template = function template () {\n return this.renderChildren();\n };\n\n Node.prototype.render = function render () {\n return this.template();\n };\n\n Node.prototype.renderChildren = function renderChildren () {\n var nodes = this.childNodes;\n var output = \"\";\n\n for (var i = 0; i < nodes.length; i++) {\n output += nodes[i].render();\n }\n\n return output;\n };\n\n Node.prototype.optionsChange = function optionsChange (e) {\n var field = e.field;\n var value = e.value;\n\n if (field === \"visible\") {\n this.css(\"display\", value ? \"\" : NONE);\n } else if (DefinitionMap[field] && isDefinition(field, value)) {\n this.updateDefinition(field, value);\n } else if (field === \"opacity\") {\n this.attr(\"opacity\", value);\n } else if (field === \"cursor\") {\n this.css(\"cursor\", value);\n } else if (field === \"id\") {\n if (value) {\n this.attr(\"id\", value);\n } else {\n this.removeAttr(\"id\");\n }\n }\n\n BaseNode$$1.prototype.optionsChange.call(this, e);\n };\n\n Node.prototype.attr = function attr (name, value) {\n if (this.element) {\n this.element.setAttribute(name, value);\n }\n };\n\n Node.prototype.allAttr = function allAttr (attrs) {\n var this$1$1 = this;\n\n for (var i = 0; i < attrs.length; i++) {\n this$1$1.attr(attrs[i][0], attrs[i][1]);\n }\n };\n\n Node.prototype.css = function css (name, value) {\n if (this.element) {\n this.element.style[name] = value;\n }\n };\n\n Node.prototype.allCss = function allCss (styles) {\n var this$1$1 = this;\n\n for (var i = 0; i < styles.length; i++) {\n this$1$1.css(styles[i][0], styles[i][1]);\n }\n };\n\n Node.prototype.removeAttr = function removeAttr (name) {\n if (this.element) {\n this.element.removeAttribute(name);\n }\n };\n\n Node.prototype.mapTransform = function mapTransform (transform) {\n var attrs = [];\n if (transform) {\n attrs.push([\n TRANSFORM,\n \"matrix(\" + transform.matrix().toString(6) + \")\"\n ]);\n }\n\n return attrs;\n };\n\n Node.prototype.renderTransform = function renderTransform () {\n return renderAllAttr(\n this.mapTransform(this.srcElement.transform())\n );\n };\n\n Node.prototype.transformChange = function transformChange (value) {\n if (value) {\n this.allAttr(this.mapTransform(value));\n } else {\n this.removeAttr(TRANSFORM);\n }\n };\n\n Node.prototype.mapStyle = function mapStyle () {\n var options = this.srcElement.options;\n var style = [ [ \"cursor\", options.cursor ] ];\n\n if (options.visible === false) {\n style.push([ \"display\", NONE ]);\n }\n\n return style;\n };\n\n Node.prototype.renderStyle = function renderStyle$1 () {\n return renderAttr(\"style\", renderStyle(this.mapStyle(true)));\n };\n\n Node.prototype.renderOpacity = function renderOpacity () {\n return renderAttr(\"opacity\", this.srcElement.options.opacity);\n };\n\n Node.prototype.renderId = function renderId () {\n return renderAttr(\"id\", this.srcElement.options.id);\n };\n\n Node.prototype.createDefinitions = function createDefinitions () {\n var srcElement = this.srcElement;\n var definitions = this.definitions;\n if (srcElement) {\n var options = srcElement.options;\n var hasDefinitions;\n\n for (var field in DefinitionMap) {\n var definition = options.get(field);\n if (definition && isDefinition(field, definition)) {\n definitions[field] = definition;\n hasDefinitions = true;\n }\n }\n if (hasDefinitions) {\n this.definitionChange({\n action: \"add\",\n definitions: definitions\n });\n }\n }\n };\n\n Node.prototype.definitionChange = function definitionChange (e) {\n if (this.parent) {\n this.parent.definitionChange(e);\n }\n };\n\n Node.prototype.updateDefinition = function updateDefinition (type, value) {\n var definitions = this.definitions;\n var current = definitions[type];\n var attr = DefinitionMap[type];\n var definition = {};\n if (current) {\n definition[type] = current;\n this.definitionChange({\n action: \"remove\",\n definitions: definition\n });\n delete definitions[type];\n }\n\n if (!value) {\n if (current) {\n this.removeAttr(attr);\n }\n } else {\n definition[type] = value;\n this.definitionChange({\n action: \"add\",\n definitions: definition\n });\n definitions[type] = value;\n this.attr(attr, this.refUrl(value.id));\n }\n };\n\n Node.prototype.clearDefinitions = function clearDefinitions () {\n var definitions = this.definitions;\n\n this.definitionChange({\n action: \"remove\",\n definitions: definitions\n });\n this.definitions = {};\n };\n\n Node.prototype.renderDefinitions = function renderDefinitions () {\n return renderAllAttr(this.mapDefinitions());\n };\n\n Node.prototype.mapDefinitions = function mapDefinitions () {\n var this$1$1 = this;\n\n var definitions = this.definitions;\n var attrs = [];\n\n for (var field in definitions) {\n attrs.push([ DefinitionMap[field], this$1$1.refUrl(definitions[field].id) ]);\n }\n\n return attrs;\n };\n\n Node.prototype.refUrl = function refUrl (id) {\n var skipBaseHref = (this.options || {}).skipBaseHref;\n var baseHref = this.baseUrl().replace(/'/g, \"\\\\'\");\n var base = skipBaseHref ? '' : baseHref;\n return (\"url(\" + base + \"#\" + id + \")\");\n };\n\n Node.prototype.baseUrl = function baseUrl$1 () {\n return baseUrl();\n };\n\n return Node;\n }(BaseNode));\n\n var GradientStopNode = (function (Node$$1) {\n function GradientStopNode () {\n Node$$1.apply(this, arguments);\n }\n\n extendStatic(GradientStopNode, Node$$1);\n GradientStopNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n GradientStopNode.prototype.constructor = GradientStopNode;\n GradientStopNode.fn = GradientStopNode.prototype;\n GradientStopNode.fn.init = GradientStopNode.fn.constructor;\n\n GradientStopNode.prototype.template = function template () {\n return (\"\");\n };\n\n GradientStopNode.prototype.renderOffset = function renderOffset () {\n return renderAttr(\"offset\", this.srcElement.offset());\n };\n\n GradientStopNode.prototype.mapStyle = function mapStyle () {\n var srcElement = this.srcElement;\n return [\n [ \"stop-color\", srcElement.color() ],\n [ \"stop-opacity\", srcElement.opacity() ]\n ];\n };\n\n GradientStopNode.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"offset\") {\n this.attr(e.field, e.value);\n } else if (e.field === \"color\" || e.field === \"opacity\") {\n this.css(\"stop-\" + e.field, e.value);\n }\n };\n\n return GradientStopNode;\n }(Node));\n\n var GradientNode = (function (Node$$1) {\n function GradientNode(srcElement) {\n Node$$1.call(this, srcElement);\n\n this.id = srcElement.id;\n\n this.loadStops();\n }\n\n extendStatic(GradientNode, Node$$1);\n GradientNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n GradientNode.prototype.constructor = GradientNode;\n GradientNode.fn = GradientNode.prototype;\n GradientNode.fn.init = GradientNode.fn.constructor;\n\n GradientNode.prototype.loadStops = function loadStops () {\n var this$1$1 = this;\n\n var stops = this.srcElement.stops;\n var element = this.element;\n\n for (var idx = 0; idx < stops.length; idx++) {\n var stopNode = new GradientStopNode(stops[idx]);\n this$1$1.append(stopNode);\n if (element) {\n stopNode.attachTo(element);\n }\n }\n };\n\n GradientNode.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"gradient.stops\") {\n BaseNode.prototype.clear.call(this);\n this.loadStops();\n } else if (e.field === \"gradient\") {\n this.allAttr(this.mapCoordinates());\n }\n };\n\n GradientNode.prototype.renderCoordinates = function renderCoordinates () {\n return renderAllAttr(this.mapCoordinates());\n };\n\n GradientNode.prototype.mapSpace = function mapSpace () {\n return [ \"gradientUnits\", this.srcElement.userSpace() ? \"userSpaceOnUse\" : \"objectBoundingBox\" ];\n };\n\n return GradientNode;\n }(Node));\n\n var LinearGradientNode = (function (GradientNode$$1) {\n function LinearGradientNode () {\n GradientNode$$1.apply(this, arguments);\n }\n\n extendStatic(LinearGradientNode, GradientNode$$1);\n LinearGradientNode.prototype = Object.create( GradientNode$$1 && GradientNode$$1.prototype );\n LinearGradientNode.prototype.constructor = LinearGradientNode;\n LinearGradientNode.fn = LinearGradientNode.prototype;\n LinearGradientNode.fn.init = LinearGradientNode.fn.constructor;\n\n LinearGradientNode.prototype.template = function template () {\n return (\"\" + (this.renderChildren()) + \"\");\n };\n\n LinearGradientNode.prototype.mapCoordinates = function mapCoordinates () {\n var srcElement = this.srcElement;\n var start = srcElement.start();\n var end = srcElement.end();\n var attrs = [\n [ \"x1\", start.x ],\n [ \"y1\", start.y ],\n [ \"x2\", end.x ],\n [ \"y2\", end.y ],\n this.mapSpace()\n ];\n\n return attrs;\n };\n\n return LinearGradientNode;\n }(GradientNode));\n\n var RadialGradientNode = (function (GradientNode$$1) {\n function RadialGradientNode () {\n GradientNode$$1.apply(this, arguments);\n }\n\n extendStatic(RadialGradientNode, GradientNode$$1);\n RadialGradientNode.prototype = Object.create( GradientNode$$1 && GradientNode$$1.prototype );\n RadialGradientNode.prototype.constructor = RadialGradientNode;\n RadialGradientNode.fn = RadialGradientNode.prototype;\n RadialGradientNode.fn.init = RadialGradientNode.fn.constructor;\n\n RadialGradientNode.prototype.template = function template () {\n return (\"\" + (this.renderChildren()) + \"\");\n };\n\n RadialGradientNode.prototype.mapCoordinates = function mapCoordinates () {\n var srcElement = this.srcElement;\n var center = srcElement.center();\n var radius = srcElement.radius();\n var attrs = [\n [ \"cx\", center.x ],\n [ \"cy\", center.y ],\n [ \"r\", radius ],\n this.mapSpace()\n ];\n return attrs;\n };\n\n return RadialGradientNode;\n }(GradientNode));\n\n var ClipNode = (function (Node$$1) {\n function ClipNode(srcElement) {\n Node$$1.call(this);\n\n this.srcElement = srcElement;\n this.id = srcElement.id;\n\n this.load([ srcElement ]);\n }\n\n extendStatic(ClipNode, Node$$1);\n ClipNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n ClipNode.prototype.constructor = ClipNode;\n ClipNode.fn = ClipNode.prototype;\n ClipNode.fn.init = ClipNode.fn.constructor;\n\n ClipNode.prototype.template = function template () {\n return (\"\" + (this.renderChildren()) + \"\");\n };\n\n return ClipNode;\n }(Node));\n\n var DefinitionNode = (function (Node$$1) {\n function DefinitionNode() {\n Node$$1.call(this);\n this.definitionMap = {};\n }\n\n extendStatic(DefinitionNode, Node$$1);\n DefinitionNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n DefinitionNode.prototype.constructor = DefinitionNode;\n DefinitionNode.fn = DefinitionNode.prototype;\n DefinitionNode.fn.init = DefinitionNode.fn.constructor;\n\n DefinitionNode.prototype.attachTo = function attachTo (domElement) {\n this.element = domElement;\n };\n\n DefinitionNode.prototype.template = function template () {\n return (\"\" + (this.renderChildren()) + \"\");\n };\n\n DefinitionNode.prototype.definitionChange = function definitionChange (e) {\n var definitions = e.definitions;\n var action = e.action;\n\n if (action === \"add\") {\n this.addDefinitions(definitions);\n } else if (action === \"remove\") {\n this.removeDefinitions(definitions);\n }\n };\n\n DefinitionNode.prototype.createDefinition = function createDefinition (type, item) {\n var nodeType;\n if (type === \"clip\") {\n nodeType = ClipNode;\n } else if (type === \"fill\") {\n if (item instanceof LinearGradient) {\n nodeType = LinearGradientNode;\n } else if (item instanceof RadialGradient) {\n nodeType = RadialGradientNode;\n }\n }\n return new nodeType(item);\n };\n\n DefinitionNode.prototype.addDefinitions = function addDefinitions (definitions) {\n var this$1$1 = this;\n\n for (var field in definitions) {\n this$1$1.addDefinition(field, definitions[field]);\n }\n };\n\n DefinitionNode.prototype.addDefinition = function addDefinition (type, srcElement) {\n var ref = this;\n var element = ref.element;\n var definitionMap = ref.definitionMap;\n var id = srcElement.id;\n var mapItem = definitionMap[id];\n if (!mapItem) {\n var node = this.createDefinition(type, srcElement);\n definitionMap[id] = {\n element: node,\n count: 1\n };\n this.append(node);\n if (element) {\n node.attachTo(this.element);\n }\n } else {\n mapItem.count++;\n }\n };\n\n DefinitionNode.prototype.removeDefinitions = function removeDefinitions (definitions) {\n var this$1$1 = this;\n\n for (var field in definitions) {\n this$1$1.removeDefinition(definitions[field]);\n }\n };\n\n DefinitionNode.prototype.removeDefinition = function removeDefinition (srcElement) {\n var definitionMap = this.definitionMap;\n var id = srcElement.id;\n var mapItem = definitionMap[id];\n\n if (mapItem) {\n mapItem.count--;\n if (mapItem.count === 0) {\n this.remove(this.childNodes.indexOf(mapItem.element), 1);\n delete definitionMap[id];\n }\n }\n };\n\n return DefinitionNode;\n }(Node));\n\n var RootNode = (function (Node$$1) {\n function RootNode(options) {\n Node$$1.call(this);\n this.options = options;\n this.defs = new DefinitionNode();\n }\n\n extendStatic(RootNode, Node$$1);\n RootNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n RootNode.prototype.constructor = RootNode;\n RootNode.fn = RootNode.prototype;\n RootNode.fn.init = RootNode.fn.constructor;\n\n RootNode.prototype.attachTo = function attachTo (domElement) {\n this.element = domElement;\n this.defs.attachTo(domElement.firstElementChild);\n };\n\n RootNode.prototype.clear = function clear () {\n BaseNode.prototype.clear.call(this);\n };\n\n RootNode.prototype.template = function template () {\n return this.defs.render() + this.renderChildren();\n };\n\n RootNode.prototype.definitionChange = function definitionChange (e) {\n this.defs.definitionChange(e);\n };\n\n return RootNode;\n }(Node));\n\n var DASH_ARRAYS = {\n dot: [ 1.5, 3.5 ],\n dash: [ 4, 3.5 ],\n longdash: [ 8, 3.5 ],\n dashdot: [ 3.5, 3.5, 1.5, 3.5 ],\n longdashdot: [ 8, 3.5, 1.5, 3.5 ],\n longdashdotdot: [ 8, 3.5, 1.5, 3.5, 1.5, 3.5 ]\n };\n\n var SOLID = \"solid\";\n var BUTT = \"butt\";\n\n var ATTRIBUTE_MAP = {\n \"fill.opacity\": \"fill-opacity\",\n \"stroke.color\": \"stroke\",\n \"stroke.width\": \"stroke-width\",\n \"stroke.opacity\": \"stroke-opacity\"\n };\n\n var PathNode = (function (Node$$1) {\n function PathNode () {\n Node$$1.apply(this, arguments);\n }\n\n extendStatic(PathNode, Node$$1);\n PathNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n PathNode.prototype.constructor = PathNode;\n PathNode.fn = PathNode.prototype;\n PathNode.fn.init = PathNode.fn.constructor;\n\n PathNode.prototype.geometryChange = function geometryChange () {\n this.attr(\"d\", this.renderData());\n this.invalidate();\n };\n\n PathNode.prototype.optionsChange = function optionsChange (e) {\n switch (e.field) {\n case \"fill\":\n if (e.value) {\n this.allAttr(this.mapFill(e.value));\n } else {\n this.removeAttr(\"fill\");\n }\n break;\n\n case \"fill.color\":\n this.allAttr(this.mapFill({ color: e.value }));\n break;\n\n case \"stroke\":\n if (e.value) {\n this.allAttr(this.mapStroke(e.value));\n } else {\n this.removeAttr(\"stroke\");\n }\n break;\n\n case \"transform\":\n this.transformChange(e.value);\n break;\n\n default:\n var name = ATTRIBUTE_MAP[e.field];\n if (name) {\n this.attr(name, e.value);\n }\n break;\n }\n\n Node$$1.prototype.optionsChange.call(this, e);\n };\n\n PathNode.prototype.content = function content () {\n if (this.element) {\n this.element.textContent = this.srcElement.content();\n }\n };\n\n PathNode.prototype.renderData = function renderData () {\n return this.srcElement.toString(POINT_DIGITS) || undefined;\n };\n\n PathNode.prototype.mapStroke = function mapStroke (stroke) {\n var attrs = [];\n\n if (stroke && !isTransparent(stroke.color)) {\n attrs.push([ \"stroke\", stroke.color ]);\n attrs.push([ \"stroke-width\", stroke.width ]);\n attrs.push([ \"stroke-linecap\", this.renderLinecap(stroke) ]);\n attrs.push([ \"stroke-linejoin\", stroke.lineJoin ]);\n\n if (defined(stroke.opacity)) {\n attrs.push([ \"stroke-opacity\", stroke.opacity ]);\n }\n\n if (defined(stroke.dashType)) {\n attrs.push([ \"stroke-dasharray\", this.renderDashType(stroke) ]);\n }\n } else {\n attrs.push([ \"stroke\", NONE ]);\n }\n\n return attrs;\n };\n\n PathNode.prototype.renderStroke = function renderStroke () {\n return renderAllAttr(\n this.mapStroke(this.srcElement.options.stroke)\n );\n };\n\n PathNode.prototype.renderDashType = function renderDashType (stroke) {\n var dashType = stroke.dashType;\n var width = stroke.width; if (width === void 0) { width = 1; }\n\n if (dashType && dashType !== SOLID) {\n var dashArray = DASH_ARRAYS[dashType.toLowerCase()];\n var result = [];\n\n for (var i = 0; i < dashArray.length; i++) {\n result.push(dashArray[i] * width);\n }\n\n return result.join(\" \");\n }\n };\n\n PathNode.prototype.renderLinecap = function renderLinecap (stroke) {\n var dashType = stroke.dashType;\n var lineCap = stroke.lineCap;\n\n return (dashType && dashType !== \"solid\") ? BUTT : lineCap;\n };\n\n PathNode.prototype.mapFill = function mapFill (fill) {\n var attrs = [];\n if (!(fill && fill.nodeType === \"Gradient\")) {\n if (fill && !isTransparent(fill.color)) {\n attrs.push([ \"fill\", fill.color ]);\n\n if (defined(fill.opacity)) {\n attrs.push([ \"fill-opacity\", fill.opacity ]);\n }\n } else {\n attrs.push([ \"fill\", NONE ]);\n }\n }\n\n return attrs;\n };\n\n PathNode.prototype.renderFill = function renderFill () {\n return renderAllAttr(\n this.mapFill(this.srcElement.options.fill)\n );\n };\n\n PathNode.prototype.template = function template () {\n return \"\";\n };\n\n return PathNode;\n }(Node));\n\n var ArcNode = (function (PathNode$$1) {\n function ArcNode () {\n PathNode$$1.apply(this, arguments);\n }\n\n extendStatic(ArcNode, PathNode$$1);\n ArcNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\n ArcNode.prototype.constructor = ArcNode;\n ArcNode.fn = ArcNode.prototype;\n ArcNode.fn.init = ArcNode.fn.constructor;\n\n ArcNode.prototype.renderData = function renderData () {\n return this.srcElement.toPath().toString(POINT_DIGITS);\n };\n\n return ArcNode;\n }(PathNode));\n\n var CircleNode = (function (PathNode$$1) {\n function CircleNode () {\n PathNode$$1.apply(this, arguments);\n }\n\n extendStatic(CircleNode, PathNode$$1);\n CircleNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\n CircleNode.prototype.constructor = CircleNode;\n CircleNode.fn = CircleNode.prototype;\n CircleNode.fn.init = CircleNode.fn.constructor;\n\n CircleNode.prototype.geometryChange = function geometryChange () {\n var center = this.center();\n this.attr(\"cx\", center.x);\n this.attr(\"cy\", center.y);\n this.attr(\"r\", this.radius());\n this.invalidate();\n };\n\n CircleNode.prototype.center = function center () {\n return this.srcElement.geometry().center;\n };\n\n CircleNode.prototype.radius = function radius () {\n return this.srcElement.geometry().radius;\n };\n\n CircleNode.prototype.template = function template () {\n return \"\";\n };\n\n return CircleNode;\n }(PathNode));\n\n var GroupNode = (function (Node$$1) {\n function GroupNode () {\n Node$$1.apply(this, arguments);\n }\n\n extendStatic(GroupNode, Node$$1);\n GroupNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\n GroupNode.prototype.constructor = GroupNode;\n GroupNode.fn = GroupNode.prototype;\n GroupNode.fn.init = GroupNode.fn.constructor;\n\n GroupNode.prototype.template = function template () {\n return (\"\" + (this.renderChildren()) + \"\");\n };\n\n GroupNode.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"transform\") {\n this.transformChange(e.value);\n }\n\n Node$$1.prototype.optionsChange.call(this, e);\n };\n\n return GroupNode;\n }(Node));\n\n var ImageNode = (function (PathNode$$1) {\n function ImageNode () {\n PathNode$$1.apply(this, arguments);\n }\n\n extendStatic(ImageNode, PathNode$$1);\n ImageNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\n ImageNode.prototype.constructor = ImageNode;\n ImageNode.fn = ImageNode.prototype;\n ImageNode.fn.init = ImageNode.fn.constructor;\n\n ImageNode.prototype.geometryChange = function geometryChange () {\n this.allAttr(this.mapPosition());\n this.invalidate();\n };\n\n ImageNode.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"src\") {\n this.allAttr(this.mapSource());\n }\n\n PathNode$$1.prototype.optionsChange.call(this, e);\n };\n\n ImageNode.prototype.mapPosition = function mapPosition () {\n var rect = this.srcElement.rect();\n var tl = rect.topLeft();\n\n return [\n [ \"x\", tl.x ],\n [ \"y\", tl.y ],\n [ \"width\", rect.width() + \"px\" ],\n [ \"height\", rect.height() + \"px\" ]\n ];\n };\n\n ImageNode.prototype.renderPosition = function renderPosition () {\n return renderAllAttr(this.mapPosition());\n };\n\n ImageNode.prototype.mapSource = function mapSource (encode) {\n var src = this.srcElement.src();\n\n if (encode) {\n src = kendo.htmlEncode(src);\n }\n\n return [ [ \"xlink:href\", src ] ];\n };\n\n ImageNode.prototype.renderSource = function renderSource () {\n return renderAllAttr(this.mapSource(true));\n };\n\n ImageNode.prototype.template = function template () {\n return \"\" +\n \"\";\n };\n\n return ImageNode;\n }(PathNode));\n\n var MultiPathNode = (function (PathNode$$1) {\n function MultiPathNode () {\n PathNode$$1.apply(this, arguments);\n }\n\n extendStatic(MultiPathNode, PathNode$$1);\n MultiPathNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\n MultiPathNode.prototype.constructor = MultiPathNode;\n MultiPathNode.fn = MultiPathNode.prototype;\n MultiPathNode.fn.init = MultiPathNode.fn.constructor;\n\n MultiPathNode.prototype.renderData = function renderData () {\n return this.srcElement.toString(POINT_DIGITS) || 'undefined';\n };\n\n return MultiPathNode;\n }(PathNode));\n\n var RectNode = (function (PathNode$$1) {\n function RectNode () {\n PathNode$$1.apply(this, arguments);\n }\n\n extendStatic(RectNode, PathNode$$1);\n RectNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\n RectNode.prototype.constructor = RectNode;\n RectNode.fn = RectNode.prototype;\n RectNode.fn.init = RectNode.fn.constructor;\n\n RectNode.prototype.geometryChange = function geometryChange () {\n var geometry = this.srcElement.geometry();\n this.attr(\"x\", geometry.origin.x);\n this.attr(\"y\", geometry.origin.y);\n this.attr(\"width\", geometry.size.width);\n this.attr(\"height\", geometry.size.height);\n this.attr(\"rx\", geometry.cornerRadius[0]);\n this.attr(\"ry\", geometry.cornerRadius[1]);\n this.invalidate();\n };\n\n RectNode.prototype.size = function size () {\n return this.srcElement.geometry().size;\n };\n\n RectNode.prototype.origin = function origin () {\n return this.srcElement.geometry().origin;\n };\n\n RectNode.prototype.rx = function rx () {\n return this.srcElement.geometry().cornerRadius[0];\n };\n\n RectNode.prototype.ry = function ry () {\n return this.srcElement.geometry().cornerRadius[1];\n };\n\n RectNode.prototype.template = function template () {\n return \"\";\n };\n\n return RectNode;\n }(PathNode));\n\n var ENTITY_REGEX = /&(?:[a-zA-Z]+|#\\d+);/g;\n\n function decodeEntities(text) {\n if (!text || typeof text !== \"string\" || !ENTITY_REGEX.test(text)) {\n return text;\n }\n\n var element = decodeEntities._element;\n ENTITY_REGEX.lastIndex = 0;\n\n return text.replace(ENTITY_REGEX, function (match) {\n element.innerHTML = match;\n\n return element.textContent || element.innerText;\n });\n }\n\n if (typeof document !== \"undefined\") {\n decodeEntities._element = document.createElement(\"span\");\n }\n\n var TextNode = (function (PathNode$$1) {\n function TextNode () {\n PathNode$$1.apply(this, arguments);\n }\n\n extendStatic(TextNode, PathNode$$1);\n TextNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\n TextNode.prototype.constructor = TextNode;\n TextNode.fn = TextNode.prototype;\n TextNode.fn.init = TextNode.fn.constructor;\n\n TextNode.prototype.geometryChange = function geometryChange () {\n var pos = this.pos();\n this.attr(\"x\", pos.x);\n this.attr(\"y\", pos.y);\n this.invalidate();\n };\n\n TextNode.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"font\") {\n this.attr(\"style\", renderStyle(this.mapStyle()));\n this.geometryChange();\n } else if (e.field === \"content\") {\n PathNode$$1.prototype.content.call(this, this.srcElement.content());\n }\n\n PathNode$$1.prototype.optionsChange.call(this, e);\n };\n\n TextNode.prototype.mapStyle = function mapStyle (encode) {\n var style = PathNode$$1.prototype.mapStyle.call(this, encode);\n var font = this.srcElement.options.font;\n\n if (encode) {\n font = kendo.htmlEncode(font);\n }\n\n style.push([ \"font\", font ], [ \"white-space\", \"pre\" ]);\n\n return style;\n };\n\n TextNode.prototype.pos = function pos () {\n var pos = this.srcElement.position();\n var size = this.srcElement.measure();\n return pos.clone().setY(pos.y + size.baseline);\n };\n\n TextNode.prototype.renderContent = function renderContent () {\n var content = this.srcElement.content();\n content = decodeEntities(content);\n content = kendo.htmlEncode(content);\n\n return kendoUtil.normalizeText(content);\n };\n\n TextNode.prototype.renderTextAnchor = function renderTextAnchor () {\n var anchor;\n\n if ((this.options || {}).rtl && !(supportBrowser.msie || supportBrowser.edge)) {\n anchor = 'end';\n }\n\n return renderAttr(\"text-anchor\", anchor);\n };\n\n TextNode.prototype.template = function template () {\n return \"\" + (this.renderContent()) + \"\";\n };\n\n return TextNode;\n }(PathNode));\n\n NODE_MAP.Arc = ArcNode;\n NODE_MAP.Circle = CircleNode;\n NODE_MAP.Group = GroupNode;\n NODE_MAP.Image = ImageNode;\n NODE_MAP.MultiPath = MultiPathNode;\n NODE_MAP.Path = PathNode;\n NODE_MAP.Rect = RectNode;\n NODE_MAP.Text = TextNode;\n\n var RTL = 'rtl';\n\n function alignToScreen(element) {\n var ctm;\n\n try {\n ctm = element.getScreenCTM ? element.getScreenCTM() : null;\n } catch (e) { } // eslint-disable-line no-empty\n\n if (ctm) {\n var left = - ctm.e % 1;\n var top = - ctm.f % 1;\n var style = element.style;\n\n if (left !== 0 || top !== 0) {\n style.left = left + \"px\";\n style.top = top + \"px\";\n }\n }\n }\n\n var Surface$3 = (function (BaseSurface) {\n function Surface(element, options) {\n BaseSurface.call(this, element, options);\n\n this._root = new RootNode($.extend({\n rtl: elementStyles(element, 'direction').direction === RTL\n }, this.options));\n\n renderSVG$1(this.element, this._template());\n\n this._rootElement = this.element.firstElementChild;\n\n alignToScreen(this._rootElement);\n\n this._root.attachTo(this._rootElement);\n\n bindEvents(this.element, {\n click: this._click,\n mouseover: this._mouseenter,\n mouseout: this._mouseleave,\n mousemove: this._mousemove\n });\n\n this.resize();\n }\n\n extendStatic(Surface, BaseSurface);\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\n Surface.prototype.constructor = Surface;\n Surface.fn = Surface.prototype;\n Surface.fn.init = Surface.fn.constructor;\n\n var prototypeAccessors = { type: {} };\n\n prototypeAccessors.type.get = function () {\n return \"svg\";\n };\n\n Surface.prototype.destroy = function destroy () {\n if (this._root) {\n this._root.destroy();\n this._root = null;\n this._rootElement = null;\n unbindEvents(this.element, {\n click: this._click,\n mouseover: this._mouseenter,\n mouseout: this._mouseleave,\n mousemove: this._mousemove\n });\n }\n\n BaseSurface.prototype.destroy.call(this);\n };\n\n Surface.prototype.translate = function translate (offset) {\n var viewBox = (Math.round(offset.x)) + \" \" + (Math.round(offset.y)) + \" \" + (this._size.width) + \" \" + (this._size.height);\n\n this._offset = offset;\n this._rootElement.setAttribute(\"viewBox\", viewBox);\n };\n\n Surface.prototype.draw = function draw (element) {\n BaseSurface.prototype.draw.call(this, element);\n this._root.load([ element ]);\n };\n\n Surface.prototype.clear = function clear () {\n BaseSurface.prototype.clear.call(this);\n this._root.clear();\n };\n\n Surface.prototype.svg = function svg () {\n return \"\" + this._template();\n };\n\n Surface.prototype.exportVisual = function exportVisual () {\n var ref = this;\n var visual = ref._visual;\n var offset = ref._offset;\n\n if (offset) {\n var wrap = new Group();\n wrap.children.push(visual);\n\n wrap.transform(\n transform$1().translate(-offset.x, -offset.y)\n );\n\n visual = wrap;\n }\n\n return visual;\n };\n\n Surface.prototype._resize = function _resize () {\n if (this._offset) {\n this.translate(this._offset);\n }\n };\n\n Surface.prototype._template = function _template () {\n return (\"\" + (this._root.render()) + \"\");\n };\n\n Object.defineProperties( Surface.prototype, prototypeAccessors );\n\n return Surface;\n }(Surface$2));\n\n var NODE_MAP$2 = {};\n\n function renderPath(ctx, path) {\n var segments = path.segments;\n\n if (segments.length === 0) {\n return;\n }\n\n var segment = segments[0];\n var anchor = segment.anchor();\n ctx.moveTo(anchor.x, anchor.y);\n\n for (var i = 1; i < segments.length; i++) {\n segment = segments[i];\n anchor = segment.anchor();\n\n var prevSeg = segments[i - 1];\n var prevOut = prevSeg.controlOut();\n var controlIn = segment.controlIn();\n\n if (prevOut && controlIn) {\n ctx.bezierCurveTo(prevOut.x, prevOut.y,\n controlIn.x, controlIn.y,\n anchor.x, anchor.y);\n } else {\n ctx.lineTo(anchor.x, anchor.y);\n }\n }\n\n if (path.options.closed) {\n ctx.closePath();\n }\n }\n\n var Node$2 = (function (BaseNode$$1) {\n function Node(srcElement) {\n BaseNode$$1.call(this, srcElement);\n if (srcElement) {\n this.initClip();\n }\n }\n\n extendStatic(Node, BaseNode$$1);\n Node.prototype = Object.create( BaseNode$$1 && BaseNode$$1.prototype );\n Node.prototype.constructor = Node;\n Node.fn = Node.prototype;\n Node.fn.init = Node.fn.constructor;\n\n Node.prototype.initClip = function initClip () {\n var clip = this.srcElement.clip();\n if (clip) {\n this.clip = clip;\n clip.addObserver(this);\n }\n };\n\n Node.prototype.clear = function clear () {\n if (this.srcElement) {\n this.srcElement.removeObserver(this);\n }\n\n this.clearClip();\n\n BaseNode$$1.prototype.clear.call(this);\n };\n\n Node.prototype.clearClip = function clearClip () {\n if (this.clip) {\n this.clip.removeObserver(this);\n delete this.clip;\n }\n };\n\n Node.prototype.setClip = function setClip (ctx) {\n if (this.clip) {\n ctx.beginPath();\n renderPath(ctx, this.clip);\n ctx.clip();\n }\n };\n\n Node.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"clip\") {\n this.clearClip();\n this.initClip();\n }\n\n BaseNode$$1.prototype.optionsChange.call(this, e);\n };\n\n Node.prototype.setTransform = function setTransform (ctx) {\n if (this.srcElement) {\n var transform = this.srcElement.transform();\n if (transform) {\n ctx.transform.apply(ctx, transform.matrix().toArray(6));\n }\n }\n };\n\n Node.prototype.loadElements = function loadElements (elements, pos, cors) {\n var this$1$1 = this;\n\n for (var i = 0; i < elements.length; i++) {\n var srcElement = elements[i];\n var children = srcElement.children;\n\n var childNode = new NODE_MAP$2[srcElement.nodeType](srcElement, cors);\n\n if (children && children.length > 0) {\n childNode.load(children, pos, cors);\n }\n\n if (defined(pos)) {\n this$1$1.insertAt(childNode, pos);\n } else {\n this$1$1.append(childNode);\n }\n }\n };\n\n Node.prototype.load = function load (elements, pos, cors) {\n this.loadElements(elements, pos, cors);\n\n this.invalidate();\n };\n\n Node.prototype.setOpacity = function setOpacity (ctx) {\n if (this.srcElement) {\n var opacity = this.srcElement.opacity();\n if (defined(opacity)) {\n this.globalAlpha(ctx, opacity);\n }\n }\n };\n\n Node.prototype.globalAlpha = function globalAlpha (ctx, value) {\n var opactity = value;\n if (opactity && ctx.globalAlpha) {\n opactity *= ctx.globalAlpha;\n }\n ctx.globalAlpha = opactity;\n };\n\n Node.prototype.visible = function visible () {\n var src = this.srcElement;\n return !src || (src && src.options.visible !== false);\n };\n\n return Node;\n }(BaseNode));\n\n var GroupNode$2 = (function (superclass) {\n function GroupNode () {\n superclass.apply(this, arguments);\n }\n\n extendStatic(GroupNode, superclass);\n GroupNode.prototype = Object.create( superclass && superclass.prototype );\n GroupNode.prototype.constructor = GroupNode;\n GroupNode.fn = GroupNode.prototype;\n GroupNode.fn.init = GroupNode.fn.constructor;\n\n GroupNode.prototype.renderTo = function renderTo (ctx) {\n if (!this.visible()) {\n return;\n }\n\n ctx.save();\n\n this.setTransform(ctx);\n this.setClip(ctx);\n this.setOpacity(ctx);\n\n var childNodes = this.childNodes;\n for (var i = 0; i < childNodes.length; i++) {\n var child = childNodes[i];\n if (child.visible()) {\n child.renderTo(ctx);\n }\n }\n\n ctx.restore();\n };\n\n return GroupNode;\n }(traversable(Node$2, \"childNodes\")));\n\n var FRAME_DELAY = 1000 / 60;\n\n var RootNode$2 = (function (superclass) {\n function RootNode(canvas, size) {\n superclass.call(this);\n\n this.canvas = canvas;\n this.size = size;\n this.ctx = canvas.getContext(\"2d\");\n\n var invalidateHandler = this._invalidate.bind(this);\n this.invalidate = kendo.throttle(function () {\n kendo.animationFrame(invalidateHandler);\n }, FRAME_DELAY);\n }\n\n extendStatic(RootNode, superclass);\n RootNode.prototype = Object.create( superclass && superclass.prototype );\n RootNode.prototype.constructor = RootNode;\n RootNode.fn = RootNode.prototype;\n RootNode.fn.init = RootNode.fn.constructor;\n\n RootNode.prototype.destroy = function destroy () {\n superclass.prototype.destroy.call(this);\n this.canvas = null;\n this.ctx = null;\n };\n\n RootNode.prototype.load = function load (elements, pos, cors) {\n this.loadElements(elements, pos, cors);\n this._invalidate();\n };\n\n RootNode.prototype._rescale = function _rescale (scale) {\n var ref = this;\n var canvas = ref.canvas;\n var size = ref.size;\n canvas.width = size.width * scale;\n canvas.height = size.height * scale;\n this.ctx.scale(scale, scale);\n };\n\n RootNode.prototype._devicePixelRatio = function _devicePixelRatio () {\n if (typeof window.devicePixelRatio === 'number') {\n return window.devicePixelRatio;\n }\n\n return 1;\n };\n\n RootNode.prototype._invalidate = function _invalidate (options) {\n if (!this.ctx) {\n return;\n }\n\n var fixedScale = options && options.fixedScale;\n var scale = fixedScale ? 1 : this._devicePixelRatio();\n this._rescale(scale);\n\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.renderTo(this.ctx);\n };\n\n return RootNode;\n }(traversable(GroupNode$2, \"childNodes\")));\n\n var QuadRoot = (function (Class$$1) {\n function QuadRoot() {\n Class$$1.call(this);\n\n this.shapes = [];\n }\n\n extendStatic(QuadRoot, Class$$1);\n QuadRoot.prototype = Object.create( Class$$1 && Class$$1.prototype );\n QuadRoot.prototype.constructor = QuadRoot;\n QuadRoot.fn = QuadRoot.prototype;\n QuadRoot.fn.init = QuadRoot.fn.constructor;\n\n QuadRoot.prototype._add = function _add (shape, bbox) {\n this.shapes.push({\n bbox: bbox,\n shape: shape\n });\n shape._quadNode = this;\n };\n\n QuadRoot.prototype.pointShapes = function pointShapes (point) {\n var shapes = this.shapes;\n var length = shapes.length;\n var result = [];\n for (var idx = 0; idx < length; idx++) {\n if (shapes[idx].bbox.containsPoint(point)) {\n result.push(shapes[idx].shape);\n }\n }\n return result;\n };\n\n QuadRoot.prototype.insert = function insert (shape, bbox) {\n this._add(shape, bbox);\n };\n\n QuadRoot.prototype.remove = function remove (shape) {\n var shapes = this.shapes;\n var length = shapes.length;\n\n for (var idx = 0; idx < length; idx++) {\n if (shapes[idx].shape === shape) {\n shapes.splice(idx, 1);\n break;\n }\n }\n };\n\n return QuadRoot;\n }(Class));\n\n var QuadNode = (function (QuadRoot$$1) {\n function QuadNode(rect) {\n QuadRoot$$1.call(this);\n this.children = [];\n this.rect = rect;\n }\n\n extendStatic(QuadNode, QuadRoot$$1);\n QuadNode.prototype = Object.create( QuadRoot$$1 && QuadRoot$$1.prototype );\n QuadNode.prototype.constructor = QuadNode;\n QuadNode.fn = QuadNode.prototype;\n QuadNode.fn.init = QuadNode.fn.constructor;\n\n QuadNode.prototype.inBounds = function inBounds (rect) {\n var nodeRect = this.rect;\n var nodeBottomRight = nodeRect.bottomRight();\n var bottomRight = rect.bottomRight();\n var inBounds = nodeRect.origin.x <= rect.origin.x && nodeRect.origin.y <= rect.origin.y && bottomRight.x <= nodeBottomRight.x &&\n bottomRight.y <= nodeBottomRight.y;\n return inBounds;\n };\n\n QuadNode.prototype.pointShapes = function pointShapes (point) {\n var children = this.children;\n var length = children.length;\n var result = QuadRoot$$1.prototype.pointShapes.call(this, point);\n for (var idx = 0; idx < length; idx++) {\n append$1$1(result, children[idx].pointShapes(point));\n }\n return result;\n };\n\n QuadNode.prototype.insert = function insert (shape, bbox) {\n var children = this.children;\n var inserted = false;\n\n if (this.inBounds(bbox)) {\n if (this.shapes.length < 4) {\n this._add(shape, bbox);\n } else {\n if (!children.length) {\n this._initChildren();\n }\n\n for (var idx = 0; idx < children.length; idx++) {\n if (children[idx].insert(shape, bbox)) {\n inserted = true;\n break;\n }\n }\n\n if (!inserted) {\n this._add(shape, bbox);\n }\n }\n inserted = true;\n }\n\n return inserted;\n };\n\n QuadNode.prototype._initChildren = function _initChildren () {\n var ref = this;\n var rect = ref.rect;\n var children = ref.children;\n var center = rect.center();\n var halfWidth = rect.width() / 2;\n var halfHeight = rect.height() / 2;\n\n children.push(\n new QuadNode(new Rect([ rect.origin.x, rect.origin.y ], [ halfWidth, halfHeight ])),\n new QuadNode(new Rect([ center.x, rect.origin.y ], [ halfWidth, halfHeight ])),\n new QuadNode(new Rect([ rect.origin.x, center.y ], [ halfWidth, halfHeight ])),\n new QuadNode(new Rect([ center.x, center.y ], [ halfWidth, halfHeight ]))\n );\n };\n\n return QuadNode;\n }(QuadRoot));\n\n var ROOT_SIZE = 3000;\n var LEVEL_STEP = 10000;\n var MAX_LEVEL = 75;\n\n var ShapesQuadTree = (function (Class$$1) {\n function ShapesQuadTree() {\n Class$$1.call(this);\n\n this.initRoots();\n }\n\n extendStatic(ShapesQuadTree, Class$$1);\n ShapesQuadTree.prototype = Object.create( Class$$1 && Class$$1.prototype );\n ShapesQuadTree.prototype.constructor = ShapesQuadTree;\n ShapesQuadTree.fn = ShapesQuadTree.prototype;\n ShapesQuadTree.fn.init = ShapesQuadTree.fn.constructor;\n\n ShapesQuadTree.prototype.initRoots = function initRoots () {\n this.rootMap = {};\n this.root = new QuadRoot();\n this.rootElements = [];\n };\n\n ShapesQuadTree.prototype.clear = function clear () {\n var this$1$1 = this;\n\n var rootElements = this.rootElements;\n for (var idx = 0; idx < rootElements.length; idx++) {\n this$1$1.remove(rootElements[idx]);\n }\n this.initRoots();\n };\n\n ShapesQuadTree.prototype.pointShape = function pointShape (point) {\n var sectorRoot = ( this.rootMap[ Math.floor( point.x / ROOT_SIZE ) ] || {} )[ Math.floor( point.y / ROOT_SIZE ) ];\n var result = this.root.pointShapes(point);\n\n if (sectorRoot) {\n result = result.concat(sectorRoot.pointShapes(point));\n }\n\n this.assignZindex(result);\n\n result.sort(zIndexComparer);\n for (var idx = 0; idx < result.length; idx++) {\n if (result[idx].containsPoint(point)) {\n return result[idx];\n }\n }\n };\n\n ShapesQuadTree.prototype.assignZindex = function assignZindex (elements) {\n var this$1$1 = this;\n\n for (var idx = 0; idx < elements.length; idx++) {\n var element = elements[idx];\n var zIndex = 0;\n var levelWeight = Math.pow(LEVEL_STEP, MAX_LEVEL);\n var parents = [];\n\n while (element) {\n parents.push(element);\n element = element.parent;\n }\n\n while (parents.length) {\n element = parents.pop();\n zIndex += ((element.parent ? element.parent.children : this$1$1.rootElements).indexOf(element) + 1) * levelWeight;\n levelWeight /= LEVEL_STEP;\n }\n\n elements[idx]._zIndex = zIndex;\n }\n };\n\n ShapesQuadTree.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"transform\" || e.field === \"stroke.width\") {\n this.bboxChange(e.element);\n }\n };\n\n ShapesQuadTree.prototype.geometryChange = function geometryChange (e) {\n this.bboxChange(e.element);\n };\n\n ShapesQuadTree.prototype.bboxChange = function bboxChange (element) {\n var this$1$1 = this;\n\n if (element.nodeType === \"Group\") {\n for (var idx = 0; idx < element.children.length; idx++) {\n this$1$1.bboxChange(element.children[idx]);\n }\n } else {\n if (element._quadNode) {\n element._quadNode.remove(element);\n }\n this._insertShape(element);\n }\n };\n\n ShapesQuadTree.prototype.add = function add (elements) {\n var elementsArray = Array.isArray(elements) ? elements.slice(0) : [ elements ];\n\n append$1$1(this.rootElements, elementsArray);\n this._insert(elementsArray);\n };\n\n ShapesQuadTree.prototype.childrenChange = function childrenChange (e) {\n var this$1$1 = this;\n\n if (e.action === \"remove\") {\n for (var idx = 0; idx < e.items.length; idx++) {\n this$1$1.remove(e.items[idx]);\n }\n } else {\n this._insert(Array.prototype.slice.call(e.items, 0));\n }\n };\n\n ShapesQuadTree.prototype._insert = function _insert (elements) {\n var this$1$1 = this;\n\n var element;\n\n while (elements.length > 0) {\n element = elements.pop();\n element.addObserver(this$1$1);\n if (element.nodeType === \"Group\") {\n append$1$1(elements, element.children);\n } else {\n this$1$1._insertShape(element);\n }\n }\n };\n\n ShapesQuadTree.prototype._insertShape = function _insertShape (shape) {\n var bbox = shape.bbox();\n if (bbox) {\n var sectors = this.getSectors(bbox);\n var x = sectors[0][0];\n var y = sectors[1][0];\n\n if (this.inRoot(sectors)) {\n this.root.insert(shape, bbox);\n } else {\n var rootMap = this.rootMap;\n if (!rootMap[x]) {\n rootMap[x] = {};\n }\n\n if (!rootMap[x][y]) {\n rootMap[x][y] = new QuadNode(\n new Rect([ x * ROOT_SIZE, y * ROOT_SIZE ], [ ROOT_SIZE, ROOT_SIZE ])\n );\n }\n\n rootMap[x][y].insert(shape, bbox);\n }\n }\n };\n\n ShapesQuadTree.prototype.remove = function remove (element) {\n var this$1$1 = this;\n\n element.removeObserver(this);\n\n if (element.nodeType === \"Group\") {\n var children = element.children;\n for (var idx = 0; idx < children.length; idx++) {\n this$1$1.remove(children[idx]);\n }\n } else if (element._quadNode) {\n element._quadNode.remove(element);\n delete element._quadNode;\n }\n };\n\n ShapesQuadTree.prototype.inRoot = function inRoot (sectors) {\n return sectors[0].length > 1 || sectors[1].length > 1;\n };\n\n ShapesQuadTree.prototype.getSectors = function getSectors (rect) {\n var bottomRight = rect.bottomRight();\n var bottomX = Math.floor(bottomRight.x / ROOT_SIZE);\n var bottomY = Math.floor(bottomRight.y / ROOT_SIZE);\n var sectors = [ [], [] ];\n for (var x = Math.floor(rect.origin.x / ROOT_SIZE); x <= bottomX; x++) {\n sectors[0].push(x);\n }\n for (var y = Math.floor(rect.origin.y / ROOT_SIZE); y <= bottomY; y++) {\n sectors[1].push(y);\n }\n return sectors;\n };\n\n return ShapesQuadTree;\n }(Class));\n\n function zIndexComparer(x1, x2) {\n if (x1._zIndex < x2._zIndex) {\n return 1;\n }\n if (x1._zIndex > x2._zIndex) {\n return -1;\n }\n\n return 0;\n }\n\n var SurfaceCursor = function SurfaceCursor(surface) {\n surface.bind(\"mouseenter\", this._mouseenter.bind(this));\n surface.bind(\"mouseleave\", this._mouseleave.bind(this));\n\n this.element = surface.element;\n };\n\n SurfaceCursor.prototype.clear = function clear () {\n this._resetCursor();\n };\n\n SurfaceCursor.prototype.destroy = function destroy () {\n this._resetCursor();\n delete this.element;\n };\n\n SurfaceCursor.prototype._mouseenter = function _mouseenter (e) {\n var cursor = this._shapeCursor(e);\n\n if (!cursor) {\n this._resetCursor();\n } else {\n if (!this._current) {\n this._defaultCursor = this._getCursor();\n }\n\n this._setCursor(cursor);\n }\n };\n\n SurfaceCursor.prototype._mouseleave = function _mouseleave () {\n this._resetCursor();\n };\n\n SurfaceCursor.prototype._shapeCursor = function _shapeCursor (e) {\n var shape = e.element;\n\n while (shape && !defined(shape.options.cursor)) {\n shape = shape.parent;\n }\n\n if (shape) {\n return shape.options.cursor;\n }\n };\n\n SurfaceCursor.prototype._getCursor = function _getCursor () {\n if (this.element) {\n return this.element.style.cursor;\n }\n };\n\n SurfaceCursor.prototype._setCursor = function _setCursor (cursor) {\n if (this.element) {\n this.element.style.cursor = cursor;\n this._current = cursor;\n }\n };\n\n SurfaceCursor.prototype._resetCursor = function _resetCursor () {\n if (this._current) {\n this._setCursor(this._defaultCursor || \"\");\n delete this._current;\n }\n };\n\n function addGradientStops(gradient, stops) {\n for (var idx = 0; idx < stops.length; idx++) {\n var stop = stops[idx];\n var color = kendo.parseColor(stop.color());\n\n color.a *= stop.opacity();\n\n gradient.addColorStop(stop.offset(), color.toCssRgba());\n }\n }\n\n var PathNode$2 = (function (Node) {\n function PathNode () {\n Node.apply(this, arguments);\n }\n\n extendStatic(PathNode, Node);\n PathNode.prototype = Object.create( Node && Node.prototype );\n PathNode.prototype.constructor = PathNode;\n PathNode.fn = PathNode.prototype;\n PathNode.fn.init = PathNode.fn.constructor;\n\n PathNode.prototype.renderTo = function renderTo (ctx) {\n ctx.save();\n\n this.setTransform(ctx);\n this.setClip(ctx);\n this.setOpacity(ctx);\n\n ctx.beginPath();\n\n this.renderPoints(ctx, this.srcElement);\n\n this.setLineDash(ctx);\n this.setLineCap(ctx);\n this.setLineJoin(ctx);\n\n this.setFill(ctx);\n this.setStroke(ctx);\n\n ctx.restore();\n };\n\n PathNode.prototype.setFill = function setFill (ctx) {\n var fill = this.srcElement.options.fill;\n var hasFill = false;\n\n if (fill) {\n if (fill.nodeType === \"Gradient\") {\n this.setGradientFill(ctx, fill);\n hasFill = true;\n } else if (!isTransparent(fill.color)) {\n ctx.fillStyle = fill.color;\n\n ctx.save();\n this.globalAlpha(ctx, fill.opacity);\n ctx.fill();\n ctx.restore();\n\n hasFill = true;\n }\n }\n\n return hasFill;\n };\n\n PathNode.prototype.setGradientFill = function setGradientFill (ctx, fill) {\n var bbox = this.srcElement.rawBBox();\n var gradient;\n\n if (fill instanceof LinearGradient) {\n var start = fill.start();\n var end = fill.end();\n gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y);\n } else if (fill instanceof RadialGradient) {\n var center = fill.center();\n gradient = ctx.createRadialGradient(center.x, center.y, 0, center.x, center.y, fill.radius());\n }\n\n addGradientStops(gradient, fill.stops);\n\n ctx.save();\n\n if (!fill.userSpace()) {\n ctx.transform(bbox.width(), 0, 0, bbox.height(), bbox.origin.x, bbox.origin.y);\n }\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.restore();\n };\n\n PathNode.prototype.setStroke = function setStroke (ctx) {\n var stroke = this.srcElement.options.stroke;\n if (stroke && !isTransparent(stroke.color) && stroke.width > 0) {\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = valueOrDefault(stroke.width, 1);\n\n ctx.save();\n this.globalAlpha(ctx, stroke.opacity);\n ctx.stroke();\n ctx.restore();\n\n return true;\n }\n };\n\n PathNode.prototype.dashType = function dashType () {\n var stroke = this.srcElement.options.stroke;\n if (stroke && stroke.dashType) {\n return stroke.dashType.toLowerCase();\n }\n };\n\n PathNode.prototype.setLineDash = function setLineDash (ctx) {\n var dashType = this.dashType();\n if (dashType && dashType !== SOLID) {\n var dashArray = DASH_ARRAYS[dashType];\n if (ctx.setLineDash) {\n ctx.setLineDash(dashArray);\n } else {\n ctx.mozDash = dashArray;\n ctx.webkitLineDash = dashArray;\n }\n }\n };\n\n PathNode.prototype.setLineCap = function setLineCap (ctx) {\n var dashType = this.dashType();\n var stroke = this.srcElement.options.stroke;\n if (dashType && dashType !== SOLID) {\n ctx.lineCap = BUTT;\n } else if (stroke && stroke.lineCap) {\n ctx.lineCap = stroke.lineCap;\n }\n };\n\n PathNode.prototype.setLineJoin = function setLineJoin (ctx) {\n var stroke = this.srcElement.options.stroke;\n if (stroke && stroke.lineJoin) {\n ctx.lineJoin = stroke.lineJoin;\n }\n };\n\n PathNode.prototype.renderPoints = function renderPoints (ctx, path) {\n renderPath(ctx, path);\n };\n\n return PathNode;\n }(Node$2));\n\n var ArcNode$2 = (function (PathNode) {\n function ArcNode () {\n PathNode.apply(this, arguments);\n }\n\n extendStatic(ArcNode, PathNode);\n ArcNode.prototype = Object.create( PathNode && PathNode.prototype );\n ArcNode.prototype.constructor = ArcNode;\n ArcNode.fn = ArcNode.prototype;\n ArcNode.fn.init = ArcNode.fn.constructor;\n\n ArcNode.prototype.renderPoints = function renderPoints (ctx) {\n var path = this.srcElement.toPath();\n renderPath(ctx, path);\n };\n\n return ArcNode;\n }(PathNode$2));\n\n var CircleNode$2 = (function (PathNode) {\n function CircleNode () {\n PathNode.apply(this, arguments);\n }\n\n extendStatic(CircleNode, PathNode);\n CircleNode.prototype = Object.create( PathNode && PathNode.prototype );\n CircleNode.prototype.constructor = CircleNode;\n CircleNode.fn = CircleNode.prototype;\n CircleNode.fn.init = CircleNode.fn.constructor;\n\n CircleNode.prototype.renderPoints = function renderPoints (ctx) {\n var ref = this.srcElement.geometry();\n var center = ref.center;\n var radius = ref.radius;\n\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n };\n\n return CircleNode;\n }(PathNode$2));\n\n var ImageNode$2 = (function (PathNode) {\n function ImageNode(srcElement, cors) {\n PathNode.call(this, srcElement);\n\n this.onLoad = this.onLoad.bind(this);\n this.onError = this.onError.bind(this);\n\n this.loading = createPromise();\n\n var img = this.img = new Image();\n var src = srcElement.src();\n\n if (cors && !(/^data:/i.test(src))) {\n img.crossOrigin = cors;\n }\n\n if (src) {\n img.src = src;\n }\n\n if (img.complete) {\n this.onLoad();\n } else {\n img.onload = this.onLoad;\n img.onerror = this.onError;\n }\n }\n\n extendStatic(ImageNode, PathNode);\n ImageNode.prototype = Object.create( PathNode && PathNode.prototype );\n ImageNode.prototype.constructor = ImageNode;\n ImageNode.fn = ImageNode.prototype;\n ImageNode.fn.init = ImageNode.fn.constructor;\n\n ImageNode.prototype.renderTo = function renderTo (ctx) {\n if (this.loading.state() === \"resolved\") {\n ctx.save();\n\n this.setTransform(ctx);\n this.setClip(ctx);\n\n this.drawImage(ctx);\n\n ctx.restore();\n }\n };\n\n ImageNode.prototype.optionsChange = function optionsChange (e) {\n if (e.field === \"src\") {\n this.loading = createPromise();\n this.img.src = this.srcElement.src();\n } else {\n PathNode.prototype.optionsChange.call(this, e);\n }\n };\n\n ImageNode.prototype.onLoad = function onLoad () {\n this.loading.resolve();\n this.invalidate();\n };\n\n ImageNode.prototype.onError = function onError () {\n this.loading.reject(new Error(\n \"Unable to load image '\" + this.img.src +\n \"'. Check for connectivity and verify CORS headers.\"\n ));\n };\n\n ImageNode.prototype.drawImage = function drawImage (ctx) {\n var rect = this.srcElement.rect();\n var topLeft = rect.topLeft();\n\n ctx.drawImage(\n this.img, topLeft.x, topLeft.y, rect.width(), rect.height()\n );\n };\n\n return ImageNode;\n }(PathNode$2));\n\n var MultiPathNode$2 = (function (PathNode) {\n function MultiPathNode () {\n PathNode.apply(this, arguments);\n }\n\n extendStatic(MultiPathNode, PathNode);\n MultiPathNode.prototype = Object.create( PathNode && PathNode.prototype );\n MultiPathNode.prototype.constructor = MultiPathNode;\n MultiPathNode.fn = MultiPathNode.prototype;\n MultiPathNode.fn.init = MultiPathNode.fn.constructor;\n\n MultiPathNode.prototype.renderPoints = function renderPoints (ctx) {\n var paths = this.srcElement.paths;\n for (var i = 0; i < paths.length; i++) {\n renderPath(ctx, paths[i]);\n }\n };\n\n return MultiPathNode;\n }(PathNode$2));\n\n var RectNode$2 = (function (PathNode) {\n function RectNode () {\n PathNode.apply(this, arguments);\n }\n\n extendStatic(RectNode, PathNode);\n RectNode.prototype = Object.create( PathNode && PathNode.prototype );\n RectNode.prototype.constructor = RectNode;\n RectNode.fn = RectNode.prototype;\n RectNode.fn.init = RectNode.fn.constructor;\n\n RectNode.prototype.renderPoints = function renderPoints (ctx) {\n var geometry = this.srcElement.geometry();\n var ref = geometry.cornerRadius;\n var rx = ref[0];\n var ry = ref[1];\n\n if (rx === 0 && ry === 0) {\n var origin = geometry.origin;\n var size = geometry.size;\n ctx.rect(origin.x, origin.y, size.width, size.height);\n } else {\n PathNode.prototype.renderPoints.call(this, ctx, Path.fromRect(geometry));\n }\n };\n\n return RectNode;\n }(PathNode$2));\n\n var TextNode$2 = (function (PathNode) {\n function TextNode () {\n PathNode.apply(this, arguments);\n }\n\n extendStatic(TextNode, PathNode);\n TextNode.prototype = Object.create( PathNode && PathNode.prototype );\n TextNode.prototype.constructor = TextNode;\n TextNode.fn = TextNode.prototype;\n TextNode.fn.init = TextNode.fn.constructor;\n\n TextNode.prototype.renderTo = function renderTo (ctx) {\n var text = this.srcElement;\n var pos = text.position();\n var size = text.measure();\n\n ctx.save();\n\n this.setTransform(ctx);\n this.setClip(ctx);\n this.setOpacity(ctx);\n\n ctx.beginPath();\n\n ctx.font = text.options.font;\n ctx.textAlign = 'left';\n\n if (this.setFill(ctx)) {\n ctx.fillText(text.content(), pos.x, pos.y + size.baseline);\n }\n\n if (this.setStroke(ctx)) {\n this.setLineDash(ctx);\n ctx.strokeText(text.content(), pos.x, pos.y + size.baseline);\n }\n\n ctx.restore();\n };\n\n return TextNode;\n }(PathNode$2));\n\n NODE_MAP$2.Arc = ArcNode$2;\n NODE_MAP$2.Circle = CircleNode$2;\n NODE_MAP$2.Group = GroupNode$2;\n NODE_MAP$2.Image = ImageNode$2;\n NODE_MAP$2.MultiPath = MultiPathNode$2;\n NODE_MAP$2.Path = PathNode$2;\n NODE_MAP$2.Rect = RectNode$2;\n NODE_MAP$2.Text = TextNode$2;\n\n var Surface$4 = (function (BaseSurface) {\n function Surface(element, options) {\n BaseSurface.call(this, element, options);\n\n this.element.innerHTML = this._template(this);\n\n var canvas = this.element.firstElementChild;\n var size = elementSize(element);\n\n canvas.width = size.width;\n canvas.height = size.height;\n\n this._rootElement = canvas;\n\n this._root = new RootNode$2(canvas, size);\n\n this._mouseTrackHandler = this._trackMouse.bind(this);\n\n bindEvents(this.element, {\n click: this._mouseTrackHandler,\n mousemove: this._mouseTrackHandler\n });\n }\n\n extendStatic(Surface, BaseSurface);\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\n Surface.prototype.constructor = Surface;\n Surface.fn = Surface.prototype;\n Surface.fn.init = Surface.fn.constructor;\n\n var prototypeAccessors = { type: {} };\n\n prototypeAccessors.type.get = function () {\n return \"canvas\";\n };\n\n Surface.prototype.destroy = function destroy () {\n BaseSurface.prototype.destroy.call(this);\n\n if (this._root) {\n this._root.destroy();\n this._root = null;\n }\n\n if (this._searchTree) {\n this._searchTree.clear();\n delete this._searchTree;\n }\n\n if (this._cursor) {\n this._cursor.destroy();\n delete this._cursor;\n }\n\n unbindEvents(this.element, {\n click: this._mouseTrackHandler,\n mousemove: this._mouseTrackHandler\n });\n };\n\n Surface.prototype.draw = function draw (element) {\n BaseSurface.prototype.draw.call(this, element);\n this._root.load([ element ], undefined, this.options.cors);\n\n if (this._searchTree) {\n this._searchTree.add([ element ]);\n }\n };\n\n Surface.prototype.clear = function clear () {\n BaseSurface.prototype.clear.call(this);\n this._root.clear();\n\n if (this._searchTree) {\n this._searchTree.clear();\n }\n\n if (this._cursor) {\n this._cursor.clear();\n }\n };\n\n Surface.prototype.eventTarget = function eventTarget (e) {\n if (this._searchTree) {\n var point = this._surfacePoint(e);\n var shape = this._searchTree.pointShape(point);\n return shape;\n }\n };\n\n Surface.prototype.image = function image () {\n var ref = this;\n var root = ref._root;\n var rootElement = ref._rootElement;\n var loadingStates = [];\n\n root.traverse(function (childNode) {\n if (childNode.loading) {\n loadingStates.push(childNode.loading);\n }\n });\n\n var promise = createPromise();\n var resolveDataURL = function () {\n root._invalidate({ fixedScale: true });\n\n try {\n var data = rootElement.toDataURL();\n promise.resolve(data);\n } catch (e) {\n promise.reject(e);\n }\n };\n\n promiseAll(loadingStates).then(resolveDataURL, resolveDataURL);\n\n return promise;\n };\n\n Surface.prototype.suspendTracking = function suspendTracking () {\n BaseSurface.prototype.suspendTracking.call(this);\n if (this._searchTree) {\n this._searchTree.clear();\n delete this._searchTree;\n }\n };\n\n Surface.prototype.resumeTracking = function resumeTracking () {\n BaseSurface.prototype.resumeTracking.call(this);\n if (!this._searchTree) {\n this._searchTree = new ShapesQuadTree();\n\n var childNodes = this._root.childNodes;\n var rootElements = [];\n for (var idx = 0; idx < childNodes.length; idx++) {\n rootElements.push(childNodes[idx].srcElement);\n }\n this._searchTree.add(rootElements);\n }\n };\n\n Surface.prototype._resize = function _resize () {\n this._rootElement.width = this._size.width;\n this._rootElement.height = this._size.height;\n\n this._root.size = this._size;\n this._root.invalidate();\n };\n\n Surface.prototype._template = function _template () {\n return \"\";\n };\n\n Surface.prototype._enableTracking = function _enableTracking () {\n this._searchTree = new ShapesQuadTree();\n this._cursor = new SurfaceCursor(this);\n\n BaseSurface.prototype._enableTracking.call(this);\n };\n\n Surface.prototype._trackMouse = function _trackMouse (e) {\n if (this._suspendedTracking) {\n return;\n }\n\n var shape = this.eventTarget(e);\n\n if (e.type !== \"click\") {\n var currentShape = this._currentShape;\n if (currentShape && currentShape !== shape) {\n this.trigger(\"mouseleave\", {\n element: currentShape,\n originalEvent: e,\n type: \"mouseleave\"\n });\n }\n\n if (shape && currentShape !== shape) {\n this.trigger(\"mouseenter\", {\n element: shape,\n originalEvent: e,\n type: \"mouseenter\"\n });\n }\n\n this.trigger(\"mousemove\", {\n element: shape,\n originalEvent: e,\n type: \"mousemove\"\n });\n\n this._currentShape = shape;\n } else if (shape) {\n this.trigger(\"click\", {\n element: shape,\n originalEvent: e,\n type: \"click\"\n });\n }\n };\n\n Object.defineProperties( Surface.prototype, prototypeAccessors );\n\n return Surface;\n }(Surface$2));\n\n var instance$2;\n var support$1;\n\n var hasDocument = function () { return typeof document !== \"undefined\"; };\n\n var supportsCanvas = function () { return hasDocument() &&\n document.createElement(\"canvas\").getContext; };\n\n var supportsSVG = function () { return hasDocument() &&\n document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\"); };\n\n var SurfaceFactory = (function (Class$$1) {\n function SurfaceFactory() {\n Class$$1.call(this);\n\n this._items = [ {\n name: \"svg\",\n type: Surface$3\n }, {\n name: \"canvas\",\n type: Surface$4\n } ];\n }\n\n extendStatic(SurfaceFactory, Class$$1);\n SurfaceFactory.prototype = Object.create( Class$$1 && Class$$1.prototype );\n SurfaceFactory.prototype.constructor = SurfaceFactory;\n SurfaceFactory.fn = SurfaceFactory.prototype;\n SurfaceFactory.fn.init = SurfaceFactory.fn.constructor;\n\n var staticAccessors = { support: {},current: {} };\n\n staticAccessors.support.get = function () {\n if (!support$1) {\n support$1 = {\n canvas: supportsCanvas(),\n svg: supportsSVG()\n };\n }\n\n return support$1;\n };\n\n staticAccessors.current.get = function () {\n if (!instance$2) {\n instance$2 = new SurfaceFactory();\n }\n\n return instance$2;\n };\n\n SurfaceFactory.prototype.create = function create (element, options) {\n var items = this._items;\n var match = items[0];\n\n if (options && options.type) {\n var preferred = options.type.toLowerCase();\n for (var i = 0; i < items.length; i++) {\n if (items[i].name === preferred) {\n match = items[i];\n break;\n }\n }\n }\n\n if (match) {\n return new match.type(element, options);\n }\n\n kendo.logToConsole(\n \"Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\\n\" +\n \"- The browser does not support SVG and Canvas. User agent: \" + (navigator.userAgent));\n };\n\n Object.defineProperties( SurfaceFactory, staticAccessors );\n\n return SurfaceFactory;\n }(Class));\n\n var Surface = (function (BaseSurface) {\n function Surface () {\n BaseSurface.apply(this, arguments);\n }\n\n extendStatic(Surface, BaseSurface);\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\n Surface.prototype.constructor = Surface;\n Surface.fn = Surface.prototype;\n Surface.fn.init = Surface.fn.constructor;\n\n var staticAccessors = { support: {} };\n\n staticAccessors.support.get = function () {\n return SurfaceFactory.support;\n };\n\n Surface.create = function create (element, options) {\n return SurfaceFactory.current.create(element, options);\n };\n\n Object.defineProperties( Surface, staticAccessors );\n\n return Surface;\n }(Surface$2));\n\n function exportGroup(group) {\n var root = new RootNode({\n skipBaseHref: true\n });\n var bbox = group.clippedBBox();\n var rootGroup = group;\n\n if (bbox) {\n var origin = bbox.getOrigin();\n var exportRoot = new Group();\n exportRoot.transform(transform$1().translate(-origin.x, -origin.y));\n exportRoot.children.push(group);\n rootGroup = exportRoot;\n }\n\n root.load([ rootGroup ]);\n\n var svg = \"\" + (root.render()) + \"\";\n\n root.destroy();\n\n return svg;\n }\n\n var svg$1 = {\n \tSurface: Surface$3,\n \tRootNode: RootNode,\n \tNode: Node,\n \tGroupNode: GroupNode,\n \tArcNode: ArcNode,\n \tCircleNode: CircleNode,\n \tRectNode: RectNode,\n \tImageNode: ImageNode,\n \tTextNode: TextNode,\n \tPathNode: PathNode,\n \tMultiPathNode: MultiPathNode,\n \tDefinitionNode: DefinitionNode,\n \tClipNode: ClipNode,\n \tGradientStopNode: GradientStopNode,\n \tLinearGradientNode: LinearGradientNode,\n \tRadialGradientNode: RadialGradientNode,\n \texportGroup: exportGroup\n };\n\n var canvas = {\n \tSurface: Surface$4,\n \tRootNode: RootNode$2,\n \tNode: Node$2,\n \tGroupNode: GroupNode$2,\n \tArcNode: ArcNode$2,\n \tCircleNode: CircleNode$2,\n \tRectNode: RectNode$2,\n \tImageNode: ImageNode$2,\n \tTextNode: TextNode$2,\n \tPathNode: PathNode$2,\n \tMultiPathNode: MultiPathNode$2\n };\n\n function exportImage(group, options) {\n var defaults = {\n width: \"800px\", height: \"600px\",\n cors: \"Anonymous\"\n };\n\n var exportRoot = group;\n var bbox = group.clippedBBox();\n\n if (bbox) {\n var origin = bbox.getOrigin();\n exportRoot = new Group();\n exportRoot.transform(transform$1().translate(-origin.x, -origin.y));\n exportRoot.children.push(group);\n\n var size = bbox.getSize();\n defaults.width = size.width + \"px\";\n defaults.height = size.height + \"px\";\n }\n\n var surfaceOptions = $.extend(defaults, options);\n\n var container = document.createElement(\"div\");\n var style = container.style;\n\n style.display = \"none\";\n style.width = surfaceOptions.width;\n style.height = surfaceOptions.height;\n document.body.appendChild(container);\n\n var surface = new Surface$4(container, surfaceOptions);\n surface.suspendTracking();\n surface.draw(exportRoot);\n\n var promise = surface.image();\n var destroy = function () {\n surface.destroy();\n document.body.removeChild(container);\n };\n promise.then(destroy, destroy);\n\n return promise;\n }\n\n function exportSVG(group, options) {\n var svg = exportGroup(group);\n\n if (!options || !options.raw) {\n svg = \"data:image/svg+xml;base64,\" + encodeBase64(svg);\n }\n\n return createPromise().resolve(svg);\n }\n\n /* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\n /* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\n /* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty, yoda */\n /* eslint-disable no-param-reassign, no-var, block-scoped-var */\n\n var browser = supportBrowser || {};\n /*\n\n XXX: to test:\n\n - cloneNodes function:\n - drawing document containing canvas with page breaking\n - drawing document with named radio -s (should not clear selection)\n - IE9/IE10 don't support el.dataset; do they copy user data?\n\n - repeating table headers/footers on page breaking\n\n - forceBreak, keepTogether\n\n - avoidLinks\n\n */\n\n /* -----[ local vars ]----- */\n\n function slice$1$1(thing) {\n return Array.prototype.slice.call(thing);\n }\n\n var KENDO_PSEUDO_ELEMENT = \"KENDO-PSEUDO-ELEMENT\";\n\n var IMAGE_CACHE = {};\n\n var nodeInfo = {};\n nodeInfo._root = nodeInfo;\n\n /* -----[ Custom Text node to speed up rendering in kendo.pdf ]----- */\n\n var inBrowser = typeof window !== 'undefined';\n var microsoft = inBrowser ? browser.msie || browser.edge : false;\n\n var TextRect = (function (Text$$1) {\n function TextRect(str, rect, options) {\n Text$$1.call(this, str, rect.getOrigin(), options);\n this._pdfRect = rect;\n }\n\n extendStatic(TextRect, Text$$1);\n TextRect.prototype = Object.create( Text$$1 && Text$$1.prototype );\n TextRect.prototype.constructor = TextRect;\n TextRect.fn = TextRect.prototype;\n TextRect.fn.init = TextRect.fn.constructor;\n TextRect.prototype.rect = function rect () {\n // this is the crux of it: we can avoid a call to\n // measure(), which is what the base class does, since we\n // already know the rect. measure() is s-l-o-w.\n return this._pdfRect;\n };\n TextRect.prototype.rawBBox = function rawBBox () {\n // also let's avoid creating a new rectangle.\n return this._pdfRect;\n };\n\n return TextRect;\n }(Text));\n\n function addClass(el, cls) {\n if (el.classList) {\n el.classList.add(cls);\n } else {\n el.className += \" \" + cls;\n }\n }\n\n function removeClass(el, cls) {\n if (el.classList) {\n el.classList.remove(cls);\n } else {\n el.className = el.className.split(/\\s+/).reduce(function(a, word){\n if (word != cls) {\n a.push(word);\n }\n return a;\n }, []).join(\" \");\n }\n }\n\n function setCSS(el, styles) {\n Object.keys(styles).forEach(function(key){\n el.style[key] = styles[key];\n });\n }\n\n var matches = typeof Element !== \"undefined\" && Element.prototype && (function(p){\n if (p.matches) {\n return function(el, selector) { return el.matches(selector); };\n }\n if (p.webkitMatchesSelector) {\n return function(el, selector) { return el.webkitMatchesSelector(selector); };\n }\n if (p.mozMatchesSelector) {\n return function(el, selector) { return el.mozMatchesSelector(selector); };\n }\n if (p.msMatchesSelector) {\n return function(el, selector) { return el.msMatchesSelector(selector); };\n }\n return function(s) {\n \treturn [].indexOf.call(document.querySelectorAll(s), this) !== -1;\n };\n })(Element.prototype);\n\n function closest(el, selector) {\n if (el.closest) {\n return el.closest(selector);\n }\n // IE: stringifying rather than simply comparing with `document`,\n // which is not iframe-proof and fails in editor export —\n // https://github.com/telerik/kendo/issues/6721\n while (el && !/^\\[object (?:HTML)?Document\\]$/.test(String(el))) {\n if (el.nodeType == 1 /* Element */ && matches(el, selector)) {\n return el;\n }\n el = el.parentNode;\n }\n }\n\n // clone nodes ourselves, so that we redraw (DOM or\n // jQuery clone will not)\n var cloneNodes = (function($){\n if ($) {\n // if we have Kendo and jQuery, use this version as it will\n // maintain proper links between cloned element and Kendo\n // widgets (i.e. it clones jQuery data(), which isn't the same\n // as element's data attributes).\n // https://github.com/telerik/kendo-ui-core/issues/2750\n return function cloneNodes(el) {\n var clone = el.cloneNode(false);\n if (el.nodeType == 1 /* Element */) {\n var $el = $(el), $clone = $(clone), i;\n var data = $el.data();\n for (i in data) {\n $clone.data(i, data[i]);\n }\n if (/^canvas$/i.test(el.tagName)) {\n clone.getContext(\"2d\").drawImage(el, 0, 0);\n } else if (/^(?:input|select|textarea|option)$/i.test(el.tagName)) {\n // drop the name attributes so that we don't affect the selection of the\n // original nodes (i.e. checked status of radio buttons) when we insert our copy\n // into the DOM. https://github.com/telerik/kendo/issues/5409\n clone.removeAttribute(\"id\");\n clone.removeAttribute(\"name\");\n if (!/^textarea$/i.test(el.tagName)) {\n clone.value = el.value;\n }\n clone.checked = el.checked;\n clone.selected = el.selected;\n }\n for (i = el.firstChild; i; i = i.nextSibling) {\n clone.appendChild(cloneNodes(i));\n }\n }\n return clone;\n };\n } else {\n // the no-jQuery version\n return function cloneNodes(el) {\n var clone = (function dive(node){\n var clone = node.cloneNode(false);\n if (node._kendoExportVisual) {\n clone._kendoExportVisual = node._kendoExportVisual;\n }\n for (var i = node.firstChild; i; i = i.nextSibling) {\n clone.appendChild(dive(i));\n }\n return clone;\n })(el);\n\n // re-draw canvases - https://github.com/telerik/kendo/issues/4872\n var canvases = el.querySelectorAll(\"canvas\");\n if (canvases.length) {\n slice$1$1(clone.querySelectorAll(\"canvas\")).forEach(function (canvas$$1, i) {\n canvas$$1.getContext(\"2d\").drawImage(canvases[i], 0, 0);\n });\n }\n\n // remove \"name\" attributes from elements -\n // https://github.com/telerik/kendo/issues/5409\n var orig = el.querySelectorAll(\"input, select, textarea, option\");\n slice$1$1(clone.querySelectorAll(\"input, select, textarea, option\")).forEach(function (el, i) {\n el.removeAttribute(\"id\");\n el.removeAttribute(\"name\");\n if (!/^textarea$/i.test(el.tagName)) {\n el.value = orig[i].value;\n }\n el.checked = orig[i].checked;\n el.selected = orig[i].selected;\n });\n\n return clone;\n };\n }\n })(typeof window !== \"undefined\" && window.kendo && window.kendo.jQuery);\n\n function getXY(thing) {\n if (typeof thing == \"number\") {\n return { x: thing, y: thing };\n }\n if (Array.isArray(thing)) {\n return { x: thing[0], y: thing[1] };\n }\n return { x: thing.x, y: thing.y };\n }\n\n function drawDOM(element, options) {\n if (!options) {\n options = {};\n }\n var promise = createPromise();\n\n if (!element) {\n return promise.reject(\"No element to export\");\n }\n\n if (typeof window.getComputedStyle != \"function\") {\n throw new Error(\"window.getComputedStyle is missing. You are using an unsupported browser, or running in IE8 compatibility mode. Drawing HTML is supported in Chrome, Firefox, Safari and IE9+.\");\n }\n\n kendo.pdf.defineFont(getFontFaces(element.ownerDocument));\n\n var scale = getXY(options.scale || 1);\n\n function doOne(element) {\n var group = new Group();\n\n // translate to start of page\n var pos = element.getBoundingClientRect();\n setTransform$1(group, [\n scale.x,\n 0,\n 0,\n scale.y,\n (-pos.left * scale.x),\n (-pos.top * scale.y)\n ]);\n\n nodeInfo._clipbox = false;\n nodeInfo._matrix = Matrix.unit();\n nodeInfo._stackingContext = {\n element: element,\n group: group\n };\n\n if (options.avoidLinks === true) {\n nodeInfo._avoidLinks = \"a\";\n } else {\n nodeInfo._avoidLinks = options.avoidLinks;\n }\n\n addClass(element, \"k-pdf-export\");\n renderElement(element, group);\n removeClass(element, \"k-pdf-export\");\n\n return group;\n }\n\n cacheImages([ element ], function(){\n var forceBreak = options && options.forcePageBreak;\n var hasPaperSize = options && options.paperSize && options.paperSize != \"auto\";\n var paperOptions = kendo.pdf.getPaperOptions(function(key, def){\n if (key == \"paperSize\") {\n // PDF.getPaperOptions croaks on \"auto\", just pass dummy A4 as we might\n // still be interested in margins.\n return hasPaperSize ? options[key] : \"A4\";\n }\n return key in options ? options[key] : def;\n });\n var pageWidth = hasPaperSize && paperOptions.paperSize[0];\n var pageHeight = hasPaperSize && paperOptions.paperSize[1];\n var margin = options.margin && paperOptions.margin;\n var hasMargin = Boolean(margin);\n if (forceBreak || pageHeight) {\n if (!margin) {\n margin = { left: 0, top: 0, right: 0, bottom: 0 };\n }\n\n // we want paper size and margin to be unaffected by\n // scaling in the output, so we have to reverse-scale\n // before our calculations begin.\n if (pageWidth) { pageWidth /= scale.x; }\n if (pageHeight) { pageHeight /= scale.y; }\n margin.left /= scale.x;\n margin.right /= scale.x;\n margin.top /= scale.y;\n margin.bottom /= scale.y;\n\n var group = new Group({\n pdf: {\n multiPage : true,\n paperSize : hasPaperSize ? paperOptions.paperSize : \"auto\",\n _ignoreMargin : hasMargin // HACK! see exportPDF in pdf/drawing.js\n }\n });\n handlePageBreaks(\n function(x) {\n if (options.progress) {\n var canceled = false, pageNum = 0;\n (function next(){\n if (pageNum < x.pages.length) {\n var page = doOne(x.pages[pageNum]);\n group.append(page);\n options.progress({\n page: page,\n pageNum: ++pageNum,\n totalPages: x.pages.length,\n cancel: function() {\n canceled = true;\n }\n });\n if (!canceled) {\n setTimeout(next);\n } else {\n // XXX: should we also fail() the deferred object?\n x.container.parentNode.removeChild(x.container);\n }\n } else {\n x.container.parentNode.removeChild(x.container);\n promise.resolve(group);\n }\n })();\n } else {\n x.pages.forEach(function(page){\n group.append(doOne(page));\n });\n x.container.parentNode.removeChild(x.container);\n promise.resolve(group);\n }\n },\n element,\n forceBreak,\n pageWidth ? pageWidth - margin.left - margin.right : null,\n pageHeight ? pageHeight - margin.top - margin.bottom : null,\n margin,\n options\n );\n } else {\n promise.resolve(doOne(element));\n }\n });\n\n function makeTemplate(template) {\n if (template != null) {\n if (typeof template == \"string\") {\n template = kendo.template(template.replace(/^\\s+|\\s+$/g, \"\"));\n }\n if (typeof template == \"function\") {\n return function(data) {\n var el = template(data);\n if (el && typeof el == \"string\") {\n var div = document.createElement(\"div\");\n div.innerHTML = el;\n el = div.firstElementChild;\n }\n return el;\n };\n }\n // assumed DOM element\n return function() {\n return template.cloneNode(true);\n };\n }\n }\n\n function handlePageBreaks(callback, element, forceBreak, pageWidth, pageHeight, margin, options) {\n var template = makeTemplate(options.template);\n var doc = element.ownerDocument;\n var pages = [];\n var copy = options._destructive ? element : cloneNodes(element);\n var container = doc.createElement(\"KENDO-PDF-DOCUMENT\");\n var adjust = 0;\n\n // make sure elements are at the end (Grid widget\n // places TFOOT before TBODY, tricking our algorithm to\n // insert a page break right after the header).\n // https://github.com/telerik/kendo/issues/4699\n slice$1$1(copy.querySelectorAll(\"tfoot\")).forEach(function(tfoot){\n tfoot.parentNode.appendChild(tfoot);\n });\n\n // remember the index of each LI from an ordered list.\n // we'll use it to reconstruct the proper numbering.\n slice$1$1(copy.querySelectorAll(\"ol\")).forEach(function(ol){\n slice$1$1(ol.children).forEach(function(li, index){\n li.setAttribute(\"kendo-split-index\", index);\n });\n });\n\n setCSS(container, {\n display : \"block\",\n position : \"absolute\",\n boxSizing : \"content-box\",\n left : \"-10000px\",\n top : \"-10000px\"\n });\n\n if (pageWidth) {\n // subtle: if we don't set the width *and* margins here, the layout in this\n // container will be different from the one in our final page elements, and we'll\n // split at the wrong places.\n setCSS(container, {\n width : pageWidth + \"px\",\n paddingLeft : margin.left + \"px\",\n paddingRight : margin.right + \"px\"\n });\n\n // when the first element has a margin-top (i.e. a

) the page will be\n // inadvertently enlarged by that number (the browser will report the container's\n // bounding box top to start at the element's top, rather than including its\n // margin). Adding overflow: hidden seems to fix it.\n //\n // to understand the difference, try the following snippets in your browser:\n //\n // 1.
\n //

Foo

\n //
\n //\n // 2.
\n //

Foo

\n //
\n //\n // this detail is not important when automatic page breaking is not requested, hence\n // doing it only if pageWidth is defined.\n setCSS(copy, { overflow: \"hidden\" });\n }\n\n element.parentNode.insertBefore(container, element);\n container.appendChild(copy);\n\n // With cache disabled, images will still have height zero until their `complete` attribute\n // is true. `whenImagesAreActuallyLoaded` will wait for it.\n if (options.beforePageBreak) {\n whenImagesAreActuallyLoaded([ container ], function() {\n options.beforePageBreak(container, doPageBreak);\n });\n } else {\n whenImagesAreActuallyLoaded([ container ], doPageBreak);\n }\n\n function doPageBreak() {\n if (forceBreak != \"-\" || pageHeight) {\n splitElement(copy);\n }\n\n {\n var page = makePage();\n copy.parentNode.insertBefore(page, copy);\n page.appendChild(copy);\n }\n\n if (template) {\n pages.forEach(function(page, i){\n var el = template({\n element : page,\n pageNum : i + 1,\n totalPages : pages.length\n });\n if (el) {\n page.appendChild(el);\n }\n });\n }\n\n cacheImages(pages, callback.bind(null, { pages: pages, container: container }));\n }\n\n function keepTogether(el) {\n if (options.keepTogether && matches(el, options.keepTogether) && el.offsetHeight <= pageHeight - adjust) {\n return true;\n }\n\n var tag = el.tagName;\n if (/^h[1-6]$/i.test(tag) && el.offsetHeight >= pageHeight - adjust) {\n return false;\n }\n\n return (el.getAttribute(\"data-kendo-chart\") ||\n /^(?:img|tr|thead|th|tfoot|iframe|svg|object|canvas|input|textarea|select|video|h[1-6])/i.test(el.tagName));\n }\n\n function splitElement(element) {\n if (element.tagName == \"TABLE\") {\n setCSS(element, { tableLayout: \"fixed\" });\n }\n if (keepTogether(element)) {\n return;\n }\n var style = getComputedStyle$1(element);\n var bottomPadding = parseFloat(getPropertyValue(style, \"padding-bottom\"));\n var bottomBorder = parseFloat(getPropertyValue(style, \"border-bottom-width\"));\n var saveAdjust = adjust;\n adjust += bottomPadding + bottomBorder;\n var isFirst = true;\n for (var el = element.firstChild; el; el = el.nextSibling) {\n if (el.nodeType == 1 /* Element */) {\n isFirst = false;\n if (matches(el, forceBreak)) {\n breakAtElement(el);\n continue;\n }\n if (!pageHeight) {\n // we're in \"manual breaks mode\"\n splitElement(el);\n continue;\n }\n if (!/^(?:static|relative)$/.test(getPropertyValue(getComputedStyle$1(el), \"position\"))) {\n continue;\n }\n var fall = fallsOnMargin(el);\n if (fall == 1) {\n // element starts on next page, break before anyway.\n breakAtElement(el);\n }\n else if (fall) {\n // elements ends up on next page, or possibly doesn't fit on a page at\n // all. break before it anyway if it's an or , otherwise\n // attempt to split.\n if (keepTogether(el)) {\n breakAtElement(el);\n } else {\n splitElement(el);\n }\n }\n else {\n splitElement(el);\n }\n }\n else if (el.nodeType == 3 /* Text */ && pageHeight) {\n splitText(el, isFirst);\n isFirst = false;\n }\n }\n adjust = saveAdjust;\n }\n\n function firstInParent(el) {\n var p = el.parentNode, first = p.firstChild;\n if (el === first) {\n return true;\n }\n if (el === p.children[0]) {\n if (first.nodeType == 7 /* comment */ ||\n first.nodeType == 8 /* processing instruction */) {\n return true;\n }\n if (first.nodeType == 3 /* text */) {\n // if whitespace only we can probably consider it's first\n return !/\\S/.test(first.data);\n }\n }\n return false;\n }\n\n function breakAtElement(el) {\n if (el.nodeType == 1 && el !== copy && firstInParent(el)) {\n return breakAtElement(el.parentNode);\n }\n var table, colgroup, thead, grid, gridHead;\n table = closest(el, \"table\");\n colgroup = table && table.querySelector(\"colgroup\");\n if (options.repeatHeaders) {\n thead = table && table.querySelector(\"thead\");\n\n // If we break page in a Kendo Grid, repeat its header. This ugly hack is\n // necessary because a scrollable grid will keep the header in a separate\n // element from its content.\n //\n // XXX: This is likely to break as soon as the widget HTML is modified.\n grid = closest(el, \".k-grid.k-widget\");\n if (grid && grid.querySelector(\".k-auto-scrollable\")) {\n gridHead = grid.querySelector(\".k-grid-header\");\n }\n }\n var page = makePage();\n var range = doc.createRange();\n range.setStartBefore(copy);\n range.setEndBefore(el);\n page.appendChild(range.extractContents());\n copy.parentNode.insertBefore(page, copy);\n preventBulletOnListItem(el.parentNode);\n if (table) {\n table = closest(el, \"table\"); // that's the
on next page!\n if (options.repeatHeaders && thead) {\n table.insertBefore(thead.cloneNode(true), table.firstChild);\n }\n if (colgroup) {\n table.insertBefore(colgroup.cloneNode(true), table.firstChild);\n }\n }\n if (options.repeatHeaders && gridHead) {\n grid = closest(el, \".k-grid.k-widget\");\n grid.insertBefore(gridHead.cloneNode(true), grid.firstChild);\n }\n }\n\n function makePage() {\n var page = doc.createElement(\"KENDO-PDF-PAGE\");\n setCSS(page, {\n display : \"block\",\n boxSizing: \"content-box\",\n width : pageWidth ? (pageWidth + \"px\") : \"auto\",\n padding : (margin.top + \"px \" +\n margin.right + \"px \" +\n margin.bottom + \"px \" +\n margin.left + \"px\"),\n\n // allow absolutely positioned elements to be relative to current page\n position : \"relative\",\n\n // without the following we might affect layout of subsequent pages\n height : pageHeight ? (pageHeight + \"px\") : \"auto\",\n overflow : pageHeight || pageWidth ? \"hidden\" : \"visible\",\n clear : \"both\"\n });\n\n // debug\n // $(\"
\").css({\n // position : \"absolute\",\n // left : margin.left,\n // top : margin.top,\n // width : pageWidth,\n // height : pageHeight,\n // boxSizing : \"border-box\",\n // background: \"rgba(255, 255, 0, 0.5)\"\n // //border : \"1px solid red\"\n // }).appendTo(page);\n\n if (options && options.pageClassName) {\n page.className = options.pageClassName;\n }\n pages.push(page);\n return page;\n }\n\n function fallsOnMargin(thing) {\n var box = thing.getBoundingClientRect();\n if (box.width === 0 || box.height === 0) {\n // I'd say an element with dimensions zero fits on current page.\n return 0;\n }\n var top = copy.getBoundingClientRect().top;\n var available = pageHeight - adjust;\n return (box.height > available) ? 3\n : (box.top - top > available) ? 1\n : (box.bottom - top > available) ? 2\n : 0;\n }\n\n function splitText(node, isFirst) {\n if (!/\\S/.test(node.data)) {\n return;\n }\n\n var len = node.data.length;\n var range = doc.createRange();\n range.selectNodeContents(node);\n var fall = fallsOnMargin(range);\n if (!fall) {\n return; // the whole text fits on current page\n }\n\n var nextnode = node;\n if (fall == 1) {\n // starts on next page, break before anyway.\n if (isFirst) {\n // avoid leaving an empty

,

  • , etc. on previous page.\n breakAtElement(node.parentNode);\n } else {\n breakAtElement(node);\n }\n }\n else {\n (function findEOP(min, pos, max) {\n range.setEnd(node, pos);\n if (min == pos || pos == max) {\n return pos;\n }\n if (fallsOnMargin(range)) {\n return findEOP(min, (min + pos) >> 1, pos);\n } else {\n return findEOP(pos, (pos + max) >> 1, max);\n }\n })(0, len >> 1, len);\n\n if (!/\\S/.test(range.toString()) && isFirst) {\n // avoid leaving an empty

    ,

  • , etc. on previous page.\n breakAtElement(node.parentNode);\n } else {\n // This is only needed for IE, but it feels cleaner to do it anyway. Without\n // it, IE will truncate a very long text (playground/pdf-long-text-2.html).\n nextnode = node.splitText(range.endOffset);\n\n var page = makePage();\n range.setStartBefore(copy);\n page.appendChild(range.extractContents());\n copy.parentNode.insertBefore(page, copy);\n preventBulletOnListItem(nextnode.parentNode);\n }\n }\n\n splitText(nextnode);\n }\n\n function preventBulletOnListItem(el) {\n // set a hint on continued LI elements, to tell the\n // renderer not to draw the bullet again.\n // https://github.com/telerik/kendo-ui-core/issues/2732\n var li = closest(el, \"li\");\n if (li) {\n li.setAttribute(\"kendo-no-bullet\", \"1\");\n preventBulletOnListItem(li.parentNode);\n }\n }\n }\n\n return promise;\n }\n\n // This is needed for the Spreadsheet print functionality. Since\n // there we only need to draw text, this cuts through the ceremony\n // of drawDOM/renderElement and renders the text node directly.\n function drawText(element) {\n var group = new Group();\n nodeInfo._clipbox = false;\n nodeInfo._matrix = Matrix.unit();\n nodeInfo._stackingContext = {\n element: element,\n group: group\n };\n pushNodeInfo(element, getComputedStyle$1(element), group);\n if (element.firstChild.nodeType == 3 /* Text */) {\n // avoid the penalty of renderElement\n renderText(element, element.firstChild, group);\n } else {\n _renderElement(element, group);\n }\n popNodeInfo();\n return group;\n }\n\n var parseBackgroundImage = (function(){\n var tok_linear_gradient = /^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\\s*)\\(/;\n //var tok_radial_gradient = /^((-webkit-|-moz-|-o-|-ms-)?radial-gradient\\s*)\\(/;\n var tok_percent = /^([-0-9.]+%)/;\n var tok_length = /^([-0-9.]+px)/;\n var tok_keyword = /^(left|right|top|bottom|to|center)\\W/;\n var tok_angle = /^([-0-9.]+(deg|grad|rad|turn)|0)/;\n var tok_whitespace = /^(\\s+)/;\n var tok_popen = /^(\\()/;\n var tok_pclose = /^(\\))/;\n var tok_comma = /^(,)/;\n var tok_url = /^(url)\\(/;\n var tok_content = /^(.*?)\\)/;\n\n var cache1 = {}, cache2 = {};\n\n function parse(input) {\n var orig = input;\n if (hasOwnProperty(cache1, orig)) {\n return cache1[orig];\n }\n function skip_ws() {\n var m = tok_whitespace.exec(input);\n if (m) {\n input = input.substr(m[1].length);\n }\n }\n function read(token) {\n skip_ws();\n var m = token.exec(input);\n if (m) {\n input = input.substr(m[1].length);\n return m[1];\n }\n }\n\n function read_stop() {\n var color = kendo.parseColor(input, true);\n var length, percent;\n if (color) {\n var match =\n /^#[0-9a-f]+/i.exec(input) ||\n /^rgba?\\(.*?\\)/i.exec(input) ||\n /^..*?\\b/.exec(input); // maybe named color\n input = input.substr(match[0].length);\n color = color.toRGB();\n if (!(length = read(tok_length))) {\n percent = read(tok_percent);\n }\n return { color: color, length: length, percent: percent };\n }\n }\n\n function read_linear_gradient(propName) {\n var angle;\n var to1, to2;\n var stops = [];\n var reverse = false;\n\n if (read(tok_popen)) {\n // 1. [ || to , ]?\n angle = read(tok_angle);\n if (angle == \"0\") {\n angle = \"0deg\"; // Edge\n }\n if (angle) {\n angle = parseAngle(angle);\n read(tok_comma);\n }\n else {\n to1 = read(tok_keyword);\n if (to1 == \"to\") {\n to1 = read(tok_keyword);\n } else if (to1 && /^-/.test(propName)) {\n reverse = true;\n }\n to2 = read(tok_keyword);\n read(tok_comma);\n }\n\n if (/-moz-/.test(propName) && angle == null && to1 == null) {\n var x = read(tok_percent), y = read(tok_percent);\n reverse = true;\n if (x == \"0%\") {\n to1 = \"left\";\n } else if (x == \"100%\") {\n to1 = \"right\";\n }\n if (y == \"0%\") {\n to2 = \"top\";\n } else if (y == \"100%\") {\n to2 = \"bottom\";\n }\n read(tok_comma);\n }\n\n // 2. color stops\n while (input && !read(tok_pclose)) {\n var stop = read_stop();\n if (!stop) {\n break;\n }\n stops.push(stop);\n read(tok_comma);\n }\n\n return {\n type : \"linear\",\n angle : angle,\n to : to1 && to2 ? to1 + \" \" + to2 : to1 ? to1 : to2 ? to2 : null,\n stops : stops,\n reverse : reverse\n };\n }\n }\n\n function read_url() {\n if (read(tok_popen)) {\n var url = read(tok_content);\n url = url.replace(/^['\"]+|[\"']+$/g, \"\");\n read(tok_pclose);\n return { type: \"url\", url: url };\n }\n }\n\n var tok;\n\n if ((tok = read(tok_linear_gradient))) {\n tok = read_linear_gradient(tok);\n }\n else if ((tok = read(tok_url))) {\n tok = read_url();\n }\n\n return (cache1[orig] = tok || { type: \"none\" });\n }\n\n return function(input) {\n if (hasOwnProperty(cache2, input)) {\n return cache2[input];\n }\n return (cache2[input] = splitProperty(input).map(parse));\n };\n })();\n\n var splitProperty = (function(){\n var cache = {};\n return function(input, separator) {\n if (!separator) {\n separator = /^\\s*,\\s*/;\n }\n\n var cacheKey = input + separator;\n\n if (hasOwnProperty(cache, cacheKey)) {\n return cache[cacheKey];\n }\n\n var ret = [];\n var last$$1 = 0, pos = 0;\n var in_paren = 0;\n var in_string = false;\n var m;\n\n function looking_at(rx) {\n return (m = rx.exec(input.substr(pos)));\n }\n\n function trim(str) {\n return str.replace(/^\\s+|\\s+$/g, \"\");\n }\n\n while (pos < input.length) {\n if (!in_string && looking_at(/^[\\(\\[\\{]/)) {\n in_paren++;\n pos++;\n }\n else if (!in_string && looking_at(/^[\\)\\]\\}]/)) {\n in_paren--;\n pos++;\n }\n else if (!in_string && looking_at(/^[\\\"\\']/)) {\n in_string = m[0];\n pos++;\n }\n else if (in_string == \"'\" && looking_at(/^\\\\\\'/)) {\n pos += 2;\n }\n else if (in_string == '\"' && looking_at(/^\\\\\\\"/)) {\n pos += 2;\n }\n else if (in_string == \"'\" && looking_at(/^\\'/)) {\n in_string = false;\n pos++;\n }\n else if (in_string == '\"' && looking_at(/^\\\"/)) {\n in_string = false;\n pos++;\n }\n else if (looking_at(separator)) {\n if (!in_string && !in_paren && pos > last$$1) {\n ret.push(trim(input.substring(last$$1, pos)));\n last$$1 = pos + m[0].length;\n }\n pos += m[0].length;\n }\n else {\n pos++;\n }\n }\n if (last$$1 < pos) {\n ret.push(trim(input.substring(last$$1, pos)));\n }\n return (cache[cacheKey] = ret);\n };\n })();\n\n var getFontURL = (function(cache){\n return function(el){\n // XXX: for IE we get here the whole cssText of the rule,\n // because the computedStyle.src is empty. Next time we need\n // to fix these regexps we better write a CSS parser. :-\\\n var url = cache[el];\n if (!url) {\n var m;\n if ((m = /url\\((['\"]?)([^'\")]*?)\\1\\)\\s+format\\((['\"]?)truetype\\3\\)/.exec(el))) {\n url = cache[el] = m[2];\n } else if ((m = /url\\((['\"]?)([^'\")]*?\\.ttf)\\1\\)/.exec(el))) {\n url = cache[el] = m[2];\n }\n }\n return url;\n };\n })(Object.create ? Object.create(null) : {});\n\n var getFontHeight = (function(cache){\n return function(font) {\n var height = cache[font];\n if (height == null) {\n height = cache[font] = kendoUtil.measureText(\"Mapq\", { font: font }).height;\n }\n return height;\n };\n })(Object.create ? Object.create(null) : {});\n\n function getFontFaces(doc) {\n if (doc == null) {\n doc = document;\n }\n var result = {};\n for (var i = 0; i < doc.styleSheets.length; ++i) {\n doStylesheet(doc.styleSheets[i]);\n }\n return result;\n function doStylesheet(ss) {\n if (ss) {\n var rules = null;\n try {\n rules = ss.cssRules;\n } catch (ex) {}\n if (rules) {\n addRules(ss, rules);\n }\n }\n }\n function findFonts(rule) {\n var src = getPropertyValue(rule.style, \"src\");\n if (src) {\n return splitProperty(src).reduce(function(a, el){\n var font = getFontURL(el);\n if (font) {\n a.push(font);\n }\n return a;\n }, []);\n } else {\n // Internet Explorer\n // XXX: this is gross. should work though for valid CSS.\n var font = getFontURL(rule.cssText);\n return font ? [ font ] : [];\n }\n }\n function addRules(styleSheet, rules) {\n for (var i = 0; i < rules.length; ++i) {\n var r = rules[i];\n switch (r.type) {\n case 3: // CSSImportRule\n doStylesheet(r.styleSheet);\n break;\n case 5: // CSSFontFaceRule\n var style = r.style;\n var family = splitProperty(getPropertyValue(style, \"font-family\"));\n var bold = /^([56789]00|bold)$/i.test(getPropertyValue(style, \"font-weight\"));\n var italic = \"italic\" == getPropertyValue(style, \"font-style\");\n var src = findFonts(r);\n if (src.length > 0) {\n addRule(styleSheet, family, bold, italic, src[0]);\n }\n }\n }\n }\n function addRule(styleSheet, names, bold, italic, url) {\n // We get full resolved absolute URLs in Chrome, but sadly\n // not in Firefox.\n if (!(/^data:/i.test(url))) {\n if (!(/^[^\\/:]+:\\/\\//.test(url) || /^\\//.test(url))) {\n url = String(styleSheet.href).replace(/[^\\/]*$/, \"\") + url;\n }\n }\n names.forEach(function(name){\n name = name.replace(/^(['\"]?)(.*?)\\1$/, \"$2\"); // it's quoted\n if (bold) {\n name += \"|bold\";\n }\n if (italic) {\n name += \"|italic\";\n }\n result[name] = url;\n });\n }\n }\n\n function hasOwnProperty(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n }\n\n function getCounter(name) {\n name = \"_counter_\" + name;\n return nodeInfo[name];\n }\n\n function getAllCounters(name) {\n var values = [], p = nodeInfo;\n name = \"_counter_\" + name;\n while (p) {\n if (hasOwnProperty(p, name)) {\n values.push(p[name]);\n }\n p = Object.getPrototypeOf(p);\n }\n return values.reverse();\n }\n\n function incCounter(name, inc) {\n var p = nodeInfo;\n name = \"_counter_\" + name;\n while (p && !hasOwnProperty(p, name)) {\n p = Object.getPrototypeOf(p);\n }\n if (!p) {\n p = nodeInfo._root;\n }\n p[name] = (p[name] || 0) + (inc == null ? 1 : inc);\n }\n\n function resetCounter(name, val) {\n name = \"_counter_\" + name;\n nodeInfo[name] = val == null ? 0 : val;\n }\n\n function doCounters(a, f, def) {\n for (var i = 0; i < a.length;) {\n var name = a[i++];\n var val = parseFloat(a[i]);\n if (isNaN(val)) {\n f(name, def);\n } else {\n f(name, val);\n ++i;\n }\n }\n }\n\n function updateCounters(style) {\n var counterReset = getPropertyValue(style, \"counter-reset\");\n if (counterReset) {\n doCounters(splitProperty(counterReset, /^\\s+/), resetCounter, 0);\n }\n var counterIncrement = getPropertyValue(style, \"counter-increment\");\n if (counterIncrement) {\n doCounters(splitProperty(counterIncrement, /^\\s+/), incCounter, 1);\n }\n }\n\n function parseColor$1(str, css) {\n var color = kendo.parseColor(str, true);\n if (color) {\n color = color.toRGB();\n if (css) {\n color = color.toCssRgba();\n } else if (color.a === 0) {\n color = null;\n }\n }\n return color;\n }\n\n function whenImagesAreActuallyLoaded(elements, callback) {\n var pending = 0;\n elements.forEach(function(el){\n var images = el.querySelectorAll(\"img\");\n for (var i = 0; i < images.length; ++i) {\n var img = images[i];\n if (!img.complete) {\n pending++;\n img.onload = img.onerror = next;\n }\n }\n });\n if (!pending) {\n next();\n }\n function next() {\n if (--pending <= 0) {\n callback();\n }\n }\n }\n\n function cacheImages(elements, callback) {\n var urls = [];\n function add(url) {\n if (!IMAGE_CACHE[url]) {\n IMAGE_CACHE[url] = true;\n urls.push(url);\n }\n }\n\n elements.forEach(function dive(element){\n if (/^img$/i.test(element.tagName)) {\n add(element.src);\n }\n parseBackgroundImage(\n getPropertyValue(\n getComputedStyle$1(element), \"background-image\"\n )\n ).forEach(function(bg){\n if (bg.type == \"url\") {\n add(bg.url);\n }\n });\n\n if (element.children) {\n slice$1$1(element.children).forEach(dive);\n }\n });\n\n var count = urls.length;\n function next() {\n if (--count <= 0) {\n // Even though we cached them, they simply won't be available immediately in the newly\n // created DOM. Previously we'd allow a 10ms timeout, but that's arbitrary and clearly\n // not working in all cases (https://github.com/telerik/kendo/issues/5399), so this\n // function will wait for their .complete attribute.\n whenImagesAreActuallyLoaded(elements, callback);\n }\n }\n if (count === 0) {\n next();\n }\n urls.forEach(function(url){\n var img = IMAGE_CACHE[url] = new window.Image();\n if (!(/^data:/i.test(url))) {\n img.crossOrigin = \"Anonymous\";\n }\n img.src = url;\n if (img.complete) {\n next();\n } else {\n img.onload = next;\n img.onerror = function() {\n IMAGE_CACHE[url] = null;\n next();\n };\n }\n });\n }\n\n function alphaNumeral(n) {\n var result = \"\";\n do {\n var r = n % 26;\n result = String.fromCharCode(97 + r) + result;\n n = Math.floor(n / 26);\n } while (n > 0);\n return result;\n }\n\n function pushNodeInfo(element, style, group) {\n nodeInfo = Object.create(nodeInfo);\n nodeInfo[element.tagName.toLowerCase()] = {\n element: element,\n style: style\n };\n var decoration = getPropertyValue(style, \"text-decoration\");\n if (decoration && decoration != \"none\") {\n var color = getPropertyValue(style, \"color\");\n decoration.split(/\\s+/g).forEach(function(name){\n if (!nodeInfo[name]) {\n nodeInfo[name] = color;\n }\n });\n }\n\n if (createsStackingContext(style)) {\n nodeInfo._stackingContext = {\n element: element,\n group: group\n };\n }\n }\n\n function popNodeInfo() {\n nodeInfo = Object.getPrototypeOf(nodeInfo);\n }\n\n function updateClipbox(path) {\n if (nodeInfo._clipbox != null) {\n var box = path.bbox(nodeInfo._matrix);\n if (nodeInfo._clipbox) {\n nodeInfo._clipbox = Rect.intersect(nodeInfo._clipbox, box);\n } else {\n nodeInfo._clipbox = box;\n }\n }\n }\n\n function emptyClipbox() {\n var cb = nodeInfo._clipbox;\n if (cb == null) {\n return true;\n }\n if (cb) {\n return cb.width() === 0 || cb.height() === 0;\n }\n }\n\n function createsStackingContext(style) {\n function prop(name) { return getPropertyValue(style, name); }\n if (prop(\"transform\") != \"none\" ||\n prop(\"position\") != \"static\" ||\n prop(\"z-index\") != \"auto\" ||\n prop(\"opacity\") < 1) {\n return true;\n }\n }\n\n function getComputedStyle$1(element, pseudoElt) {\n return window.getComputedStyle(element, pseudoElt || null);\n }\n\n function getPropertyValue(style, prop, defa) {\n var val = style.getPropertyValue(prop);\n if (val == null || val === \"\") {\n if (browser.webkit) {\n val = style.getPropertyValue(\"-webkit-\" + prop );\n } else if (browser.mozilla) {\n val = style.getPropertyValue(\"-moz-\" + prop );\n } else if (browser.opera) {\n val = style.getPropertyValue(\"-o-\" + prop);\n } else if (microsoft) {\n val = style.getPropertyValue(\"-ms-\" + prop);\n }\n }\n if (arguments.length > 2 && (val == null || val === \"\")) {\n return defa;\n } else {\n return val;\n }\n }\n\n function pleaseSetPropertyValue(style, prop, value, important) {\n style.setProperty(prop, value, important);\n if (browser.webkit) {\n style.setProperty(\"-webkit-\" + prop, value, important);\n } else if (browser.mozilla) {\n style.setProperty(\"-moz-\" + prop, value, important);\n } else if (browser.opera) {\n style.setProperty(\"-o-\" + prop, value, important);\n } else if (microsoft) {\n style.setProperty(\"-ms-\" + prop, value, important);\n prop = \"ms\" + prop.replace(/(^|-)([a-z])/g, function(s, p1, p2){\n return p1 + p2.toUpperCase();\n });\n style[prop] = value;\n }\n }\n\n function getBorder(style, side) {\n side = \"border-\" + side;\n return {\n width: parseFloat(getPropertyValue(style, side + \"-width\")),\n style: getPropertyValue(style, side + \"-style\"),\n color: parseColor$1(getPropertyValue(style, side + \"-color\"), true)\n };\n }\n\n function saveStyle(element, func) {\n var prev = element.style.cssText;\n var result = func();\n element.style.cssText = prev;\n return result;\n }\n\n function getBorderRadius(style, side) {\n var r = getPropertyValue(style, \"border-\" + side + \"-radius\").split(/\\s+/g).map(parseFloat);\n if (r.length == 1) {\n r.push(r[0]);\n }\n return sanitizeRadius({ x: r[0], y: r[1] });\n }\n\n function getContentBox(element) {\n var box = element.getBoundingClientRect();\n box = innerBox(box, \"border-*-width\", element);\n box = innerBox(box, \"padding-*\", element);\n return box;\n }\n\n function innerBox(box, prop, element) {\n var style, wt, wr, wb, wl;\n if (typeof prop == \"string\") {\n style = getComputedStyle$1(element);\n wt = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"top\")));\n wr = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"right\")));\n wb = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"bottom\")));\n wl = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"left\")));\n }\n else if (typeof prop == \"number\") {\n wt = wr = wb = wl = prop;\n }\n return {\n top : box.top + wt,\n right : box.right - wr,\n bottom : box.bottom - wb,\n left : box.left + wl,\n width : box.right - box.left - wr - wl,\n height : box.bottom - box.top - wb - wt\n };\n }\n\n function getTransform(style) {\n var transform$$1 = getPropertyValue(style, \"transform\");\n if (transform$$1 == \"none\") {\n return null;\n }\n var matrix = /^\\s*matrix\\(\\s*(.*?)\\s*\\)\\s*$/.exec(transform$$1);\n if (matrix) {\n var origin = getPropertyValue(style, \"transform-origin\");\n matrix = matrix[1].split(/\\s*,\\s*/g).map(parseFloat);\n origin = origin.split(/\\s+/g).map(parseFloat);\n return {\n matrix: matrix,\n origin: origin\n };\n }\n }\n\n function radiansToDegrees(radians) {\n return ((180 * radians) / Math.PI) % 360;\n }\n\n function parseAngle(angle) {\n var num = parseFloat(angle);\n if (/grad$/.test(angle)) {\n return Math.PI * num / 200;\n }\n else if (/rad$/.test(angle)) {\n return num;\n }\n else if (/turn$/.test(angle)) {\n return Math.PI * num * 2;\n }\n else if (/deg$/.test(angle)) {\n return Math.PI * num / 180;\n }\n }\n\n function setTransform$1(shape, m) {\n m = new Matrix(m[0], m[1], m[2], m[3], m[4], m[5]);\n shape.transform(m);\n return m;\n }\n\n function setClipping(shape, clipPath) {\n shape.clip(clipPath);\n }\n\n function addArcToPath(path, x, y, options) {\n var points = new Arc$2([ x, y ], options).curvePoints(), i = 1;\n while (i < points.length) {\n path.curveTo(points[i++], points[i++], points[i++]);\n }\n }\n\n function sanitizeRadius(r) {\n if (r.x <= 0 || r.y <= 0) {\n r.x = r.y = 0;\n }\n return r;\n }\n\n function adjustBorderRadiusForBox(box, rTL, rTR, rBR, rBL) {\n // adjust border radiuses such that the sum of adjacent\n // radiuses is not bigger than the length of the side.\n // seems the correct algorithm is variant (3) from here:\n // http://www.w3.org/Style/CSS/Tracker/issues/29?changelog\n var tl_x = Math.max(0, rTL.x), tl_y = Math.max(0, rTL.y);\n var tr_x = Math.max(0, rTR.x), tr_y = Math.max(0, rTR.y);\n var br_x = Math.max(0, rBR.x), br_y = Math.max(0, rBR.y);\n var bl_x = Math.max(0, rBL.x), bl_y = Math.max(0, rBL.y);\n\n var f = Math.min(\n box.width / (tl_x + tr_x),\n box.height / (tr_y + br_y),\n box.width / (br_x + bl_x),\n box.height / (bl_y + tl_y)\n );\n\n if (f < 1) {\n tl_x *= f; tl_y *= f;\n tr_x *= f; tr_y *= f;\n br_x *= f; br_y *= f;\n bl_x *= f; bl_y *= f;\n }\n\n return {\n tl: { x: tl_x, y: tl_y },\n tr: { x: tr_x, y: tr_y },\n br: { x: br_x, y: br_y },\n bl: { x: bl_x, y: bl_y }\n };\n }\n\n function elementRoundBox(element, box, type) {\n var style = getComputedStyle$1(element);\n\n var rTL = getBorderRadius(style, \"top-left\");\n var rTR = getBorderRadius(style, \"top-right\");\n var rBL = getBorderRadius(style, \"bottom-left\");\n var rBR = getBorderRadius(style, \"bottom-right\");\n\n if (type == \"padding\" || type == \"content\") {\n var bt = getBorder(style, \"top\");\n var br = getBorder(style, \"right\");\n var bb = getBorder(style, \"bottom\");\n var bl = getBorder(style, \"left\");\n rTL.x -= bl.width; rTL.y -= bt.width;\n rTR.x -= br.width; rTR.y -= bt.width;\n rBR.x -= br.width; rBR.y -= bb.width;\n rBL.x -= bl.width; rBL.y -= bb.width;\n if (type == \"content\") {\n var pt = parseFloat(getPropertyValue(style, \"padding-top\"));\n var pr = parseFloat(getPropertyValue(style, \"padding-right\"));\n var pb = parseFloat(getPropertyValue(style, \"padding-bottom\"));\n var pl = parseFloat(getPropertyValue(style, \"padding-left\"));\n rTL.x -= pl; rTL.y -= pt;\n rTR.x -= pr; rTR.y -= pt;\n rBR.x -= pr; rBR.y -= pb;\n rBL.x -= pl; rBL.y -= pb;\n }\n }\n\n if (typeof type == \"number\") {\n rTL.x -= type; rTL.y -= type;\n rTR.x -= type; rTR.y -= type;\n rBR.x -= type; rBR.y -= type;\n rBL.x -= type; rBL.y -= type;\n }\n\n return roundBox(box, rTL, rTR, rBR, rBL);\n }\n\n // Create a drawing.Path for a rounded rectangle. Receives the\n // bounding box and the border-radiuses in CSS order (top-left,\n // top-right, bottom-right, bottom-left). The radiuses must be\n // objects containing x (horiz. radius) and y (vertical radius).\n function roundBox(box, rTL0, rTR0, rBR0, rBL0) {\n var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\n var rTL = tmp.tl;\n var rTR = tmp.tr;\n var rBR = tmp.br;\n var rBL = tmp.bl;\n var path = new Path({ fill: null, stroke: null });\n path.moveTo(box.left, box.top + rTL.y);\n if (rTL.x) {\n addArcToPath(path, box.left + rTL.x, box.top + rTL.y, {\n startAngle: -180,\n endAngle: -90,\n radiusX: rTL.x,\n radiusY: rTL.y\n });\n }\n path.lineTo(box.right - rTR.x, box.top);\n if (rTR.x) {\n addArcToPath(path, box.right - rTR.x, box.top + rTR.y, {\n startAngle: -90,\n endAngle: 0,\n radiusX: rTR.x,\n radiusY: rTR.y\n });\n }\n path.lineTo(box.right, box.bottom - rBR.y);\n if (rBR.x) {\n addArcToPath(path, box.right - rBR.x, box.bottom - rBR.y, {\n startAngle: 0,\n endAngle: 90,\n radiusX: rBR.x,\n radiusY: rBR.y\n });\n }\n path.lineTo(box.left + rBL.x, box.bottom);\n if (rBL.x) {\n addArcToPath(path, box.left + rBL.x, box.bottom - rBL.y, {\n startAngle: 90,\n endAngle: 180,\n radiusX: rBL.x,\n radiusY: rBL.y\n });\n }\n return path.close();\n }\n\n function formatCounter(val, style) {\n var str = String(parseFloat(val));\n switch (style) {\n case \"decimal-leading-zero\":\n if (str.length < 2) {\n str = \"0\" + str;\n }\n return str;\n case \"lower-roman\":\n return arabicToRoman(val).toLowerCase();\n case \"upper-roman\":\n return arabicToRoman(val).toUpperCase();\n case \"lower-latin\":\n case \"lower-alpha\":\n return alphaNumeral(val - 1);\n case \"upper-latin\":\n case \"upper-alpha\":\n return alphaNumeral(val - 1).toUpperCase();\n default:\n return str;\n }\n }\n\n function evalPseudoElementContent(element, content) {\n function displayCounter(name, style, separator) {\n if (!separator) {\n return formatCounter(getCounter(name) || 0, style);\n }\n separator = separator.replace(/^\\s*([\"'])(.*)\\1\\s*$/, \"$2\");\n return getAllCounters(name).map(function(val){\n return formatCounter(val, style);\n }).join(separator);\n }\n var a = splitProperty(content, /^\\s+/);\n var result = [], m;\n a.forEach(function(el){\n var tmp;\n if ((m = /^\\s*([\"'])(.*)\\1\\s*$/.exec(el))) {\n result.push(m[2].replace(/\\\\([0-9a-f]{4})/gi, function(s, p){\n return String.fromCharCode(parseInt(p, 16));\n }));\n }\n else if ((m = /^\\s*counter\\((.*?)\\)\\s*$/.exec(el))) {\n tmp = splitProperty(m[1]);\n result.push(displayCounter(tmp[0], tmp[1]));\n }\n else if ((m = /^\\s*counters\\((.*?)\\)\\s*$/.exec(el))) {\n tmp = splitProperty(m[1]);\n result.push(displayCounter(tmp[0], tmp[2], tmp[1]));\n }\n else if ((m = /^\\s*attr\\((.*?)\\)\\s*$/.exec(el))) {\n result.push(element.getAttribute(m[1]) || \"\");\n }\n else {\n result.push(el);\n }\n });\n return result.join(\"\");\n }\n\n function getCssText(style) {\n if (style.cssText) {\n return style.cssText;\n }\n // Status: NEW. Report year: 2002. Current year: 2014.\n // Nice played, Mozillians.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=137687\n var result = [];\n for (var i = 0; i < style.length; ++i) {\n result.push(style[i] + \": \" + getPropertyValue(style, style[i]));\n }\n return result.join(\";\\n\");\n }\n\n function _renderWithPseudoElements(element, group) {\n if (element.tagName == KENDO_PSEUDO_ELEMENT) {\n _renderElement(element, group);\n return;\n }\n var fake = [];\n function pseudo(kind, place) {\n var style = getComputedStyle$1(element, kind), content = style.content;\n updateCounters(style);\n if (content && content != \"normal\" && content != \"none\" && style.width != \"0px\") {\n var psel = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\n psel.style.cssText = getCssText(style);\n psel.textContent = evalPseudoElementContent(element, content);\n element.insertBefore(psel, place);\n fake.push(psel);\n }\n }\n pseudo(\":before\", element.firstChild);\n pseudo(\":after\", null);\n if (fake.length > 0) {\n var saveClass = element.className;\n element.className += \" kendo-pdf-hide-pseudo-elements\";\n _renderElement(element, group);\n element.className = saveClass;\n fake.forEach(function(el){ element.removeChild(el); });\n } else {\n _renderElement(element, group);\n }\n }\n\n function _renderElement(element, group) {\n var style = getComputedStyle$1(element);\n\n var top = getBorder(style, \"top\");\n var right = getBorder(style, \"right\");\n var bottom = getBorder(style, \"bottom\");\n var left = getBorder(style, \"left\");\n\n var rTL0 = getBorderRadius(style, \"top-left\");\n var rTR0 = getBorderRadius(style, \"top-right\");\n var rBL0 = getBorderRadius(style, \"bottom-left\");\n var rBR0 = getBorderRadius(style, \"bottom-right\");\n\n var dir = getPropertyValue(style, \"direction\");\n\n var backgroundColor = getPropertyValue(style, \"background-color\");\n backgroundColor = parseColor$1(backgroundColor);\n\n var backgroundImage = parseBackgroundImage( getPropertyValue(style, \"background-image\") );\n var backgroundRepeat = splitProperty( getPropertyValue(style, \"background-repeat\") );\n var backgroundPosition = splitProperty( getPropertyValue(style, \"background-position\") );\n var backgroundOrigin = splitProperty( getPropertyValue(style, \"background-origin\") );\n var backgroundSize = splitProperty( getPropertyValue(style, \"background-size\") );\n\n // IE shrinks the text with text-overflow: ellipsis,\n // apparently because the returned bounding box for the range\n // is limited to the visible area minus space for the dots,\n // instead of being the full width of the text.\n //\n // https://github.com/telerik/kendo/issues/5232\n // https://github.com/telerik/kendo-ui-core/issues/1868\n //\n // We have to test it here rather than in renderText because\n // text-overflow: ellipsis could be set on a parent element (not\n // necessarily the one containing the text); in this case,\n // getComputedStyle(elementWithTheText) will return \"clip\", not\n // \"ellipsis\" (which is probably a bug, but oh well...)\n var textOverflow, saveTextOverflow;\n if (microsoft) {\n textOverflow = style.textOverflow; // computed style\n if (textOverflow == \"ellipsis\") {\n saveTextOverflow = element.style.textOverflow; // own style.\n element.style.textOverflow = \"clip\";\n }\n }\n\n if (browser.msie && browser.version < 10) {\n // IE9 hacks. getPropertyValue won't return the correct\n // value. Sucks that we have to do it here, I'd prefer to\n // move it in getPropertyValue, but we don't have the\n // element.\n backgroundPosition = splitProperty(element.currentStyle.backgroundPosition);\n }\n\n var innerbox = innerBox(element.getBoundingClientRect(), \"border-*-width\", element);\n\n // CSS \"clip\" property - if present, replace the group with a\n // new one which is clipped. This must happen before drawing\n // the borders and background.\n (function(){\n var clip = getPropertyValue(style, \"clip\");\n var m = /^\\s*rect\\((.*)\\)\\s*$/.exec(clip);\n if (m) {\n var a = m[1].split(/[ ,]+/g);\n var top = a[0] == \"auto\" ? innerbox.top : parseFloat(a[0]) + innerbox.top;\n var right = a[1] == \"auto\" ? innerbox.right : parseFloat(a[1]) + innerbox.left;\n var bottom = a[2] == \"auto\" ? innerbox.bottom : parseFloat(a[2]) + innerbox.top;\n var left = a[3] == \"auto\" ? innerbox.left : parseFloat(a[3]) + innerbox.left;\n var tmp = new Group();\n var clipPath = new Path()\n .moveTo(left, top)\n .lineTo(right, top)\n .lineTo(right, bottom)\n .lineTo(left, bottom)\n .close();\n setClipping(tmp, clipPath);\n group.append(tmp);\n group = tmp;\n updateClipbox(clipPath);\n }\n })();\n\n var boxes, i, cells;\n var display = getPropertyValue(style, \"display\");\n\n if (display == \"table-row\") {\n // because of rowspan/colspan, we shouldn't draw background of table row elements on the\n // box given by its getBoundingClientRect, because if we do we risk overwritting a\n // previously rendered cell. https://github.com/telerik/kendo/issues/4881\n boxes = [];\n for (i = 0, cells = element.children; i < cells.length; ++i) {\n boxes.push(cells[i].getBoundingClientRect());\n }\n } else {\n boxes = element.getClientRects();\n if (boxes.length == 1) {\n // Workaround the missing borders in Chrome! getClientRects() boxes contains values\n // rounded to integer. getBoundingClientRect() appears to work fine. We still need\n // getClientRects() to support cases where there are more boxes (continued inline\n // elements that might have border/background).\n boxes = [ element.getBoundingClientRect() ];\n }\n }\n\n // This function workarounds another Chrome bug, where boxes returned for a table with\n // border-collapse: collapse will overlap the table border. Our rendering is not perfect in\n // such case anyway, but with this is better than without it.\n boxes = adjustBoxes(boxes);\n\n for (i = 0; i < boxes.length; ++i) {\n drawOneBox(boxes[i], i === 0, i == boxes.length - 1);\n }\n\n // Render links as separate groups. We can't use boxes returned by element's getClientRects\n // because if display type is \"inline\" (default for ), boxes will not include the height of\n // images inside. https://github.com/telerik/kendo-ui-core/issues/3359\n if (element.tagName == \"A\" && element.href && !/^#?$/.test(element.getAttribute(\"href\"))) {\n if (!nodeInfo._avoidLinks || !matches(element, nodeInfo._avoidLinks)) {\n var r = document.createRange();\n r.selectNodeContents(element);\n slice$1$1(r.getClientRects()).forEach(function(box){\n var g = new Group();\n g._pdfLink = {\n url : element.href,\n top : box.top,\n right : box.right,\n bottom : box.bottom,\n left : box.left\n };\n group.append(g);\n });\n }\n }\n\n if (boxes.length > 0 && display == \"list-item\" && !element.getAttribute(\"kendo-no-bullet\")) {\n drawBullet(boxes[0]);\n }\n\n // overflow: hidden/auto - if present, replace the group with\n // a new one clipped by the inner box.\n (function(){\n function clipit() {\n var clipPath = elementRoundBox(element, innerbox, \"padding\");\n var tmp = new Group();\n setClipping(tmp, clipPath);\n group.append(tmp);\n group = tmp;\n updateClipbox(clipPath);\n }\n if (isFormField(element)) {\n clipit();\n } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, \"overflow\"))) {\n clipit();\n } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, \"overflow-x\"))) {\n clipit();\n } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, \"overflow-y\"))) {\n clipit();\n }\n })();\n\n if (!maybeRenderWidget(element, group)) {\n renderContents(element, group);\n }\n\n if (microsoft && textOverflow == \"ellipsis\") {\n element.style.textOverflow = saveTextOverflow;\n }\n\n return group; // only utility functions after this line.\n\n function adjustBoxes(boxes) {\n if (/^td$/i.test(element.tagName)) {\n var table = nodeInfo.table;\n if (table && getPropertyValue(table.style, \"border-collapse\") == \"collapse\") {\n var tableBorderLeft = getBorder(table.style, \"left\").width;\n var tableBorderTop = getBorder(table.style, \"top\").width;\n // check if we need to adjust\n if (tableBorderLeft === 0 && tableBorderTop === 0) {\n return boxes; // nope\n }\n var tableBox = table.element.getBoundingClientRect();\n var firstCell = table.element.rows[0].cells[0];\n var firstCellBox = firstCell.getBoundingClientRect();\n if (firstCellBox.top == tableBox.top || firstCellBox.left == tableBox.left) {\n return slice$1$1(boxes).map(function(box){\n return {\n left : box.left + tableBorderLeft,\n top : box.top + tableBorderTop,\n right : box.right + tableBorderLeft,\n bottom : box.bottom + tableBorderTop,\n height : box.height,\n width : box.width\n };\n });\n }\n }\n }\n return boxes;\n }\n\n // this function will be called to draw each border. it\n // draws starting at origin and the resulted path must be\n // translated/rotated to be placed in the proper position.\n //\n // arguments are named as if it draws the top border:\n //\n // - `len` the length of the edge\n // - `Wtop` the width of the edge (i.e. border-top-width)\n // - `Wleft` the width of the left edge (border-left-width)\n // - `Wright` the width of the right edge\n // - `rl` and `rl` -- the border radius on the left and right\n // (objects containing x and y, for horiz/vertical radius)\n // - `transform` -- transformation to apply\n //\n function drawEdge(color, len, Wtop, Wleft, Wright, rl, rr, transform$$1) {\n if (Wtop <= 0) {\n return;\n }\n\n var path, edge = new Group();\n setTransform$1(edge, transform$$1);\n group.append(edge);\n\n sanitizeRadius(rl);\n sanitizeRadius(rr);\n\n // draw main border. this is the area without the rounded corners\n path = new Path({\n fill: { color: color },\n stroke: null\n });\n edge.append(path);\n path.moveTo(rl.x ? Math.max(rl.x, Wleft) : 0, 0)\n .lineTo(len - (rr.x ? Math.max(rr.x, Wright) : 0), 0)\n .lineTo(len - Math.max(rr.x, Wright), Wtop)\n .lineTo(Math.max(rl.x, Wleft), Wtop)\n .close();\n\n if (rl.x) {\n drawRoundCorner(Wleft, rl, [ -1, 0, 0, 1, rl.x, 0 ]);\n }\n\n if (rr.x) {\n drawRoundCorner(Wright, rr, [ 1, 0, 0, 1, len - rr.x, 0 ]);\n }\n\n // draws one round corner, starting at origin (needs to be\n // translated/rotated to be placed properly).\n function drawRoundCorner(Wright, r, transform$$1) {\n var angle = Math.PI/2 * Wright / (Wright + Wtop);\n\n // not sanitizing this one, because negative values\n // are useful to fill the box correctly.\n var ri = {\n x: r.x - Wright,\n y: r.y - Wtop\n };\n\n var path = new Path({\n fill: { color: color },\n stroke: null\n }).moveTo(0, 0);\n\n setTransform$1(path, transform$$1);\n\n addArcToPath(path, 0, r.y, {\n startAngle: -90,\n endAngle: -radiansToDegrees(angle),\n radiusX: r.x,\n radiusY: r.y\n });\n\n if (ri.x > 0 && ri.y > 0) {\n path.lineTo(ri.x * Math.cos(angle), r.y - ri.y * Math.sin(angle));\n addArcToPath(path, 0, r.y, {\n startAngle: -radiansToDegrees(angle),\n endAngle: -90,\n radiusX: ri.x,\n radiusY: ri.y,\n anticlockwise: true\n });\n }\n else if (ri.x > 0) {\n path.lineTo(ri.x, Wtop)\n .lineTo(0, Wtop);\n }\n else {\n path.lineTo(ri.x, Wtop)\n .lineTo(ri.x, 0);\n }\n\n edge.append(path.close());\n }\n }\n\n function drawBackground(box) {\n var background = new Group();\n setClipping(background, roundBox(box, rTL0, rTR0, rBR0, rBL0));\n group.append(background);\n\n if (backgroundColor) {\n var path = new Path({\n fill: { color: backgroundColor.toCssRgba() },\n stroke: null\n });\n path.moveTo(box.left, box.top)\n .lineTo(box.right, box.top)\n .lineTo(box.right, box.bottom)\n .lineTo(box.left, box.bottom)\n .close();\n background.append(path);\n }\n\n for (var i = backgroundImage.length; --i >= 0;) {\n drawOneBackground(\n background, box,\n backgroundImage[i],\n backgroundRepeat[i % backgroundRepeat.length],\n backgroundPosition[i % backgroundPosition.length],\n backgroundOrigin[i % backgroundOrigin.length],\n backgroundSize[i % backgroundSize.length]\n );\n }\n }\n\n function drawOneBackground(group, box, background, backgroundRepeat, backgroundPosition, backgroundOrigin, backgroundSize) {\n if (!background || (background == \"none\")) {\n return;\n }\n\n if (background.type == \"url\") {\n var img = IMAGE_CACHE[background.url];\n if (img && img.width > 0 && img.height > 0) {\n drawBackgroundImage(group, box, img.width, img.height, function(group, rect){\n group.append(new Image$1(background.url, rect));\n });\n }\n } else if (background.type == \"linear\") {\n drawBackgroundImage(group, box, box.width, box.height, gradientRenderer(background));\n } else {\n return;\n }\n\n function drawBackgroundImage(group, box, img_width, img_height, renderBG) {\n var aspect_ratio = img_width / img_height, f;\n\n // for background-origin: border-box the box is already appropriate\n var orgBox = box;\n if (backgroundOrigin == \"content-box\") {\n orgBox = innerBox(orgBox, \"border-*-width\", element);\n orgBox = innerBox(orgBox, \"padding-*\", element);\n } else if (backgroundOrigin == \"padding-box\") {\n orgBox = innerBox(orgBox, \"border-*-width\", element);\n }\n\n if (!/^\\s*auto(\\s+auto)?\\s*$/.test(backgroundSize)) {\n if (backgroundSize == \"contain\") {\n f = Math.min(orgBox.width / img_width,\n orgBox.height / img_height);\n img_width *= f;\n img_height *= f;\n }\n else if (backgroundSize == \"cover\") {\n f = Math.max(orgBox.width / img_width,\n orgBox.height / img_height);\n img_width *= f;\n img_height *= f;\n }\n else {\n var size = backgroundSize.split(/\\s+/g);\n // compute width\n if (/%$/.test(size[0])) {\n img_width = orgBox.width * parseFloat(size[0]) / 100;\n } else {\n img_width = parseFloat(size[0]);\n }\n // compute height\n if (size.length == 1 || size[1] == \"auto\") {\n img_height = img_width / aspect_ratio;\n } else if (/%$/.test(size[1])) {\n img_height = orgBox.height * parseFloat(size[1]) / 100;\n } else {\n img_height = parseFloat(size[1]);\n }\n }\n }\n\n var pos = String(backgroundPosition);\n\n // IE sometimes reports single-word positions\n // https://github.com/telerik/kendo-ui-core/issues/2786\n //\n // it seems to switch to percentages when the horizontal\n // position is not \"center\", therefore we don't handle\n // multi-word cases here. All other browsers return\n // percentages or pixels instead of keywords. At least\n // for now...\n switch (pos) {\n case \"bottom\" : pos = \"50% 100%\"; break;\n case \"top\" : pos = \"50% 0\"; break;\n case \"left\" : pos = \"0 50%\"; break;\n case \"right\" : pos = \"100% 50%\"; break;\n case \"center\" : pos = \"50% 50%\"; break;\n }\n\n pos = pos.split(/\\s+/);\n if (pos.length == 1) {\n pos[1] = \"50%\";\n }\n\n if (/%$/.test(pos[0])) {\n pos[0] = parseFloat(pos[0]) / 100 * (orgBox.width - img_width);\n } else {\n pos[0] = parseFloat(pos[0]);\n }\n if (/%$/.test(pos[1])) {\n pos[1] = parseFloat(pos[1]) / 100 * (orgBox.height - img_height);\n } else {\n pos[1] = parseFloat(pos[1]);\n }\n\n var rect = new Rect([ orgBox.left + pos[0], orgBox.top + pos[1] ], [ img_width, img_height ]);\n\n // XXX: background-repeat could be implemented more\n // efficiently as a fill pattern (at least for PDF\n // output, probably SVG too).\n\n function rewX() {\n while (rect.origin.x > box.left) {\n rect.origin.x -= img_width;\n }\n }\n\n function rewY() {\n while (rect.origin.y > box.top) {\n rect.origin.y -= img_height;\n }\n }\n\n function repeatX() {\n while (rect.origin.x < box.right) {\n renderBG(group, rect.clone());\n rect.origin.x += img_width;\n }\n }\n\n if (backgroundRepeat == \"no-repeat\") {\n renderBG(group, rect);\n }\n else if (backgroundRepeat == \"repeat-x\") {\n rewX();\n repeatX();\n }\n else if (backgroundRepeat == \"repeat-y\") {\n rewY();\n while (rect.origin.y < box.bottom) {\n renderBG(group, rect.clone());\n rect.origin.y += img_height;\n }\n }\n else if (backgroundRepeat == \"repeat\") {\n rewX();\n rewY();\n var origin = rect.origin.clone();\n while (rect.origin.y < box.bottom) {\n rect.origin.x = origin.x;\n repeatX();\n rect.origin.y += img_height;\n }\n }\n }\n }\n\n function drawBullet() {\n var listStyleType = getPropertyValue(style, \"list-style-type\");\n if (listStyleType == \"none\") {\n return;\n }\n var listStylePosition = getPropertyValue(style, \"list-style-position\");\n\n function _drawBullet(f) {\n saveStyle(element, function(){\n element.style.position = \"relative\";\n var bullet = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\n bullet.style.position = \"absolute\";\n bullet.style.boxSizing = \"border-box\";\n if (listStylePosition == \"outside\") {\n bullet.style.width = \"6em\";\n bullet.style.left = \"-6.8em\";\n bullet.style.textAlign = \"right\";\n } else {\n bullet.style.left = \"0px\";\n }\n f(bullet);\n element.insertBefore(bullet, element.firstChild);\n renderElement(bullet, group);\n element.removeChild(bullet);\n });\n }\n\n function elementIndex(f) {\n var a = element.parentNode.children;\n var k = element.getAttribute(\"kendo-split-index\");\n if (k != null) {\n return f(k|0, a.length);\n }\n for (var i = 0; i < a.length; ++i) {\n if (a[i] === element) {\n return f(i, a.length);\n }\n }\n }\n\n switch (listStyleType) {\n case \"circle\":\n case \"disc\":\n case \"square\":\n _drawBullet(function(bullet){\n // XXX: the science behind these values is called \"trial and error\".\n bullet.style.fontSize = \"60%\";\n bullet.style.lineHeight = \"200%\";\n bullet.style.paddingRight = \"0.5em\";\n bullet.style.fontFamily = \"DejaVu Serif\";\n bullet.innerHTML = {\n \"disc\" : \"\\u25cf\",\n \"circle\" : \"\\u25ef\",\n \"square\" : \"\\u25a0\"\n }[listStyleType];\n });\n break;\n\n case \"decimal\":\n case \"decimal-leading-zero\":\n _drawBullet(function(bullet){\n elementIndex(function(idx){\n ++idx;\n if (listStyleType == \"decimal-leading-zero\" && idx < 10) {\n idx = \"0\" + idx;\n }\n bullet.innerHTML = idx + \".\";\n });\n });\n break;\n\n case \"lower-roman\":\n case \"upper-roman\":\n _drawBullet(function(bullet){\n elementIndex(function(idx){\n idx = arabicToRoman(idx + 1);\n if (listStyleType == \"upper-roman\") {\n idx = idx.toUpperCase();\n }\n bullet.innerHTML = idx + \".\";\n });\n });\n break;\n\n case \"lower-latin\":\n case \"lower-alpha\":\n case \"upper-latin\":\n case \"upper-alpha\":\n _drawBullet(function(bullet){\n elementIndex(function(idx){\n idx = alphaNumeral(idx);\n if (/^upper/i.test(listStyleType)) {\n idx = idx.toUpperCase();\n }\n bullet.innerHTML = idx + \".\";\n });\n });\n break;\n }\n }\n\n // draws a single border box\n function drawOneBox(box, isFirst, isLast) {\n if (box.width === 0 || box.height === 0) {\n return;\n }\n\n drawBackground(box);\n\n var shouldDrawLeft = (left.width > 0 && ((isFirst && dir == \"ltr\") || (isLast && dir == \"rtl\")));\n var shouldDrawRight = (right.width > 0 && ((isLast && dir == \"ltr\") || (isFirst && dir == \"rtl\")));\n\n // The most general case is that the 4 borders have different widths and border\n // radiuses. The way that is handled is by drawing 3 Paths for each border: the\n // straight line, and two round corners which represent half of the entire rounded\n // corner. To simplify code those shapes are drawed at origin (by the drawEdge\n // function), then translated/rotated into the right position.\n //\n // However, this leads to poor results due to rounding in the simpler cases where\n // borders are straight lines. Therefore we handle a few such cases separately with\n // straight lines. C^wC^wC^w -- nope, scratch that. poor rendering was because of a bug\n // in Chrome (getClientRects() returns rounded integer values rather than exact floats.\n // web dev is still a ghetto.)\n\n // first, just in case there is no border...\n if (top.width === 0 && left.width === 0 && right.width === 0 && bottom.width === 0) {\n return;\n }\n\n // START paint borders\n // if all borders have equal colors...\n if (top.color == right.color && top.color == bottom.color && top.color == left.color) {\n\n // if same widths too, we can draw the whole border by stroking a single path.\n if (top.width == right.width && top.width == bottom.width && top.width == left.width)\n {\n if (shouldDrawLeft && shouldDrawRight) {\n // reduce box by half the border width, so we can draw it by stroking.\n box = innerBox(box, top.width/2);\n\n // adjust the border radiuses, again by top.width/2, and make the path element.\n var path = elementRoundBox(element, box, top.width/2);\n path.options.stroke = {\n color: top.color,\n width: top.width\n };\n group.append(path);\n return;\n }\n }\n }\n\n // if border radiuses are zero and widths are at most one pixel, we can again use simple\n // paths.\n if (rTL0.x === 0 && rTR0.x === 0 && rBR0.x === 0 && rBL0.x === 0) {\n // alright, 1.9px will do as well. the difference in color blending should not be\n // noticeable.\n if (top.width < 2 && left.width < 2 && right.width < 2 && bottom.width < 2) {\n // top border\n if (top.width > 0) {\n group.append(\n new Path({\n stroke: { width: top.width, color: top.color }\n })\n .moveTo(box.left, box.top + top.width/2)\n .lineTo(box.right, box.top + top.width/2)\n );\n }\n\n // bottom border\n if (bottom.width > 0) {\n group.append(\n new Path({\n stroke: { width: bottom.width, color: bottom.color }\n })\n .moveTo(box.left, box.bottom - bottom.width/2)\n .lineTo(box.right, box.bottom - bottom.width/2)\n );\n }\n\n // left border\n if (shouldDrawLeft) {\n group.append(\n new Path({\n stroke: { width: left.width, color: left.color }\n })\n .moveTo(box.left + left.width/2, box.top)\n .lineTo(box.left + left.width/2, box.bottom)\n );\n }\n\n // right border\n if (shouldDrawRight) {\n group.append(\n new Path({\n stroke: { width: right.width, color: right.color }\n })\n .moveTo(box.right - right.width/2, box.top)\n .lineTo(box.right - right.width/2, box.bottom)\n );\n }\n\n return;\n }\n }\n // END paint borders\n\n var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\n var rTL = tmp.tl;\n var rTR = tmp.tr;\n var rBR = tmp.br;\n var rBL = tmp.bl;\n\n // top border\n drawEdge(top.color,\n box.width, top.width, left.width, right.width,\n rTL, rTR,\n [ 1, 0, 0, 1, box.left, box.top ]);\n\n // bottom border\n drawEdge(bottom.color,\n box.width, bottom.width, right.width, left.width,\n rBR, rBL,\n [ -1, 0, 0, -1, box.right, box.bottom ]);\n\n // for left/right borders we need to invert the border-radiuses\n function inv(p) {\n return { x: p.y, y: p.x };\n }\n\n // left border\n drawEdge(left.color,\n box.height, left.width, bottom.width, top.width,\n inv(rBL), inv(rTL),\n [ 0, -1, 1, 0, box.left, box.bottom ]);\n\n // right border\n drawEdge(right.color,\n box.height, right.width, top.width, bottom.width,\n inv(rTR), inv(rBR),\n [ 0, 1, -1, 0, box.right, box.top ]);\n }\n }\n\n function gradientRenderer(gradient) {\n return function(group, rect) {\n var width = rect.width(), height = rect.height();\n\n switch (gradient.type) {\n case \"linear\":\n\n // figure out the angle.\n var angle = gradient.angle != null ? gradient.angle : Math.PI;\n switch (gradient.to) {\n case \"top\":\n angle = 0;\n break;\n case \"left\":\n angle = -Math.PI / 2;\n break;\n case \"bottom\":\n angle = Math.PI;\n break;\n case \"right\":\n angle = Math.PI / 2;\n break;\n case \"top left\": case \"left top\":\n angle = -Math.atan2(height, width);\n break;\n case \"top right\": case \"right top\":\n angle = Math.atan2(height, width);\n break;\n case \"bottom left\": case \"left bottom\":\n angle = Math.PI + Math.atan2(height, width);\n break;\n case \"bottom right\": case \"right bottom\":\n angle = Math.PI - Math.atan2(height, width);\n break;\n }\n\n if (gradient.reverse) {\n angle -= Math.PI;\n }\n\n // limit the angle between 0..2PI\n angle %= 2 * Math.PI;\n if (angle < 0) {\n angle += 2 * Math.PI;\n }\n\n // compute gradient's start/end points. here len is the length of the gradient line\n // and x,y is the end point relative to the center of the rectangle in conventional\n // (math) axis direction.\n\n // this is the original (unscaled) length of the gradient line. needed to deal with\n // absolutely positioned color stops. formula from the CSS spec:\n // http://dev.w3.org/csswg/css-images-3/#linear-gradient-syntax\n var pxlen = Math.abs(width * Math.sin(angle)) + Math.abs(height * Math.cos(angle));\n\n // The math below is pretty simple, but it took a while to figure out. We compute x\n // and y, the *end* of the gradient line. However, we want to transform them into\n // element-based coordinates (SVG's gradientUnits=\"objectBoundingBox\"). That means,\n // x=0 is the left edge, x=1 is the right edge, y=0 is the top edge and y=1 is the\n // bottom edge.\n //\n // A naive approach would use the original angle for these calculations. Say we'd\n // like to draw a gradient angled at 45deg in a 100x400 box. When we use\n // objectBoundingBox, the renderer will draw it in a 1x1 *square* box, and then\n // scale that to the desired dimensions. The 45deg angle will look more like 70deg\n // after scaling. SVG (http://www.w3.org/TR/SVG/pservers.html#LinearGradients) says\n // the following:\n //\n // When gradientUnits=\"objectBoundingBox\" and 'gradientTransform' is the\n // identity matrix, the normal of the linear gradient is perpendicular to the\n // gradient vector in object bounding box space (i.e., the abstract coordinate\n // system where (0,0) is at the top/left of the object bounding box and (1,1) is\n // at the bottom/right of the object bounding box). When the object's bounding\n // box is not square, the gradient normal which is initially perpendicular to\n // the gradient vector within object bounding box space may render\n // non-perpendicular relative to the gradient vector in user space. If the\n // gradient vector is parallel to one of the axes of the bounding box, the\n // gradient normal will remain perpendicular. This transformation is due to\n // application of the non-uniform scaling transformation from bounding box space\n // to user space.\n //\n // which is an extremely long and confusing way to tell what I just said above.\n //\n // For this reason we need to apply the reverse scaling to the original angle, so\n // that when it'll finally be rendered it'll actually be at the desired slope. Now\n // I'll let you figure out the math yourself.\n\n var scaledAngle = Math.atan(width * Math.tan(angle) / height);\n var sin = Math.sin(scaledAngle), cos = Math.cos(scaledAngle);\n var len = Math.abs(sin) + Math.abs(cos);\n var x = len/2 * sin;\n var y = len/2 * cos;\n\n // Because of the arctangent, our scaledAngle ends up between -PI/2..PI/2, possibly\n // losing the intended direction of the gradient. The following fixes it.\n if (angle > Math.PI/2 && angle <= 3*Math.PI/2) {\n x = -x;\n y = -y;\n }\n\n // compute the color stops.\n var implicit = [], right = 0;\n var stops = gradient.stops.map(function(s, i){\n var offset = s.percent;\n if (offset) {\n offset = parseFloat(offset) / 100;\n } else if (s.length) {\n offset = parseFloat(s.length) / pxlen;\n } else if (i === 0) {\n offset = 0;\n } else if (i == gradient.stops.length - 1) {\n offset = 1;\n }\n var stop = {\n color: s.color.toCssRgba(),\n offset: offset\n };\n if (offset != null) {\n right = offset;\n // fix implicit offsets\n implicit.forEach(function(s, i){\n var stop = s.stop;\n stop.offset = s.left + (right - s.left) * (i + 1) / (implicit.length + 1);\n });\n implicit = [];\n } else {\n implicit.push({ left: right, stop: stop });\n }\n return stop;\n });\n\n var start = [ 0.5 - x, 0.5 + y ];\n var end = [ 0.5 + x, 0.5 - y ];\n\n // finally, draw it.\n group.append(\n Path.fromRect(rect)\n .stroke(null)\n .fill(new LinearGradient({\n start : start,\n end : end,\n stops : stops,\n userSpace : false\n }))\n );\n break;\n case \"radial\":\n // XXX:\n if (window.console && window.console.log) {\n window.console.log(\"Radial gradients are not yet supported in HTML renderer\");\n }\n break;\n }\n };\n }\n\n function maybeRenderWidget(element, group) {\n var visual;\n\n if (element._kendoExportVisual) {\n visual = element._kendoExportVisual();\n } else if (window.kendo && window.kendo.jQuery && element.getAttribute(window.kendo.attr(\"role\"))) {\n var widget = window.kendo.widgetInstance(window.kendo.jQuery(element));\n if (widget && (widget.exportDOMVisual || widget.exportVisual)) {\n if (widget.exportDOMVisual) {\n visual = widget.exportDOMVisual();\n } else {\n visual = widget.exportVisual();\n }\n }\n }\n\n if (!visual) {\n return false;\n }\n\n var wrap$$1 = new Group();\n wrap$$1.children.push(visual);\n\n var bbox = element.getBoundingClientRect();\n wrap$$1.transform(transform$1().translate(bbox.left, bbox.top));\n\n group.append(wrap$$1);\n\n return true;\n }\n\n function renderImage(element, url, group) {\n var box = getContentBox(element);\n var rect = new Rect([ box.left, box.top ], [ box.width, box.height ]);\n var image = new Image$1(url, rect);\n setClipping(image, elementRoundBox(element, box, \"content\"));\n group.append(image);\n }\n\n function zIndexSort(a, b) {\n var sa = getComputedStyle$1(a);\n var sb = getComputedStyle$1(b);\n var za = parseFloat(getPropertyValue(sa, \"z-index\"));\n var zb = parseFloat(getPropertyValue(sb, \"z-index\"));\n var pa = getPropertyValue(sa, \"position\");\n var pb = getPropertyValue(sb, \"position\");\n if (isNaN(za) && isNaN(zb)) {\n if ((/static|absolute/.test(pa)) && (/static|absolute/.test(pb))) {\n return 0;\n }\n if (pa == \"static\") {\n return -1;\n }\n if (pb == \"static\") {\n return 1;\n }\n return 0;\n }\n if (isNaN(za)) {\n return zb === 0 ? 0 : zb > 0 ? -1 : 1;\n }\n if (isNaN(zb)) {\n return za === 0 ? 0 : za > 0 ? 1 : -1;\n }\n return parseFloat(za) - parseFloat(zb);\n }\n\n function isFormField(element) {\n return /^(?:textarea|select|input)$/i.test(element.tagName);\n }\n\n function getSelectedOption(element) {\n if (element.selectedOptions && element.selectedOptions.length > 0) {\n return element.selectedOptions[0];\n }\n return element.options[element.selectedIndex];\n }\n\n function renderCheckbox(element, group) {\n var style = getComputedStyle$1(element);\n var color = getPropertyValue(style, \"color\");\n var box = element.getBoundingClientRect();\n if (element.type == \"checkbox\") {\n group.append(\n Path.fromRect(\n new Rect([ box.left+1, box.top+1 ],\n [ box.width-2, box.height-2 ])\n ).stroke(color, 1)\n );\n if (element.checked) {\n // fill a rectangle inside? looks kinda ugly.\n // group.append(\n // Path.fromRect(\n // new geo.Rect([ box.left+4, box.top+4 ],\n // [ box.width-8, box.height-8])\n // ).fill(color).stroke(null)\n // );\n\n // let's draw a checkmark instead. artistic, eh?\n group.append(\n new Path()\n .stroke(color, 1.2)\n .moveTo(box.left + 0.22 * box.width,\n box.top + 0.55 * box.height)\n .lineTo(box.left + 0.45 * box.width,\n box.top + 0.75 * box.height)\n .lineTo(box.left + 0.78 * box.width,\n box.top + 0.22 * box.width)\n );\n }\n } else {\n group.append(\n new Circle(\n new Circle$2([\n (box.left + box.right) / 2,\n (box.top + box.bottom) / 2\n ], Math.min(box.width-2, box.height-2) / 2)\n ).stroke(color, 1)\n );\n if (element.checked) {\n group.append(\n new Circle(\n new Circle$2([\n (box.left + box.right) / 2,\n (box.top + box.bottom) / 2\n ], Math.min(box.width-8, box.height-8) / 2)\n ).fill(color).stroke(null)\n );\n }\n }\n }\n\n function renderFormField(element, group) {\n var tag = element.tagName.toLowerCase();\n if (tag == \"input\" && (element.type == \"checkbox\" || element.type == \"radio\")) {\n return renderCheckbox(element, group);\n }\n var p = element.parentNode;\n var doc = element.ownerDocument;\n var el = doc.createElement(KENDO_PSEUDO_ELEMENT);\n var option;\n el.style.cssText = getCssText(getComputedStyle$1(element));\n if (tag == \"input\") {\n el.style.whiteSpace = \"pre\";\n }\n if (tag == \"select\" || tag == \"textarea\") {\n el.style.overflow = \"auto\";\n }\n if (tag == \"select\") {\n if (element.multiple) {\n for (var i = 0; i < element.options.length; ++i) {\n option = doc.createElement(KENDO_PSEUDO_ELEMENT);\n option.style.cssText = getCssText(getComputedStyle$1(element.options[i]));\n option.style.display = \"block\"; // IE9 messes up without this\n option.textContent = element.options[i].textContent;\n el.appendChild(option);\n }\n } else {\n option = getSelectedOption(element);\n if (option) {\n el.textContent = option.textContent;\n }\n }\n } else {\n el.textContent = element.value;\n }\n p.insertBefore(el, element);\n el.scrollLeft = element.scrollLeft;\n el.scrollTop = element.scrollTop;\n\n // must temporarily hide the original element, otherwise it\n // may affect layout of the fake element we want to render.\n element.style.display = \"none\";\n\n renderContents(el, group);\n element.style.display = \"\";\n p.removeChild(el);\n }\n\n function serializeSVG(element) {\n var serializer = new window.XMLSerializer();\n var xml = serializer.serializeToString(element);\n\n if (browser.mozilla && !(element.getAttribute(\"width\") && element.getAttribute(\"height\"))) {\n var doc = new window.DOMParser().parseFromString(xml, \"image/svg+xml\");\n var svg$$1 = doc.documentElement;\n var box = getContentBox(element);\n svg$$1.setAttribute(\"width\", box.width);\n svg$$1.setAttribute(\"height\", box.height);\n xml = serializer.serializeToString(svg$$1);\n }\n\n return xml;\n }\n\n function renderContents(element, group) {\n if (nodeInfo._stackingContext.element === element) {\n // the group that was set in pushNodeInfo might have\n // changed due to clipping/transforms, update it here.\n nodeInfo._stackingContext.group = group;\n }\n switch (element.tagName.toLowerCase()) {\n case \"img\":\n renderImage(element, element.src, group);\n break;\n\n case \"svg\":\n var xml = serializeSVG(element);\n var dataURL = \"data:image/svg+xml;base64,\" + (encodeBase64(xml));\n renderImage(element, dataURL, group);\n break;\n\n case \"canvas\":\n try {\n renderImage(element, element.toDataURL(\"image/png\"), group);\n } catch (ex) {\n // tainted; can't draw it, ignore.\n }\n break;\n\n case \"textarea\":\n case \"input\":\n case \"select\":\n renderFormField(element, group);\n break;\n\n default:\n var children = [], floats = [], positioned = [];\n for (var i = element.firstChild; i; i = i.nextSibling) {\n switch (i.nodeType) {\n case 3: // Text\n if (/\\S/.test(i.data)) {\n renderText(element, i, group);\n }\n break;\n case 1: // Element\n var style = getComputedStyle$1(i);\n var floating = getPropertyValue(style, \"float\");\n var position = getPropertyValue(style, \"position\");\n if (position != \"static\") {\n positioned.push(i);\n }\n else if (floating != \"none\") {\n floats.push(i);\n } else {\n children.push(i);\n }\n break;\n }\n }\n\n mergeSort(children, zIndexSort).forEach(function(el){ renderElement(el, group); });\n mergeSort(floats, zIndexSort).forEach(function(el){ renderElement(el, group); });\n mergeSort(positioned, zIndexSort).forEach(function(el){ renderElement(el, group); });\n }\n }\n\n function renderText(element, node, group) {\n if (emptyClipbox()) {\n return;\n }\n var style = getComputedStyle$1(element);\n\n if (parseFloat(getPropertyValue(style, \"text-indent\")) < -500) {\n // assume it should not be displayed. the slider's\n // draggable handle displays a Drag text for some reason,\n // having text-indent: -3333px.\n return;\n }\n\n var text = node.data;\n var start = 0;\n var end = text.search(/\\S\\s*$/) + 1;\n\n if (!end) {\n return; // whitespace-only node\n }\n\n var fontSize = getPropertyValue(style, \"font-size\");\n var lineHeight = getPropertyValue(style, \"line-height\");\n\n // simply getPropertyValue(\"font\") doesn't work in Firefox :-\\\n var font = [\n getPropertyValue(style, \"font-style\"),\n getPropertyValue(style, \"font-variant\"),\n getPropertyValue(style, \"font-weight\"),\n fontSize, // no need for line height here; it breaks layout in FF\n getPropertyValue(style, \"font-family\")\n ].join(\" \");\n\n fontSize = parseFloat(fontSize);\n lineHeight = parseFloat(lineHeight);\n\n if (fontSize === 0) {\n return;\n }\n\n var color = getPropertyValue(style, \"color\");\n var range = element.ownerDocument.createRange();\n var align$$1 = getPropertyValue(style, \"text-align\");\n var isJustified = align$$1 == \"justify\";\n var columnCount = getPropertyValue(style, \"column-count\", 1);\n var whiteSpace = getPropertyValue(style, \"white-space\");\n var textTransform = getPropertyValue(style, \"text-transform\");\n\n // A line of 500px, with a font of 12px, contains an average of 80 characters, but since we\n // err, we'd like to guess a bigger number rather than a smaller one. Multiplying by 5\n // seems to be a good option.\n var estimateLineLength = element.getBoundingClientRect().width / fontSize * 5;\n if (estimateLineLength === 0) {\n estimateLineLength = 500;\n }\n\n // we'll maintain this so we can workaround bugs in Chrome's Range.getClientRects\n // https://github.com/telerik/kendo/issues/5740\n var prevLineBottom = null;\n\n var underline = nodeInfo[\"underline\"];\n var lineThrough = nodeInfo[\"line-through\"];\n var overline = nodeInfo[\"overline\"];\n var hasDecoration = underline || lineThrough || overline;\n\n // doChunk returns true when all text has been rendered\n while (!doChunk()) {}\n\n if (hasDecoration) {\n range.selectNode(node);\n slice$1$1(range.getClientRects()).forEach(decorate);\n }\n\n return; // only function declarations after this line\n\n function actuallyGetRangeBoundingRect(range) {\n // XXX: to be revised when this Chrome bug is fixed:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=612459\n if (microsoft || browser.chrome || browser.safari) {\n // Workaround browser bugs: IE and Chrome would sometimes\n // return 0 or 1-width rectangles before or after the main\n // one. https://github.com/telerik/kendo/issues/4674\n\n // Actually Chrome 50 got worse, since the rectangles can now have the width of a\n // full character, making it hard to tell whether it's a bogus rectangle or valid\n // selection location. The workaround is to ignore rectangles that fall on the\n // previous line. https://github.com/telerik/kendo/issues/5740\n var rectangles = range.getClientRects(), box = {\n top : Infinity,\n right : -Infinity,\n bottom : -Infinity,\n left : Infinity\n }, done = false;\n for (var i = 0; i < rectangles.length; ++i) {\n var b = rectangles[i];\n if (b.width <= 1 || b.bottom === prevLineBottom) {\n continue; // bogus rectangle\n }\n box.left = Math.min(b.left , box.left);\n box.top = Math.min(b.top , box.top);\n box.right = Math.max(b.right , box.right);\n box.bottom = Math.max(b.bottom , box.bottom);\n done = true;\n }\n if (!done) {\n return range.getBoundingClientRect();\n }\n box.width = box.right - box.left;\n box.height = box.bottom - box.top;\n return box;\n }\n return range.getBoundingClientRect();\n }\n\n // Render a chunk of text, typically one line (but for justified text we render each word as\n // a separate Text object, because spacing is variable). Returns true when it finished the\n // current node. After each chunk it updates `start` to just after the last rendered\n // character.\n function doChunk() {\n var origStart = start;\n var box, pos = text.substr(start).search(/\\S/);\n start += pos;\n if (pos < 0 || start >= end) {\n return true;\n }\n\n // Select a single character to determine the height of a line of text. The box.bottom\n // will be essential for us to figure out where the next line begins.\n range.setStart(node, start);\n range.setEnd(node, start + 1);\n box = actuallyGetRangeBoundingRect(range);\n\n // for justified text we must split at each space, because space has variable width.\n var found = false;\n if (isJustified || columnCount > 1) {\n pos = text.substr(start).search(/\\s/);\n if (pos >= 0) {\n // we can only split there if it's on the same line, otherwise we'll fall back\n // to the default mechanism (see findEOL below).\n range.setEnd(node, start + pos);\n var r = actuallyGetRangeBoundingRect(range);\n if (r.bottom == box.bottom) {\n box = r;\n found = true;\n start += pos;\n }\n }\n }\n\n if (!found) {\n // This code does three things: (1) it selects one line of text in `range`, (2) it\n // leaves the bounding rect of that line in `box` and (3) it returns the position\n // just after the EOL. We know where the line starts (`start`) but we don't know\n // where it ends. To figure this out, we select a piece of text and look at the\n // bottom of the bounding box. If it changes, we have more than one line selected\n // and should retry with a smaller selection.\n //\n // To speed things up, we first try to select all text in the node (`start` ->\n // `end`). If there's more than one line there, then select only half of it. And\n // so on. When we find a value for `end` that fits in one line, we try increasing\n // it (also in halves) until we get to the next line. The algorithm stops when the\n // right side of the bounding box does not change.\n //\n // One more thing to note is that everything happens in a single Text DOM node.\n // There's no other tags inside it, therefore the left/top coordinates of the\n // bounding box will not change.\n pos = (function findEOL(min, eol, max){\n range.setEnd(node, eol);\n var r = actuallyGetRangeBoundingRect(range);\n if (r.bottom != box.bottom && min < eol) {\n return findEOL(min, (min + eol) >> 1, eol);\n } else if (r.right != box.right) {\n box = r;\n if (eol < max) {\n return findEOL(eol, (eol + max) >> 1, max);\n } else {\n return eol;\n }\n } else {\n return eol;\n }\n })(start, Math.min(end, start + estimateLineLength), end);\n\n if (pos == start) {\n // if EOL is at the start, then no more text fits on this line. Skip the\n // remainder of this node entirely to avoid a stack overflow.\n return true;\n }\n start = pos;\n\n pos = range.toString().search(/\\s+$/);\n if (pos === 0) {\n return false; // whitespace only; we should not get here.\n }\n if (pos > 0) {\n // eliminate trailing whitespace\n range.setEnd(node, range.startOffset + pos);\n box = actuallyGetRangeBoundingRect(range);\n }\n }\n\n // another workaround for IE: if we rely on getBoundingClientRect() we'll overlap with the bullet for LI\n // elements. Calling getClientRects() and using the *first* rect appears to give us the correct location.\n // Note: not to be used in Chrome as it randomly returns a zero-width rectangle from the previous line.\n if (microsoft) {\n box = range.getClientRects()[0];\n }\n\n var str = range.toString();\n if (!/^(?:pre|pre-wrap)$/i.test(whiteSpace)) {\n // node with non-significant space -- collapse whitespace.\n str = str.replace(/\\s+/g, \" \");\n }\n else if (/\\t/.test(str)) {\n // with significant whitespace we need to do something about literal TAB characters.\n // There's no TAB glyph in a font so they would be rendered in PDF as an empty box,\n // and the whole text will stretch to fill the original width. The core PDF lib\n // does not have sufficient context to deal with it.\n\n // calculate the starting column here, since we initially discarded any whitespace.\n var cc = 0;\n for (pos = origStart; pos < range.startOffset; ++pos) {\n var code = text.charCodeAt(pos);\n if (code == 9) {\n // when we meet a TAB we must round up to the next tab stop.\n // in all browsers TABs seem to be 8 characters.\n cc += 8 - cc % 8;\n } else if (code == 10 || code == 13) {\n // just in case we meet a newline we must restart.\n cc = 0;\n } else {\n // ordinary character --> advance one column\n cc++;\n }\n }\n\n // based on starting column, replace any TAB characters in the string we actually\n // have to display with spaces so that they align to columns multiple of 8.\n while ((pos = str.search(\"\\t\")) >= 0) {\n var indent = \" \".substr(0, 8 - (cc + pos) % 8);\n str = str.substr(0, pos) + indent + str.substr(pos + 1);\n }\n }\n\n if (!found) {\n prevLineBottom = box.bottom;\n }\n drawText(str, box);\n }\n\n function drawText(str, box) {\n // In IE the box height will be approximately lineHeight, while in\n // other browsers it'll (correctly) be the height of the bounding\n // box for the current text/font. Which is to say, IE sucks again.\n // The only good solution I can think of is to measure the text\n // ourselves and center the bounding box.\n if (microsoft && !isNaN(lineHeight)) {\n var height = getFontHeight(font);\n var top = (box.top + box.bottom - height) / 2;\n box = {\n top : top,\n right : box.right,\n bottom : top + height,\n left : box.left,\n height : height,\n width : box.right - box.left\n };\n }\n\n // var path = new Path({ stroke: { color: \"red\" }});\n // path.moveTo(box.left, box.top)\n // .lineTo(box.right, box.top)\n // .lineTo(box.right, box.bottom)\n // .lineTo(box.left, box.bottom)\n // .close();\n // group.append(path);\n\n switch (textTransform) {\n case \"uppercase\":\n str = str.toUpperCase();\n break;\n case \"lowercase\":\n str = str.toLowerCase();\n break;\n case \"capitalize\":\n str = str.replace(/(?:^|\\s)\\S/g, function (l) { return l.toUpperCase(); });\n break;\n }\n\n var text = new TextRect(\n str, new Rect([ box.left, box.top ],\n [ box.width, box.height ]),\n {\n font: font,\n fill: { color: color }\n }\n );\n group.append(text);\n }\n\n function decorate(box) {\n line(underline, box.bottom);\n line(lineThrough, box.bottom - box.height / 2.7);\n line(overline, box.top);\n function line(color, ypos) {\n if (color) {\n var width = fontSize / 12;\n var path = new Path({ stroke: {\n width: width,\n color: color\n }});\n\n ypos -= width;\n path.moveTo(box.left, ypos)\n .lineTo(box.right, ypos);\n group.append(path);\n }\n }\n }\n }\n\n function groupInStackingContext(element, group, zIndex) {\n var main;\n if (zIndex != \"auto\") {\n // use the current stacking context\n main = nodeInfo._stackingContext.group;\n zIndex = parseFloat(zIndex);\n } else {\n // normal flow — use given container. we still have to\n // figure out where should we insert this element with the\n // assumption that its z-index is zero, as the group might\n // already contain elements with higher z-index.\n main = group;\n zIndex = 0;\n }\n var a = main.children;\n for (var i = 0; i < a.length; ++i) {\n if (a[i]._dom_zIndex != null && a[i]._dom_zIndex > zIndex) {\n break;\n }\n }\n\n var tmp = new Group();\n main.insert(i, tmp);\n tmp._dom_zIndex = zIndex;\n\n if (main !== group) {\n // console.log(\"Placing\", element, \"in\", nodeInfo._stackingContext.element, \"at position\", i, \" / \", a.length);\n // console.log(a.slice(i+1));\n\n // if (nodeInfo._matrix) {\n // tmp.transform(nodeInfo._matrix);\n // }\n if (nodeInfo._clipbox) {\n var m = nodeInfo._matrix.invert();\n var r = nodeInfo._clipbox.transformCopy(m);\n setClipping(tmp, Path.fromRect(r));\n // console.log(r);\n // tmp.append(Path.fromRect(r));\n // tmp.append(new Text(element.className || element.id, r.topLeft()));\n }\n }\n\n return tmp;\n }\n\n function renderElement(element, container) {\n var style = getComputedStyle$1(element);\n\n updateCounters(style);\n\n if (/^(style|script|link|meta|iframe|col|colgroup)$/i.test(element.tagName)) {\n return;\n }\n\n if (nodeInfo._clipbox == null) {\n return;\n }\n\n var opacity = parseFloat(getPropertyValue(style, \"opacity\"));\n var visibility = getPropertyValue(style, \"visibility\");\n var display = getPropertyValue(style, \"display\");\n\n if (opacity === 0 || visibility == \"hidden\" || display == \"none\") {\n return;\n }\n\n var tr = getTransform(style);\n var group;\n\n var zIndex = getPropertyValue(style, \"z-index\");\n if ((tr || opacity < 1) && zIndex == \"auto\") {\n zIndex = 0;\n }\n group = groupInStackingContext(element, container, zIndex);\n\n // XXX: remove at some point\n // group._pdfElement = element;\n // group.options._pdfDebug = \"\";\n // if (element.id) {\n // group.options._pdfDebug = \"#\" + element.id;\n // }\n // if (element.className) {\n // group.options._pdfDebug += \".\" + element.className.split(\" \").join(\".\");\n // }\n\n if (opacity < 1) {\n group.opacity(opacity * group.opacity());\n }\n\n pushNodeInfo(element, style, group);\n\n if (!tr) {\n _renderWithPseudoElements(element, group);\n }\n else {\n saveStyle(element, function(){\n // must clear transform, so getBoundingClientRect returns correct values.\n pleaseSetPropertyValue(element.style, \"transform\", \"none\", \"important\");\n\n // must also clear transitions, so correct values are returned *immediately*\n pleaseSetPropertyValue(element.style, \"transition\", \"none\", \"important\");\n\n // the presence of any transform makes it behave like it had position: relative,\n // because why not.\n // http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/\n if (getPropertyValue(style, \"position\") == \"static\") {\n // but only if it's not already positioned. :-/\n pleaseSetPropertyValue(element.style, \"position\", \"relative\", \"important\");\n }\n\n // must translate to origin before applying the CSS\n // transformation, then translate back.\n var bbox = element.getBoundingClientRect();\n var x = bbox.left + tr.origin[0];\n var y = bbox.top + tr.origin[1];\n var m = [ 1, 0, 0, 1, -x, -y ];\n m = mmul(m, tr.matrix);\n m = mmul(m, [ 1, 0, 0, 1, x, y ]);\n m = setTransform$1(group, m);\n\n nodeInfo._matrix = nodeInfo._matrix.multiplyCopy(m);\n\n _renderWithPseudoElements(element, group);\n });\n }\n\n popNodeInfo();\n\n //drawDebugBox(element.getBoundingClientRect(), container);\n }\n\n // function drawDebugBox(box, group, color) {\n // var path = Path.fromRect(new geo.Rect([ box.left, box.top ], [ box.width, box.height ]));\n // if (color) {\n // path.stroke(color);\n // }\n // group.append(path);\n // }\n\n // function dumpTextNode(node) {\n // var txt = node.data.replace(/^\\s+/, \"\");\n // if (txt.length < 100) {\n // console.log(node.data.length + \": |\" + txt);\n // } else {\n // console.log(node.data.length + \": |\" + txt.substr(0, 50) + \"|...|\" + txt.substr(-50));\n // }\n // }\n\n function mmul(a, b) {\n var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5];\n var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5];\n return [\n a1*a2 + b1*c2, a1*b2 + b1*d2,\n c1*a2 + d1*c2, c1*b2 + d1*d2,\n e1*a2 + f1*c2 + e2, e1*b2 + f1*d2 + f2\n ];\n }\n\n var drawing = {\n \tsvg: svg$1,\n \tcanvas: canvas,\n \tutil: util,\n \tHasObservers: HasObservers,\n \tPathParser: PathParser,\n \tparsePath: parsePath,\n \tBaseNode: BaseNode,\n \tOptionsStore: OptionsStore,\n \tSurface: Surface,\n \tSurfaceFactory: SurfaceFactory,\n \texportImage: exportImage,\n \texportSVG: exportSVG,\n \tQuadNode: QuadNode,\n \tShapesQuadTree: ShapesQuadTree,\n \tElement: Element$1,\n \tCircle: Circle,\n \tArc: Arc,\n \tPath: Path,\n \tMultiPath: MultiPath,\n \tText: Text,\n \tImage: Image$1,\n \tGroup: Group,\n \tLayout: Layout,\n \tRect: Rect$2,\n \talign: align,\n \tvAlign: vAlign,\n \tstack: stack,\n \tvStack: vStack,\n \twrap: wrap,\n \tvWrap: vWrap,\n \tfit: fit,\n \tLinearGradient: LinearGradient,\n \tRadialGradient: RadialGradient,\n \tGradientStop: GradientStop,\n \tGradient: Gradient,\n \tAnimation: Animation,\n \tAnimationFactory: AnimationFactory,\n \tdrawDOM: drawDOM,\n \tdrawText: drawText,\n \tgetFontFaces: getFontFaces\n };\n\n kendo.deepExtend(kendo, {\n drawing: drawing,\n geometry: geometry\n });\n\n kendo.drawing.Segment = kendo.geometry.Segment;\n kendo.dataviz.drawing = kendo.drawing;\n kendo.dataviz.geometry = kendo.geometry;\n kendo.drawing.util.measureText = kendo.util.measureText;\n kendo.drawing.util.objectKey = kendo.util.objectKey;\n kendo.drawing.Color = kendo.Color;\n kendo.util.encodeBase64 = kendo.drawing.util.encodeBase64;\n\n })(window.kendo.jQuery);\n\n (function($) {\n\n var NS = \".kendo\";\n var kendo = window.kendo;\n var deepExtend = kendo.deepExtend;\n var utils = kendo.drawing.util;\n var defined = utils.defined;\n var limitValue = utils.limitValue;\n var eventCoordinates = utils.eventCoordinates;\n var outerWidth = kendo._outerWidth;\n var outerHeight = kendo._outerHeight;\n\n var TOOLTIP_TEMPLATE = '
    ' +\n '
    ' +\n '
    ';\n var TOOLTIP_CLOSE_TEMPLATE = '
    ';\n\n var SurfaceTooltip = kendo.Class.extend({\n init: function(surface, options) {\n this.element = $(TOOLTIP_TEMPLATE);\n this.content = this.element.children(\".k-tooltip-content\");\n\n options = options || {};\n\n this.options = deepExtend({}, this.options, this._tooltipOptions(options));\n this.popupOptions = {\n appendTo: options.appendTo,\n animation: options.animation,\n copyAnchorStyles: false,\n collision: \"fit fit\"\n };\n\n this._openPopupHandler = this._openPopup.bind(this);\n\n this.surface = surface;\n this._bindEvents();\n },\n\n options: {\n position: \"top\",\n showOn: \"mouseenter\",\n offset: 7,\n autoHide: true,\n hideDelay: 0,\n showAfter: 100\n },\n\n _bindEvents: function() {\n this._showHandler = this._showEvent.bind(this);\n this._surfaceLeaveHandler = this._surfaceLeave.bind(this);\n this._mouseleaveHandler = this._mouseleave.bind(this);\n this._mousemoveHandler = this._mousemove.bind(this);\n\n this.surface.bind(\"click\", this._showHandler);\n this.surface.bind(\"mouseenter\", this._showHandler);\n this.surface.bind(\"mouseleave\", this._mouseleaveHandler);\n this.surface.bind(\"mousemove\", this._mousemoveHandler);\n\n this.surface.element.on(\"mouseleave\" + NS, this._surfaceLeaveHandler);\n\n this.element.on(\"click\" + NS, \".k-tooltip-button\", this._hideClick.bind(this));\n this.element.on(\"mouseleave\" + NS, this._tooltipLeave.bind(this));\n },\n\n getPopup: function() {\n if (!this.popup) {\n this.popup = new kendo.ui.Popup(this.element, this.popupOptions);\n }\n\n return this.popup;\n },\n\n destroy: function() {\n var popup = this.popup;\n\n this.surface.unbind(\"click\", this._showHandler);\n this.surface.unbind(\"mouseenter\", this._showHandler);\n this.surface.unbind(\"mouseleave\", this._mouseleaveHandler);\n this.surface.unbind(\"mousemove\", this._mousemoveHandler);\n\n this.surface.element.off(\"mouseleave\" + NS, this._surfaceLeaveHandler);\n this.element.off(\"click\" + NS);\n this.element.off(\"mouseleave\" + NS);\n\n if (popup) {\n popup.destroy();\n delete this.popup;\n }\n delete this.popupOptions;\n\n clearTimeout(this._timeout);\n\n delete this.element;\n delete this.content;\n delete this.surface;\n },\n\n _tooltipOptions: function(options) {\n options = options || {};\n return {\n position: options.position,\n showOn: options.showOn,\n offset: options.offset,\n autoHide: options.autoHide,\n width: options.width,\n height: options.height,\n content: options.content,\n shared: options.shared,\n hideDelay: options.hideDelay,\n showAfter: options.showAfter\n };\n },\n\n _tooltipShape: function(shape) {\n while (shape && !shape.options.tooltip) {\n shape = shape.parent;\n }\n return shape;\n },\n\n _updateContent: function(target, shape, options) {\n var content = options.content;\n if (kendo.isFunction(content)) {\n content = content({\n element: shape,\n target: target\n });\n }\n\n if (content) {\n this.content.html(content);\n return true;\n }\n },\n\n _position: function(shape, options, elementSize, event) {\n var position = options.position;\n var tooltipOffset = options.offset || 0;\n var surface = this.surface;\n var offset = surface._instance._elementOffset();\n var size = surface.getSize();\n var surfaceOffset = surface._instance._offset;\n var bbox = shape.bbox();\n var width = elementSize.width;\n var height = elementSize.height;\n var left = 0, top = 0;\n\n bbox.origin.translate(offset.left, offset.top);\n if (surfaceOffset) {\n bbox.origin.translate(-surfaceOffset.x, -surfaceOffset.y);\n }\n\n if (position == \"cursor\" && event) {\n var coord = eventCoordinates(event);\n left = coord.x - width / 2;\n top = coord.y - height - tooltipOffset;\n } else if (position == \"left\") {\n left = bbox.origin.x - width - tooltipOffset;\n top = bbox.center().y - height / 2;\n } else if (position == \"right\") {\n left = bbox.bottomRight().x + tooltipOffset;\n top = bbox.center().y - height / 2;\n } else if (position == \"bottom\") {\n left = bbox.center().x - width / 2;\n top = bbox.bottomRight().y + tooltipOffset;\n } else {\n left = bbox.center().x - width / 2;\n top = bbox.origin.y - height - tooltipOffset;\n }\n\n return {\n left: limitValue(left, offset.left, offset.left + size.width),\n top: limitValue(top, offset.top, offset.top + size.height)\n };\n },\n\n show: function(shape, options) {\n this._show(shape, shape, deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip), options));\n },\n\n hide: function() {\n var popup = this.popup;\n var current = this._current;\n\n delete this._current;\n clearTimeout(this._showTimeout);\n if (popup && popup.visible() && current &&\n !this.surface.trigger(\"tooltipClose\", { element: current.shape, target: current.target, popup: popup })) {\n popup.close();\n }\n },\n\n _hideClick: function(e) {\n e.preventDefault();\n this.hide();\n },\n\n _show: function(target, shape, options, event, delay) {\n var current = this._current;\n\n clearTimeout(this._timeout);\n\n if (current && ((current.shape === shape && options.shared) || current.target === target)) {\n return;\n }\n\n clearTimeout(this._showTimeout);\n\n var popup = this.getPopup();\n\n if (!this.surface.trigger(\"tooltipOpen\", { element: shape, target: target, popup: popup }) &&\n this._updateContent(target, shape, options)) {\n\n this._autoHide(options);\n var elementSize = this._measure(options);\n\n if (popup.visible()) {\n popup.close(true);\n }\n\n this._current = {\n options: options,\n elementSize: elementSize,\n shape: shape,\n target: target,\n position: this._position(options.shared ? shape : target, options, elementSize, event)\n };\n\n if (delay) {\n this._showTimeout = setTimeout(this._openPopupHandler, options.showAfter || 0);\n } else {\n this._openPopup();\n }\n }\n },\n\n _openPopup: function() {\n var current = this._current;\n var position = current.position;\n\n this.getPopup().open(position.left, position.top);\n },\n\n _autoHide: function(options) {\n if (options.autoHide && this._closeButton) {\n this.element.removeClass(\"k-tooltip-closable\");\n this._closeButton.remove();\n delete this._closeButton;\n }\n\n if (!options.autoHide && !this._closeButton) {\n this.element.addClass(\"k-tooltip-closable\");\n this._closeButton = $(TOOLTIP_CLOSE_TEMPLATE).appendTo(this.element);\n }\n },\n\n _showEvent: function(e) {\n var shape = this._tooltipShape(e.element);\n\n if (shape) {\n var options = deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip));\n\n if (options && options.showOn == e.type) {\n this._show(e.element, shape, options, e.originalEvent, true);\n }\n }\n },\n\n _measure: function(options) {\n var popup = this.getPopup();\n var width, height;\n this.element.css({\n width: \"auto\",\n height: \"auto\"\n });\n var visible = popup.visible();\n if (!visible) {\n popup.wrapper.show();\n }\n\n this.element.css({\n width: defined(options.width) ? options.width : \"auto\",\n height: defined(options.height) ? options.height : \"auto\"\n });\n\n width = outerWidth(this.element);\n height = outerHeight(this.element);\n\n if (!visible) {\n popup.wrapper.hide();\n }\n\n return {\n width: width,\n height: height\n };\n },\n\n _mouseleave: function(e) {\n if (this.popup && !this._popupRelatedTarget(e.originalEvent)) {\n var tooltip = this;\n var current = tooltip._current;\n\n if (current && current.options.autoHide) {\n tooltip._timeout = setTimeout(function() {\n clearTimeout(tooltip._showTimeout);\n tooltip.hide();\n }, current.options.hideDelay || 0);\n }\n }\n },\n\n _mousemove: function(e) {\n var current = this._current;\n if (current && e.element) {\n var options = current.options;\n if (options.position == \"cursor\") {\n var position = this._position(e.element, options, current.elementSize, e.originalEvent);\n current.position = position;\n this.getPopup().wrapper.css({ left: position.left, top: position.top });\n }\n }\n },\n\n _surfaceLeave: function(e) {\n if (this.popup && !this._popupRelatedTarget(e)) {\n clearTimeout(this._showTimeout);\n this.hide();\n }\n },\n\n _popupRelatedTarget: function(e) {\n return e.relatedTarget && $(e.relatedTarget).closest(this.popup.wrapper).length;\n },\n\n _tooltipLeave: function() {\n var tooltip = this;\n var current = tooltip._current;\n if (current && current.options.autoHide) {\n tooltip._timeout = setTimeout(function() {\n tooltip.hide();\n }, current.options.hideDelay || 0);\n }\n }\n });\n\n kendo.drawing.SurfaceTooltip = SurfaceTooltip;\n\n })(window.kendo.jQuery);\n\n (function($) {\n\n var kendo = window.kendo;\n var draw = kendo.drawing;\n var DrawingSurface = draw.Surface;\n var Widget = kendo.ui.Widget;\n var deepExtend = kendo.deepExtend;\n\n kendo.support.svg = DrawingSurface.support.svg;\n kendo.support.canvas = DrawingSurface.support.canvas;\n\n var Surface = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, {});\n\n this.options = deepExtend({}, this.options, options);\n\n this._instance = DrawingSurface.create(this.element[0], options);\n if (this._instance.translate) {\n this.translate = translate;\n }\n\n this._triggerInstanceHandler = this._triggerInstanceEvent.bind(this);\n this._bindHandler(\"click\");\n this._bindHandler(\"mouseenter\");\n this._bindHandler(\"mouseleave\");\n this._bindHandler(\"mousemove\");\n\n this._enableTracking();\n },\n\n options: {\n name: \"Surface\",\n tooltip: {}\n },\n\n events: [\n \"click\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"resize\",\n \"tooltipOpen\",\n \"tooltipClose\"\n ],\n\n _triggerInstanceEvent: function(e) {\n this.trigger(e.type, e);\n },\n\n _bindHandler: function(event) {\n this._instance.bind(event, this._triggerInstanceHandler);\n },\n\n draw: function(element) {\n this._instance.draw(element);\n },\n\n clear: function() {\n if (this._instance) {\n this._instance.clear();\n }\n this.hideTooltip();\n },\n\n destroy: function() {\n if (this._instance) {\n this._instance.destroy();\n delete this._instance;\n }\n\n if (this._tooltip) {\n this._tooltip.destroy();\n delete this._tooltip;\n }\n\n Widget.fn.destroy.call(this);\n },\n\n exportVisual: function() {\n return this._instance.exportVisual();\n },\n\n eventTarget: function(e) {\n return this._instance.eventTarget(e);\n },\n\n showTooltip: function(shape, options) {\n if (this._tooltip) {\n this._tooltip.show(shape, options);\n }\n },\n\n hideTooltip: function() {\n if (this._tooltip) {\n this._tooltip.hide();\n }\n },\n\n suspendTracking: function() {\n this._instance.suspendTracking();\n this.hideTooltip();\n },\n\n resumeTracking: function() {\n this._instance.resumeTracking();\n },\n\n getSize: function() {\n return {\n width: this.element.width(),\n height: this.element.height()\n };\n },\n\n setSize: function(size) {\n this.element.css({\n width: size.width,\n height: size.height\n });\n\n this._size = size;\n this._instance.currentSize(size);\n this._resize();\n },\n\n _resize: function() {\n this._instance.currentSize(this._size);\n this._instance._resize();\n },\n\n _enableTracking: function() {\n if (kendo.ui.Popup) {\n this._tooltip = new draw.SurfaceTooltip(this, this.options.tooltip || {});\n }\n }\n });\n\n kendo.ui.plugin(Surface);\n\n Surface.create = function(element, options) {\n return new Surface(element, options);\n };\n\n kendo.drawing.Surface = Surface;\n\n function translate(offset) {\n this._instance.translate(offset);\n }\n\n })(window.kendo.jQuery);\n\n (function($) {\n\n var kendo = window.kendo;\n var drawing = kendo.drawing;\n var drawDOM = drawing.drawDOM;\n\n drawing.drawDOM = function(element, options) {\n return drawDOM($(element)[0], options);\n };\n\n // Aliases used by spreadsheet/print.js\n drawing.drawDOM.drawText = drawing.drawText;\n drawing.drawDOM.getFontFaces = drawing.getFontFaces;\n\n })(window.kendo.jQuery);\n\n var __meta__ = {\n id: \"drawing\",\n name: \"Drawing API\",\n category: \"framework\",\n description: \"The Kendo UI low-level drawing API\",\n depends: [ \"core\", \"color\", \"popup\" ]\n };\n\n}));\n"]}