diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index b683f4b..4cc02f8 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -4141,7 +4141,7 @@ var AxisChart = function (_BaseChart) { this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; // if we have yAxis config settings lets populate a yAxis config array. - if (yAxis.id && yAxis.position) { + if (yAxis && yAxis.id && yAxis.position) { this.config.yAxisConfig = [yAxis]; } } @@ -4214,7 +4214,9 @@ var AxisChart = function (_BaseChart) { zeroLine = void 0, positions = void 0, yAxisConfigObject = void 0, - yAxisAlignment = void 0; + yAxisAlignment = void 0, + yKeys = void 0; + yKeys = []; yAxisConfigObject = this.config.yAxisMode || {}; yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; @@ -4251,11 +4253,17 @@ var AxisChart = function (_BaseChart) { positions = yPts.map(function (d) { return zeroLine - d * scaleMultiplier; }); + yKeys.push(key); if (_this2.state.yAxis.length > 1) { var yPtsArray = []; var firstArr = _this2.state.yAxis[0]; + + // we need to calculate the scaleMultiplier. + + // now that we have an accurate scaleMultiplier we can // we need to loop through original positions. + scaleMultiplier = _this2.height / getValueRange(yPts); firstArr.positions.forEach(function (pos) { yPtsArray.push(Math.ceil(pos / scaleMultiplier)); }); @@ -4278,6 +4286,30 @@ var AxisChart = function (_BaseChart) { for (var key in dataValues) { _loop(key); } + + // the labels are not aligned in length between the two yAxis objects, + // we need to run some new calculations. + if (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) { + var newYptsArr = []; + // find the shorter array + var shortest = this.state.yAxis.reduce(function (p, c) { + return p.length > c.labels.length ? c : p; + }, { length: Infinity }); + // return the longest + var longest = this.state.yAxis.reduce(function (p, c) { + return p.length < c.labels.length ? p : c; + }, { length: Infinity }); + + // we now need to populate the shortest obj with the new scale multiplier + // with the positions of the longest obj. + longest.positions.forEach(function (pos) { + // calculate a new yPts + newYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier)); + }); + + shortest.labels = newYptsArr.reverse(); + shortest.positions = longest.positions; + } } // Dependent if above changes diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index 1a7def7..c2b2051 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t\n\t\t\t\t
`\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment;\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","find","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":";;;AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;EAC7B,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;EAC/B,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;;EAE5B,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,EAAE;;EAExD,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;EACrE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;EAC5C,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;;EAExB,IAAI,QAAQ,KAAK,KAAK,EAAE;IACtB,IAAI,IAAI,CAAC,UAAU,EAAE;MACnB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;KAC3C,MAAM;MACL,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;KACzB;GACF,MAAM;IACL,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;GACzB;;EAED,IAAI,KAAK,CAAC,UAAU,EAAE;IACpB,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;GAChC,MAAM;IACL,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;GACjD;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzBM,SAASA,CAAT,CAAWC,IAAX,EAAiBC,GAAjB,EAAsB;QACrB,OAAOD,IAAP,KAAgB,QAAhB,GAA0B,CAACC,OAAOC,QAAR,EAAkBC,aAAlB,CAAgCH,IAAhC,CAA1B,GAAkEA,QAAQ,IAAjF;;;AAGD;;AAUAD,EAAEK,MAAF,GAAW,UAACC,GAAD,EAAMC,CAAN,EAAY;KAClBC,UAAUL,SAASM,aAAT,CAAuBH,GAAvB,CAAd;;MAEK,IAAII,CAAT,IAAcH,CAAd,EAAiB;MACZI,MAAMJ,EAAEG,CAAF,CAAV;;MAEIA,MAAM,QAAV,EAAoB;KACjBC,GAAF,EAAOC,WAAP,CAAmBJ,OAAnB;GADD,MAGK,IAAIE,MAAM,QAAV,EAAoB;OACpBG,MAAMb,EAAEW,GAAF,CAAV;OACIG,UAAJ,CAAeC,YAAf,CAA4BP,OAA5B,EAAqCK,GAArC;WACQD,WAAR,CAAoBC,GAApB;GAHI,MAKE,IAAIH,MAAM,QAAV,EAAoB;OACvB,QAAOC,GAAP,yCAAOA,GAAP,OAAe,QAAlB,EAA4B;WACpBK,IAAP,CAAYL,GAAZ,EAAiBM,GAAjB,CAAqB,gBAAQ;aACpBC,KAAR,CAAcC,IAAd,IAAsBR,IAAIQ,IAAJ,CAAtB;KADD;;GAFK,MAMA,IAAIT,KAAKF,OAAT,EAAmB;WACjBE,CAAR,IAAaC,GAAb;GADM,MAGF;WACIS,YAAR,CAAqBV,CAArB,EAAwBC,GAAxB;;;;QAIKH,OAAP;CA5BD;;AA+BA,AAAO,SAASa,SAAT,CAAmBb,OAAnB,EAA4B;KAC9Bc,OAAOd,QAAQe,qBAAR,EAAX;QACO;;;;OAIDD,KAAKE,GAAL,IAAYrB,SAASsB,eAAT,CAAyBC,SAAzB,IAAsCvB,SAASwB,IAAT,CAAcD,SAAhE,CAJC;QAKAJ,KAAKM,IAAL,IAAazB,SAASsB,eAAT,CAAyBI,UAAzB,IAAuC1B,SAASwB,IAAT,CAAcE,UAAlE;EALP;;;;;;AAYD,AAAO,SAASC,QAAT,CAAkBC,EAAlB,EAAsB;QACpBA,GAAGC,YAAH,KAAoB,IAA5B;;;AAGD,AAAO,SAASC,mBAAT,CAA6BF,EAA7B,EAAiC;;KAEnCT,OAAOS,GAAGR,qBAAH,EAAX;;QAGCD,KAAKE,GAAL,IAAY,CAAZ,IACMF,KAAKM,IAAL,IAAa,CADnB,IAEMN,KAAKY,MAAL,KAAgBC,OAAOC,WAAP,IAAsBjC,SAASsB,eAAT,CAAyBY,YAA/D,CAFN;MAGWC,KAAL,KAAeH,OAAOI,UAAP,IAAqBpC,SAASsB,eAAT,CAAyBe,WAA7D,CAJP;;;;AAQD,AAAO,SAASC,sBAAT,CAAgCjC,OAAhC,EAAyC;KAC3CkC,SAASP,OAAOQ,gBAAP,CAAwBnC,OAAxB,CAAb;KACIoC,UAAUC,WAAWH,OAAOI,WAAlB,IACbD,WAAWH,OAAOK,YAAlB,CADD;;QAGOvC,QAAQgC,WAAR,GAAsBI,OAA7B;;;AAGD;;AAYA;;AAYA,AAAO,SAASI,IAAT,CAAcC,MAAd,EAAsBC,IAAtB,EAA4BC,UAA5B,EAAwC;KAC1CC,MAAMjD,SAASkD,WAAT,CAAqB,YAArB,CAAV;;KAEIC,SAAJ,CAAcJ,IAAd,EAAoB,IAApB,EAA0B,IAA1B;;MAEK,IAAIK,CAAT,IAAcJ,UAAd,EAA0B;MACrBI,CAAJ,IAASJ,WAAWI,CAAX,CAAT;;;QAGMN,OAAOO,aAAP,CAAqBJ,GAArB,CAAP;;;;;AClGM,IAAMK,gBAAgB;UACnB;OACH,EADG;UAEA,EAFA;QAGF,EAHE;SAID;EALoB;WAOlB;OACJ,EADI;UAED,EAFC;QAGH,EAHG;SAIF;EAXoB;;aAchB,GAdgB;cAef,EAfe;eAgBd,EAhBc;;gBAkBb;CAlBT;;AAqBP,AAAO,SAASC,YAAT,CAAsBC,CAAtB,EAAyB;QACxBA,EAAEC,WAAF,GAAgBD,EAAEE,OAAF,CAAUrC,GAA1B,GAAgCmC,EAAEG,QAAF,CAAWtC,GAAlD;;;AAGD,AAAO,SAASuC,aAAT,CAAuBJ,CAAvB,EAA0B;QACzBA,EAAEE,OAAF,CAAUjC,IAAV,GAAiB+B,EAAEG,QAAF,CAAWlC,IAAnC;;;AAGD,AAAO,SAASoC,cAAT,CAAwBL,CAAxB,EAA2B;KAC7BM,mBAAmBN,EAAEE,OAAF,CAAUrC,GAAV,GAAgBmC,EAAEE,OAAF,CAAU3B,MAA1B,GACpByB,EAAEG,QAAF,CAAWtC,GADS,GACHmC,EAAEG,QAAF,CAAW5B,MADR,GAEpByB,EAAEC,WAFkB,GAEJD,EAAEO,YAFrB;QAGOD,gBAAP;;;AAGD,AAAO,SAASE,aAAT,CAAuBR,CAAvB,EAA0B;KAC5BS,kBAAkBT,EAAEE,OAAF,CAAUjC,IAAV,GAAiB+B,EAAEE,OAAF,CAAUvB,KAA3B,GACnBqB,EAAEG,QAAF,CAAWlC,IADQ,GACD+B,EAAEG,QAAF,CAAWxB,KADhC;;QAGO8B,eAAP;;;AAGD,AAAO,IAAMC,4BAA4B,GAAlC;AACP,AAAO,IAAMC,6BAA6B,GAAnC;;AAEP,AAAO,IAAMC,0BAA0B,MAAhC;AACP,AAAO,IAAMC,2BAA2B,CAAC,MAAD,EAAS,KAAT,CAAjC;;AAEP,AAAO,IAAMC,uBAAuB,GAA7B;;AAEP,AAAO,IAAMC,wBAAwB,GAA9B;AACP,AAAO,IAAMC,yBAAyB,IAA/B;;AAEP,AAAO,IAAMC,sBAAsB,CAA5B;AACP,AAAO,IAAMC,wBAAwB,CAA9B;;AAEP,AAAO,IAAMC,gCAAgC,EAAtC;AACP,AAAO,IAAMC,+BAA+B,CAArC;;;;AAIP,AAAO,IAAMC,4BAA4B,CAAlC;;AAEP,AAAO,IAAMC,sBAAsB,EAA5B;AACP,AAAO,IAAMC,sBAAsB,CAA5B;;AAEP,AAAO,IAAMC,qBAAqB,CAA3B;;AAEP,AAAO,IAAMC,kCAAkC,CAAxC;;AAEP,IAAMC,uBAAuB,CAAC,YAAD,EAAe,MAAf,EAAuB,QAAvB,EAAiC,KAAjC,EAAwC,QAAxC,EAC5B,QAD4B,EAClB,OADkB,EACT,aADS,EACM,QADN,EACgB,SADhB,EAC2B,YAD3B,EACyC,WADzC,CAA7B;AAEA,IAAMC,uBAAuB,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,CAA7B;AACA;AACA;;AAEA,AAAO,IAAMC,iBAAiB;MACxBF,oBADwB;OAEvBA,oBAFuB;MAGxBA,oBAHwB;aAIjBA,oBAJiB;UAKpBC,oBALoB;QAMtBD;CAND;;;AAUP,AAAO,IAAMG,cAAcC,KAAKC,EAAL,GAAU,GAA9B;AACP,AAAO,IAAMC,aAAa,GAAnB;;ICvGcC;uBAIjB;yBAFFC,MAEE;MAFFA,MAEE,+BAFO,IAEP;yBADFC,MACE;MADFA,MACE,+BADO,EACP;;;OACGD,MAAL,GAAcA,MAAd;OACKC,MAAL,GAAcA,MAAd;OACKC,SAAL,GAAiB,EAAjB;OACKC,UAAL,GAAkB,EAAlB;OACKC,UAAL,GAAkB,EAAlB;OACKC,eAAL,GAAuB,CAAvB;;OAEKC,CAAL,GAAS,CAAT;OACKC,CAAL,GAAS,CAAT;;OAEK5E,GAAL,GAAW,CAAX;OACKI,IAAL,GAAY,CAAZ;;OAEKyE,KAAL;;;;;0BAGO;QACFC,WAAL;;;;4BAGS;QACJC,IAAL;QACKC,YAAL;;;;gCAGa;;;QACRC,SAAL,GAAiBzG,EAAEK,MAAF,CAAS,KAAT,EAAgB;YACxB,KAAKwF,MADmB;eAErB,0BAFqB;;IAAhB,CAAjB;QAOKa,OAAL;;QAEKC,KAAL,GAAa,KAAKF,SAAL,CAAerG,aAAf,CAA6B,QAA7B,CAAb;QACKwG,aAAL,GAAqB,KAAKH,SAAL,CAAerG,aAAf,CAA6B,kBAA7B,CAArB;;QAEKyF,MAAL,CAAYgB,gBAAZ,CAA6B,YAA7B,EAA2C,YAAM;UAC3CH,OAAL;IADD;;;;yBAKM;;;OACFC,cAAJ;OACG,KAAKG,KAAR,EAAe;SACTL,SAAL,CAAerF,YAAf,CAA4B,kBAA5B,EAAgD,KAAK0F,KAArD;;OAEE,KAAKZ,eAAR,EAAyB;yBACL,KAAKF,UAAxB,iBAA8C,KAAKD,SAAnD;IADD,MAEO;YACK,KAAKA,SAAhB,gBAAoC,KAAKC,UAAzC;;QAEIW,KAAL,CAAWI,SAAX,GAAuBJ,KAAvB;QACKC,aAAL,CAAmBG,SAAnB,GAA+B,EAA/B;;QAEKd,UAAL,CAAgBhF,GAAhB,CAAoB,UAAC+F,MAAD,EAAMtG,CAAN,EAAY;QACzBuG,QAAQ,OAAKnB,MAAL,CAAYpF,CAAZ,KAAkB,OAAhC;QACIwG,QAAQF,OAAIG,SAAJ,KAAkB,CAAlB,IAAuBH,OAAIG,SAA3B,GAAuCH,OAAIG,SAA3C,GAAuDH,OAAIE,KAAvE;;QAEIE,KAAKpH,EAAEK,MAAF,CAAS,IAAT,EAAe;aACf;mCACoB4G;MAFL;sDAIwBC,UAAU,CAAV,IAAeA,KAAf,GAAuBA,KAAvB,GAA+B,EAA9E,+BACGF,OAAIL,KAAJ,GAAYK,OAAIL,KAAhB,GAAwB,EAD3B;KAJQ,CAAT;;WAQKC,aAAL,CAAmBhG,WAAnB,CAA+BwG,EAA/B;IAZD;;;;iCAgBc;OACVC,QAAQ,KAAKZ,SAAL,CAAea,WAA3B;;QAEK9F,GAAL,GAAW,KAAK4E,CAAL,GAAS,KAAKK,SAAL,CAAec,YAAxB,GACRnC,+BADH;QAEKxD,IAAL,GAAY,KAAKuE,CAAL,GAASkB,QAAM,CAA3B;OACIG,UAAU,KAAK3B,MAAL,CAAYyB,WAAZ,GAA0BD,KAAxC;;OAEII,UAAU,KAAKhB,SAAL,CAAerG,aAAf,CAA6B,cAA7B,CAAd;;OAEG,KAAKwB,IAAL,GAAY,CAAf,EAAkB;YACTV,KAAR,CAAcU,IAAd,mBAAmC,CAAC,CAAD,GAAK,KAAKA,IAA7C;SACKA,IAAL,GAAY,CAAZ;IAFD,MAGO,IAAG,KAAKA,IAAL,GAAY4F,OAAf,EAAwB;QAC1BE,QAAQ,KAAK9F,IAAL,GAAY4F,OAAxB;QACIG,gCAA8BD,KAA9B,QAAJ;YACQxG,KAAR,CAAcU,IAAd,GAAqB+F,aAArB;;SAEK/F,IAAL,GAAY4F,OAAZ;IALM,MAMA;YACEtG,KAAR,CAAcU,IAAd;;;;;4BAIQuE,GAAGC,GAA4C;OAAzCO,KAAyC,uEAAjC,EAAiC;OAA7BV,UAA6B,uEAAhB,EAAgB;OAAZa,KAAY,uEAAJ,CAAC,CAAG;;QACnDf,SAAL,GAAiBY,MAAMiB,IAAvB;QACK5B,UAAL,GAAkBW,MAAMO,KAAxB;QACKjB,UAAL,GAAkBA,UAAlB;QACKE,CAAL,GAASA,CAAT;QACKC,CAAL,GAASA,CAAT;QACKF,eAAL,GAAuBS,MAAMkB,UAAN,IAAoB,CAA3C;QACKf,KAAL,GAAaA,KAAb;QACKgB,OAAL;;;;4BAGS;QACJrB,SAAL,CAAevF,KAAf,CAAqBM,GAArB,GAA2B,KAA3B;QACKiF,SAAL,CAAevF,KAAf,CAAqBU,IAArB,GAA4B,KAA5B;QACK6E,SAAL,CAAevF,KAAf,CAAqB6G,OAArB,GAA+B,GAA/B;;;;4BAGS;QACJtB,SAAL,CAAevF,KAAf,CAAqBM,GAArB,GAA2B,KAAKA,GAAL,GAAW,IAAtC;QACKiF,SAAL,CAAevF,KAAf,CAAqBU,IAArB,GAA4B,KAAKA,IAAL,GAAY,IAAxC;QACK6E,SAAL,CAAevF,KAAf,CAAqB6G,OAArB,GAA+B,GAA/B;;;;;;ACtHK,SAASC,QAAT,CAAkBC,CAAlB,EAAqB;QACpBpF,WAAWoF,EAAEC,OAAF,CAAU,CAAV,CAAX,CAAP;;;;;;;;AAQD;;;;;;AAaA;;;;;;;;;AAoBA,AAAO,SAASC,SAAT,CAAmBC,KAAnB,EAA0BC,KAA1B,EAAiC7H,OAAjC,EAAuD;KAAb8H,KAAa,uEAAP,KAAO;;KAC1D,CAAC9H,OAAJ,EAAa;YACF8H,QAAQF,MAAM,CAAN,CAAR,GAAmBA,MAAMA,MAAMG,MAAN,GAAe,CAArB,CAA7B;;KAEGC,cAAc,IAAIC,KAAJ,CAAUhD,KAAKiD,GAAL,CAASL,KAAT,CAAV,EAA2B9B,IAA3B,CAAgC/F,OAAhC,CAAlB;SACQ8H,QAAQE,YAAYG,MAAZ,CAAmBP,KAAnB,CAAR,GAAoCA,MAAMO,MAAN,CAAaH,WAAb,CAA5C;QACOJ,KAAP;;;;;;;;AAQD,AAAO,SAASQ,cAAT,CAAwBC,MAAxB,EAAgCC,SAAhC,EAA2C;QAC1C,CAACD,SAAO,EAAR,EAAYN,MAAZ,GAAqBO,SAA5B;;;AAGD;;;AAcA;;AAQA,AAAO,SAASC,kBAAT,CAA4BC,KAA5B,EAAmCC,MAAnC,EAA2C;QAC1C;KACHxD,KAAKyD,GAAL,CAASF,QAAQxD,WAAjB,IAAgCyD,MAD7B;KAEHxD,KAAK0D,GAAL,CAASH,QAAQxD,WAAjB,IAAgCyD;EAFpC;;;;;;;;AAWD,AAAO,SAASG,aAAT,CAAuBC,SAAvB,EAAqD;KAAnBC,WAAmB,uEAAP,KAAO;;KACvDC,OAAOC,KAAP,CAAaH,SAAb,CAAJ,EAA6B,OAAO,KAAP,CAA7B,KACK,IAAIA,cAAcI,SAAlB,EAA6B,OAAO,KAAP,CAA7B,KACA,IAAI,CAACF,OAAOG,QAAP,CAAgBL,SAAhB,CAAL,EAAiC,OAAO,KAAP,CAAjC,KACA,IAAIC,eAAeD,YAAY,CAA/B,EAAkC,OAAO,KAAP,CAAlC,KACA,OAAO,IAAP;;;;;;;AAON,AAAO,SAASM,KAAT,CAAe1B,CAAf,EAAkB;;;QAGjBsB,OAAO9D,KAAKkE,KAAL,CAAW1B,IAAI,IAAf,IAAuB,KAA9B,CAAP;;;;;;;AAOA,AAAO,SAAS2B,SAAT,CAAmBP,SAAnB,EAA8B;KACjCQ,eAAJ;KAAY3C,cAAZ;KAAmB4C,YAAnB;;KAEIT,qBAAqBU,IAAzB,EAA+B;SACtB,IAAIA,IAAJ,CAASV,UAAUW,OAAV,EAAT,CAAP;;;KAGE,QAAOX,SAAP,yCAAOA,SAAP,OAAqB,QAArB,IAAiCA,cAAc,IAAnD,EAAyD;SAChDA,SAAP;;;UAGOZ,MAAMwB,OAAN,CAAcZ,SAAd,IAA2B,EAA3B,GAAgC,EAAzC;;MAEKS,GAAL,IAAYT,SAAZ,EAAuB;UACbA,UAAUS,GAAV,CAAR;;SAEOA,GAAP,IAAcF,UAAU1C,KAAV,CAAd;;;QAGK2C,MAAP;;;AC3IM,SAASK,oBAAT,CAA8BC,IAA9B,EAAoCC,QAApC,EAA8C;KAChDC,eAAJ;KAAYjE,UAAZ;KACI+D,QAAQC,QAAZ,EAAsB;WACZA,WAAWD,IAApB;MACIA,IAAJ;EAFD,MAGO;WACGA,OAAOC,QAAhB;MACIA,QAAJ;;;QAGM,CAACC,MAAD,EAASjE,CAAT,CAAP;;;AAGD,AAAO,SAASkE,oBAAT,CAA8BC,MAA9B,EAAsCC,MAAtC,EACsC;KAA5CC,UAA4C,uEAA/BD,OAAOjC,MAAP,GAAgBgC,OAAOhC,MAAQ;;;;KAGzCkC,aAAa,CAAhB,EAAmB;WACTtC,UAAUoC,MAAV,EAAkBE,UAAlB,CAAT;EADD,MAEO;WACGtC,UAAUqC,MAAV,EAAkBC,UAAlB,CAAT;;QAEM,CAACF,MAAD,EAASC,MAAT,CAAP;;;AAGD,AAAO,SAASE,cAAT,CAAwBC,GAAxB,EAA6BC,GAA7B,EAAkC;KACpC,CAACD,GAAL,EAAU;;;KAGNA,IAAIpC,MAAJ,GAAaqC,GAAjB,EAAsB;SACdD,IAAIE,KAAJ,CAAU,CAAV,EAAaD,MAAI,CAAjB,IAAsB,KAA7B;EADD,MAEO;SACCD,GAAP;;;;AAIF,AAAO,SAASG,kBAAT,CAA4BC,KAA5B,EAAmC;KACrCC,eAAJ;KACI,OAAOD,KAAP,KAAiB,QAArB,EAA+BC,SAASD,KAAT,CAA/B,KACK,IAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;WAC1BxB,OAAOwB,KAAP,CAAT;MACIxB,OAAOC,KAAP,CAAawB,MAAb,CAAJ,EAA0B,OAAOD,KAAP;;;;KAIvBE,IAAIxF,KAAKyF,KAAL,CAAWzF,KAAK0F,KAAL,CAAW1F,KAAKiD,GAAL,CAASsC,MAAT,CAAX,CAAX,CAAR;KACIC,KAAK,CAAT,EAAY,OAAOD,MAAP,CAV6B;KAWrCI,IAAI3F,KAAKyF,KAAL,CAAWD,IAAI,CAAf,CAAR;KACII,YAAa5F,KAAK6F,GAAL,CAAS,EAAT,EAAaL,IAAIG,IAAI,CAArB,IAA0B,CAAC,CAACJ,SAASvF,KAAK6F,GAAL,CAAS,EAAT,EAAaL,CAAb,CAAV,EAA2B/C,OAA3B,CAAmC,CAAnC,CAA5C;;;QAGOzC,KAAKkE,KAAL,CAAW0B,YAAU,GAArB,IAA0B,GAA1B,GAAgC,GAAhC,GAAsC,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,EAAoB,GAApB,EAAyBD,CAAzB,CAA7C;;;;AAID,AAAO,SAASG,uBAAT,CAAiCC,KAAjC,EAAwCC,KAAxC,EAA+C;;KAEjDC,SAAO,EAAX;MACI,IAAIhL,IAAE,CAAV,EAAYA,IAAE8K,MAAMjD,MAApB,EAA2B7H,GAA3B,EAA+B;SACvBiL,IAAP,CAAY,CAACH,MAAM9K,CAAN,CAAD,EAAW+K,MAAM/K,CAAN,CAAX,CAAZ;;;KAGGkL,YAAY,GAAhB;KACIC,OAAO,SAAPA,IAAO,CAACC,MAAD,EAASC,MAAT,EAAoB;MAC1BC,UAAUD,OAAO,CAAP,IAAYD,OAAO,CAAP,CAA1B;MACIG,UAAUF,OAAO,CAAP,IAAYD,OAAO,CAAP,CAA1B;SACO;WACErG,KAAKyG,IAAL,CAAUzG,KAAK6F,GAAL,CAASU,OAAT,EAAkB,CAAlB,IAAuBvG,KAAK6F,GAAL,CAASW,OAAT,EAAkB,CAAlB,CAAjC,CADF;UAECxG,KAAK0G,KAAL,CAAWF,OAAX,EAAoBD,OAApB;GAFR;EAHD;;KASII,eAAe,SAAfA,YAAe,CAACC,OAAD,EAAUC,QAAV,EAAoBC,IAApB,EAA0BC,OAA1B,EAAsC;MACpDvB,IAAIqB,YAAYD,OAApB;MACII,IAAIF,QAAQF,OAAhB;MACI9L,IAAIsL,KAAKZ,CAAL,EAAQwB,CAAR,CAAR;MACIzD,QAAQzI,EAAEyI,KAAF,IAAWwD,UAAU/G,KAAKC,EAAf,GAAoB,CAA/B,CAAZ;MACI6C,SAAShI,EAAEgI,MAAF,GAAWqD,SAAxB;MACIzF,IAAIkG,QAAQ,CAAR,IAAa5G,KAAK0D,GAAL,CAASH,KAAT,IAAkBT,MAAvC;MACInC,IAAIiG,QAAQ,CAAR,IAAa5G,KAAKyD,GAAL,CAASF,KAAT,IAAkBT,MAAvC;SACO,CAACpC,CAAD,EAAIC,CAAJ,CAAP;EARD;;KAWIsG,gBAAgB,SAAhBA,aAAgB,CAACC,KAAD,EAAQjM,CAAR,EAAWkM,CAAX,EAAiB;MAChCC,MAAMT,aAAaQ,EAAElM,IAAI,CAAN,CAAb,EAAuBkM,EAAElM,IAAI,CAAN,CAAvB,EAAiCiM,KAAjC,CAAV;MACIG,MAAMV,aAAaO,KAAb,EAAoBC,EAAElM,IAAI,CAAN,CAApB,EAA8BkM,EAAElM,IAAI,CAAN,CAA9B,EAAwC,IAAxC,CAAV;gBACYmM,IAAI,CAAJ,CAAZ,SAAsBA,IAAI,CAAJ,CAAtB,SAAgCC,IAAI,CAAJ,CAAhC,SAA0CA,IAAI,CAAJ,CAA1C,SAAoDH,MAAM,CAAN,CAApD,SAAgEA,MAAM,CAAN,CAAhE;EAHD;;KAMII,WAAW,SAAXA,QAAW,CAACrB,MAAD,EAASsB,OAAT,EAAqB;SAC5BtB,OAAOuB,MAAP,CAAc,UAACC,GAAD,EAAMP,KAAN,EAAajM,CAAb,EAAgBkM,CAAhB;UAAsBlM,MAAM,CAAN,GACrCiM,MAAM,CAAN,CADqC,SACzBA,MAAM,CAAN,CADyB,GAErCO,GAFqC,SAE9BF,QAAQL,KAAR,EAAejM,CAAf,EAAkBkM,CAAlB,CAFQ;GAAd,EAE8B,EAF9B,CAAP;EADD;;QAMOG,SAASrB,MAAT,EAAiBgB,aAAjB,CAAP;;;ACjGD,IAAMS,mBAAmB;eACV,SADU;SAEhB,SAFgB;WAGd,SAHc;QAIjB,SAJiB;WAKd,SALc;WAMd,SANc;UAOf,SAPe;gBAQT,SARS;WASd,SATc;YAUb,SAVa;UAWf,SAXe;SAYhB,SAZgB;eAaV,SAbU;cAcX;CAdd;;AAiBA,SAASC,UAAT,CAAoBC,CAApB,EAAsB;KACjBA,IAAI,GAAR,EAAa,OAAO,GAAP,CAAb,KACK,IAAIA,IAAI,CAAR,EAAW,OAAO,CAAP;QACTA,CAAP;;;AAGD,AAAO,SAASC,kBAAT,CAA4BrG,KAA5B,EAAmCsG,GAAnC,EAAwC;KAC1CC,MAAMC,SAASxG,KAAT,CAAV;KACIyG,WAAW,KAAf;KACIF,IAAI,CAAJ,KAAU,GAAd,EAAmB;QACZA,IAAI3C,KAAJ,CAAU,CAAV,CAAN;aACW,IAAX;;KAEG8C,MAAMC,SAASJ,GAAT,EAAa,EAAb,CAAV;KACIH,IAAID,WAAW,CAACO,OAAO,EAAR,IAAcJ,GAAzB,CAAR;KACIM,IAAIT,WAAW,CAAEO,OAAO,CAAR,GAAa,MAAd,IAAwBJ,GAAnC,CAAR;KACIO,IAAIV,WAAW,CAACO,MAAM,QAAP,IAAmBJ,GAA9B,CAAR;QACO,CAACG,WAAS,GAAT,GAAa,EAAd,IAAoB,CAACI,IAAKD,KAAK,CAAV,GAAgBR,KAAK,EAAtB,EAA2BU,QAA3B,CAAoC,EAApC,CAA3B;;;AAGD,AAAO,SAASC,YAAT,CAAsBnF,MAAtB,EAA8B;;KAEhCoF,SAAS,sCAAb;KACIC,SAAS,4GAAb;QACOD,OAAOE,IAAP,CAAYtF,MAAZ,KAAuBqF,OAAOC,IAAP,CAAYtF,MAAZ,CAA9B;;;AAGD,AAAO,IAAM4E,WAAW,SAAXA,QAAW,CAACxG,KAAD,EAAW;;KAE9B,2BAAD,CAA8BkH,IAA9B,CAAmClH,KAAnC,CAAH,EAA8C;uCACtC,CAAgCmH,IAAhC,CAAqCnH,KAArC,EACLhG,GADK,CACD,UAACkF,CAAD,EAAIzF,CAAJ;WAAWA,MAAM,CAAN,GAAU6I,OAAOpD,CAAP,EAAU4H,QAAV,CAAmB,EAAnB,CAAV,GAAmC,GAA9C;IADC,EAELd,MAFK,CAEE,UAACoB,CAAD,EAAIC,EAAJ;gBAAcD,CAAd,GAAkBC,EAAlB;IAFF;;;QAIDnB,iBAAiBlG,KAAjB,KAA2BA,KAAlC;CAPM;;ACvCA,IAAMsH,mBAAmB,CAAzB;AACP,IAAMC,eAAe,CAArB;AACA,IAAMC,kBAAkB,EAAxB;AACA,AAAO,IAAMC,YAAY,EAAlB;AACP,IAAMC,kBAAkB,SAAxB;AACA,IAAMC,YAAY,SAAlB;;AAEA,SAAS5O,GAAT,CAAWC,IAAX,EAAiBC,GAAjB,EAAsB;QACd,OAAOD,IAAP,KAAgB,QAAhB,GAA0B,CAACC,OAAOC,QAAR,EAAkBC,aAAlB,CAAgCH,IAAhC,CAA1B,GAAkEA,QAAQ,IAAjF;;;AAGD,AAAO,SAAS4O,SAAT,CAAmBvO,GAAnB,EAAwBC,CAAxB,EAA2B;KAC7BC,UAAUL,SAAS2O,eAAT,CAAyB,4BAAzB,EAAuDxO,GAAvD,CAAd;;MAEK,IAAII,CAAT,IAAcH,CAAd,EAAiB;MACZI,MAAMJ,EAAEG,CAAF,CAAV;;MAEIA,MAAM,QAAV,EAAoB;OACjBC,GAAF,EAAOC,WAAP,CAAmBJ,OAAnB;GADD,MAGK,IAAIE,MAAM,QAAV,EAAoB;OACpBG,MAAMb,IAAEW,GAAF,CAAV;OACIG,UAAJ,CAAeC,YAAf,CAA4BP,OAA5B,EAAqCK,GAArC;WACQD,WAAR,CAAoBC,GAApB;GAHI,MAKE,IAAIH,MAAM,QAAV,EAAoB;OACvB,QAAOC,GAAP,yCAAOA,GAAP,OAAe,QAAlB,EAA4B;WACpBK,IAAP,CAAYL,GAAZ,EAAiBM,GAAjB,CAAqB,gBAAQ;aACpBC,KAAR,CAAcC,IAAd,IAAsBR,IAAIQ,IAAJ,CAAtB;KADD;;GAFK,MAMA;OACHT,MAAM,WAAT,EAAsB;QAAM,OAAJ;;OACrBA,MAAM,WAAT,EAAsB;YACb,aAAR,IAAyBC,GAAzB;IADD,MAEO;YACES,YAAR,CAAqBV,CAArB,EAAwBC,GAAxB;;;;;QAKIH,OAAP;;;AAGD,SAASuO,sBAAT,CAAgCC,UAAhC,EAA4CC,UAA5C,EAAwD;QAChDJ,UAAU,gBAAV,EAA4B;UAC1BG,UAD0B;MAE9BC,UAF8B;MAG9B,CAH8B;MAI9B,CAJ8B;MAK9B,CAL8B;MAM9B;EANE,CAAP;;;AAUD,SAASC,eAAT,CAAyBC,QAAzB,EAAmCC,MAAnC,EAA2CnI,KAA3C,EAAkDc,OAAlD,EAA2D;QACnD8G,UAAU,MAAV,EAAkB;YACdM,QADc;4BAEAlI,KAFA;YAGdmI,MAHc;kBAIRrH;EAJV,CAAP;;;AAQD,AAAO,SAASsH,gBAAT,CAA0BxJ,MAA1B,EAAkCyJ,SAAlC,EAA6CjI,KAA7C,EAAoDgD,MAApD,EAA4D;QAC3DwE,UAAU,KAAV,EAAiB;aACZS,SADY;UAEfzJ,MAFe;SAGhBwB,KAHgB;UAIfgD;EAJF,CAAP;;;AAQD,AAAO,SAASkF,WAAT,CAAqBC,YAArB,EAAmC;QAClCX,UAAU,MAAV,EAAkB;UAChBW;EADF,CAAP;;;AAKD,AAAO,SAASC,YAAT,CAAsBH,SAAtB,EAAiE;KAAhCI,SAAgC,uEAAtB,EAAsB;KAAlB7J,MAAkB,uEAAX4D,SAAW;;KACnEkG,OAAO;aACCL,SADD;aAECI;EAFZ;KAIG7J,MAAH,EAAW8J,KAAKC,MAAL,GAAc/J,MAAd;QACJgJ,UAAU,GAAV,EAAec,IAAf,CAAP;;;AAGD;;AAQA,AAAO,SAASE,QAAT,CAAkBC,OAAlB,EAAoF;KAAzDR,SAAyD,uEAA/C,EAA+C;KAA3CS,MAA2C,uEAApC,MAAoC;KAA5BxJ,IAA4B,uEAAvB,MAAuB;KAAfyJ,WAAe,uEAAH,CAAG;;QACnFnB,UAAU,MAAV,EAAkB;aACbS,SADa;KAErBQ,OAFqB;UAGhB;WACCC,MADD;SAEDxJ,IAFC;mBAGSyJ;;EANX,CAAP;;;AAWD,AAAO,SAASC,cAAT,CAAwBC,aAAxB,EAAuCC,WAAvC,EAAoDC,MAApD,EAA4DnH,MAA5D,EAA4F;KAAxBoH,SAAwB,uEAAd,CAAc;KAAXC,QAAW,uEAAF,CAAE;KAC7FC,SAD6F,GACpEH,OAAOjK,CAAP,GAAW+J,cAAc/J,CAD2C;KAClFqK,SADkF,GACxCJ,OAAOhK,CAAP,GAAW8J,cAAc9J,CADe;KAE7FqK,OAF6F,GAExEL,OAAOjK,CAAP,GAAWgK,YAAYhK,CAFiD;KAEpFuK,OAFoF,GAE9CN,OAAOhK,CAAP,GAAW+J,YAAY/J,CAFuB;;cAGvFgK,OAAOjK,CAAlB,SAAuBiK,OAAOhK,CAA9B,eACImK,SADJ,SACiBC,SADjB,gBAEKvH,MAFL,SAEeA,MAFf,WAE2BqH,QAF3B,UAEuCD,YAAY,CAAZ,GAAgB,CAFvD,eAGGI,OAHH,SAGcC,OAHd;;;AAMD,AAAO,SAASC,aAAT,CAAuBT,aAAvB,EAAsCC,WAAtC,EAAmDC,MAAnD,EAA2DnH,MAA3D,EAA2F;KAAxBoH,SAAwB,uEAAd,CAAc;KAAXC,QAAW,uEAAF,CAAE;KAC5FC,SAD4F,GACnEH,OAAOjK,CAAP,GAAW+J,cAAc/J,CAD0C;KACjFqK,SADiF,GACvCJ,OAAOhK,CAAP,GAAW8J,cAAc9J,CADc;KAE5FqK,OAF4F,GAE/DL,OAAOjK,CAAP,GAAWgK,YAAYhK,CAFwC;KAEnFyK,MAFmF,GAErCR,OAAOhK,CAAP,GAAW,CAF0B;KAE3EsK,OAF2E,GAEvBN,OAAOhK,CAAP,GAAW+J,YAAY/J,CAFA;;cAGtFgK,OAAOjK,CAAlB,SAAuBiK,OAAOhK,CAA9B,eACImK,SADJ,SACiBC,SADjB,gBAEKvH,MAFL,SAEeA,MAFf,WAE2BqH,QAF3B,UAEuCD,YAAY,CAAZ,GAAgB,CAFvD,eAGGI,OAHH,SAGcG,MAHd,iBAIIL,SAJJ,SAIiBK,MAJjB,gBAKK3H,MALL,SAKeA,MALf,WAK2BqH,QAL3B,UAKuCD,YAAY,CAAZ,GAAgB,CALvD,eAMGI,OANH,SAMcC,OANd;;;AASD,AAAO,SAASG,oBAAT,CAA8BX,aAA9B,EAA6CC,WAA7C,EAA0DC,MAA1D,EAAkEnH,MAAlE,EAAkG;KAAxBoH,SAAwB,uEAAd,CAAc;KAAXC,QAAW,uEAAF,CAAE;KACnGC,SADmG,GAC1EH,OAAOjK,CAAP,GAAW+J,cAAc/J,CADiD;KACxFqK,SADwF,GAC9CJ,OAAOhK,CAAP,GAAW8J,cAAc9J,CADqB;KAEnGqK,OAFmG,GAE9EL,OAAOjK,CAAP,GAAWgK,YAAYhK,CAFuD;KAE1FuK,OAF0F,GAEpDN,OAAOhK,CAAP,GAAW+J,YAAY/J,CAF6B;;;cAI7FmK,SAAX,SAAwBC,SAAxB,gBACKvH,MADL,SACeA,MADf,WAC2BqH,QAD3B,UACuCD,YAAY,CAAZ,GAAgB,CADvD,eAEGI,OAFH,SAEcC,OAFd;;;AAKD,AAAO,SAASI,mBAAT,CAA6BZ,aAA7B,EAA4CC,WAA5C,EAAyDC,MAAzD,EAAiEnH,MAAjE,EAAiG;KAAxBoH,SAAwB,uEAAd,CAAc;KAAXC,QAAW,uEAAF,CAAE;KAClGC,SADkG,GACzEH,OAAOjK,CAAP,GAAW+J,cAAc/J,CADgD;KACvFqK,SADuF,GAC7CJ,OAAOhK,CAAP,GAAW8J,cAAc9J,CADoB;KAElGqK,OAFkG,GAErEL,OAAOjK,CAAP,GAAWgK,YAAYhK,CAF8C;KAEzFyK,MAFyF,GAE3C3H,SAAS,CAAT,GAAauH,SAF8B;KAEjFE,OAFiF,GAEnBN,OAAOhK,CAAP,GAAW8J,cAAc9J,CAFN;;;cAI5FmK,SAAX,SAAwBC,SAAxB,gBACKvH,MADL,SACeA,MADf,WAC2BqH,QAD3B,UACuCD,YAAY,CAAZ,GAAgB,CADvD,eAEGI,OAFH,SAEcG,MAFd,eAGIL,SAHJ,SAGiBK,MAHjB,gBAIK3H,MAJL,SAIeA,MAJf,WAI2BqH,QAJ3B,UAIuCD,YAAY,CAAZ,GAAgB,CAJvD,eAKGI,OALH,SAKcC,OALd;;;AAQD,AAAO,SAASK,YAAT,CAAsB/B,UAAtB,EAAkC/H,KAAlC,EAA0D;KAAjB+J,OAAiB,uEAAP,KAAO;;KAC5D/B,aAAY,uBAAuB,GAAvB,GAA6BhI,KAA7B,GAAqC,GAArC,IAA2C+J,UAAU,SAAV,GAAsB,SAAjE,CAAhB;KACIC,cAAclC,uBAAuBC,UAAvB,EAAmCC,UAAnC,CAAlB;KACIiC,YAAY,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAhB;KACGF,OAAH,EAAY;cACC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,CAAZ;;;iBAGeC,WAAhB,EAA6B,IAA7B,EAAmChK,KAAnC,EAA0CiK,UAAU,CAAV,CAA1C;iBACgBD,WAAhB,EAA6B,KAA7B,EAAoChK,KAApC,EAA2CiK,UAAU,CAAV,CAA3C;iBACgBD,WAAhB,EAA6B,MAA7B,EAAqChK,KAArC,EAA4CiK,UAAU,CAAV,CAA5C;;QAEOjC,UAAP;;;AAGD,AAAO,SAASkC,aAAT,CAAuBhL,CAAvB,EAA0BC,CAA1B,EAA6BiB,KAA7B,EAAoCgD,MAApC,EAC2C;KAAjD+G,KAAiD,uEAA3CrM,4BAA2C;KAAbwB,IAAa,uEAAR,MAAQ;;;KAE7CoJ,OAAO;aACC,gBADD;KAEPxJ,CAFO;KAGPC,CAHO;SAIHiB,KAJG;UAKFgD,MALE;QAMJ9D,IANI;UAOF;aACG+G,mBAAmB/G,IAAnB,EAAyB,CAAC,EAA1B,CADH;;;gCAImB8D,SAAShD,KAAnC,WAA6CA,KAA7C,UAAuDgD,MAJhD;mBAKS+G;;EAZlB;;QAgBOvC,UAAU,MAAV,EAAkBc,IAAlB,CAAP;;;AAGD,AAAO,SAAS0B,UAAT,CAAoB/B,SAApB,EAA+BnJ,CAA/B,EAAkCC,CAAlC,EAAqCkL,IAArC,EAA2CrI,MAA3C,EAAyE;KAAtB1C,IAAsB,uEAAjB,MAAiB;KAATgL,IAAS,uEAAJ,EAAI;;KAC3E5B,OAAO;aACCL,SADD;KAEPnJ,CAFO;KAGPC,CAHO;SAIHkL,IAJG;UAKFA,IALE;MAMNrI,MANM;QAOJ1C;EAPP;;QAUOvF,IAAP,CAAYuQ,IAAZ,EAAkBtQ,GAAlB,CAAsB,eAAO;OACvB6I,GAAL,IAAYyH,KAAKzH,GAAL,CAAZ;EADD;;QAIO+E,UAAU,MAAV,EAAkBc,IAAlB,CAAP;;;AAGD,AAAO,SAAS6B,SAAT,CAAmBrL,CAAnB,EAAsBC,CAAtB,EAAyBkL,IAAzB,EAAmE;KAApC/K,IAAoC,uEAA/B,MAA+B;KAAvBwE,KAAuB;KAAhB0G,QAAgB,uEAAP,KAAO;;SACjEA,WAAW/G,eAAeK,KAAf,EAAsB0D,eAAtB,CAAX,GAAoD1D,KAA5D;;KAEI4E,OAAO;aACC,YADD;KAEP,CAFO;KAGP,CAHO;SAIH2B,IAJG;UAKF,KALE;QAMJ/K;EANP;KAQImL,OAAO7C,UAAU,MAAV,EAAkB;aACjB,qBADiB;KAEzB,CAFyB;KAGzB,CAHyB;MAIvBH,YAAY,CAAb,GAAkB,IAJM;eAKdA,YAAY,GAAb,GAAoB,IALL;iBAMb,OANa;QAOtBE,SAPsB;aAQjB7D;EARD,CAAX;;KAWI4G,QAAQ9C,UAAU,GAAV,EAAe;4BACF1I,CAAxB,UAA8BC,CAA9B;EADW,CAAZ;OAGMxF,WAAN,CAAkBiO,UAAU,MAAV,EAAkBc,IAAlB,CAAlB;OACM/O,WAAN,CAAkB8Q,IAAlB;;QAEOC,KAAP;;;AAGD,AAAO,SAASC,SAAT,CAAmBzL,CAAnB,EAAsBC,CAAtB,EAAyBkL,IAAzB,EAAmE;KAApC/K,IAAoC,uEAA/B,MAA+B;KAAvBwE,KAAuB;KAAhB0G,QAAgB,uEAAP,KAAO;;SACjEA,WAAW/G,eAAeK,KAAf,EAAsB0D,eAAtB,CAAX,GAAoD1D,KAA5D;;KAEI4E,OAAO;aACC,YADD;MAEN,CAFM;MAGN,CAHM;KAIP2B,IAJO;QAKJ/K;EALP;KAOImL,OAAO7C,UAAU,MAAV,EAAkB;aACjB,qBADiB;KAEzB,CAFyB;KAGzB,CAHyB;MAIvBH,SAAD,GAAc,IAJU;MAKvBA,YAAU,CAAX,GAAgB,IALQ;eAMdA,YAAY,GAAb,GAAoB,IANL;iBAOb,OAPa;QAQtBE,SARsB;aASjB7D;EATD,CAAX;;KAYI4G,QAAQ9C,UAAU,GAAV,EAAe;4BACF1I,CAAxB,UAA8BC,CAA9B;EADW,CAAZ;OAGMxF,WAAN,CAAkBiO,UAAU,QAAV,EAAoBc,IAApB,CAAlB;OACM/O,WAAN,CAAkB8Q,IAAlB;;QAEOC,KAAP;;;AAGD,AAAO,SAASE,QAAT,CAAkBvC,SAAlB,EAA6BnJ,CAA7B,EAAgCC,CAAhC,EAAmC0L,OAAnC,EAA0D;KAAdC,OAAc,uEAAJ,EAAI;;KAC5DC,WAAWD,QAAQC,QAAR,IAAoBtD,SAAnC;KACIuD,KAAKF,QAAQE,EAAR,KAAexI,SAAf,GAA2BsI,QAAQE,EAAnC,GAAyCD,WAAW,CAA7D;KACIzL,OAAOwL,QAAQxL,IAAR,IAAgBqI,SAA3B;KACIsD,aAAaH,QAAQG,UAAR,IAAsB,OAAvC;QACOrD,UAAU,MAAV,EAAkB;aACbS,SADa;KAErBnJ,CAFqB;KAGrBC,CAHqB;MAIpB6L,KAAK,IAJe;eAKXD,WAAW,IALA;QAMlBzL,IANkB;iBAOT2L,UAPS;aAQbJ;EARL,CAAP;;;AAYD,SAASK,YAAT,CAAsBhM,CAAtB,EAAyB4E,KAAzB,EAAgCqH,EAAhC,EAAoCC,EAApC,EAAoD;KAAZN,OAAY,uEAAJ,EAAI;;KAChD,CAACA,QAAQhC,MAAZ,EAAoBgC,QAAQhC,MAAR,GAAiBpB,eAAjB;KAChBvD,IAAIyD,UAAU,MAAV,EAAkB;aACd,mBAAmBkD,QAAQzC,SADb;MAErB,CAFqB;MAGrB,CAHqB;MAIrB8C,EAJqB;MAKrBC,EALqB;UAMjB;WACCN,QAAQhC;;EAPV,CAAR;;KAWI2B,OAAO7C,UAAU,MAAV,EAAkB;KACzB,CADyB;KAEzBuD,KAAKC,EAAL,GAAUD,KAAK5D,YAAf,GAA8B4D,KAAK5D,YAAL,GAAoBE,SAFzB;MAGxBA,YAAY,IAHY;eAIfA,YAAY,IAJG;iBAKb,QALa;aAMjB3D,QAAQ;EANT,CAAX;;KASIc,OAAOgD,UAAU,GAAV,EAAe;4BACA1I,CAAzB;EADU,CAAX;;MAIKvF,WAAL,CAAiBwK,CAAjB;MACKxK,WAAL,CAAiB8Q,IAAjB;;QAEO7F,IAAP;;;AAGD,SAASyG,YAAT,CAAsBlM,CAAtB,EAAyB2E,KAAzB,EAAgCwH,EAAhC,EAAoCC,EAApC,EAAsD;KAAdT,OAAc,uEAAJ,EAAI;;KAC9C,CAACA,QAAQhC,MAAb,EAAqBgC,QAAQhC,MAAR,GAAiBpB,eAAjB;KACjB,CAACoD,QAAQU,QAAb,EAAuBV,QAAQU,QAAR,GAAmB,EAAnB;KACnB,CAACV,QAAQW,SAAb,EAAwBX,QAAQW,SAAR,GAAoB,MAApB;KACpBX,QAAQY,cAAZ,EAA4B5H,QAAQD,mBAAmBC,KAAnB,CAAR;;KAExBuE,YACA,qBACAyC,QAAQzC,SADR,IAECyC,QAAQU,QAAR,KAAqB,QAArB,GAAgC,QAAhC,GAA2C,EAF5C,CADJ;;KAKIrH,IAAIyD,UAAU,MAAV,EAAkB;aACXS,SADW;MAElBiD,EAFkB;MAGlBC,EAHkB;MAIlB,CAJkB;MAKlB,CALkB;UAMd;WACIT,QAAQhC;;EAPhB,CAAR;;KAWI2B,OAAO7C,UAAU,MAAV,EAAkB;KACtBkD,QAAQW,SAAR,KAAsB,MAAtB,GAA+BH,KAAK/D,YAApC,GAAmDgE,KAAKhE,eAAe,CADjD;KAEtB,CAFsB;MAGrBE,YAAY,CAAZ,GAAgB,CAAhB,GAAoB,IAHC;eAIZA,YAAY,IAJA;iBAKV6D,KAAKC,EAAL,GAAU,KAAV,GAAkB,OALR;aAMdzH,QAAQ;EANZ,CAAX;;KASIc,OAAOgD,UAAU,GAAV,EAAe;+BACKzI,CAA3B,MADsB;oBAEJ;EAFX,CAAX;;KAKIsL,SAAS,CAAT,IAAcA,SAAS,GAA3B,EAAgC;OACvBxQ,KAAL,CAAW6O,MAAX,GAAoB,uBAApB;;;MAGCnP,WAAL,CAAiBwK,CAAjB;MACKxK,WAAL,CAAiB8Q,IAAjB;;QAEO7F,IAAP;;;AAGJ,AAAO,SAAS+G,iBAAT,CAA2Bb,OAA3B,EAAoC;KACnC,CAACA,QAAQpL,KAAb,EAAoB;;KAEdR,IAAI4L,QAAQc,QAAR,KAAqB,MAArB,GAA8BrE,YAA9B,GAA6CuD,QAAQ1K,KAA/D;;KAEMyL,WACFf,QAAQc,QAAR,KAAqB,OAArB,mBACoBd,QAAQ1K,KAD5B,UACsC0K,QAAQ1H,MAAR,GAAiB,CADvD,6BAEwB0H,QAAQ1H,MAAR,GAAiB,CAFzC,MADJ;;KAKM0I,WAAWlE,UAAU,MAAV,EAAkB;aACpB,aADoB;KAE5B1I,IAAIyC,eAAemJ,QAAQpL,KAAvB,EAA8B,CAA9B,IAAmC,CAFX;KAG5BoL,QAAQ1H,MAAR,GAAiB,CAAjB,GAAqBmE,YAHO;MAI3BE,YAAY,CAAC,CAAb,GAAiB,IAJU;eAKlBA,YAAY,IALM;iBAMhB,OANgB;aAOpBoE,QAPoB;aAQpBf,QAAQpL,KAAR,GAAgB;EARd,CAAjB;;QAWOoM,QAAP;;;AAGJ,AAAO,SAASC,KAAT,CAAe5M,CAAf,EAAkB2E,KAAlB,EAAyB1D,KAAzB,EAA8C;KAAd0K,OAAc,uEAAJ,EAAI;;KAC7C,CAAC3I,cAAchD,CAAd,CAAL,EAAuBA,IAAI,CAAJ;;KAEnB,CAAC2L,QAAQkB,GAAb,EAAkBlB,QAAQkB,GAAR,GAAc,MAAd;KACd,CAAClB,QAAQ3C,MAAb,EAAqB2C,QAAQ3C,MAAR,GAAiB,CAAjB;KACjB,CAAC2C,QAAQmB,IAAb,EAAmBnB,QAAQmB,IAAR,GAAe,MAAf;KACf,CAACnB,QAAQhC,MAAb,EAAqBgC,QAAQhC,MAAR,GAAiBpB,eAAjB;KACjB,CAACoD,QAAQzC,SAAb,EAAwByC,QAAQzC,SAAR,GAAoB,EAApB;;KAEpBiD,KAAK,CAAC,CAAD,GAAKhE,gBAAd;KACIiE,KAAKT,QAAQmB,IAAR,KAAiB,MAAjB,GAA0B7L,QAAQkH,gBAAlC,GAAqD,CAA9D;;KAEIwD,QAAQmB,IAAR,KAAiB,MAAjB,IAA2BnB,QAAQkB,GAAR,KAAgB,OAA/C,EAAwD;OAC/C5L,QAAQkH,gBAAb;OACKlH,KAAL;;;KAGA+H,SAAS2C,QAAQkB,GAAR,KAAgB,MAAhB,GAAyB,CAAC,CAAD,GAAKlB,QAAQ3C,MAAtC,GAA+C2C,QAAQ3C,MAApE;;OAEMA,MAAN;OACMA,MAAN;;QAEOkD,aAAalM,CAAb,EAAgB2E,KAAhB,EAAuBwH,EAAvB,EAA2BC,EAA3B,EAA+B;UAC1BT,QAAQhC,MADkB;aAEvBgC,QAAQzC,SAFe;YAGxByC,QAAQU,QAHgB;aAIvBV,QAAQkB,GAJe;kBAKlBlB,QAAQY;EALrB,CAAP;;;AASJ,AAAO,SAASQ,KAAT,CAAehN,CAAf,EAAkB4E,KAAlB,EAAyBV,MAAzB,EAA6C;KAAZ0H,OAAY,uEAAJ,EAAI;;KAC/C,CAAC3I,cAAcjD,CAAd,CAAL,EAAuBA,IAAI,CAAJ;;KAEpB,CAAC4L,QAAQkB,GAAZ,EAAiBlB,QAAQkB,GAAR,GAAc,QAAd;KACd,CAAClB,QAAQ3C,MAAZ,EAAoB2C,QAAQ3C,MAAR,GAAiB,CAAjB;KACjB,CAAC2C,QAAQmB,IAAZ,EAAkBnB,QAAQmB,IAAR,GAAe,MAAf;KACf,CAACnB,QAAQhC,MAAZ,EAAoBgC,QAAQhC,MAAR,GAAiBpB,eAAjB;KACjB,CAACoD,QAAQzC,SAAZ,EAAuByC,QAAQzC,SAAR,GAAoB,EAApB;;;;;;;;;;;;;KAanB8C,KAAK/H,SAASkE,gBAAlB;KACI8D,KAAKN,QAAQmB,IAAR,KAAiB,MAAjB,GAA0B,CAAC,CAAD,GAAK3E,gBAA/B,GAAkDlE,MAA3D;;KAEG0H,QAAQmB,IAAR,KAAiB,MAAjB,IAA2BnB,QAAQkB,GAAR,KAAgB,KAA9C,EAAqD;;OAE/C,CAAC,CAAD,GAAK1E,gBAAV;OACK,CAAL;;;QAGM4D,aAAahM,CAAb,EAAgB4E,KAAhB,EAAuBqH,EAAvB,EAA2BC,EAA3B,EAA+B;UAC7BN,QAAQhC,MADqB;aAE1BgC,QAAQzC,SAFkB;YAG3ByC,QAAQU;EAHZ,CAAP;;;AAOD,AAAO,SAASW,OAAT,CAAiBhN,CAAjB,EAAoB2E,KAApB,EAA2B1D,KAA3B,EAA8C;KAAZ0K,OAAY,uEAAJ,EAAI;;KACjD,CAACA,QAAQsB,QAAZ,EAAsBtB,QAAQsB,QAAR,GAAmB,OAAnB;KAClBlN,IAAI4L,QAAQsB,QAAR,KAAqB,MAArB,GAA8B7E,YAA9B,GACLnH,QAAQuB,eAAemC,KAAf,EAAsB,CAAtB,CAAR,GAAmCyD,YADtC;;KAGIuE,WAAWlE,UAAU,MAAV,EAAkB;aACrB,aADqB;KAE7B1I,CAF6B;KAG7B,CAH6B;MAI3BuI,YAAY,CAAC,CAAd,GAAmB,IAJS;eAKnBA,YAAY,IALO;iBAMjB,OANiB;aAOrB3D,QAAM;EAPH,CAAf;;KAUIc,OAAOyG,aAAalM,CAAb,EAAgB,EAAhB,EAAoB,CAApB,EAAuBiB,KAAvB,EAA8B;UAChC0K,QAAQhC,MAAR,IAAkBpB,eADc;aAE7BoD,QAAQzC,SAAR,IAAqB,EAFQ;YAG9ByC,QAAQU;EAHR,CAAX;;MAMK7R,WAAL,CAAiBmS,QAAjB;;QAEOlH,IAAP;;;AAGD,AAAO,SAASyH,OAAT,CAAiBlB,EAAjB,EAAqBC,EAArB,EAAyBhL,KAAzB,EAAgC0D,KAAhC,EAAmD;KAAZgH,OAAY,uEAAJ,EAAI;;;KAErD1H,SAAS+H,KAAKC,EAAlB;;KAEI/Q,OAAOuN,UAAU,MAAV,EAAkB;uBAAA;UAEpB;oCAAA;WAECF,eAFD;uBAGgBtH,KAAvB,UAAiCgD;GALN;;KAQzB,CARyB;KASzB,CATyB;SAUrBhD,KAVqB;UAWpBgD;EAXE,CAAX;;KAcG,CAAC0H,QAAQsB,QAAZ,EAAsBtB,QAAQsB,QAAR,GAAmB,OAAnB;KAClBlN,IAAI4L,QAAQsB,QAAR,KAAqB,MAArB,GAA8B7E,YAA9B,GACLnH,QAAQuB,eAAemC,QAAM,EAArB,EAAyB,GAAzB,CAAR,GAAwCyD,YAD3C;;KAGIuE,WAAWlE,UAAU,MAAV,EAAkB;aACrB,aADqB;KAE7B1I,CAF6B;KAG7B,CAH6B;MAI3BuI,YAAY,CAAC,CAAd,GAAmB,IAJS;eAKnBA,YAAY,IALO;iBAMjB,OANiB;aAOrB3D,QAAM;EAPH,CAAf;;KAUIwI,SAAS1E,UAAU,GAAV,EAAe;+BACAwD,EAA3B;EADY,CAAb;;QAIOzR,WAAP,CAAmBU,IAAnB;QACOV,WAAP,CAAmBmS,QAAnB;;QAEOQ,MAAP;;;AAGD,AAAO,SAASC,UAAT,CAAoBrN,CAApB,EAAuBgE,IAAvB,EAA6B9C,KAA7B,EAAoCJ,KAApC,EAAiF;KAAtC8D,KAAsC,uEAAhC,EAAgC;KAA5BjE,KAA4B,uEAAtB,CAAsB;KAAnBsI,MAAmB,uEAAZ,CAAY;KAATqE,IAAS,uEAAJ,EAAI;;6BACrEvJ,qBAAqBC,IAArB,EAA2BsJ,KAAKrJ,QAAhC,CADqE;;KAClFC,MADkF;KAC1EjE,CAD0E;;MAElFgJ,MAAL;;KAEG/E,WAAW,CAAd,EAAiB;WACPoJ,KAAKC,SAAd;OACKD,KAAKC,SAAV;;;;KAIG,CAACtK,cAAcjD,CAAd,CAAL,EAAuBA,IAAI,CAAJ;KACnB,CAACiD,cAAchD,CAAd,CAAL,EAAuBA,IAAI,CAAJ;KACnB,CAACgD,cAAciB,MAAd,EAAsB,IAAtB,CAAL,EAAkCA,SAAS,CAAT;KAC9B,CAACjB,cAAc/B,KAAd,EAAqB,IAArB,CAAL,EAAiCA,QAAQ,CAAR;;KAE7B/F,OAAOuN,UAAU,MAAV,EAAkB;uBAAA;oBAEZ5H,KAFY;sBAGRH,KAHQ;KAIzBX,CAJyB;KAKzBC,CALyB;SAMrBiB,KANqB;UAOpBgD;EAPE,CAAX;;UAUS,EAAT;;KAEG,CAACU,KAAD,IAAU,CAACA,MAAMxC,MAApB,EAA4B;SACpBjH,IAAP;EADD,MAEO;OACDF,YAAL,CAAkB,GAAlB,EAAuB,CAAvB;OACKA,YAAL,CAAkB,GAAlB,EAAuB,CAAvB;MACIsQ,OAAO7C,UAAU,MAAV,EAAkB;cACjB,kBADiB;MAEzBxH,QAAM,CAFmB;MAGzB,CAHyB;OAIvBqH,YAAY,CAAZ,GAAgB,CAAC,CAAlB,GAAuB,IAJC;gBAKfA,YAAY,IALG;kBAMb,QANa;cAOjB3D;GAPD,CAAX;;MAUI4G,QAAQ9C,UAAU,GAAV,EAAe;uBACN/H,KADM;6BAEFX,CAAxB,UAA8BC,CAA9B;GAFW,CAAZ;QAIMxF,WAAN,CAAkBU,IAAlB;QACMV,WAAN,CAAkB8Q,IAAlB;;SAEOC,KAAP;;;;AAIF,AAAO,SAASgC,UAAT,CAAoBxN,CAApB,EAAuBC,CAAvB,EAA0B6C,MAA1B,EAAkChC,KAAlC,EAA4D;KAAnB8D,KAAmB,uEAAb,EAAa;KAATjE,KAAS,uEAAH,CAAG;;KAC9D8M,MAAM/E,UAAU,QAAV,EAAoB;oBACb5H,KADa;sBAETH,KAFS;MAGzBX,CAHyB;MAIzBC,CAJyB;KAK1B6C;EALM,CAAV;;UAQS,EAAT;;KAEG,CAAC8B,KAAD,IAAU,CAACA,MAAMxC,MAApB,EAA4B;SACpBqL,GAAP;EADD,MAEO;MACFxS,YAAJ,CAAiB,IAAjB,EAAuB,CAAvB;MACIA,YAAJ,CAAiB,IAAjB,EAAuB,CAAvB;;MAEIsQ,OAAO7C,UAAU,MAAV,EAAkB;cACjB,kBADiB;MAEzB,CAFyB;MAGzB,CAHyB;OAIvBH,YAAY,CAAZ,GAAgB,CAAC,CAAjB,GAAqBzF,MAAtB,GAAgC,IAJR;gBAKfyF,YAAY,IALG;kBAMb,QANa;cAOjB3D;GAPD,CAAX;;MAUI4G,QAAQ9C,UAAU,GAAV,EAAe;uBACN/H,KADM;6BAEFX,CAAxB,UAA8BC,CAA9B;GAFW,CAAZ;QAIMxF,WAAN,CAAkBgT,GAAlB;QACMhT,WAAN,CAAkB8Q,IAAlB;;SAEOC,KAAP;;;;AAIF,AAAO,SAASkC,QAAT,CAAkBrI,KAAlB,EAAyBC,KAAzB,EAAgCxE,KAAhC,EAA4D;KAArB8K,OAAqB,uEAAb,EAAa;KAAT0B,IAAS,uEAAJ,EAAI;;KAC9DK,aAAarI,MAAMxK,GAAN,CAAU,UAACmF,CAAD,EAAI1F,CAAJ;SAAW8K,MAAM9K,CAAN,IAAW,GAAX,GAAiB0F,CAA5B;EAAV,CAAjB;KACI2N,YAAYD,WAAWE,IAAX,CAAgB,GAAhB,CAAhB;;;KAGIjC,QAAQkC,MAAZ,EACCF,YAAYxI,wBAAwBC,KAAxB,EAA+BC,KAA/B,CAAZ;;KAEGyI,OAAOrE,SAAS,MAAIkE,SAAb,EAAwB,iBAAxB,EAA2C9M,KAA3C,CAAX;;;KAGG8K,QAAQoC,QAAX,EAAqB;MAChBC,cAAcrD,aAAa0C,KAAKY,OAAlB,EAA2BpN,KAA3B,CAAlB;OACK/F,KAAL,CAAW6O,MAAX,aAA4BqE,WAA5B;;;KAGGE,QAAQ;QACLJ;EADP;;;KAKGnC,QAAQwC,UAAX,EAAuB;MAClBC,qBAAqBzD,aAAa0C,KAAKY,OAAlB,EAA2BpN,KAA3B,EAAkC,IAAlC,CAAzB;;MAEI6I,UAAU,OAAStE,MAAM,CAAN,CAAT,SAAqBiI,KAAKrJ,QAA1B,UAAwC2J,SAAxC,UAAwDvI,MAAMX,KAAN,CAAY,CAAC,CAAb,EAAgB,CAAhB,CAAxD,SAA8E4I,KAAKrJ,QAAnF,CAAd;QACMmJ,MAAN,GAAe1D,SAASC,OAAT,iBAAiC,MAAjC,YAAiD0E,kBAAjD,OAAf;;;QAGMF,KAAP;;;AAGD,AAAO,IAAIG,cAAc;QACjB,aAACC,IAAD,EAAU;MACZC,uBAAJ;MACGD,KAAKE,QAAL,KAAkB,MAArB,EAA6B;oBACXF,KAAKG,YAAL,CAAkB,WAAlB,CAAjB;UACOH,KAAKI,UAAL,CAAgB,CAAhB,CAAP;;MAEGC,UAAUL,KAAKM,SAAL,EAAd;UACQ9T,KAAR,CAAcqF,IAAd,GAAqB,SAArB;UACQrF,KAAR,CAAc6G,OAAd,GAAwB,KAAxB;;MAEG4M,cAAH,EAAmB;WACVvT,YAAR,CAAqB,WAArB,EAAkCuT,cAAlC;;SAEMI,OAAP;EAduB;;QAiBjB,aAACL,IAAD,EAAU;MACZC,uBAAJ;MACGD,KAAKE,QAAL,KAAkB,QAArB,EAA+B;oBACbF,KAAKG,YAAL,CAAkB,WAAlB,CAAjB;UACOH,KAAKI,UAAL,CAAgB,CAAhB,CAAP;;MAEGC,UAAUL,KAAKM,SAAL,EAAd;MACI/L,SAASyL,KAAKG,YAAL,CAAkB,GAAlB,CAAb;MACItO,OAAOmO,KAAKG,YAAL,CAAkB,MAAlB,CAAX;UACQzT,YAAR,CAAqB,GAArB,EAA0BwM,SAAS3E,MAAT,IAAmBpE,qBAA7C;UACQzD,YAAR,CAAqB,MAArB,EAA6BmF,IAA7B;UACQrF,KAAR,CAAc6G,OAAd,GAAwB,KAAxB;;MAEG4M,cAAH,EAAmB;WACVvT,YAAR,CAAqB,WAArB,EAAkCuT,cAAlC;;SAEMI,OAAP;EAjCuB;;gBAoCT,qBAACL,IAAD,EAAU;MACpBC,uBAAJ;MACGD,KAAKE,QAAL,KAAkB,QAArB,EAA+B;oBACbF,KAAKG,YAAL,CAAkB,WAAlB,CAAjB;UACOH,KAAKI,UAAL,CAAgB,CAAhB,CAAP;;MAEGC,UAAUL,KAAKM,SAAL,EAAd;MACI/L,SAASyL,KAAKG,YAAL,CAAkB,GAAlB,CAAb;MACItO,OAAOmO,KAAKG,YAAL,CAAkB,MAAlB,CAAX;UACQzT,YAAR,CAAqB,GAArB,EAA0BwM,SAAS3E,MAAT,IAAmBpE,qBAA7C;UACQzD,YAAR,CAAqB,MAArB,EAA6BmF,IAA7B;UACQrF,KAAR,CAAc6G,OAAd,GAAwB,KAAxB;;MAEG4M,cAAH,EAAmB;WACVvT,YAAR,CAAqB,WAArB,EAAkCuT,cAAlC;;SAEMI,OAAP;;CApDK;;AAwDP,AAAO,IAAIE,gBAAgB;QACnB,aAACP,IAAD,EAAOK,OAAP,EAAmB;MACrBJ,uBAAJ;MACGD,KAAKE,QAAL,KAAkB,MAArB,EAA6B;oBACXF,KAAKG,YAAL,CAAkB,WAAlB,CAAjB;UACOH,KAAKI,UAAL,CAAgB,CAAhB,CAAP;;MAEGI,aAAa,CAAC,GAAD,EAAM,GAAN,EAAW,OAAX,EAAoB,QAApB,CAAjB;SACOC,MAAP,CAAcT,KAAKQ,UAAnB,EACEE,MADF,CACS;UAAQF,WAAWG,QAAX,CAAoBC,KAAK1N,IAAzB,KAAkC0N,KAAKC,SAA/C;GADT,EAEEtU,GAFF,CAEM,gBAAQ;WACJG,YAAR,CAAqBkU,KAAK1N,IAA1B,EAAgC0N,KAAKE,SAArC;GAHF;;MAMGb,cAAH,EAAmB;WACVvT,YAAR,CAAqB,WAArB,EAAkCuT,cAAlC;;EAfwB;;QAmBnB,aAACD,IAAD,EAAOK,OAAP,EAAmB;MACrBJ,uBAAJ;MACGD,KAAKE,QAAL,KAAkB,QAArB,EAA+B;oBACbF,KAAKG,YAAL,CAAkB,WAAlB,CAAjB;UACOH,KAAKI,UAAL,CAAgB,CAAhB,CAAP;;MAEGI,aAAa,CAAC,IAAD,EAAO,IAAP,CAAjB;SACOC,MAAP,CAAcT,KAAKQ,UAAnB,EACEE,MADF,CACS;UAAQF,WAAWG,QAAX,CAAoBC,KAAK1N,IAAzB,KAAkC0N,KAAKC,SAA/C;GADT,EAEEtU,GAFF,CAEM,gBAAQ;WACJG,YAAR,CAAqBkU,KAAK1N,IAA1B,EAAgC0N,KAAKE,SAArC;GAHF;;MAMGb,cAAH,EAAmB;WACVvT,YAAR,CAAqB,WAArB,EAAkCuT,cAAlC;;EAjCwB;;gBAqCX,qBAACD,IAAD,EAAOK,OAAP,EAAmB;MAC7BJ,uBAAJ;MACGD,KAAKE,QAAL,KAAkB,QAArB,EAA+B;oBACbF,KAAKG,YAAL,CAAkB,WAAlB,CAAjB;UACOH,KAAKI,UAAL,CAAgB,CAAhB,CAAP;;MAEGI,aAAa,CAAC,IAAD,EAAO,IAAP,CAAjB;SACOC,MAAP,CAAcT,KAAKQ,UAAnB,EACEE,MADF,CACS;UAAQF,WAAWG,QAAX,CAAoBC,KAAK1N,IAAzB,KAAkC0N,KAAKC,SAA/C;GADT,EAEEtU,GAFF,CAEM,gBAAQ;WACJG,YAAR,CAAqBkU,KAAK1N,IAA1B,EAAgC0N,KAAKE,SAArC;GAHF;;MAMGb,cAAH,EAAmB;WACVvT,YAAR,CAAqB,WAArB,EAAkCuT,cAAlC;;;CAnDI;;AC9rBA,IAAMc,gBAAgB,GAAtB;AACP,AAAO,IAAMC,gBAAgB,GAAtB;AACP,AAAO,IAAMC,uBAAuBF,aAA7B;AACP,AAAO,IAAMG,sBAAsB,GAA5B;;AAEP,AAAO,IAAMC,aAAa,QAAnB;;AAEP,AAAO,SAASC,SAAT,CAAmBpB,IAAnB,EAAyBqB,QAAzB,EAAmCC,QAAnC,EAA6CC,QAA7C,EAAuD;KACzDC,MAAM,OAAOH,QAAP,KAAoB,QAApB,GAA+BA,QAA/B,GAA0CA,SAAS/B,IAAT,CAAc,IAAd,CAApD;QACO,CACNU,IADM,EAEN,EAAChF,WAAWsG,SAAShC,IAAT,CAAc,IAAd,CAAZ,EAFM,EAGNiC,QAHM,EAINJ,UAJM,EAKN,WALM,EAMN,EAACnG,WAAWwG,GAAZ,EANM,CAAP;;;AAUD,AAAO,SAASC,iBAAT,CAA2BhD,KAA3B,EAAkCiD,IAAlC,EAAwCC,IAAxC,EAA8C;QAC7CP,UAAU3C,KAAV,EAAiB,CAACkD,IAAD,EAAO,CAAP,CAAjB,EAA4B,CAACD,IAAD,EAAO,CAAP,CAA5B,EAAuCT,oBAAvC,CAAP;;;AAGD,AAAO,SAASW,iBAAT,CAA2BtD,KAA3B,EAAkCuD,IAAlC,EAAwCC,IAAxC,EAA8C;QAC7CV,UAAU9C,KAAV,EAAiB,CAAC,CAAD,EAAIwD,IAAJ,CAAjB,EAA4B,CAAC,CAAD,EAAID,IAAJ,CAA5B,EAAuCZ,oBAAvC,CAAP;;;AAGD,AAAO,SAASc,aAAT,CAAuBC,SAAvB,EAAkCC,KAAlC,EAAyCC,KAAzC,EAAgDC,KAAhD,EAAuD;KACzDC,YAAYH,QAAQC,KAAxB;KACItV,OAAOoV,UAAU5B,UAAV,CAAqB,CAArB,CAAX;KACIzN,QAAQ/F,KAAKuT,YAAL,CAAkB,OAAlB,CAAZ;KACIkC,WAAW,CACdzV,IADc,EAEd,EAAE+I,QAAQyM,SAAV,EAAqB,oBAAuBzP,KAAvB,UAAiCyP,SAAtD,EAFc,EAGdnB,oBAHc,EAIdE,UAJc,CAAf;;KAOImB,YAAYlB,UAAUY,SAAV,EAAqB,CAAC,CAAD,EAAIG,KAAJ,CAArB,EAAiC,CAAC,CAAD,EAAID,KAAJ,CAAjC,EAA6CjB,oBAA7C,CAAhB;QACO,CAACoB,QAAD,EAAWC,SAAX,CAAP;;;AAGD,AAAO,SAASC,UAAT,CAAoBC,GAApB,EAAyB/Q,CAAzB,EAA4BgE,IAA5B,EAAkC9C,KAAlC,EAA4D;KAAnB+H,MAAmB,uEAAZ,CAAY;KAATqE,IAAS,uEAAJ,EAAI;;6BAChDvJ,qBAAqBC,IAArB,EAA2BsJ,KAAKrJ,QAAhC,CADgD;;KAC7DC,MAD6D;KACrDjE,CADqD;;MAE7DgJ,MAAL;KACG8H,IAAItC,QAAJ,KAAiB,MAApB,EAA4B;MACvBtT,OAAO4V,IAAIpC,UAAJ,CAAe,CAAf,CAAX;MACIiC,WAAW,CACdzV,IADc,EAEd,EAAC+F,OAAOA,KAAR,EAAegD,QAAQA,MAAvB,EAFc,EAGdoL,aAHc,EAIdI,UAJc,CAAf;;MAOIsB,cAAcD,IAAIrC,YAAJ,CAAiB,WAAjB,EAA8BuC,KAA9B,CAAoC,GAApC,EAAyC,CAAzC,EAA4CvM,KAA5C,CAAkD,CAAlD,EAAqD,CAAC,CAAtD,CAAlB;MACImM,YAAYlB,UAAUoB,GAAV,EAAeC,WAAf,EAA4B,CAAChR,CAAD,EAAIC,CAAJ,CAA5B,EAAoCuP,oBAApC,CAAhB;SACO,CAACoB,QAAD,EAAWC,SAAX,CAAP;EAXD,MAYO;SACC,CAAC,CAACE,GAAD,EAAM,EAAC7P,OAAOA,KAAR,EAAegD,QAAQA,MAAvB,EAA+BlE,GAAGA,CAAlC,EAAqCC,GAAGA,CAAxC,EAAN,EAAkDqP,aAAlD,EAAiEI,UAAjE,CAAD,CAAP;;;;;AAKF,AAAO,SAASwB,UAAT,CAAoBzD,GAApB,EAAyBzN,CAAzB,EAA4BC,CAA5B,EAA+B;KAClCwN,IAAIgB,QAAJ,KAAiB,QAApB,EAA8B;MACzBuC,cAAcvD,IAAIiB,YAAJ,CAAiB,WAAjB,EAA8BuC,KAA9B,CAAoC,GAApC,EAAyC,CAAzC,EAA4CvM,KAA5C,CAAkD,CAAlD,EAAqD,CAAC,CAAtD,CAAlB;MACImM,YAAYlB,UAAUlC,GAAV,EAAeuD,WAAf,EAA4B,CAAChR,CAAD,EAAIC,CAAJ,CAA5B,EAAoCuP,oBAApC,CAAhB;SACO,CAACqB,SAAD,CAAP;EAHD,MAIO;SACC,CAAC,CAACpD,GAAD,EAAM,EAAC0D,IAAInR,CAAL,EAAQoR,IAAInR,CAAZ,EAAN,EAAsBqP,aAAtB,EAAqCI,UAArC,CAAD,CAAP;;;;;AAKF,AAAO,SAAS2B,WAAT,CAAqBlD,KAArB,EAA4BmD,QAA5B,EAAsCC,QAAtC,EAAgDtN,QAAhD,EAA0D6J,MAA1D,EAAkE;KACpE0D,iBAAiB,EAArB;KACI5D,YAAY2D,SAASzW,GAAT,CAAa,UAACmF,CAAD,EAAI1F,CAAJ;SAAW+W,SAAS/W,CAAT,IAAc,GAAd,GAAoB0F,CAA/B;EAAb,EAAgD4N,IAAhD,CAAqD,GAArD,CAAhB;;KAEIC,MAAJ,EACCF,YAAYxI,wBAAwBkM,QAAxB,EAAkCC,QAAlC,CAAZ;;KAEKE,WAAW,CAACtD,MAAMJ,IAAP,EAAa,EAACjM,GAAE,MAAM8L,SAAT,EAAb,EAAkC2B,aAAlC,EAAiDG,UAAjD,CAAjB;gBACelK,IAAf,CAAoBiM,QAApB;;KAEGtD,MAAMf,MAAT,EAAiB;MACZsE,aAAgBJ,SAAS,CAAT,CAAhB,SAA+BrN,QAA/B,MAAJ;MACI0N,iBAAeL,SAAS5M,KAAT,CAAe,CAAC,CAAhB,EAAmB,CAAnB,CAAf,UAAyCT,QAA7C;;MAEM2N,aAAa,CAClBzD,MAAMf,MADY,EAElB,EAACtL,GAAE,MAAM4P,UAAN,GAAmB9D,SAAnB,GAA+B+D,QAAlC,EAFkB,EAGlBpC,aAHkB,EAIlBG,UAJkB,CAAnB;iBAMelK,IAAf,CAAoBoM,UAApB;;;QAGMJ,cAAP;;;AAGD,AAAO,SAASK,cAAT,CAAwBC,OAAxB,EAAiCnI,OAAjC,EAA0C;QACzC,CAACmI,OAAD,EAAU,EAAChQ,GAAG6H,OAAJ,EAAV,EAAwB2F,aAAxB,EAAuCI,UAAvC,CAAP;;;ACvGD;;AAEA,AAEA,IAAMqC,SAAS;OACR,iBADQ;SAEN,SAFM;;SAIN,eAJM;UAKL,YALK;YAMH;CANZ;;AASA,SAASC,iBAAT,CAA2B3X,OAA3B,EAAoC4X,KAApC,EAA2CC,GAA3C,EAAmG;KAAnDC,UAAmD,uEAAxC,QAAwC;KAA9BpV,IAA8B,uEAAzBuG,SAAyB;KAAd8O,SAAc,uEAAJ,EAAI;;;KAE9FC,cAAchY,QAAQwU,SAAR,CAAkB,IAAlB,CAAlB;KACIyD,aAAajY,QAAQwU,SAAR,CAAkB,IAAlB,CAAjB;;MAEI,IAAI0D,aAAR,IAAyBN,KAAzB,EAAgC;MAC3BO,uBAAJ;MACGD,kBAAkB,WAArB,EAAkC;oBAChBvY,SAAS2O,eAAT,CAAyB,4BAAzB,EAAuD,kBAAvD,CAAjB;GADD,MAEO;oBACW3O,SAAS2O,eAAT,CAAyB,4BAAzB,EAAuD,SAAvD,CAAjB;;MAEG8J,eAAeL,UAAUG,aAAV,KAA4BlY,QAAQqU,YAAR,CAAqB6D,aAArB,CAA/C;MACIxR,QAAQkR,MAAMM,aAAN,CAAZ;;MAEIG,WAAW;kBACCH,aADD;SAERE,YAFQ;OAGV1R,KAHU;UAIP,IAJO;QAKTmR,MAAI,IAAJ,GAAW,GALF;WAMNO,eAAe,GAAf,GAAqB1R,KANf;eAOFgR,OAAOI,UAAP,CAPE;aAQJ,KARI;aASJ,QATI;SAUR;GAVP;;MAaGpV,IAAH,EAAS;YACC,MAAT,IAAmBA,IAAnB;;;OAGI,IAAIxC,CAAT,IAAcmY,QAAd,EAAwB;kBACRzX,YAAf,CAA4BV,CAA5B,EAA+BmY,SAASnY,CAAT,CAA/B;;;cAGWE,WAAZ,CAAwB+X,cAAxB;;MAEGzV,IAAH,EAAS;cACG9B,YAAX,CAAwBsX,aAAxB,iBAAoDxR,KAApD;GADD,MAEO;cACK9F,YAAX,CAAwBsX,aAAxB,EAAuCxR,KAAvC;;;;QAIK,CAACsR,WAAD,EAAcC,UAAd,CAAP;;;AAGD,AAAO,SAAS/I,SAAT,CAAmBlP,OAAnB,EAA4BU,KAA5B,EAAmC;;SACjCA,KAAR,CAAcwO,SAAd,GAA0BxO,KAA1B;SACQA,KAAR,CAAc4X,eAAd,GAAgC5X,KAAhC;SACQA,KAAR,CAAc6X,WAAd,GAA4B7X,KAA5B;SACQA,KAAR,CAAc8X,YAAd,GAA6B9X,KAA7B;SACQA,KAAR,CAAc+X,UAAd,GAA2B/X,KAA3B;;;AAGD,SAASgY,UAAT,CAAoB1J,YAApB,EAAkC2J,QAAlC,EAA4C;KACvCC,cAAc,EAAlB;KACIC,eAAe,EAAnB;;UAESpY,GAAT,CAAa,mBAAW;MACnByT,OAAOlU,QAAQ,CAAR,CAAX;MACIqF,SAAS6O,KAAK5T,UAAlB;;MAEI0X,oBAAJ;MAAiBC,mBAAjB;;UAEQ,CAAR,IAAa/D,IAAb;;2BAC4ByD,qDAAqB3X,OAArB,EAPL;;;;aAAA;YAAA;;;cASXmL,IAAZ,CAAiB8M,UAAjB;eACa9M,IAAb,CAAkB,CAAC6M,WAAD,EAAc3S,MAAd,CAAlB;;MAEIA,MAAJ,EAAY;UACJyT,YAAP,CAAoBd,WAApB,EAAiC9D,IAAjC;;EAbF;;KAiBI6E,UAAU/J,aAAawF,SAAb,CAAuB,IAAvB,CAAd;;cAEa/T,GAAb,CAAiB,UAACuX,WAAD,EAAc9X,CAAd,EAAoB;MAChC8X,YAAY,CAAZ,CAAJ,EAAoB;eACP,CAAZ,EAAec,YAAf,CAA4BF,YAAY1Y,CAAZ,CAA5B,EAA4C8X,YAAY,CAAZ,CAA5C;YACS9X,CAAT,EAAY,CAAZ,IAAiB0Y,YAAY1Y,CAAZ,CAAjB;;EAHF;;QAOO6Y,OAAP;;;AAGD,AAAO,SAASC,gBAAT,CAA0B3T,MAA1B,EAAkC4T,UAAlC,EAA8CC,iBAA9C,EAAiE;KACpEA,kBAAkBnR,MAAlB,KAA6B,CAAhC,EAAmC;;KAE/BoR,iBAAiBT,WAAWO,UAAX,EAAuBC,iBAAvB,CAArB;KACGD,WAAW3Y,UAAX,IAAyB+E,MAA5B,EAAoC;SAC5B+T,WAAP,CAAmBH,UAAnB;SACO7Y,WAAP,CAAmB+Y,cAAnB;;;;YAKU,YAAM;MACbA,eAAe7Y,UAAf,IAA6B+E,MAAhC,EAAwC;UAChC+T,WAAP,CAAmBD,cAAnB;UACO/Y,WAAP,CAAmB6Y,UAAnB;;EAHF,EAKG7D,mBALH;;;ACjHM,IAAMiE,UAAU,ysDAAhB;;ACGA,SAASC,YAAT,CAAsBC,QAAtB,EAAgCxI,IAAhC,EAAsC;KACxC3E,IAAIzM,SAASM,aAAT,CAAuB,GAAvB,CAAR;GACES,KAAF,GAAU,eAAV;KACI8Y,OAAO,IAAIC,IAAJ,CAAS1I,IAAT,EAAe,EAACrO,MAAM,8BAAP,EAAf,CAAX;KACIgX,MAAM/X,OAAOgY,GAAP,CAAWC,eAAX,CAA2BJ,IAA3B,CAAV;GACEK,IAAF,GAASH,GAAT;GACEI,QAAF,GAAaP,QAAb;UACSpY,IAAT,CAAcf,WAAd,CAA0BgM,CAA1B;GACE2N,KAAF;YACW,YAAU;WACX5Y,IAAT,CAAciY,WAAd,CAA0BhN,CAA1B;SACOuN,GAAP,CAAWK,eAAX,CAA2BN,GAA3B;EAFD,EAGG,GAHH;;;AAMD,AAAO,SAASO,gBAAT,CAA0BC,GAA1B,EAA+B;KACjCC,QAAQD,IAAI1F,SAAJ,CAAc,IAAd,CAAZ;OACM4F,SAAN,CAAgBC,GAAhB,CAAoB,iBAApB;OACMzZ,YAAN,CAAmB,OAAnB,EAA4B,4BAA5B;OACMA,YAAN,CAAmB,aAAnB,EAAkC,8BAAlC;KACI0Z,UAAU9a,EAAEK,MAAF,CAAS,OAAT,EAAkB;eAClBwZ;EADA,CAAd;OAGM9Y,YAAN,CAAmB+Z,OAAnB,EAA4BH,MAAMI,UAAlC;;KAEItU,YAAYzG,EAAEK,MAAF,CAAS,KAAT,CAAhB;WACUO,WAAV,CAAsB+Z,KAAtB;;QAEOlU,UAAUM,SAAjB;;;ICrBoBiU;oBACRnV,MAAZ,EAAoBkM,OAApB,EAA6B;;;;YAElBnI,UAAUmI,OAAV,CAAV;;OAEKlM,MAAL,GAAc,OAAOA,MAAP,KAAkB,QAAlB,GACX1F,SAASC,aAAT,CAAuByF,MAAvB,CADW,GAEXA,MAFH;;MAII,EAAE,KAAKA,MAAL,YAAuBoV,WAAzB,CAAJ,EAA2C;SACpC,IAAIC,KAAJ,CAAU,gDAAV,CAAN;;;OAGIC,YAAL,GAAoBpJ,OAApB;;OAEKpL,KAAL,GAAaoL,QAAQpL,KAAR,IAAiB,EAA9B;OACKzD,IAAL,GAAY6O,QAAQ7O,IAAR,IAAgB,EAA5B;;OAEKkY,QAAL,GAAgB,KAAKC,WAAL,CAAiBtJ,QAAQR,IAAzB,CAAhB;OACKA,IAAL,GAAY,KAAK+J,gBAAL,CAAsB,KAAKF,QAA3B,CAAZ;;OAEKtV,MAAL,GAAc,KAAKyV,cAAL,CAAoBxJ,QAAQjM,MAA5B,EAAoC,KAAK5C,IAAzC,CAAd;;OAEKsY,MAAL,GAAc;gBACA,CADA;eAED,CAFC;gBAGAzJ,QAAQ0J,WAAR,IAAuB,CAHvB;YAIH,OAAO1J,QAAQ2J,OAAf,KAA2B,WAA5B,GAA2C3J,QAAQ2J,OAAnD,GAA6D,CAJzD;oBAKI3J,QAAQ4J,eAAR,IAA2B;GAL7C;;OAQKC,QAAL,GAAgBC,KAAKC,KAAL,CAAWD,KAAKE,SAAL,CAAetY,aAAf,CAAX,CAAhB;MACIE,IAAI,KAAKiY,QAAb;OACKI,WAAL,CAAiBjK,OAAjB;MACG,CAAC,KAAKpL,KAAL,CAAW4B,MAAf,EAAuB;KAAI3E,WAAF,GAAgB,CAAhB;;MACtB,CAAC,KAAK4X,MAAL,CAAYS,UAAhB,EAA4BtY,EAAEO,YAAF,GAAiB,CAAjB;OACvBgY,SAAL,GAAiBnK,QAAQ1H,MAAR,IAAkB1G,EAAEwY,UAArC;;OAEKC,KAAL,GAAa,EAAb;OACKrK,OAAL,GAAe,EAAf;;OAEKsK,WAAL,GAAmBhY,yBAAnB;;MAEG,KAAKmX,MAAL,CAAYC,WAAf,EAA4B;QACtBa,QAAL,GAAgB,EAAhB;;;OAGIC,SAAL,CAAexK,OAAf;;;;;8BAGWR,MAAM;UACVA,IAAP;;;;mCAGgBA,MAAM;UACfA,IAAP;;;;iCAGczL,QAAQ5C,MAAM;OACtBsZ,cAAc,EAApB;YACS,CAAC1W,UAAU,EAAX,EAAe6C,MAAf,CAAsBpD,eAAerC,IAAf,CAAtB,CAAT;UACOuZ,OAAP,CAAe,UAAC5T,MAAD,EAAY;QACpB5B,QAAQwG,SAAS5E,MAAT,CAAd;QACG,CAACmF,aAAa/G,KAAb,CAAJ,EAAyB;aAChByV,IAAR,CAAa,MAAM7T,MAAN,GAAe,yBAA5B;KADD,MAEO;iBACM8C,IAAZ,CAAiB1E,KAAjB;;IALF;UAQOuV,WAAP;;;;gCAGa;;;;;;8BAKF;;;OACPnS,SAAS,KAAK6R,SAAlB;QACKC,UAAL,GAAkB9R,MAAlB;QACKA,MAAL,GAAcA,SAASrG,eAAe,KAAK4X,QAApB,CAAvB;;;QAGKe,WAAL,GAAmB;WAAM,MAAKC,IAAL,CAAU,IAAV,CAAN;IAAnB;OACIC,cAAJ,EAAoB;SACdC,cAAL,GAAsB,IAAID,cAAJ,CAAmB,KAAKF,WAAxB,CAAtB;SACKG,cAAL,CAAoBC,OAApB,CAA4B,KAAKlX,MAAjC;;UAEMgB,gBAAP,CAAwB,QAAxB,EAAkC,KAAK8V,WAAvC;UACO9V,gBAAP,CAAwB,mBAAxB,EAA6C,KAAK8V,WAAlD;;;;4BAGS;OACL,KAAKG,cAAT,EAAyB,KAAKA,cAAL,CAAoBE,UAApB;UAClBC,mBAAP,CAA2B,QAA3B,EAAqC,KAAKN,WAA1C;UACOM,mBAAP,CAA2B,mBAA3B,EAAgD,KAAKN,WAArD;;;;;;;0BAIO;QACFO,aAAL;QACKC,WAAL;QACK7W,WAAL;;QAEKsW,IAAL,CAAU,KAAV,EAAiB,IAAjB;;;;kCAGe;;QAEV/W,MAAL,CAAYkB,SAAZ,GAAwB,EAAxB;;OAEI4I,OAAO;YACF,KAAK9J,MADH;eAEC;IAFZ;;OAKG,KAAKuX,gBAAR,EAA0B;SACpB1a,MAAL,GAAc,EAAE2E,OAAO,KAAK+V,gBAAL,GAAwB,IAAjC,EAAd;;;QAGI3W,SAAL,GAAiBzG,EAAEK,MAAF,CAAS,KAAT,EAAgBsP,IAAhB,CAAjB;;;;gCAGa;QACR0N,GAAL,GAAW,IAAIzX,MAAJ,CAAW;YACb,KAAKa,SADQ;YAEb,KAAKX;IAFH,CAAX;QAIKwX,WAAL;;;;gCAGa;;;yBAE0B;;;OAAnCC,eAAmC,uEAAnB,KAAmB;OAAZC,IAAY,uEAAP,KAAO;;OACnCD,mBAAmBzb,SAAS,KAAK+D,MAAd,CAAvB,EAA8C;;;;QAIzCsX,WAAL;;QAEKM,IAAL,CAAUF,eAAV;QACKG,aAAL;QACKC,eAAL;;QAEKC,UAAL,CAAgBnB,OAAhB,CAAwB;WAAKpO,EAAEhI,KAAF,CAAQ,OAAKwX,QAAb,CAAL;IAAxB;;QAEKC,MAAL,CAAY,KAAKF,UAAjB,EAA6B,KAA7B;;OAEGJ,IAAH,EAAS;SACHjM,IAAL,GAAY,KAAK6J,QAAjB;eACW,YAAM;YAAM2C,MAAL,CAAY,OAAKxM,IAAjB;KAAlB,EAA4C,KAAK8K,WAAjD;;;QAGI2B,YAAL;;QAEKC,eAAL,CAAqBT,IAArB;;;;yBAGM;;;;gCAEO;QACRU,SAAL,GAAiBzb,uBAAuB,KAAKoD,MAA5B,CAAjB;QACKwB,KAAL,GAAa,KAAK6W,SAAL,GAAiB/Z,cAAc,KAAKyX,QAAnB,CAA9B;;;;kCAGe;OACZ,KAAKlB,GAAR,EAAa;SACPjU,SAAL,CAAemT,WAAf,CAA2B,KAAKc,GAAhC;;OAEG/W,IAAI,KAAKiY,QAAb;;QAEKlB,GAAL,GAAWrL,iBACV,KAAK5I,SADK,EAEV,oBAFU,EAGV,KAAKyX,SAHK,EAIV,KAAK/B,UAJK,CAAX;QAMK9H,OAAL,GAAe9E,YAAY,KAAKmL,GAAjB,CAAf;;OAEG,KAAK/T,KAAL,CAAW4B,MAAd,EAAsB;SAChB4V,OAAL,GAAetM,SACd,OADc,EAEdlO,EAAEE,OAAF,CAAUjC,IAFI,EAGd+B,EAAEE,OAAF,CAAUrC,GAHI,EAId,KAAKmF,KAJS,EAKd;eACWhD,EAAEya,aADb;WAEO,SAFP;SAGKza,EAAEya;KARO,CAAf;;;OAaG5c,MAAMkC,aAAaC,CAAb,CAAV;QACKka,QAAL,GAAgBpO,aACf,KAAKvM,IAAL,GAAY,wBADG,iBAEFa,cAAcJ,CAAd,CAFE,UAEmBnC,GAFnB,OAAhB;;OAKG,KAAKga,MAAL,CAAYS,UAAf,EAA2B;WACnB,KAAK5R,MAAL,GAAc1G,EAAEG,QAAF,CAAW5B,MAAhC;SACKmc,UAAL,GAAkB5O,aACjB,cADiB,iBAEJ1L,cAAcJ,CAAd,CAFI,UAEiBnC,GAFjB,OAAlB;;;OAME,KAAKmF,KAAL,CAAW4B,MAAd,EAAsB;SAAOmS,GAAL,CAAS9Z,WAAT,CAAqB,KAAKud,OAA1B;;QACnBzD,GAAL,CAAS9Z,WAAT,CAAqB,KAAKid,QAA1B;OACG,KAAKrC,MAAL,CAAYS,UAAf,EAA2B;SAAOvB,GAAL,CAAS9Z,WAAT,CAAqB,KAAKyd,UAA1B;;;QAExBC,eAAL,CAAqBva,cAAcJ,CAAd,CAArB,EAAuCD,aAAaC,CAAb,CAAvC;;;;kCAGewC,GAAGC,GAAG;QAChBiX,GAAL,CAASjO,MAAT,GAAkB;OACdjJ,CADc;OAEdC;IAFJ;;;;oCAMiB;QAAOwX,UAAL,GAAkB,IAAIW,GAAJ,EAAlB;;;;yBAEbhN,MAAM;OACT,CAACA,IAAJ,EAAU;YACDiN,KAAR,CAAc,oBAAd;;QAEIjN,IAAL,GAAY,KAAK8J,WAAL,CAAiB9J,IAAjB,CAAZ;QACKkM,IAAL,GALY;QAMPK,MAAL,CAAY,KAAKF,UAAjB,EAA6B,KAAKpC,MAAL,CAAYE,OAAzC;QACKsC,YAAL;;;;2BAGgD;;;OAA1CJ,UAA0C,uEAA/B,KAAKA,UAA0B;OAAdlC,OAAc,uEAAN,IAAM;;OAC7C,KAAKF,MAAL,CAAYC,WAAf,EAA4B;;SAEtBa,QAAL,CAAcrb,GAAd,CAAkB;YAAKV,EAAEO,UAAF,CAAa8Y,WAAb,CAAyBrZ,CAAzB,CAAL;KAAlB;;;OAGGmZ,oBAAoB,EAAxB;;cAEW+C,OAAX,CAAmB,aAAK;wBACH/C,kBAAkB/Q,MAAlB,CAAyB0F,EAAE0P,MAAF,CAASrC,OAAT,CAAzB,CAApB;IADD;OAGGhC,kBAAkBnR,MAAlB,GAA2B,CAA9B,EAAiC;qBACf,KAAK9B,SAAtB,EAAiC,KAAKiU,GAAtC,EAA2ChB,iBAA3C;eACW,YAAM;gBACL+C,OAAX,CAAmB;aAAKpO,EAAEoQ,IAAF,EAAL;MAAnB;YACKC,SAAL;KAFD,EAGGpa,0BAHH;IAFD,MAMO;eACKmY,OAAX,CAAmB;YAAKpO,EAAEoQ,IAAF,EAAL;KAAnB;SACKC,SAAL;;;;;8BAIU;OACR,KAAKlD,MAAL,CAAYC,WAAf,EAA4B;SACtBhH,WAAL;SACKkK,SAAL;;;;;iCAIa;;;oCAEa;;;OAAZnB,IAAY,uEAAP,KAAO;;OACxB,CAAC,KAAKhC,MAAL,CAAYC,WAAhB,EAA6B;;OAE1B+B,IAAH,EAAS;SACHoB,WAAL;;SAEKC,UAAL,GAAkB;WACX,KAAKC,UAAL,CAAgBC,IAAhB,CAAqB,IAArB,CADW;WAEX,KAAKC,WAAL,CAAiBD,IAAjB,CAAsB,IAAtB,CAFW;WAGX,KAAKE,SAAL,CAAeF,IAAf,CAAoB,IAApB,CAHW;WAIX,KAAKG,YAAL,CAAkBH,IAAlB,CAAuB,IAAvB,CAJW;WAKX,KAAKI,WAAL,CAAiBJ,IAAjB,CAAsB,IAAtB;KALP;;aAQSlY,gBAAT,CAA0B,SAA1B,EAAqC,UAACuY,CAAD,EAAO;SACxCnd,oBAAoB,OAAKwE,SAAzB,CAAH,EAAwC;UACnC2Y,KAAKjd,OAAOkd,KAAhB;UACG,OAAKR,UAAL,CAAgBO,EAAEE,OAAlB,CAAH,EAA+B;cACzBT,UAAL,CAAgBO,EAAEE,OAAlB;;;KAJH;;;;;mCAWY;;;qCACE;;;gCACF;;;8BACF;;;gCAEE;;;iCACC;;;8BACH;;;gCACE;;;+BACD;;;iCAEE;;;oCACG;;;iCAEH;;;wCACO;;;kCAEN;;;4BAEP;OACJC,WAAW9E,iBAAiB,KAAKC,GAAtB,CAAf;gBACa,KAAK/T,KAAL,IAAc,OAA3B,EAAoC,CAAC4Y,QAAD,CAApC;;;;;;IC3TmBC;;;2BACR3Z,MAAZ,EAAoB8J,IAApB,EAA0B;;4HACnB9J,MADmB,EACX8J,IADW;;;;;4BAIhBA,MAAM;gIACCA,IAAhB;;QAEK6L,MAAL,CAAYiE,cAAZ,GAA6B,CAAC9P,KAAK+P,cAAL,IAAuB,EAAxB,EAA4BD,cAAzD;QACKjE,MAAL,CAAYmE,SAAZ,GAAwBhQ,KAAKgQ,SAAL,IAAkB,EAA1C;QACKnE,MAAL,CAAYoE,eAAZ,GAA8BjQ,KAAKiQ,eAAL,IAAwB,EAAtD;;;;yBAGM;;;OACFC,IAAI,KAAKzD,KAAb;OACIuD,YAAY,KAAKnE,MAAL,CAAYmE,SAA5B;KACEG,WAAF,GAAgB,EAAhB;;OAEIC,YAAY,KAAKxO,IAAL,CAAUyO,MAAV,CAAiB/e,GAAjB,CAAqB,UAAC8J,KAAD,EAAQrK,CAAR,EAAc;QAC9Cuf,QAAQ,CAAZ;WACK1O,IAAL,CAAU2O,QAAV,CAAmBjf,GAAnB,CAAuB,aAAK;cAClBme,EAAEjK,MAAF,CAASzU,CAAT,CAAT;KADD;WAGO,CAACuf,KAAD,EAAQlV,KAAR,CAAP;IALe,EAMbqK,MANa,CAMN,aAAK;WAASnN,EAAE,CAAF,KAAQ,CAAf;IAND,CAAhB,CALM;;OAaFkY,SAASJ,SAAb;OACGA,UAAUxX,MAAV,GAAmBoX,SAAtB,EAAiC;;cAEtBS,IAAV,CAAe,UAACxT,CAAD,EAAIiB,CAAJ,EAAU;YAASA,EAAE,CAAF,IAAOjB,EAAE,CAAF,CAAd;KAA3B;;aAESmT,UAAUlV,KAAV,CAAgB,CAAhB,EAAmB8U,YAAU,CAA7B,CAAT;QACIU,YAAYN,UAAUlV,KAAV,CAAgB8U,YAAU,CAA1B,CAAhB;;QAEIW,iBAAiB,CAArB;cACUrf,GAAV,CAAc,aAAK;uBAAmBgH,EAAE,CAAF,CAAlB;KAApB;WACO0D,IAAP,CAAY,CAAC2U,cAAD,EAAiB,MAAjB,CAAZ;SACKxa,MAAL,CAAY6Z,YAAU,CAAtB,IAA2B,MAA3B;;;KAGCK,MAAF,GAAW,EAAX;UACO/e,GAAP,CAAW,aAAK;MACb6e,WAAF,CAAcnU,IAAd,CAAmBhC,MAAM1B,EAAE,CAAF,CAAN,CAAnB;MACE+X,MAAF,CAASrU,IAAT,CAAc1D,EAAE,CAAF,CAAd;IAFD;;KAKEsY,UAAF,GAAeV,EAAEC,WAAF,CAAc7S,MAAd,CAAqB,UAACL,CAAD,EAAIiB,CAAJ;WAAUjB,IAAIiB,CAAd;IAArB,EAAsC,CAAtC,CAAf;;QAEKuC,MAAL,GAAc;OACV,KAAK/I,KAAL,GAAa,CADH;OAEV,KAAKgD,MAAL,GAAc;IAFlB;;;;iCAMc;;;OACVwV,IAAI,KAAKzD,KAAb;QACKiC,UAAL,CAAgBmC,WAAhB,GAA8B,EAA9B;QACKC,YAAL,GAAoBZ,EAAEC,WAAF,CAAcjV,KAAd,CAAoB,CAApB,EAAuB,KAAK2Q,MAAL,CAAYoE,eAAnC,CAApB;;OAEIvX,QAAQ,CAAZ;OACIjC,IAAI,CAAR;QACKqa,YAAL,CAAkBxf,GAAlB,CAAsB,UAACgH,CAAD,EAAIvH,CAAJ,EAAU;QAC3BggB,WAAW,GAAf;QACIC,UAAUlb,KAAKyF,KAAL,CACb,CAAC,OAAK7D,KAAL,GAAalD,cAAc,OAAKyX,QAAnB,CAAd,IAA4C8E,QAD/B,CAAd;QAGI,OAAKD,YAAL,CAAkBlY,MAAlB,GAA2BoY,OAA/B,EAAwC;gBAC5B,OAAKtZ,KAAL,GAAW,OAAKoZ,YAAL,CAAkBlY,MAAxC;;QAEEF,QAAQsY,OAAX,EAAoB;aACX,CAAR;UACK,EAAL;;QAEGxa,IAAIua,WAAWrY,KAAX,GAAmB,CAA3B;QACI0C,QAAQ,OAAKyQ,MAAL,CAAYG,eAAZ,GAA8BjR,eAAemV,EAAEG,MAAF,CAAStf,CAAT,CAAf,EAA4BggB,WAAS,EAArC,CAA9B,GAAyEb,EAAEG,MAAF,CAAStf,CAAT,CAArF;QACIyG,YAAY,OAAKqU,MAAL,CAAYiE,cAAZ,GAA6B,OAAKjE,MAAL,CAAYiE,cAAZ,CAA2BxX,CAA3B,CAA7B,GAA6DA,CAA7E;QACI2L,MAAMhC,UACTzL,CADS,EAETC,CAFS,EAGT,CAHS,EAIT,OAAKN,MAAL,CAAYpF,CAAZ,CAJS,EAKNqK,KALM,UAKI5D,SALJ,EAMT,KANS,CAAV;WAQKkX,UAAL,CAAgBzd,WAAhB,CAA4BgT,GAA5B;;IAvBD;;;;EA7D4CoH;;ACN9C;;AAEA,AAAO,IAAM4F,oBAAoB,EAA1B;AACP,AAAO,IAAMC,qBAAqB,CAA3B;AACP;AACA,AAAO,IAAMC,eAAe,IAArB;AACP,AAAO,IAAMC,aAAa,KAAnB;;AAEP,AAAO,IAAMC,cAAc,CAAC,SAAD,EAAY,UAAZ,EAAwB,OAAxB,EAAiC,OAAjC,EAA0C,KAA1C,EAC1B,MAD0B,EAClB,MADkB,EACV,QADU,EACA,WADA,EACa,SADb,EACwB,UADxB,EACoC,UADpC,CAApB;AAEP;;AAGA,AAAO,IAAMC,kBAAkB,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,KAA7B,EAAoC,KAApC,EAA2C,KAA3C,CAAxB;AACP;;;AAIA,SAASC,UAAT,CAAoBC,IAApB,EAA0B;KACrBC,SAAS,IAAIrX,IAAJ,CAASoX,IAAT,CAAb;QACOE,UAAP,CAAkBD,OAAOE,UAAP,KAAsBF,OAAOG,iBAAP,EAAxC;QACOH,MAAP;;;AAGD,AAAO,SAASI,WAAT,CAAqBL,IAArB,EAA2B;KAC7BM,KAAKN,KAAKO,OAAL,EAAT;KACIC,KAAKR,KAAKS,QAAL,KAAkB,CAA3B,CAFiC;QAG1B,CACNT,KAAKU,WAAL,EADM,EAEN,CAACF,KAAG,CAAH,GAAO,EAAP,GAAY,GAAb,IAAoBA,EAFd,EAGN,CAACF,KAAG,CAAH,GAAO,EAAP,GAAY,GAAb,IAAoBA,EAHd,EAILzN,IAJK,CAIA,GAJA,CAAP;;;AAOD,AAAO,SAAS2G,KAAT,CAAewG,IAAf,EAAqB;QACpB,IAAIpX,IAAJ,CAASoX,KAAKnX,OAAL,EAAT,CAAP;;;AAGD;;AAIA;;;;AAUA,AAAO,SAAS8X,eAAT,CAAyBC,SAAzB,EAAoCC,OAApC,EAA6C;KAC/CC,gBAAgBC,eAAeH,SAAf,CAApB;QACOtc,KAAK0c,IAAL,CAAUC,eAAeH,aAAf,EAA8BD,OAA9B,IAAyCnB,kBAAnD,CAAP;;;AAGD,AAAO,SAASuB,cAAT,CAAwBL,SAAxB,EAAmCC,OAAnC,EAA4C;KAC9CK,qBAAqBtB,aAAaD,YAAtC;QACO,CAACI,WAAWc,OAAX,IAAsBd,WAAWa,SAAX,CAAvB,IAAgDM,kBAAvD;;;AAGD,AAAO,SAASC,cAAT,CAAwBP,SAAxB,EAAmCC,OAAnC,EAA4C;QAC3CD,UAAUH,QAAV,OAAyBI,QAAQJ,QAAR,EAAzB,IACHG,UAAUF,WAAV,OAA4BG,QAAQH,WAAR,EADhC;;;AAID,AAAO,SAASU,YAAT,CAAsB7hB,CAAtB,EAAsC;KAAb8hB,KAAa,uEAAP,KAAO;;KACxCC,YAAYzB,YAAYtgB,CAAZ,CAAhB;QACO8hB,QAAQC,UAAU5X,KAAV,CAAgB,CAAhB,EAAmB,CAAnB,CAAR,GAAgC4X,SAAvC;;;AAGD,AAAO,SAASC,kBAAT,CAA6BC,KAA7B,EAAoCC,IAApC,EAA0C;QACzC,IAAI7Y,IAAJ,CAAS6Y,IAAT,EAAeD,QAAQ,CAAvB,EAA0B,CAA1B,CAAP,CADgD;;;;AAKjD,AAAO,SAAST,cAAT,CAAwBf,IAAxB,EAA8B;KAChC0B,UAAUlI,MAAMwG,IAAN,CAAd;KACM2B,MAAMD,QAAQE,MAAR,EAAZ;KACGD,QAAQ,CAAX,EAAc;UACLD,OAAR,EAAkB,CAAC,CAAF,GAAOC,GAAxB;;QAEMD,OAAP;;;;AAID,AAAO,SAASG,OAAT,CAAiB7B,IAAjB,EAAuB8B,YAAvB,EAAqC;MACtCC,OAAL,CAAa/B,KAAKO,OAAL,KAAiBuB,YAA9B;;;IC7DKE;+BASC;6BAPCC,UAOD;MAPCA,UAOD,mCAPc,EAOd;iCANCC,cAMD;MANCA,cAMD,uCANkB,EAMlB;MALCC,SAKD,QALCA,SAKD;MAHCC,OAGD,QAHCA,OAGD;MAFCC,YAED,QAFCA,YAED;MADCC,eACD,QADCA,eACD;;;OACMJ,cAAL,GAAsBA,cAAtB;OACKC,SAAL,GAAiBA,SAAjB;;OAEKE,YAAL,GAAoBA,YAApB;OACKD,OAAL,GAAeA,OAAf;;OAEKE,eAAL,GAAuBA,eAAvB;;OAEKC,KAAL,GAAa,EAAb;OACK1D,MAAL,GAAc,EAAd;;OAEKoD,UAAL,GAAkBA,UAAlB;OACKA,UAAL,GACI,OAAO,KAAKA,UAAZ,KAA2B,UAA3B,GAAwC,KAAKA,UAAL,EAAxC,GAA4D,KAAKA,UADrE;;OAGKtb,OAAL;;;;;0BAGIyJ,MAAM;QACLA,IAAL,GAAYA,QAAQ,KAAKgS,OAAL,EAApB;;;;wBAGE1d,QAAQ;QACL8d,KAAL,GAAalU,aAAa,KAAK2T,UAAlB,EAA8B,KAAKC,cAAnC,EAAmDxd,MAAnD,CAAb;;;;yBAGG;QACEiY,MAAL,CAAY,KAAKvM,IAAjB;QACKqS,OAAL,GAAe,KAAKrS,IAApB;;;;yBAGGA,MAAM;;;QACJmS,KAAL,GAAa,KAAKF,YAAL,CAAkBjS,IAAlB,CAAb;;QAEKoS,KAAL,CAAWnD,WAAX,GAAyB,EAAzB;QACKkD,KAAL,CAAWjH,OAAX,CAAmB,UAACjc,OAAD,EAAa;YACpB+H,MAAR,GACM/H,QAAQic,OAAR,CAAgB,UAAC1a,EAAD,EAAQ;WACf4hB,KAAL,CAAW/iB,WAAX,CAAuBmB,EAAvB;KADJ,CADN,GAIM,MAAK4hB,KAAL,CAAW/iB,WAAX,CAAuBJ,OAAvB,CAJN;IADJ;QAOKwf,MAAL,CAAYvD,OAAZ,CAAoB,UAACjc,OAAD,EAAa;UACxBmjB,KAAL,CAAW/iB,WAAX,CAAuBJ,OAAvB;IADJ;;;;2BAKmB;OAAhBkb,OAAgB,uEAAN,IAAM;;QACpB5T,OAAL;OACI2b,kBAAkB,EAAtB;OACG/H,OAAH,EAAY;sBACO,KAAK+H,eAAL,CAAqB,KAAKlS,IAA1B,KAAmC,EAArD;;UAEMkS,eAAP;;;;;;AAIF,IAAII,mBAAmB;cACT;cACA,cADA;cAAA,wBAECtS,IAFD,EAEO;UACXA,KAAKuS,YAAL,CAAkB7iB,GAAlB,CAAsB,UAAC4e,CAAD,EAAInf,CAAJ,EAAU;QAClCmK,QAAQgF,SAASgQ,CAAT,EAAY,YAAZ,EAA0BtO,KAAKzL,MAAL,CAAYpF,CAAZ,CAA1B,EAA0C,MAA1C,EAAkD6Q,KAAKvB,WAAvD,CAAZ;UACM9O,KAAN,CAAY6iB,UAAZ,GAAyB,gBAAzB;WACOlZ,KAAP;IAHM,CAAP;GAHW;iBAAA,2BAUImZ,OAVJ,EAUa;UACjB,KAAKN,KAAL,CAAWziB,GAAX,CAAe,UAAC4J,KAAD,EAAQnK,CAAR;WAAcsX,eAAenN,KAAf,EAAsBmZ,QAAQF,YAAR,CAAqBpjB,CAArB,CAAtB,CAAd;IAAf,CAAP;;EAZoB;YAeX;cACE,YADF;cAAA,wBAEG6Q,IAFH,EAES;UACXA,KAAKuS,YAAL,CAAkB7iB,GAAlB,CAAsB,UAAC4e,CAAD,EAAInf,CAAJ,EAAS;QACjCmK,QAAQgF,SAASgQ,CAAT,EAAY,UAAZ,EAAwB,MAAxB,EAAgCtO,KAAKzL,MAAL,CAAYpF,CAAZ,CAAhC,CAAZ;UACMQ,KAAN,CAAY6iB,UAAZ,GAAyB,gBAAzB;WACOlZ,KAAP;IAHM,CAAP;GAHS;iBAAA,2BAUMmZ,OAVN,EAUe;UACjB,KAAKN,KAAL,CAAWziB,GAAX,CAAe,UAAC4J,KAAD,EAAQnK,CAAR;WACrBsX,eAAenN,KAAf,EAAsBmZ,QAAQF,YAAR,CAAqBpjB,CAArB,CAAtB,CADqB;IAAf,CAAP;;EA1BoB;iBA+BN;cACH,iBADG;cAAA,wBAEF6Q,IAFE,EAEI;;;UACXA,KAAK0S,UAAL,CAAgBhjB,GAAhB,CAAoB,UAACkF,CAAD,EAAIzF,CAAJ,EAAS;QAC/B0F,IAAI,CAAR;QACI8Q,MAAM/F,cAAchL,CAAd,EAAiBC,CAAjB,EAAoBmL,KAAK2S,MAAL,CAAYxjB,CAAZ,CAApB,EACT,OAAK4iB,SAAL,CAAea,SADN,EACiB,OAAKb,SAAL,CAAec,QADhC,EAC0C7S,KAAKzL,MAAL,CAAYpF,CAAZ,CAD1C,CAAV;WAEOwW,GAAP;IAJM,CAAP;GAHc;iBAAA,2BAWC8M,OAXD,EAWU;OACrBA,OAAH,EAAY,OAAO,EAAP;;EA3CQ;QA8CZ;cACS,QADT;cAAA,wBAEUzS,IAFV,EAEgB;;;OACX4H,WAAW,EAAf;;OAEI5H,KAAKhJ,MAAT,EAAiB;SACRkU,OAAL,CAAa,UAAC4H,IAAD,EAAO3jB,CAAP,EAAa;UACjB4jB,SAAL,CAAerjB,GAAf,CAAmB,UAAC4R,QAAD,EAAWnS,CAAX,EAAiB;eACvBiL,IAAT,CACIqH,MAAMH,QAAN,EAAgBwR,KAAKrE,MAAL,CAAYtf,CAAZ,CAAhB,EAAgC,OAAK4iB,SAAL,CAAejc,KAA/C,EAAsD;aAC5C,OAAKic,SAAL,CAAepQ,IAD6B;YAE7CmR,KAAKpR,GAAL,IAAY,OAAKqQ,SAAL,CAAerQ,GAFkB;uBAGlC,OAAKqQ,SAAL,CAAe3Q;OAHnC,CADJ;MADJ;;SAUI0R,KAAK1d,KAAT,EAAgB;eACHgF,IAAT,CACIiH,kBAAkB;cACPyR,KAAK1d,KADE;iBAEJ0d,KAAKpR,GAFD;eAGNoR,KAAKja,QAHC;cAIP,OAAKkZ,SAAL,CAAejc;OAJ1B,CADJ;;KAZR;;WAuBO8R,QAAP;;;QAGCmL,SAAL,CAAe7H,OAAf,CAAuB,UAAC5J,QAAD,EAAWnS,CAAX,EAAiB;aAC3BiL,IAAT,CAAcqH,MAAMH,QAAN,EAAgBtB,KAAKyO,MAAL,CAAYtf,CAAZ,CAAhB,EAAgC,OAAK4iB,SAAL,CAAejc,KAA/C,EAAsD;WAC1D,OAAKic,SAAL,CAAepQ,IAD2C;UAE3D3B,KAAK0B,GAAL,IAAY,OAAKqQ,SAAL,CAAerQ,GAFgC;qBAGhD,OAAKqQ,SAAL,CAAe3Q;KAHrB,CAAd;IADJ;;OAQLpB,KAAK5K,KAAT,EAAgB;aACNgF,IAAT,CACCiH,kBAAkB;YACVrB,KAAK5K,KADK;eAEP4K,KAAK0B,GAFE;aAGT1B,KAAKnH,QAHI;YAIV,KAAKkZ,SAAL,CAAejc;KAJvB,CADD;;;UAUM8R,QAAP;GAnDQ;iBAAA,2BAsDa6K,OAtDb,EAsDsB;;;OACfO,0BAA0B,SAA1BA,uBAA0B,CAACX,OAAD,EAAUI,OAAV,EAAsB;QAC9CQ,SAASR,QAAQM,SAArB;QACIG,YAAYT,QAAQhE,MAAxB;QACI0E,SAASd,QAAQU,SAArB;QACIK,YAAYf,QAAQ5D,MAAxB;;gCAEmB1V,qBAAqBoa,MAArB,EAA6BF,MAA7B,CAN+B;;;;UAAA;UAAA;;iCAOzBla,qBAAqBqa,SAArB,EAAgCF,SAAhC,CAPyB;;;;aAAA;aAAA;;;WAS7C3G,MAAL,CAAY;gBACG4G,MADH;aAEAD;KAFZ;;WAKO,OAAKf,KAAL,CAAWziB,GAAX,CAAe,UAAC4K,IAAD,EAAOnL,CAAP,EAAa;YACxB4V,kBAAkBzK,IAAlB,EAAwB2Y,OAAO9jB,CAAP,CAAxB,EAAmCgkB,OAAOhkB,CAAP,CAAnC,CAAP;KADG,CAAP;IAdJ;;;;OAqBI,KAAKkjB,OAAL,YAAwBnb,KAA5B,EAAmC;WACxB,KAAKmb,OAAL,CAAanH,OAAb,CAAqB,UAACvG,GAAD,EAAMxV,CAAN,EAAY;6BACZwV,GAAxB,EAA6B8N,QAAQtjB,CAAR,CAA7B;KADG,CAAP;;;OAKA8jB,SAASR,QAAQM,SAArB;OACIG,YAAYT,QAAQhE,MAAxB;OACI0E,SAAS,KAAKd,OAAL,CAAaU,SAA1B;OACIK,YAAY,KAAKf,OAAL,CAAa5D,MAA7B;;gCAEmB1V,qBAAqBoa,MAArB,EAA6BF,MAA7B,CAjCE;;;;SAAA;SAAA;;gCAkCIla,qBAAqBqa,SAArB,EAAgCF,SAAhC,CAlCJ;;;;YAAA;YAAA;;;QAoChB3G,MAAL,CAAY;eACG4G,MADH;YAEAD;IAFZ;;UAKO,KAAKf,KAAL,CAAWziB,GAAX,CAAe,UAAC4K,IAAD,EAAOnL,CAAP,EAAa;WACxB4V,kBAAkBzK,IAAlB,EAAwB2Y,OAAO9jB,CAAP,CAAxB,EAAmCgkB,OAAOhkB,CAAP,CAAnC,CAAP;IADG,CAAP;;EA7IW;;QAmJf;cACM,QADN;cAAA,wBAEO6Q,IAFP,EAEa;;;UACXA,KAAK+S,SAAL,CAAerjB,GAAf,CAAmB,UAAC4R,QAAD,EAAWnS,CAAX;WACzByS,MAAMN,QAAN,EAAgBtB,KAAKqT,UAAL,CAAgBlkB,CAAhB,CAAhB,EAAoC,OAAK4iB,SAAL,CAAejZ,MAAnD,EACC,EAAC6I,MAAM,OAAKoQ,SAAL,CAAepQ,IAAtB,EAA4BD,KAAK,OAAKqQ,SAAL,CAAerQ,GAAhD,EADD,CADyB;IAAnB,CAAP;GAHK;iBAAA,2BASU+Q,OATV,EASmB;OACpBQ,SAASR,QAAQM,SAArB;OACIG,YAAYT,QAAQY,UAAxB;OACIF,SAAS,KAAKd,OAAL,CAAaU,SAA1B;OACIK,YAAY,KAAKf,OAAL,CAAagB,UAA7B;;gCAEmBta,qBAAqBoa,MAArB,EAA6BF,MAA7B,CANK;;;;SAAA;SAAA;;iCAOCla,qBAAqBqa,SAArB,EAAgCF,SAAhC,CAPD;;;;YAAA;YAAA;;;QASnB3G,MAAL,CAAY;eACA4G,MADA;gBAECD;IAFb;;UAKO,KAAKf,KAAL,CAAWziB,GAAX,CAAe,UAAC4K,IAAD,EAAOnL,CAAP,EAAa;WAC3ByV,kBACNtK,IADM,EACA2Y,OAAO9jB,CAAP,CADA,EACWgkB,OAAOhkB,CAAP,CADX,CAAP;IADM,CAAP;;EA1KoB;;WAkLZ;cACG,WADH;cAAA,wBAEI6Q,IAFJ,EAEU;;;UACXA,KAAKtQ,GAAL,CAAS,UAAC0C,CAAD;WACfyP,QAAQzP,EAAEkP,QAAV,EAAoBlP,EAAEoH,KAAtB,EAA6B,OAAKuY,SAAL,CAAejc,KAA5C,EAAmD;eACxC1D,EAAEoO,OAAF,CAAUsB,QAD8B;WAE5C,MAF4C;eAGxC;KAHX,CADe;IAAT,CAAP;GAHQ;iBAAA,2BAWO2Q,OAXP,EAWgB;iCACE1Z,qBAAqB,KAAKsZ,OAA1B,EAAmCI,OAAnC,CADF;;;;QAClBJ,OADkB;UAAA;;;OAGpBY,SAASR,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE4K,QAAP;IAAZ,CAAb;OACI4R,YAAYT,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE8C,KAAP;IAAZ,CAAhB;OACI8Z,aAAab,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE8J,OAAP;IAAZ,CAAjB;;OAEI2S,SAAS,KAAKd,OAAL,CAAa3iB,GAAb,CAAiB;WAAKgH,EAAE4K,QAAP;IAAjB,CAAb;;QAEKiL,MAAL,CAAY4G,OAAOzjB,GAAP,CAAW,UAACgS,GAAD,EAAMvS,CAAN,EAAY;WAC3B;eACIgkB,OAAOhkB,CAAP,CADJ;YAEC+jB,UAAU/jB,CAAV,CAFD;cAGGmkB,WAAWnkB,CAAX;KAHV;IADW,CAAZ;;UAQO,KAAKgjB,KAAL,CAAWziB,GAAX,CAAe,UAAC4K,IAAD,EAAOnL,CAAP,EAAa;WAC3B4V,kBACNzK,IADM,EACA2Y,OAAO9jB,CAAP,CADA,EACWgkB,OAAOhkB,CAAP,CADX,CAAP;IADM,CAAP;;EA9MoB;;WAsNZ;cACG,WADH;cAAA,wBAEI6Q,IAFJ,EAEU;;;UACXA,KAAKtQ,GAAL,CAAS;WACfqS,QAAQjG,EAAEyX,QAAV,EAAoBzX,EAAE0X,MAAtB,EAA8B,OAAKzB,SAAL,CAAejc,KAA7C,EACCgG,EAAEtC,KADH,EACU,EAACsI,UAAUhG,EAAE0E,OAAF,CAAUsB,QAArB,EADV,CADe;IAAT,CAAP;GAHQ;iBAAA,2BAQO2Q,OARP,EAQgB;iCACE1Z,qBAAqB,KAAKsZ,OAA1B,EAAmCI,OAAnC,CADF;;;;QAClBJ,OADkB;UAAA;;;OAGpBY,SAASR,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE8c,MAAP;IAAZ,CAAb;OACIN,YAAYT,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE8C,KAAP;IAAZ,CAAhB;OACIia,YAAYhB,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE6c,QAAP;IAAZ,CAAhB;OACID,aAAab,QAAQ/iB,GAAR,CAAY;WAAKgH,EAAE8J,OAAP;IAAZ,CAAjB;;OAEI2S,SAAS,KAAKd,OAAL,CAAa3iB,GAAb,CAAiB;WAAKgH,EAAE8c,MAAP;IAAjB,CAAb;OACIE,YAAY,KAAKrB,OAAL,CAAa3iB,GAAb,CAAiB;WAAKgH,EAAE6c,QAAP;IAAjB,CAAhB;;QAEKhH,MAAL,CAAY4G,OAAOzjB,GAAP,CAAW,UAACgS,GAAD,EAAMvS,CAAN,EAAY;WAC3B;eACIukB,UAAUvkB,CAAV,CADJ;aAEEgkB,OAAOhkB,CAAP,CAFF;YAGC+jB,UAAU/jB,CAAV,CAHD;cAIGmkB,WAAWnkB,CAAX;KAJV;IADW,CAAZ;;OASI+iB,kBAAkB,EAAtB;;QAEKC,KAAL,CAAWziB,GAAX,CAAe,UAACyV,SAAD,EAAYhW,CAAZ,EAAkB;sBACd+iB,gBAAgB9a,MAAhB,CAAuB8N,cACxCC,SADwC,EAC7BsO,UAAUtkB,CAAV,CAD6B,EACf8jB,OAAO9jB,CAAP,CADe,EACJgkB,OAAOhkB,CAAP,CADI,CAAvB,CAAlB;IADD;;UAMO+iB,eAAP;;EA1PoB;;aA8PV;cACC,sBAAW;UAAS,wBAAwB,KAAKH,SAAL,CAAexc,KAA9C;GADd;cAAA,wBAEEyK,IAFF,EAEQ;;;oBACiD,KAAK+R,SADtD;OACbxc,KADa,cACbA,KADa;OACNoe,QADM,cACNA,QADM;OACIC,SADJ,cACIA,SADJ;OACeC,UADf,cACeA,UADf;OAC2Bnc,MAD3B,cAC2BA,MAD3B;OACmCoc,UADnC,cACmCA,UADnC;;OAEdC,kBAAkB,CAAC,EAAvB;OACInf,IAAIkf,UAAR;OAAoBjf,IAAI,CAAxB;;QAEKmf,oBAAL,GAA4B,EAA5B;;QAEKC,IAAL,CAAUvkB,GAAV,CAAc,UAACwkB,IAAD,EAAOC,MAAP,EAAkB;QAC5BA,WAAW,CAAd,EAAiB;YACX1F,MAAL,CAAYrU,IAAZ,CACCkG,SAAS,aAAT,EAAwB1L,CAAxB,EAA2Bmf,eAA3B,EAA4C/C,aAAazb,KAAb,EAAoB,IAApB,EAA0B6e,WAA1B,EAA5C,EACC;gBACW;MAFZ,CADD;;SAQI1kB,GAAL,CAAS,UAAC6hB,GAAD,EAAMpiB,CAAN,EAAY;SACjBoiB,IAAIvc,IAAP,EAAa;UACRgL,QAAO;oBACGuR,IAAI8C,QADP;qBAEI9C,IAAI+C,SAFR;mBAGEnlB;OAHb;UAKIolB,SAASzU,WAAW,KAAX,EAAkBlL,CAAlB,EAAqBC,CAArB,EAAwBgf,UAAxB,EAAoCnc,MAApC,EAA4C6Z,IAAIvc,IAAhD,EAAsDgL,KAAtD,CAAb;aACKgU,oBAAL,CAA0B5Z,IAA1B,CAA+Bma,MAA/B;;UAEIX,SAAL;KAVD;QAYI,CAAJ;SACKD,QAAL;IAvBD;;UA0BO,KAAKK,oBAAZ;GAnCU;iBAAA,2BAsCKvB,OAtCL,EAsCc;OACrBA,OAAH,EAAY,OAAO,EAAP;;EArSQ;;WAySZ;cACG,sBAAW;UAAS,wCAAwC,KAAKV,SAAL,CAAexc,KAA9D;GADhB;cAAA,wBAEIyK,IAFJ,EAEU;OACdlD,IAAI,KAAKiV,SAAb;QACKyC,QAAL,GAAgB,KAAhB;QACKC,KAAL,GAAazU,KAAK0U,UAAL,CAAgBhlB,GAAhB,CAAoB,UAACmF,CAAD,EAAI7C,CAAJ,EAAU;WACnCiQ,WACNjC,KAAK0S,UAAL,CAAgB1gB,CAAhB,CADM,EAEN6C,CAFM,EAGNmL,KAAKmP,QAHC,EAINrS,EAAEpH,KAJI,EAKNsK,KAAKyO,MAAL,CAAYzc,CAAZ,CALM,EAMNA,CANM,EAONgO,KAAK2U,OAAL,CAAa3iB,CAAb,CAPM,EAQN;eACWgO,KAAKnH,QADhB;gBAEYmH,KAAK4U,SAFjB;gBAGY9X,EAAEqF;KAXR,CAAP;IADY,CAAb;UAgBO,KAAKsS,KAAZ;GArBQ;iBAAA,2BAuBOhC,OAvBP,EAuBgB;OACpBoC,UAAUpC,QAAQC,UAAtB;OACIoC,UAAUrC,QAAQiC,UAAtB;OACIK,aAAatC,QAAQkC,OAAzB;OACIzB,YAAYT,QAAQhE,MAAxB;;OAEIuG,UAAU,KAAK3C,OAAL,CAAaK,UAA3B;OACIuC,UAAU,KAAK5C,OAAL,CAAaqC,UAA3B;OACIQ,aAAa,KAAK7C,OAAL,CAAasC,OAA9B;OACIvB,YAAY,KAAKf,OAAL,CAAa5D,MAA7B;;iCAEqB1V,qBAAqBic,OAArB,EAA8BH,OAA9B,CAXG;;;;UAAA;UAAA;;iCAYH9b,qBAAqBkc,OAArB,EAA8BH,OAA9B,CAZG;;;;UAAA;UAAA;;iCAaG/b,qBAAqBmc,UAArB,EAAiCH,UAAjC,CAbH;;;;aAAA;aAAA;;iCAcChc,qBAAqBqa,SAArB,EAAgCF,SAAhC,CAdD;;;;YAAA;YAAA;;;QAgBnB3G,MAAL,CAAY;gBACCyI,OADD;gBAECC,OAFD;aAGFC,UAHE;YAIHhC,SAJG;;cAMD,KAAKb,OAAL,CAAaxZ,QANZ;eAOA,KAAKwZ,OAAL,CAAauC,SAPb;cAQD,KAAKvC,OAAL,CAAalD;IARxB;;OAWI+C,kBAAkB,EAAtB;;QAEKC,KAAL,CAAWziB,GAAX,CAAe,UAACiW,GAAD,EAAMxW,CAAN,EAAY;sBACR+iB,gBAAgB9a,MAAhB,CAAuBsO,WACxCC,GADwC,EACnCkP,QAAQ1lB,CAAR,CADmC,EACvB2lB,QAAQ3lB,CAAR,CADuB,EACXsjB,QAAQtD,QADG,EACO4F,WAAW5lB,CAAX,CADP,EAExC,EAAC0J,UAAU4Z,QAAQ5Z,QAAnB,EAFwC,CAAvB,CAAlB;IADD;;UAOOqZ,eAAP;;EApWoB;;YAwWR;cACK,sBAAY;UACb,wCAAwC,KAAKH,SAAL,CAAexc,KAA9D;GAFG;cAAA,wBAIMyK,IAJN,EAIY;OACXlD,IAAI,KAAKiV,SAAb;QACKyC,QAAL,GAAgB,KAAhB;QACKzR,KAAL,GAAa,EAAb;OACI,CAACjG,EAAEqY,QAAP,EAAiB;SACRpS,KAAL,GAAaT,SACTtC,KAAK0S,UADI,EAET1S,KAAK0U,UAFI,EAGT5X,EAAEpH,KAHO,EAIT;eACcoH,EAAE8F,QADhB;iBAEgB9F,EAAEkG,UAFlB;aAGYlG,EAAE4F;KAPL,EAST;cACa5F,EAAEgG,OADf;eAEc9C,KAAKnH;KAXV,CAAb;;;QAgBC4b,KAAL,GAAa,EAAb;;OAEI,CAAC3X,EAAEsY,QAAP,EAAiB;SACRX,KAAL,GAAazU,KAAK0U,UAAL,CAAgBhlB,GAAhB,CAAoB,UAACmF,CAAD,EAAI7C,CAAJ,EAAU;YAChCoQ,WACHpC,KAAK0S,UAAL,CAAgB1gB,CAAhB,CADG,EAEH6C,CAFG,EAGHmL,KAAKtI,MAHF,EAIHoF,EAAEpH,KAJC,EAKHoH,EAAEuY,gBAAF,GAAqBrV,KAAK4D,MAAL,CAAY5R,CAAZ,CAArB,GAAsC,EALnC,EAMHA,CANG,CAAP;KADS,CAAb;;;UAYGsjB,OAAO1R,MAAP,CAAc,KAAKb,KAAnB,EAA0B3L,MAA1B,CAAiC,KAAKqd,KAAtC,CAAP;GAxCG;iBAAA,2BA0CShC,OA1CT,EA0CkB;OACjBoC,UAAUpC,QAAQC,UAAtB;OACIoC,UAAUrC,QAAQiC,UAAtB;OACIa,YAAY9C,QAAQ7O,MAAxB;;OAEIoR,UAAU,KAAK3C,OAAL,CAAaK,UAA3B;OACIuC,UAAU,KAAK5C,OAAL,CAAaqC,UAA3B;OACI1N,YAAY,KAAKqL,OAAL,CAAazO,MAA7B;;iCAEqB7K,qBAAqBic,OAArB,EAA8BH,OAA9B,CATA;;;;UAAA;UAAA;;iCAUA9b,qBAAqBkc,OAArB,EAA8BH,OAA9B,CAVA;;;;UAAA;UAAA;;iCAWI/b,qBAAqBiO,SAArB,EAAgCuO,SAAhC,CAXJ;;;;YAAA;YAAA;;;QAahBhJ,MAAL,CAAY;gBACIyI,OADJ;gBAEIC,OAFJ;YAGAM,SAHA;;cAKE,KAAKlD,OAAL,CAAaxZ,QALf;YAMA,KAAKwZ,OAAL,CAAa3a;IANzB;;OASIwa,kBAAkB,EAAtB;;OAEIoD,OAAO7lB,IAAP,CAAY,KAAKsT,KAAjB,EAAwB/L,MAA5B,EAAoC;sBACdkb,gBAAgB9a,MAAhB,CACd6O,YACI,KAAKlD,KADT,EAEI8R,OAFJ,EAGIC,OAHJ,EAIIrC,QAAQ5Z,QAJZ,EAKI,KAAKkZ,SAAL,CAAerP,MALnB,CADc,CAAlB;;;OAWA,KAAK+R,KAAL,CAAWzd,MAAf,EAAuB;SACdyd,KAAL,CAAW/kB,GAAX,CAAe,UAAC2S,GAAD,EAAMlT,CAAN,EAAY;uBACL+iB,gBAAgB9a,MAAhB,CACd0O,WAAWzD,GAAX,EAAgBwS,QAAQ1lB,CAAR,CAAhB,EAA4B2lB,QAAQ3lB,CAAR,CAA5B,CADc,CAAlB;KADJ;;;UAOG+iB,eAAP;;;CA9bZ;;AAmcA,AAAO,SAASsD,YAAT,CAAsBnf,IAAtB,EAA4B0b,SAA5B,EAAuCC,OAAvC,EAAgD;KAClDviB,OAAO6lB,OAAO7lB,IAAP,CAAY6iB,gBAAZ,EAA8BzO,MAA9B,CAAqC;SAAKxN,KAAKyN,QAAL,CAAc2R,CAAd,CAAL;EAArC,CAAX;KACIxL,SAASqI,iBAAiB7iB,KAAK,CAAL,CAAjB,CAAb;QACOimB,MAAP,CAAczL,MAAd,EAAsB;aACV8H,SADU;WAEZC;EAFV;QAIO,IAAIJ,cAAJ,CAAmB3H,MAAnB,CAAP;;;ICniBoB0L;;;0BACRrhB,MAAZ,EAAoB8J,IAApB,EAA0B;;;+HACnB9J,MADmB,EACX8J,IADW;;QAEpBzM,IAAL,GAAY,YAAZ;QACKmD,KAAL;;;;;;8BAGW0L,SAAS;OAChBpO,IAAI,KAAKiY,QAAb;QACKuL,UAAL,GAAkBpV,QAAQoV,UAAR,IAAsB,EAAxC;;OAEItZ,IAAI,KAAKsZ,UAAb;KACE9c,MAAF,GAAWwD,EAAExD,MAAF,IAAYvF,6BAAvB;KACEsM,KAAF,GAAUvD,EAAEuD,KAAF,IAAWrM,4BAArB;;KAEEjB,QAAF,CAAWxB,KAAX,GAAmB,EAAnB;KACE4B,YAAF,GAAiB,EAAjB;KACEiY,UAAF,GAAe,CAACtO,EAAExD,MAAF,GAAWwD,EAAEuD,KAAF,GAAU,GAAtB,IAA6B,CAA5C;;;;oCAGiB;OACbyO,IAAI,KAAKzD,KAAb;;OAEIyH,mBAAmB,CACtB,CACC,gBADD,EAEC;eACY,KAAKsD,UAAL,CAAgB9c,MAD5B;cAEW,KAAK8c,UAAL,CAAgB/V;IAJ5B,EAMC,YAAW;WACH;iBACMyO,EAAEoE,UADR;aAEEpE,EAAEqE,MAFJ;aAGE,KAAKpe;KAHd;IADD,CAMEiZ,IANF,CAMO,IANP,CAND,CADsB,CAAvB;;QAiBKnB,UAAL,GAAkB,IAAIW,GAAJ,CAAQsF,iBACxB5iB,GADwB,CACpB,gBAAQ;QACRmmB,YAAYL,gDAAgBpX,IAAhB,EAAhB;WACO,CAACA,KAAK,CAAL,CAAD,EAAUyX,SAAV,CAAP;IAHwB,CAAR,CAAlB;;;;yBAOM;;;;OAEFvH,IAAI,KAAKzD,KAAb;;KAEE6H,UAAF,GAAe,EAAf;KACEC,MAAF,GAAW,EAAX;;OAEImD,OAAO,CAAX;KACEvH,WAAF,CAAc7e,GAAd,CAAkB,UAACiG,KAAD,EAAW;QACxBG,QAAQ,OAAKA,KAAL,GAAaH,KAAb,GAAqB2Y,EAAEU,UAAnC;MACE2D,MAAF,CAASvY,IAAT,CAActE,KAAd;MACE4c,UAAF,CAAatY,IAAb,CAAkB0b,IAAlB;YACQhgB,KAAR;IAJD;;;;oCAQiB;;;gCAEJ;;;OACTwY,IAAI,KAAKzD,KAAb;QACK3V,SAAL,CAAeI,gBAAf,CAAgC,WAAhC,EAA6C,UAACuY,CAAD,EAAO;QAC/CkI,OAAO,OAAK1J,UAAL,CAAgB2J,GAAhB,CAAoB,gBAApB,EAAsC7D,KAAjD;QACIxM,MAAMkI,EAAEnc,MAAZ;QACGqkB,KAAKjS,QAAL,CAAc6B,GAAd,CAAH,EAAuB;;SAElBxW,IAAI4mB,KAAKE,OAAL,CAAatQ,GAAb,CAAR;SACIuQ,OAAOpmB,UAAU,OAAKoF,SAAf,CAAX;SAAsCihB,OAAOrmB,UAAU6V,GAAV,CAA7C;;SAEI/Q,IAAIuhB,KAAK9lB,IAAL,GAAY6lB,KAAK7lB,IAAjB,GAAwBgM,SAASsJ,IAAIrC,YAAJ,CAAiB,OAAjB,CAAT,IAAoC,CAApE;SACIzO,IAAIshB,KAAKlmB,GAAL,GAAWimB,KAAKjmB,GAAxB;SACImF,QAAQ,CAAC,OAAKghB,eAAL,IAAwB,OAAKA,eAAL,CAAqBpf,MAArB,GAA4B,CAApD,GACV,OAAKof,eAAL,CAAqBjnB,CAArB,CADU,GACgB,OAAK0b,KAAL,CAAW4D,MAAX,CAAkBtf,CAAlB,CADjB,IACyC,IADrD;SAEIknB,WAAW/H,EAAEC,WAAF,CAAcpf,CAAd,IAAiBmf,EAAEU,UAAlC;;YAEKlD,GAAL,CAASwK,SAAT,CAAmB1hB,CAAnB,EAAsBC,CAAtB,EAAyB,EAACwB,MAAMjB,KAAP,EAAcO,OAAO,CAAC0gB,WAAS,GAAV,EAAe1f,OAAf,CAAuB,CAAvB,IAA4B,GAAjD,EAAzB;YACKmV,GAAL,CAASyK,OAAT;;IAfF;;;;EAnE2CtI;;ICIxBuI;;;mBACRliB,MAAZ,EAAoB8J,IAApB,EAA0B;;;iHACnB9J,MADmB,EACX8J,IADW;;QAEpBzM,IAAL,GAAY,KAAZ;QACKmZ,WAAL,GAAmB,CAAnB;QACKmB,IAAL,GAAY,CAAZ;;QAEKnX,KAAL;;;;;;4BAGSsJ,MAAM;gHACCA,IAAhB;QACKqY,SAAL,GAAiB,KAAKA,SAAL,CAAejJ,IAAf,CAAoB,IAApB,CAAjB;QACKkJ,UAAL,GAAkB,KAAKA,UAAL,CAAgBlJ,IAAhB,CAAqB,IAArB,CAAlB;;QAEKmJ,UAAL,GAAkBvY,KAAKuY,UAAL,IAAmB,GAArC;QACK1M,MAAL,CAAY2M,UAAZ,GAAyBxY,KAAKwY,UAAL,IAAmB,CAA5C;;QAEK9X,SAAL,GAAiBV,KAAKU,SAAL,IAAkB,KAAnC;;;;yBAGM;;;;OAEFwP,IAAI,KAAKzD,KAAb;QACKnT,MAAL,GAAe,KAAKoB,MAAL,GAAc,KAAKhD,KAAnB,GAA2B,KAAK+I,MAAL,CAAYjK,CAAvC,GAA2C,KAAKiK,MAAL,CAAYhK,CAAtE;;OAEQ6C,MALF,GAKwB,IALxB,CAKEA,MALF;OAKUoH,SALV,GAKwB,IALxB,CAKUA,SALV;;;OAOA+X,uBAAuBvI,EAAEwI,gBAAF,IAAsB,EAAnD;KACEvE,YAAF,GAAiB,EAAjB;KACEuE,gBAAF,GAAqB,EAArB;OACIC,WAAW,MAAM,KAAK9M,MAAL,CAAY2M,UAAjC;KACErI,WAAF,CAAc7e,GAAd,CAAkB,UAACgf,KAAD,EAAQvf,CAAR,EAAc;QACzBynB,aAAaG,QAAnB;QACMC,kBAAmBtI,QAAQJ,EAAEU,UAAX,GAAyB5a,UAAjD;QACM2K,WAAWiY,kBAAkB,GAAlB,GAAwB,CAAxB,GAA2B,CAA5C;QACMC,YAAYnY,YAAY,CAACkY,eAAb,GAA+BA,eAAjD;QACME,WAAWH,WAAWA,WAAWE,SAAvC;QACMtY,gBAAgBnH,mBAAmBof,UAAnB,EAA+Blf,MAA/B,CAAtB;QACMkH,cAAcpH,mBAAmB0f,QAAnB,EAA6Bxf,MAA7B,CAApB;;QAEMyf,eAAe,OAAKlL,IAAL,IAAa4K,qBAAqB1nB,CAArB,CAAlC;;QAEIioB,iBAAJ;QAAaC,eAAb;QACG,OAAKpL,IAAR,EAAc;gBACFkL,eAAeA,aAAaxY,aAA5B,GAA4CA,aAAvD;cACSwY,eAAeA,aAAavY,WAA5B,GAA0CD,aAAnD;KAFD,MAGO;gBACKA,aAAX;cACSC,WAAT;;QAEK0Y,UACLN,oBAAoB,GAApB,GACG5X,cAAcgY,QAAd,EAAwBC,MAAxB,EAAgC,OAAKxY,MAArC,EAA6C,OAAKnH,MAAlD,EAA0DoH,SAA1D,EAAqEC,QAArE,CADH,GAEGL,eAAe0Y,QAAf,EAAyBC,MAAzB,EAAiC,OAAKxY,MAAtC,EAA8C,OAAKnH,MAAnD,EAA2DoH,SAA3D,EAAsEC,QAAtE,CAHJ;;MAKEwT,YAAF,CAAenY,IAAf,CAAoBkd,OAApB;MACER,gBAAF,CAAmB1c,IAAnB,CAAwB;iCAAA;6BAAA;YAGhBsU,KAHgB;YAIhBJ,EAAEU,UAJc;2BAAA;uBAAA;YAOhBiI;KAPR;IAzBD;QAoCKhL,IAAL,GAAY,CAAZ;;;;oCAGiB;OACbqC,IAAI,KAAKzD,KAAb;;OAEIyH,mBAAmB,CACtB,CACC,WADD,EAEC,EAFD,EAGC,YAAW;WACH;mBACQhE,EAAEiE,YADV;aAEE,KAAKhe;KAFd;IADD,CAKEiZ,IALF,CAKO,IALP,CAHD,CADsB,CAAvB;;QAaKnB,UAAL,GAAkB,IAAIW,GAAJ,CAAQsF,iBACxB5iB,GADwB,CACpB,gBAAQ;QACRmmB,YAAYL,gDAAgBpX,IAAhB,EAAhB;WACO,CAACA,KAAK,CAAL,CAAD,EAAUyX,SAAV,CAAP;IAHwB,CAAR,CAAlB;;;;sCAOmB0B,UAAS;OACtB7f,MADsB,GACD,IADC,CACtBA,MADsB;OACfif,UADe,GACD,IADC,CACfA,UADe;;OAEtBrV,WAAW9J,mBAAmB+f,SAASX,UAAT,GAAqBW,SAAS9f,KAAT,GAAiB,CAAzD,EAA4DC,MAA5D,CAAjB;2BACuB4J,SAAS1M,CAAV,GAAe+hB,UAArC,WAAsDrV,SAASzM,CAAV,GAAe8hB,UAApE;;;;6BAGUhU,MAAKxT,GAAEqoB,MAAK3J,GAAE;OACrB,CAAClL,IAAJ,EAAU;OACJjN,QAAQ,KAAKnB,MAAL,CAAYpF,CAAZ,CAAd;OACGqoB,IAAH,EAAS;cACE7U,IAAV,EAAgB,KAAK8U,mBAAL,CAAyB,KAAK5M,KAAL,CAAWiM,gBAAX,CAA4B3nB,CAA5B,CAAzB,CAAhB;SACKQ,KAAL,CAAWqF,IAAX,GAAkB+G,mBAAmBrG,KAAnB,EAA0B,EAA1B,CAAlB;QACIgiB,QAAQ5nB,UAAU,KAAKqZ,GAAf,CAAZ;QACIvU,IAAIiZ,EAAE8J,KAAF,GAAUD,MAAMrnB,IAAhB,GAAuB,EAA/B;QACIwE,IAAIgZ,EAAE+J,KAAF,GAAUF,MAAMznB,GAAhB,GAAsB,EAA9B;QACImF,QAAQ,CAAC,KAAKyiB,gBAAL,IAAyB,KAAKA,gBAAL,CAAsB7gB,MAAtB,GAA+B,CAAxD,GACV,KAAK6gB,gBAAL,CAAsB1oB,CAAtB,CADU,GACiB,KAAK0b,KAAL,CAAW4D,MAAX,CAAkBtf,CAAlB,CADlB,IAC0C,IADtD;QAEI2oB,UAAU,CAAC,KAAKjN,KAAL,CAAW0D,WAAX,CAAuBpf,CAAvB,IAA4B,GAA5B,GAAkC,KAAK0b,KAAL,CAAWmE,UAA9C,EAA0DrY,OAA1D,CAAkE,CAAlE,CAAd;SACKmV,GAAL,CAASwK,SAAT,CAAmB1hB,CAAnB,EAAsBC,CAAtB,EAAyB,EAACwB,MAAMjB,KAAP,EAAcO,OAAOmiB,UAAU,GAA/B,EAAzB;SACKhM,GAAL,CAASyK,OAAT;IAVD,MAWO;cACI5T,IAAV,EAAe,oBAAf;SACKmJ,GAAL,CAAS3W,OAAT;SACKxF,KAAL,CAAWqF,IAAX,GAAkBU,KAAlB;;;;;gCAIY;QACRR,SAAL,CAAeI,gBAAf,CAAgC,WAAhC,EAA6C,KAAKmhB,SAAlD;QACKvhB,SAAL,CAAeI,gBAAf,CAAgC,YAAhC,EAA8C,KAAKohB,UAAnD;;;;4BAGS7I,GAAE;OACLnc,SAASmc,EAAEnc,MAAjB;OACIqmB,SAAS,KAAK1L,UAAL,CAAgB2J,GAAhB,CAAoB,WAApB,EAAiC7D,KAA9C;OACI6F,YAAY,KAAKC,mBAArB;OACIC,aAAa,KAAKC,cAAtB;OACGJ,OAAOjU,QAAP,CAAgBpS,MAAhB,CAAH,EAA4B;QACvBvC,IAAI4oB,OAAO9B,OAAP,CAAevkB,MAAf,CAAR;SACK0mB,UAAL,CAAgBF,UAAhB,EAA4BF,SAA5B,EAAsC,KAAtC;SACKG,cAAL,GAAsBzmB,MAAtB;SACKumB,mBAAL,GAA2B9oB,CAA3B;SACKipB,UAAL,CAAgB1mB,MAAhB,EAAwBvC,CAAxB,EAA2B,IAA3B,EAAiC0e,CAAjC;IALD,MAMO;SACD6I,UAAL;;;;;+BAIU;QACN0B,UAAL,CAAgB,KAAKD,cAArB,EAAoC,KAAKF,mBAAzC,EAA6D,KAA7D;;;;EA/IoChK;;ACPtC,SAASoK,SAAT,CAAmBzjB,CAAnB,EAAsB;;;;;KAKlBA,MAAI,CAAP,EAAU;SACF,CAAC,CAAD,EAAI,CAAJ,CAAP;;KAEEqD,MAAMrD,CAAN,CAAH,EAAa;SACL,EAAC0jB,UAAU,CAAC,gBAAZ,EAA8BC,UAAU,GAAxC,EAAP;;KAEGC,MAAM5jB,IAAI,CAAJ,GAAQ,CAAR,GAAY,CAAC,CAAvB;KACG,CAACuD,SAASvD,CAAT,CAAJ,EAAiB;SACT,EAAC0jB,UAAUE,MAAM,gBAAjB,EAAmCD,UAAU,GAA7C,EAAP;;;KAGGrkB,KAAKiD,GAAL,CAASvC,CAAT,CAAJ;KACI6jB,MAAMvkB,KAAKyF,KAAL,CAAWzF,KAAK0F,KAAL,CAAWhF,CAAX,CAAX,CAAV;KACI8jB,MAAM9jB,IAAEV,KAAK6F,GAAL,CAAS,EAAT,EAAa0e,GAAb,CAAZ;;QAEO,CAACD,MAAME,GAAP,EAAYD,GAAZ,CAAP;;;AAGD,SAASE,sBAAT,CAAgCC,GAAhC,EAA4C;KAAPC,GAAO,uEAAH,CAAG;;KACvCC,aAAa5kB,KAAK0c,IAAL,CAAUgI,GAAV,CAAjB;KACIG,aAAa7kB,KAAKyF,KAAL,CAAWkf,GAAX,CAAjB;KACIG,QAAQF,aAAaC,UAAzB;;KAEIE,YAAYD,KAAhB;KACIE,WAAW,CAAf;;;KAGGF,QAAQ,CAAX,EAAc;MACVA,QAAQ,CAAR,KAAc,CAAjB,EAAoB;;;WAGXF,aAAaC,UAArB;;cAEWC,QAAM,CAAlB;aACW,CAAX;;;;KAIEA,SAAS,CAAZ,EAAe;cACF,CAAZ;aACWA,QAAMC,SAAjB;;;;KAIED,UAAU,CAAb,EAAgB;cACH,CAAZ;aACW,CAAX;;;KAGGG,YAAY,EAAhB;MACI,IAAIhqB,IAAI,CAAZ,EAAeA,KAAK8pB,SAApB,EAA+B9pB,GAA/B,EAAmC;YACxBiL,IAAV,CAAe2e,aAAaG,WAAW/pB,CAAvC;;QAEMgqB,SAAP;;;AAGD,SAASC,iBAAT,CAA2BC,QAA3B,EAAiD;KAAZC,QAAY,uEAAH,CAAG;;kBACfjB,UAAUgB,QAAV,CADe;;KAC3CE,cAD2C;KAC3BhB,QAD2B;;KAE5CiB,iBAAiBF,WAAWA,WAASplB,KAAK6F,GAAL,CAAS,EAAT,EAAawe,QAAb,CAApB,GAA4C,CAAjE;;;kBAGiBgB,eAAe5iB,OAAf,CAAuB,CAAvB,CAAjB;;KAEIwiB,YAAYR,uBAAuBY,cAAvB,EAAuCC,cAAvC,CAAhB;aACYL,UAAUzpB,GAAV,CAAc,iBAAS;;;;MAI9B6oB,WAAW,CAAf,EAAkB;UACV5iB,QAAQzB,KAAK6F,GAAL,CAAS,EAAT,EAAa,CAACwe,QAAd,CAAf;;SAEM5iB,QAAQzB,KAAK6F,GAAL,CAAS,EAAT,EAAawe,QAAb,CAAf;EAPW,CAAZ;QASOY,SAAP;;;AAGD,AAAO,SAASM,kBAAT,CAA4B7V,MAA5B,EAAuD;KAAnB8V,WAAmB,uEAAP,KAAO;;;;;;;KAMzDL,WAAWnlB,KAAK0kB,GAAL,+BAAYhV,MAAZ,EAAf;KACI0V,WAAWplB,KAAK2kB,GAAL,+BAAYjV,MAAZ,EAAf;;;KAGI2U,WAAW,CAAf;KAAkBY,YAAY,EAA9B,CAV6D;;UAYpDQ,yBAAT,CAAmCN,QAAnC,EAA6CO,WAA7C,EAA0D;MACrDT,YAAYC,kBAAkBC,QAAlB,CAAhB;;MAEIQ,eAAeV,UAAU,CAAV,IAAeA,UAAU,CAAV,CAAlC;;;MAGIxjB,QAAQ,CAAZ;OACI,IAAIxG,IAAI,CAAZ,EAAewG,QAAQikB,WAAvB,EAAoCzqB,GAApC,EAAyC;YAC/B0qB,YAAT;aACUC,OAAV,CAAmB,CAAC,CAAF,GAAOnkB,KAAzB;;SAEMwjB,SAAP;;;;;KAKEE,YAAY,CAAZ,IAAiBC,YAAY,CAAhC,EAAmC;aACvBjB,UAAUgB,QAAV,EAAoB,CAApB,CAAX;MACG,CAACK,WAAJ,EAAiB;eACJN,kBAAkBC,QAAlB,CAAZ;GADD,MAEO;eACMD,kBAAkBC,QAAlB,EAA4BC,QAA5B,CAAZ;;;;;;MAMG,IAAGD,WAAW,CAAX,IAAgBC,WAAW,CAA9B,EAAiC;;;;;;;OAOjCM,cAAc1lB,KAAKiD,GAAL,CAASmiB,QAAT,CAAlB;;OAEGD,YAAYO,WAAf,EAA4B;eAChBvB,UAAUgB,QAAV,EAAoB,CAApB,CAAX;gBACYM,0BAA0BN,QAA1B,EAAoCO,WAApC,CAAZ;IAFD,MAGO;;eAEKvB,UAAUuB,WAAV,EAAuB,CAAvB,CAAX;QACIG,eAAeJ,0BAA0BC,WAA1B,EAAuCP,QAAvC,CAAnB;gBACYU,aAAa9e,OAAb,GAAuBvL,GAAvB,CAA2B;YAAKgH,IAAK,CAAC,CAAX;KAA3B,CAAZ;;;;;;OAOG,IAAG2iB,YAAY,CAAZ,IAAiBC,YAAY,CAAhC,EAAmC;;;;QAInCU,iBAAiB9lB,KAAKiD,GAAL,CAASmiB,QAAT,CAArB;QACIW,iBAAiB/lB,KAAKiD,GAAL,CAASkiB,QAAT,CAArB;;eAEWhB,UAAU2B,cAAV,EAA0B,CAA1B,CAAX;QACG,CAACN,WAAJ,EAAiB;iBACJN,kBAAkBY,cAAlB,CAAZ;KADD,MAEO;iBACMZ,kBAAkBY,cAAlB,EAAkCC,cAAlC,CAAZ;;;gBAGWd,UAAUle,OAAV,GAAoBvL,GAApB,CAAwB;YAAKgH,IAAK,CAAC,CAAX;KAAxB,CAAZ;;;QAGMyiB,SAAP;;;AAGD,AAAO,SAASe,YAAT,CAAsBC,IAAtB,EAA4B;KAC9BC,kBAAJ;KACIC,WAAWC,gBAAgBH,IAAhB,CAAf;KACGA,KAAKlE,OAAL,CAAa,CAAb,KAAmB,CAAtB,EAAyB;;;cAGZkE,KAAKlE,OAAL,CAAa,CAAb,CAAZ;EAHD,MAIO,IAAGkE,KAAK,CAAL,IAAU,CAAb,EAAgB;;;MAGlBtB,MAAMsB,KAAK,CAAL,CAAV;cACa,CAAC,CAAF,GAAOtB,GAAP,GAAawB,QAAzB;EAJM,MAKA;;;MAGFzB,MAAMuB,KAAKA,KAAKnjB,MAAL,GAAc,CAAnB,CAAV;cACa,CAAC,CAAF,GAAO4hB,GAAP,GAAayB,QAAb,IAAyBF,KAAKnjB,MAAL,GAAc,CAAvC,CAAZ;;QAEMojB,SAAP;;;AAGD;;AAYA,AAAO,SAASE,eAAT,CAAyBC,YAAzB,EAAuC;QACtCA,aAAa,CAAb,IAAkBA,aAAa,CAAb,CAAzB;;;AAGD,AAAO,SAASC,aAAT,CAAuBD,YAAvB,EAAqC;QACpCA,aAAaA,aAAavjB,MAAb,GAAoB,CAAjC,IAAsCujB,aAAa,CAAb,CAA7C;;;AAGD,AAAO,SAASE,KAAT,CAAerrB,GAAf,EAAoBsrB,KAApB,EAA2B;QAC1BjkB,SAASikB,MAAM7hB,QAAN,GAAiBzJ,MAAMsrB,MAAMC,eAAtC,CAAP;;;AAGD;;AAIA;;AAKA,AAAO,SAASC,iBAAT,CAA2BC,IAA3B,EAAiCC,GAAjC,EAAqD;KAAfvlB,KAAe,uEAAP,KAAO;;KACvDwlB,UAAUD,IAAIpf,MAAJ,CAAW,UAASsf,IAAT,EAAeC,IAAf,EAAqB;SACrC/mB,KAAKiD,GAAL,CAAS8jB,OAAOJ,IAAhB,IAAwB3mB,KAAKiD,GAAL,CAAS6jB,OAAOH,IAAhB,CAAxB,GAAgDI,IAAhD,GAAuDD,IAA/D;EADa,EAEX,EAFW,CAAd;;QAIOzlB,QAAQulB,IAAI7E,OAAJ,CAAY8E,OAAZ,CAAR,GAA+BA,OAAtC;;;AAGD,AAAO,SAASG,gBAAT,CAA0BtX,MAA1B,EAAkCuX,gBAAlC,EAAoD;;;;KAItDC,eAAelnB,KAAK0kB,GAAL,+BAAYhV,MAAZ,EAAnB;;KAEIyX,mBAAmB,KAAKF,mBAAmB,CAAxB,CAAvB;KACIG,eAAe,EAAnB;;MAEI,IAAInsB,IAAI,CAAZ,EAAeA,IAAIgsB,gBAAnB,EAAqChsB,GAArC,EAA0C;MACrCosB,aAAaH,gBAAgBC,mBAAmBlsB,CAAnC,CAAjB;eACaiL,IAAb,CAAkBmhB,UAAlB;;;QAGMD,YAAP;;;AAGD,AAAO,SAASE,gBAAT,CAA0B7lB,KAA1B,EAAiC2lB,YAAjC,EAA+C;QAC9CA,aAAazX,MAAb,CAAoB;SAAKnN,IAAIf,KAAT;EAApB,EAAoCqB,MAA3C;;;AC5OD,IAAMykB,YAAY/nB,sBAAsBC,mBAAxC;AACA,IAAM+nB,aAAaD,SAAnB;;;IAGqBE;;;kBACRrnB,MAAZ,EAAoBkM,OAApB,EAA6B;;;+GACtBlM,MADsB,EACdkM,OADc;;QAEvB7O,IAAL,GAAY,SAAZ;;QAEKiqB,UAAL,GAAkBpb,QAAQob,UAAR,IAAsB,EAAxC;;MAEIC,cAAc,CAAC,QAAD,EAAW,QAAX,CAAlB;MACIC,iBAAiBD,YAAY/X,QAAZ,CAAqBtD,QAAQsb,cAA7B,IAClBtb,QAAQsb,cADU,GACO,QAD5B;QAEKC,mBAAL,GAA2BF,YAAY5F,OAAZ,CAAoB6F,cAApB,CAA3B;;QAEKhnB,KAAL;;;;;;8BAGW0L,SAAS;OAChBpO,IAAI,KAAKiY,QAAb;QACK2R,eAAL,GAAuBxb,QAAQwb,eAAR,KAA4B,CAA5B,GAAgC,CAAhC,GAAoC,CAA3D;;KAEEzpB,QAAF,CAAWtC,GAAX,GAAiByrB,aAAa,CAA9B;KACEnpB,QAAF,CAAW5B,MAAX,GAAoB,CAApB;KACEgC,YAAF,GAAiB+oB,aAAa,CAA9B;KACE9Q,UAAF,GAAe8Q,aAAapM,kBAAb,GACZ7c,eAAeL,CAAf,CADH;;OAGIsE,IAAI,KAAKsJ,IAAb;OACIic,UAAU,KAAKD,eAAL,GAAuB3M,iBAAvB,GAA2C,CAAzD;QACKxD,gBAAL,GAAwB,CAAC0E,gBAAgB7Z,EAAEK,KAAlB,EAAyBL,EAAEwlB,GAA3B,IACtBD,OADqB,IACVR,SADU,GACE7oB,cAAcR,CAAd,CAD1B;;;;gCAIa;OACT6pB,UAAU,KAAKD,eAAL,GAAuB3M,iBAAvB,GAA2C,CAAzD;OACI8M,YAAY,KAAKtR,KAAL,CAAWsR,SAAX,GAAuB,KAAKtR,KAAL,CAAWsR,SAAlC,GAA8C,EAA9D;QACKxP,SAAL,GAAiB,CAACwP,YAAYF,OAAb,IAAwBR,SAAxB,GACd7oB,cAAc,KAAKyX,QAAnB,CADH;;;;gCAI2B;OAAhBrK,IAAgB,uEAAX,KAAKA,IAAM;;OACxBA,KAAKjJ,KAAL,IAAciJ,KAAKkc,GAAnB,IAA0Blc,KAAKjJ,KAAL,GAAaiJ,KAAKkc,GAA/C,EAAoD;UAC7C,IAAIvS,KAAJ,CAAU,6CAAV,CAAN;;;OAGE,CAAC3J,KAAKjJ,KAAT,EAAgB;SACVA,KAAL,GAAa,IAAIyB,IAAJ,EAAb;SACKzB,KAAL,CAAWqlB,WAAX,CAAwBpc,KAAKjJ,KAAL,CAAWuZ,WAAX,KAA2B,CAAnD;;OAEE,CAACtQ,KAAKkc,GAAT,EAAc;SAAOA,GAAL,GAAW,IAAI1jB,IAAJ,EAAX;;QACX6jB,UAAL,GAAkBrc,KAAKqc,UAAL,IAAmB,EAArC;;OAEGhgB,SAASiZ,OAAO7lB,IAAP,CAAYuQ,KAAKqc,UAAjB,EAA6B,CAA7B,CAAT,IAA4C,MAA/C,EAAuD;QAClDliB,SAAS,EAAb;WACO1K,IAAP,CAAYuQ,KAAKqc,UAAjB,EAA6BnR,OAA7B,CAAqC,2BAAgB;SAChD0E,OAAO,IAAIpX,IAAJ,CAAS8jB,kBAAe/M,YAAxB,CAAX;YACOU,YAAYL,IAAZ,CAAP,IAA4B5P,KAAKqc,UAAL,CAAgBC,eAAhB,CAA5B;KAFD;SAIKD,UAAL,GAAkBliB,MAAlB;;;UAGM6F,IAAP;;;;yBAGM;OACFsO,IAAI,KAAKzD,KAAb;;KAEE9T,KAAF,GAAUqS,MAAM,KAAKpJ,IAAL,CAAUjJ,KAAhB,CAAV;KACEmlB,GAAF,GAAQ9S,MAAM,KAAKpJ,IAAL,CAAUkc,GAAhB,CAAR;;KAEEK,cAAF,GAAmBnT,MAAMkF,EAAEvX,KAAR,CAAnB;KACEolB,SAAF,GAAc5L,gBAAgBjC,EAAEvX,KAAlB,EAAyBuX,EAAE4N,GAA3B,CAAd;KACEZ,YAAF,GAAiBJ,iBAChB5F,OAAO1R,MAAP,CAAc,KAAK5D,IAAL,CAAUqc,UAAxB,CADgB,EACqB5oB,yBADrB,CAAjB;;KAGE+oB,aAAF,GAAkB,KAAKC,UAAL,EAAlB;;;;oCAGiB;;;OACbnO,IAAI,KAAKzD,KAAb;OACI6R,UAAU,KAAKV,eAAL,GAAuB,CAAvB,GAA2B,CAAzC;;OAEI1J,mBAAmBhE,EAAEkO,aAAF,CAAgB9sB,GAAhB,CAAoB,UAACua,MAAD,EAAS9a,CAAT;WAAe,CACzD,YADyD,EAEzD;YACQ8a,OAAO1U,KADf;eAEWkmB,SAFX;gBAGYC,UAHZ;iBAIahoB,mBAJb;aAKS,OAAKkW,YAAL,CAAkBlS,MAAlB,IAA4B,CALrC;iBAMa4W,EAAEkO,aAAF,CACV3Y,MADU,CACH,UAACoG,MAAD,EAASjY,CAAT;aAAeA,IAAI7C,CAAnB;MADG,EAEVO,GAFU,CAEN;aAAUua,OAAOgK,IAAP,CAAYjd,MAAZ,GAAqB0lB,OAA/B;MAFM,EAGVhhB,MAHU,CAGH,UAACL,CAAD,EAAIiB,CAAJ;aAAUjB,IAAIiB,CAAd;MAHG,EAGc,CAHd,IAITmf;KAZqD,EAczD,YAAW;YACHnN,EAAEkO,aAAF,CAAgBrtB,CAAhB,CAAP;KADD,CAEEqe,IAFF,CAEO,MAFP,CAdyD,CAAf;IAApB,CAAvB;;QAoBKnB,UAAL,GAAkB,IAAIW,GAAJ,CAAQsF,iBACxB5iB,GADwB,CACpB,UAAC0O,IAAD,EAAOjP,CAAP,EAAa;QACb0mB,YAAYL,gDAAgBpX,IAAhB,EAAhB;WACO,CAACA,KAAK,CAAL,IAAU,GAAV,GAAgBjP,CAAjB,EAAoB0mB,SAApB,CAAP;IAHwB,CAAR,CAAlB;;OAOIhhB,IAAI,CAAR;mBACgBqW,OAAhB,CAAwB,UAACyR,OAAD,EAAUxtB,CAAV,EAAgB;QACpC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU2U,QAAV,CAAmB3U,CAAnB,CAAH,EAA0B;SACrBytB,UAAUtc,SAAS,gBAAT,EAA2B,CAACmb,SAAD,GAAW,CAAtC,EAAyC5mB,CAAzC,EAA4C8nB,OAA5C,EACb;gBACWjpB,mBADX;UAEK,CAFL;kBAGa;MAJA,CAAd;YAOK4Y,QAAL,CAAcjd,WAAd,CAA0ButB,OAA1B;;SAEIlB,UAAL;IAXD;;;;yBAeM1b,MAAM;OACT,CAACA,IAAJ,EAAU;YACDiN,KAAR,CAAc,oBAAd;;;QAGIjN,IAAL,GAAY,KAAK8J,WAAL,CAAiB9J,IAAjB,CAAZ;QACKqL,IAAL;QACKU,WAAL;;;;gCAGa;;;QACR7W,SAAL,CAAeI,gBAAf,CAAgC,WAAhC,EAA6C,UAACuY,CAAD,EAAO;WAC9CxB,UAAL,CAAgBnB,OAAhB,CAAwB,gBAAQ;SAC3B2R,aAAaC,KAAK3K,KAAtB;SACI4K,YAAYlP,EAAEnc,MAAlB;SACGmrB,WAAW/Y,QAAX,CAAoBiZ,SAApB,CAAH,EAAmC;;UAE9BjmB,QAAQimB,UAAUzZ,YAAV,CAAuB,YAAvB,CAAZ;UACI0Z,YAAYD,UAAUzZ,YAAV,CAAuB,WAAvB,EAAoCuC,KAApC,CAA0C,GAA1C,CAAhB;;UAEIuL,QAAQJ,aAAa3U,SAAS2gB,UAAU,CAAV,CAAT,IAAuB,CAApC,EAAuC,IAAvC,CAAZ;;UAEI9G,OAAO,OAAKhhB,SAAL,CAAelF,qBAAf,EAAX;UAAmDmmB,OAAO4G,UAAU/sB,qBAAV,EAA1D;;UAEI8F,QAAQuG,SAASwR,EAAEnc,MAAF,CAAS4R,YAAT,CAAsB,OAAtB,CAAT,CAAZ;UACI1O,IAAIuhB,KAAK9lB,IAAL,GAAY6lB,KAAK7lB,IAAjB,GAAwByF,QAAM,CAAtC;UACIjB,IAAIshB,KAAKlmB,GAAL,GAAWimB,KAAKjmB,GAAxB;UACI0F,QAAQmB,QAAQ,GAAR,GAAc,OAAK8kB,UAA/B;UACIvlB,OAAO,SAAS+a,KAAT,GAAiB,GAAjB,GAAuB4L,UAAU,CAAV,CAAvB,GAAsC,IAAtC,GAA6CA,UAAU,CAAV,CAAxD;;aAEKlR,GAAL,CAASwK,SAAT,CAAmB1hB,CAAnB,EAAsBC,CAAtB,EAAyB,EAACwB,MAAMA,IAAP,EAAaV,OAAOA,KAApB,EAA2BW,YAAY,CAAvC,EAAzB,EAAoE,EAApE;aACKwV,GAAL,CAASyK,OAAT;;KAnBF;IADD;;;;iCA0Bc;;;QACTzJ,UAAL,CAAgBmC,WAAhB,GAA8B,EAA9B;OACIra,IAAI,CAAR;OACIC,IAAI6mB,UAAR;OACIhkB,SAAS,KAAKkS,YAAL,CAAkBlS,MAAlB,IAA4B,CAAzC;;OAEIulB,WAAW3c,SAAS,gBAAT,EAA2B1L,CAA3B,EAA8BC,CAA9B,EAAiC,MAAjC,EACd;cACWnB,sBAAsB,CADjC;QAEK;IAHS,CAAf;OAMK+nB,YAAY,CAAb,GAAkBA,YAAU,CAAhC;QACK3O,UAAL,CAAgBzd,WAAhB,CAA4B4tB,QAA5B;;QAEK1oB,MAAL,CAAY+E,KAAZ,CAAkB,CAAlB,EAAqB7F,yBAArB,EAAgD/D,GAAhD,CAAoD,UAACgG,KAAD,EAAQvG,CAAR,EAAc;QAC3DolB,SAASzU,WAAW,qBAAX,EAAkClL,IAAI,CAAC6mB,YAAY,CAAb,IAAkBtsB,CAAxD,EACd0F,CADc,EACXnB,mBADW,EACUgE,MADV,EACkBhC,KADlB,CAAf;WAEKoX,UAAL,CAAgBzd,WAAhB,CAA4BklB,MAA5B;IAHD;;OAMI2I,YAAYtoB,IAAInB,6BAA6BgoB,YAAY,CAAzC,CAAJ,GAAkDA,YAAU,CAA5E;OACI0B,WAAW7c,SAAS,gBAAT,EAA2B4c,SAA3B,EAAsCroB,CAAtC,EAAyC,MAAzC,EACd;cACWnB,sBAAsB,CADjC;QAEK;IAHS,CAAf;QAMKoZ,UAAL,CAAgBzd,WAAhB,CAA4B8tB,QAA5B;;;;+BAGY;OACR7O,IAAI,KAAKzD,KAAb;cACgC,CAACyD,EAAEvX,KAAF,CAAQsZ,QAAR,EAAD,EAAqB/B,EAAEvX,KAAF,CAAQuZ,WAAR,EAArB,CAFpB;OAEL8M,UAFK;OAEOC,SAFP;eAGgB,CAAC/O,EAAE4N,GAAF,CAAM7L,QAAN,EAAD,EAAmB/B,EAAE4N,GAAF,CAAM5L,WAAN,EAAnB,CAHhB;OAGLgN,QAHK;OAGKC,OAHL;;;OAKNC,aAAcF,WAAWF,UAAX,GAAwB,CAAzB,GAA8B,CAACG,UAAUF,SAAX,IAAwB,EAAzE;;OAEIb,gBAAgB,EAApB;;OAEIiB,eAAerU,MAAMkF,EAAEvX,KAAR,CAAnB;QACI,IAAI5H,IAAI,CAAZ,EAAeA,IAAIquB,UAAnB,EAA+BruB,GAA/B,EAAoC;QAC/BshB,UAAUnC,EAAE4N,GAAhB;QACG,CAACnL,eAAe0M,YAAf,EAA6BnP,EAAE4N,GAA/B,CAAJ,EAAyC;iBACpB,CAACuB,aAAapN,QAAb,EAAD,EAA0BoN,aAAanN,WAAb,EAA1B,CADoB;SACnCc,KADmC;SAC5BC,IAD4B;;eAE9BF,mBAAmBC,KAAnB,EAA0BC,IAA1B,CAAV;;kBAEajX,IAAd,CAAmB,KAAKsjB,eAAL,CAAqBD,YAArB,EAAmChN,OAAnC,CAAnB;;YAEQA,OAAR,EAAiB,CAAjB;mBACeA,OAAf;;;UAGM+L,aAAP;;;;kCAGehM,WAAuB;OAAZC,OAAY,uEAAJ,EAAI;eAClB,CAACD,UAAUH,QAAV,EAAD,EAAuBG,UAAUF,WAAV,EAAvB,CADkB;OACjCc,KADiC;OAC1BC,IAD0B;;OAElCsM,cAAchN,eAAeH,SAAf,CAAlB,CAFsC;aAG5BpH,MAAMqH,OAAN,KAAkBU,mBAAmBC,KAAnB,EAA0BC,IAA1B,CAA5B;;OAEIuM,eAAe;WACXxM,KADW;UAEZ;IAFP;;WAKQX,OAAR,EAAiB,CAAjB;OACIoN,iBAAiBtN,gBAAgBoN,WAAhB,EAA6BlN,OAA7B,CAArB;;OAEIwD,OAAO,EAAX;OAAehY,YAAf;QACI,IAAI9M,IAAI,CAAZ,EAAeA,IAAI0uB,cAAnB,EAAmC1uB,GAAnC,EAAwC;UACjC,KAAK2uB,MAAL,CAAYH,WAAZ,EAAyBvM,KAAzB,CAAN;SACKhX,IAAL,CAAU6B,GAAV;;kBAEc,IAAIzD,IAAJ,CAASyD,IAAIqT,qBAAqB,CAAzB,EAA4B+E,QAArC,CAAd;YACQsJ,WAAR,EAAqB,CAArB;;;OAGE1hB,IAAIqT,qBAAqB,CAAzB,EAA4BgF,SAA5B,KAA0Cpc,SAA7C,EAAwD;YAC/CylB,WAAR,EAAqB,CAArB;SACKvjB,IAAL,CAAU,KAAK0jB,MAAL,CAAYH,WAAZ,EAAyBvM,KAAzB,EAAgC,IAAhC,CAAV;;;gBAGY6C,IAAb,GAAoBA,IAApB;;UAEO2J,YAAP;;;;yBAGMpN,WAAWY,OAAsB;OAAf2M,KAAe,uEAAP,KAAO;;OACnCzP,IAAI,KAAKzD,KAAb;;;OAGImT,cAAc5U,MAAMoH,SAAN,CAAlB;OACIvU,MAAM,EAAV;;QAEI,IAAI9M,IAAI,CAAZ,EAAeA,IAAImgB,kBAAnB,EAAuCngB,KAAKsiB,QAAQuM,WAAR,EAAqB,CAArB,CAA5C,EAAqE;QAChE/T,SAAS,EAAb;;;QAGIgU,wBAAwBD,eAAe1P,EAAEvX,KAAjB,IAA0BinB,eAAe1P,EAAE4N,GAAvE;;QAEG6B,SAASC,YAAY3N,QAAZ,OAA2Be,KAApC,IAA6C,CAAC6M,qBAAjD,EAAwE;YAChE5J,QAAP,GAAkBpE,YAAY+N,WAAZ,CAAlB;KADD,MAEO;cACG,KAAKE,kBAAL,CAAwBF,WAAxB,CAAT;;QAEG5jB,IAAJ,CAAS6P,MAAT;;;UAGMhO,GAAP;;;;qCAGkB2T,MAAM;OACpByE,WAAWpE,YAAYL,IAAZ,CAAf;OACI0E,YAAY,KAAKtU,IAAL,CAAUqc,UAAV,CAAqBhI,QAArB,CAAhB;OACIpK,SAAS;cACFoK,QADE;eAEDC,aAAa,CAFZ;UAGN,KAAK/f,MAAL,CAAYinB,iBAAiBlH,SAAjB,EAA4B,KAAKzJ,KAAL,CAAWyQ,YAAvC,CAAZ;IAHP;UAKOrR,MAAP;;;;EAxRmCR;;ACV9B,SAAS0U,QAAT,CAAkBne,IAAlB,EAAwBrO,IAAxB,EAA8B;MAC/B8c,MAAL,GAAczO,KAAKyO,MAAL,IAAe,EAA7B;;KAEI2P,gBAAgBpe,KAAKyO,MAAL,CAAYzX,MAAhC;;;KAGI2X,WAAW3O,KAAK2O,QAApB;KACI0P,YAAY,IAAInnB,KAAJ,CAAUknB,aAAV,EAAyBppB,IAAzB,CAA8B,CAA9B,CAAhB;KACG,CAAC2Z,QAAJ,EAAc;;aAEF,CAAC;WACH0P;GADE,CAAX;;;UAKQ3uB,GAAT,CAAa,aAAI;;MAEb,CAACgH,EAAEkN,MAAN,EAAc;KACXA,MAAF,GAAWya,SAAX;GADD,MAEO;;OAEFC,OAAO5nB,EAAEkN,MAAb;UACO0a,KAAK5uB,GAAL,CAAS;WAAQ,CAACuI,MAAM7I,GAAN,CAAD,GAAcA,GAAd,GAAoB,CAA5B;IAAT,CAAP;;;OAGGkvB,KAAKtnB,MAAL,GAAconB,aAAjB,EAAgC;WACxBE,KAAKhlB,KAAL,CAAW,CAAX,EAAc8kB,aAAd,CAAP;IADD,MAEO;WACCxnB,UAAU0nB,IAAV,EAAgBF,gBAAgBE,KAAKtnB,MAArC,EAA6C,CAA7C,CAAP;;KAEC4M,MAAF,GAAW0a,IAAX;;;;MAIE,CAAC5nB,EAAE6nB,SAAN,EAAkB;OACd,CAACtrB,yBAAyB6Q,QAAzB,CAAkCnS,IAAlC,CAAJ,EAA6CA,SAASqB,uBAAT;KAC3CurB,SAAF,GAAc5sB,IAAd;;EArBF;;;;;;KA8BGqO,KAAKwe,QAAR,EAAkB;OACZA,QAAL,CAAc9uB,GAAd,CAAkB,aAAK;OACnBgH,EAAEwlB,GAAF,GAAQxlB,EAAEK,KAAb,EAAoB;eACA,CAACL,EAAEwlB,GAAH,EAAQxlB,EAAEK,KAAV,CADA;MAChBA,KADgB;MACPmlB,GADO;;GADrB;;;QAOMlc,IAAP;;;AAGD,AAAO,SAASye,YAAT,CAAsB5U,QAAtB,EAAgC;KAClCuU,gBAAgBvU,SAAS4E,MAAT,CAAgBzX,MAApC;KACIqnB,YAAY,IAAInnB,KAAJ,CAAUknB,aAAV,EAAyBppB,IAAzB,CAA8B,CAA9B,CAAhB;;KAEO0pB,WAAW;UACH7U,SAAS4E,MAAT,CAAgBnV,KAAhB,CAAsB,CAAtB,EAAyB,CAAC,CAA1B,CADG;YAEDuQ,SAAS8E,QAAT,CAAkBjf,GAAlB,CAAsB,UAACgH,CAAD,EAAO;OAC3BioB,MAD2B,GAChBjoB,CADgB,CAC3BioB,MAD2B;;UAE5B;kBAAA;UAEG,EAFH;YAGKN,UAAU/kB,KAAV,CAAgB,CAAhB,EAAmB,CAAC,CAApB,CAHL;eAIQ5C,EAAE6nB;IAJjB;GAFM;EAFd;;KAaA1U,SAAS+U,QAAZ,EAAsB;WACZA,QAAT,GAAoB,CACnB;UACQ,CADR;UAEQ;GAHW,CAApB;;;KAQE/U,SAAS2U,QAAZ,EAAsB;WACZA,QAAT,GAAoB,CACnB;UACQ,CADR;QAEM,CAFN;UAGQ;GAJW,CAApB;;;QASME,QAAP;;;AAGD,AAAO,SAASG,kBAAT,CAA4BC,UAA5B,EAAkE;KAA1BrQ,MAA0B,uEAAnB,EAAmB;KAAfsQ,QAAe,uEAAN,IAAM;;KACpEC,eAAeF,aAAarQ,OAAOzX,MAAvC;KACGgoB,gBAAgB,CAAnB,EAAsBA,eAAe,CAAf;KAClBC,iBAAiBD,eAAeprB,kBAApC;;KAEIsrB,uBAAJ;KACGH,QAAH,EAAa;;MAERI,iBAAiBjrB,KAAK0kB,GAAL,+BAAYnK,OAAO/e,GAAP,CAAW;UAAS8J,MAAMxC,MAAf;GAAX,CAAZ,EAArB;mBACiB9C,KAAK0c,IAAL,CAAUuO,iBAAeF,cAAzB,CAAjB;;;KAGG5L,aAAa5E,OAAO/e,GAAP,CAAW,UAAC8J,KAAD,EAAQrK,CAAR,EAAc;WAChC,EAAT;MACGqK,MAAMxC,MAAN,GAAeioB,cAAlB,EAAkC;;OAE9B,CAACF,QAAJ,EAAc;QACVE,iBAAe,CAAf,GAAmB,CAAtB,EAAyB;aAChBzlB,MAAMF,KAAN,CAAY,CAAZ,EAAe2lB,iBAAe,CAA9B,IAAmC,MAA3C;KADD,MAEO;aACEzlB,MAAMF,KAAN,CAAY,CAAZ,EAAe2lB,cAAf,IAAiC,IAAzC;;IAJF,MAMO;QACH9vB,IAAI+vB,cAAJ,KAAuB,CAA1B,EAA6B;aACpB,EAAR;;;;SAII1lB,KAAP;EAhBgB,CAAjB;;QAmBO6Z,UAAP;;;ICtHoB+L;;;oBACR9qB,MAAZ,EAAoB8J,IAApB,EAA0B;;;mHACnB9J,MADmB,EACX8J,IADW;;QAGpBwX,UAAL,GAAkBxX,KAAKwX,UAAL,IAAmB,EAArC;QACKyJ,WAAL,GAAmBjhB,KAAKihB,WAAL,IAAoB,EAAvC;;QAEK1tB,IAAL,GAAYyM,KAAKzM,IAAL,IAAa,MAAzB;QACKsa,IAAL,GAAY,CAAZ;;QAEKnX,KAAL;;;;;;gCAGa;OACV,KAAKkL,IAAL,CAAU2O,QAAV,CAAmB3X,MAAnB,IAA6B,CAAhC,EAAmC;SAC7BiT,MAAL,CAAYS,UAAZ,GAAyB,CAAzB;SACKL,QAAL,CAAc9X,QAAd,CAAuB5B,MAAvB,GAAgC,EAAhC;;;;;4BAIQ6P,SAAS;kHACIA,OAAhB;8BAC6BA,OAFjB,CAEJ8e,WAFI;OAEJA,WAFI,wCAEU,EAFV;;cAGaA,eAAe,EAH5B;OAGJC,KAHI,QAGJA,KAHI;OAGG7E,KAHH,QAGGA,KAHH;;WAKJvM,cAAR,GAAyB3N,QAAQ2N,cAAR,IAA0B,EAAnD;;QAEKlE,MAAL,CAAYuV,SAAZ,GAAwBD,QAAQA,MAAMC,SAAd,GAA0BF,YAAYE,SAAZ,IAAyB,MAA3E;;;;;OAKI9E,SAASA,MAAM1jB,MAAnB,EAA2B;SAClBiT,MAAL,CAAYwV,WAAZ,GAA0B/E,MAAMhrB,GAAN,CAAU,UAACojB,IAAD,EAAU;YACnC;iBACQA,KAAK4M,SADb;UAEC5M,KAAK6M,EAFN;gBAGO7M,KAAKxR,QAHZ;aAIIwR,KAAK1d;MAJhB;KADsB,CAA1B;IADJ,MASO;SACE6U,MAAL,CAAYyV,SAAZ,GAAwBhF,QAAQA,MAAMgF,SAAd,GAA0BJ,YAAYI,SAAZ,IAAyB,MAA3E;;;QAGLhF,MAAMiF,EAAN,IAAYjF,MAAMpZ,QAAtB,EAAgC;UAC1B2I,MAAL,CAAYwV,WAAZ,GAA0B,CAAC/E,KAAD,CAA1B;;;;QAISzQ,MAAL,CAAY2V,SAAZ,GAAwBN,YAAYM,SAAZ,IAAyB,CAAjD;QACK3V,MAAL,CAAY4V,mBAAZ,GAAkCP,YAAYO,mBAAZ,IAAmC,CAArE;;QAEK5V,MAAL,CAAY6V,cAAZ,GAA6Btf,QAAQ2N,cAAR,CAAuB2R,cAApD;QACK7V,MAAL,CAAYiE,cAAZ,GAA6B1N,QAAQ2N,cAAR,CAAuBD,cAApD;;QAEKjE,MAAL,CAAYoL,gBAAZ,GAA+B7U,QAAQ6U,gBAAvC;;;;gCAGqB;OAAhBrV,IAAgB,uEAAX,KAAKA,IAAM;;UACpBme,SAASne,IAAT,EAAe,KAAKrO,IAApB,CAAP;;;;qCAGgC;OAAhBqO,IAAgB,uEAAX,KAAKA,IAAM;;UACzBye,aAAaze,IAAb,CAAP;;;;yBAG6B;OAAzBgM,eAAyB,uEAAP,KAAO;;QACxB+T,cAAL;OACG,CAAC/T,eAAJ,EAAqB;SACfgU,mBAAL,CAAyB,KAAKC,aAAL,EAAzB,EAA+C,KAAKtuB,IAAL,KAAc,MAA7D;;QAEIuuB,eAAL;;;;mCAGgB;OACZ5R,IAAI,KAAKzD,KAAb;OACI4D,SAAS,KAAKzO,IAAL,CAAUyO,MAAvB;KACE2P,aAAF,GAAkB3P,OAAOzX,MAAzB;;KAEEmpB,SAAF,GAAc,KAAKrqB,KAAL,GAAYwY,EAAE8P,aAA5B;;KAEEgC,OAAF,GAAY9R,EAAE6R,SAAF,GAAY,CAAxB;;;;;;KAMEZ,KAAF,GAAU;YACD9Q,MADC;eAEEA,OAAO/e,GAAP,CAAW,UAACgH,CAAD,EAAIvH,CAAJ;YACrBsH,SAAS6X,EAAE8R,OAAF,GAAYjxB,IAAImf,EAAE6R,SAA3B,CADqB;KAAX;IAFZ;;;;sCASsBE,YAAmC;;;OAAvB3G,WAAuB,uEAAT,OAAS;;OAC/CS,aAAJ;OAAUQ,wBAAV;OAA2B2F,uBAA3B;OAA2CznB,iBAA3C;OAAqDka,kBAArD;OAAgEwN,0BAAhE;OAAmFC,uBAAnF;uBACc,KAAKvW,MAAL,CAAYyV,SAAZ,IAAyB,EAA7C;oBACiBa,kBAAkBjf,QAAlB,GAA6Bif,kBAAkBjf,QAA/C,GAA0D,MAA3E;;;OAGU+e,sBAAsBnpB,KAA1B,EAAiC;WACtBuiB,mBAAmB4G,UAAnB,EAA+B3G,WAA/B,CAAP;sBACkB,KAAK5gB,MAAL,GAAc0hB,cAAcL,IAAd,CAAhC;qBACiBG,gBAAgBH,IAAhB,IAAwBQ,eAAzC;eACW,KAAK7hB,MAAL,GAAcohB,aAAaC,IAAb,IAAqBmG,cAA9C;;SAEKzV,KAAL,CAAW6P,KAAX,GAAmB;aACPP,IADO;gBAEJA,KAAKzqB,GAAL,CAAS,UAACgH,CAAD;aAAOmC,WAAWnC,IAAIikB,eAAtB;MAAT,CAFI;YAGpB4F,kBAAkBnrB,KAAlB,IAA2B,IAHP;UAItBorB,cAJsB;sBAKE7F,eALF;eAML9hB;KANd;IANJ,MAcO;SACEgS,KAAL,CAAW6P,KAAX,GAAmB,EAAnB;;+BACSniB,GAFN;SAGO+b,YAAY+L,WAAW9nB,GAAX,CAAlB;yBACQ,OAAK0R,MAAL,CAAYwV,WAAZ,CAAwBgB,IAAxB,CAA6B,UAAC3N,IAAD;aAAUva,QAAQua,KAAK6M,EAAvB;MAA7B,KAA2D,EAA/E;sBACiBY,kBAAkBjf,QAAlB,GAA6Bif,kBAAkBjf,QAA/C,GAA0D,MAA3E;YACmBmY,mBAAmBnF,SAAnB,EAA8BoF,WAA9B,CAAP;uBACkB,OAAK5gB,MAAL,GAAc0hB,cAAcL,IAAd,CAAhC;sBACiBG,gBAAgBH,IAAhB,IAAwBQ,eAAzC;gBACW,OAAK7hB,MAAL,GAAcohB,aAAaC,IAAb,IAAqBmG,cAA9C;iBACYnG,KAAKzqB,GAAL,CAAS,UAACgH,CAAD;aAAOmC,WAAWnC,IAAIikB,eAAtB;MAAT,CAAZ;;SAEI,OAAK9P,KAAL,CAAW6P,KAAX,CAAiB1jB,MAAjB,GAA0B,CAA9B,EAAiC;UACvB0pB,YAAY,EAAlB;UACMC,WAAW,OAAK9V,KAAL,CAAW6P,KAAX,CAAiB,CAAjB,CAAjB;;eAES3H,SAAT,CAAmB7H,OAAnB,CAA2B,UAACxJ,GAAD,EAAS;iBACtBtH,IAAV,CAAelG,KAAK0c,IAAL,CAAUlP,MAAMiZ,eAAhB,CAAf;OADJ;aAGO+F,UAAUzlB,OAAV,EAAP;iBACW,OAAKnC,MAAL,GAAcohB,aAAaC,IAAb,IAAqBmG,cAA9C;kBACYK,SAAS5N,SAArB;;;YAGClI,KAAL,CAAW6P,KAAX,CAAiBtgB,IAAjB,CAAsB;cACV7B,OAAO,WADG;cAEV4hB,IAFU;aAGXoG,kBAAkBnrB,KAHP;WAIborB,cAJa;sCAAA;wBAAA;;MAAtB;;;SAtBC,IAAIjoB,GAAT,IAAgB8nB,UAAhB,EAA4B;WAAnB9nB,GAAmB;;;;;QAmC3BqoB,iBAAL;QACKC,aAAL;QACKC,YAAL;;;;sCAGgB;OACZxS,IAAI,KAAKzD,KAAb;OACIkW,WAAW,SAAXA,QAAW,CAACnd,MAAD,EAAS+b,EAAT,EAAgB;WACpB/b,OAAOlU,GAAP,CAAW,UAACN,GAAD,EAAS;SACjBsrB,KADiB,GACPpM,CADO,CACjBoM,KADiB;;;SAGnBA,iBAAiBxjB,KAArB,EAA4B;cAC/BwjB,MAAM1jB,MAAN,GAAe,CAAf,GAAmB0jB,MAAM+F,IAAN,CAAW,UAACO,IAAD;cAAUrB,OAAOqB,KAAKrC,MAAtB;OAAX,CAAnB,GAA8DrQ,EAAEoM,KAAF,CAAQ,CAAR,CAAtE;;;YAGkBD,MAAMrrB,GAAN,EAAWsrB,KAAX,CAAP;KAPG,CAAP;IADJ;;KAYEuG,aAAF,GAAkB,CAAlB;KACEtS,QAAF,GAAa,KAAK3O,IAAL,CAAU2O,QAAV,CAAmBjf,GAAnB,CAAuB,UAACgH,CAAD,EAAIvH,CAAJ,EAAU;QACtCyU,SAASlN,EAAEkN,MAAf;QACIsd,eAAexqB,EAAEwqB,YAAF,IAAkB,EAArC;;WAEO;WAECxqB,EAAEL,IAAF,IACAK,EAAEL,IAAF,CAAO8qB,OAAP,CAAe,QAAf,EAAyB,UAACC,IAAD;aACrBA,QAAQ,GAAR,GAAc,OAAd,GAAwBA,QAAQ,GAAR,GAAc,MAAd,GAAuB,MAD1B;MAAzB,CAHD;YAMIjyB,CANJ;eAOOuH,EAAE6nB,SAAF,KAAgB,KAAhB,GAAwBjQ,EAAE2S,aAAF,EAAxB,GAA4C3S,EAAE2S,aAPrD;gBAQQvqB,EAAE6nB,SARV;;aAUK3a,MAVL;iBAWSmd,SAASnd,MAAT,EAAiBlN,EAAEioB,MAAnB,CAXT;SAYCjoB,EAAEioB,MAZH;;mBAcWuC,YAdX;qBAeaH,SAASG,YAAT,EAAuBxqB,EAAEioB,MAAzB;KAfpB;IAJS,CAAb;;;;kCAwBS;OACXrQ,IAAI,KAAKzD,KAAb;OACG,KAAK+K,UAAL,CAAgByL,OAAnB,EAA4B;MACzBC,SAAF,GAAchT,EAAEK,QAAF,CAAWL,EAAEK,QAAF,CAAW3X,MAAX,GAAoB,CAA/B,EAAkCuqB,cAAhD;;;KAGCD,SAAF,GAAc,IAAIpqB,KAAJ,CAAUoX,EAAE8P,aAAZ,EAA2BppB,IAA3B,CAAgC,IAAhC,CAAd;KACE2Z,QAAF,CAAWjf,GAAX,CAAe,aAAK;MACjBglB,UAAF,CAAahlB,GAAb,CAAiB,UAACgS,GAAD,EAAM1P,CAAN,EAAY;SACzB0P,MAAM4M,EAAEgT,SAAF,CAAYtvB,CAAZ,CAAT,EAAyB;QACtBsvB,SAAF,CAAYtvB,CAAZ,IAAiB0P,GAAjB;;KAFF;IADD;;;;iCASc;OACV4M,IAAI,KAAKzD,KAAb;OACG,KAAK7K,IAAL,CAAU4e,QAAb,EAAuB;SACjB/T,KAAL,CAAW+T,QAAX,GAAsB,KAAK5e,IAAL,CAAU4e,QAAV,CAAmBlvB,GAAnB,CAAuB,aAAK;OAC/C4R,QAAF,GAAamZ,MAAM/jB,EAAEf,KAAR,EAAe2Y,EAAEoM,KAAjB,CAAb;SACG,CAAChkB,EAAE8J,OAAN,EAAe9J,EAAE8J,OAAF,GAAY,EAAZ;;;;YAIR9J,CAAP;KANqB,CAAtB;;OASE,KAAKsJ,IAAL,CAAUwe,QAAb,EAAuB;SACjB3T,KAAL,CAAW2T,QAAX,GAAsB,KAAKxe,IAAL,CAAUwe,QAAV,CAAmB9uB,GAAnB,CAAuB,aAAK;OAC/C6jB,QAAF,GAAakH,MAAM/jB,EAAEK,KAAR,EAAeuX,EAAEoM,KAAjB,CAAb;OACElH,MAAF,GAAWiH,MAAM/jB,EAAEwlB,GAAR,EAAa5N,EAAEoM,KAAf,CAAX;SACG,CAAChkB,EAAE8J,OAAN,EAAe9J,EAAE8J,OAAF,GAAY,EAAZ;YACR9J,CAAP;KAJqB,CAAtB;;;;;kCASiB;;;;OACR6B,MAAM,QAAV;OACIipB,YAAY,KAAKvX,MAAL,CAAYwV,WAAZ,GAA0B,IAA1B,GAAiC,KAAjD;OACIgC,gBAAgBD,YAAY,EAAZ,GAAiB,EAArC;;OAEIE,UAAU,SAAVA,OAAU,CAAC5G,GAAD,EAAMvD,QAAN,EAAmB;WACtBuD,IAAIpf,MAAJ,CAAW,UAACC,GAAD,EAAMgmB,GAAN,EAAc;SACxBA,IAAIpK,QAAJ,CAAJ,gCAA0B5b,IAAIgmB,IAAIpK,QAAJ,CAAJ,KAAsB,EAAhD,IAAqDoK,GAArD;YACOhmB,GAAP;KAFG,EAGJ,EAHI,CAAP;IADJ;;OAOIimB,qBAAqB,SAArBA,kBAAqB,CAAC9G,GAAD,EAAS;QAC1B+G,aAAa,IAAI3qB,KAAJ,CAAU,OAAK2T,KAAL,CAAWuT,aAArB,EAAoCppB,IAApC,CAAyC,CAAzC,CAAjB;QACIkW,OAAJ,CAAY,UAACxU,CAAD,EAAIvH,CAAJ,EAAU;SACdyU,SAASkX,IAAI3rB,CAAJ,EAAOyU,MAApB;OACErL,GAAF,IAASspB,aAAaA,WAAWnyB,GAAX,CAAe,UAACoN,CAAD,EAAI3N,CAAJ,EAAU;aACpC2N,IAAI8G,OAAOzU,CAAP,CAAX;MADkB,CAAtB;KAFJ;IAFJ;;OAUI,KAAKymB,UAAL,CAAgByL,OAApB,EAA6B;UACnB,cAAN;;QAEIG,SAAJ,EAAe;SACLM,kBAAkBJ,QAAQ,KAAK1hB,IAAL,CAAU2O,QAAlB,EAA4B,QAA5B,CAAxB;;UAEK,IAAIgQ,MAAT,IAAmBmD,eAAnB,EAAoC;yBACbA,gBAAgBnD,MAAhB,CAAnB;;KAJR,MAMO;wBACgB,KAAK3e,IAAL,CAAU2O,QAA7B;;;;;;OAMJ6S,SAAJ,EAAe;SACNxhB,IAAL,CAAU2O,QAAV,CAAmBzD,OAAnB,CAA2B,UAACxU,CAAD,EAAO;;;;;mBAGhBA,EAAEioB,MAAF,IAAYpmB,GAA1B,IACM,gCAAc7B,EAAEioB,MAAF,IAAYpmB,GAA1B,GAA+B6B,IAA/B,yCAAuC1D,EAAE6B,GAAF,CAAvC,EADN,GAEOkpB,cAAc/qB,EAAEioB,MAAF,IAAYpmB,GAA1B,gCAAqC7B,EAAE6B,GAAF,CAArC,EAFP;KAHJ;IADJ,MAQO;oBACa,KAAKyH,IAAL,CAAU2O,QAAV,CAAmBjf,GAAnB,CAAuB,UAACgH,CAAD,EAAO;YACnCA,EAAE6B,GAAF,CAAP;KADY,CAAhB;;;OAKA,KAAKyH,IAAL,CAAU4e,QAAV,IAAsB,CAAC4C,SAA3B,EAAsC;kBACpBpnB,IAAd,CAAmB,KAAK4F,IAAL,CAAU4e,QAAV,CAAmBlvB,GAAnB,CAAuB,UAACgH,CAAD;YAAOA,EAAEf,KAAT;KAAvB,CAAnB;;;OAGA,KAAKqK,IAAL,CAAUwe,QAAV,IAAsB,CAACgD,SAA3B,EAAsC;SAC7BxhB,IAAL,CAAUwe,QAAV,CAAmB9uB,GAAnB,CAAuB,UAACgH,CAAD,EAAO;mBACZ0D,IAAd,CAAmB,CAAC1D,EAAEwlB,GAAH,EAAQxlB,EAAEK,KAAV,CAAnB;KADJ;;;UAKGyqB,YAAYC,aAAZ,GAA4B,aAAGrqB,MAAH,gCAAaqqB,aAAb,EAAnC;;;;oCAGW;;;OACbnP,mBAAmB,CACtB,CACC,OADD,EAEC;UACO,KAAKrI,MAAL,CAAYuV,SADnB;YAES,KAAK1mB;;IAJf,EAOC,YAAW;QACNwV,IAAI,KAAKzD,KAAb;MACE0U,KAAF,CAAQlM,UAAR,GAAqBwL,mBAAmB,KAAK/oB,KAAxB,EACpBwY,EAAEiR,KAAF,CAAQ9Q,MADY,EACJ,KAAKxE,MAAL,CAAY2V,SADR,CAArB;;WAGOtR,EAAEiR,KAAT;IALD,CAME/R,IANF,CAMO,IANP,CAPD,CADsB,EAiBtB,CACC,UADD,EAEC;WACQ,KAAK1X,KADb;SAEM;IAJP,EAMC,YAAW;WACH,KAAK+U,KAAL,CAAW2T,QAAlB;IADD,CAEEhR,IAFF,CAEO,IAFP,CAND,CAjBsB,CAAvB;;;;OA+BU,KAAKvD,MAAL,CAAYwV,WAAZ,IAA2B,KAAKxV,MAAL,CAAYwV,WAAZ,CAAwBzoB,MAAvD,EAA+D;SACtDiT,MAAL,CAAYwV,WAAZ,CAAwBvU,OAAxB,CAAgC,UAACwP,KAAD,EAAW;sBACtBtgB,IAAjB,CAAsB,CAClB,OADkB,EAElB;YACU,OAAK6P,MAAL,CAAYyV,SADtB;aAEW,OAAK5pB,KAFhB;sBAGoB,OAAKmU,MAAL,CAAY4V,mBAHhC;WAISnF,MAAMpZ,QAAN,IAAkB;MANT,EAQlB,YAAY;aACD,KAAKuJ,KAAL,CAAW6P,KAAlB;MADJ,CAEElN,IAFF,CAEO,MAFP,CARkB,CAAtB;KADJ;IADJ,MAeO;qBACcpT,IAAjB,CAAsB,CAClB,OADkB,EAElB;WACU,KAAK6P,MAAL,CAAYyV,SADtB;YAEW,KAAK5pB,KAFhB;qBAGoB,KAAKmU,MAAL,CAAY4V;KALd,EAOlB,YAAY;YACD,KAAKhV,KAAL,CAAW6P,KAAlB;KADJ,CAEElN,IAFF,CAEO,IAFP,CAPkB,CAAtB;;;OAaNuU,cAAc,KAAKlX,KAAL,CAAW8D,QAAX,CAAoB9K,MAApB,CAA2B;WAAKnN,EAAE6nB,SAAF,KAAgB,KAArB;IAA3B,CAAlB;OACIyD,eAAe,KAAKnX,KAAL,CAAW8D,QAAX,CAAoB9K,MAApB,CAA2B;WAAKnN,EAAE6nB,SAAF,KAAgB,MAArB;IAA3B,CAAnB;;OAEI0D,cAAcF,YAAYryB,GAAZ,CAAgB,aAAK;QACzB6F,QAAQmB,EAAEnB,KAAd;QACI2sB,WAAWxrB,EAAEwrB,QAAF,IAAc3sB,KAA7B;WACF,CACN,aAAa,GAAb,GAAmBmB,EAAEnB,KADf,EAEN;YACQA,KADR;YAEQ,OAAKhB,MAAL,CAAYgB,KAAZ,CAFR;cAGU,OAAKqgB,UAAL,CAAgByL,OAH1B;;;uBAMmB,OAAKpX,MAAL,CAAYoL,gBAN/B;gBAOY,OAAKvc,MAAL,GAAc1F;KATpB,EAWN,YAAW;SACSkb,IAAI,KAAKzD,KAAb;SACM6P,KAFX,GAEqBpM,CAFrB,CAEWoM,KAFX;;SAGShkB,IAAI4X,EAAEK,QAAF,CAAWpZ,KAAX,CAAR;iBAC2BmB,CAJhC,CAIWipB,EAJX;SAIWA,EAJX,yBAIgB,WAJhB;;SAKS0B,UAAU,KAAKzL,UAAL,CAAgByL,OAA9B;;SAEIc,aAAa,KAAKvM,UAAL,CAAgBuM,UAAhB,IAA8BhvB,qBAA/C;SACIyhB,YAAYtG,EAAE6R,SAAF,IAAe,IAAIgC,UAAnB,CAAhB;SACIhT,WAAWyF,aAAayM,UAAU,CAAV,GAAcU,YAAY/qB,MAAvC,CAAf;;;;SAIX0jB,iBAAiBxjB,KAArB,EAA4B;;cAEnBwjB,MAAM1jB,MAAN,GAAe,CAAf,GAAmB0jB,MAAM+F,IAAN,CAAW,UAACO,IAAD;cAAUrB,OAAOqB,KAAKrC,MAAtB;OAAX,CAAnB,GAA8DrQ,EAAEoM,KAAF,CAAQ,CAAR,CAAtE;;;SAIkBhI,aAAapE,EAAEiR,KAAF,CAAQxM,SAAR,CAAkBrjB,GAAlB,CAAsB,UAACkF,CAAD;aAAOA,IAAIggB,YAAY,CAAvB;MAAtB,CAAjB;;SAEI,CAACyM,OAAL,EAAc;mBACG3O,WAAWhjB,GAAX,CAAe,UAACgK,CAAD,EAAO;cACxBA,IAAIyV,WAAW+S,QAAf,GAA0B/S,QAAjC;OADS,CAAb;;;SAKAV,SAAS,IAAIvX,KAAJ,CAAUoX,EAAE8P,aAAZ,EAA2BppB,IAA3B,CAAgC,EAAhC,CAAb;SACI,KAAKiV,MAAL,CAAYoL,gBAAhB,EAAkC;UAC1BgM,WAAW3qB,EAAEnB,KAAF,KAAY+Y,EAAEK,QAAF,CAAW3X,MAAX,GAAoB,CAA/C,EAAkD;gBACrCN,EAAEwqB,YAAX;OADJ,MAEO;gBACMxqB,EAAEkN,MAAX;;;SAGJ+Q,UAAU,IAAIzd,KAAJ,CAAUoX,EAAE8P,aAAZ,EAA2BppB,IAA3B,CAAgC,CAAhC,CAAd;SACIqsB,OAAJ,EAAa;gBACC3qB,EAAEge,UAAF,CAAahlB,GAAb,CAAiB,UAACmF,CAAD,EAAI7C,CAAJ;cAAU6C,IAAI6B,EAAE6qB,cAAF,CAAiBvvB,CAAjB,CAAd;OAAjB,CAAV;;;YAGZ;kBACM0gB,UADN;kBAEMhc,EAAEge,UAFR;eAGGC,OAHH;;cAKElG,MALF;;gBAOIiM,MAAM7hB,QAPV;iBAQK+b,SARL;gBASIzF;MATX;KAxCD,CAmDE3B,IAnDF,CAmDO,MAnDP,CAXM,CAAP;IAHiB,CAAlB;;OAqEU4U,cAAcJ,aAAatyB,GAAb,CAAiB,UAACgH,CAAD,EAAO;QAClCnB,QAAQmB,EAAEnB,KAAd;WACO,CACH,cAAc,GAAd,GAAoBmB,EAAEnB,KADnB,EAEH;YACWA,KADX;YAEW,OAAKhB,MAAL,CAAYgB,KAAZ,CAFX;cAGa,OAAKuN,OAHlB;eAIc,OAAKuc,WAAL,CAAiBzc,QAJ/B;iBAKgB,OAAKyc,WAAL,CAAiBrc,UALjC;aAMY,OAAKqc,WAAL,CAAiB3c,MAN7B;eAOc,OAAK2c,WAAL,CAAiBjK,QAP/B;eAQc,OAAKiK,WAAL,CAAiBlK,QAR/B;;;uBAWsB,OAAKlL,MAAL,CAAYoL;KAb/B,EAeH,YAAY;SACJ/G,IAAI,KAAKzD,KAAb;SACInU,IAAI4X,EAAEK,QAAF,CAAWpZ,KAAX,CAAR;;;SAGMmlB,QAAQpM,EAAEoM,KAAF,CAAQ1jB,MAAR,GACRsX,EAAEoM,KAAF,CAAQ+F,IAAR,CAAa,UAACO,IAAD;aAAUtqB,EAAEipB,EAAF,KAASqB,KAAKrC,MAAxB;MAAb,KAAgDrQ,EAAEoM,KAAF,CAAQ,CAAR,CADxC,GAERpM,EAAEoM,KAFR;;SAII2H,UACA3H,MAAM3H,SAAN,CAAgB,CAAhB,IAAqB2H,MAAM7hB,QAA3B,GACM6hB,MAAM3H,SAAN,CAAgB,CAAhB,CADN,GAEM2H,MAAM7hB,QAHhB;;YAKO;kBACSyV,EAAEiR,KAAF,CAAQxM,SADjB;kBAESrc,EAAEge,UAFX;;cAIKhe,EAAEkN,MAJP;;gBAMOye,OANP;cAOK,KAAKhD,WAAL,CAAiBiD,OAAjB,IAA4BjvB;MAPxC;KAdJ,CAuBEma,IAvBF,CAuBO,MAvBP,CAfG,CAAP;IAFc,CAAlB;;OA4CF+U,gBAAgB,CACnB,CACC,UADD,EAEC;WACQ,KAAKzsB,KADb;SAEM;IAJP,EAMC,YAAW;WACH,KAAK+U,KAAL,CAAW+T,QAAlB;IADD,CAEEpR,IAFF,CAEO,IAFP,CAND,CADmB,CAApB;;sBAamB8E,iBAAiBlb,MAAjB,CAAwB6qB,WAAxB,EAAqCG,WAArC,EAAkDG,aAAlD,CAAnB;;OAEIC,YAAY,CAAC,UAAD,EAAa,UAAb,CAAhB;QACKC,kBAAL,GAA0B,EAA1B;;QAEKpW,UAAL,GAAkB,IAAIW,GAAJ,CAAQsF,iBACxBzO,MADwB,CACjB;WAAQ,CAAC2e,UAAU1e,QAAV,CAAmB1F,KAAK,CAAL,CAAnB,CAAD,IAAgC,OAAKyM,KAAL,CAAWzM,KAAK,CAAL,CAAX,CAAxC;IADiB,EAExB1O,GAFwB,CAEpB,gBAAQ;QACRmmB,YAAYL,gDAAgBpX,IAAhB,EAAhB;QACGA,KAAK,CAAL,EAAQ0F,QAAR,CAAiB,WAAjB,KAAiC1F,KAAK,CAAL,EAAQ0F,QAAR,CAAiB,UAAjB,CAApC,EAAkE;YAC5D2e,kBAAL,CAAwBroB,IAAxB,CAA6Byb,SAA7B;;WAEM,CAACzX,KAAK,CAAL,CAAD,EAAUyX,SAAV,CAAP;IAPwB,CAAR,CAAlB;;;;oCAWiB;;;QACZ6M,WAAL,GAAmB,EAAnB;;OAEIpU,IAAI,KAAKzD,KAAb;OACI8X,UAAU,KAAK1Y,MAAL,CAAY6V,cAA1B;OACI8C,UAAU,KAAK3Y,MAAL,CAAYiE,cAA1B;OACI2U,SAASvU,EAAEiR,KAAF,CAAQ9Q,MAArB;;UAEO/e,GAAP,CAAW,UAAC8J,KAAD,EAAQjE,KAAR,EAAkB;QACxBqO,SAAS,OAAKiH,KAAL,CAAW8D,QAAX,CAAoBjf,GAApB,CAAwB,UAAC+F,MAAD,EAAMtG,CAAN,EAAY;SAC5CwG,QAAQF,OAAImO,MAAJ,CAAWrO,KAAX,CAAZ;YACO;aACCE,OAAIY,IADL;aAECV,KAFD;YAGAF,OAAIif,UAAJ,CAAenf,KAAf,CAHA;aAIC,OAAKhB,MAAL,CAAYpF,CAAZ,CAJD;iBAKKyzB,UAAUA,QAAQjtB,KAAR,CAAV,GAA2BA;MALvC;KAFY,CAAb;;WAWK+sB,WAAL,CAAiBntB,KAAjB,IAA0B;YAClBiE,KADkB;qBAETmpB,UAAUA,QAAQnpB,KAAR,CAAV,GAA2BA,KAFlB;WAGnB8U,EAAEiR,KAAF,CAAQxM,SAAR,CAAkBxd,KAAlB,CAHmB;aAIjBqO,MAJiB;eAKf0K,EAAEgT,SAAF,CAAY/rB,KAAZ;KALX;IAZD;;;;gCAsBa;;;;QAERL,SAAL,CAAeI,gBAAf,CAAgC,WAAhC,EAA6C,UAACuY,CAAD,EAAO;QAC/Czb,IAAI,OAAKiY,QAAb;QACIrb,IAAIc,UAAU,OAAKoF,SAAf,CAAR;QACI4tB,OAAOjV,EAAE8J,KAAF,GAAU3oB,EAAEqB,IAAZ,GAAmBmC,cAAcJ,CAAd,CAA9B;QACI2wB,OAAOlV,EAAE+J,KAAF,GAAU5oB,EAAEiB,GAAvB;;QAEG8yB,OAAO,OAAKjqB,MAAL,GAAc3G,aAAaC,CAAb,CAArB,IACC2wB,OAAQ5wB,aAAaC,CAAb,CADZ,EAC6B;YACvB4wB,mBAAL,CAAyBF,IAAzB;KAFD,MAGO;YACDhX,GAAL,CAAS3W,OAAT;;IAVF;;;;sCAemB2tB,MAAM;OACrBxU,IAAI,KAAKzD,KAAb;OACG,CAACyD,EAAEgT,SAAN,EAAiB;;OAEb/rB,QAAQqlB,kBAAkBkI,IAAlB,EAAwBxU,EAAEiR,KAAF,CAAQxM,SAAhC,EAA2C,IAA3C,CAAZ;OACIxd,SAAS,CAAb,EAAgB;QACX0tB,MAAM,KAAKP,WAAL,CAAiBntB,KAAjB,CAAV;;SAEKuW,GAAL,CAASwK,SAAT,CACC2M,IAAInN,IAAJ,GAAW,KAAKhK,GAAL,CAASjO,MAAT,CAAgBjJ,CAD5B,EAECquB,IAAIC,QAAJ,GAAe,KAAKpX,GAAL,CAASjO,MAAT,CAAgBhJ,CAFhC,EAGC,EAACwB,MAAM4sB,IAAIE,cAAX,EAA2BxtB,OAAO,EAAlC,EAHD,EAICstB,IAAIrf,MAJL,EAKCrO,KALD;;SAQKuW,GAAL,CAASyK,OAAT;;;;;iCAIa;;;OACVjI,IAAI,KAAKtO,IAAb;OACGsO,EAAEK,QAAF,CAAW3X,MAAX,GAAoB,CAAvB,EAA0B;SACpB8V,UAAL,CAAgBmC,WAAhB,GAA8B,EAA9B;MACEN,QAAF,CAAWjf,GAAX,CAAe,UAACgH,CAAD,EAAIvH,CAAJ,EAAU;SACpBggB,WAAWjc,oBAAf;;;SAGInD,OAAOkQ;;gBAEC9Q,CAFD,EAGV,GAHU,EAIVggB,QAJU,EAKV,OAAK5a,MAAL,CAAYpF,CAAZ,CALU,EAMVuH,EAAEL,IANQ,EAOV,OAAK4T,MAAL,CAAYG,eAPF,CAAX;YAQK0C,UAAL,CAAgBzd,WAAhB,CAA4BU,IAA5B;KAZD;;;;;;;;mCAoBY;;;OACV,KAAKkc,IAAR,EAAc;SACRA,IAAL,GAAY,CAAZ;;;OAGE,KAAKmX,aAAR,EAAuB;SACjBA,aAAL,CAAmBlY,OAAnB,CAA2B,aAAK;SAC3Blc,IAAIuN,EAAEiH,OAAV;OACEjU,UAAF,CAAa8Y,WAAb,CAAyBrZ,CAAzB;KAFD;;;QAMIo0B,aAAL,GAAqB,KAAKX,kBAAL,CAAwB/yB,GAAxB,CAA4B,aAAK;WAC9C;WACAoN,EAAE0X,QADF;cAEGtc,SAFH;YAGC4E,EAAE2X;KAHV;IADoB,CAArB;;OAQG,KAAK5J,KAAL,CAAWwY,YAAX,KAA4BnrB,SAA/B,EAA0C;SACpC2S,KAAL,CAAWwY,YAAX,GAA0B,KAAKxY,KAAL,CAAWuT,aAAX,GAA2B,CAArD;;;;QAIIgF,aAAL,CAAmB1zB,GAAnB,CAAuB,aAAK;QACvB4zB,cAAc5sB,EAAE+d,KAAF,CAAQ,OAAK5J,KAAL,CAAWwY,YAAnB,CAAlB;;MAEE7f,OAAF,GAAYN,YAAYxM,EAAE/E,IAAd,EAAoB2xB,WAApB,CAAZ;WACKhX,QAAL,CAAcjd,WAAd,CAA0BqH,EAAE8M,OAA5B;IAJD;;;;wCAQqB;OAClB,KAAK4f,aAAR,EAAuB;SACjBA,aAAL,CAAmBlY,OAAnB,CAA2B,aAAK;SAC3Blc,IAAIuN,EAAEiH,OAAV;OACEjU,UAAF,CAAa8Y,WAAb,CAAyBrZ,CAAzB;KAFD;;;;;gCAOY;;;QACRsF,MAAL,CAAYgB,gBAAZ,CAA6B,aAA7B,EAA4C,YAAM;WAC5CoO,aAAL;IADD;;;;8BAKW;;;QACN+e,kBAAL,CAAwB/yB,GAAxB,CAA4B,aAAK;MAC9B+kB,KAAF,CAAQ/kB,GAAR,CAAY,gBAAQ;UACd4F,gBAAL,CAAsB,OAAtB,EAA+B,YAAM;UAChCC,QAAQ4N,KAAKG,YAAL,CAAkB,kBAAlB,CAAZ;cACKigB,mBAAL,CAAyBhuB,KAAzB;MAFD;KADD;IADD;;;QAUKuW,GAAL,CAAS5W,SAAT,CAAmBI,gBAAnB,CAAoC,OAApC,EAA6C,YAAM;QAC9CC,QAAQ,QAAKuW,GAAL,CAAS5W,SAAT,CAAmBoO,YAAnB,CAAgC,kBAAhC,CAAZ;YACKigB,mBAAL,CAAyBhuB,KAAzB;IAFD;;;;qCAMe;;;QACV6tB,aAAL,CAAmB1zB,GAAnB,CAAuB,aAAK;QACvB4zB,cAAc5sB,EAAE+d,KAAF,CAAQ,QAAK5J,KAAL,CAAWwY,YAAnB,CAAlB;kBACc3sB,EAAE/E,IAAhB,EAAsB2xB,WAAtB,EAAmC5sB,EAAE8M,OAArC;IAFD;;;;gCAMa;QACR+f,mBAAL,CAAyB,KAAK1Y,KAAL,CAAWwY,YAAX,GAA0B,CAAnD;;;;iCAGc;QACTE,mBAAL,CAAyB,KAAK1Y,KAAL,CAAWwY,YAAX,GAA0B,CAAnD;;;;iCAG2C;OAA/B9tB,KAA+B,uEAAzB,KAAKsV,KAAL,CAAWwY,YAAc;;OACvC/U,IAAI,KAAKzD,KAAb;OACI2Y,aAAa;WACTjuB,KADS;WAET+Y,EAAEiR,KAAF,CAAQ9Q,MAAR,CAAelZ,KAAf,CAFS;YAGR+Y,EAAEK,QAAF,CAAWjf,GAAX,CAAe;YAAKgH,EAAEkN,MAAF,CAASrO,KAAT,CAAL;KAAf;IAHT;UAKOiuB,UAAP;;;;sCAGmBjuB,OAAO;OACtB+Y,IAAI,KAAKzD,KAAb;WACQxO,SAAS9G,KAAT,CAAR;OACGA,QAAQ,CAAX,EAAcA,QAAQ,CAAR;OACXA,SAAS+Y,EAAEiR,KAAF,CAAQ9Q,MAAR,CAAezX,MAA3B,EAAmCzB,QAAQ+Y,EAAEiR,KAAF,CAAQ9Q,MAAR,CAAezX,MAAf,GAAwB,CAAhC;OAChCzB,UAAU+Y,EAAE+U,YAAf,EAA6B;KAC3BA,YAAF,GAAiB9tB,KAAjB;QACK,KAAKjB,MAAV,EAAkB,aAAlB,EAAiC,KAAKmvB,YAAL,EAAjC;;;;;;;+BAMYjqB,OAAOkqB,eAA+C;OAAhCnuB,KAAgC,uEAA1B,KAAKsV,KAAL,CAAWuT,aAAe;;qHAC/C5kB,KAAnB,EAA0BkqB,aAA1B,EAAyCnuB,KAAzC;QACKyK,IAAL,CAAUyO,MAAV,CAAiBkV,MAAjB,CAAwBpuB,KAAxB,EAA+B,CAA/B,EAAkCiE,KAAlC;QACKwG,IAAL,CAAU2O,QAAV,CAAmBjf,GAAnB,CAAuB,UAACgH,CAAD,EAAIvH,CAAJ,EAAU;MAC9ByU,MAAF,CAAS+f,MAAT,CAAgBpuB,KAAhB,EAAuB,CAAvB,EAA0BmuB,cAAcv0B,CAAd,CAA1B;IADD;QAGKqd,MAAL,CAAY,KAAKxM,IAAjB;;;;oCAGmD;OAApCzK,KAAoC,uEAA5B,KAAKsV,KAAL,CAAWuT,aAAX,GAAyB,CAAG;;OAC/C,KAAKpe,IAAL,CAAUyO,MAAV,CAAiBzX,MAAjB,IAA2B,CAA/B,EAAkC;;;wHAGZzB,KAAtB;QACKyK,IAAL,CAAUyO,MAAV,CAAiBkV,MAAjB,CAAwBpuB,KAAxB,EAA+B,CAA/B;QACKyK,IAAL,CAAU2O,QAAV,CAAmBjf,GAAnB,CAAuB,aAAK;MACzBkU,MAAF,CAAS+f,MAAT,CAAgBpuB,KAAhB,EAAuB,CAAvB;IADD;QAGKiX,MAAL,CAAY,KAAKxM,IAAjB;;;;gCAGa0jB,eAAwB;OAATnuB,KAAS,uEAAH,CAAG;;QAChCyK,IAAL,CAAU2O,QAAV,CAAmBpZ,KAAnB,EAA0BqO,MAA1B,GAAmC8f,aAAnC;QACKlX,MAAL,CAAY,KAAKxM,IAAjB;;;;;;;iCAKc2O,UAAU;QACnB3O,IAAL,CAAU2O,QAAV,CAAmBjf,GAAnB,CAAuB,UAACgH,CAAD,EAAIvH,CAAJ,EAAU;QAC7Bwf,SAASxf,CAAT,CAAH,EAAgB;OACbyU,MAAF,GAAW+K,SAASxf,CAAT,CAAX;;IAFF;QAKKqd,MAAL,CAAY,KAAKxM,IAAjB;;;;;;;;;EA/tBqCyJ;;ICFlBma;;;qBACRtvB,MAAZ,EAAoB8J,IAApB,EAA0B;;;qHACnB9J,MADmB,EACX8J,IADW;;QAEpBzM,IAAL,GAAY,OAAZ;QACKmZ,WAAL,GAAmB,CAAnB;QACKmB,IAAL,GAAY,CAAZ;;QAEKnX,KAAL;;;;;;4BAGSsJ,MAAM;oHACCA,IAAhB;QACKqY,SAAL,GAAiB,KAAKA,SAAL,CAAejJ,IAAf,CAAoB,IAApB,CAAjB;QACKkJ,UAAL,GAAkB,KAAKA,UAAL,CAAgBlJ,IAAhB,CAAqB,IAArB,CAAlB;;QAEKmJ,UAAL,GAAkBvY,KAAKuY,UAAL,IAAmB,GAArC;QACK1M,MAAL,CAAY2M,UAAZ,GAAyBxY,KAAKwY,UAAL,IAAmB,CAA5C;;QAEK9X,SAAL,GAAiBV,KAAKU,SAAL,IAAkB,KAAnC;QACKL,WAAL,GAAmBL,KAAKK,WAAL,IAAoB,EAAvC;;;;yBAGM;;;;OAEF6P,IAAI,KAAKzD,KAAb;QACKnT,MAAL,GACC,KAAKoB,MAAL,GAAc,KAAKhD,KAAnB,GACG,KAAK+I,MAAL,CAAYjK,CAAZ,GAAgB,KAAK6J,WAAL,GAAmB,CADtC,GAEG,KAAKI,MAAL,CAAYhK,CAAZ,GAAgB,KAAK4J,WAAL,GAAmB,CAHvC;;OAKQ/G,MARF,GAQwB,IARxB,CAQEA,MARF;OAQUoH,SARV,GAQwB,IARxB,CAQUA,SARV;;;OAUA+X,uBAAuBvI,EAAEwI,gBAAF,IAAsB,EAAnD;KACEvE,YAAF,GAAiB,EAAjB;KACEuE,gBAAF,GAAqB,EAArB;OACIC,WAAW,MAAM,KAAK9M,MAAL,CAAY2M,UAAjC;;KAEErI,WAAF,CAAc7e,GAAd,CAAkB,UAACgf,KAAD,EAAQvf,CAAR,EAAc;QACzBynB,aAAaG,QAAnB;QACMC,kBAAmBtI,QAAQJ,EAAEU,UAAX,GAAyB5a,UAAjD;QACM2K,WAAWiY,kBAAkB,GAAlB,GAAwB,CAAxB,GAA2B,CAA5C;QACMC,YAAYnY,YAAY,CAACkY,eAAb,GAA+BA,eAAjD;QACME,WAAWH,WAAWA,WAAWE,SAAvC;QACMtY,gBAAgBnH,mBAAmBof,UAAnB,EAA+Blf,MAA/B,CAAtB;QACMkH,cAAcpH,mBAAmB0f,QAAnB,EAA6Bxf,MAA7B,CAApB;;QAEMyf,eAAe,OAAKlL,IAAL,IAAa4K,qBAAqB1nB,CAArB,CAAlC;;QAEIioB,iBAAJ;QAAaC,eAAb;QACG,OAAKpL,IAAR,EAAc;gBACFkL,eAAeA,aAAaxY,aAA5B,GAA4CA,aAAvD;cACSwY,eAAeA,aAAavY,WAA5B,GAA0CD,aAAnD;KAFD,MAGO;gBACKA,aAAX;cACSC,WAAT;;QAEK0Y,UACLN,oBAAoB,GAApB,GACGzX,oBAAoB6X,QAApB,EAA8BC,MAA9B,EAAsC,OAAKxY,MAA3C,EAAmD,OAAKnH,MAAxD,EAAgE,OAAKoH,SAArE,EAAgFC,QAAhF,CADH,GAEGO,qBAAqB8X,QAArB,EAA+BC,MAA/B,EAAuC,OAAKxY,MAA5C,EAAoD,OAAKnH,MAAzD,EAAiE,OAAKoH,SAAtE,EAAiFC,QAAjF,CAHJ;;MAKEwT,YAAF,CAAenY,IAAf,CAAoBkd,OAApB;MACER,gBAAF,CAAmB1c,IAAnB,CAAwB;iCAAA;6BAAA;YAGhBsU,KAHgB;YAIhBJ,EAAEU,UAJc;2BAAA;uBAAA;YAOhBiI;KAPR;IAzBD;QAoCKhL,IAAL,GAAY,CAAZ;;;;oCAGiB;OACbqC,IAAI,KAAKzD,KAAb;;OAEIyH,mBAAmB,CACtB,CACC,aADD,EAEC,EAFD,EAGC,YAAW;WACH;mBACQhE,EAAEiE,YADV;aAEE,KAAKhe,MAFP;kBAGO,KAAKkK;KAHnB;IADD,CAME+O,IANF,CAMO,IANP,CAHD,CADsB,CAAvB;;QAcKnB,UAAL,GAAkB,IAAIW,GAAJ,CAAQsF,iBACxB5iB,GADwB,CACpB,gBAAQ;QACRmmB,YAAYL,gDAAgBpX,IAAhB,EAAhB;WACO,CAACA,KAAK,CAAL,CAAD,EAAUyX,SAAV,CAAP;IAHwB,CAAR,CAAlB;;;;sCAOmB0B,UAAS;OACrB7f,MADqB,GACE,IADF,CACrBA,MADqB;OACbif,UADa,GACE,IADF,CACbA,UADa;;OAEtBrV,WAAW9J,mBAAmB+f,SAASX,UAAT,GAAqBW,SAAS9f,KAAT,GAAiB,CAAzD,EAA4DC,MAA5D,CAAjB;2BACuB4J,SAAS1M,CAAV,GAAe+hB,UAArC,WAAsDrV,SAASzM,CAAV,GAAe8hB,UAApE;;;;6BAGUhU,MAAKxT,GAAEqoB,MAAK3J,GAAE;OACrB,CAAClL,IAAJ,EAAU;OACJjN,QAAQ,KAAKnB,MAAL,CAAYpF,CAAZ,CAAd;OACGqoB,IAAH,EAAS;cACE7U,IAAV,EAAgB,KAAK8U,mBAAL,CAAyB,KAAK5M,KAAL,CAAWiM,gBAAX,CAA4B3nB,CAA5B,CAAzB,CAAhB;SACKQ,KAAL,CAAW6O,MAAX,GAAoBzC,mBAAmBrG,KAAnB,EAA0B,EAA1B,CAApB;QACIgiB,QAAQ5nB,UAAU,KAAKqZ,GAAf,CAAZ;QACIvU,IAAIiZ,EAAE8J,KAAF,GAAUD,MAAMrnB,IAAhB,GAAuB,EAA/B;QACIwE,IAAIgZ,EAAE+J,KAAF,GAAUF,MAAMznB,GAAhB,GAAsB,EAA9B;QACImF,QAAQ,CAAC,KAAKyiB,gBAAL,IAAyB,KAAKA,gBAAL,CAAsB7gB,MAAtB,GAA+B,CAAxD,GACV,KAAK6gB,gBAAL,CAAsB1oB,CAAtB,CADU,GACiB,KAAK0b,KAAL,CAAW4D,MAAX,CAAkBtf,CAAlB,CADlB,IAC0C,IADtD;QAEI2oB,UAAU,CAAC,KAAKjN,KAAL,CAAW0D,WAAX,CAAuBpf,CAAvB,IAA4B,GAA5B,GAAkC,KAAK0b,KAAL,CAAWmE,UAA9C,EAA0DrY,OAA1D,CAAkE,CAAlE,CAAd;SACKmV,GAAL,CAASwK,SAAT,CAAmB1hB,CAAnB,EAAsBC,CAAtB,EAAyB,EAACwB,MAAMjB,KAAP,EAAcO,OAAOmiB,UAAU,GAA/B,EAAzB;SACKhM,GAAL,CAASyK,OAAT;IAVD,MAWO;cACI5T,IAAV,EAAe,oBAAf;SACKmJ,GAAL,CAAS3W,OAAT;SACKxF,KAAL,CAAW6O,MAAX,GAAoB9I,KAApB;;;;;gCAIY;QACRR,SAAL,CAAeI,gBAAf,CAAgC,WAAhC,EAA6C,KAAKmhB,SAAlD;QACKvhB,SAAL,CAAeI,gBAAf,CAAgC,YAAhC,EAA8C,KAAKohB,UAAnD;;;;4BAGS7I,GAAE;OACLnc,SAASmc,EAAEnc,MAAjB;OACIqmB,SAAS,KAAK1L,UAAL,CAAgB2J,GAAhB,CAAoB,aAApB,EAAmC7D,KAAhD;OACI6F,YAAY,KAAKC,mBAArB;OACIC,aAAa,KAAKC,cAAtB;OACGJ,OAAOjU,QAAP,CAAgBpS,MAAhB,CAAH,EAA4B;QACvBvC,IAAI4oB,OAAO9B,OAAP,CAAevkB,MAAf,CAAR;SACK0mB,UAAL,CAAgBF,UAAhB,EAA4BF,SAA5B,EAAsC,KAAtC;SACKG,cAAL,GAAsBzmB,MAAtB;SACKumB,mBAAL,GAA2B9oB,CAA3B;SACKipB,UAAL,CAAgB1mB,MAAhB,EAAwBvC,CAAxB,EAA2B,IAA3B,EAAiC0e,CAAjC;IALD,MAMO;SACD6I,UAAL;;;;;+BAIU;QACN0B,UAAL,CAAgB,KAAKD,cAArB,EAAoC,KAAKF,mBAAzC,EAA6D,KAA7D;;;;EArJsChK;;ACAxC,IAAM4V,aAAa;MACbzE,SADa;OAEZA,SAFY;;aAINzJ,eAJM;UAKTgG,OALS;MAMbnF,QANa;QAOXoN;CAPR;;AAUA,SAASE,cAAT,GAA6D;KAArCvF,SAAqC,uEAAzB,MAAyB;KAAjBjqB,MAAiB;KAATkM,OAAS;;KACxD+d,cAAc,YAAlB,EAAgC;UACvB5sB,IAAR,GAAe,MAAf;SACO,IAAIytB,SAAJ,CAAc9qB,MAAd,EAAsBkM,OAAtB,CAAP;;;KAGG,CAACqjB,WAAWtF,SAAX,CAAL,EAA4B;UACnBtR,KAAR,CAAc,2BAA2BsR,SAAzC;;;;QAIM,IAAIsF,WAAWtF,SAAX,CAAJ,CAA0BjqB,MAA1B,EAAkCkM,OAAlC,CAAP;;;IAGKujB,QACL,eAAYzvB,MAAZ,EAAoBkM,OAApB,EAA6B;;;QACrBsjB,eAAetjB,QAAQ7O,IAAvB,EAA6B2C,MAA7B,EAAqCkM,OAArC,CAAP;;;AAIF;;;;;;;;;;ACrCA,IAAIwjB,SAAa,EAAjB;;AAEAA,OAAOC,IAAP,GAAiB,eAAjB;AACAD,OAAOE,OAAP,GAAiB,OAAjB;;AAEAF,SAAiB1O,OAAOI,MAAP,CAAc,EAAd,EAAmBsO,MAAnB,EAA2BG,MAA3B,CAAjB;;AAEA,eAAeH,MAAf;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t\n\t\t\t\t
`\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/charts/AxisChart.js b/src/js/charts/AxisChart.js index 4a1c325..1effd78 100644 --- a/src/js/charts/AxisChart.js +++ b/src/js/charts/AxisChart.js @@ -54,7 +54,7 @@ export default class AxisChart extends BaseChart { this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; // if we have yAxis config settings lets populate a yAxis config array. - if (yAxis.id && yAxis.position) { + if (yAxis && yAxis.id && yAxis.position) { this.config.yAxisConfig = [yAxis] } } @@ -107,7 +107,8 @@ export default class AxisChart extends BaseChart { calcYAxisParameters(dataValues, withMinimum = 'false') { - let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment; + let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys; + yKeys = []; yAxisConfigObject = this.config.yAxisMode || {}; yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; @@ -137,11 +138,17 @@ export default class AxisChart extends BaseChart { intervalHeight = getIntervalSize(yPts) * scaleMultiplier; zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; positions = yPts.map((d) => zeroLine - d * scaleMultiplier); + yKeys.push(key); if (this.state.yAxis.length > 1) { const yPtsArray = []; const firstArr = this.state.yAxis[0]; + + // we need to calculate the scaleMultiplier. + + // now that we have an accurate scaleMultiplier we can // we need to loop through original positions. + scaleMultiplier = this.height / getValueRange(yPts); firstArr.positions.forEach((pos) => { yPtsArray.push(Math.ceil(pos / scaleMultiplier)); }); @@ -160,6 +167,32 @@ export default class AxisChart extends BaseChart { positions }); } + + // the labels are not aligned in length between the two yAxis objects, + // we need to run some new calculations. + if (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) { + const newYptsArr = []; + // find the shorter array + const shortest = this.state.yAxis.reduce((p,c) => { + return p.length > c.labels.length ? c : p; + }, + { length: Infinity }); + // return the longest + const longest = this.state.yAxis.reduce((p,c) => { + return p.length < c.labels.length ? p : c; + }, + { length: Infinity }); + + // we now need to populate the shortest obj with the new scale multiplier + // with the positions of the longest obj. + longest.positions.forEach((pos) => { + // calculate a new yPts + newYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier)); + }); + + shortest.labels = newYptsArr.reverse(); + shortest.positions = longest.positions; + } } // Dependent if above changes