{"version":3,"file":"kendo.drawing.min.js","sources":["kendo.drawing.js"],"sourcesContent":["(function(f, define) {\n define('drawing/util',['kendo.core'], f);\n})(function() {\n\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\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\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(function(f, define) {\n define('util/text-metrics',[\n \"kendo.core\"\n ], f);\n})(function() {\n\n(function($) {\n/* eslint-disable space-before-blocks, space-before-function-paren */\n\nwindow.kendo.util = window.kendo.util || {};\n\nvar 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\nvar REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\nvar SPACE = ' ';\n\nfunction normalizeText(text) {\n return String(text).replace(REPLACE_REGEX, SPACE);\n}\n\nfunction 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\nfunction 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\nfunction zeroSize() {\n return { width: 0, height: 0, baseline: 0 };\n}\n\nvar DEFAULT_OPTIONS = {\n baselineMarkerSize: 1\n};\n\nvar defaultMeasureBox;\n\nif (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\nvar 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\nTextMetrics.current = new TextMetrics();\n\nfunction measureText(text, style, measureBox) {\n return TextMetrics.current.measure(text, style, measureBox);\n}\n\nkendo.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}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3){ (a3 || a2)(); });\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(function(f, define) {\n define('drawing/kendo-drawing',[ \"./util\", \"kendo.color\", '../util/text-metrics' ], f);\n})(function() {\n\n(function($) {\n/* eslint-disable space-before-blocks, space-before-function-paren */\n\nwindow.kendo = window.kendo || {};\nvar kendoDrawing = kendo.drawing;\nvar kendoDrawingUtil = kendoDrawing.util;\nvar extendStatic = kendoDrawingUtil.extendStatic;\nvar Class = kendo.Class;\nvar kendoUtil = kendo.util;\nvar support = kendo.support;\nvar supportBrowser = support.browser;\n\nvar createPromise = kendoDrawingUtil.createPromise;\nvar promiseAll = kendoDrawingUtil.promiseAll;\n\nvar 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\nfunction 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\nvar 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\nfunction 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\nvar UNDEFINED = \"undefined\";\n\nfunction defined(value) {\n return typeof value !== UNDEFINED;\n}\n\nvar defId = 1;\n\nfunction definitionId() {\n return \"kdef\" + defId++;\n}\n\nvar DEG_TO_RAD = Math.PI / 180;\nvar MAX_NUM = Number.MAX_VALUE;\nvar MIN_NUM = -Number.MAX_VALUE;\n\nfunction deg(radians) {\n return radians / DEG_TO_RAD;\n}\n\nvar fromCharCode = String.fromCharCode;\n\n// Encodes a string as UTF-8\nfunction 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\nvar KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nfunction 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\nfunction 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\nfunction eventElement(e) {\n if (e === void 0) { e = {}; }\n\n return e.touch ? e.touch.initialTouch : e.target;\n}\n\nfunction isTransparent(color) {\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\n}\n\nfunction last(array) {\n if (array) {\n return array[array.length - 1];\n }\n}\n\nfunction 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.\nfunction 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\nvar now = Date.now || function() {\n return new Date().getTime();\n};\n\nfunction rad(degrees) {\n return degrees * DEG_TO_RAD;\n}\n\nfunction pow(p) {\n if (p) {\n return Math.pow(10, p);\n }\n\n return 1;\n}\n\nfunction round(value, precision) {\n var power = pow(precision);\n return Math.round(value * power) / power;\n}\n\nfunction valueOrDefault(value, defaultValue) {\n return defined(value) ? value : defaultValue;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction getPixels(value) {\n if (isNaN(value)) {\n return value;\n }\n return value + \"px\";\n}\n\nfunction 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\nfunction 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\nfunction 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\nvar 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\nMatrix.IDENTITY = Matrix.unit();\n\nvar matrixRegexp = /matrix\\((.*)\\)/;\n\nfunction 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\nfunction 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\nfunction 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\nvar 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\nvar toString$1 = {}.toString;\n\nvar OptionsStore = (function (HasObservers$$1) {\n function OptionsStore(options, prefix) {\n var this$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._wrap(member, field);\n this$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 = 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);\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\nfunction 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\nfunction getAccessor(field) {\n return function() {\n return this[field];\n };\n}\n\nfunction 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\nvar 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\nfunction toMatrix(transformation) {\n if (transformation && typeof transformation.matrix === \"function\") {\n return transformation.matrix();\n }\n\n return transformation;\n}\n\nvar 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\nvar 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\nvar 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\nvar 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\nfunction 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\nvar 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\nfunction 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\nvar PI_DIV_2 = Math.PI / 2;\n\nvar 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 = 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._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\n var currentPointY = this$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\nvar GRADIENT = \"Gradient\";\n\nvar 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\nvar IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\n\nvar 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\nfunction 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\nfunction defineGeometryAccessors(fn, names) {\n for (var i = 0; i < names.length; i++) {\n fn[names[i]] = geometryAccessor(names[i]);\n }\n}\n\nvar 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\nvar DEFAULT_STROKE = \"#000\";\n\nvar 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\nvar PRECISION = 10;\n\nfunction close$1(a, b, tolerance) {\n if (tolerance === void 0) { tolerance = PRECISION; }\n\n return round(Math.abs(a - b), tolerance) === 0;\n}\n\nfunction closeOrLess(a, b, tolerance) {\n return a < b || close$1(a, b, tolerance);\n}\n\nfunction 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\nvar MAX_INTERVAL = 45;\nvar pow$1 = Math.pow;\nvar accessors = [ \"radiusX\", \"radiusY\", \"startAngle\", \"endAngle\", \"anticlockwise\" ];\n\nvar 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 = 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._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 = 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.pointAt(currentAngleX).transformCopy(matrix);\n currentAngleX += 90;\n }\n\n var currentPointY = (void 0);\n if (currentAngleY < endAngle) {\n currentPointY = this$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\nfunction 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\nfunction 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\nfunction bboxStartAngle(angle, start) {\n var startAngle = angle;\n\n while (startAngle < start) {\n startAngle += 90;\n }\n\n return startAngle;\n}\n\nvar push = [].push;\nvar pop = [].pop;\nvar splice = [].splice;\nvar shift = [].shift;\nvar slice = [].slice;\nvar unshift = [].unshift;\n\nvar 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 = this;\n\n var length = this.length;\n\n for (var idx = 0; idx < length; idx++) {\n if (this$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 = this;\n\n for (var idx = 0; idx < elements.length; idx++) {\n elements[idx].addObserver(this$1);\n }\n };\n\n ElementsArray.prototype._clearObserver = function _clearObserver (elements) {\n var this$1 = this;\n\n for (var idx = 0; idx < elements.length; idx++) {\n elements[idx].removeObserver(this$1);\n }\n };\n\n ElementsArray.prototype._change = function _change () {};\n\n return ElementsArray;\n}(HasObservers));\n\nvar 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\nfunction 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\nfunction 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\nfunction 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\nvar 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\nfunction numberSign$1(x) {\n return x < 0 ? -1 : 1;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction definePointAccessors(fn, names) {\n for (var i = 0; i < names.length; i++) {\n fn[names[i]] = pointAccessor(names[i]);\n }\n}\n\nvar 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\nvar points = [ \"anchor\", \"controlIn\", \"controlOut\" ];\n\nvar 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\nfunction 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\nvar 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\nvar WEIGHT = 0.333;\nvar EXTREMUM_ALLOWED_DEVIATION = 0.01;\nvar X = \"x\";\nvar Y = \"y\";\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction point(xValue, yValue, xField, yField) {\n var controlPoint = new Point();\n controlPoint[xField] = xValue;\n controlPoint[yField] = yValue;\n\n return controlPoint;\n}\n\nfunction 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\nfunction numberSign(value) {\n return value <= 0 ? -1 : 1;\n}\n\nvar 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\nfunction 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\nfunction reflectionPoint(point, center) {\n if (point && center) {\n return center.scaleCopy(2).translate(-point.x, -point.y);\n }\n}\n\nvar third = 1 / 3;\n\nfunction 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\nvar SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\nvar SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\nvar MOVE = \"m\";\nvar CLOSE = \"z\";\n\nfunction parseParameters(str) {\n var parameters = [];\n str.replace(SPLIT_REGEX, function(match, number) {\n parameters.push(parseFloat(number));\n });\n return parameters;\n}\n\nfunction 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\nfunction 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\nfunction 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\nvar SPACE = ' ';\nvar printPoints = function (precision) { return function () {\n var points = [], len = arguments.length;\n while ( len-- ) points[ len ] = arguments[ len ];\n\n return points.map(function (p) { return p.toString(precision); }).join(SPACE);\n } };\nvar segmentType = function (segmentStart, segmentEnd) { return segmentStart.controlOut() && segmentEnd.controlIn() ? 'C' : 'L'; };\n\nvar 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 = 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.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\nvar 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\nvar DEFAULT_STROKE$1 = \"#000\";\n\nvar 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\nvar DEFAULT_FONT = \"12px sans-serif\";\nvar DEFAULT_FILL = \"#000\";\n\nvar 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\nvar 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\nvar 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\nvar 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 = 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 && 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\nfunction 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\nfunction 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\nfunction 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\nvar 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\nvar forEach = function (elements, callback) {\n elements.forEach(callback);\n};\n\nvar 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\nvar 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 = 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.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.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 = 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._rect.size[sizeField]) {\n if (group.bboxes.length === 0) {\n this$1._addToGroup(group, bbox, element);\n addGroup();\n group = this$1._newGroup();\n } else {\n addGroup();\n group = this$1._newGroup();\n this$1._addToGroup(group, bbox, element);\n }\n } else {\n this$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\nvar 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\nfunction 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\nfunction align(elements, rect, alignment) {\n alignElements(elements, rect, alignment, \"x\", \"width\");\n}\n\nfunction vAlign(elements, rect, alignment) {\n alignElements(elements, rect, alignment, \"y\", \"height\");\n}\n\nfunction 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\nfunction 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\nfunction stack(elements) {\n stackElements(createStackElements(elements), \"x\", \"y\", \"width\");\n}\n\nfunction vStack(elements) {\n stackElements(createStackElements(elements), \"y\", \"x\", \"height\");\n}\n\nfunction 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\nfunction 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\nfunction wrap(elements, rect) {\n return wrapElements(elements, rect, \"x\", \"y\", \"width\");\n}\n\nfunction vWrap(elements, rect) {\n return wrapElements(elements, rect, \"y\", \"x\", \"height\");\n}\n\nfunction 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\nvar 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\nfunction 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\nfunction defineOptionsAccessors(fn, names) {\n for (var i = 0; i < names.length; i++) {\n fn[names[i]] = optionsAccessor(names[i]);\n }\n}\n\nvar 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\nvar options = [ \"offset\", \"color\", \"opacity\" ];\n\nvar 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\nvar 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\nvar points$1 = [ \"start\", \"end\" ];\n\nvar 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\nvar 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\nfunction swing(position) {\n return 0.5 - Math.cos(position * Math.PI) / 2;\n}\n\nfunction linear(position) {\n return position;\n}\n\nfunction 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\nvar easingFunctions = {\n\tswing: swing,\n\tlinear: linear,\n\teaseOutElastic: easeOutElastic\n};\n\nvar instance;\n\nvar 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\nvar 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 = 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._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.step(easingPosition);\n\n if (wallTime < finish) {\n kendo.animationFrame(loop);\n } else {\n this$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\nvar instance$1;\n\nvar 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\nvar 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 = 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.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 = this;\n\n var end = index + count;\n for (var i = index; i < end; i++) {\n this$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\nvar events = [\n \"click\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"resize\"\n];\n\nvar 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 = this;\n\n var domNode = eventElement(e);\n var node;\n\n while (!node && domNode) {\n node = domNode._kendoNode;\n if (domNode === this$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 = this;\n\n return function (e) {\n var node = this$1.eventTarget(e);\n if (node && !this$1._suspendedTracking) {\n this$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\nfunction renderAttr(name, value) {\n return (defined(value) && value !== null) ? (\" \" + name + \"=\\\"\" + value + \"\\\" \") : \"\";\n}\n\nfunction 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\nfunction 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\nvar NODE_MAP = {};\n\nvar SVG_NS = \"http://www.w3.org/2000/svg\";\nvar NONE = \"none\";\nvar POINT_DIGITS = 3;\n\nvar renderSVG = function(container, svg) {\n container.innerHTML = svg;\n};\n\nif (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\nvar renderSVG$1 = renderSVG;\n\nvar TRANSFORM = \"transform\";\nvar DefinitionMap = {\n clip: \"clip-path\",\n fill: \"fill\"\n};\n\nfunction isDefinition(type, value) {\n return type === \"clip\" || (type === \"fill\" && (!value || value.nodeType === \"Gradient\"));\n}\n\nfunction 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\nvar 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 = 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.options);\n\n if (defined(pos)) {\n this$1.insertAt(childNode, pos);\n } else {\n this$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.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 = this;\n\n for (var i = 0; i < attrs.length; i++) {\n this$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 = this;\n\n for (var i = 0; i < styles.length; i++) {\n this$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 = this;\n\n var definitions = this.definitions;\n var attrs = [];\n\n for (var field in definitions) {\n attrs.push([ DefinitionMap[field], this$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\nvar 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\nvar 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 = 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.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\nvar 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\nvar 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\nvar 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\nvar 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 = this;\n\n for (var field in definitions) {\n this$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 = this;\n\n for (var field in definitions) {\n this$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\nvar 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\nvar 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\nvar SOLID = \"solid\";\nvar BUTT = \"butt\";\n\nvar ATTRIBUTE_MAP = {\n \"fill.opacity\": \"fill-opacity\",\n \"stroke.color\": \"stroke\",\n \"stroke.width\": \"stroke-width\",\n \"stroke.opacity\": \"stroke-opacity\"\n};\n\nvar 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\nvar 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\nvar 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\nvar 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\nvar 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\nvar 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\nvar 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\nvar ENTITY_REGEX = /&(?:[a-zA-Z]+|#\\d+);/g;\n\nfunction 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\nif (typeof document !== \"undefined\") {\n decodeEntities._element = document.createElement(\"span\");\n}\n\nvar 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\nNODE_MAP.Arc = ArcNode;\nNODE_MAP.Circle = CircleNode;\nNODE_MAP.Group = GroupNode;\nNODE_MAP.Image = ImageNode;\nNODE_MAP.MultiPath = MultiPathNode;\nNODE_MAP.Path = PathNode;\nNODE_MAP.Rect = RectNode;\nNODE_MAP.Text = TextNode;\n\nvar RTL = 'rtl';\n\nfunction 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\nvar 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\nvar NODE_MAP$2 = {};\n\nfunction 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\nvar 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 = 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.insertAt(childNode, pos);\n } else {\n this$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\nvar 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\nvar FRAME_DELAY = 1000 / 60;\n\nvar 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\nvar 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\nvar 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\nvar ROOT_SIZE = 3000;\nvar LEVEL_STEP = 10000;\nvar MAX_LEVEL = 75;\n\nvar 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 = this;\n\n var rootElements = this.rootElements;\n for (var idx = 0; idx < rootElements.length; idx++) {\n this$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 = 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.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 = this;\n\n if (element.nodeType === \"Group\") {\n for (var idx = 0; idx < element.children.length; idx++) {\n this$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 = this;\n\n if (e.action === \"remove\") {\n for (var idx = 0; idx < e.items.length; idx++) {\n this$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 = this;\n\n var element;\n\n while (elements.length > 0) {\n element = elements.pop();\n element.addObserver(this$1);\n if (element.nodeType === \"Group\") {\n append$1$1(elements, element.children);\n } else {\n this$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 = 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.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\nfunction 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\nvar 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\nSurfaceCursor.prototype.clear = function clear () {\n this._resetCursor();\n};\n\nSurfaceCursor.prototype.destroy = function destroy () {\n this._resetCursor();\n delete this.element;\n};\n\nSurfaceCursor.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\nSurfaceCursor.prototype._mouseleave = function _mouseleave () {\n this._resetCursor();\n};\n\nSurfaceCursor.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\nSurfaceCursor.prototype._getCursor = function _getCursor () {\n if (this.element) {\n return this.element.style.cursor;\n }\n};\n\nSurfaceCursor.prototype._setCursor = function _setCursor (cursor) {\n if (this.element) {\n this.element.style.cursor = cursor;\n this._current = cursor;\n }\n};\n\nSurfaceCursor.prototype._resetCursor = function _resetCursor () {\n if (this._current) {\n this._setCursor(this._defaultCursor || \"\");\n delete this._current;\n }\n};\n\nfunction 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\nvar 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\nvar 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\nvar 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\nvar 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\nvar 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\nvar 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\nvar 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\nNODE_MAP$2.Arc = ArcNode$2;\nNODE_MAP$2.Circle = CircleNode$2;\nNODE_MAP$2.Group = GroupNode$2;\nNODE_MAP$2.Image = ImageNode$2;\nNODE_MAP$2.MultiPath = MultiPathNode$2;\nNODE_MAP$2.Path = PathNode$2;\nNODE_MAP$2.Rect = RectNode$2;\nNODE_MAP$2.Text = TextNode$2;\n\nvar 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\nvar instance$2;\nvar support$1;\n\nvar hasDocument = function () { return typeof document !== \"undefined\"; };\n\nvar supportsCanvas = function () { return hasDocument() &&\n document.createElement(\"canvas\").getContext; };\n\nvar supportsSVG = function () { return hasDocument() &&\n document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\"); };\n\nvar 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\nvar 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\nfunction 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\nvar 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\nvar 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\nfunction 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\nfunction 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\nvar 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\nfunction slice$1$1(thing) {\n return Array.prototype.slice.call(thing);\n}\n\nvar KENDO_PSEUDO_ELEMENT = \"KENDO-PSEUDO-ELEMENT\";\n\nvar IMAGE_CACHE = {};\n\nvar nodeInfo = {};\nnodeInfo._root = nodeInfo;\n\n/* -----[ Custom Text node to speed up rendering in kendo.pdf ]----- */\n\nvar inBrowser = typeof window !== 'undefined';\nvar microsoft = inBrowser ? browser.msie || browser.edge : false;\n\nvar 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\nfunction addClass(el, cls) {\n if (el.classList) {\n el.classList.add(cls);\n } else {\n el.className += \" \" + cls;\n }\n}\n\nfunction 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\nfunction setCSS(el, styles) {\n Object.keys(styles).forEach(function(key){\n el.style[key] = styles[key];\n });\n}\n\nvar 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\nfunction 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)\nvar 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\nfunction 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\nfunction 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.\nfunction 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\nvar 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\nvar 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\nvar 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\nvar 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\nfunction 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\nfunction hasOwnProperty(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction getCounter(name) {\n name = \"_counter_\" + name;\n return nodeInfo[name];\n}\n\nfunction 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\nfunction 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\nfunction resetCounter(name, val) {\n name = \"_counter_\" + name;\n nodeInfo[name] = val == null ? 0 : val;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction popNodeInfo() {\n nodeInfo = Object.getPrototypeOf(nodeInfo);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction getComputedStyle$1(element, pseudoElt) {\n return window.getComputedStyle(element, pseudoElt || null);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction saveStyle(element, func) {\n var prev = element.style.cssText;\n var result = func();\n element.style.cssText = prev;\n return result;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction radiansToDegrees(radians) {\n return ((180 * radians) / Math.PI) % 360;\n}\n\nfunction 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\nfunction 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\nfunction setClipping(shape, clipPath) {\n shape.clip(clipPath);\n}\n\nfunction 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\nfunction sanitizeRadius(r) {\n if (r.x <= 0 || r.y <= 0) {\n r.x = r.y = 0;\n }\n return r;\n}\n\nfunction 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\nfunction 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).\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction _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\nfunction _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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction isFormField(element) {\n return /^(?:textarea|select|input)$/i.test(element.tagName);\n}\n\nfunction getSelectedOption(element) {\n if (element.selectedOptions && element.selectedOptions.length > 0) {\n return element.selectedOptions[0];\n }\n return element.options[element.selectedIndex];\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nvar 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\nkendo.deepExtend(kendo, {\n drawing: drawing,\n geometry: geometry\n});\n\nkendo.drawing.Segment = kendo.geometry.Segment;\nkendo.dataviz.drawing = kendo.drawing;\nkendo.dataviz.geometry = kendo.geometry;\nkendo.drawing.util.measureText = kendo.util.measureText;\nkendo.drawing.util.objectKey = kendo.util.objectKey;\nkendo.drawing.Color = kendo.Color;\nkendo.util.encodeBase64 = kendo.drawing.util.encodeBase64;\n\n})(window.kendo.jQuery);\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3){ (a3 || a2)(); });\n(function(f, define) {\n define('drawing/surface-tooltip',[ \"kendo.popup\", \"./kendo-drawing\" ], f);\n})(function() {\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}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n(function(f, define) {\n define('drawing/surface',[ \"./kendo-drawing\", \"./surface-tooltip\" ], f);\n})(function() {\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}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n(function(f, define) {\n define('drawing/html',[ \"./kendo-drawing\" ], f);\n})(function() {\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}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.drawing',[\n \"./drawing/util\",\n \"./drawing/kendo-drawing\",\n \"./drawing/surface-tooltip\",\n \"./drawing/surface\",\n \"./drawing/html\"\n ], f);\n})(function() {\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}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n"],"names":["define","$","window","kendo","jQuery","createPromise","Deferred","promiseAll","promises","when","apply","extendStatic","dest","src","__proto__","member","hasOwnProperty","drawing","util","deepExtend","amd","a1","a2","a3","LRUCache","Class","extend","init","size","this","_size","_length","_map","put","key","value","map","entry","_head","_tail","newer","older","get","REPLACE_REGEX","SPACE","normalizeText","text","String","replace","objectKey","object","parts","push","sort","join","hashKey","str","hash","i","length","charCodeAt","zeroSize","width","height","baseline","DEFAULT_OPTIONS","baselineMarkerSize","defaultMeasureBox","document","createElement","style","cssText","TextMetrics","options","_cache","measure","styleKey","cacheKey","cachedResult","measureBox","box","baselineMarker","_baselineMarker","cloneNode","textStr","textContent","appendChild","body","offsetWidth","offsetHeight","offsetTop","parentNode","removeChild","marker","measureText","current","kendoDrawing","kendoDrawingUtil","kendoUtil","support","supportBrowser","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","1","10","100","2","20","200","3","30","300","4","40","400","5","50","500","6","60","600","7","70","700","8","80","800","9","90","900","1000","arabicToRoman","n","values","roman","shift","UNDEFINED","defined","defId","definitionId","DEG_TO_RAD","PI","MAX_NUM","Number","MAX_VALUE","MIN_NUM","deg","radians","fromCharCode","encodeUTF8","input","output","code","hi","low","isNaN","KEY_STR","encodeBase64","utfInput","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","merge","b","r","ai","bi","m","floor","left","right","now","Date","getTime","rad","degrees","pow","p","round","precision","power","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","round$1","toArray","toString","separator","translate","unit","rotate","angle","cos","sin","scale","scaleX","scaleY","matrixRegexp","IDENTITY","parseMatrix","matrixString","match","members","Function","bind","concat","transformMatrix","transform","elementScale","parent","parentElement","parentMatrix","append","toString$1","OptionsStore","HasObservers$$1","prefix","this$1","_wrap","part","set","_set","composite","parentObj","fieldName","obj","_clear","type","wrapped","setAccessor","getAccessor","defineAccessors","fields","capitalized","toUpperCase","substring","withAccessors","TBase","names","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","elementTransform","elementMatrix","combinedMatrix","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","inCircle","pointDistance","GRADIENT","paintable","anonymous","newFill","IDENTITY_MATRIX_HASH","measurable","matrixHash","_bboxCache","_matrixHash","_bbox","strokeWidth","geometryAccessor","defineGeometryAccessors","withGeometry","DEFAULT_STROKE","geometry","rawBBox","_geometry","PRECISION","close$1","tolerance","abs","closeOrLess","lineIntersection","p0","p1","p2","p3","s1x","s2x","s1y","s2y","nx","ny","s","t","MAX_INTERVAL","pow$1","accessors","Arc$2","Arc","radiusX","radiusY","startAngle","endAngle","anticlockwise","xRotation","radian","curvePoints","dir","interval","_arcInterval","intervalAngle","subIntervalsCount","ceil","subIntervalAngle","currentAngle","nextAngle","points","_intervalCurvePoints","cp1","cp2","endPoint","currentAngleX","bboxStartAngle","currentAngleY","oldStart","p1Derivative","_derivativeAt","p2Derivative","distance","angleRad","pointRadius","startPoint","intersection","calculateAngle","inAngleRange","start","end","largeArc","swipe","rotation","arcParameters","normalizeArcParameters","x1","y1","x2","y2","cx","cy","parameters","cosine","sine","xT","yT","sign","xt2","yt2","rx2","ry2","delta","constT","cxT","cyT","uX","uY","vX","vY","acos","angleCosine","signEndAngle","pop","unshift","ElementsArray","_splice","elements","_change","push$1","_add","slice$1","pop$1","_remove","splice$1","howMany","shift$1","unshift$1","_clearObserver","_setObserver","GeometryElementsArray","ElementsArray$$1","isOutOfEndPoint","controlPoint","rotatedPoint","calculateCurveAt","t1","toCubicPolynomial","ComplexNumber","real","img","add","cNumber","addConstant","negate","multiplyConstant","nthRoot","rad$$1","nthR","isReal","numberSign$1","solveQuadraticEquation","squareRoot","solveCubicEquation","q","Q","b3a","y3","z1","z2","hasRootsInRange","rootField","range","polynomial","roots","curveIntersectionsCount","rayIntersection","intersectsRay","count","lineIntersectionsCount","intersects","inRange","pointAccessor","definePointAccessors","withPoints","Segment","anchor","controlIn","controlOut","bboxTo","toSegment","segmentAnchor","toSegmentAnchor","rect","_curveBoundingBox","_lineBoundingBox","extremesX","_curveExtremesFor","extremesY","xLimits","arrayLimits","yLimits","extremes","_curveExtremes","x3","x4","t2","_intersectionsTo","segment","intersectionsCount","_isOnCurveTo","endSegment","p4","rotatedPoints","_isOnLineTo","_isOnPathTo","isOnPath","arr","WEIGHT","EXTREMUM_ALLOWED_DEVIATION","X","Y","pointsToCurve","pointsIn","closed","segments","removeDuplicates","tangent","getTangent","firstControlPoint","secondControlPoint","initialControlPoint","lastControlPoint","controlPoints","getControlPoints","tangent$1","cp0","controlPoints$1","controlPoints$2","tangent$2","invertAxis","lineFunction","calculateFunction","isLine","xField","yField","restrict","switchOrientation","monotonic","isMonotonicByField","numberSign","secondCP","oldXField","firstCP","restrictControlPoint","cp","xValue","yValue","ShapeMap","l","path","position","isRelative","lineTo","curveTo","v","toLineParamaters","arcTo","previousCommand","lastControlIn","paths","reflectionPoint","cubicControlPoints","quadraticToCubicControlPoints","lastSegment","isVertical","insertPosition","third","scaledPoint","SEGMENT_REGEX","SPLIT_REGEX","MOVE","CLOSE","parseParameters","number","parsePath","pathInstance","params","closePath","command","toLowerCase","moveTo","close","Error","elementsBoundingBox","applyTransform","boundingBox","elementBoundingBox","elementsClippedBoundingBox","printPoints","len","segmentType","segmentStart","segmentEnd","Path","lineJoin","point$$1","arc","_addArcSegments","print","currentType","previous","pathWidth","segmentBox","parse","MultiPath","fromRect","curveFromPoints","fromArc","prototypeAccessors$1","instance","DEFAULT_STROKE$1","toPath","DEFAULT_FONT","DEFAULT_FILL","Text","content","font","metrics","pos","Image$1","Image","_rect","traversable","childrenField","traverse","callback","children","child","Group","childrenChange","action","items","append$1","_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","_initGroups","groups","groupsSize","ref$1","groupOrigin","elementOrigin","groupStart","elementStart","group","groupBox","arrangeElements","groupIdx","lineSize","bboxes","scaledStart","scaledSize","newStart","_newGroup","addGroup","_addToGroup","Rect$2","Rect$$1","alignElements","alignment","vAlign","stackElements","stackAxis","otherAxis","previousBBox","createStackElements","stack","vStack","getStacks","maxSize","stacks","stackSize","addElementToStack","wrapElements","startElement","elementIdx","vWrap","fit","rectSize","StopsArray","optionsAccessor","defineOptionsAccessors","withOptions","GradientStop","offset","arg","stop","Gradient","stops","_createStops","_userSpace","userSpace","addStop","removeStop","points$1","LinearGradient","RadialGradient","_radius","_fallbackFill","fallbackFill","swing","linear","easeOutElastic","time","diff","asin","easingFunctions","AnimationFactory","_items","register","Animation","_options","duration","easing","setup","step","play","delay","finish","abort","setTimeout","loop","_stopped","wallTime","easingPosition","animationFrame","destroy","instance$1","PathParser","multiPath","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","POINT_DIGITS","renderSVG","container","svg","innerHTML","testFragment","testContainer","hasParser","DOMParser","firstChild","namespaceURI","parser","chartDoc","parseFromString","importedDoc","adoptNode","renderSVG$1","TRANSFORM","DefinitionMap","isDefinition","baseUrl","base","getElementsByTagName","href","url","msie","hashIndex","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","renderStyle$1","renderOpacity","renderId","hasDefinitions","definition","definitionChange","refUrl","renderDefinitions","mapDefinitions","skipBaseHref","baseHref","baseUrl$1","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","fill.opacity","stroke.color","stroke.width","stroke.opacity","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","RTL","alignToScreen","ctm","getScreenCTM","Surface$3","BaseSurface","_root","direction","_template","_rootElement","click","mouseover","mouseout","mousemove","viewBox","_offset","visual","NODE_MAP$2","renderPath","ctx","prevSeg","prevOut","bezierCurveTo","Node$2","initClip","clearClip","setClip","beginPath","setTransform","loadElements","cors","setOpacity","globalAlpha","opactity","GroupNode$2","renderTo","save","restore","FRAME_DELAY","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","LEVEL_STEP","MAX_LEVEL","ShapesQuadTree","initRoots","rootMap","rootElements","pointShape","sectorRoot","assignZindex","zIndexComparer","zIndex","levelWeight","parents","_zIndex","bboxChange","_insertShape","elementsArray","_insert","sectors","getSectors","inRoot","bottomX","bottomY","SurfaceCursor","surface","addGradientStops","gradient","parseColor","addColorStop","toCssRgba","_resetCursor","_shapeCursor","_current","_defaultCursor","_getCursor","_setCursor","PathNode$2","renderPoints","setLineDash","setLineCap","setLineJoin","setFill","setStroke","hasFill","setGradientFill","fillStyle","createLinearGradient","createRadialGradient","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","Surface$4","_mouseTrackHandler","_trackMouse","_searchTree","_cursor","image","rootElement","loadingStates","promise","resolveDataURL","data","toDataURL","then","currentShape","_currentShape","instance$2","support$1","hasDocument","supportsCanvas","supportsSVG","implementation","hasFeature","SurfaceFactory","preferred","logToConsole","navigator","exportGroup","rootGroup","exportRoot","svg$1","exportImage","defaults","surfaceOptions","display","exportSVG","raw","slice$1$1","thing","KENDO_PSEUDO_ELEMENT","IMAGE_CACHE","nodeInfo","inBrowser","microsoft","TextRect","Text$$1","_pdfRect","addClass","el","cls","classList","className","removeClass","reduce","word","setCSS","keys","matches","selector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","closest","cloneNodes","$el","$clone","tagName","checked","selected","nextSibling","dive","canvases","canvas$$1","orig","getXY","drawDOM","pdf","defineFont","getFontFaces","ownerDocument","doOne","setTransform$1","_clipbox","_stackingContext","avoidLinks","_avoidLinks","renderElement","cacheImages","forceBreak","forcePageBreak","hasPaperSize","paperSize","paperOptions","getPaperOptions","def","pageWidth","pageHeight","margin","hasMargin","Boolean","multiPage","_ignoreMargin","handlePageBreaks","progress","canceled","pageNum","next","pages","page","totalPages","cancel","makeTemplate","div","doc","copy","_destructive","adjust","tfoot","ol","li","boxSizing","paddingRight","overflow","beforePageBreak","whenImagesAreActuallyLoaded","doPageBreak","splitElement","makePage","keepTogether","tag","getAttribute","tableLayout","getComputedStyle$1","bottomPadding","getPropertyValue","bottomBorder","saveAdjust","isFirst","breakAtElement","fall","fallsOnMargin","splitText","firstInParent","table","colgroup","thead","grid","gridHead","querySelector","repeatHeaders","createRange","setStartBefore","setEndBefore","extractContents","preventBulletOnListItem","pageClassName","available","selectNodeContents","nextnode","findEOP","setEnd","endOffset","drawText","pushNodeInfo","renderText","_renderElement","popNodeInfo","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","skip_ws","exec","substr","read","token","read_stop","percent","toRGB","read_linear_gradient","propName","to1","to2","parseAngle","to","read_url","tok","splitProperty","cache","ret","last$$1","in_paren","in_string","looking_at","getFontURL","getFontHeight","styleSheets","doStylesheet","ss","rules","cssRules","ex","addRules","findFonts","rule","styleSheet","family","bold","italic","addRule","getCounter","getAllCounters","getPrototypeOf","incCounter","inc","resetCounter","val","doCounters","updateCounters","counterReset","counterIncrement","parseColor$1","pending","images","urls","bg","alphaNumeral","decoration","createsStackingContext","updateClipbox","emptyClipbox","cb","prop","pseudoElt","defa","webkit","mozilla","opera","pleaseSetPropertyValue","important","setProperty","getBorder","side","saveStyle","func","prev","getBorderRadius","sanitizeRadius","getContentBox","innerBox","wt","wr","wb","wl","getTransform","transform$$1","radiansToDegrees","num","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","getCssText","_renderWithPseudoElements","fake","pseudo","kind","place","psel","saveClass","backgroundColor","backgroundImage","backgroundRepeat","backgroundPosition","backgroundOrigin","backgroundSize","textOverflow","saveTextOverflow","version","currentStyle","innerbox","boxes","cells","getClientRects","adjustBoxes","drawOneBox","_pdfLink","drawBullet","clipit","isFormField","maybeRenderWidget","renderContents","tableBorderLeft","tableBorderTop","tableBox","firstCell","rows","firstCellBox","drawEdge","Wtop","Wleft","Wright","rl","rr","drawRoundCorner","ri","drawBackground","background","drawOneBackground","drawBackgroundImage","gradientRenderer","img_width","img_height","renderBG","aspect_ratio","orgBox","rewX","rewY","repeatX","listStyleType","listStylePosition","_drawBullet","bullet","elementIndex","k","fontSize","lineHeight","fontFamily","disc","circle","square","isLast","shouldDrawLeft","shouldDrawRight","inv","pxlen","scaledAngle","atan","tan","implicit","console","log","widget","widgetInstance","exportDOMVisual","wrap$$1","renderImage","zIndexSort","sa","sb","za","zb","pa","getSelectedOption","selectedOptions","selectedIndex","renderCheckbox","renderFormField","option","whiteSpace","multiple","serializeSVG","serializer","XMLSerializer","xml","serializeToString","svg$$1","dataURL","floats","positioned","floating","search","align$$1","isJustified","columnCount","textTransform","estimateLineLength","prevLineBottom","underline","lineThrough","overline","hasDecoration","doChunk","selectNode","decorate","actuallyGetRangeBoundingRect","chrome","safari","rectangles","Infinity","done","origStart","setStart","found","findEOL","eol","startOffset","cc","indent","line","ypos","groupInStackingContext","main","_dom_zIndex","visibility","mmul","b1","c1","d1","e1","f1","b2","c2","d2","e2","f2","dataviz","Color","NS","utils","outerWidth","_outerWidth","outerHeight","_outerHeight","TOOLTIP_TEMPLATE","TOOLTIP_CLOSE_TEMPLATE","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","wrapper","_popupRelatedTarget","relatedTarget","DrawingSurface","Widget","_triggerInstanceHandler","_triggerInstanceEvent","_bindHandler","hideTooltip","_tooltip","showTooltip","plugin","__meta__","category","description","depends"],"mappings":"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"}