From 60e0525187f28d582e2a40d44aced7db3fd602f4 Mon Sep 17 00:00:00 2001 From: jos Date: Fri, 28 Nov 2014 15:33:56 +0100 Subject: [PATCH 1/6] Fixed another bug related to overflowing contents (#459) --- lib/timeline/component/css/item.css | 2 +- lib/timeline/component/item/RangeItem.js | 18 +++++++++++++----- test/timeline.html | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/timeline/component/css/item.css b/lib/timeline/component/css/item.css index d5826f33..bdc67340 100644 --- a/lib/timeline/component/css/item.css +++ b/lib/timeline/component/css/item.css @@ -47,7 +47,6 @@ border-style: solid; border-radius: 2px; box-sizing: border-box; - overflow: hidden; } .vis.timeline .item.background { @@ -62,6 +61,7 @@ .vis.timeline .item.range .content { position: relative; display: inline-block; + max-width: 100%; overflow: hidden; } diff --git a/lib/timeline/component/item/RangeItem.js b/lib/timeline/component/item/RangeItem.js index 206017e9..d3964652 100644 --- a/lib/timeline/component/item/RangeItem.js +++ b/lib/timeline/component/item/RangeItem.js @@ -103,8 +103,12 @@ RangeItem.prototype.redraw = function() { this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; // recalculate size + // turn off max-width to be able to calculate the real width + // this causes an extra browser repaint/reflow, but so be it + this.dom.content.style.maxWidth = 'none'; this.props.content.width = this.dom.content.offsetWidth; this.height = this.dom.box.offsetHeight; + this.dom.content.style.maxWidth = ''; this.dirty = false; } @@ -175,7 +179,7 @@ RangeItem.prototype.repositionX = function() { else { this.left = start; this.width = boxWidth; - contentWidth = Math.min(end - start, this.props.content.width); + contentWidth = Math.min(end - start - 2 * this.options.padding, this.props.content.width); } this.dom.box.style.left = this.left + 'px'; @@ -195,15 +199,19 @@ RangeItem.prototype.repositionX = function() { break; default: // 'auto' + // when range exceeds left of the window, position the contents at the left of the visible area if (this.overflow) { - // when range exceeds left of the window, position the contents at the left of the visible area - contentLeft = Math.max(-start, 0); + if (end > 0) { + contentLeft = Math.max(-start, 0); + } + else { + contentLeft = -contentWidth; // ensure it's not visible anymore + } } else { - // when range exceeds left of the window, position the contents at the left of the visible area if (start < 0) { contentLeft = Math.min(-start, - (end - start - this.props.content.width - 2 * this.options.padding)); + (end - start - contentWidth - 2 * this.options.padding)); // TODO: remove the need for options.padding. it's terrible. } else { diff --git a/test/timeline.html b/test/timeline.html index 020ffd1e..cd8ae25c 100644 --- a/test/timeline.html +++ b/test/timeline.html @@ -75,7 +75,7 @@ '
Click here! (div)
', start: now.clone().add(-2, 'days').toDate() }, {_id: 3, content: 'item 3', start: now.clone().add(2, 'days').toDate(), style: 'color: red;'}, { - _id: 4, content: 'item 4 ', + _id: 4, content: 'item 4 foo bar foo bar foo bar foo bar foo bar', start: now.clone().add(0, 'days').toDate(), end: now.clone().add(7, 'days').toDate(), title: 'hello title!' From 9b8f4bb4b6915901b4d99fe0c2e03f0648b5a847 Mon Sep 17 00:00:00 2001 From: jos Date: Fri, 28 Nov 2014 15:40:39 +0100 Subject: [PATCH 2/6] Released version 3.7.1 --- HISTORY.md | 4 +- bower.json | 2 +- dist/vis.css | 2 +- dist/vis.js | 52505 +++++++++++++++++++++++---------------------- dist/vis.map | 2 +- dist/vis.min.css | 2 +- dist/vis.min.js | 24 +- package.json | 2 +- 8 files changed, 26315 insertions(+), 26228 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index a53cb488..63211d5b 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,7 +2,7 @@ http://visjs.org -## not yet released, version 3.7.1 +## 2014-11-28, version 3.7.1 ### Timeline @@ -19,7 +19,7 @@ http://visjs.org - Added `alignZeros` option to dataAxis with default value true. - Fixed bug with points drawn on bargraphs - Fixed docs -- Fixed height increase on scolling if only graphHeight is defined. +- Fixed height increase on scrolling if only `graphHeight` is defined. ### Network diff --git a/bower.json b/bower.json index f6db3ffb..53e6868f 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "vis", - "version": "3.7.1-SNAPSHOT", + "version": "3.7.1", "main": ["dist/vis.min.js", "dist/vis.min.css"], "description": "A dynamic, browser-based visualization library.", "homepage": "http://visjs.org/", diff --git a/dist/vis.css b/dist/vis.css index c028130a..529a17fb 100644 --- a/dist/vis.css +++ b/dist/vis.css @@ -214,7 +214,6 @@ border-style: solid; border-radius: 2px; box-sizing: border-box; - overflow: hidden; } .vis.timeline .item.background { @@ -229,6 +228,7 @@ .vis.timeline .item.range .content { position: relative; display: inline-block; + max-width: 100%; overflow: hidden; } diff --git a/dist/vis.js b/dist/vis.js index 62243b01..367d9a21 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -4,7 +4,7 @@ * * A dynamic, browser-based visualization library. * - * @version 3.7.1-SNAPSHOT + * @version 3.7.1 * @date 2014-11-28 * * @license @@ -81,67 +81,67 @@ return /******/ (function(modules) { // webpackBootstrap // utils exports.util = __webpack_require__(1); - exports.DOMutil = __webpack_require__(6); + exports.DOMutil = __webpack_require__(2); // data - exports.DataSet = __webpack_require__(7); - exports.DataView = __webpack_require__(9); - exports.Queue = __webpack_require__(8); + exports.DataSet = __webpack_require__(3); + exports.DataView = __webpack_require__(4); + exports.Queue = __webpack_require__(5); // Graph3d - exports.Graph3d = __webpack_require__(10); + exports.Graph3d = __webpack_require__(6); exports.graph3d = { - Camera: __webpack_require__(14), - Filter: __webpack_require__(15), - Point2d: __webpack_require__(13), - Point3d: __webpack_require__(12), - Slider: __webpack_require__(16), - StepNumber: __webpack_require__(17) + Camera: __webpack_require__(7), + Filter: __webpack_require__(8), + Point2d: __webpack_require__(9), + Point3d: __webpack_require__(10), + Slider: __webpack_require__(11), + StepNumber: __webpack_require__(12) }; // Timeline - exports.Timeline = __webpack_require__(18); - exports.Graph2d = __webpack_require__(42); + exports.Timeline = __webpack_require__(13); + exports.Graph2d = __webpack_require__(14); exports.timeline = { - DateUtil: __webpack_require__(24), - DataStep: __webpack_require__(45), - Range: __webpack_require__(21), - stack: __webpack_require__(28), - TimeStep: __webpack_require__(38), + DateUtil: __webpack_require__(15), + DataStep: __webpack_require__(16), + Range: __webpack_require__(17), + stack: __webpack_require__(18), + TimeStep: __webpack_require__(19), components: { items: { - Item: __webpack_require__(30), - BackgroundItem: __webpack_require__(34), - BoxItem: __webpack_require__(32), - PointItem: __webpack_require__(33), - RangeItem: __webpack_require__(29) + Item: __webpack_require__(31), + BackgroundItem: __webpack_require__(32), + BoxItem: __webpack_require__(33), + PointItem: __webpack_require__(34), + RangeItem: __webpack_require__(35) }, - Component: __webpack_require__(23), - CurrentTime: __webpack_require__(39), - CustomTime: __webpack_require__(41), - DataAxis: __webpack_require__(44), - GraphGroup: __webpack_require__(46), - Group: __webpack_require__(27), - BackgroundGroup: __webpack_require__(31), - ItemSet: __webpack_require__(26), - Legend: __webpack_require__(50), - LineGraph: __webpack_require__(43), - TimeAxis: __webpack_require__(37) + Component: __webpack_require__(20), + CurrentTime: __webpack_require__(21), + CustomTime: __webpack_require__(22), + DataAxis: __webpack_require__(23), + GraphGroup: __webpack_require__(24), + Group: __webpack_require__(25), + BackgroundGroup: __webpack_require__(26), + ItemSet: __webpack_require__(27), + Legend: __webpack_require__(28), + LineGraph: __webpack_require__(29), + TimeAxis: __webpack_require__(30) } }; // Network - exports.Network = __webpack_require__(51); + exports.Network = __webpack_require__(36); exports.network = { - Edge: __webpack_require__(57), - Groups: __webpack_require__(54), - Images: __webpack_require__(55), - Node: __webpack_require__(56), - Popup: __webpack_require__(58), - dotparser: __webpack_require__(52), - gephiParser: __webpack_require__(53) + Edge: __webpack_require__(37), + Groups: __webpack_require__(38), + Images: __webpack_require__(39), + Node: __webpack_require__(40), + Popup: __webpack_require__(41), + dotparser: __webpack_require__(42), + gephiParser: __webpack_require__(43) }; // Deprecated since v3.0.0 @@ -150,8 +150,8 @@ return /******/ (function(modules) { // webpackBootstrap }; // bundled external libraries - exports.moment = __webpack_require__(2); - exports.hammer = __webpack_require__(19); + exports.moment = __webpack_require__(44); + exports.hammer = __webpack_require__(45); /***/ }, @@ -162,7 +162,7 @@ return /******/ (function(modules) { // webpackBootstrap // first check if moment.js is already loaded in the browser window, if so, // use this instance. Else, load via commonjs. - var moment = __webpack_require__(2); + var moment = __webpack_require__(44); /** * Test whether given object is a number @@ -1470,31701 +1470,31897 @@ return /******/ (function(modules) { // webpackBootstrap /* 2 */ /***/ function(module, exports, __webpack_require__) { - // first check if moment.js is already loaded in the browser window, if so, - // use this instance. Else, load via commonjs. - module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(3); + // DOM utility methods + + /** + * this prepares the JSON container for allocating SVG elements + * @param JSONcontainer + * @private + */ + exports.prepareElements = function(JSONcontainer) { + // cleanup the redundant svgElements; + for (var elementType in JSONcontainer) { + if (JSONcontainer.hasOwnProperty(elementType)) { + JSONcontainer[elementType].redundant = JSONcontainer[elementType].used; + JSONcontainer[elementType].used = []; + } + } + }; + + /** + * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from + * which to remove the redundant elements. + * + * @param JSONcontainer + * @private + */ + exports.cleanupElements = function(JSONcontainer) { + // cleanup the redundant svgElements; + for (var elementType in JSONcontainer) { + if (JSONcontainer.hasOwnProperty(elementType)) { + if (JSONcontainer[elementType].redundant) { + for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) { + JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]); + } + JSONcontainer[elementType].redundant = []; + } + } + } + }; + + /** + * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer + * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. + * + * @param elementType + * @param JSONcontainer + * @param svgContainer + * @returns {*} + * @private + */ + exports.getSVGElement = function (elementType, JSONcontainer, svgContainer) { + var element; + // allocate SVG element, if it doesnt yet exist, create one. + if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before + // check if there is an redundant element + if (JSONcontainer[elementType].redundant.length > 0) { + element = JSONcontainer[elementType].redundant[0]; + JSONcontainer[elementType].redundant.shift(); + } + else { + // create a new element and add it to the SVG + element = document.createElementNS('http://www.w3.org/2000/svg', elementType); + svgContainer.appendChild(element); + } + } + else { + // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. + element = document.createElementNS('http://www.w3.org/2000/svg', elementType); + JSONcontainer[elementType] = {used: [], redundant: []}; + svgContainer.appendChild(element); + } + JSONcontainer[elementType].used.push(element); + return element; + }; + + + /** + * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer + * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. + * + * @param elementType + * @param JSONcontainer + * @param DOMContainer + * @returns {*} + * @private + */ + exports.getDOMElement = function (elementType, JSONcontainer, DOMContainer, insertBefore) { + var element; + // allocate DOM element, if it doesnt yet exist, create one. + if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before + // check if there is an redundant element + if (JSONcontainer[elementType].redundant.length > 0) { + element = JSONcontainer[elementType].redundant[0]; + JSONcontainer[elementType].redundant.shift(); + } + else { + // create a new element and add it to the SVG + element = document.createElement(elementType); + if (insertBefore !== undefined) { + DOMContainer.insertBefore(element, insertBefore); + } + else { + DOMContainer.appendChild(element); + } + } + } + else { + // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. + element = document.createElement(elementType); + JSONcontainer[elementType] = {used: [], redundant: []}; + if (insertBefore !== undefined) { + DOMContainer.insertBefore(element, insertBefore); + } + else { + DOMContainer.appendChild(element); + } + } + JSONcontainer[elementType].used.push(element); + return element; + }; + + + + + /** + * draw a point object. this is a seperate function because it can also be called by the legend. + * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions + * as well. + * + * @param x + * @param y + * @param group + * @param JSONcontainer + * @param svgContainer + * @returns {*} + */ + exports.drawPoint = function(x, y, group, JSONcontainer, svgContainer) { + var point; + if (group.options.drawPoints.style == 'circle') { + point = exports.getSVGElement('circle',JSONcontainer,svgContainer); + point.setAttributeNS(null, "cx", x); + point.setAttributeNS(null, "cy", y); + point.setAttributeNS(null, "r", 0.5 * group.options.drawPoints.size); + } + else { + point = exports.getSVGElement('rect',JSONcontainer,svgContainer); + point.setAttributeNS(null, "x", x - 0.5*group.options.drawPoints.size); + point.setAttributeNS(null, "y", y - 0.5*group.options.drawPoints.size); + point.setAttributeNS(null, "width", group.options.drawPoints.size); + point.setAttributeNS(null, "height", group.options.drawPoints.size); + } + + if(group.options.drawPoints.styles !== undefined) { + point.setAttributeNS(null, "style", group.group.options.drawPoints.styles); + } + point.setAttributeNS(null, "class", group.className + " point"); + return point; + }; + /** + * draw a bar SVG element centered on the X coordinate + * + * @param x + * @param y + * @param className + */ + exports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer) { + if (height != 0) { + if (height < 0) { + height *= -1; + y -= height; + } + var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer); + rect.setAttributeNS(null, "x", x - 0.5 * width); + rect.setAttributeNS(null, "y", y); + rect.setAttributeNS(null, "width", width); + rect.setAttributeNS(null, "height", height); + rect.setAttributeNS(null, "class", className); + } + }; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { - var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js - //! version : 2.8.3 - //! authors : Tim Wood, Iskren Chernev, Moment.js contributors - //! license : MIT - //! momentjs.com + var util = __webpack_require__(1); + var Queue = __webpack_require__(5); - (function (undefined) { - /************************************ - Constants - ************************************/ + /** + * DataSet + * + * Usage: + * var dataSet = new DataSet({ + * fieldId: '_id', + * type: { + * // ... + * } + * }); + * + * dataSet.add(item); + * dataSet.add(data); + * dataSet.update(item); + * dataSet.update(data); + * dataSet.remove(id); + * dataSet.remove(ids); + * var data = dataSet.get(); + * var data = dataSet.get(id); + * var data = dataSet.get(ids); + * var data = dataSet.get(ids, options, data); + * dataSet.clear(); + * + * A data set can: + * - add/remove/update data + * - gives triggers upon changes in the data + * - can import/export data in various data formats + * + * @param {Array | DataTable} [data] Optional array with initial data + * @param {Object} [options] Available options: + * {String} fieldId Field name of the id in the + * items, 'id' by default. + * {Object. ['10', '00'] or '-1530' > ['-15', '30'] - parseTimezoneChunker = /([\+\-]|\d\d)/gi, + var subscribers = []; + if (event in this._subscribers) { + subscribers = subscribers.concat(this._subscribers[event]); + } + if ('*' in this._subscribers) { + subscribers = subscribers.concat(this._subscribers['*']); + } - // getter and setter names - proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), - unitMillisecondFactors = { - 'Milliseconds' : 1, - 'Seconds' : 1e3, - 'Minutes' : 6e4, - 'Hours' : 36e5, - 'Days' : 864e5, - 'Months' : 2592e6, - 'Years' : 31536e6 - }, + for (var i = 0; i < subscribers.length; i++) { + var subscriber = subscribers[i]; + if (subscriber.callback) { + subscriber.callback(event, params, senderId || null); + } + } + }; - unitAliases = { - ms : 'millisecond', - s : 'second', - m : 'minute', - h : 'hour', - d : 'day', - D : 'date', - w : 'week', - W : 'isoWeek', - M : 'month', - Q : 'quarter', - y : 'year', - DDD : 'dayOfYear', - e : 'weekday', - E : 'isoWeekday', - gg: 'weekYear', - GG: 'isoWeekYear' - }, + /** + * Add data. + * Adding an item will fail when there already is an item with the same id. + * @param {Object | Array | DataTable} data + * @param {String} [senderId] Optional sender id + * @return {Array} addedIds Array with the ids of the added items + */ + DataSet.prototype.add = function (data, senderId) { + var addedIds = [], + id, + me = this; - camelFunctions = { - dayofyear : 'dayOfYear', - isoweekday : 'isoWeekday', - isoweek : 'isoWeek', - weekyear : 'weekYear', - isoweekyear : 'isoWeekYear' - }, + if (Array.isArray(data)) { + // Array + for (var i = 0, len = data.length; i < len; i++) { + id = me._addItem(data[i]); + addedIds.push(id); + } + } + else if (util.isDataTable(data)) { + // Google DataTable + var columns = this._getColumnNames(data); + for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { + var item = {}; + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + item[field] = data.getValue(row, col); + } - // format function strings - formatFunctions = {}, + id = me._addItem(item); + addedIds.push(id); + } + } + else if (data instanceof Object) { + // Single item + id = me._addItem(data); + addedIds.push(id); + } + else { + throw new Error('Unknown dataType'); + } - // default relative time thresholds - relativeTimeThresholds = { - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month - M: 11 // months to year - }, + if (addedIds.length) { + this._trigger('add', {items: addedIds}, senderId); + } - // tokens to ordinalize and pad - ordinalizeTokens = 'DDD w W M D d'.split(' '), - paddedTokens = 'M D H h m s w W'.split(' '), - - formatTokenFunctions = { - M : function () { - return this.month() + 1; - }, - MMM : function (format) { - return this.localeData().monthsShort(this, format); - }, - MMMM : function (format) { - return this.localeData().months(this, format); - }, - D : function () { - return this.date(); - }, - DDD : function () { - return this.dayOfYear(); - }, - d : function () { - return this.day(); - }, - dd : function (format) { - return this.localeData().weekdaysMin(this, format); - }, - ddd : function (format) { - return this.localeData().weekdaysShort(this, format); - }, - dddd : function (format) { - return this.localeData().weekdays(this, format); - }, - w : function () { - return this.week(); - }, - W : function () { - return this.isoWeek(); - }, - YY : function () { - return leftZeroFill(this.year() % 100, 2); - }, - YYYY : function () { - return leftZeroFill(this.year(), 4); - }, - YYYYY : function () { - return leftZeroFill(this.year(), 5); - }, - YYYYYY : function () { - var y = this.year(), sign = y >= 0 ? '+' : '-'; - return sign + leftZeroFill(Math.abs(y), 6); - }, - gg : function () { - return leftZeroFill(this.weekYear() % 100, 2); - }, - gggg : function () { - return leftZeroFill(this.weekYear(), 4); - }, - ggggg : function () { - return leftZeroFill(this.weekYear(), 5); - }, - GG : function () { - return leftZeroFill(this.isoWeekYear() % 100, 2); - }, - GGGG : function () { - return leftZeroFill(this.isoWeekYear(), 4); - }, - GGGGG : function () { - return leftZeroFill(this.isoWeekYear(), 5); - }, - e : function () { - return this.weekday(); - }, - E : function () { - return this.isoWeekday(); - }, - a : function () { - return this.localeData().meridiem(this.hours(), this.minutes(), true); - }, - A : function () { - return this.localeData().meridiem(this.hours(), this.minutes(), false); - }, - H : function () { - return this.hours(); - }, - h : function () { - return this.hours() % 12 || 12; - }, - m : function () { - return this.minutes(); - }, - s : function () { - return this.seconds(); - }, - S : function () { - return toInt(this.milliseconds() / 100); - }, - SS : function () { - return leftZeroFill(toInt(this.milliseconds() / 10), 2); - }, - SSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - SSSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - Z : function () { - var a = -this.zone(), - b = '+'; - if (a < 0) { - a = -a; - b = '-'; - } - return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); - }, - ZZ : function () { - var a = -this.zone(), - b = '+'; - if (a < 0) { - a = -a; - b = '-'; - } - return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); - }, - z : function () { - return this.zoneAbbr(); - }, - zz : function () { - return this.zoneName(); - }, - X : function () { - return this.unix(); - }, - Q : function () { - return this.quarter(); - } - }, - - deprecations = {}, - - lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + return addedIds; + }; - // Pick the first defined of two or three arguments. dfl comes from - // default. - function dfl(a, b, c) { - switch (arguments.length) { - case 2: return a != null ? a : b; - case 3: return a != null ? a : b != null ? b : c; - default: throw new Error('Implement me'); - } - } + /** + * Update existing items. When an item does not exist, it will be created + * @param {Object | Array | DataTable} data + * @param {String} [senderId] Optional sender id + * @return {Array} updatedIds The ids of the added or updated items + */ + DataSet.prototype.update = function (data, senderId) { + var addedIds = []; + var updatedIds = []; + var updatedData = []; + var me = this; + var fieldId = me._fieldId; - function hasOwnProp(a, b) { - return hasOwnProperty.call(a, b); + var addOrUpdate = function (item) { + var id = item[fieldId]; + if (me._data[id]) { + // update item + id = me._updateItem(item); + updatedIds.push(id); + updatedData.push(item); } - - function defaultParsingFlags() { - // We need to deep clone this object, and es5 standard is not very - // helpful. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; + else { + // add new item + id = me._addItem(item); + addedIds.push(id); } + }; - function printMsg(msg) { - if (moment.suppressDeprecationWarnings === false && - typeof console !== 'undefined' && console.warn) { - console.warn('Deprecation warning: ' + msg); - } + if (Array.isArray(data)) { + // Array + for (var i = 0, len = data.length; i < len; i++) { + addOrUpdate(data[i]); } + } + else if (util.isDataTable(data)) { + // Google DataTable + var columns = this._getColumnNames(data); + for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { + var item = {}; + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + item[field] = data.getValue(row, col); + } - function deprecate(msg, fn) { - var firstTime = true; - return extend(function () { - if (firstTime) { - printMsg(msg); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); + addOrUpdate(item); } + } + else if (data instanceof Object) { + // Single item + addOrUpdate(data); + } + else { + throw new Error('Unknown dataType'); + } - function deprecateSimple(name, msg) { - if (!deprecations[name]) { - printMsg(msg); - deprecations[name] = true; - } - } + if (addedIds.length) { + this._trigger('add', {items: addedIds}, senderId); + } + if (updatedIds.length) { + this._trigger('update', {items: updatedIds, data: updatedData}, senderId); + } - function padToken(func, count) { - return function (a) { - return leftZeroFill(func.call(this, a), count); - }; - } - function ordinalizeToken(func, period) { - return function (a) { - return this.localeData().ordinal(func.call(this, a), period); - }; - } + return addedIds.concat(updatedIds); + }; - while (ordinalizeTokens.length) { - i = ordinalizeTokens.pop(); - formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); - } - while (paddedTokens.length) { - i = paddedTokens.pop(); - formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); - } - formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + /** + * Get a data item or multiple items. + * + * Usage: + * + * get() + * get(options: Object) + * get(options: Object, data: Array | DataTable) + * + * get(id: Number | String) + * get(id: Number | String, options: Object) + * get(id: Number | String, options: Object, data: Array | DataTable) + * + * get(ids: Number[] | String[]) + * get(ids: Number[] | String[], options: Object) + * get(ids: Number[] | String[], options: Object, data: Array | DataTable) + * + * Where: + * + * {Number | String} id The id of an item + * {Number[] | String{}} ids An array with ids of items + * {Object} options An Object with options. Available options: + * {String} [returnType] Type of data to be + * returned. Can be 'DataTable' or 'Array' (default) + * {Object.} [type] + * {String[]} [fields] field names to be returned + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * {Array | DataTable} [data] If provided, items will be appended to this + * array or table. Required in case of Google + * DataTable. + * + * @throws Error + */ + DataSet.prototype.get = function (args) { + var me = this; + // parse the arguments + var id, ids, options, data; + var firstType = util.getType(arguments[0]); + if (firstType == 'String' || firstType == 'Number') { + // get(id [, options] [, data]) + id = arguments[0]; + options = arguments[1]; + data = arguments[2]; + } + else if (firstType == 'Array') { + // get(ids [, options] [, data]) + ids = arguments[0]; + options = arguments[1]; + data = arguments[2]; + } + else { + // get([, options] [, data]) + options = arguments[0]; + data = arguments[1]; + } - /************************************ - Constructors - ************************************/ + // determine the return type + var returnType; + if (options && options.returnType) { + var allowedValues = ["DataTable", "Array", "Object"]; + returnType = allowedValues.indexOf(options.returnType) == -1 ? "Array" : options.returnType; - function Locale() { + if (data && (returnType != util.getType(data))) { + throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' + + 'does not correspond with specified options.type (' + options.type + ')'); } - - // Moment prototype object - function Moment(config, skipOverflow) { - if (skipOverflow !== false) { - checkOverflow(config); - } - copyConfig(this, config); - this._d = new Date(+config._d); + if (returnType == 'DataTable' && !util.isDataTable(data)) { + throw new Error('Parameter "data" must be a DataTable ' + + 'when options.type is "DataTable"'); } + } + else if (data) { + returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; + } + else { + returnType = 'Array'; + } - // Duration Constructor - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 36e5; // 1000 * 60 * 60 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = moment.localeData(); + // build options + var type = options && options.type || this._options.type; + var filter = options && options.filter; + var items = [], item, itemId, i, len; - this._bubble(); + // convert items + if (id != undefined) { + // return a single item + item = me._getItem(id, type); + if (filter && !filter(item)) { + item = null; } - - /************************************ - Helpers - ************************************/ - - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; + } + else if (ids != undefined) { + // return a subset of items + for (i = 0, len = ids.length; i < len; i++) { + item = me._getItem(ids[i], type); + if (!filter || filter(item)) { + items.push(item); + } } - - function copyConfig(to, from) { - var i, prop, val; - - if (typeof from._isAMomentObject !== 'undefined') { - to._isAMomentObject = from._isAMomentObject; - } - if (typeof from._i !== 'undefined') { - to._i = from._i; - } - if (typeof from._f !== 'undefined') { - to._f = from._f; - } - if (typeof from._l !== 'undefined') { - to._l = from._l; - } - if (typeof from._strict !== 'undefined') { - to._strict = from._strict; - } - if (typeof from._tzm !== 'undefined') { - to._tzm = from._tzm; - } - if (typeof from._isUTC !== 'undefined') { - to._isUTC = from._isUTC; - } - if (typeof from._offset !== 'undefined') { - to._offset = from._offset; - } - if (typeof from._pf !== 'undefined') { - to._pf = from._pf; - } - if (typeof from._locale !== 'undefined') { - to._locale = from._locale; + } + else { + // return all items + for (itemId in this._data) { + if (this._data.hasOwnProperty(itemId)) { + item = me._getItem(itemId, type); + if (!filter || filter(item)) { + items.push(item); } + } + } + } - if (momentProperties.length > 0) { - for (i in momentProperties) { - prop = momentProperties[i]; - val = from[prop]; - if (typeof val !== 'undefined') { - to[prop] = val; - } - } - } + // order the results + if (options && options.order && id == undefined) { + this._sort(items, options.order); + } - return to; + // filter fields of the items + if (options && options.fields) { + var fields = options.fields; + if (id != undefined) { + item = this._filterFields(item, fields); } - - function absRound(number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); - } + else { + for (i = 0, len = items.length; i < len; i++) { + items[i] = this._filterFields(items[i], fields); + } } + } - // left zero fill a number - // see http://jsperf.com/left-zero-filling for performance comparison - function leftZeroFill(number, targetLength, forceSign) { - var output = '' + Math.abs(number), - sign = number >= 0; - - while (output.length < targetLength) { - output = '0' + output; - } - return (sign ? (forceSign ? '+' : '') : '-') + output; + // return the results + if (returnType == 'DataTable') { + var columns = this._getColumnNames(data); + if (id != undefined) { + // append a single item to the data table + me._appendRow(data, columns, item); } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - other = makeAs(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = moment.duration(val, period); - addOrSubtractDurationFromMoment(this, dur, direction); - return this; - }; - } - - function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = duration._days, - months = duration._months; - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(+mom._d + milliseconds * isAdding); - } - if (days) { - rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); - } - if (months) { - rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - moment.updateOffset(mom, days || months); - } - } - - // check if is an array - function isArray(input) { - return Object.prototype.toString.call(input) === '[object Array]'; - } - - function isDate(input) { - return Object.prototype.toString.call(input) === '[object Date]' || - input instanceof Date; - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function normalizeUnits(units) { - if (units) { - var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); - units = unitAliases[units] || camelFunctions[lowered] || lowered; - } - return units; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - function makeList(field) { - var count, setter; - - if (field.indexOf('week') === 0) { - count = 7; - setter = 'day'; - } - else if (field.indexOf('month') === 0) { - count = 12; - setter = 'month'; - } - else { - return; - } - - moment[field] = function (format, index) { - var i, getter, - method = moment._locale[field], - results = []; - - if (typeof format === 'number') { - index = format; - format = undefined; - } - - getter = function (i) { - var m = moment().utc().set(setter, i); - return method.call(moment._locale, m, format || ''); - }; - - if (index != null) { - return getter(index); - } - else { - for (i = 0; i < count; i++) { - results.push(getter(i)); - } - return results; - } - }; - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - if (coercedNumber >= 0) { - value = Math.floor(coercedNumber); - } else { - value = Math.ceil(coercedNumber); - } - } - - return value; - } - - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } - - function weeksInYear(year, dow, doy) { - return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; - } - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - function checkOverflow(m) { - var overflow; - if (m._a && m._pf.overflow === -2) { - overflow = - m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : - m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : - m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : - m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : - m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : - m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - - m._pf.overflow = overflow; - } - } - - function isValid(m) { - if (m._isValid == null) { - m._isValid = !isNaN(m._d.getTime()) && - m._pf.overflow < 0 && - !m._pf.empty && - !m._pf.invalidMonth && - !m._pf.nullInput && - !m._pf.invalidFormat && - !m._pf.userInvalidated; - - if (m._strict) { - m._isValid = m._isValid && - m._pf.charsLeftOver === 0 && - m._pf.unusedTokens.length === 0; - } - } - return m._isValid; - } - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return null; - } - - function loadLocale(name) { - var oldLocale = null; - if (!locales[name] && hasModule) { - try { - oldLocale = moment.locale(); - !(function webpackMissingModule() { var e = new Error("Cannot find module \"./locale\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()); - // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales - moment.locale(oldLocale); - } catch (e) { } - } - return locales[name]; - } - - // Return a moment from input, that is local/utc/zone equivalent to model. - function makeAs(input, model) { - return model._isUTC ? moment(input).zone(model._offset || 0) : - moment(input).local(); - } - - /************************************ - Locale - ************************************/ - - - extend(Locale.prototype, { - - set : function (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (typeof prop === 'function') { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - }, - - _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - months : function (m) { - return this._months[m.month()]; - }, - - _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - monthsShort : function (m) { - return this._monthsShort[m.month()]; - }, - - monthsParse : function (monthName) { - var i, mom, regex; - - if (!this._monthsParse) { - this._monthsParse = []; - } - - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - if (!this._monthsParse[i]) { - mom = moment.utc([2000, i]); - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._monthsParse[i].test(monthName)) { - return i; - } - } - }, - - _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdays : function (m) { - return this._weekdays[m.day()]; - }, - - _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysShort : function (m) { - return this._weekdaysShort[m.day()]; - }, - - _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - weekdaysMin : function (m) { - return this._weekdaysMin[m.day()]; - }, - - weekdaysParse : function (weekdayName) { - var i, mom, regex; - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - if (!this._weekdaysParse[i]) { - mom = moment([2000, 1]).day(i); - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - }, - - _longDateFormat : { - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY LT', - LLLL : 'dddd, MMMM D, YYYY LT' - }, - longDateFormat : function (key) { - var output = this._longDateFormat[key]; - if (!output && this._longDateFormat[key.toUpperCase()]) { - output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - this._longDateFormat[key] = output; - } - return output; - }, - - isPM : function (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - }, - - _meridiemParse : /[ap]\.?m?\.?/i, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - }, - - _calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendar[key]; - return typeof output === 'function' ? output.apply(mom) : output; - }, - - _relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - - relativeTime : function (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (typeof output === 'function') ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - }, - - pastFuture : function (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); - }, - - ordinal : function (number) { - return this._ordinal.replace('%d', number); - }, - _ordinal : '%d', - - preparse : function (string) { - return string; - }, - - postformat : function (string) { - return string; - }, - - week : function (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - }, - - _week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }, - - _invalidDate: 'Invalid date', - invalidDate: function () { - return this._invalidDate; - } - }); - - /************************************ - Formatting - ************************************/ - - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = ''; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; + else { + // copy the items to the provided data table + for (i = 0; i < items.length; i++) { + me._appendRow(data, columns, items[i]); + } } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - - if (!formatFunctions[format]) { - formatFunctions[format] = makeFormatFunction(format); - } - - return formatFunctions[format](m); + return data; + } + else if (returnType == "Object") { + var result = {}; + for (i = 0; i < items.length; i++) { + result[items[i].id] = items[i]; } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; + return result; + } + else { + // return an array + if (id != undefined) { + // a single item + return item; } - - - /************************************ - Parsing - ************************************/ - - - // get the regex to find the next token - function getParseRegexForToken(token, config) { - var a, strict = config._strict; - switch (token) { - case 'Q': - return parseTokenOneDigit; - case 'DDDD': - return parseTokenThreeDigits; - case 'YYYY': - case 'GGGG': - case 'gggg': - return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; - case 'Y': - case 'G': - case 'g': - return parseTokenSignedNumber; - case 'YYYYYY': - case 'YYYYY': - case 'GGGGG': - case 'ggggg': - return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; - case 'S': - if (strict) { - return parseTokenOneDigit; - } - /* falls through */ - case 'SS': - if (strict) { - return parseTokenTwoDigits; - } - /* falls through */ - case 'SSS': - if (strict) { - return parseTokenThreeDigits; - } - /* falls through */ - case 'DDD': - return parseTokenOneToThreeDigits; - case 'MMM': - case 'MMMM': - case 'dd': - case 'ddd': - case 'dddd': - return parseTokenWord; - case 'a': - case 'A': - return config._locale._meridiemParse; - case 'X': - return parseTokenTimestampMs; - case 'Z': - case 'ZZ': - return parseTokenTimezone; - case 'T': - return parseTokenT; - case 'SSSS': - return parseTokenDigits; - case 'MM': - case 'DD': - case 'YY': - case 'GG': - case 'gg': - case 'HH': - case 'hh': - case 'mm': - case 'ss': - case 'ww': - case 'WW': - return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; - case 'M': - case 'D': - case 'd': - case 'H': - case 'h': - case 'm': - case 's': - case 'w': - case 'W': - case 'e': - case 'E': - return parseTokenOneOrTwoDigits; - case 'Do': - return parseTokenOrdinal; - default : - a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); - return a; + else { + // multiple items + if (data) { + // copy the items to the provided array + for (i = 0, len = items.length; i < len; i++) { + data.push(items[i]); } + return data; + } + else { + // just return our array + return items; + } } + } + }; - function timezoneMinutesFromString(string) { - string = string || ''; - var possibleTzMatches = (string.match(parseTokenTimezone) || []), - tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], - parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], - minutes = +(parts[1] * 60) + toInt(parts[2]); - - return parts[0] === '+' ? -minutes : minutes; - } - - // function to convert string input to date - function addTimeToArrayFromToken(token, input, config) { - var a, datePartArray = config._a; - - switch (token) { - // QUARTER - case 'Q': - if (input != null) { - datePartArray[MONTH] = (toInt(input) - 1) * 3; - } - break; - // MONTH - case 'M' : // fall through to MM - case 'MM' : - if (input != null) { - datePartArray[MONTH] = toInt(input) - 1; - } - break; - case 'MMM' : // fall through to MMMM - case 'MMMM' : - a = config._locale.monthsParse(input); - // if we didn't find a month name, mark the date as invalid. - if (a != null) { - datePartArray[MONTH] = a; - } else { - config._pf.invalidMonth = input; - } - break; - // DAY OF MONTH - case 'D' : // fall through to DD - case 'DD' : - if (input != null) { - datePartArray[DATE] = toInt(input); - } - break; - case 'Do' : - if (input != null) { - datePartArray[DATE] = toInt(parseInt(input, 10)); - } - break; - // DAY OF YEAR - case 'DDD' : // fall through to DDDD - case 'DDDD' : - if (input != null) { - config._dayOfYear = toInt(input); - } - - break; - // YEAR - case 'YY' : - datePartArray[YEAR] = moment.parseTwoDigitYear(input); - break; - case 'YYYY' : - case 'YYYYY' : - case 'YYYYYY' : - datePartArray[YEAR] = toInt(input); - break; - // AM / PM - case 'a' : // fall through to A - case 'A' : - config._isPm = config._locale.isPM(input); - break; - // 24 HOUR - case 'H' : // fall through to hh - case 'HH' : // fall through to hh - case 'h' : // fall through to hh - case 'hh' : - datePartArray[HOUR] = toInt(input); - break; - // MINUTE - case 'm' : // fall through to mm - case 'mm' : - datePartArray[MINUTE] = toInt(input); - break; - // SECOND - case 's' : // fall through to ss - case 'ss' : - datePartArray[SECOND] = toInt(input); - break; - // MILLISECOND - case 'S' : - case 'SS' : - case 'SSS' : - case 'SSSS' : - datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); - break; - // UNIX TIMESTAMP WITH MS - case 'X': - config._d = new Date(parseFloat(input) * 1000); - break; - // TIMEZONE - case 'Z' : // fall through to ZZ - case 'ZZ' : - config._useUTC = true; - config._tzm = timezoneMinutesFromString(input); - break; - // WEEKDAY - human - case 'dd': - case 'ddd': - case 'dddd': - a = config._locale.weekdaysParse(input); - // if we didn't get a weekday name, mark the date as invalid - if (a != null) { - config._w = config._w || {}; - config._w['d'] = a; - } else { - config._pf.invalidWeekday = input; - } - break; - // WEEK, WEEK DAY - numeric - case 'w': - case 'ww': - case 'W': - case 'WW': - case 'd': - case 'e': - case 'E': - token = token.substr(0, 1); - /* falls through */ - case 'gggg': - case 'GGGG': - case 'GGGGG': - token = token.substr(0, 2); - if (input) { - config._w = config._w || {}; - config._w[token] = toInt(input); - } - break; - case 'gg': - case 'GG': - config._w = config._w || {}; - config._w[token] = moment.parseTwoDigitYear(input); + /** + * Get ids of all items or from a filtered set of items. + * @param {Object} [options] An Object with options. Available options: + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Array} ids + */ + DataSet.prototype.getIds = function (options) { + var data = this._data, + filter = options && options.filter, + order = options && options.order, + type = options && options.type || this._options.type, + i, + len, + id, + item, + items, + ids = []; + + if (filter) { + // get filtered items + if (order) { + // create ordered list + items = []; + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (filter(item)) { + items.push(item); + } + } + } + + this._sort(items, order); + + for (i = 0, len = items.length; i < len; i++) { + ids[i] = items[i][this._fieldId]; + } + } + else { + // create unordered list + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (filter(item)) { + ids.push(item[this._fieldId]); + } } + } } + } + else { + // get all items + if (order) { + // create an ordered list + items = []; + for (id in data) { + if (data.hasOwnProperty(id)) { + items.push(data[id]); + } + } - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp; + this._sort(items, order); - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; + for (i = 0, len = items.length; i < len; i++) { + ids[i] = items[i][this._fieldId]; + } + } + else { + // create unordered list + for (id in data) { + if (data.hasOwnProperty(id)) { + item = data[id]; + ids.push(item[this._fieldId]); + } + } + } + } - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); - week = dfl(w.W, 1); - weekday = dfl(w.E, 1); - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; + return ids; + }; - weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); - week = dfl(w.w, 1); + /** + * Returns the DataSet itself. Is overwritten for example by the DataView, + * which returns the DataSet it is connected to instead. + */ + DataSet.prototype.getDataSet = function () { + return this; + }; - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < dow) { - ++week; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - } else { - // default to begining of week - weekday = dow; - } + /** + * Execute a callback function for every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + */ + DataSet.prototype.forEach = function (callback, options) { + var filter = options && options.filter, + type = options && options.type || this._options.type, + data = this._data, + item, + id; + + if (options && options.order) { + // execute forEach on ordered list + var items = this.get(options); + + for (var i = 0, len = items.length; i < len; i++) { + item = items[i]; + id = item[this._fieldId]; + callback(item, id); + } + } + else { + // unordered + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (!filter || filter(item)) { + callback(item, id); } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + } + } + } + }; - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + /** + * Map every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Object[]} mappedItems + */ + DataSet.prototype.map = function (callback, options) { + var filter = options && options.filter, + type = options && options.type || this._options.type, + mappedItems = [], + data = this._data, + item; + + // convert and filter items + for (var id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (!filter || filter(item)) { + mappedItems.push(callback(item, id)); + } } + } - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function dateFromConfig(config) { - var i, date, input = [], currentDate, yearToUse; + // order items + if (options && options.order) { + this._sort(mappedItems, options.order); + } - if (config._d) { - return; - } + return mappedItems; + }; - currentDate = currentDateArray(config); + /** + * Filter the fields of an item + * @param {Object} item + * @param {String[]} fields Field names + * @return {Object} filteredItem + * @private + */ + DataSet.prototype._filterFields = function (item, fields) { + var filteredItem = {}; - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } + for (var field in item) { + if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { + filteredItem[field] = item[field]; + } + } - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + return filteredItem; + }; - if (config._dayOfYear > daysInYear(yearToUse)) { - config._pf._overflowDayOfYear = true; - } + /** + * Sort the provided array with items + * @param {Object[]} items + * @param {String | function} order A field name or custom sort function. + * @private + */ + DataSet.prototype._sort = function (items, order) { + if (util.isString(order)) { + // order by provided field name + var name = order; // field name + items.sort(function (a, b) { + var av = a[name]; + var bv = b[name]; + return (av > bv) ? 1 : ((av < bv) ? -1 : 0); + }); + } + else if (typeof order === 'function') { + // order by sort function + items.sort(order); + } + // TODO: extend order by an Object {field:String, direction:String} + // where direction can be 'asc' or 'desc' + else { + throw new TypeError('Order must be a function or a string'); + } + }; - date = makeUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } + /** + * Remove an object by pointer or by id + * @param {String | Number | Object | Array} id Object or id, or an array with + * objects or ids to be removed + * @param {String} [senderId] Optional sender id + * @return {Array} removedIds + */ + DataSet.prototype.remove = function (id, senderId) { + var removedIds = [], + i, len, removedId; - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } + if (Array.isArray(id)) { + for (i = 0, len = id.length; i < len; i++) { + removedId = this._remove(id[i]); + if (removedId != null) { + removedIds.push(removedId); + } + } + } + else { + removedId = this._remove(id); + if (removedId != null) { + removedIds.push(removedId); + } + } - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } + if (removedIds.length) { + this._trigger('remove', {items: removedIds}, senderId); + } - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); - // Apply timezone offset from input. The actual zone can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); - } + return removedIds; + }; + + /** + * Remove an item by its id + * @param {Number | String | Object} id id or item + * @returns {Number | String | null} id + * @private + */ + DataSet.prototype._remove = function (id) { + if (util.isNumber(id) || util.isString(id)) { + if (this._data[id]) { + delete this._data[id]; + return id; + } + } + else if (id instanceof Object) { + var itemId = id[this._fieldId]; + if (itemId && this._data[itemId]) { + delete this._data[itemId]; + return itemId; } + } + return null; + }; - function dateFromObject(config) { - var normalizedInput; + /** + * Clear the data + * @param {String} [senderId] Optional sender id + * @return {Array} removedIds The ids of all removed items + */ + DataSet.prototype.clear = function (senderId) { + var ids = Object.keys(this._data); - if (config._d) { - return; - } + this._data = {}; - normalizedInput = normalizeObjectUnits(config._i); - config._a = [ - normalizedInput.year, - normalizedInput.month, - normalizedInput.day, - normalizedInput.hour, - normalizedInput.minute, - normalizedInput.second, - normalizedInput.millisecond - ]; + this._trigger('remove', {items: ids}, senderId); - dateFromConfig(config); + return ids; + }; + + /** + * Find the item with maximum value of a specified field + * @param {String} field + * @return {Object | null} item Item containing max value, or null if no items + */ + DataSet.prototype.max = function (field) { + var data = this._data, + max = null, + maxField = null; + + for (var id in data) { + if (data.hasOwnProperty(id)) { + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!max || itemField > maxField)) { + max = item; + maxField = itemField; + } } + } - function currentDateArray(config) { - var now = new Date(); - if (config._useUTC) { - return [ - now.getUTCFullYear(), - now.getUTCMonth(), - now.getUTCDate() - ]; - } else { - return [now.getFullYear(), now.getMonth(), now.getDate()]; - } + return max; + }; + + /** + * Find the item with minimum value of a specified field + * @param {String} field + * @return {Object | null} item Item containing max value, or null if no items + */ + DataSet.prototype.min = function (field) { + var data = this._data, + min = null, + minField = null; + + for (var id in data) { + if (data.hasOwnProperty(id)) { + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!min || itemField < minField)) { + min = item; + minField = itemField; + } } + } - // date from string and format string - function makeDateFromStringAndFormat(config) { - if (config._f === moment.ISO_8601) { - parseISO(config); - return; + return min; + }; + + /** + * Find all distinct values of a specified field + * @param {String} field + * @return {Array} values Array containing all distinct values. If data items + * do not contain the specified field are ignored. + * The returned array is unordered. + */ + DataSet.prototype.distinct = function (field) { + var data = this._data; + var values = []; + var fieldType = this._options.type && this._options.type[field] || null; + var count = 0; + var i; + + for (var prop in data) { + if (data.hasOwnProperty(prop)) { + var item = data[prop]; + var value = item[field]; + var exists = false; + for (i = 0; i < count; i++) { + if (values[i] == value) { + exists = true; + break; } + } + if (!exists && (value !== undefined)) { + values[count] = value; + count++; + } + } + } - config._a = []; - config._pf.empty = true; + if (fieldType) { + for (i = 0; i < values.length; i++) { + values[i] = util.convert(values[i], fieldType); + } + } - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; + return values; + }; - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + /** + * Add a single item. Will fail when an item with the same id already exists. + * @param {Object} item + * @return {String} id + * @private + */ + DataSet.prototype._addItem = function (item) { + var id = item[this._fieldId]; - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - config._pf.unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - config._pf.empty = false; - } - else { - config._pf.unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - config._pf.unusedTokens.push(token); - } - } + if (id != undefined) { + // check whether this id is already taken + if (this._data[id]) { + // item already exists + throw new Error('Cannot add item: item with id ' + id + ' already exists'); + } + } + else { + // generate an id + id = util.randomUUID(); + item[this._fieldId] = id; + } - // add remaining unparsed input length to the string - config._pf.charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - config._pf.unusedInput.push(string); - } + var d = {}; + for (var field in item) { + if (item.hasOwnProperty(field)) { + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); + } + } + this._data[id] = d; + + return id; + }; + + /** + * Get an item. Fields can be converted to a specific type + * @param {String} id + * @param {Object.} [types] field types to convert + * @return {Object | null} item + * @private + */ + DataSet.prototype._getItem = function (id, types) { + var field, value; - // handle am pm - if (config._isPm && config._a[HOUR] < 12) { - config._a[HOUR] += 12; - } - // if is 12 am, change hours to 0 - if (config._isPm === false && config._a[HOUR] === 12) { - config._a[HOUR] = 0; - } + // get the item from the dataset + var raw = this._data[id]; + if (!raw) { + return null; + } - dateFromConfig(config); - checkOverflow(config); + // convert the items field types + var converted = {}; + if (types) { + for (field in raw) { + if (raw.hasOwnProperty(field)) { + value = raw[field]; + converted[field] = util.convert(value, types[field]); + } } - - function unescapeFormat(s) { - return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - }); + } + else { + // no field types specified, no converting needed + for (field in raw) { + if (raw.hasOwnProperty(field)) { + value = raw[field]; + converted[field] = value; + } } + } + return converted; + }; - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function regexpEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + /** + * Update a single item: merge with existing item. + * Will fail when the item has no id, or when there does not exist an item + * with the same id. + * @param {Object} item + * @return {String} id + * @private + */ + DataSet.prototype._updateItem = function (item) { + var id = item[this._fieldId]; + if (id == undefined) { + throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')'); + } + var d = this._data[id]; + if (!d) { + // item doesn't exist + throw new Error('Cannot update item: no item with id ' + id + ' found'); + } + + // merge with current item + for (var field in item) { + if (item.hasOwnProperty(field)) { + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); } + } - // date from string and array of format strings - function makeDateFromStringAndArray(config) { - var tempConfig, - bestMoment, + return id; + }; - scoreToBeat, - i, - currentScore; + /** + * Get an array with the column names of a Google DataTable + * @param {DataTable} dataTable + * @return {String[]} columnNames + * @private + */ + DataSet.prototype._getColumnNames = function (dataTable) { + var columns = []; + for (var col = 0, cols = dataTable.getNumberOfColumns(); col < cols; col++) { + columns[col] = dataTable.getColumnId(col) || dataTable.getColumnLabel(col); + } + return columns; + }; - if (config._f.length === 0) { - config._pf.invalidFormat = true; - config._d = new Date(NaN); - return; - } + /** + * Append an item as a row to the dataTable + * @param dataTable + * @param columns + * @param item + * @private + */ + DataSet.prototype._appendRow = function (dataTable, columns, item) { + var row = dataTable.addRow(); - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._pf = defaultParsingFlags(); - tempConfig._f = config._f[i]; - makeDateFromStringAndFormat(tempConfig); + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + dataTable.setValue(row, col, item[field]); + } + }; - if (!isValid(tempConfig)) { - continue; - } + module.exports = DataSet; - // if there is any input that was not parsed add a penalty for that format - currentScore += tempConfig._pf.charsLeftOver; - //or tokens - currentScore += tempConfig._pf.unusedTokens.length * 10; +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { - tempConfig._pf.score = currentScore; + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } + /** + * DataView + * + * a dataview offers a filtered view on a dataset or an other dataview. + * + * @param {DataSet | DataView} data + * @param {Object} [options] Available options: see method get + * + * @constructor DataView + */ + function DataView (data, options) { + this._data = null; + this._ids = {}; // ids of the items currently in memory (just contains a boolean true) + this._options = options || {}; + this._fieldId = 'id'; // name of the field containing id + this._subscribers = {}; // event subscribers - extend(config, bestMoment || tempConfig); - } + var me = this; + this.listener = function () { + me._onEvent.apply(me, arguments); + }; - // date from iso format - function parseISO(config) { - var i, l, - string = config._i, - match = isoRegex.exec(string); + this.setData(data); + } - if (match) { - config._pf.iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - // match[5] should be 'T' or undefined - config._f = isoDates[i][0] + (match[6] || ' '); - break; - } - } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; - } - } - if (string.match(parseTokenTimezone)) { - config._f += 'Z'; - } - makeDateFromStringAndFormat(config); - } else { - config._isValid = false; - } - } + // TODO: implement a function .config() to dynamically update things like configured filter + // and trigger changes accordingly - // date from iso format or fallback - function makeDateFromString(config) { - parseISO(config); - if (config._isValid === false) { - delete config._isValid; - moment.createFromInputFallback(config); - } - } + /** + * Set a data source for the view + * @param {DataSet | DataView} data + */ + DataView.prototype.setData = function (data) { + var ids, i, len; - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; + if (this._data) { + // unsubscribe from current dataset + if (this._data.unsubscribe) { + this._data.unsubscribe('*', this.listener); } - function makeDateFromInput(config) { - var input = config._i, matched; - if (input === undefined) { - config._d = new Date(); - } else if (isDate(input)) { - config._d = new Date(+input); - } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { - config._d = new Date(+matched[1]); - } else if (typeof input === 'string') { - makeDateFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - dateFromConfig(config); - } else if (typeof(input) === 'object') { - dateFromObject(config); - } else if (typeof(input) === 'number') { - // from milliseconds - config._d = new Date(input); - } else { - moment.createFromInputFallback(config); - } + // trigger a remove of all items in memory + ids = []; + for (var id in this._ids) { + if (this._ids.hasOwnProperty(id)) { + ids.push(id); + } } + this._ids = {}; + this._trigger('remove', {items: ids}); + } - function makeDate(y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); + this._data = data; - //the date constructor doesn't accept years < 1970 - if (y < 1970) { - date.setFullYear(y); - } - return date; - } + if (this._data) { + // update fieldId + this._fieldId = this._options.fieldId || + (this._data && this._data.options && this._data.options.fieldId) || + 'id'; - function makeUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { - date.setUTCFullYear(y); - } - return date; + // trigger an add of all added items + ids = this._data.getIds({filter: this._options && this._options.filter}); + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + this._ids[id] = true; } + this._trigger('add', {items: ids}); - function parseWeekday(input, locale) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = locale.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } - } - return input; + // subscribe to new dataset + if (this._data.on) { + this._data.on('*', this.listener); } + } + }; - /************************************ - Relative Time - ************************************/ - - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } + /** + * Get data from the data view + * + * Usage: + * + * get() + * get(options: Object) + * get(options: Object, data: Array | DataTable) + * + * get(id: Number) + * get(id: Number, options: Object) + * get(id: Number, options: Object, data: Array | DataTable) + * + * get(ids: Number[]) + * get(ids: Number[], options: Object) + * get(ids: Number[], options: Object, data: Array | DataTable) + * + * Where: + * + * {Number | String} id The id of an item + * {Number[] | String{}} ids An array with ids of items + * {Object} options An Object with options. Available options: + * {String} [type] Type of data to be returned. Can + * be 'DataTable' or 'Array' (default) + * {Object.} [convert] + * {String[]} [fields] field names to be returned + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * {Array | DataTable} [data] If provided, items will be appended to this + * array or table. Required in case of Google + * DataTable. + * @param args + */ + DataView.prototype.get = function (args) { + var me = this; - function relativeTime(posNegDuration, withoutSuffix, locale) { - var duration = moment.duration(posNegDuration).abs(), - seconds = round(duration.as('s')), - minutes = round(duration.as('m')), - hours = round(duration.as('h')), - days = round(duration.as('d')), - months = round(duration.as('M')), - years = round(duration.as('y')), + // parse the arguments + var ids, options, data; + var firstType = util.getType(arguments[0]); + if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') { + // get(id(s) [, options] [, data]) + ids = arguments[0]; // can be a single id or an array with ids + options = arguments[1]; + data = arguments[2]; + } + else { + // get([, options] [, data]) + options = arguments[0]; + data = arguments[1]; + } - args = seconds < relativeTimeThresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || - minutes < relativeTimeThresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || - hours < relativeTimeThresholds.h && ['hh', hours] || - days === 1 && ['d'] || - days < relativeTimeThresholds.d && ['dd', days] || - months === 1 && ['M'] || - months < relativeTimeThresholds.M && ['MM', months] || - years === 1 && ['y'] || ['yy', years]; + // extend the options with the default options and provided options + var viewOptions = util.extend({}, this._options, options); - args[2] = withoutSuffix; - args[3] = +posNegDuration > 0; - args[4] = locale; - return substituteTimeAgo.apply({}, args); + // create a combined filter method when needed + if (this._options.filter && options && options.filter) { + viewOptions.filter = function (item) { + return me._options.filter(item) && options.filter(item); } + } + // build up the call to the linked data set + var getArguments = []; + if (ids != undefined) { + getArguments.push(ids); + } + getArguments.push(viewOptions); + getArguments.push(data); - /************************************ - Week of Year - ************************************/ - - - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; + return this._data && this._data.get.apply(this._data, getArguments); + }; + /** + * Get ids of all items or from a filtered set of items. + * @param {Object} [options] An Object with options. Available options: + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Array} ids + */ + DataView.prototype.getIds = function (options) { + var ids; - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } + if (this._data) { + var defaultFilter = this._options.filter; + var filter; - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; + if (options && options.filter) { + if (defaultFilter) { + filter = function (item) { + return defaultFilter(item) && options.filter(item); } - - adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; + } + else { + filter = options.filter; + } + } + else { + filter = defaultFilter; } - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + ids = this._data.getIds({ + filter: filter, + order: options && options.order + }); + } + else { + ids = []; + } - d = d === 0 ? 7 : d; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + return ids; + }; - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear - }; - } + /** + * Get the DataSet to which this DataView is connected. In case there is a chain + * of multiple DataViews, the root DataSet of this chain is returned. + * @return {DataSet} dataSet + */ + DataView.prototype.getDataSet = function () { + var dataSet = this; + while (dataSet instanceof DataView) { + dataSet = dataSet._data; + } + return dataSet || null; + }; - /************************************ - Top Level Functions - ************************************/ + /** + * Event listener. Will propagate all events from the connected data set to + * the subscribers of the DataView, but will filter the items and only trigger + * when there are changes in the filtered data set. + * @param {String} event + * @param {Object | null} params + * @param {String} senderId + * @private + */ + DataView.prototype._onEvent = function (event, params, senderId) { + var i, len, id, item, + ids = params && params.items, + data = this._data, + added = [], + updated = [], + removed = []; + + if (ids && data) { + switch (event) { + case 'add': + // filter the ids of the added items + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + item = this.get(id); + if (item) { + this._ids[id] = true; + added.push(id); + } + } - function makeMoment(config) { - var input = config._i, - format = config._f; + break; - config._locale = config._locale || moment.localeData(config._l); + case 'update': + // determine the event from the views viewpoint: an updated + // item can be added, updated, or removed from this view. + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + item = this.get(id); - if (input === null || (format === undefined && input === '')) { - return moment.invalid({nullInput: true}); + if (item) { + if (this._ids[id]) { + updated.push(id); + } + else { + this._ids[id] = true; + added.push(id); + } + } + else { + if (this._ids[id]) { + delete this._ids[id]; + removed.push(id); + } + else { + // nothing interesting for me :-( + } + } } - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } + break; - if (moment.isMoment(input)) { - return new Moment(input, true); - } else if (format) { - if (isArray(format)) { - makeDateFromStringAndArray(config); - } else { - makeDateFromStringAndFormat(config); - } - } else { - makeDateFromInput(config); + case 'remove': + // filter the ids of the removed items + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + if (this._ids[id]) { + delete this._ids[id]; + removed.push(id); + } } - return new Moment(config); + break; } - moment = function (input, format, locale, strict) { - var c; + if (added.length) { + this._trigger('add', {items: added}, senderId); + } + if (updated.length) { + this._trigger('update', {items: updated}, senderId); + } + if (removed.length) { + this._trigger('remove', {items: removed}, senderId); + } + } + }; - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._i = input; - c._f = format; - c._l = locale; - c._strict = strict; - c._isUTC = false; - c._pf = defaultParsingFlags(); + // copy subscription functionality from DataSet + DataView.prototype.on = DataSet.prototype.on; + DataView.prototype.off = DataSet.prototype.off; + DataView.prototype._trigger = DataSet.prototype._trigger; - return makeMoment(c); - }; + // TODO: make these functions deprecated (replaced with `on` and `off` since version 0.5) + DataView.prototype.subscribe = DataView.prototype.on; + DataView.prototype.unsubscribe = DataView.prototype.off; - moment.suppressDeprecationWarnings = false; + module.exports = DataView; - moment.createFromInputFallback = deprecate( - 'moment construction falls back to js Date. This is ' + - 'discouraged and will be removed in upcoming major ' + - 'release. Please refer to ' + - 'https://github.com/moment/moment/issues/1407 for more info.', - function (config) { - config._d = new Date(config._i); - } - ); +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return moment(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } + /** + * A queue + * @param {Object} options + * Available options: + * - delay: number When provided, the queue will be flushed + * automatically after an inactivity of this delay + * in milliseconds. + * Default value is null. + * - max: number When the queue exceeds the given maximum number + * of entries, the queue is flushed automatically. + * Default value of max is Infinity. + * @constructor + */ + function Queue(options) { + // options + this.delay = null; + this.max = Infinity; - moment.min = function () { - var args = [].slice.call(arguments, 0); + // properties + this._queue = []; + this._timeout = null; + this._extended = null; - return pickBy('isBefore', args); - }; + this.setOptions(options); + } - moment.max = function () { - var args = [].slice.call(arguments, 0); + /** + * Update the configuration of the queue + * @param {Object} options + * Available options: + * - delay: number When provided, the queue will be flushed + * automatically after an inactivity of this delay + * in milliseconds. + * Default value is null. + * - max: number When the queue exceeds the given maximum number + * of entries, the queue is flushed automatically. + * Default value of max is Infinity. + * @param options + */ + Queue.prototype.setOptions = function (options) { + if (options && typeof options.delay !== 'undefined') { + this.delay = options.delay; + } + if (options && typeof options.max !== 'undefined') { + this.max = options.max; + } - return pickBy('isAfter', args); - }; + this._flushIfNeeded(); + }; - // creating with utc - moment.utc = function (input, format, locale, strict) { - var c; + /** + * Extend an object with queuing functionality. + * The object will be extended with a function flush, and the methods provided + * in options.replace will be replaced with queued ones. + * @param {Object} object + * @param {Object} options + * Available options: + * - replace: Array. + * A list with method names of the methods + * on the object to be replaced with queued ones. + * - delay: number When provided, the queue will be flushed + * automatically after an inactivity of this delay + * in milliseconds. + * Default value is null. + * - max: number When the queue exceeds the given maximum number + * of entries, the queue is flushed automatically. + * Default value of max is Infinity. + * @return {Queue} Returns the created queue + */ + Queue.extend = function (object, options) { + var queue = new Queue(options); - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._useUTC = true; - c._isUTC = true; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - c._pf = defaultParsingFlags(); + if (object.flush !== undefined) { + throw new Error('Target object already has a property flush'); + } + object.flush = function () { + queue.flush(); + }; - return makeMoment(c).utc(); - }; + var methods = [{ + name: 'flush', + original: undefined + }]; - // creating with unix timestamp (in seconds) - moment.unix = function (input) { - return moment(input * 1000); - }; + if (options && options.replace) { + for (var i = 0; i < options.replace.length; i++) { + var name = options.replace[i]; + methods.push({ + name: name, + original: object[name] + }); + queue.replace(object, name); + } + } - // duration - moment.duration = function (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - parseIso, - diffRes; + queue._extended = { + object: object, + methods: methods + }; - if (moment.isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoDurationRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - parseIso = function (inp) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - }; - duration = { - y: parseIso(match[2]), - M: parseIso(match[3]), - d: parseIso(match[4]), - h: parseIso(match[5]), - m: parseIso(match[6]), - s: parseIso(match[7]), - w: parseIso(match[8]) - }; - } else if (typeof duration === 'object' && - ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + return queue; + }; - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } + /** + * Destroy the queue. The queue will first flush all queued actions, and in + * case it has extended an object, will restore the original object. + */ + Queue.prototype.destroy = function () { + this.flush(); - ret = new Duration(duration); + if (this._extended) { + var object = this._extended.object; + var methods = this._extended.methods; + for (var i = 0; i < methods.length; i++) { + var method = methods[i]; + if (method.original) { + object[method.name] = method.original; + } + else { + delete object[method.name]; + } + } + this._extended = null; + } + }; - if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } + /** + * Replace a method on an object with a queued version + * @param {Object} object Object having the method + * @param {string} method The method name + */ + Queue.prototype.replace = function(object, method) { + var me = this; + var original = object[method]; + if (!original) { + throw new Error('Method ' + method + ' undefined'); + } - return ret; - }; + object[method] = function () { + // create an Array with the arguments + var args = []; + for (var i = 0; i < arguments.length; i++) { + args[i] = arguments[i]; + } - // version number - moment.version = VERSION; + // add this call to the queue + me.queue({ + args: args, + fn: original, + context: this + }); + }; + }; - // default format - moment.defaultFormat = isoFormat; + /** + * Queue a call + * @param {function | {fn: function, args: Array} | {fn: function, args: Array, context: Object}} entry + */ + Queue.prototype.queue = function(entry) { + if (typeof entry === 'function') { + this._queue.push({fn: entry}); + } + else { + this._queue.push(entry); + } - // constant that refers to the ISO standard - moment.ISO_8601 = function () {}; + this._flushIfNeeded(); + }; - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - moment.momentProperties = momentProperties; + /** + * Check whether the queue needs to be flushed + * @private + */ + Queue.prototype._flushIfNeeded = function () { + // flush when the maximum is exceeded. + if (this._queue.length > this.max) { + this.flush(); + } - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - moment.updateOffset = function () {}; + // flush after a period of inactivity when a delay is configured + clearTimeout(this._timeout); + if (this.queue.length > 0 && typeof this.delay === 'number') { + var me = this; + this._timeout = setTimeout(function () { + me.flush(); + }, this.delay); + } + }; - // This function allows you to set a threshold for relative time strings - moment.relativeTimeThreshold = function (threshold, limit) { - if (relativeTimeThresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return relativeTimeThresholds[threshold]; - } - relativeTimeThresholds[threshold] = limit; - return true; - }; + /** + * Flush all queued calls + */ + Queue.prototype.flush = function () { + while (this._queue.length > 0) { + var entry = this._queue.shift(); + entry.fn.apply(entry.context || entry.fn, entry.args || []); + } + }; - moment.lang = deprecate( - 'moment.lang is deprecated. Use moment.locale instead.', - function (key, value) { - return moment.locale(key, value); - } - ); + module.exports = Queue; - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - moment.locale = function (key, values) { - var data; - if (key) { - if (typeof(values) !== 'undefined') { - data = moment.defineLocale(key, values); - } - else { - data = moment.localeData(key); - } - if (data) { - moment.duration._locale = moment._locale = data; - } - } +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { - return moment._locale._abbr; - }; + var Emitter = __webpack_require__(56); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var util = __webpack_require__(1); + var Point3d = __webpack_require__(10); + var Point2d = __webpack_require__(9); + var Camera = __webpack_require__(7); + var Filter = __webpack_require__(8); + var Slider = __webpack_require__(11); + var StepNumber = __webpack_require__(12); - moment.defineLocale = function (name, values) { - if (values !== null) { - values.abbr = name; - if (!locales[name]) { - locales[name] = new Locale(); - } - locales[name].set(values); + /** + * @constructor Graph3d + * Graph3d displays data in 3d. + * + * Graph3d is developed in javascript as a Google Visualization Chart. + * + * @param {Element} container The DOM element in which the Graph3d will + * be created. Normally a div element. + * @param {DataSet | DataView | Array} [data] + * @param {Object} [options] + */ + function Graph3d(container, data, options) { + if (!(this instanceof Graph3d)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } - // backwards compat for now: also set the locale - moment.locale(name); + // create variables and set default values + this.containerElement = container; + this.width = '400px'; + this.height = '400px'; + this.margin = 10; // px + this.defaultXCenter = '55%'; + this.defaultYCenter = '50%'; - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - }; + this.xLabel = 'x'; + this.yLabel = 'y'; + this.zLabel = 'z'; - moment.langData = deprecate( - 'moment.langData is deprecated. Use moment.localeData instead.', - function (key) { - return moment.localeData(key); - } - ); + var passValueFn = function(v) { return v; }; + this.xValueLabel = passValueFn; + this.yValueLabel = passValueFn; + this.zValueLabel = passValueFn; + + this.filterLabel = 'time'; + this.legendLabel = 'value'; + + this.style = Graph3d.STYLE.DOT; + this.showPerspective = true; + this.showGrid = true; + this.keepAspectRatio = true; + this.showShadow = false; + this.showGrayBottom = false; // TODO: this does not work correctly + this.showTooltip = false; + this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' - // returns locale data - moment.localeData = function (key) { - var locale; + this.animationInterval = 1000; // milliseconds + this.animationPreload = false; - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } + this.camera = new Camera(); + this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? - if (!key) { - return moment._locale; - } + this.dataTable = null; // The original data table + this.dataPoints = null; // The table with point objects - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } + // the column indexes + this.colX = undefined; + this.colY = undefined; + this.colZ = undefined; + this.colValue = undefined; + this.colFilter = undefined; - return chooseLocale(key); - }; + this.xMin = 0; + this.xStep = undefined; // auto by default + this.xMax = 1; + this.yMin = 0; + this.yStep = undefined; // auto by default + this.yMax = 1; + this.zMin = 0; + this.zStep = undefined; // auto by default + this.zMax = 1; + this.valueMin = 0; + this.valueMax = 1; + this.xBarWidth = 1; + this.yBarWidth = 1; + // TODO: customize axis range - // compare moment object - moment.isMoment = function (obj) { - return obj instanceof Moment || - (obj != null && hasOwnProp(obj, '_isAMomentObject')); - }; + // constants + this.colorAxis = '#4D4D4D'; + this.colorGrid = '#D3D3D3'; + this.colorDot = '#7DC1FF'; + this.colorDotBorder = '#3267D2'; - // for typechecking Duration objects - moment.isDuration = function (obj) { - return obj instanceof Duration; - }; + // create a frame and canvas + this.create(); - for (i = lists.length - 1; i >= 0; --i) { - makeList(lists[i]); - } + // apply options (also when undefined) + this.setOptions(options); - moment.normalizeUnits = function (units) { - return normalizeUnits(units); - }; + // apply data + if (data) { + this.setData(data); + } + } - moment.invalid = function (flags) { - var m = moment.utc(NaN); - if (flags != null) { - extend(m._pf, flags); - } - else { - m._pf.userInvalidated = true; - } + // Extend Graph3d with an Emitter mixin + Emitter(Graph3d.prototype); - return m; - }; + /** + * Calculate the scaling values, dependent on the range in x, y, and z direction + */ + Graph3d.prototype._setScale = function() { + this.scale = new Point3d(1 / (this.xMax - this.xMin), + 1 / (this.yMax - this.yMin), + 1 / (this.zMax - this.zMin)); - moment.parseZone = function () { - return moment.apply(null, arguments).parseZone(); - }; + // keep aspect ration between x and y scale if desired + if (this.keepAspectRatio) { + if (this.scale.x < this.scale.y) { + //noinspection JSSuspiciousNameCombination + this.scale.y = this.scale.x; + } + else { + //noinspection JSSuspiciousNameCombination + this.scale.x = this.scale.y; + } + } - moment.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; + // scale the vertical axis + this.scale.z *= this.verticalRatio; + // TODO: can this be automated? verticalRatio? - /************************************ - Moment Prototype - ************************************/ + // determine scale for (optional) value + this.scale.value = 1 / (this.valueMax - this.valueMin); + // position the camera arm + var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; + var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; + var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; + this.camera.setArmLocation(xCenter, yCenter, zCenter); + }; - extend(moment.fn = Moment.prototype, { - clone : function () { - return moment(this); - }, + /** + * Convert a 3D location to a 2D location on screen + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point2d} point2d A 2D point with parameters x, y + */ + Graph3d.prototype._convert3Dto2D = function(point3d) { + var translation = this._convertPointToTranslation(point3d); + return this._convertTranslationToScreen(translation); + }; - valueOf : function () { - return +this._d + ((this._offset || 0) * 60000); - }, + /** + * Convert a 3D location its translation seen from the camera + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera + */ + Graph3d.prototype._convertPointToTranslation = function(point3d) { + var ax = point3d.x * this.scale.x, + ay = point3d.y * this.scale.y, + az = point3d.z * this.scale.z, - unix : function () { - return Math.floor(+this / 1000); - }, + cx = this.camera.getCameraLocation().x, + cy = this.camera.getCameraLocation().y, + cz = this.camera.getCameraLocation().z, - toString : function () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - }, + // calculate angles + sinTx = Math.sin(this.camera.getCameraRotation().x), + cosTx = Math.cos(this.camera.getCameraRotation().x), + sinTy = Math.sin(this.camera.getCameraRotation().y), + cosTy = Math.cos(this.camera.getCameraRotation().y), + sinTz = Math.sin(this.camera.getCameraRotation().z), + cosTz = Math.cos(this.camera.getCameraRotation().z), - toDate : function () { - return this._offset ? new Date(+this) : this._d; - }, + // calculate translation + dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), + dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), + dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); - toISOString : function () { - var m = moment(this).utc(); - if (0 < m.year() && m.year() <= 9999) { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - }, + return new Point3d(dx, dy, dz); + }; - toArray : function () { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hours(), - m.minutes(), - m.seconds(), - m.milliseconds() - ]; - }, + /** + * Convert a translation point to a point on the screen + * @param {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera + * @return {Point2d} point2d A 2D point with parameters x, y + */ + Graph3d.prototype._convertTranslationToScreen = function(translation) { + var ex = this.eye.x, + ey = this.eye.y, + ez = this.eye.z, + dx = translation.x, + dy = translation.y, + dz = translation.z; - isValid : function () { - return isValid(this); - }, + // calculate position on screen from translation + var bx; + var by; + if (this.showPerspective) { + bx = (dx - ex) * (ez / dz); + by = (dy - ey) * (ez / dz); + } + else { + bx = dx * -(ez / this.camera.getArmLength()); + by = dy * -(ez / this.camera.getArmLength()); + } - isDSTShifted : function () { - if (this._a) { - return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; - } + // shift and scale the point to the center of the screen + // use the width of the graph to scale both horizontally and vertically. + return new Point2d( + this.xcenter + bx * this.frame.canvas.clientWidth, + this.ycenter - by * this.frame.canvas.clientWidth); + }; - return false; - }, + /** + * Set the background styling for the graph + * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor + */ + Graph3d.prototype._setBackgroundColor = function(backgroundColor) { + var fill = 'white'; + var stroke = 'gray'; + var strokeWidth = 1; - parsingFlags : function () { - return extend({}, this._pf); - }, + if (typeof(backgroundColor) === 'string') { + fill = backgroundColor; + stroke = 'none'; + strokeWidth = 0; + } + else if (typeof(backgroundColor) === 'object') { + if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; + if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; + if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; + } + else if (backgroundColor === undefined) { + // use use defaults + } + else { + throw 'Unsupported type of backgroundColor'; + } - invalidAt: function () { - return this._pf.overflow; - }, + this.frame.style.backgroundColor = fill; + this.frame.style.borderColor = stroke; + this.frame.style.borderWidth = strokeWidth + 'px'; + this.frame.style.borderStyle = 'solid'; + }; - utc : function (keepLocalTime) { - return this.zone(0, keepLocalTime); - }, - local : function (keepLocalTime) { - if (this._isUTC) { - this.zone(0, keepLocalTime); - this._isUTC = false; + /// enumerate the available styles + Graph3d.STYLE = { + BAR: 0, + BARCOLOR: 1, + BARSIZE: 2, + DOT : 3, + DOTLINE : 4, + DOTCOLOR: 5, + DOTSIZE: 6, + GRID : 7, + LINE: 8, + SURFACE : 9 + }; - if (keepLocalTime) { - this.add(this._dateTzOffset(), 'm'); - } - } - return this; - }, + /** + * Retrieve the style index from given styleName + * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' + * @return {Number} styleNumber Enumeration value representing the style, or -1 + * when not found + */ + Graph3d.prototype._getStyleNumber = function(styleName) { + switch (styleName) { + case 'dot': return Graph3d.STYLE.DOT; + case 'dot-line': return Graph3d.STYLE.DOTLINE; + case 'dot-color': return Graph3d.STYLE.DOTCOLOR; + case 'dot-size': return Graph3d.STYLE.DOTSIZE; + case 'line': return Graph3d.STYLE.LINE; + case 'grid': return Graph3d.STYLE.GRID; + case 'surface': return Graph3d.STYLE.SURFACE; + case 'bar': return Graph3d.STYLE.BAR; + case 'bar-color': return Graph3d.STYLE.BARCOLOR; + case 'bar-size': return Graph3d.STYLE.BARSIZE; + } - format : function (inputString) { - var output = formatMoment(this, inputString || moment.defaultFormat); - return this.localeData().postformat(output); - }, + return -1; + }; - add : createAdder(1, 'add'), + /** + * Determine the indexes of the data columns, based on the given style and data + * @param {DataSet} data + * @param {Number} style + */ + Graph3d.prototype._determineColumnIndexes = function(data, style) { + if (this.style === Graph3d.STYLE.DOT || + this.style === Graph3d.STYLE.DOTLINE || + this.style === Graph3d.STYLE.LINE || + this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE || + this.style === Graph3d.STYLE.BAR) { + // 3 columns expected, and optionally a 4th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = undefined; - subtract : createAdder(-1, 'subtract'), + if (data.getNumberOfColumns() > 3) { + this.colFilter = 3; + } + } + else if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // 4 columns expected, and optionally a 5th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = 3; - diff : function (input, units, asFloat) { - var that = makeAs(input, this), - zoneDiff = (this.zone() - that.zone()) * 6e4, - diff, output, daysAdjust; + if (data.getNumberOfColumns() > 4) { + this.colFilter = 4; + } + } + else { + throw 'Unknown style "' + this.style + '"'; + } + }; - units = normalizeUnits(units); + Graph3d.prototype.getNumberOfRows = function(data) { + return data.length; + } - if (units === 'year' || units === 'month') { - // average number of days in the months in the given dates - diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 - // difference in months - output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); - // adjust by taking difference in days, average number of days - // and dst in the given months. - daysAdjust = (this - moment(this).startOf('month')) - - (that - moment(that).startOf('month')); - // same as above but with zones, to negate all dst - daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) - - (that.zone() - moment(that).startOf('month').zone())) * 6e4; - output += daysAdjust / diff; - if (units === 'year') { - output = output / 12; - } - } else { - diff = (this - that); - output = units === 'second' ? diff / 1e3 : // 1000 - units === 'minute' ? diff / 6e4 : // 1000 * 60 - units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - diff; - } - return asFloat ? output : absRound(output); - }, - from : function (time, withoutSuffix) { - return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - }, + Graph3d.prototype.getNumberOfColumns = function(data) { + var counter = 0; + for (var column in data[0]) { + if (data[0].hasOwnProperty(column)) { + counter++; + } + } + return counter; + } - fromNow : function (withoutSuffix) { - return this.from(moment(), withoutSuffix); - }, - calendar : function (time) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're zone'd or not. - var now = time || moment(), - sod = makeAs(now, this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.localeData().calendar(format, this)); - }, + Graph3d.prototype.getDistinctValues = function(data, column) { + var distinctValues = []; + for (var i = 0; i < data.length; i++) { + if (distinctValues.indexOf(data[i][column]) == -1) { + distinctValues.push(data[i][column]); + } + } + return distinctValues; + } - isLeapYear : function () { - return isLeapYear(this.year()); - }, - isDST : function () { - return (this.zone() < this.clone().month(0).zone() || - this.zone() < this.clone().month(5).zone()); - }, + Graph3d.prototype.getColumnRange = function(data,column) { + var minMax = {min:data[0][column],max:data[0][column]}; + for (var i = 0; i < data.length; i++) { + if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } + if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } + } + return minMax; + }; - day : function (input) { - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - }, + /** + * Initialize the data from the data table. Calculate minimum and maximum values + * and column index values + * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. + * @param {Number} style Style Number + */ + Graph3d.prototype._dataInitialize = function (rawData, style) { + var me = this; - month : makeAccessor('Month', true), + // unsubscribe from the dataTable + if (this.dataSet) { + this.dataSet.off('*', this._onChange); + } - startOf : function (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - /* falls through */ - } + if (rawData === undefined) + return; + + if (Array.isArray(rawData)) { + rawData = new DataSet(rawData); + } + + var data; + if (rawData instanceof DataSet || rawData instanceof DataView) { + data = rawData.get(); + } + else { + throw new Error('Array, DataSet, or DataView expected'); + } - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } else if (units === 'isoWeek') { - this.isoWeekday(1); - } + if (data.length == 0) + return; - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } + this.dataSet = rawData; + this.dataTable = data; - return this; - }, + // subscribe to changes in the dataset + this._onChange = function () { + me.setData(me.dataSet); + }; + this.dataSet.on('*', this._onChange); - endOf: function (units) { - units = normalizeUnits(units); - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - }, + // _determineColumnIndexes + // getNumberOfRows (points) + // getNumberOfColumns (x,y,z,v,t,t1,t2...) + // getDistinctValues (unique values?) + // getColumnRange - isAfter: function (input, units) { - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this > +input; - } else { - return +this.clone().startOf(units) > +moment(input).startOf(units); - } - }, + // determine the location of x,y,z,value,filter columns + this.colX = 'x'; + this.colY = 'y'; + this.colZ = 'z'; + this.colValue = 'style'; + this.colFilter = 'filter'; - isBefore: function (input, units) { - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this < +input; - } else { - return +this.clone().startOf(units) < +moment(input).startOf(units); - } - }, - isSame: function (input, units) { - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this === +input; - } else { - return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); - } - }, - min: deprecate( - 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', - function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - } - ), + // check if a filter column is provided + if (data[0].hasOwnProperty('filter')) { + if (this.dataFilter === undefined) { + this.dataFilter = new Filter(rawData, this.colFilter, this); + this.dataFilter.setOnLoadCallback(function() {me.redraw();}); + } + } - max: deprecate( - 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', - function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - } - ), - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - zone : function (input, keepLocalTime) { - var offset = this._offset || 0, - localAdjust; - if (input != null) { - if (typeof input === 'string') { - input = timezoneMinutesFromString(input); - } - if (Math.abs(input) < 16) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = this._dateTzOffset(); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.subtract(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addOrSubtractDurationFromMoment(this, - moment.duration(offset - input, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - moment.updateOffset(this, true); - this._changeInProgress = null; - } - } - } else { - return this._isUTC ? offset : this._dateTzOffset(); - } - return this; - }, + var withBars = this.style == Graph3d.STYLE.BAR || + this.style == Graph3d.STYLE.BARCOLOR || + this.style == Graph3d.STYLE.BARSIZE; - zoneAbbr : function () { - return this._isUTC ? 'UTC' : ''; - }, + // determine barWidth from data + if (withBars) { + if (this.defaultXBarWidth !== undefined) { + this.xBarWidth = this.defaultXBarWidth; + } + else { + var dataX = this.getDistinctValues(data,this.colX); + this.xBarWidth = (dataX[1] - dataX[0]) || 1; + } - zoneName : function () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - }, + if (this.defaultYBarWidth !== undefined) { + this.yBarWidth = this.defaultYBarWidth; + } + else { + var dataY = this.getDistinctValues(data,this.colY); + this.yBarWidth = (dataY[1] - dataY[0]) || 1; + } + } - parseZone : function () { - if (this._tzm) { - this.zone(this._tzm); - } else if (typeof this._i === 'string') { - this.zone(this._i); - } - return this; - }, + // calculate minimums and maximums + var xRange = this.getColumnRange(data,this.colX); + if (withBars) { + xRange.min -= this.xBarWidth / 2; + xRange.max += this.xBarWidth / 2; + } + this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; + this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; + if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; + this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; - hasAlignedHourOffset : function (input) { - if (!input) { - input = 0; - } - else { - input = moment(input).zone(); - } + var yRange = this.getColumnRange(data,this.colY); + if (withBars) { + yRange.min -= this.yBarWidth / 2; + yRange.max += this.yBarWidth / 2; + } + this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; + this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; + if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; + this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; - return (this.zone() - input) % 60 === 0; - }, + var zRange = this.getColumnRange(data,this.colZ); + this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; + this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; + if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; + this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; - daysInMonth : function () { - return daysInMonth(this.year(), this.month()); - }, + if (this.colValue !== undefined) { + var valueRange = this.getColumnRange(data,this.colValue); + this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; + this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; + if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; + } - dayOfYear : function (input) { - var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - }, + // set the scale dependent on the ranges. + this._setScale(); + }; - quarter : function (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - }, - weekYear : function (input) { - var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; - return input == null ? year : this.add((input - year), 'y'); - }, - isoWeekYear : function (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add((input - year), 'y'); - }, + /** + * Filter the data based on the current filter + * @param {Array} data + * @return {Array} dataPoints Array with point objects which can be drawn on screen + */ + Graph3d.prototype._getDataPoints = function (data) { + // TODO: store the created matrix dataPoints in the filters instead of reloading each time + var x, y, i, z, obj, point; - week : function (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - }, + var dataPoints = []; - isoWeek : function (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - }, + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + // copy all values from the google data table to a matrix + // the provided values are supposed to form a grid of (x,y) positions - weekday : function (input) { - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - }, + // create two lists with all present x and y values + var dataX = []; + var dataY = []; + for (i = 0; i < this.getNumberOfRows(data); i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; - isoWeekday : function (input) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - }, + if (dataX.indexOf(x) === -1) { + dataX.push(x); + } + if (dataY.indexOf(y) === -1) { + dataY.push(y); + } + } - isoWeeksInYear : function () { - return weeksInYear(this.year(), 1, 4); - }, + function sortNumber(a, b) { + return a - b; + } + dataX.sort(sortNumber); + dataY.sort(sortNumber); - weeksInYear : function () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - }, + // create a grid, a 2d matrix, with all values. + var dataMatrix = []; // temporary data matrix + for (i = 0; i < data.length; i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; + z = data[i][this.colZ] || 0; - get : function (units) { - units = normalizeUnits(units); - return this[units](); - }, + var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer + var yIndex = dataY.indexOf(y); - set : function (units, value) { - units = normalizeUnits(units); - if (typeof this[units] === 'function') { - this[units](value); - } - return this; - }, + if (dataMatrix[xIndex] === undefined) { + dataMatrix[xIndex] = []; + } - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - locale : function (key) { - var newLocaleData; + var point3d = new Point3d(); + point3d.x = x; + point3d.y = y; + point3d.z = z; - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = moment.localeData(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - }, + obj = {}; + obj.point = point3d; + obj.trans = undefined; + obj.screen = undefined; + obj.bottom = new Point3d(x, y, this.zMin); - lang : deprecate( - 'moment().lang() is deprecated. Use moment().localeData() instead.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ), + dataMatrix[xIndex][yIndex] = obj; - localeData : function () { - return this._locale; - }, + dataPoints.push(obj); + } - _dateTzOffset : function () { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return Math.round(this._d.getTimezoneOffset() / 15) * 15; + // fill in the pointers to the neighbors. + for (x = 0; x < dataMatrix.length; x++) { + for (y = 0; y < dataMatrix[x].length; y++) { + if (dataMatrix[x][y]) { + dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; + dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; + dataMatrix[x][y].pointCross = + (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? + dataMatrix[x+1][y+1] : + undefined; } - }); + } + } + } + else { // 'dot', 'dot-line', etc. + // copy all values from the google data table to a list with Point3d objects + for (i = 0; i < data.length; i++) { + point = new Point3d(); + point.x = data[i][this.colX] || 0; + point.y = data[i][this.colY] || 0; + point.z = data[i][this.colZ] || 0; - function rawMonthSetter(mom, value) { - var dayOfMonth; + if (this.colValue !== undefined) { + point.value = data[i][this.colValue] || 0; + } - // TODO: Move this out of here! - if (typeof value === 'string') { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; - } - } + obj = {}; + obj.point = point; + obj.bottom = new Point3d(point.x, point.y, this.zMin); + obj.trans = undefined; + obj.screen = undefined; - dayOfMonth = Math.min(mom.date(), - daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; + dataPoints.push(obj); } + } - function rawGetter(mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); - } + return dataPoints; + }; - function rawSetter(mom, unit, value) { - if (unit === 'Month') { - return rawMonthSetter(mom, value); - } else { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } + /** + * Create the main frame for the Graph3d. + * This function is executed once when a Graph3d object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. + */ + Graph3d.prototype.create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); + } - function makeAccessor(unit, keepTime) { - return function (value) { - if (value != null) { - rawSetter(this, unit, value); - moment.updateOffset(this, keepTime); - return this; - } else { - return rawGetter(this, unit); - } - }; - } + this.frame = document.createElement('div'); + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; - moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); - moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); - moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); - // Setting the hour should keep the time, because the user explicitly - // specified which hour he wants. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); - // moment.fn.month is defined separately - moment.fn.date = makeAccessor('Date', true); - moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); - moment.fn.year = makeAccessor('FullYear', true); - moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + // create the graph canvas (HTML canvas element) + this.frame.canvas = document.createElement( 'canvas' ); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + //if (!this.frame.canvas.getContext) { + { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } - // add plural methods - moment.fn.days = moment.fn.day; - moment.fn.months = moment.fn.month; - moment.fn.weeks = moment.fn.week; - moment.fn.isoWeeks = moment.fn.isoWeek; - moment.fn.quarters = moment.fn.quarter; + this.frame.filter = document.createElement( 'div' ); + this.frame.filter.style.position = 'absolute'; + this.frame.filter.style.bottom = '0px'; + this.frame.filter.style.left = '0px'; + this.frame.filter.style.width = '100%'; + this.frame.appendChild(this.frame.filter); + + // add event listeners to handle moving and zooming the contents + var me = this; + var onmousedown = function (event) {me._onMouseDown(event);}; + var ontouchstart = function (event) {me._onTouchStart(event);}; + var onmousewheel = function (event) {me._onWheel(event);}; + var ontooltip = function (event) {me._onTooltip(event);}; + // TODO: these events are never cleaned up... can give a 'memory leakage' + + util.addEventListener(this.frame.canvas, 'keydown', onkeydown); + util.addEventListener(this.frame.canvas, 'mousedown', onmousedown); + util.addEventListener(this.frame.canvas, 'touchstart', ontouchstart); + util.addEventListener(this.frame.canvas, 'mousewheel', onmousewheel); + util.addEventListener(this.frame.canvas, 'mousemove', ontooltip); + + // add the new graph to the container element + this.containerElement.appendChild(this.frame); + }; + + + /** + * Set a new size for the graph + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') + */ + Graph3d.prototype.setSize = function(width, height) { + this.frame.style.width = width; + this.frame.style.height = height; + + this._resizeCanvas(); + }; + + /** + * Resize the canvas to the current size of the frame + */ + Graph3d.prototype._resizeCanvas = function() { + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; + + this.frame.canvas.width = this.frame.canvas.clientWidth; + this.frame.canvas.height = this.frame.canvas.clientHeight; + + // adjust with for margin + this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; + }; + + /** + * Start animation + */ + Graph3d.prototype.animationStart = function() { + if (!this.frame.filter || !this.frame.filter.slider) + throw 'No animation available'; - // add aliased format methods - moment.fn.toJSON = moment.fn.toISOString; + this.frame.filter.slider.play(); + }; - /************************************ - Duration Prototype - ************************************/ + /** + * Stop animation + */ + Graph3d.prototype.animationStop = function() { + if (!this.frame.filter || !this.frame.filter.slider) return; - function daysToYears (days) { - // 400 years have 146097 days (taking into account leap year rules) - return days * 400 / 146097; - } + this.frame.filter.slider.stop(); + }; - function yearsToDays (years) { - // years * 365 + absRound(years / 4) - - // absRound(years / 100) + absRound(years / 400); - return years * 146097 / 400; - } - extend(moment.duration.fn = Duration.prototype, { + /** + * Resize the center position based on the current values in this.defaultXCenter + * and this.defaultYCenter (which are strings with a percentage or a value + * in pixels). The center positions are the variables this.xCenter + * and this.yCenter + */ + Graph3d.prototype._resizeCenter = function() { + // calculate the horizontal center position + if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { + this.xcenter = + parseFloat(this.defaultXCenter) / 100 * + this.frame.canvas.clientWidth; + } + else { + this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px + } - _bubble : function () { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, minutes, hours, years = 0; + // calculate the vertical center position + if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { + this.ycenter = + parseFloat(this.defaultYCenter) / 100 * + (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); + } + else { + this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px + } + }; - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; + /** + * Set the rotation and distance of the camera + * @param {Object} pos An object with the camera position. The object + * contains three parameters: + * - horizontal {Number} + * The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * - vertical {Number} + * The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + * - distance {Number} + * The (normalized) distance of the camera to the + * center of the graph, a value between 0.71 and 5.0. + * Optional, can be left undefined. + */ + Graph3d.prototype.setCameraPosition = function(pos) { + if (pos === undefined) { + return; + } - seconds = absRound(milliseconds / 1000); - data.seconds = seconds % 60; + if (pos.horizontal !== undefined && pos.vertical !== undefined) { + this.camera.setArmRotation(pos.horizontal, pos.vertical); + } - minutes = absRound(seconds / 60); - data.minutes = minutes % 60; + if (pos.distance !== undefined) { + this.camera.setArmLength(pos.distance); + } - hours = absRound(minutes / 60); - data.hours = hours % 24; + this.redraw(); + }; - days += absRound(hours / 24); - // Accurately convert days to years, assume start from year 0. - years = absRound(daysToYears(days)); - days -= absRound(yearsToDays(years)); + /** + * Retrieve the current camera rotation + * @return {object} An object with parameters horizontal, vertical, and + * distance + */ + Graph3d.prototype.getCameraPosition = function() { + var pos = this.camera.getArmRotation(); + pos.distance = this.camera.getArmLength(); + return pos; + }; - // 30 days to a month - // TODO (iskren): Use anchor date (like 1st Jan) to compute this. - months += absRound(days / 30); - days %= 30; + /** + * Load data into the 3D Graph + */ + Graph3d.prototype._readData = function(data) { + // read the data + this._dataInitialize(data, this.style); - // 12 months -> 1 year - years += absRound(months / 12); - months %= 12; - data.days = days; - data.months = months; - data.years = years; - }, + if (this.dataFilter) { + // apply filtering + this.dataPoints = this.dataFilter._getDataPoints(); + } + else { + // no filtering. load all data + this.dataPoints = this._getDataPoints(this.dataTable); + } - abs : function () { - this._milliseconds = Math.abs(this._milliseconds); - this._days = Math.abs(this._days); - this._months = Math.abs(this._months); + // draw the filter + this._redrawFilter(); + }; - this._data.milliseconds = Math.abs(this._data.milliseconds); - this._data.seconds = Math.abs(this._data.seconds); - this._data.minutes = Math.abs(this._data.minutes); - this._data.hours = Math.abs(this._data.hours); - this._data.months = Math.abs(this._data.months); - this._data.years = Math.abs(this._data.years); + /** + * Replace the dataset of the Graph3d + * @param {Array | DataSet | DataView} data + */ + Graph3d.prototype.setData = function (data) { + this._readData(data); + this.redraw(); - return this; - }, + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } + }; - weeks : function () { - return absRound(this.days() / 7); - }, + /** + * Update the options. Options will be merged with current options + * @param {Object} options + */ + Graph3d.prototype.setOptions = function (options) { + var cameraPosition = undefined; - valueOf : function () { - return this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6; - }, + this.animationStop(); - humanize : function (withSuffix) { - var output = relativeTime(this, !withSuffix, this.localeData()); + if (options !== undefined) { + // retrieve parameter values + if (options.width !== undefined) this.width = options.width; + if (options.height !== undefined) this.height = options.height; - if (withSuffix) { - output = this.localeData().pastFuture(+this, output); - } + if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; + if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; - return this.localeData().postformat(output); - }, + if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; + if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; + if (options.xLabel !== undefined) this.xLabel = options.xLabel; + if (options.yLabel !== undefined) this.yLabel = options.yLabel; + if (options.zLabel !== undefined) this.zLabel = options.zLabel; - add : function (input, val) { - // supports only 2.0-style add(1, 's') or add(moment) - var dur = moment.duration(input, val); + if (options.xValueLabel !== undefined) this.xValueLabel = options.xValueLabel; + if (options.yValueLabel !== undefined) this.yValueLabel = options.yValueLabel; + if (options.zValueLabel !== undefined) this.zValueLabel = options.zValueLabel; - this._milliseconds += dur._milliseconds; - this._days += dur._days; - this._months += dur._months; + if (options.style !== undefined) { + var styleNumber = this._getStyleNumber(options.style); + if (styleNumber !== -1) { + this.style = styleNumber; + } + } + if (options.showGrid !== undefined) this.showGrid = options.showGrid; + if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; + if (options.showShadow !== undefined) this.showShadow = options.showShadow; + if (options.tooltip !== undefined) this.showTooltip = options.tooltip; + if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; + if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; + if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; - this._bubble(); + if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; + if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; + if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; - return this; - }, + if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; + if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; - subtract : function (input, val) { - var dur = moment.duration(input, val); + if (options.xMin !== undefined) this.defaultXMin = options.xMin; + if (options.xStep !== undefined) this.defaultXStep = options.xStep; + if (options.xMax !== undefined) this.defaultXMax = options.xMax; + if (options.yMin !== undefined) this.defaultYMin = options.yMin; + if (options.yStep !== undefined) this.defaultYStep = options.yStep; + if (options.yMax !== undefined) this.defaultYMax = options.yMax; + if (options.zMin !== undefined) this.defaultZMin = options.zMin; + if (options.zStep !== undefined) this.defaultZStep = options.zStep; + if (options.zMax !== undefined) this.defaultZMax = options.zMax; + if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; + if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; - this._milliseconds -= dur._milliseconds; - this._days -= dur._days; - this._months -= dur._months; + if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; - this._bubble(); + if (cameraPosition !== undefined) { + this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); + this.camera.setArmLength(cameraPosition.distance); + } + else { + this.camera.setArmRotation(1.0, 0.5); + this.camera.setArmLength(1.7); + } + } - return this; - }, + this._setBackgroundColor(options && options.backgroundColor); - get : function (units) { - units = normalizeUnits(units); - return this[units.toLowerCase() + 's'](); - }, + this.setSize(this.width, this.height); - as : function (units) { - var days, months; - units = normalizeUnits(units); + // re-load the data + if (this.dataTable) { + this.setData(this.dataTable); + } - if (units === 'month' || units === 'year') { - days = this._days + this._milliseconds / 864e5; - months = this._months + daysToYears(days) * 12; - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + yearsToDays(this._months / 12); - switch (units) { - case 'week': return days / 7 + this._milliseconds / 6048e5; - case 'day': return days + this._milliseconds / 864e5; - case 'hour': return days * 24 + this._milliseconds / 36e5; - case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; - case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - }, + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } + }; - lang : moment.fn.lang, - locale : moment.fn.locale, + /** + * Redraw the Graph. + */ + Graph3d.prototype.redraw = function() { + if (this.dataPoints === undefined) { + throw 'Error: graph data not initialized'; + } - toIsoString : deprecate( - 'toIsoString() is deprecated. Please use toISOString() instead ' + - '(notice the capitals)', - function () { - return this.toISOString(); - } - ), + this._resizeCanvas(); + this._resizeCenter(); + this._redrawSlider(); + this._redrawClear(); + this._redrawAxis(); - toISOString : function () { - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var years = Math.abs(this.years()), - months = Math.abs(this.months()), - days = Math.abs(this.days()), - hours = Math.abs(this.hours()), - minutes = Math.abs(this.minutes()), - seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + this._redrawDataGrid(); + } + else if (this.style === Graph3d.STYLE.LINE) { + this._redrawDataLine(); + } + else if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + this._redrawDataBar(); + } + else { + // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE + this._redrawDataDot(); + } - if (!this.asSeconds()) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } + this._redrawInfo(); + this._redrawLegend(); + }; - return (this.asSeconds() < 0 ? '-' : '') + - 'P' + - (years ? years + 'Y' : '') + - (months ? months + 'M' : '') + - (days ? days + 'D' : '') + - ((hours || minutes || seconds) ? 'T' : '') + - (hours ? hours + 'H' : '') + - (minutes ? minutes + 'M' : '') + - (seconds ? seconds + 'S' : ''); - }, + /** + * Clear the canvas before redrawing + */ + Graph3d.prototype._redrawClear = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); - localeData : function () { - return this._locale; - } - }); + ctx.clearRect(0, 0, canvas.width, canvas.height); + }; - moment.duration.fn.toString = moment.duration.fn.toISOString; - function makeDurationGetter(name) { - moment.duration.fn[name] = function () { - return this._data[name]; - }; - } + /** + * Redraw the legend showing the colors + */ + Graph3d.prototype._redrawLegend = function() { + var y; - for (i in unitMillisecondFactors) { - if (hasOwnProp(unitMillisecondFactors, i)) { - makeDurationGetter(i.toLowerCase()); - } - } + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { - moment.duration.fn.asMilliseconds = function () { - return this.as('ms'); - }; - moment.duration.fn.asSeconds = function () { - return this.as('s'); - }; - moment.duration.fn.asMinutes = function () { - return this.as('m'); - }; - moment.duration.fn.asHours = function () { - return this.as('h'); - }; - moment.duration.fn.asDays = function () { - return this.as('d'); - }; - moment.duration.fn.asWeeks = function () { - return this.as('weeks'); - }; - moment.duration.fn.asMonths = function () { - return this.as('M'); - }; - moment.duration.fn.asYears = function () { - return this.as('y'); - }; + var dotSize = this.frame.clientWidth * 0.02; - /************************************ - Default Locale - ************************************/ + var widthMin, widthMax; + if (this.style === Graph3d.STYLE.DOTSIZE) { + widthMin = dotSize / 2; // px + widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function + } + else { + widthMin = 20; // px + widthMax = 20; // px + } + var height = Math.max(this.frame.clientHeight * 0.25, 100); + var top = this.margin; + var right = this.frame.clientWidth - this.margin; + var left = right - widthMax; + var bottom = top + height; + } - // Set default locale, other locale will inherit from English. - moment.locale('en', { - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + ctx.lineWidth = 1; + ctx.font = '14px arial'; // TODO: put in options - /* EMBED_LOCALES */ + if (this.style === Graph3d.STYLE.DOTCOLOR) { + // draw the color bar + var ymin = 0; + var ymax = height; // Todo: make height customizable + for (y = ymin; y < ymax; y++) { + var f = (y - ymin) / (ymax - ymin); - /************************************ - Exposing Moment - ************************************/ + //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function + var hue = f * 240; + var color = this._hsv2rgb(hue, 1, 1); - function makeGlobal(shouldDeprecate) { - /*global ender:false */ - if (typeof ender !== 'undefined') { - return; - } - oldGlobalMoment = globalScope.moment; - if (shouldDeprecate) { - globalScope.moment = deprecate( - 'Accessing Moment through the global scope is ' + - 'deprecated, and will be removed in an upcoming ' + - 'release.', - moment); - } else { - globalScope.moment = moment; - } + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(left, top + y); + ctx.lineTo(right, top + y); + ctx.stroke(); } - // CommonJS module is defined - if (hasModule) { - module.exports = moment; - } else if (true) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) { - if (module.config && module.config() && module.config().noGlobal === true) { - // release the global variable - globalScope.moment = oldGlobalMoment; - } + ctx.strokeStyle = this.colorAxis; + ctx.strokeRect(left, top, widthMax, height); + } - return moment; - }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - makeGlobal(true); - } else { - makeGlobal(); + if (this.style === Graph3d.STYLE.DOTSIZE) { + // draw border around color bar + ctx.strokeStyle = this.colorAxis; + ctx.fillStyle = this.colorDot; + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(right, top); + ctx.lineTo(right - widthMax + widthMin, bottom); + ctx.lineTo(left, bottom); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { + // print values along the color bar + var gridLineLen = 5; // px + var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); + step.start(); + if (step.getCurrent() < this.valueMin) { + step.next(); } - }).call(this); - - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(5)(module))) + while (!step.end()) { + y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { + ctx.beginPath(); + ctx.moveTo(left - gridLineLen, y); + ctx.lineTo(left, y); + ctx.stroke(); - function webpackContext(req) { - throw new Error("Cannot find module '" + req + "'."); - } - webpackContext.keys = function() { return []; }; - webpackContext.resolve = webpackContext; - module.exports = webpackContext; - webpackContext.id = 4; + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); + step.next(); + } -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { + ctx.textAlign = 'right'; + ctx.textBaseline = 'top'; + var label = this.legendLabel; + ctx.fillText(label, right, bottom + this.margin); + } + }; - module.exports = function(module) { - if(!module.webpackPolyfill) { - module.deprecate = function() {}; - module.paths = []; - // module.parent = undefined by default - module.children = []; - module.webpackPolyfill = 1; - } - return module; - } + /** + * Redraw the filter + */ + Graph3d.prototype._redrawFilter = function() { + this.frame.filter.innerHTML = ''; + if (this.dataFilter) { + var options = { + 'visible': this.showAnimationControls + }; + var slider = new Slider(this.frame.filter, options); + this.frame.filter.slider = slider; -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { + // TODO: css here is not nice here... + this.frame.filter.style.padding = '10px'; + //this.frame.filter.style.backgroundColor = '#EFEFEF'; - // DOM utility methods + slider.setValues(this.dataFilter.values); + slider.setPlayInterval(this.animationInterval); - /** - * this prepares the JSON container for allocating SVG elements - * @param JSONcontainer - * @private - */ - exports.prepareElements = function(JSONcontainer) { - // cleanup the redundant svgElements; - for (var elementType in JSONcontainer) { - if (JSONcontainer.hasOwnProperty(elementType)) { - JSONcontainer[elementType].redundant = JSONcontainer[elementType].used; - JSONcontainer[elementType].used = []; - } + // create an event handler + var me = this; + var onchange = function () { + var index = slider.getIndex(); + + me.dataFilter.selectValue(index); + me.dataPoints = me.dataFilter._getDataPoints(); + + me.redraw(); + }; + slider.setOnChangeCallback(onchange); + } + else { + this.frame.filter.slider = undefined; } }; /** - * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from - * which to remove the redundant elements. - * - * @param JSONcontainer - * @private + * Redraw the slider */ - exports.cleanupElements = function(JSONcontainer) { - // cleanup the redundant svgElements; - for (var elementType in JSONcontainer) { - if (JSONcontainer.hasOwnProperty(elementType)) { - if (JSONcontainer[elementType].redundant) { - for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) { - JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]); - } - JSONcontainer[elementType].redundant = []; - } - } + Graph3d.prototype._redrawSlider = function() { + if ( this.frame.filter.slider !== undefined) { + this.frame.filter.slider.redraw(); } }; + /** - * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer - * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. - * - * @param elementType - * @param JSONcontainer - * @param svgContainer - * @returns {*} - * @private + * Redraw common information */ - exports.getSVGElement = function (elementType, JSONcontainer, svgContainer) { - var element; - // allocate SVG element, if it doesnt yet exist, create one. - if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before - // check if there is an redundant element - if (JSONcontainer[elementType].redundant.length > 0) { - element = JSONcontainer[elementType].redundant[0]; - JSONcontainer[elementType].redundant.shift(); - } - else { - // create a new element and add it to the SVG - element = document.createElementNS('http://www.w3.org/2000/svg', elementType); - svgContainer.appendChild(element); - } - } - else { - // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. - element = document.createElementNS('http://www.w3.org/2000/svg', elementType); - JSONcontainer[elementType] = {used: [], redundant: []}; - svgContainer.appendChild(element); + Graph3d.prototype._redrawInfo = function() { + if (this.dataFilter) { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + + ctx.font = '14px arial'; // TODO: put in options + ctx.lineStyle = 'gray'; + ctx.fillStyle = 'gray'; + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + var x = this.margin; + var y = this.margin; + ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); } - JSONcontainer[elementType].used.push(element); - return element; }; /** - * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer - * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. - * - * @param elementType - * @param JSONcontainer - * @param DOMContainer - * @returns {*} - * @private + * Redraw the axis */ - exports.getDOMElement = function (elementType, JSONcontainer, DOMContainer, insertBefore) { - var element; - // allocate DOM element, if it doesnt yet exist, create one. - if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before - // check if there is an redundant element - if (JSONcontainer[elementType].redundant.length > 0) { - element = JSONcontainer[elementType].redundant[0]; - JSONcontainer[elementType].redundant.shift(); + Graph3d.prototype._redrawAxis = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + from, to, step, prettyStep, + text, xText, yText, zText, + offset, xOffset, yOffset, + xMin2d, xMax2d; + + // TODO: get the actual rendered style of the containerElement + //ctx.font = this.containerElement.style.font; + ctx.font = 24 / this.camera.getArmLength() + 'px arial'; + + // calculate the length for the short grid lines + var gridLenX = 0.025 / this.scale.x; + var gridLenY = 0.025 / this.scale.y; + var textMargin = 5 / this.camera.getArmLength(); // px + var armAngle = this.camera.getArmRotation().horizontal; + + // draw x-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultXStep === undefined); + step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); + step.start(); + if (step.getCurrent() < this.xMin) { + step.next(); + } + while (!step.end()) { + var x = step.getCurrent(); + + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); } else { - // create a new element and add it to the SVG - element = document.createElement(elementType); - if (insertBefore !== undefined) { - DOMContainer.insertBefore(element, insertBefore); - } - else { - DOMContainer.appendChild(element); - } + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + + from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); } - } - else { - // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. - element = document.createElement(elementType); - JSONcontainer[elementType] = {used: [], redundant: []}; - if (insertBefore !== undefined) { - DOMContainer.insertBefore(element, insertBefore); + + yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; + text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; } else { - DOMContainer.appendChild(element); + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; } - } - JSONcontainer[elementType].used.push(element); - return element; - }; - - - + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + this.xValueLabel(step.getCurrent()) + ' ', text.x, text.y); - /** - * draw a point object. this is a seperate function because it can also be called by the legend. - * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions - * as well. - * - * @param x - * @param y - * @param group - * @param JSONcontainer - * @param svgContainer - * @returns {*} - */ - exports.drawPoint = function(x, y, group, JSONcontainer, svgContainer) { - var point; - if (group.options.drawPoints.style == 'circle') { - point = exports.getSVGElement('circle',JSONcontainer,svgContainer); - point.setAttributeNS(null, "cx", x); - point.setAttributeNS(null, "cy", y); - point.setAttributeNS(null, "r", 0.5 * group.options.drawPoints.size); - } - else { - point = exports.getSVGElement('rect',JSONcontainer,svgContainer); - point.setAttributeNS(null, "x", x - 0.5*group.options.drawPoints.size); - point.setAttributeNS(null, "y", y - 0.5*group.options.drawPoints.size); - point.setAttributeNS(null, "width", group.options.drawPoints.size); - point.setAttributeNS(null, "height", group.options.drawPoints.size); + step.next(); } - if(group.options.drawPoints.styles !== undefined) { - point.setAttributeNS(null, "style", group.group.options.drawPoints.styles); + // draw y-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultYStep === undefined); + step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); + step.start(); + if (step.getCurrent() < this.yMin) { + step.next(); } - point.setAttributeNS(null, "class", group.className + " point"); - return point; - }; + while (!step.end()) { + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + else { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - /** - * draw a bar SVG element centered on the X coordinate - * - * @param x - * @param y - * @param className - */ - exports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer) { - if (height != 0) { - if (height < 0) { - height *= -1; - y -= height; + from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); } - var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer); - rect.setAttributeNS(null, "x", x - 0.5 * width); - rect.setAttributeNS(null, "y", y); - rect.setAttributeNS(null, "width", width); - rect.setAttributeNS(null, "height", height); - rect.setAttributeNS(null, "class", className); + + xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; + text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + this.yValueLabel(step.getCurrent()) + ' ', text.x, text.y); + + step.next(); } - }; -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { + // draw z-grid lines and axis + ctx.lineWidth = 1; + prettyStep = (this.defaultZStep === undefined); + step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); + step.start(); + if (step.getCurrent() < this.zMin) { + step.next(); + } + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + while (!step.end()) { + // TODO: make z-grid lines really 3d? + from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(from.x - textMargin, from.y); + ctx.stroke(); - var util = __webpack_require__(1); - var Queue = __webpack_require__(8); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(this.zValueLabel(step.getCurrent()) + ' ', from.x - 5, from.y); - /** - * DataSet - * - * Usage: - * var dataSet = new DataSet({ - * fieldId: '_id', - * type: { - * // ... - * } - * }); - * - * dataSet.add(item); - * dataSet.add(data); - * dataSet.update(item); - * dataSet.update(data); - * dataSet.remove(id); - * dataSet.remove(ids); - * var data = dataSet.get(); - * var data = dataSet.get(id); - * var data = dataSet.get(ids); - * var data = dataSet.get(ids, options, data); - * dataSet.clear(); - * - * A data set can: - * - add/remove/update data - * - gives triggers upon changes in the data - * - can import/export data in various data formats - * - * @param {Array | DataTable} [data] Optional array with initial data - * @param {Object} [options] Available options: - * {String} fieldId Field name of the id in the - * items, 'id' by default. - * {Object. 0) { + yOffset = 0.1 / this.scale.y; + xText = (this.xMin + this.xMax) / 2; + yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(xLabel, text.x, text.y); } - // TODO: deprecated since version 1.1.1 (or 2.0.0?) - if (this._options.convert) { - throw new Error('Option "convert" is deprecated. Use "type" instead.'); - } - - this._subscribers = {}; // event subscribers - - // add initial data when provided - if (data) { - this.add(data); - } - - this.setOptions(options); - } - - /** - * @param {Object} [options] Available options: - * {Object} queue Queue changes to the DataSet, - * flush them all at once. - * Queue options: - * - {number} delay Delay in ms, null by default - * - {number} max Maximum number of entries in the queue, Infinity by default - * @param options - */ - DataSet.prototype.setOptions = function(options) { - if (options && options.queue !== undefined) { - if (options.queue === false) { - // delete queue if loaded - if (this._queue) { - this._queue.destroy(); - delete this._queue; - } + // draw y-label + var yLabel = this.yLabel; + if (yLabel.length > 0) { + xOffset = 0.1 / this.scale.x; + xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; + yText = (this.yMin + this.yMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; } else { - // create queue and update its options - if (!this._queue) { - this._queue = Queue.extend(this, { - replace: ['add', 'update', 'remove'] - }); - } - - if (typeof options.queue === 'object') { - this._queue.setOptions(options.queue); - } + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; } + ctx.fillStyle = this.colorAxis; + ctx.fillText(yLabel, text.x, text.y); + } + + // draw z-label + var zLabel = this.zLabel; + if (zLabel.length > 0) { + offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + zText = (this.zMin + this.zMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, zText)); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(zLabel, text.x - offset, text.y); } }; /** - * Subscribe to an event, add an event listener - * @param {String} event Event name. Available events: 'put', 'update', - * 'remove' - * @param {function} callback Callback method. Called with three parameters: - * {String} event - * {Object | null} params - * {String | Number} senderId + * Calculate the color based on the given value. + * @param {Number} H Hue, a value be between 0 and 360 + * @param {Number} S Saturation, a value between 0 and 1 + * @param {Number} V Value, a value between 0 and 1 */ - DataSet.prototype.on = function(event, callback) { - var subscribers = this._subscribers[event]; - if (!subscribers) { - subscribers = []; - this._subscribers[event] = subscribers; - } + Graph3d.prototype._hsv2rgb = function(H, S, V) { + var R, G, B, C, Hi, X; - subscribers.push({ - callback: callback - }); - }; + C = V * S; + Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 + X = C * (1 - Math.abs(((H/60) % 2) - 1)); - // TODO: make this function deprecated (replaced with `on` since version 0.5) - DataSet.prototype.subscribe = DataSet.prototype.on; + switch (Hi) { + case 0: R = C; G = X; B = 0; break; + case 1: R = X; G = C; B = 0; break; + case 2: R = 0; G = C; B = X; break; + case 3: R = 0; G = X; B = C; break; + case 4: R = X; G = 0; B = C; break; + case 5: R = C; G = 0; B = X; break; - /** - * Unsubscribe from an event, remove an event listener - * @param {String} event - * @param {function} callback - */ - DataSet.prototype.off = function(event, callback) { - var subscribers = this._subscribers[event]; - if (subscribers) { - this._subscribers[event] = subscribers.filter(function (listener) { - return (listener.callback != callback); - }); + default: R = 0; G = 0; B = 0; break; } + + return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; }; - // TODO: make this function deprecated (replaced with `on` since version 0.5) - DataSet.prototype.unsubscribe = DataSet.prototype.off; /** - * Trigger an event - * @param {String} event - * @param {Object | null} params - * @param {String} [senderId] Optional id of the sender. - * @private + * Draw all datapoints as a grid + * This function can be used when the style is 'grid' */ - DataSet.prototype._trigger = function (event, params, senderId) { - if (event == '*') { - throw new Error('Cannot trigger event *'); - } + Graph3d.prototype._redrawDataGrid = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, right, top, cross, + i, + topSideVisible, fillStyle, strokeStyle, lineWidth, + h, s, v, zAvg; - var subscribers = []; - if (event in this._subscribers) { - subscribers = subscribers.concat(this._subscribers[event]); - } - if ('*' in this._subscribers) { - subscribers = subscribers.concat(this._subscribers['*']); - } - for (var i = 0; i < subscribers.length; i++) { - var subscriber = subscribers[i]; - if (subscriber.callback) { - subscriber.callback(event, params, senderId || null); - } - } - }; + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - /** - * Add data. - * Adding an item will fail when there already is an item with the same id. - * @param {Object | Array | DataTable} data - * @param {String} [senderId] Optional sender id - * @return {Array} addedIds Array with the ids of the added items - */ - DataSet.prototype.add = function (data, senderId) { - var addedIds = [], - id, - me = this; + // calculate the translations and screen position of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); - if (Array.isArray(data)) { - // Array - for (var i = 0, len = data.length; i < len; i++) { - id = me._addItem(data[i]); - addedIds.push(id); - } - } - else if (util.isDataTable(data)) { - // Google DataTable - var columns = this._getColumnNames(data); - for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { - var item = {}; - for (var col = 0, cols = columns.length; col < cols; col++) { - var field = columns[col]; - item[field] = data.getValue(row, col); - } + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - id = me._addItem(item); - addedIds.push(id); - } - } - else if (data instanceof Object) { - // Single item - id = me._addItem(data); - addedIds.push(id); - } - else { - throw new Error('Unknown dataType'); + // calculate the translation of the point at the bottom (needed for sorting) + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; } - if (addedIds.length) { - this._trigger('add', {items: addedIds}, senderId); - } + // sort the points on depth of their (x,y) position (not on z) + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - return addedIds; - }; + if (this.style === Graph3d.STYLE.SURFACE) { + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; + cross = this.dataPoints[i].pointCross; - /** - * Update existing items. When an item does not exist, it will be created - * @param {Object | Array | DataTable} data - * @param {String} [senderId] Optional sender id - * @return {Array} updatedIds The ids of the added or updated items - */ - DataSet.prototype.update = function (data, senderId) { - var addedIds = []; - var updatedIds = []; - var updatedData = []; - var me = this; - var fieldId = me._fieldId; + if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { - var addOrUpdate = function (item) { - var id = item[fieldId]; - if (me._data[id]) { - // update item - id = me._updateItem(item); - updatedIds.push(id); - updatedData.push(item); - } - else { - // add new item - id = me._addItem(item); - addedIds.push(id); - } - }; + if (this.showGrayBottom || this.showShadow) { + // calculate the cross product of the two vectors from center + // to left and right, in order to know whether we are looking at the + // bottom or at the top side. We can also use the cross product + // for calculating light intensity + var aDiff = Point3d.subtract(cross.trans, point.trans); + var bDiff = Point3d.subtract(top.trans, right.trans); + var crossproduct = Point3d.crossProduct(aDiff, bDiff); + var len = crossproduct.length(); + // FIXME: there is a bug with determining the surface side (shadow or colored) - if (Array.isArray(data)) { - // Array - for (var i = 0, len = data.length; i < len; i++) { - addOrUpdate(data[i]); + topSideVisible = (crossproduct.z > 0); + } + else { + topSideVisible = true; + } + + if (topSideVisible) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + s = 1; // saturation + + if (this.showShadow) { + v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = fillStyle; + } + else { + v = 1; + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = this.colorAxis; + } + } + else { + fillStyle = 'gray'; + strokeStyle = this.colorAxis; + } + lineWidth = 0.5; + + ctx.lineWidth = lineWidth; + ctx.fillStyle = fillStyle; + ctx.strokeStyle = strokeStyle; + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.lineTo(cross.screen.x, cross.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } } } - else if (util.isDataTable(data)) { - // Google DataTable - var columns = this._getColumnNames(data); - for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { - var item = {}; - for (var col = 0, cols = columns.length; col < cols; col++) { - var field = columns[col]; - item[field] = data.getValue(row, col); + else { // grid style + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; + + if (point !== undefined) { + if (this.showPerspective) { + lineWidth = 2 / -point.trans.z; + } + else { + lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); + } } - addOrUpdate(item); - } - } - else if (data instanceof Object) { - // Single item - addOrUpdate(data); - } - else { - throw new Error('Unknown dataType'); - } + if (point !== undefined && right !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - if (addedIds.length) { - this._trigger('add', {items: addedIds}, senderId); - } - if (updatedIds.length) { - this._trigger('update', {items: updatedIds, data: updatedData}, senderId); - } + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.stroke(); + } - return addedIds.concat(updatedIds); + if (point !== undefined && top !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + top.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.stroke(); + } + } + } }; + /** - * Get a data item or multiple items. - * - * Usage: - * - * get() - * get(options: Object) - * get(options: Object, data: Array | DataTable) - * - * get(id: Number | String) - * get(id: Number | String, options: Object) - * get(id: Number | String, options: Object, data: Array | DataTable) - * - * get(ids: Number[] | String[]) - * get(ids: Number[] | String[], options: Object) - * get(ids: Number[] | String[], options: Object, data: Array | DataTable) - * - * Where: - * - * {Number | String} id The id of an item - * {Number[] | String{}} ids An array with ids of items - * {Object} options An Object with options. Available options: - * {String} [returnType] Type of data to be - * returned. Can be 'DataTable' or 'Array' (default) - * {Object.} [type] - * {String[]} [fields] field names to be returned - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * {Array | DataTable} [data] If provided, items will be appended to this - * array or table. Required in case of Google - * DataTable. - * - * @throws Error + * Draw all datapoints as dots. + * This function can be used when the style is 'dot' or 'dot-line' */ - DataSet.prototype.get = function (args) { - var me = this; + Graph3d.prototype._redrawDataDot = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i; - // parse the arguments - var id, ids, options, data; - var firstType = util.getType(arguments[0]); - if (firstType == 'String' || firstType == 'Number') { - // get(id [, options] [, data]) - id = arguments[0]; - options = arguments[1]; - data = arguments[2]; - } - else if (firstType == 'Array') { - // get(ids [, options] [, data]) - ids = arguments[0]; - options = arguments[1]; - data = arguments[2]; - } - else { - // get([, options] [, data]) - options = arguments[0]; - data = arguments[1]; - } + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - // determine the return type - var returnType; - if (options && options.returnType) { - var allowedValues = ["DataTable", "Array", "Object"]; - returnType = allowedValues.indexOf(options.returnType) == -1 ? "Array" : options.returnType; + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - if (data && (returnType != util.getType(data))) { - throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' + - 'does not correspond with specified options.type (' + options.type + ')'); - } - if (returnType == 'DataTable' && !util.isDataTable(data)) { - throw new Error('Parameter "data" must be a DataTable ' + - 'when options.type is "DataTable"'); - } - } - else if (data) { - returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; - } - else { - returnType = 'Array'; + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; } - // build options - var type = options && options.type || this._options.type; - var filter = options && options.filter; - var items = [], item, itemId, i, len; + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - // convert items - if (id != undefined) { - // return a single item - item = me._getItem(id, type); - if (filter && !filter(item)) { - item = null; - } - } - else if (ids != undefined) { - // return a subset of items - for (i = 0, len = ids.length; i < len; i++) { - item = me._getItem(ids[i], type); - if (!filter || filter(item)) { - items.push(item); - } - } - } - else { - // return all items - for (itemId in this._data) { - if (this._data.hasOwnProperty(itemId)) { - item = me._getItem(itemId, type); - if (!filter || filter(item)) { - items.push(item); - } - } + // draw the datapoints as colored circles + var dotSize = this.frame.clientWidth * 0.02; // px + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; + + if (this.style === Graph3d.STYLE.DOTLINE) { + // draw a vertical line from the bottom to the graph value + //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); + var from = this._convert3Dto2D(point.bottom); + ctx.lineWidth = 1; + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(point.screen.x, point.screen.y); + ctx.stroke(); } - } - // order the results - if (options && options.order && id == undefined) { - this._sort(items, options.order); - } - - // filter fields of the items - if (options && options.fields) { - var fields = options.fields; - if (id != undefined) { - item = this._filterFields(item, fields); + // calculate radius for the circle + var size; + if (this.style === Graph3d.STYLE.DOTSIZE) { + size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); } else { - for (i = 0, len = items.length; i < len; i++) { - items[i] = this._filterFields(items[i], fields); - } + size = dotSize; } - } - // return the results - if (returnType == 'DataTable') { - var columns = this._getColumnNames(data); - if (id != undefined) { - // append a single item to the data table - me._appendRow(data, columns, item); + var radius; + if (this.showPerspective) { + radius = size / -point.trans.z; } else { - // copy the items to the provided data table - for (i = 0; i < items.length; i++) { - me._appendRow(data, columns, items[i]); - } + radius = size * -(this.eye.z / this.camera.getArmLength()); } - return data; - } - else if (returnType == "Object") { - var result = {}; - for (i = 0; i < items.length; i++) { - result[items[i].id] = items[i]; + if (radius < 0) { + radius = 0; } - return result; - } - else { - // return an array - if (id != undefined) { - // a single item - return item; + + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.DOTCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.DOTSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; } else { - // multiple items - if (data) { - // copy the items to the provided array - for (i = 0, len = items.length; i < len; i++) { - data.push(items[i]); - } - return data; - } - else { - // just return our array - return items; - } + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); } + + // draw the circle + ctx.lineWidth = 1.0; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); + ctx.fill(); + ctx.stroke(); } }; /** - * Get ids of all items or from a filtered set of items. - * @param {Object} [options] An Object with options. Available options: - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * @return {Array} ids + * Draw all datapoints as bars. + * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' */ - DataSet.prototype.getIds = function (options) { - var data = this._data, - filter = options && options.filter, - order = options && options.order, - type = options && options.type || this._options.type, - i, - len, - id, - item, - items, - ids = []; + Graph3d.prototype._redrawDataBar = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i, j, surface, corners; - if (filter) { - // get filtered items - if (order) { - // create ordered list - items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - items.push(item); - } - } - } + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - this._sort(items, order); + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; - } - } - else { - // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - ids.push(item[this._fieldId]); - } - } - } - } + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; } - else { - // get all items - if (order) { - // create an ordered list - items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - items.push(data[id]); - } - } - this._sort(items, order); + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; - } + // draw the datapoints as bars + var xWidth = this.xBarWidth / 2; + var yWidth = this.yBarWidth / 2; + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; + + // determine color + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.BARCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.BARSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; } else { - // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = data[id]; - ids.push(item[this._fieldId]); - } - } + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); } - } - return ids; - }; + // calculate size for the bar + if (this.style === Graph3d.STYLE.BARSIZE) { + xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + } - /** - * Returns the DataSet itself. Is overwritten for example by the DataView, - * which returns the DataSet it is connected to instead. - */ - DataSet.prototype.getDataSet = function () { - return this; - }; + // calculate all corner points + var me = this; + var point3d = point.point; + var top = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} + ]; + var bottom = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} + ]; - /** - * Execute a callback function for every item in the dataset. - * @param {function} callback - * @param {Object} [options] Available options: - * {Object.} [type] - * {String[]} [fields] filter fields - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - */ - DataSet.prototype.forEach = function (callback, options) { - var filter = options && options.filter, - type = options && options.type || this._options.type, - data = this._data, - item, - id; + // calculate screen location of the points + top.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); + bottom.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); - if (options && options.order) { - // execute forEach on ordered list - var items = this.get(options); + // create five sides, calculate both corner points and center points + var surfaces = [ + {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, + {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, + {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, + {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, + {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} + ]; + point.surfaces = surfaces; - for (var i = 0, len = items.length; i < len; i++) { - item = items[i]; - id = item[this._fieldId]; - callback(item, id); - } - } - else { - // unordered - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - callback(item, id); - } - } + // calculate the distance of each of the surface centers to the camera + for (j = 0; j < surfaces.length; j++) { + surface = surfaces[j]; + var transCenter = this._convertPointToTranslation(surface.center); + surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; + // TODO: this dept calculation doesn't work 100% of the cases due to perspective, + // but the current solution is fast/simple and works in 99.9% of all cases + // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) } - } - }; - /** - * Map every item in the dataset. - * @param {function} callback - * @param {Object} [options] Available options: - * {Object.} [type] - * {String[]} [fields] filter fields - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * @return {Object[]} mappedItems - */ - DataSet.prototype.map = function (callback, options) { - var filter = options && options.filter, - type = options && options.type || this._options.type, - mappedItems = [], - data = this._data, - item; + // order the surfaces by their (translated) depth + surfaces.sort(function (a, b) { + var diff = b.dist - a.dist; + if (diff) return diff; - // convert and filter items - for (var id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - mappedItems.push(callback(item, id)); - } - } - } + // if equal depth, sort the top surface last + if (a.corners === top) return 1; + if (b.corners === top) return -1; - // order items - if (options && options.order) { - this._sort(mappedItems, options.order); - } + // both are equal + return 0; + }); - return mappedItems; + // draw the ordered surfaces + ctx.lineWidth = 1; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside + for (j = 2; j < surfaces.length; j++) { + surface = surfaces[j]; + corners = surface.corners; + ctx.beginPath(); + ctx.moveTo(corners[3].screen.x, corners[3].screen.y); + ctx.lineTo(corners[0].screen.x, corners[0].screen.y); + ctx.lineTo(corners[1].screen.x, corners[1].screen.y); + ctx.lineTo(corners[2].screen.x, corners[2].screen.y); + ctx.lineTo(corners[3].screen.x, corners[3].screen.y); + ctx.fill(); + ctx.stroke(); + } + } }; + /** - * Filter the fields of an item - * @param {Object} item - * @param {String[]} fields Field names - * @return {Object} filteredItem - * @private + * Draw a line through all datapoints. + * This function can be used when the style is 'line' */ - DataSet.prototype._filterFields = function (item, fields) { - var filteredItem = {}; + Graph3d.prototype._redrawDataLine = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, i; - for (var field in item) { - if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { - filteredItem[field] = item[field]; - } + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? + + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; } - return filteredItem; - }; + // start the line + if (this.dataPoints.length > 0) { + point = this.dataPoints[0]; - /** - * Sort the provided array with items - * @param {Object[]} items - * @param {String | function} order A field name or custom sort function. - * @private - */ - DataSet.prototype._sort = function (items, order) { - if (util.isString(order)) { - // order by provided field name - var name = order; // field name - items.sort(function (a, b) { - var av = a[name]; - var bv = b[name]; - return (av > bv) ? 1 : ((av < bv) ? -1 : 0); - }); + ctx.lineWidth = 1; // TODO: make customizable + ctx.strokeStyle = 'blue'; // TODO: make customizable + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); } - else if (typeof order === 'function') { - // order by sort function - items.sort(order); + + // draw the datapoints as colored circles + for (i = 1; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + ctx.lineTo(point.screen.x, point.screen.y); } - // TODO: extend order by an Object {field:String, direction:String} - // where direction can be 'asc' or 'desc' - else { - throw new TypeError('Order must be a function or a string'); + + // finish the line + if (this.dataPoints.length > 0) { + ctx.stroke(); } }; /** - * Remove an object by pointer or by id - * @param {String | Number | Object | Array} id Object or id, or an array with - * objects or ids to be removed - * @param {String} [senderId] Optional sender id - * @return {Array} removedIds + * Start a moving operation inside the provided parent element + * @param {Event} event The event that occurred (required for + * retrieving the mouse position) */ - DataSet.prototype.remove = function (id, senderId) { - var removedIds = [], - i, len, removedId; + Graph3d.prototype._onMouseDown = function(event) { + event = event || window.event; - if (Array.isArray(id)) { - for (i = 0, len = id.length; i < len; i++) { - removedId = this._remove(id[i]); - if (removedId != null) { - removedIds.push(removedId); - } - } - } - else { - removedId = this._remove(id); - if (removedId != null) { - removedIds.push(removedId); - } + // check if mouse is still down (may be up when focus is lost for example + // in an iframe) + if (this.leftButtonDown) { + this._onMouseUp(event); } - if (removedIds.length) { - this._trigger('remove', {items: removedIds}, senderId); - } + // only react on left mouse button down + this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!this.leftButtonDown && !this.touchDown) return; - return removedIds; + // get mouse position (different code for IE and all other browsers) + this.startMouseX = getMouseX(event); + this.startMouseY = getMouseY(event); + + this.startStart = new Date(this.start); + this.startEnd = new Date(this.end); + this.startArmRotation = this.camera.getArmRotation(); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + util.addEventListener(document, 'mousemove', me.onmousemove); + util.addEventListener(document, 'mouseup', me.onmouseup); + util.preventDefault(event); }; + /** - * Remove an item by its id - * @param {Number | String | Object} id id or item - * @returns {Number | String | null} id - * @private + * Perform moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {Event} event Well, eehh, the event */ - DataSet.prototype._remove = function (id) { - if (util.isNumber(id) || util.isString(id)) { - if (this._data[id]) { - delete this._data[id]; - return id; - } - } - else if (id instanceof Object) { - var itemId = id[this._fieldId]; - if (itemId && this._data[itemId]) { - delete this._data[itemId]; - return itemId; - } + Graph3d.prototype._onMouseMove = function (event) { + event = event || window.event; + + // calculate change in mouse position + var diffX = parseFloat(getMouseX(event)) - this.startMouseX; + var diffY = parseFloat(getMouseY(event)) - this.startMouseY; + + var horizontalNew = this.startArmRotation.horizontal + diffX / 200; + var verticalNew = this.startArmRotation.vertical + diffY / 200; + + var snapAngle = 4; // degrees + var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); + + // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... + // the -0.001 is to take care that the vertical axis is always drawn at the left front corner + if (Math.abs(Math.sin(horizontalNew)) < snapValue) { + horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; + } + if (Math.abs(Math.cos(horizontalNew)) < snapValue) { + horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; } - return null; - }; - /** - * Clear the data - * @param {String} [senderId] Optional sender id - * @return {Array} removedIds The ids of all removed items - */ - DataSet.prototype.clear = function (senderId) { - var ids = Object.keys(this._data); + // snap vertically to nice angles + if (Math.abs(Math.sin(verticalNew)) < snapValue) { + verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; + } + if (Math.abs(Math.cos(verticalNew)) < snapValue) { + verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; + } - this._data = {}; + this.camera.setArmRotation(horizontalNew, verticalNew); + this.redraw(); - this._trigger('remove', {items: ids}, senderId); + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); - return ids; + util.preventDefault(event); }; + /** - * Find the item with maximum value of a specified field - * @param {String} field - * @return {Object | null} item Item containing max value, or null if no items + * Stop moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {event} event The event */ - DataSet.prototype.max = function (field) { - var data = this._data, - max = null, - maxField = null; - - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!max || itemField > maxField)) { - max = item; - maxField = itemField; - } - } - } + Graph3d.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; + this.leftButtonDown = false; - return max; + // remove event listeners here + util.removeEventListener(document, 'mousemove', this.onmousemove); + util.removeEventListener(document, 'mouseup', this.onmouseup); + util.preventDefault(event); }; /** - * Find the item with minimum value of a specified field - * @param {String} field - * @return {Object | null} item Item containing max value, or null if no items + * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point + * @param {Event} event A mouse move event */ - DataSet.prototype.min = function (field) { - var data = this._data, - min = null, - minField = null; + Graph3d.prototype._onTooltip = function (event) { + var delay = 300; // ms + var mouseX = getMouseX(event) - util.getAbsoluteLeft(this.frame); + var mouseY = getMouseY(event) - util.getAbsoluteTop(this.frame); - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!min || itemField < minField)) { - min = item; - minField = itemField; - } - } + if (!this.showTooltip) { + return; } - return min; - }; + if (this.tooltipTimeout) { + clearTimeout(this.tooltipTimeout); + } - /** - * Find all distinct values of a specified field - * @param {String} field - * @return {Array} values Array containing all distinct values. If data items - * do not contain the specified field are ignored. - * The returned array is unordered. - */ - DataSet.prototype.distinct = function (field) { - var data = this._data; - var values = []; - var fieldType = this._options.type && this._options.type[field] || null; - var count = 0; - var i; + // (delayed) display of a tooltip only if no mouse button is down + if (this.leftButtonDown) { + this._hideTooltip(); + return; + } - for (var prop in data) { - if (data.hasOwnProperty(prop)) { - var item = data[prop]; - var value = item[field]; - var exists = false; - for (i = 0; i < count; i++) { - if (values[i] == value) { - exists = true; - break; - } + if (this.tooltip && this.tooltip.dataPoint) { + // tooltip is currently visible + var dataPoint = this._dataPointFromXY(mouseX, mouseY); + if (dataPoint !== this.tooltip.dataPoint) { + // datapoint changed + if (dataPoint) { + this._showTooltip(dataPoint); } - if (!exists && (value !== undefined)) { - values[count] = value; - count++; + else { + this._hideTooltip(); } } } + else { + // tooltip is currently not visible + var me = this; + this.tooltipTimeout = setTimeout(function () { + me.tooltipTimeout = null; - if (fieldType) { - for (i = 0; i < values.length; i++) { - values[i] = util.convert(values[i], fieldType); - } + // show a tooltip if we have a data point + var dataPoint = me._dataPointFromXY(mouseX, mouseY); + if (dataPoint) { + me._showTooltip(dataPoint); + } + }, delay); } - - return values; }; /** - * Add a single item. Will fail when an item with the same id already exists. - * @param {Object} item - * @return {String} id - * @private + * Event handler for touchstart event on mobile devices */ - DataSet.prototype._addItem = function (item) { - var id = item[this._fieldId]; + Graph3d.prototype._onTouchStart = function(event) { + this.touchDown = true; - if (id != undefined) { - // check whether this id is already taken - if (this._data[id]) { - // item already exists - throw new Error('Cannot add item: item with id ' + id + ' already exists'); - } - } - else { - // generate an id - id = util.randomUUID(); - item[this._fieldId] = id; - } + var me = this; + this.ontouchmove = function (event) {me._onTouchMove(event);}; + this.ontouchend = function (event) {me._onTouchEnd(event);}; + util.addEventListener(document, 'touchmove', me.ontouchmove); + util.addEventListener(document, 'touchend', me.ontouchend); - var d = {}; - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } - } - this._data[id] = d; + this._onMouseDown(event); + }; - return id; + /** + * Event handler for touchmove event on mobile devices + */ + Graph3d.prototype._onTouchMove = function(event) { + this._onMouseMove(event); }; /** - * Get an item. Fields can be converted to a specific type - * @param {String} id - * @param {Object.} [types] field types to convert - * @return {Object | null} item - * @private + * Event handler for touchend event on mobile devices */ - DataSet.prototype._getItem = function (id, types) { - var field, value; + Graph3d.prototype._onTouchEnd = function(event) { + this.touchDown = false; - // get the item from the dataset - var raw = this._data[id]; - if (!raw) { - return null; - } + util.removeEventListener(document, 'touchmove', this.ontouchmove); + util.removeEventListener(document, 'touchend', this.ontouchend); - // convert the items field types - var converted = {}; - if (types) { - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = util.convert(value, types[field]); - } - } - } - else { - // no field types specified, no converting needed - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = value; - } - } - } - return converted; + this._onMouseUp(event); }; + /** - * Update a single item: merge with existing item. - * Will fail when the item has no id, or when there does not exist an item - * with the same id. - * @param {Object} item - * @return {String} id - * @private + * Event handler for mouse wheel event, used to zoom the graph + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {event} event The event */ - DataSet.prototype._updateItem = function (item) { - var id = item[this._fieldId]; - if (id == undefined) { - throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')'); - } - var d = this._data[id]; - if (!d) { - // item doesn't exist - throw new Error('Cannot update item: no item with id ' + id + ' found'); + Graph3d.prototype._onWheel = function(event) { + if (!event) /* For IE. */ + event = window.event; + + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; } - // merge with current item - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + var oldLength = this.camera.getArmLength(); + var newLength = oldLength * (1 - delta / 10); + + this.camera.setArmLength(newLength); + this.redraw(); + + this._hideTooltip(); } - return id; + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); + + // Prevent default actions caused by mouse wheel. + // That might be ugly, but we handle scrolls somehow + // anyway, so don't bother here.. + util.preventDefault(event); }; /** - * Get an array with the column names of a Google DataTable - * @param {DataTable} dataTable - * @return {String[]} columnNames + * Test whether a point lies inside given 2D triangle + * @param {Point2d} point + * @param {Point2d[]} triangle + * @return {boolean} Returns true if given point lies inside or on the edge of the triangle * @private */ - DataSet.prototype._getColumnNames = function (dataTable) { - var columns = []; - for (var col = 0, cols = dataTable.getNumberOfColumns(); col < cols; col++) { - columns[col] = dataTable.getColumnId(col) || dataTable.getColumnLabel(col); + Graph3d.prototype._insideTriangle = function (point, triangle) { + var a = triangle[0], + b = triangle[1], + c = triangle[2]; + + function sign (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; } - return columns; + + var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); + var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); + var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); + + // each of the three signs must be either equal to each other or zero + return (as == 0 || bs == 0 || as == bs) && + (bs == 0 || cs == 0 || bs == cs) && + (as == 0 || cs == 0 || as == cs); }; /** - * Append an item as a row to the dataTable - * @param dataTable - * @param columns - * @param item + * Find a data point close to given screen position (x, y) + * @param {Number} x + * @param {Number} y + * @return {Object | null} The closest data point or null if not close to any data point * @private */ - DataSet.prototype._appendRow = function (dataTable, columns, item) { - var row = dataTable.addRow(); + Graph3d.prototype._dataPointFromXY = function (x, y) { + var i, + distMax = 100, // px + dataPoint = null, + closestDataPoint = null, + closestDist = null, + center = new Point2d(x, y); - for (var col = 0, cols = columns.length; col < cols; col++) { - var field = columns[col]; - dataTable.setValue(row, col, item[field]); + if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // the data points are ordered from far away to closest + for (i = this.dataPoints.length - 1; i >= 0; i--) { + dataPoint = this.dataPoints[i]; + var surfaces = dataPoint.surfaces; + if (surfaces) { + for (var s = surfaces.length - 1; s >= 0; s--) { + // split each surface in two triangles, and see if the center point is inside one of these + var surface = surfaces[s]; + var corners = surface.corners; + var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; + var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; + if (this._insideTriangle(center, triangle1) || + this._insideTriangle(center, triangle2)) { + // return immediately at the first hit + return dataPoint; + } + } + } + } } - }; + else { + // find the closest data point, using distance to the center of the point on 2d screen + for (i = 0; i < this.dataPoints.length; i++) { + dataPoint = this.dataPoints[i]; + var point = dataPoint.screen; + if (point) { + var distX = Math.abs(x - point.x); + var distY = Math.abs(y - point.y); + var dist = Math.sqrt(distX * distX + distY * distY); - module.exports = DataSet; + if ((closestDist === null || dist < closestDist) && dist < distMax) { + closestDist = dist; + closestDataPoint = dataPoint; + } + } + } + } -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { + return closestDataPoint; + }; /** - * A queue - * @param {Object} options - * Available options: - * - delay: number When provided, the queue will be flushed - * automatically after an inactivity of this delay - * in milliseconds. - * Default value is null. - * - max: number When the queue exceeds the given maximum number - * of entries, the queue is flushed automatically. - * Default value of max is Infinity. - * @constructor + * Display a tooltip for given data point + * @param {Object} dataPoint + * @private */ - function Queue(options) { - // options - this.delay = null; - this.max = Infinity; + Graph3d.prototype._showTooltip = function (dataPoint) { + var content, line, dot; - // properties - this._queue = []; - this._timeout = null; - this._extended = null; + if (!this.tooltip) { + content = document.createElement('div'); + content.style.position = 'absolute'; + content.style.padding = '10px'; + content.style.border = '1px solid #4d4d4d'; + content.style.color = '#1a1a1a'; + content.style.background = 'rgba(255,255,255,0.7)'; + content.style.borderRadius = '2px'; + content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; - this.setOptions(options); - } + line = document.createElement('div'); + line.style.position = 'absolute'; + line.style.height = '40px'; + line.style.width = '0'; + line.style.borderLeft = '1px solid #4d4d4d'; - /** - * Update the configuration of the queue - * @param {Object} options - * Available options: - * - delay: number When provided, the queue will be flushed - * automatically after an inactivity of this delay - * in milliseconds. - * Default value is null. - * - max: number When the queue exceeds the given maximum number - * of entries, the queue is flushed automatically. - * Default value of max is Infinity. - * @param options - */ - Queue.prototype.setOptions = function (options) { - if (options && typeof options.delay !== 'undefined') { - this.delay = options.delay; + dot = document.createElement('div'); + dot.style.position = 'absolute'; + dot.style.height = '0'; + dot.style.width = '0'; + dot.style.border = '5px solid #4d4d4d'; + dot.style.borderRadius = '5px'; + + this.tooltip = { + dataPoint: null, + dom: { + content: content, + line: line, + dot: dot + } + }; } - if (options && typeof options.max !== 'undefined') { - this.max = options.max; + else { + content = this.tooltip.dom.content; + line = this.tooltip.dom.line; + dot = this.tooltip.dom.dot; } - this._flushIfNeeded(); - }; - - /** - * Extend an object with queuing functionality. - * The object will be extended with a function flush, and the methods provided - * in options.replace will be replaced with queued ones. - * @param {Object} object - * @param {Object} options - * Available options: - * - replace: Array. - * A list with method names of the methods - * on the object to be replaced with queued ones. - * - delay: number When provided, the queue will be flushed - * automatically after an inactivity of this delay - * in milliseconds. - * Default value is null. - * - max: number When the queue exceeds the given maximum number - * of entries, the queue is flushed automatically. - * Default value of max is Infinity. - * @return {Queue} Returns the created queue - */ - Queue.extend = function (object, options) { - var queue = new Queue(options); + this._hideTooltip(); - if (object.flush !== undefined) { - throw new Error('Target object already has a property flush'); + this.tooltip.dataPoint = dataPoint; + if (typeof this.showTooltip === 'function') { + content.innerHTML = this.showTooltip(dataPoint.point); } - object.flush = function () { - queue.flush(); - }; - - var methods = [{ - name: 'flush', - original: undefined - }]; - - if (options && options.replace) { - for (var i = 0; i < options.replace.length; i++) { - var name = options.replace[i]; - methods.push({ - name: name, - original: object[name] - }); - queue.replace(object, name); - } + else { + content.innerHTML = '' + + '' + + '' + + '' + + '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; } - queue._extended = { - object: object, - methods: methods - }; + content.style.left = '0'; + content.style.top = '0'; + this.frame.appendChild(content); + this.frame.appendChild(line); + this.frame.appendChild(dot); + + // calculate sizes + var contentWidth = content.offsetWidth; + var contentHeight = content.offsetHeight; + var lineHeight = line.offsetHeight; + var dotWidth = dot.offsetWidth; + var dotHeight = dot.offsetHeight; - return queue; + var left = dataPoint.screen.x - contentWidth / 2; + left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); + + line.style.left = dataPoint.screen.x + 'px'; + line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; + content.style.left = left + 'px'; + content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; + dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; + dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; }; /** - * Destroy the queue. The queue will first flush all queued actions, and in - * case it has extended an object, will restore the original object. + * Hide the tooltip when displayed + * @private */ - Queue.prototype.destroy = function () { - this.flush(); + Graph3d.prototype._hideTooltip = function () { + if (this.tooltip) { + this.tooltip.dataPoint = null; - if (this._extended) { - var object = this._extended.object; - var methods = this._extended.methods; - for (var i = 0; i < methods.length; i++) { - var method = methods[i]; - if (method.original) { - object[method.name] = method.original; - } - else { - delete object[method.name]; + for (var prop in this.tooltip.dom) { + if (this.tooltip.dom.hasOwnProperty(prop)) { + var elem = this.tooltip.dom[prop]; + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } } } - this._extended = null; } }; + /**--------------------------------------------------------------------------**/ + + /** - * Replace a method on an object with a queued version - * @param {Object} object Object having the method - * @param {string} method The method name + * Get the horizontal mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse x */ - Queue.prototype.replace = function(object, method) { - var me = this; - var original = object[method]; - if (!original) { - throw new Error('Method ' + method + ' undefined'); - } - - object[method] = function () { - // create an Array with the arguments - var args = []; - for (var i = 0; i < arguments.length; i++) { - args[i] = arguments[i]; - } + getMouseX = function(event) { + if ('clientX' in event) return event.clientX; + return event.targetTouches[0] && event.targetTouches[0].clientX || 0; + }; - // add this call to the queue - me.queue({ - args: args, - fn: original, - context: this - }); - }; + /** + * Get the vertical mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse y + */ + getMouseY = function(event) { + if ('clientY' in event) return event.clientY; + return event.targetTouches[0] && event.targetTouches[0].clientY || 0; }; + module.exports = Graph3d; + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + var Point3d = __webpack_require__(10); + /** - * Queue a call - * @param {function | {fn: function, args: Array} | {fn: function, args: Array, context: Object}} entry + * @class Camera + * The camera is mounted on a (virtual) camera arm. The camera arm can rotate + * The camera is always looking in the direction of the origin of the arm. + * This way, the camera always rotates around one fixed point, the location + * of the camera arm. + * + * Documentation: + * http://en.wikipedia.org/wiki/3D_projection */ - Queue.prototype.queue = function(entry) { - if (typeof entry === 'function') { - this._queue.push({fn: entry}); - } - else { - this._queue.push(entry); - } + Camera = function () { + this.armLocation = new Point3d(); + this.armRotation = {}; + this.armRotation.horizontal = 0; + this.armRotation.vertical = 0; + this.armLength = 1.7; - this._flushIfNeeded(); + this.cameraLocation = new Point3d(); + this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); + + this.calculateCameraOrientation(); }; /** - * Check whether the queue needs to be flushed - * @private + * Set the location (origin) of the arm + * @param {Number} x Normalized value of x + * @param {Number} y Normalized value of y + * @param {Number} z Normalized value of z */ - Queue.prototype._flushIfNeeded = function () { - // flush when the maximum is exceeded. - if (this._queue.length > this.max) { - this.flush(); - } + Camera.prototype.setArmLocation = function(x, y, z) { + this.armLocation.x = x; + this.armLocation.y = y; + this.armLocation.z = z; - // flush after a period of inactivity when a delay is configured - clearTimeout(this._timeout); - if (this.queue.length > 0 && typeof this.delay === 'number') { - var me = this; - this._timeout = setTimeout(function () { - me.flush(); - }, this.delay); - } + this.calculateCameraOrientation(); }; /** - * Flush all queued calls + * Set the rotation of the camera arm + * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. */ - Queue.prototype.flush = function () { - while (this._queue.length > 0) { - var entry = this._queue.shift(); - entry.fn.apply(entry.context || entry.fn, entry.args || []); + Camera.prototype.setArmRotation = function(horizontal, vertical) { + if (horizontal !== undefined) { + this.armRotation.horizontal = horizontal; } - }; - module.exports = Queue; + if (vertical !== undefined) { + this.armRotation.vertical = vertical; + if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; + if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; + } + if (horizontal !== undefined || vertical !== undefined) { + this.calculateCameraOrientation(); + } + }; -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Retrieve the current arm rotation + * @return {object} An object with parameters horizontal and vertical + */ + Camera.prototype.getArmRotation = function() { + var rot = {}; + rot.horizontal = this.armRotation.horizontal; + rot.vertical = this.armRotation.vertical; - var util = __webpack_require__(1); - var DataSet = __webpack_require__(7); + return rot; + }; /** - * DataView - * - * a dataview offers a filtered view on a dataset or an other dataview. - * - * @param {DataSet | DataView} data - * @param {Object} [options] Available options: see method get - * - * @constructor DataView + * Set the (normalized) length of the camera arm. + * @param {Number} length A length between 0.71 and 5.0 */ - function DataView (data, options) { - this._data = null; - this._ids = {}; // ids of the items currently in memory (just contains a boolean true) - this._options = options || {}; - this._fieldId = 'id'; // name of the field containing id - this._subscribers = {}; // event subscribers + Camera.prototype.setArmLength = function(length) { + if (length === undefined) + return; - var me = this; - this.listener = function () { - me._onEvent.apply(me, arguments); - }; + this.armLength = length; - this.setData(data); - } + // Radius must be larger than the corner of the graph, + // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the + // graph + if (this.armLength < 0.71) this.armLength = 0.71; + if (this.armLength > 5.0) this.armLength = 5.0; - // TODO: implement a function .config() to dynamically update things like configured filter - // and trigger changes accordingly + this.calculateCameraOrientation(); + }; /** - * Set a data source for the view - * @param {DataSet | DataView} data + * Retrieve the arm length + * @return {Number} length */ - DataView.prototype.setData = function (data) { - var ids, i, len; + Camera.prototype.getArmLength = function() { + return this.armLength; + }; - if (this._data) { - // unsubscribe from current dataset - if (this._data.unsubscribe) { - this._data.unsubscribe('*', this.listener); - } + /** + * Retrieve the camera location + * @return {Point3d} cameraLocation + */ + Camera.prototype.getCameraLocation = function() { + return this.cameraLocation; + }; - // trigger a remove of all items in memory - ids = []; - for (var id in this._ids) { - if (this._ids.hasOwnProperty(id)) { - ids.push(id); - } - } - this._ids = {}; - this._trigger('remove', {items: ids}); - } + /** + * Retrieve the camera rotation + * @return {Point3d} cameraRotation + */ + Camera.prototype.getCameraRotation = function() { + return this.cameraRotation; + }; - this._data = data; + /** + * Calculate the location and rotation of the camera based on the + * position and orientation of the camera arm + */ + Camera.prototype.calculateCameraOrientation = function() { + // calculate location of the camera + this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); - if (this._data) { - // update fieldId - this._fieldId = this._options.fieldId || - (this._data && this._data.options && this._data.options.fieldId) || - 'id'; + // calculate rotation of the camera + this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; + this.cameraRotation.y = 0; + this.cameraRotation.z = -this.armRotation.horizontal; + }; - // trigger an add of all added items - ids = this._data.getIds({filter: this._options && this._options.filter}); - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - this._ids[id] = true; - } - this._trigger('add', {items: ids}); + module.exports = Camera; - // subscribe to new dataset - if (this._data.on) { - this._data.on('*', this.listener); - } - } - }; +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + var DataView = __webpack_require__(4); /** - * Get data from the data view - * - * Usage: - * - * get() - * get(options: Object) - * get(options: Object, data: Array | DataTable) - * - * get(id: Number) - * get(id: Number, options: Object) - * get(id: Number, options: Object, data: Array | DataTable) - * - * get(ids: Number[]) - * get(ids: Number[], options: Object) - * get(ids: Number[], options: Object, data: Array | DataTable) - * - * Where: + * @class Filter * - * {Number | String} id The id of an item - * {Number[] | String{}} ids An array with ids of items - * {Object} options An Object with options. Available options: - * {String} [type] Type of data to be returned. Can - * be 'DataTable' or 'Array' (default) - * {Object.} [convert] - * {String[]} [fields] field names to be returned - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * {Array | DataTable} [data] If provided, items will be appended to this - * array or table. Required in case of Google - * DataTable. - * @param args + * @param {DataSet} data The google data table + * @param {Number} column The index of the column to be filtered + * @param {Graph} graph The graph */ - DataView.prototype.get = function (args) { - var me = this; + function Filter (data, column, graph) { + this.data = data; + this.column = column; + this.graph = graph; // the parent graph - // parse the arguments - var ids, options, data; - var firstType = util.getType(arguments[0]); - if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') { - // get(id(s) [, options] [, data]) - ids = arguments[0]; // can be a single id or an array with ids - options = arguments[1]; - data = arguments[2]; - } - else { - // get([, options] [, data]) - options = arguments[0]; - data = arguments[1]; - } + this.index = undefined; + this.value = undefined; - // extend the options with the default options and provided options - var viewOptions = util.extend({}, this._options, options); + // read all distinct values and select the first one + this.values = graph.getDistinctValues(data.get(), this.column); - // create a combined filter method when needed - if (this._options.filter && options && options.filter) { - viewOptions.filter = function (item) { - return me._options.filter(item) && options.filter(item); - } - } + // sort both numeric and string values correctly + this.values.sort(function (a, b) { + return a > b ? 1 : a < b ? -1 : 0; + }); - // build up the call to the linked data set - var getArguments = []; - if (ids != undefined) { - getArguments.push(ids); + if (this.values.length > 0) { + this.selectValue(0); } - getArguments.push(viewOptions); - getArguments.push(data); - - return this._data && this._data.get.apply(this._data, getArguments); - }; - - /** - * Get ids of all items or from a filtered set of items. - * @param {Object} [options] An Object with options. Available options: - * {function} [filter] filter items - * {String | function} [order] Order the items by - * a field name or custom sort function. - * @return {Array} ids - */ - DataView.prototype.getIds = function (options) { - var ids; - if (this._data) { - var defaultFilter = this._options.filter; - var filter; + // create an array with the filtered datapoints. this will be loaded afterwards + this.dataPoints = []; - if (options && options.filter) { - if (defaultFilter) { - filter = function (item) { - return defaultFilter(item) && options.filter(item); - } - } - else { - filter = options.filter; - } - } - else { - filter = defaultFilter; - } + this.loaded = false; + this.onLoadCallback = undefined; - ids = this._data.getIds({ - filter: filter, - order: options && options.order - }); + if (graph.animationPreload) { + this.loaded = false; + this.loadInBackground(); } else { - ids = []; + this.loaded = true; } - - return ids; }; + /** - * Get the DataSet to which this DataView is connected. In case there is a chain - * of multiple DataViews, the root DataSet of this chain is returned. - * @return {DataSet} dataSet + * Return the label + * @return {string} label */ - DataView.prototype.getDataSet = function () { - var dataSet = this; - while (dataSet instanceof DataView) { - dataSet = dataSet._data; - } - return dataSet || null; + Filter.prototype.isLoaded = function() { + return this.loaded; }; + /** - * Event listener. Will propagate all events from the connected data set to - * the subscribers of the DataView, but will filter the items and only trigger - * when there are changes in the filtered data set. - * @param {String} event - * @param {Object | null} params - * @param {String} senderId - * @private + * Return the loaded progress + * @return {Number} percentage between 0 and 100 */ - DataView.prototype._onEvent = function (event, params, senderId) { - var i, len, id, item, - ids = params && params.items, - data = this._data, - added = [], - updated = [], - removed = []; - - if (ids && data) { - switch (event) { - case 'add': - // filter the ids of the added items - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - item = this.get(id); - if (item) { - this._ids[id] = true; - added.push(id); - } - } - - break; - - case 'update': - // determine the event from the views viewpoint: an updated - // item can be added, updated, or removed from this view. - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - item = this.get(id); - - if (item) { - if (this._ids[id]) { - updated.push(id); - } - else { - this._ids[id] = true; - added.push(id); - } - } - else { - if (this._ids[id]) { - delete this._ids[id]; - removed.push(id); - } - else { - // nothing interesting for me :-( - } - } - } + Filter.prototype.getLoadedProgress = function() { + var len = this.values.length; - break; + var i = 0; + while (this.dataPoints[i]) { + i++; + } - case 'remove': - // filter the ids of the removed items - for (i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - if (this._ids[id]) { - delete this._ids[id]; - removed.push(id); - } - } + return Math.round(i / len * 100); + }; - break; - } - if (added.length) { - this._trigger('add', {items: added}, senderId); - } - if (updated.length) { - this._trigger('update', {items: updated}, senderId); - } - if (removed.length) { - this._trigger('remove', {items: removed}, senderId); - } - } + /** + * Return the label + * @return {string} label + */ + Filter.prototype.getLabel = function() { + return this.graph.filterLabel; }; - // copy subscription functionality from DataSet - DataView.prototype.on = DataSet.prototype.on; - DataView.prototype.off = DataSet.prototype.off; - DataView.prototype._trigger = DataSet.prototype._trigger; - // TODO: make these functions deprecated (replaced with `on` and `off` since version 0.5) - DataView.prototype.subscribe = DataView.prototype.on; - DataView.prototype.unsubscribe = DataView.prototype.off; + /** + * Return the columnIndex of the filter + * @return {Number} columnIndex + */ + Filter.prototype.getColumn = function() { + return this.column; + }; - module.exports = DataView; + /** + * Return the currently selected value. Returns undefined if there is no selection + * @return {*} value + */ + Filter.prototype.getSelectedValue = function() { + if (this.index === undefined) + return undefined; -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { + return this.values[this.index]; + }; - var Emitter = __webpack_require__(11); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var util = __webpack_require__(1); - var Point3d = __webpack_require__(12); - var Point2d = __webpack_require__(13); - var Camera = __webpack_require__(14); - var Filter = __webpack_require__(15); - var Slider = __webpack_require__(16); - var StepNumber = __webpack_require__(17); + /** + * Retrieve all values of the filter + * @return {Array} values + */ + Filter.prototype.getValues = function() { + return this.values; + }; /** - * @constructor Graph3d - * Graph3d displays data in 3d. - * - * Graph3d is developed in javascript as a Google Visualization Chart. - * - * @param {Element} container The DOM element in which the Graph3d will - * be created. Normally a div element. - * @param {DataSet | DataView | Array} [data] - * @param {Object} [options] + * Retrieve one value of the filter + * @param {Number} index + * @return {*} value */ - function Graph3d(container, data, options) { - if (!(this instanceof Graph3d)) { - throw new SyntaxError('Constructor must be called with the new operator'); - } + Filter.prototype.getValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; - // create variables and set default values - this.containerElement = container; - this.width = '400px'; - this.height = '400px'; - this.margin = 10; // px - this.defaultXCenter = '55%'; - this.defaultYCenter = '50%'; + return this.values[index]; + }; - this.xLabel = 'x'; - this.yLabel = 'y'; - this.zLabel = 'z'; - var passValueFn = function(v) { return v; }; - this.xValueLabel = passValueFn; - this.yValueLabel = passValueFn; - this.zValueLabel = passValueFn; - - this.filterLabel = 'time'; - this.legendLabel = 'value'; + /** + * Retrieve the (filtered) dataPoints for the currently selected filter index + * @param {Number} [index] (optional) + * @return {Array} dataPoints + */ + Filter.prototype._getDataPoints = function(index) { + if (index === undefined) + index = this.index; - this.style = Graph3d.STYLE.DOT; - this.showPerspective = true; - this.showGrid = true; - this.keepAspectRatio = true; - this.showShadow = false; - this.showGrayBottom = false; // TODO: this does not work correctly - this.showTooltip = false; - this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' + if (index === undefined) + return []; - this.animationInterval = 1000; // milliseconds - this.animationPreload = false; + var dataPoints; + if (this.dataPoints[index]) { + dataPoints = this.dataPoints[index]; + } + else { + var f = {}; + f.column = this.column; + f.value = this.values[index]; - this.camera = new Camera(); - this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? + var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); + dataPoints = this.graph._getDataPoints(dataView); - this.dataTable = null; // The original data table - this.dataPoints = null; // The table with point objects + this.dataPoints[index] = dataPoints; + } - // the column indexes - this.colX = undefined; - this.colY = undefined; - this.colZ = undefined; - this.colValue = undefined; - this.colFilter = undefined; + return dataPoints; + }; - this.xMin = 0; - this.xStep = undefined; // auto by default - this.xMax = 1; - this.yMin = 0; - this.yStep = undefined; // auto by default - this.yMax = 1; - this.zMin = 0; - this.zStep = undefined; // auto by default - this.zMax = 1; - this.valueMin = 0; - this.valueMax = 1; - this.xBarWidth = 1; - this.yBarWidth = 1; - // TODO: customize axis range - // constants - this.colorAxis = '#4D4D4D'; - this.colorGrid = '#D3D3D3'; - this.colorDot = '#7DC1FF'; - this.colorDotBorder = '#3267D2'; - // create a frame and canvas - this.create(); + /** + * Set a callback function when the filter is fully loaded. + */ + Filter.prototype.setOnLoadCallback = function(callback) { + this.onLoadCallback = callback; + }; - // apply options (also when undefined) - this.setOptions(options); - // apply data - if (data) { - this.setData(data); - } - } + /** + * Add a value to the list with available values for this filter + * No double entries will be created. + * @param {Number} index + */ + Filter.prototype.selectValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; - // Extend Graph3d with an Emitter mixin - Emitter(Graph3d.prototype); + this.index = index; + this.value = this.values[index]; + }; /** - * Calculate the scaling values, dependent on the range in x, y, and z direction + * Load all filtered rows in the background one by one + * Start this method without providing an index! */ - Graph3d.prototype._setScale = function() { - this.scale = new Point3d(1 / (this.xMax - this.xMin), - 1 / (this.yMax - this.yMin), - 1 / (this.zMax - this.zMin)); + Filter.prototype.loadInBackground = function(index) { + if (index === undefined) + index = 0; - // keep aspect ration between x and y scale if desired - if (this.keepAspectRatio) { - if (this.scale.x < this.scale.y) { - //noinspection JSSuspiciousNameCombination - this.scale.y = this.scale.x; + var frame = this.graph.frame; + + if (index < this.values.length) { + var dataPointsTemp = this._getDataPoints(index); + //this.graph.redrawInfo(); // TODO: not neat + + // create a progress box + if (frame.progress === undefined) { + frame.progress = document.createElement('DIV'); + frame.progress.style.position = 'absolute'; + frame.progress.style.color = 'gray'; + frame.appendChild(frame.progress); } - else { - //noinspection JSSuspiciousNameCombination - this.scale.x = this.scale.y; + var progress = this.getLoadedProgress(); + frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; + // TODO: this is no nice solution... + frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider + frame.progress.style.left = 10 + 'px'; + + var me = this; + setTimeout(function() {me.loadInBackground(index+1);}, 10); + this.loaded = false; + } + else { + this.loaded = true; + + // remove the progress box + if (frame.progress !== undefined) { + frame.removeChild(frame.progress); + frame.progress = undefined; } + + if (this.onLoadCallback) + this.onLoadCallback(); } + }; - // scale the vertical axis - this.scale.z *= this.verticalRatio; - // TODO: can this be automated? verticalRatio? + module.exports = Filter; - // determine scale for (optional) value - this.scale.value = 1 / (this.valueMax - this.valueMin); - // position the camera arm - var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; - var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; - var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; - this.camera.setArmLocation(xCenter, yCenter, zCenter); +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @prototype Point2d + * @param {Number} [x] + * @param {Number} [y] + */ + Point2d = function (x, y) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; }; + module.exports = Point2d; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { /** - * Convert a 3D location to a 2D location on screen - * http://en.wikipedia.org/wiki/3D_projection - * @param {Point3d} point3d A 3D point with parameters x, y, z - * @return {Point2d} point2d A 2D point with parameters x, y + * @prototype Point3d + * @param {Number} [x] + * @param {Number} [y] + * @param {Number} [z] */ - Graph3d.prototype._convert3Dto2D = function(point3d) { - var translation = this._convertPointToTranslation(point3d); - return this._convertTranslationToScreen(translation); + function Point3d(x, y, z) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + this.z = z !== undefined ? z : 0; }; /** - * Convert a 3D location its translation seen from the camera - * http://en.wikipedia.org/wiki/3D_projection - * @param {Point3d} point3d A 3D point with parameters x, y, z - * @return {Point3d} translation A 3D point with parameters x, y, z This is - * the translation of the point, seen from the - * camera + * Subtract the two provided points, returns a-b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a-b */ - Graph3d.prototype._convertPointToTranslation = function(point3d) { - var ax = point3d.x * this.scale.x, - ay = point3d.y * this.scale.y, - az = point3d.z * this.scale.z, - - cx = this.camera.getCameraLocation().x, - cy = this.camera.getCameraLocation().y, - cz = this.camera.getCameraLocation().z, - - // calculate angles - sinTx = Math.sin(this.camera.getCameraRotation().x), - cosTx = Math.cos(this.camera.getCameraRotation().x), - sinTy = Math.sin(this.camera.getCameraRotation().y), - cosTy = Math.cos(this.camera.getCameraRotation().y), - sinTz = Math.sin(this.camera.getCameraRotation().z), - cosTz = Math.cos(this.camera.getCameraRotation().z), + Point3d.subtract = function(a, b) { + var sub = new Point3d(); + sub.x = a.x - b.x; + sub.y = a.y - b.y; + sub.z = a.z - b.z; + return sub; + }; - // calculate translation - dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), - dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), - dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); + /** + * Add the two provided points, returns a+b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a+b + */ + Point3d.add = function(a, b) { + var sum = new Point3d(); + sum.x = a.x + b.x; + sum.y = a.y + b.y; + sum.z = a.z + b.z; + return sum; + }; - return new Point3d(dx, dy, dz); + /** + * Calculate the average of two 3d points + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} The average, (a+b)/2 + */ + Point3d.avg = function(a, b) { + return new Point3d( + (a.x + b.x) / 2, + (a.y + b.y) / 2, + (a.z + b.z) / 2 + ); }; /** - * Convert a translation point to a point on the screen - * @param {Point3d} translation A 3D point with parameters x, y, z This is - * the translation of the point, seen from the - * camera - * @return {Point2d} point2d A 2D point with parameters x, y + * Calculate the cross product of the two provided points, returns axb + * Documentation: http://en.wikipedia.org/wiki/Cross_product + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} cross product axb */ - Graph3d.prototype._convertTranslationToScreen = function(translation) { - var ex = this.eye.x, - ey = this.eye.y, - ez = this.eye.z, - dx = translation.x, - dy = translation.y, - dz = translation.z; + Point3d.crossProduct = function(a, b) { + var crossproduct = new Point3d(); - // calculate position on screen from translation - var bx; - var by; - if (this.showPerspective) { - bx = (dx - ex) * (ez / dz); - by = (dy - ey) * (ez / dz); - } - else { - bx = dx * -(ez / this.camera.getArmLength()); - by = dy * -(ez / this.camera.getArmLength()); - } + crossproduct.x = a.y * b.z - a.z * b.y; + crossproduct.y = a.z * b.x - a.x * b.z; + crossproduct.z = a.x * b.y - a.y * b.x; - // shift and scale the point to the center of the screen - // use the width of the graph to scale both horizontally and vertically. - return new Point2d( - this.xcenter + bx * this.frame.canvas.clientWidth, - this.ycenter - by * this.frame.canvas.clientWidth); + return crossproduct; }; + /** - * Set the background styling for the graph - * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor + * Rtrieve the length of the vector (or the distance from this point to the origin + * @return {Number} length */ - Graph3d.prototype._setBackgroundColor = function(backgroundColor) { - var fill = 'white'; - var stroke = 'gray'; - var strokeWidth = 1; + Point3d.prototype.length = function() { + return Math.sqrt( + this.x * this.x + + this.y * this.y + + this.z * this.z + ); + }; - if (typeof(backgroundColor) === 'string') { - fill = backgroundColor; - stroke = 'none'; - strokeWidth = 0; - } - else if (typeof(backgroundColor) === 'object') { - if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; - if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; - if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; - } - else if (backgroundColor === undefined) { - // use use defaults - } - else { - throw 'Unsupported type of backgroundColor'; - } + module.exports = Point3d; - this.frame.style.backgroundColor = fill; - this.frame.style.borderColor = stroke; - this.frame.style.borderWidth = strokeWidth + 'px'; - this.frame.style.borderStyle = 'solid'; - }; +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { - /// enumerate the available styles - Graph3d.STYLE = { - BAR: 0, - BARCOLOR: 1, - BARSIZE: 2, - DOT : 3, - DOTLINE : 4, - DOTCOLOR: 5, - DOTSIZE: 6, - GRID : 7, - LINE: 8, - SURFACE : 9 - }; + var util = __webpack_require__(1); /** - * Retrieve the style index from given styleName - * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' - * @return {Number} styleNumber Enumeration value representing the style, or -1 - * when not found + * @constructor Slider + * + * An html slider control with start/stop/prev/next buttons + * @param {Element} container The element where the slider will be created + * @param {Object} options Available options: + * {boolean} visible If true (default) the + * slider is visible. */ - Graph3d.prototype._getStyleNumber = function(styleName) { - switch (styleName) { - case 'dot': return Graph3d.STYLE.DOT; - case 'dot-line': return Graph3d.STYLE.DOTLINE; - case 'dot-color': return Graph3d.STYLE.DOTCOLOR; - case 'dot-size': return Graph3d.STYLE.DOTSIZE; - case 'line': return Graph3d.STYLE.LINE; - case 'grid': return Graph3d.STYLE.GRID; - case 'surface': return Graph3d.STYLE.SURFACE; - case 'bar': return Graph3d.STYLE.BAR; - case 'bar-color': return Graph3d.STYLE.BARCOLOR; - case 'bar-size': return Graph3d.STYLE.BARSIZE; + function Slider(container, options) { + if (container === undefined) { + throw 'Error: No container element defined'; } + this.container = container; + this.visible = (options && options.visible != undefined) ? options.visible : true; - return -1; - }; + if (this.visible) { + this.frame = document.createElement('DIV'); + //this.frame.style.backgroundColor = '#E5E5E5'; + this.frame.style.width = '100%'; + this.frame.style.position = 'relative'; + this.container.appendChild(this.frame); - /** - * Determine the indexes of the data columns, based on the given style and data - * @param {DataSet} data - * @param {Number} style - */ - Graph3d.prototype._determineColumnIndexes = function(data, style) { - if (this.style === Graph3d.STYLE.DOT || - this.style === Graph3d.STYLE.DOTLINE || - this.style === Graph3d.STYLE.LINE || - this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE || - this.style === Graph3d.STYLE.BAR) { - // 3 columns expected, and optionally a 4th with filter values - this.colX = 0; - this.colY = 1; - this.colZ = 2; - this.colValue = undefined; + this.frame.prev = document.createElement('INPUT'); + this.frame.prev.type = 'BUTTON'; + this.frame.prev.value = 'Prev'; + this.frame.appendChild(this.frame.prev); + + this.frame.play = document.createElement('INPUT'); + this.frame.play.type = 'BUTTON'; + this.frame.play.value = 'Play'; + this.frame.appendChild(this.frame.play); + + this.frame.next = document.createElement('INPUT'); + this.frame.next.type = 'BUTTON'; + this.frame.next.value = 'Next'; + this.frame.appendChild(this.frame.next); + + this.frame.bar = document.createElement('INPUT'); + this.frame.bar.type = 'BUTTON'; + this.frame.bar.style.position = 'absolute'; + this.frame.bar.style.border = '1px solid red'; + this.frame.bar.style.width = '100px'; + this.frame.bar.style.height = '6px'; + this.frame.bar.style.borderRadius = '2px'; + this.frame.bar.style.MozBorderRadius = '2px'; + this.frame.bar.style.border = '1px solid #7F7F7F'; + this.frame.bar.style.backgroundColor = '#E5E5E5'; + this.frame.appendChild(this.frame.bar); - if (data.getNumberOfColumns() > 3) { - this.colFilter = 3; - } - } - else if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - // 4 columns expected, and optionally a 5th with filter values - this.colX = 0; - this.colY = 1; - this.colZ = 2; - this.colValue = 3; + this.frame.slide = document.createElement('INPUT'); + this.frame.slide.type = 'BUTTON'; + this.frame.slide.style.margin = '0px'; + this.frame.slide.value = ' '; + this.frame.slide.style.position = 'relative'; + this.frame.slide.style.left = '-100px'; + this.frame.appendChild(this.frame.slide); - if (data.getNumberOfColumns() > 4) { - this.colFilter = 4; - } - } - else { - throw 'Unknown style "' + this.style + '"'; + // create events + var me = this; + this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; + this.frame.prev.onclick = function (event) {me.prev(event);}; + this.frame.play.onclick = function (event) {me.togglePlay(event);}; + this.frame.next.onclick = function (event) {me.next(event);}; } - }; - Graph3d.prototype.getNumberOfRows = function(data) { - return data.length; - } + this.onChangeCallback = undefined; + this.values = []; + this.index = undefined; - Graph3d.prototype.getNumberOfColumns = function(data) { - var counter = 0; - for (var column in data[0]) { - if (data[0].hasOwnProperty(column)) { - counter++; - } - } - return counter; + this.playTimeout = undefined; + this.playInterval = 1000; // milliseconds + this.playLoop = true; } - - Graph3d.prototype.getDistinctValues = function(data, column) { - var distinctValues = []; - for (var i = 0; i < data.length; i++) { - if (distinctValues.indexOf(data[i][column]) == -1) { - distinctValues.push(data[i][column]); - } + /** + * Select the previous index + */ + Slider.prototype.prev = function() { + var index = this.getIndex(); + if (index > 0) { + index--; + this.setIndex(index); } - return distinctValues; - } - + }; - Graph3d.prototype.getColumnRange = function(data,column) { - var minMax = {min:data[0][column],max:data[0][column]}; - for (var i = 0; i < data.length; i++) { - if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } - if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } + /** + * Select the next index + */ + Slider.prototype.next = function() { + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); } - return minMax; }; /** - * Initialize the data from the data table. Calculate minimum and maximum values - * and column index values - * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. - * @param {Number} style Style Number + * Select the next index */ - Graph3d.prototype._dataInitialize = function (rawData, style) { - var me = this; + Slider.prototype.playNext = function() { + var start = new Date(); - // unsubscribe from the dataTable - if (this.dataSet) { - this.dataSet.off('*', this._onChange); + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); } - - if (rawData === undefined) - return; - - if (Array.isArray(rawData)) { - rawData = new DataSet(rawData); + else if (this.playLoop) { + // jump to the start + index = 0; + this.setIndex(index); } - var data; - if (rawData instanceof DataSet || rawData instanceof DataView) { - data = rawData.get(); - } - else { - throw new Error('Array, DataSet, or DataView expected'); - } + var end = new Date(); + var diff = (end - start); - if (data.length == 0) - return; + // calculate how much time it to to set the index and to execute the callback + // function. + var interval = Math.max(this.playInterval - diff, 0); + // document.title = diff // TODO: cleanup - this.dataSet = rawData; - this.dataTable = data; + var me = this; + this.playTimeout = setTimeout(function() {me.playNext();}, interval); + }; - // subscribe to changes in the dataset - this._onChange = function () { - me.setData(me.dataSet); - }; - this.dataSet.on('*', this._onChange); + /** + * Toggle start or stop playing + */ + Slider.prototype.togglePlay = function() { + if (this.playTimeout === undefined) { + this.play(); + } else { + this.stop(); + } + }; - // _determineColumnIndexes - // getNumberOfRows (points) - // getNumberOfColumns (x,y,z,v,t,t1,t2...) - // getDistinctValues (unique values?) - // getColumnRange + /** + * Start playing + */ + Slider.prototype.play = function() { + // Test whether already playing + if (this.playTimeout) return; - // determine the location of x,y,z,value,filter columns - this.colX = 'x'; - this.colY = 'y'; - this.colZ = 'z'; - this.colValue = 'style'; - this.colFilter = 'filter'; + this.playNext(); + if (this.frame) { + this.frame.play.value = 'Stop'; + } + }; + /** + * Stop playing + */ + Slider.prototype.stop = function() { + clearInterval(this.playTimeout); + this.playTimeout = undefined; - // check if a filter column is provided - if (data[0].hasOwnProperty('filter')) { - if (this.dataFilter === undefined) { - this.dataFilter = new Filter(rawData, this.colFilter, this); - this.dataFilter.setOnLoadCallback(function() {me.redraw();}); - } + if (this.frame) { + this.frame.play.value = 'Play'; } + }; + /** + * Set a callback function which will be triggered when the value of the + * slider bar has changed. + */ + Slider.prototype.setOnChangeCallback = function(callback) { + this.onChangeCallback = callback; + }; - var withBars = this.style == Graph3d.STYLE.BAR || - this.style == Graph3d.STYLE.BARCOLOR || - this.style == Graph3d.STYLE.BARSIZE; + /** + * Set the interval for playing the list + * @param {Number} interval The interval in milliseconds + */ + Slider.prototype.setPlayInterval = function(interval) { + this.playInterval = interval; + }; - // determine barWidth from data - if (withBars) { - if (this.defaultXBarWidth !== undefined) { - this.xBarWidth = this.defaultXBarWidth; - } - else { - var dataX = this.getDistinctValues(data,this.colX); - this.xBarWidth = (dataX[1] - dataX[0]) || 1; - } + /** + * Retrieve the current play interval + * @return {Number} interval The interval in milliseconds + */ + Slider.prototype.getPlayInterval = function(interval) { + return this.playInterval; + }; - if (this.defaultYBarWidth !== undefined) { - this.yBarWidth = this.defaultYBarWidth; - } - else { - var dataY = this.getDistinctValues(data,this.colY); - this.yBarWidth = (dataY[1] - dataY[0]) || 1; - } - } + /** + * Set looping on or off + * @pararm {boolean} doLoop If true, the slider will jump to the start when + * the end is passed, and will jump to the end + * when the start is passed. + */ + Slider.prototype.setPlayLoop = function(doLoop) { + this.playLoop = doLoop; + }; - // calculate minimums and maximums - var xRange = this.getColumnRange(data,this.colX); - if (withBars) { - xRange.min -= this.xBarWidth / 2; - xRange.max += this.xBarWidth / 2; - } - this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; - this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; - if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; - this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; - var yRange = this.getColumnRange(data,this.colY); - if (withBars) { - yRange.min -= this.yBarWidth / 2; - yRange.max += this.yBarWidth / 2; + /** + * Execute the onchange callback function + */ + Slider.prototype.onChange = function() { + if (this.onChangeCallback !== undefined) { + this.onChangeCallback(); } - this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; - this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; - if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; - this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; + }; - var zRange = this.getColumnRange(data,this.colZ); - this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; - this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; - if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; - this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; + /** + * redraw the slider on the correct place + */ + Slider.prototype.redraw = function() { + if (this.frame) { + // resize the bar + this.frame.bar.style.top = (this.frame.clientHeight/2 - + this.frame.bar.offsetHeight/2) + 'px'; + this.frame.bar.style.width = (this.frame.clientWidth - + this.frame.prev.clientWidth - + this.frame.play.clientWidth - + this.frame.next.clientWidth - 30) + 'px'; - if (this.colValue !== undefined) { - var valueRange = this.getColumnRange(data,this.colValue); - this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; - this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; - if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; + // position the slider button + var left = this.indexToLeft(this.index); + this.frame.slide.style.left = (left) + 'px'; } - - // set the scale dependent on the ranges. - this._setScale(); }; - /** - * Filter the data based on the current filter - * @param {Array} data - * @return {Array} dataPoints Array with point objects which can be drawn on screen + * Set the list with values for the slider + * @param {Array} values A javascript array with values (any type) */ - Graph3d.prototype._getDataPoints = function (data) { - // TODO: store the created matrix dataPoints in the filters instead of reloading each time - var x, y, i, z, obj, point; + Slider.prototype.setValues = function(values) { + this.values = values; - var dataPoints = []; + if (this.values.length > 0) + this.setIndex(0); + else + this.index = undefined; + }; - if (this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE) { - // copy all values from the google data table to a matrix - // the provided values are supposed to form a grid of (x,y) positions + /** + * Select a value by its index + * @param {Number} index + */ + Slider.prototype.setIndex = function(index) { + if (index < this.values.length) { + this.index = index; - // create two lists with all present x and y values - var dataX = []; - var dataY = []; - for (i = 0; i < this.getNumberOfRows(data); i++) { - x = data[i][this.colX] || 0; - y = data[i][this.colY] || 0; + this.redraw(); + this.onChange(); + } + else { + throw 'Error: index out of range'; + } + }; - if (dataX.indexOf(x) === -1) { - dataX.push(x); - } - if (dataY.indexOf(y) === -1) { - dataY.push(y); - } - } + /** + * retrieve the index of the currently selected vaue + * @return {Number} index + */ + Slider.prototype.getIndex = function() { + return this.index; + }; - function sortNumber(a, b) { - return a - b; - } - dataX.sort(sortNumber); - dataY.sort(sortNumber); - // create a grid, a 2d matrix, with all values. - var dataMatrix = []; // temporary data matrix - for (i = 0; i < data.length; i++) { - x = data[i][this.colX] || 0; - y = data[i][this.colY] || 0; - z = data[i][this.colZ] || 0; + /** + * retrieve the currently selected value + * @return {*} value + */ + Slider.prototype.get = function() { + return this.values[this.index]; + }; - var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer - var yIndex = dataY.indexOf(y); - if (dataMatrix[xIndex] === undefined) { - dataMatrix[xIndex] = []; - } + Slider.prototype._onMouseDown = function(event) { + // only react on left mouse button down + var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!leftButtonDown) return; - var point3d = new Point3d(); - point3d.x = x; - point3d.y = y; - point3d.z = z; + this.startClientX = event.clientX; + this.startSlideX = parseFloat(this.frame.slide.style.left); - obj = {}; - obj.point = point3d; - obj.trans = undefined; - obj.screen = undefined; - obj.bottom = new Point3d(x, y, this.zMin); + this.frame.style.cursor = 'move'; - dataMatrix[xIndex][yIndex] = obj; + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + util.addEventListener(document, 'mousemove', this.onmousemove); + util.addEventListener(document, 'mouseup', this.onmouseup); + util.preventDefault(event); + }; - dataPoints.push(obj); - } - // fill in the pointers to the neighbors. - for (x = 0; x < dataMatrix.length; x++) { - for (y = 0; y < dataMatrix[x].length; y++) { - if (dataMatrix[x][y]) { - dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; - dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; - dataMatrix[x][y].pointCross = - (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? - dataMatrix[x+1][y+1] : - undefined; - } - } - } - } - else { // 'dot', 'dot-line', etc. - // copy all values from the google data table to a list with Point3d objects - for (i = 0; i < data.length; i++) { - point = new Point3d(); - point.x = data[i][this.colX] || 0; - point.y = data[i][this.colY] || 0; - point.z = data[i][this.colZ] || 0; + Slider.prototype.leftToIndex = function (left) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; + var x = left - 3; - if (this.colValue !== undefined) { - point.value = data[i][this.colValue] || 0; - } + var index = Math.round(x / width * (this.values.length-1)); + if (index < 0) index = 0; + if (index > this.values.length-1) index = this.values.length-1; - obj = {}; - obj.point = point; - obj.bottom = new Point3d(point.x, point.y, this.zMin); - obj.trans = undefined; - obj.screen = undefined; + return index; + }; - dataPoints.push(obj); - } - } + Slider.prototype.indexToLeft = function (index) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; - return dataPoints; - }; + var x = index / (this.values.length-1) * width; + var left = x + 3; - /** - * Create the main frame for the Graph3d. - * This function is executed once when a Graph3d object is created. The frame - * contains a canvas, and this canvas contains all objects like the axis and - * nodes. - */ - Graph3d.prototype.create = function () { - // remove all elements from the container element. - while (this.containerElement.hasChildNodes()) { - this.containerElement.removeChild(this.containerElement.firstChild); - } + return left; + }; - this.frame = document.createElement('div'); - this.frame.style.position = 'relative'; - this.frame.style.overflow = 'hidden'; - // create the graph canvas (HTML canvas element) - this.frame.canvas = document.createElement( 'canvas' ); - this.frame.canvas.style.position = 'relative'; - this.frame.appendChild(this.frame.canvas); - //if (!this.frame.canvas.getContext) { - { - var noCanvas = document.createElement( 'DIV' ); - noCanvas.style.color = 'red'; - noCanvas.style.fontWeight = 'bold' ; - noCanvas.style.padding = '10px'; - noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; - this.frame.canvas.appendChild(noCanvas); - } - this.frame.filter = document.createElement( 'div' ); - this.frame.filter.style.position = 'absolute'; - this.frame.filter.style.bottom = '0px'; - this.frame.filter.style.left = '0px'; - this.frame.filter.style.width = '100%'; - this.frame.appendChild(this.frame.filter); + Slider.prototype._onMouseMove = function (event) { + var diff = event.clientX - this.startClientX; + var x = this.startSlideX + diff; - // add event listeners to handle moving and zooming the contents - var me = this; - var onmousedown = function (event) {me._onMouseDown(event);}; - var ontouchstart = function (event) {me._onTouchStart(event);}; - var onmousewheel = function (event) {me._onWheel(event);}; - var ontooltip = function (event) {me._onTooltip(event);}; - // TODO: these events are never cleaned up... can give a 'memory leakage' + var index = this.leftToIndex(x); - util.addEventListener(this.frame.canvas, 'keydown', onkeydown); - util.addEventListener(this.frame.canvas, 'mousedown', onmousedown); - util.addEventListener(this.frame.canvas, 'touchstart', ontouchstart); - util.addEventListener(this.frame.canvas, 'mousewheel', onmousewheel); - util.addEventListener(this.frame.canvas, 'mousemove', ontooltip); + this.setIndex(index); - // add the new graph to the container element - this.containerElement.appendChild(this.frame); + util.preventDefault(); }; - /** - * Set a new size for the graph - * @param {string} width Width in pixels or percentage (for example '800px' - * or '50%') - * @param {string} height Height in pixels or percentage (for example '400px' - * or '30%') - */ - Graph3d.prototype.setSize = function(width, height) { - this.frame.style.width = width; - this.frame.style.height = height; + Slider.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; - this._resizeCanvas(); + // remove event listeners + util.removeEventListener(document, 'mousemove', this.onmousemove); + util.removeEventListener(document, 'mouseup', this.onmouseup); + + util.preventDefault(); }; - /** - * Resize the canvas to the current size of the frame - */ - Graph3d.prototype._resizeCanvas = function() { - this.frame.canvas.style.width = '100%'; - this.frame.canvas.style.height = '100%'; + module.exports = Slider; - this.frame.canvas.width = this.frame.canvas.clientWidth; - this.frame.canvas.height = this.frame.canvas.clientHeight; - // adjust with for margin - this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; - }; +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { /** - * Start animation + * @prototype StepNumber + * The class StepNumber is an iterator for Numbers. You provide a start and end + * value, and a best step size. StepNumber itself rounds to fixed values and + * a finds the step that best fits the provided step. + * + * If prettyStep is true, the step size is chosen as close as possible to the + * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... + * + * Example usage: + * var step = new StepNumber(0, 10, 2.5, true); + * step.start(); + * while (!step.end()) { + * alert(step.getCurrent()); + * step.next(); + * } + * + * Version: 1.0 + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ - Graph3d.prototype.animationStart = function() { - if (!this.frame.filter || !this.frame.filter.slider) - throw 'No animation available'; + function StepNumber(start, end, step, prettyStep) { + // set default values + this._start = 0; + this._end = 0; + this._step = 1; + this.prettyStep = true; + this.precision = 5; - this.frame.filter.slider.play(); + this._current = 0; + this.setRange(start, end, step, prettyStep); }; - /** - * Stop animation + * Set a new range: start, end and step. + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ - Graph3d.prototype.animationStop = function() { - if (!this.frame.filter || !this.frame.filter.slider) return; + StepNumber.prototype.setRange = function(start, end, step, prettyStep) { + this._start = start ? start : 0; + this._end = end ? end : 0; - this.frame.filter.slider.stop(); + this.setStep(step, prettyStep); }; - /** - * Resize the center position based on the current values in this.defaultXCenter - * and this.defaultYCenter (which are strings with a percentage or a value - * in pixels). The center positions are the variables this.xCenter - * and this.yCenter + * Set a new step size + * @param {Number} step New step size. Must be a positive value + * @param {boolean} prettyStep Optional. If true, the provided step is rounded + * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ - Graph3d.prototype._resizeCenter = function() { - // calculate the horizontal center position - if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { - this.xcenter = - parseFloat(this.defaultXCenter) / 100 * - this.frame.canvas.clientWidth; - } - else { - this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px - } + StepNumber.prototype.setStep = function(step, prettyStep) { + if (step === undefined || step <= 0) + return; - // calculate the vertical center position - if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { - this.ycenter = - parseFloat(this.defaultYCenter) / 100 * - (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); - } - else { - this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px - } + if (prettyStep !== undefined) + this.prettyStep = prettyStep; + + if (this.prettyStep === true) + this._step = StepNumber.calculatePrettyStep(step); + else + this._step = step; }; /** - * Set the rotation and distance of the camera - * @param {Object} pos An object with the camera position. The object - * contains three parameters: - * - horizontal {Number} - * The horizontal rotation, between 0 and 2*PI. - * Optional, can be left undefined. - * - vertical {Number} - * The vertical rotation, between 0 and 0.5*PI - * if vertical=0.5*PI, the graph is shown from the - * top. Optional, can be left undefined. - * - distance {Number} - * The (normalized) distance of the camera to the - * center of the graph, a value between 0.71 and 5.0. - * Optional, can be left undefined. + * Calculate a nice step size, closest to the desired step size. + * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an + * integer Number. For example 1, 2, 5, 10, 20, 50, etc... + * @param {Number} step Desired step size + * @return {Number} Nice step size */ - Graph3d.prototype.setCameraPosition = function(pos) { - if (pos === undefined) { - return; - } + StepNumber.calculatePrettyStep = function (step) { + var log10 = function (x) {return Math.log(x) / Math.LN10;}; - if (pos.horizontal !== undefined && pos.vertical !== undefined) { - this.camera.setArmRotation(pos.horizontal, pos.vertical); - } + // try three steps (multiple of 1, 2, or 5 + var step1 = Math.pow(10, Math.round(log10(step))), + step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), + step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); - if (pos.distance !== undefined) { - this.camera.setArmLength(pos.distance); + // choose the best step (closest to minimum step) + var prettyStep = step1; + if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; + if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; + + // for safety + if (prettyStep <= 0) { + prettyStep = 1; } - this.redraw(); + return prettyStep; }; - /** - * Retrieve the current camera rotation - * @return {object} An object with parameters horizontal, vertical, and - * distance + * returns the current value of the step + * @return {Number} current value */ - Graph3d.prototype.getCameraPosition = function() { - var pos = this.camera.getArmRotation(); - pos.distance = this.camera.getArmLength(); - return pos; + StepNumber.prototype.getCurrent = function () { + return parseFloat(this._current.toPrecision(this.precision)); }; /** - * Load data into the 3D Graph + * returns the current step size + * @return {Number} current step size */ - Graph3d.prototype._readData = function(data) { - // read the data - this._dataInitialize(data, this.style); - - - if (this.dataFilter) { - // apply filtering - this.dataPoints = this.dataFilter._getDataPoints(); - } - else { - // no filtering. load all data - this.dataPoints = this._getDataPoints(this.dataTable); - } - - // draw the filter - this._redrawFilter(); + StepNumber.prototype.getStep = function () { + return this._step; }; /** - * Replace the dataset of the Graph3d - * @param {Array | DataSet | DataView} data + * Set the current value to the largest value smaller than start, which + * is a multiple of the step size */ - Graph3d.prototype.setData = function (data) { - this._readData(data); - this.redraw(); + StepNumber.prototype.start = function() { + this._current = this._start - this._start % this._step; + }; - // start animation when option is true - if (this.animationAutoStart && this.dataFilter) { - this.animationStart(); - } + /** + * Do a step, add the step size to the current value + */ + StepNumber.prototype.next = function () { + this._current += this._step; }; /** - * Update the options. Options will be merged with current options - * @param {Object} options + * Returns true whether the end is reached + * @return {boolean} True if the current value has passed the end value. */ - Graph3d.prototype.setOptions = function (options) { - var cameraPosition = undefined; + StepNumber.prototype.end = function () { + return (this._current > this._end); + }; - this.animationStop(); + module.exports = StepNumber; - if (options !== undefined) { - // retrieve parameter values - if (options.width !== undefined) this.width = options.width; - if (options.height !== undefined) this.height = options.height; - if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; - if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { - if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; - if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; - if (options.xLabel !== undefined) this.xLabel = options.xLabel; - if (options.yLabel !== undefined) this.yLabel = options.yLabel; - if (options.zLabel !== undefined) this.zLabel = options.zLabel; + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(17); + var Core = __webpack_require__(46); + var TimeAxis = __webpack_require__(30); + var CurrentTime = __webpack_require__(21); + var CustomTime = __webpack_require__(22); + var ItemSet = __webpack_require__(27); - if (options.xValueLabel !== undefined) this.xValueLabel = options.xValueLabel; - if (options.yValueLabel !== undefined) this.yValueLabel = options.yValueLabel; - if (options.zValueLabel !== undefined) this.zValueLabel = options.zValueLabel; + /** + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {vis.DataSet | Array | google.visualization.DataTable} [groups] + * @param {Object} [options] See Timeline.setOptions for the available options. + * @constructor + * @extends Core + */ + function Timeline (container, items, groups, options) { + if (!(this instanceof Timeline)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } - if (options.style !== undefined) { - var styleNumber = this._getStyleNumber(options.style); - if (styleNumber !== -1) { - this.style = styleNumber; - } - } - if (options.showGrid !== undefined) this.showGrid = options.showGrid; - if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; - if (options.showShadow !== undefined) this.showShadow = options.showShadow; - if (options.tooltip !== undefined) this.showTooltip = options.tooltip; - if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; - if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; - if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; + // if the third element is options, the forth is groups (optionally); + if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { + var forthArgument = options; + options = groups; + groups = forthArgument; + } - if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; - if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; - if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; + var me = this; + this.defaultOptions = { + start: null, + end: null, - if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; - if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; + autoResize: true, - if (options.xMin !== undefined) this.defaultXMin = options.xMin; - if (options.xStep !== undefined) this.defaultXStep = options.xStep; - if (options.xMax !== undefined) this.defaultXMax = options.xMax; - if (options.yMin !== undefined) this.defaultYMin = options.yMin; - if (options.yStep !== undefined) this.defaultYStep = options.yStep; - if (options.yMax !== undefined) this.defaultYMax = options.yMax; - if (options.zMin !== undefined) this.defaultZMin = options.zMin; - if (options.zStep !== undefined) this.defaultZStep = options.zStep; - if (options.zMax !== undefined) this.defaultZMax = options.zMax; - if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; - if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); - if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; + // Create the DOM, props, and emitter + this._create(container); - if (cameraPosition !== undefined) { - this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); - this.camera.setArmLength(cameraPosition.distance); - } - else { - this.camera.setArmRotation(1.0, 0.5); - this.camera.setArmLength(1.7); + // all components listed here will be repainted automatically + this.components = []; + + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + hiddenDates: [], + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) } - } + }; - this._setBackgroundColor(options && options.backgroundColor); + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; - this.setSize(this.width, this.height); + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - // re-load the data - if (this.dataTable) { - this.setData(this.dataTable); - } + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); - // start animation when option is true - if (this.animationAutoStart && this.dataFilter) { - this.animationStart(); - } - }; + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); - /** - * Redraw the Graph. - */ - Graph3d.prototype.redraw = function() { - if (this.dataPoints === undefined) { - throw 'Error: graph data not initialized'; - } + // item set + this.itemSet = new ItemSet(this.body); + this.components.push(this.itemSet); - this._resizeCanvas(); - this._resizeCenter(); - this._redrawSlider(); - this._redrawClear(); - this._redrawAxis(); + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet - if (this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE) { - this._redrawDataGrid(); + // apply options + if (options) { + this.setOptions(options); } - else if (this.style === Graph3d.STYLE.LINE) { - this._redrawDataLine(); + + // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! + if (groups) { + this.setGroups(groups); } - else if (this.style === Graph3d.STYLE.BAR || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - this._redrawDataBar(); + + // create itemset + if (items) { + this.setItems(items); } else { - // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE - this._redrawDataDot(); + this.redraw(); } + } - this._redrawInfo(); - this._redrawLegend(); - }; - - /** - * Clear the canvas before redrawing - */ - Graph3d.prototype._redrawClear = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - - ctx.clearRect(0, 0, canvas.width, canvas.height); - }; - + // Extend the functionality from Core + Timeline.prototype = new Core(); /** - * Redraw the legend showing the colors + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items */ - Graph3d.prototype._redrawLegend = function() { - var y; - - if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE) { - - var dotSize = this.frame.clientWidth * 0.02; - - var widthMin, widthMax; - if (this.style === Graph3d.STYLE.DOTSIZE) { - widthMin = dotSize / 2; // px - widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function - } - else { - widthMin = 20; // px - widthMax = 20; // px - } + Timeline.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); - var height = Math.max(this.frame.clientHeight * 0.25, 100); - var top = this.margin; - var right = this.frame.clientWidth - this.margin; - var left = right - widthMax; - var bottom = top + height; + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; } - - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - ctx.lineWidth = 1; - ctx.font = '14px arial'; // TODO: put in options - - if (this.style === Graph3d.STYLE.DOTCOLOR) { - // draw the color bar - var ymin = 0; - var ymax = height; // Todo: make height customizable - for (y = ymin; y < ymax; y++) { - var f = (y - ymin) / (ymax - ymin); - - //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function - var hue = f * 240; - var color = this._hsv2rgb(hue, 1, 1); - - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(left, top + y); - ctx.lineTo(right, top + y); - ctx.stroke(); - } - - ctx.strokeStyle = this.colorAxis; - ctx.strokeRect(left, top, widthMax, height); + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; } - - if (this.style === Graph3d.STYLE.DOTSIZE) { - // draw border around color bar - ctx.strokeStyle = this.colorAxis; - ctx.fillStyle = this.colorDot; - ctx.beginPath(); - ctx.moveTo(left, top); - ctx.lineTo(right, top); - ctx.lineTo(right - widthMax + widthMin, bottom); - ctx.lineTo(left, bottom); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' + } + }); } - if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE) { - // print values along the color bar - var gridLineLen = 5; // px - var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); - step.start(); - if (step.getCurrent() < this.valueMin) { - step.next(); - } - while (!step.end()) { - y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; + // set items + this.itemsData = newDataSet; + this.itemSet && this.itemSet.setItems(newDataSet); - ctx.beginPath(); - ctx.moveTo(left - gridLineLen, y); - ctx.lineTo(left, y); - ctx.stroke(); + if (initialLoad) { + if (this.options.start != undefined || this.options.end != undefined) { + if (this.options.start == undefined || this.options.end == undefined) { + var dataRange = this._getDataRange(); + } - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); + var start = this.options.start != undefined ? this.options.start : dataRange.start; + var end = this.options.end != undefined ? this.options.end : dataRange.end; - step.next(); + this.setWindow(start, end, {animate: false}); + } + else { + this.fit({animate: false}); } - - ctx.textAlign = 'right'; - ctx.textBaseline = 'top'; - var label = this.legendLabel; - ctx.fillText(label, right, bottom + this.margin); } }; /** - * Redraw the filter + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups */ - Graph3d.prototype._redrawFilter = function() { - this.frame.filter.innerHTML = ''; - - if (this.dataFilter) { - var options = { - 'visible': this.showAnimationControls - }; - var slider = new Slider(this.frame.filter, options); - this.frame.filter.slider = slider; - - // TODO: css here is not nice here... - this.frame.filter.style.padding = '10px'; - //this.frame.filter.style.backgroundColor = '#EFEFEF'; - - slider.setValues(this.dataFilter.values); - slider.setPlayInterval(this.animationInterval); - - // create an event handler - var me = this; - var onchange = function () { - var index = slider.getIndex(); - - me.dataFilter.selectValue(index); - me.dataPoints = me.dataFilter._getDataPoints(); - - me.redraw(); - }; - slider.setOnChangeCallback(onchange); + Timeline.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; } else { - this.frame.filter.slider = undefined; + // turn an array into a dataset + newDataSet = new DataSet(groups); } + + this.groupsData = newDataSet; + this.itemSet.setGroups(newDataSet); }; /** - * Redraw the slider + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected. If ids is an empty array, all items will be + * unselected. + * @param {Object} [options] Available options: + * `focus: boolean` + * If true, focus will be set to the selected item(s) + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + * Only applicable when option focus is true. */ - Graph3d.prototype._redrawSlider = function() { - if ( this.frame.filter.slider !== undefined) { - this.frame.filter.slider.redraw(); + Timeline.prototype.setSelection = function(ids, options) { + this.itemSet && this.itemSet.setSelection(ids); + + if (options && options.focus) { + this.focus(ids, options); } }; - /** - * Redraw common information + * Get the selected items by their id + * @return {Array} ids The ids of the selected items */ - Graph3d.prototype._redrawInfo = function() { - if (this.dataFilter) { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - - ctx.font = '14px arial'; // TODO: put in options - ctx.lineStyle = 'gray'; - ctx.fillStyle = 'gray'; - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - var x = this.margin; - var y = this.margin; - ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); - } + Timeline.prototype.getSelection = function() { + return this.itemSet && this.itemSet.getSelection() || []; }; - /** - * Redraw the axis + * Adjust the visible window such that the selected item (or multiple items) + * are centered on screen. + * @param {String | String[]} id An item id or array with item ids + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + * Only applicable when option focus is true */ - Graph3d.prototype._redrawAxis = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - from, to, step, prettyStep, - text, xText, yText, zText, - offset, xOffset, yOffset, - xMin2d, xMax2d; + Timeline.prototype.focus = function(id, options) { + if (!this.itemsData || id == undefined) return; - // TODO: get the actual rendered style of the containerElement - //ctx.font = this.containerElement.style.font; - ctx.font = 24 / this.camera.getArmLength() + 'px arial'; + var ids = Array.isArray(id) ? id : [id]; - // calculate the length for the short grid lines - var gridLenX = 0.025 / this.scale.x; - var gridLenY = 0.025 / this.scale.y; - var textMargin = 5 / this.camera.getArmLength(); // px - var armAngle = this.camera.getArmRotation().horizontal; + // get the specified item(s) + var itemsData = this.itemsData.getDataSet().get(ids, { + type: { + start: 'Date', + end: 'Date' + } + }); - // draw x-grid lines - ctx.lineWidth = 1; - prettyStep = (this.defaultXStep === undefined); - step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); - step.start(); - if (step.getCurrent() < this.xMin) { - step.next(); - } - while (!step.end()) { - var x = step.getCurrent(); + // calculate minimum start and maximum end of specified items + var start = null; + var end = null; + itemsData.forEach(function (itemData) { + var s = itemData.start.valueOf(); + var e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf(); - if (this.showGrid) { - from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + if (start === null || s < start) { + start = s; } - else { - from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + if (end === null || e > end) { + end = e; } + }); - yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; - text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); - if (Math.cos(armAngle * 2) > 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - text.y += textMargin; - } - else if (Math.sin(armAngle * 2) < 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - } - ctx.fillStyle = this.colorAxis; - ctx.fillText(' ' + this.xValueLabel(step.getCurrent()) + ' ', text.x, text.y); + if (start !== null && end !== null) { + // calculate the new middle and interval for the window + var middle = (start + end) / 2; + var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1); - step.next(); + var animate = (options && options.animate !== undefined) ? options.animate : true; + this.range.setRange(middle - interval / 2, middle + interval / 2, animate); } + }; - // draw y-grid lines - ctx.lineWidth = 1; - prettyStep = (this.defaultYStep === undefined); - step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); - step.start(); - if (step.getCurrent() < this.yMin) { - step.next(); - } - while (!step.end()) { - if (this.showGrid) { - from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - } - else { - from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + /** + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null + */ + Timeline.prototype.getItemRange = function() { + // calculate min from start filed + var dataset = this.itemsData.getDataSet(), + min = null, + max = null; - from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - } + if (dataset) { + // calculate the minimum value of the field 'start' + var minItem = dataset.min('start'); + min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; + // Note: we convert first to Date and then to number because else + // a conversion from ISODate to Number will fail - xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; - text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); - if (Math.cos(armAngle * 2) < 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - text.y += textMargin; - } - else if (Math.sin(armAngle * 2) > 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; + // calculate maximum value of fields 'start' and 'end' + var maxStartItem = dataset.max('start'); + if (maxStartItem) { + max = util.convert(maxStartItem.start, 'Date').valueOf(); } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; + var maxEndItem = dataset.max('end'); + if (maxEndItem) { + if (max == null) { + max = util.convert(maxEndItem.end, 'Date').valueOf(); + } + else { + max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); + } } - ctx.fillStyle = this.colorAxis; - ctx.fillText(' ' + this.yValueLabel(step.getCurrent()) + ' ', text.x, text.y); - - step.next(); - } - - // draw z-grid lines and axis - ctx.lineWidth = 1; - prettyStep = (this.defaultZStep === undefined); - step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); - step.start(); - if (step.getCurrent() < this.zMin) { - step.next(); } - xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; - yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; - while (!step.end()) { - // TODO: make z-grid lines really 3d? - from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(from.x - textMargin, from.y); - ctx.stroke(); - - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(this.zValueLabel(step.getCurrent()) + ' ', from.x - 5, from.y); - step.next(); - } - ctx.lineWidth = 1; - from = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - to = this._convert3Dto2D(new Point3d(xText, yText, this.zMax)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; + }; - // draw x-axis - ctx.lineWidth = 1; - // line at yMin - xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); - xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(xMin2d.x, xMin2d.y); - ctx.lineTo(xMax2d.x, xMax2d.y); - ctx.stroke(); - // line at ymax - xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); - xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(xMin2d.x, xMin2d.y); - ctx.lineTo(xMax2d.x, xMax2d.y); - ctx.stroke(); - // draw y-axis - ctx.lineWidth = 1; - // line at xMin - from = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - // line at xMax - from = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + module.exports = Timeline; - // draw x-label - var xLabel = this.xLabel; - if (xLabel.length > 0) { - yOffset = 0.1 / this.scale.y; - xText = (this.xMin + this.xMax) / 2; - yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; - text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - if (Math.cos(armAngle * 2) > 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - } - else if (Math.sin(armAngle * 2) < 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - } - ctx.fillStyle = this.colorAxis; - ctx.fillText(xLabel, text.x, text.y); - } - // draw y-label - var yLabel = this.yLabel; - if (yLabel.length > 0) { - xOffset = 0.1 / this.scale.x; - xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; - yText = (this.yMin + this.yMax) / 2; - text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - if (Math.cos(armAngle * 2) < 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - } - else if (Math.sin(armAngle * 2) > 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - } - ctx.fillStyle = this.colorAxis; - ctx.fillText(yLabel, text.x, text.y); - } +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { - // draw z-label - var zLabel = this.zLabel; - if (zLabel.length > 0) { - offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? - xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; - yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; - zText = (this.zMin + this.zMax) / 2; - text = this._convert3Dto2D(new Point3d(xText, yText, zText)); - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(zLabel, text.x - offset, text.y); - } - }; + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(17); + var Core = __webpack_require__(46); + var TimeAxis = __webpack_require__(30); + var CurrentTime = __webpack_require__(21); + var CustomTime = __webpack_require__(22); + var LineGraph = __webpack_require__(29); /** - * Calculate the color based on the given value. - * @param {Number} H Hue, a value be between 0 and 360 - * @param {Number} S Saturation, a value between 0 and 1 - * @param {Number} V Value, a value between 0 and 1 + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Graph2d.setOptions for the available options. + * @constructor + * @extends Core */ - Graph3d.prototype._hsv2rgb = function(H, S, V) { - var R, G, B, C, Hi, X; - - C = V * S; - Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 - X = C * (1 - Math.abs(((H/60) % 2) - 1)); - - switch (Hi) { - case 0: R = C; G = X; B = 0; break; - case 1: R = X; G = C; B = 0; break; - case 2: R = 0; G = C; B = X; break; - case 3: R = 0; G = X; B = C; break; - case 4: R = X; G = 0; B = C; break; - case 5: R = C; G = 0; B = X; break; - - default: R = 0; G = 0; B = 0; break; + function Graph2d (container, items, groups, options) { + // if the third element is options, the forth is groups (optionally); + if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { + var forthArgument = options; + options = groups; + groups = forthArgument; } - return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; - }; - + var me = this; + this.defaultOptions = { + start: null, + end: null, - /** - * Draw all datapoints as a grid - * This function can be used when the style is 'grid' - */ - Graph3d.prototype._redrawDataGrid = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - point, right, top, cross, - i, - topSideVisible, fillStyle, strokeStyle, lineWidth, - h, s, v, zAvg; + autoResize: true, + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + // Create the DOM, props, and emitter + this._create(container); - // calculate the translations and screen position of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); + // all components listed here will be repainted automatically + this.components = []; - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + hiddenDates: [], + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) + } + }; - // calculate the translation of the point at the bottom (needed for sorting) - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; - // sort the points on depth of their (x,y) position (not on z) - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - if (this.style === Graph3d.STYLE.SURFACE) { - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; - cross = this.dataPoints[i].pointCross; + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); - if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); - if (this.showGrayBottom || this.showShadow) { - // calculate the cross product of the two vectors from center - // to left and right, in order to know whether we are looking at the - // bottom or at the top side. We can also use the cross product - // for calculating light intensity - var aDiff = Point3d.subtract(cross.trans, point.trans); - var bDiff = Point3d.subtract(top.trans, right.trans); - var crossproduct = Point3d.crossProduct(aDiff, bDiff); - var len = crossproduct.length(); - // FIXME: there is a bug with determining the surface side (shadow or colored) + // item set + this.linegraph = new LineGraph(this.body); + this.components.push(this.linegraph); - topSideVisible = (crossproduct.z > 0); - } - else { - topSideVisible = true; - } + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet - if (topSideVisible) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - s = 1; // saturation + // apply options + if (options) { + this.setOptions(options); + } - if (this.showShadow) { - v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale - fillStyle = this._hsv2rgb(h, s, v); - strokeStyle = fillStyle; - } - else { - v = 1; - fillStyle = this._hsv2rgb(h, s, v); - strokeStyle = this.colorAxis; - } - } - else { - fillStyle = 'gray'; - strokeStyle = this.colorAxis; - } - lineWidth = 0.5; + // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! + if (groups) { + this.setGroups(groups); + } - ctx.lineWidth = lineWidth; - ctx.fillStyle = fillStyle; - ctx.strokeStyle = strokeStyle; - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.lineTo(cross.screen.x, cross.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - } - } + // create itemset + if (items) { + this.setItems(items); } - else { // grid style - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; + else { + this.redraw(); + } + } - if (point !== undefined) { - if (this.showPerspective) { - lineWidth = 2 / -point.trans.z; - } - else { - lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); - } - } + // Extend the functionality from Core + Graph2d.prototype = new Core(); - if (point !== undefined && right !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + /** + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + */ + Graph2d.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.stroke(); + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' } + }); + } - if (point !== undefined && top !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + top.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + // set items + this.itemsData = newDataSet; + this.linegraph && this.linegraph.setItems(newDataSet); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.stroke(); - } + if (initialLoad) { + if (this.options.start != undefined || this.options.end != undefined) { + var start = this.options.start != undefined ? this.options.start : null; + var end = this.options.end != undefined ? this.options.end : null; + + this.setWindow(start, end, {animate: false}); + } + else { + this.fit({animate: false}); } } }; + /** + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups + */ + Graph2d.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(groups); + } + + this.groupsData = newDataSet; + this.linegraph.setGroups(newDataSet); + }; /** - * Draw all datapoints as dots. - * This function can be used when the style is 'dot' or 'dot-line' + * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right). + * @param groupId + * @param width + * @param height */ - Graph3d.prototype._redrawDataDot = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - var i; + Graph2d.prototype.getLegend = function(groupId, width, height) { + if (width === undefined) {width = 15;} + if (height === undefined) {height = 15;} + if (this.linegraph.groups[groupId] !== undefined) { + return this.linegraph.groups[groupId].getLegend(width,height); + } + else { + return "cannot find group:" + groupId; + } + } - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + /** + * This checks if the visible option of the supplied group (by ID) is true or false. + * @param groupId + * @returns {*} + */ + Graph2d.prototype.isGroupVisible = function(groupId) { + if (this.linegraph.groups[groupId] !== undefined) { + return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true)); + } + else { + return false; + } + } - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; - // calculate the distance from the point at the bottom to the camera - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + /** + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null + */ + Graph2d.prototype.getItemRange = function() { + var min = null; + var max = null; + + // calculate min from start filed + for (var groupId in this.linegraph.groups) { + if (this.linegraph.groups.hasOwnProperty(groupId)) { + if (this.linegraph.groups[groupId].visible == true) { + for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) { + var item = this.linegraph.groups[groupId].itemsData[i]; + var value = util.convert(item.x, 'Date').valueOf(); + min = min == null ? value : min > value ? value : min; + max = max == null ? value : max < value ? value : max; + } + } + } } - // order the translated points by depth - var sortDepth = function (a, b) { - return b.dist - a.dist; + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null }; - this.dataPoints.sort(sortDepth); + }; - // draw the datapoints as colored circles - var dotSize = this.frame.clientWidth * 0.02; // px - for (i = 0; i < this.dataPoints.length; i++) { - var point = this.dataPoints[i]; - if (this.style === Graph3d.STYLE.DOTLINE) { - // draw a vertical line from the bottom to the graph value - //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); - var from = this._convert3Dto2D(point.bottom); - ctx.lineWidth = 1; - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(point.screen.x, point.screen.y); - ctx.stroke(); - } - // calculate radius for the circle - var size; - if (this.style === Graph3d.STYLE.DOTSIZE) { - size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); - } - else { - size = dotSize; - } + module.exports = Graph2d; - var radius; - if (this.showPerspective) { - radius = size / -point.trans.z; - } - else { - radius = size * -(this.eye.z / this.camera.getArmLength()); - } - if (radius < 0) { - radius = 0; - } - var hue, color, borderColor; - if (this.style === Graph3d.STYLE.DOTCOLOR ) { - // calculate the color based on the value - hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } - else if (this.style === Graph3d.STYLE.DOTSIZE) { - color = this.colorDot; - borderColor = this.colorDotBorder; - } - else { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { - // draw the circle - ctx.lineWidth = 1.0; - ctx.strokeStyle = borderColor; - ctx.fillStyle = color; - ctx.beginPath(); - ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); - ctx.fill(); - ctx.stroke(); + /** + * Created by Alex on 10/3/2014. + */ + var moment = __webpack_require__(44); + + + /** + * used in Core to convert the options into a volatile variable + * + * @param Core + */ + exports.convertHiddenOptions = function(body, hiddenDates) { + body.hiddenDates = []; + if (hiddenDates) { + if (Array.isArray(hiddenDates) == true) { + for (var i = 0; i < hiddenDates.length; i++) { + if (hiddenDates[i].repeat === undefined) { + var dateItem = {}; + dateItem.start = moment(hiddenDates[i].start).toDate().valueOf(); + dateItem.end = moment(hiddenDates[i].end).toDate().valueOf(); + body.hiddenDates.push(dateItem); + } + } + body.hiddenDates.sort(function (a, b) { + return a.start - b.start; + }); // sort by start time + } } }; + /** - * Draw all datapoints as bars. - * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' + * create new entrees for the repeating hidden dates + * @param body + * @param hiddenDates */ - Graph3d.prototype._redrawDataBar = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - var i, j, surface, corners; + exports.updateHiddenDates = function (body, hiddenDates) { + if (hiddenDates && body.domProps.centerContainer.width !== undefined) { + exports.convertHiddenOptions(body, hiddenDates); - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + var start = moment(body.range.start); + var end = moment(body.range.end); - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + var totalRange = (body.range.end - body.range.start); + var pixelTime = totalRange / body.domProps.centerContainer.width; - // calculate the distance from the point at the bottom to the camera - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + for (var i = 0; i < hiddenDates.length; i++) { + if (hiddenDates[i].repeat !== undefined) { + var startDate = moment(hiddenDates[i].start); + var endDate = moment(hiddenDates[i].end); - // order the translated points by depth - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + if (startDate._d == "Invalid Date") { + throw new Error("Supplied start date is not valid: " + hiddenDates[i].start); + } + if (endDate._d == "Invalid Date") { + throw new Error("Supplied end date is not valid: " + hiddenDates[i].end); + } - // draw the datapoints as bars - var xWidth = this.xBarWidth / 2; - var yWidth = this.yBarWidth / 2; - for (i = 0; i < this.dataPoints.length; i++) { - var point = this.dataPoints[i]; + var duration = endDate - startDate; + if (duration >= 4 * pixelTime) { - // determine color - var hue, color, borderColor; - if (this.style === Graph3d.STYLE.BARCOLOR ) { - // calculate the color based on the value - hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } - else if (this.style === Graph3d.STYLE.BARSIZE) { - color = this.colorDot; - borderColor = this.colorDotBorder; - } - else { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } + var offset = 0; + var runUntil = end.clone(); + switch (hiddenDates[i].repeat) { + case "daily": // case of time + if (startDate.day() != endDate.day()) { + offset = 1; + } + startDate.dayOfYear(start.dayOfYear()); + startDate.year(start.year()); + startDate.subtract(7,'days'); - // calculate size for the bar - if (this.style === Graph3d.STYLE.BARSIZE) { - xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); - yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); - } + endDate.dayOfYear(start.dayOfYear()); + endDate.year(start.year()); + endDate.subtract(7 - offset,'days'); - // calculate all corner points - var me = this; - var point3d = point.point; - var top = [ - {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, - {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, - {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, - {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} - ]; - var bottom = [ - {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, - {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, - {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, - {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} - ]; + runUntil.add(1, 'weeks'); + break; + case "weekly": + var dayOffset = endDate.diff(startDate,'days') + var day = startDate.day(); - // calculate screen location of the points - top.forEach(function (obj) { - obj.screen = me._convert3Dto2D(obj.point); - }); - bottom.forEach(function (obj) { - obj.screen = me._convert3Dto2D(obj.point); - }); + // set the start date to the range.start + startDate.date(start.date()); + startDate.month(start.month()); + startDate.year(start.year()); + endDate = startDate.clone(); - // create five sides, calculate both corner points and center points - var surfaces = [ - {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, - {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, - {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, - {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, - {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} - ]; - point.surfaces = surfaces; + // force + startDate.day(day); + endDate.day(day); + endDate.add(dayOffset,'days'); - // calculate the distance of each of the surface centers to the camera - for (j = 0; j < surfaces.length; j++) { - surface = surfaces[j]; - var transCenter = this._convertPointToTranslation(surface.center); - surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; - // TODO: this dept calculation doesn't work 100% of the cases due to perspective, - // but the current solution is fast/simple and works in 99.9% of all cases - // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) - } + startDate.subtract(1,'weeks'); + endDate.subtract(1,'weeks'); - // order the surfaces by their (translated) depth - surfaces.sort(function (a, b) { - var diff = b.dist - a.dist; - if (diff) return diff; + runUntil.add(1, 'weeks'); + break + case "monthly": + if (startDate.month() != endDate.month()) { + offset = 1; + } + startDate.month(start.month()); + startDate.year(start.year()); + startDate.subtract(1,'months'); - // if equal depth, sort the top surface last - if (a.corners === top) return 1; - if (b.corners === top) return -1; + endDate.month(start.month()); + endDate.year(start.year()); + endDate.subtract(1,'months'); + endDate.add(offset,'months'); - // both are equal - return 0; - }); + runUntil.add(1, 'months'); + break; + case "yearly": + if (startDate.year() != endDate.year()) { + offset = 1; + } + startDate.year(start.year()); + startDate.subtract(1,'years'); + endDate.year(start.year()); + endDate.subtract(1,'years'); + endDate.add(offset,'years'); - // draw the ordered surfaces - ctx.lineWidth = 1; - ctx.strokeStyle = borderColor; - ctx.fillStyle = color; - // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside - for (j = 2; j < surfaces.length; j++) { - surface = surfaces[j]; - corners = surface.corners; - ctx.beginPath(); - ctx.moveTo(corners[3].screen.x, corners[3].screen.y); - ctx.lineTo(corners[0].screen.x, corners[0].screen.y); - ctx.lineTo(corners[1].screen.x, corners[1].screen.y); - ctx.lineTo(corners[2].screen.x, corners[2].screen.y); - ctx.lineTo(corners[3].screen.x, corners[3].screen.y); - ctx.fill(); - ctx.stroke(); + runUntil.add(1, 'years'); + break; + default: + console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); + return; + } + while (startDate < runUntil) { + body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); + switch (hiddenDates[i].repeat) { + case "daily": + startDate.add(1, 'days'); + endDate.add(1, 'days'); + break; + case "weekly": + startDate.add(1, 'weeks'); + endDate.add(1, 'weeks'); + break + case "monthly": + startDate.add(1, 'months'); + endDate.add(1, 'months'); + break; + case "yearly": + startDate.add(1, 'y'); + endDate.add(1, 'y'); + break; + default: + console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); + return; + } + } + body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); + } + } + } + // remove duplicates, merge where possible + exports.removeDuplicates(body); + // ensure the new positions are not on hidden dates + var startHidden = exports.isHidden(body.range.start, body.hiddenDates); + var endHidden = exports.isHidden(body.range.end,body.hiddenDates); + var rangeStart = body.range.start; + var rangeEnd = body.range.end; + if (startHidden.hidden == true) {rangeStart = body.range.startToFront == true ? startHidden.startDate - 1 : startHidden.endDate + 1;} + if (endHidden.hidden == true) {rangeEnd = body.range.endToFront == true ? endHidden.startDate - 1 : endHidden.endDate + 1;} + if (startHidden.hidden == true || endHidden.hidden == true) { + body.range._applyRange(rangeStart, rangeEnd); } } - }; + + } /** - * Draw a line through all datapoints. - * This function can be used when the style is 'line' + * remove duplicates from the hidden dates list. Duplicates are evil. They mess everything up. + * Scales with N^2 + * @param body */ - Graph3d.prototype._redrawDataLine = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - point, i; - - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? - - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + exports.removeDuplicates = function(body) { + var hiddenDates = body.hiddenDates; + var safeDates = []; + for (var i = 0; i < hiddenDates.length; i++) { + for (var j = 0; j < hiddenDates.length; j++) { + if (i != j && hiddenDates[j].remove != true && hiddenDates[i].remove != true) { + // j inside i + if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { + hiddenDates[j].remove = true; + } + // j start inside i + else if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].start <= hiddenDates[i].end) { + hiddenDates[i].end = hiddenDates[j].end; + hiddenDates[j].remove = true; + } + // j end inside i + else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { + hiddenDates[i].start = hiddenDates[j].start; + hiddenDates[j].remove = true; + } + } + } } - // start the line - if (this.dataPoints.length > 0) { - point = this.dataPoints[0]; - - ctx.lineWidth = 1; // TODO: make customizable - ctx.strokeStyle = 'blue'; // TODO: make customizable - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); + for (var i = 0; i < hiddenDates.length; i++) { + if (hiddenDates[i].remove !== true) { + safeDates.push(hiddenDates[i]); + } } - // draw the datapoints as colored circles - for (i = 1; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - ctx.lineTo(point.screen.x, point.screen.y); - } + body.hiddenDates = safeDates; + body.hiddenDates.sort(function (a, b) { + return a.start - b.start; + }); // sort by start time + } - // finish the line - if (this.dataPoints.length > 0) { - ctx.stroke(); + exports.printDates = function(dates) { + for (var i =0; i < dates.length; i++) { + console.log(i, new Date(dates[i].start),new Date(dates[i].end), dates[i].start, dates[i].end, dates[i].remove); } - }; + } /** - * Start a moving operation inside the provided parent element - * @param {Event} event The event that occurred (required for - * retrieving the mouse position) + * Used in TimeStep to avoid the hidden times. + * @param timeStep + * @param previousTime */ - Graph3d.prototype._onMouseDown = function(event) { - event = event || window.event; - - // check if mouse is still down (may be up when focus is lost for example - // in an iframe) - if (this.leftButtonDown) { - this._onMouseUp(event); + exports.stepOverHiddenDates = function(timeStep, previousTime) { + var stepInHidden = false; + var currentValue = timeStep.current.valueOf(); + for (var i = 0; i < timeStep.hiddenDates.length; i++) { + var startDate = timeStep.hiddenDates[i].start; + var endDate = timeStep.hiddenDates[i].end; + if (currentValue >= startDate && currentValue < endDate) { + stepInHidden = true; + break; + } } - // only react on left mouse button down - this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); - if (!this.leftButtonDown && !this.touchDown) return; - - // get mouse position (different code for IE and all other browsers) - this.startMouseX = getMouseX(event); - this.startMouseY = getMouseY(event); - - this.startStart = new Date(this.start); - this.startEnd = new Date(this.end); - this.startArmRotation = this.camera.getArmRotation(); - - this.frame.style.cursor = 'move'; + if (stepInHidden == true && currentValue < timeStep._end.valueOf() && currentValue != previousTime) { + var prevValue = moment(previousTime); + var newValue = moment(endDate); + //check if the next step should be major + if (prevValue.year() != newValue.year()) {timeStep.switchedYear = true;} + else if (prevValue.month() != newValue.month()) {timeStep.switchedMonth = true;} + else if (prevValue.dayOfYear() != newValue.dayOfYear()) {timeStep.switchedDay = true;} - // add event listeners to handle moving the contents - // we store the function onmousemove and onmouseup in the graph, so we can - // remove the eventlisteners lateron in the function mouseUp() - var me = this; - this.onmousemove = function (event) {me._onMouseMove(event);}; - this.onmouseup = function (event) {me._onMouseUp(event);}; - util.addEventListener(document, 'mousemove', me.onmousemove); - util.addEventListener(document, 'mouseup', me.onmouseup); - util.preventDefault(event); + timeStep.current = newValue.toDate(); + } }; + ///** + // * Used in TimeStep to avoid the hidden times. + // * @param timeStep + // * @param previousTime + // */ + //exports.checkFirstStep = function(timeStep) { + // var stepInHidden = false; + // var currentValue = timeStep.current.valueOf(); + // for (var i = 0; i < timeStep.hiddenDates.length; i++) { + // var startDate = timeStep.hiddenDates[i].start; + // var endDate = timeStep.hiddenDates[i].end; + // if (currentValue >= startDate && currentValue < endDate) { + // stepInHidden = true; + // break; + // } + // } + // + // if (stepInHidden == true && currentValue <= timeStep._end.valueOf()) { + // var newValue = moment(endDate); + // timeStep.current = newValue.toDate(); + // } + //}; + /** - * Perform moving operating. - * This function activated from within the funcion Graph.mouseDown(). - * @param {Event} event Well, eehh, the event + * replaces the Core toScreen methods + * @param Core + * @param time + * @param width + * @returns {number} */ - Graph3d.prototype._onMouseMove = function (event) { - event = event || window.event; + exports.toScreen = function(Core, time, width) { + if (Core.body.hiddenDates.length == 0) { + var conversion = Core.range.conversion(width); + return (time.valueOf() - conversion.offset) * conversion.scale; + } + else { + var hidden = exports.isHidden(time, Core.body.hiddenDates) + if (hidden.hidden == true) { + time = hidden.startDate; + } - // calculate change in mouse position - var diffX = parseFloat(getMouseX(event)) - this.startMouseX; - var diffY = parseFloat(getMouseY(event)) - this.startMouseY; + var duration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); + time = exports.correctTimeForHidden(Core.body.hiddenDates, Core.range, time); - var horizontalNew = this.startArmRotation.horizontal + diffX / 200; - var verticalNew = this.startArmRotation.vertical + diffY / 200; + var conversion = Core.range.conversion(width, duration); + return (time.valueOf() - conversion.offset) * conversion.scale; + } + }; - var snapAngle = 4; // degrees - var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); - // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... - // the -0.001 is to take care that the vertical axis is always drawn at the left front corner - if (Math.abs(Math.sin(horizontalNew)) < snapValue) { - horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; - } - if (Math.abs(Math.cos(horizontalNew)) < snapValue) { - horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; + /** + * Replaces the core toTime methods + * @param body + * @param range + * @param x + * @param width + * @returns {Date} + */ + exports.toTime = function(Core, x, width) { + if (Core.body.hiddenDates.length == 0) { + var conversion = Core.range.conversion(width); + return new Date(x / conversion.scale + conversion.offset); } + else { + var hiddenDuration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); + var totalDuration = Core.range.end - Core.range.start - hiddenDuration; + var partialDuration = totalDuration * x / width; + var accumulatedHiddenDuration = exports.getAccumulatedHiddenDuration(Core.body.hiddenDates, Core.range, partialDuration); - // snap vertically to nice angles - if (Math.abs(Math.sin(verticalNew)) < snapValue) { - verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; - } - if (Math.abs(Math.cos(verticalNew)) < snapValue) { - verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; + var newTime = new Date(accumulatedHiddenDuration + partialDuration + Core.range.start); + return newTime; } - - this.camera.setArmRotation(horizontalNew, verticalNew); - this.redraw(); - - // fire a cameraPositionChange event - var parameters = this.getCameraPosition(); - this.emit('cameraPositionChange', parameters); - - util.preventDefault(event); }; /** - * Stop moving operating. - * This function activated from within the funcion Graph.mouseDown(). - * @param {event} event The event + * Support function + * + * @param hiddenDates + * @param range + * @returns {number} */ - Graph3d.prototype._onMouseUp = function (event) { - this.frame.style.cursor = 'auto'; - this.leftButtonDown = false; - - // remove event listeners here - util.removeEventListener(document, 'mousemove', this.onmousemove); - util.removeEventListener(document, 'mouseup', this.onmouseup); - util.preventDefault(event); + exports.getHiddenDurationBetween = function(hiddenDates, start, end) { + var duration = 0; + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + // if time after the cutout, and the + if (startDate >= start && endDate < end) { + duration += endDate - startDate; + } + } + return duration; }; + /** - * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point - * @param {Event} event A mouse move event + * Support function + * @param hiddenDates + * @param range + * @param time + * @returns {{duration: number, time: *, offset: number}} */ - Graph3d.prototype._onTooltip = function (event) { - var delay = 300; // ms - var mouseX = getMouseX(event) - util.getAbsoluteLeft(this.frame); - var mouseY = getMouseY(event) - util.getAbsoluteTop(this.frame); - - if (!this.showTooltip) { - return; - } + exports.correctTimeForHidden = function(hiddenDates, range, time) { + time = moment(time).toDate().valueOf(); + time -= exports.getHiddenDurationBefore(hiddenDates,range,time); + return time; + }; - if (this.tooltipTimeout) { - clearTimeout(this.tooltipTimeout); - } + exports.getHiddenDurationBefore = function(hiddenDates, range, time) { + var timeOffset = 0; + time = moment(time).toDate().valueOf(); - // (delayed) display of a tooltip only if no mouse button is down - if (this.leftButtonDown) { - this._hideTooltip(); - return; + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + // if time after the cutout, and the + if (startDate >= range.start && endDate < range.end) { + if (time >= endDate) { + timeOffset += (endDate - startDate); + } + } } + return timeOffset; + } - if (this.tooltip && this.tooltip.dataPoint) { - // tooltip is currently visible - var dataPoint = this._dataPointFromXY(mouseX, mouseY); - if (dataPoint !== this.tooltip.dataPoint) { - // datapoint changed - if (dataPoint) { - this._showTooltip(dataPoint); + /** + * sum the duration from start to finish, including the hidden duration, + * until the required amount has been reached, return the accumulated hidden duration + * @param hiddenDates + * @param range + * @param time + * @returns {{duration: number, time: *, offset: number}} + */ + exports.getAccumulatedHiddenDuration = function(hiddenDates, range, requiredDuration) { + var hiddenDuration = 0; + var duration = 0; + var previousPoint = range.start; + //exports.printDates(hiddenDates) + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + // if time after the cutout, and the + if (startDate >= range.start && endDate < range.end) { + duration += startDate - previousPoint; + previousPoint = endDate; + if (duration >= requiredDuration) { + break; } else { - this._hideTooltip(); + hiddenDuration += endDate - startDate; } } } - else { - // tooltip is currently not visible - var me = this; - this.tooltipTimeout = setTimeout(function () { - me.tooltipTimeout = null; - // show a tooltip if we have a data point - var dataPoint = me._dataPointFromXY(mouseX, mouseY); - if (dataPoint) { - me._showTooltip(dataPoint); - } - }, delay); - } + return hiddenDuration; }; - /** - * Event handler for touchstart event on mobile devices - */ - Graph3d.prototype._onTouchStart = function(event) { - this.touchDown = true; - - var me = this; - this.ontouchmove = function (event) {me._onTouchMove(event);}; - this.ontouchend = function (event) {me._onTouchEnd(event);}; - util.addEventListener(document, 'touchmove', me.ontouchmove); - util.addEventListener(document, 'touchend', me.ontouchend); - this._onMouseDown(event); - }; /** - * Event handler for touchmove event on mobile devices + * used to step over to either side of a hidden block. Correction is disabled on tablets, might be set to true + * @param hiddenDates + * @param time + * @param direction + * @param correctionEnabled + * @returns {*} */ - Graph3d.prototype._onTouchMove = function(event) { - this._onMouseMove(event); - }; + exports.snapAwayFromHidden = function(hiddenDates, time, direction, correctionEnabled) { + var isHidden = exports.isHidden(time, hiddenDates); + if (isHidden.hidden == true) { + if (direction < 0) { + if (correctionEnabled == true) { + return isHidden.startDate - (isHidden.endDate - time) - 1; + } + else { + return isHidden.startDate - 1; + } + } + else { + if (correctionEnabled == true) { + return isHidden.endDate + (time - isHidden.startDate) + 1; + } + else { + return isHidden.endDate + 1; + } + } + } + else { + return time; + } + + } + /** - * Event handler for touchend event on mobile devices + * Check if a time is hidden + * + * @param time + * @param hiddenDates + * @returns {{hidden: boolean, startDate: Window.start, endDate: *}} */ - Graph3d.prototype._onTouchEnd = function(event) { - this.touchDown = false; - - util.removeEventListener(document, 'touchmove', this.ontouchmove); - util.removeEventListener(document, 'touchend', this.ontouchend); + exports.isHidden = function(time, hiddenDates) { + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; - this._onMouseUp(event); - }; + if (time >= startDate && time < endDate) { // if the start is entering a hidden zone + return {hidden: true, startDate: startDate, endDate: endDate}; + break; + } + } + return {hidden: false, startDate: startDate, endDate: endDate}; + } +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { /** - * Event handler for mouse wheel event, used to zoom the graph - * Code from http://adomas.org/javascript-mouse-wheel/ - * @param {event} event The event + * @constructor DataStep + * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an + * end data point. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - Graph3d.prototype._onWheel = function(event) { - if (!event) /* For IE. */ - event = window.event; + function DataStep(start, end, minimumStep, containerHeight, customRange, alignZeros) { + // variables + this.current = 0; - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail/3; - } + this.autoScale = true; + this.stepIndex = 0; + this.step = 1; + this.scale = 1; - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - var oldLength = this.camera.getArmLength(); - var newLength = oldLength * (1 - delta / 10); + this.marginStart; + this.marginEnd; + this.deadSpace = 0; - this.camera.setArmLength(newLength); - this.redraw(); + this.majorSteps = [1, 2, 5, 10]; + this.minorSteps = [0.25, 0.5, 1, 2]; - this._hideTooltip(); - } + this.alignZeros = alignZeros; + + this.setRange(start, end, minimumStep, containerHeight, customRange); + } - // fire a cameraPositionChange event - var parameters = this.getCameraPosition(); - this.emit('cameraPositionChange', parameters); - // Prevent default actions caused by mouse wheel. - // That might be ugly, but we handle scrolls somehow - // anyway, so don't bother here.. - util.preventDefault(event); - }; /** - * Test whether a point lies inside given 2D triangle - * @param {Point2d} point - * @param {Point2d[]} triangle - * @return {boolean} Returns true if given point lies inside or on the edge of the triangle - * @private + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Number} [start] The start date and time. + * @param {Number} [end] The end date and time. + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - Graph3d.prototype._insideTriangle = function (point, triangle) { - var a = triangle[0], - b = triangle[1], - c = triangle[2]; + DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { + this._start = customRange.min === undefined ? start : customRange.min; + this._end = customRange.max === undefined ? end : customRange.max; - function sign (x) { - return x > 0 ? 1 : x < 0 ? -1 : 0; + if (this._start == this._end) { + this._start -= 0.75; + this._end += 1; } - var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); - var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); - var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); + if (this.autoScale == true) { + this.setMinimumStep(minimumStep, containerHeight); + } - // each of the three signs must be either equal to each other or zero - return (as == 0 || bs == 0 || as == bs) && - (bs == 0 || cs == 0 || bs == cs) && - (as == 0 || cs == 0 || as == cs); + this.setFirst(customRange); }; /** - * Find a data point close to given screen position (x, y) - * @param {Number} x - * @param {Number} y - * @return {Object | null} The closest data point or null if not close to any data point - * @private + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds */ - Graph3d.prototype._dataPointFromXY = function (x, y) { - var i, - distMax = 100, // px - dataPoint = null, - closestDataPoint = null, - closestDist = null, - center = new Point2d(x, y); + DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { + // round to floor + var size = this._end - this._start; + var safeSize = size * 1.2; + var minimumStepValue = minimumStep * (safeSize / containerHeight); + var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); - if (this.style === Graph3d.STYLE.BAR || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - // the data points are ordered from far away to closest - for (i = this.dataPoints.length - 1; i >= 0; i--) { - dataPoint = this.dataPoints[i]; - var surfaces = dataPoint.surfaces; - if (surfaces) { - for (var s = surfaces.length - 1; s >= 0; s--) { - // split each surface in two triangles, and see if the center point is inside one of these - var surface = surfaces[s]; - var corners = surface.corners; - var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; - var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; - if (this._insideTriangle(center, triangle1) || - this._insideTriangle(center, triangle2)) { - // return immediately at the first hit - return dataPoint; - } - } - } - } + var minorStepIdx = -1; + var magnitudefactor = Math.pow(10,orderOfMagnitude); + + var start = 0; + if (orderOfMagnitude < 0) { + start = orderOfMagnitude; } - else { - // find the closest data point, using distance to the center of the point on 2d screen - for (i = 0; i < this.dataPoints.length; i++) { - dataPoint = this.dataPoints[i]; - var point = dataPoint.screen; - if (point) { - var distX = Math.abs(x - point.x); - var distY = Math.abs(y - point.y); - var dist = Math.sqrt(distX * distX + distY * distY); - if ((closestDist === null || dist < closestDist) && dist < distMax) { - closestDist = dist; - closestDataPoint = dataPoint; - } + var solutionFound = false; + for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { + magnitudefactor = Math.pow(10,i); + for (var j = 0; j < this.minorSteps.length; j++) { + var stepSize = magnitudefactor * this.minorSteps[j]; + if (stepSize >= minimumStepValue) { + solutionFound = true; + minorStepIdx = j; + break; } } + if (solutionFound == true) { + break; + } } + this.stepIndex = minorStepIdx; + this.scale = magnitudefactor; + this.step = magnitudefactor * this.minorSteps[minorStepIdx]; + }; - return closestDataPoint; - }; /** - * Display a tooltip for given data point - * @param {Object} dataPoint - * @private + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date */ - Graph3d.prototype._showTooltip = function (dataPoint) { - var content, line, dot; - - if (!this.tooltip) { - content = document.createElement('div'); - content.style.position = 'absolute'; - content.style.padding = '10px'; - content.style.border = '1px solid #4d4d4d'; - content.style.color = '#1a1a1a'; - content.style.background = 'rgba(255,255,255,0.7)'; - content.style.borderRadius = '2px'; - content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; + DataStep.prototype.setFirst = function(customRange) { + if (customRange === undefined) { + customRange = {}; + } - line = document.createElement('div'); - line.style.position = 'absolute'; - line.style.height = '40px'; - line.style.width = '0'; - line.style.borderLeft = '1px solid #4d4d4d'; + var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; + var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; - dot = document.createElement('div'); - dot.style.position = 'absolute'; - dot.style.height = '0'; - dot.style.width = '0'; - dot.style.border = '5px solid #4d4d4d'; - dot.style.borderRadius = '5px'; + this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; + this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; - this.tooltip = { - dataPoint: null, - dom: { - content: content, - line: line, - dot: dot - } - }; - } - else { - content = this.tooltip.dom.content; - line = this.tooltip.dom.line; - dot = this.tooltip.dom.dot; + // if we need to align the zero's we need to make sure that there is a zero to use. + if (this.alignZeros == true && (this.marginEnd - this.marginStart) % this.step != 0) { + this.marginEnd += this.marginEnd % this.step; } - this._hideTooltip(); + this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; + this.marginRange = this.marginEnd - this.marginStart; - this.tooltip.dataPoint = dataPoint; - if (typeof this.showTooltip === 'function') { - content.innerHTML = this.showTooltip(dataPoint.point); + + this.current = this.marginEnd; + }; + + DataStep.prototype.roundToMinor = function(value) { + var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); + if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { + return rounded + (this.scale * this.minorSteps[this.stepIndex]); } else { - content.innerHTML = '' + - '' + - '' + - '' + - '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; + return rounded; } + } - content.style.left = '0'; - content.style.top = '0'; - this.frame.appendChild(content); - this.frame.appendChild(line); - this.frame.appendChild(dot); - // calculate sizes - var contentWidth = content.offsetWidth; - var contentHeight = content.offsetHeight; - var lineHeight = line.offsetHeight; - var dotWidth = dot.offsetWidth; - var dotHeight = dot.offsetHeight; + /** + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date + */ + DataStep.prototype.hasNext = function () { + return (this.current >= this.marginStart); + }; - var left = dataPoint.screen.x - contentWidth / 2; - left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); + /** + * Do the next step + */ + DataStep.prototype.next = function() { + var prev = this.current; + this.current -= this.step; - line.style.left = dataPoint.screen.x + 'px'; - line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; - content.style.left = left + 'px'; - content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; - dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; - dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; + // safety mechanism: if current time is still unchanged, move to the end + if (this.current == prev) { + this.current = this._end; + } }; /** - * Hide the tooltip when displayed - * @private + * Do the next step */ - Graph3d.prototype._hideTooltip = function () { - if (this.tooltip) { - this.tooltip.dataPoint = null; + DataStep.prototype.previous = function() { + this.current += this.step; + this.marginEnd += this.step; + this.marginRange = this.marginEnd - this.marginStart; + }; - for (var prop in this.tooltip.dom) { - if (this.tooltip.dom.hasOwnProperty(prop)) { - var elem = this.tooltip.dom[prop]; - if (elem && elem.parentNode) { - elem.parentNode.removeChild(elem); + + + /** + * Get the current datetime + * @return {String} current The current date + */ + DataStep.prototype.getCurrent = function(decimals) { + var toPrecision = '' + Number(this.current).toPrecision(5); + // If decimals is specified, then limit or extend the string as required + if(decimals !== undefined && !isNaN(Number(decimals))) { + // If string includes exponent, then we need to add it to the end + var exp = ""; + var index = toPrecision.indexOf("e"); + if(index != -1) { + // Get the exponent + exp = toPrecision.slice(index); + // Remove the exponent in case we need to zero-extend + toPrecision = toPrecision.slice(0, index); + } + index = Math.max(toPrecision.indexOf(","), toPrecision.indexOf(".")); + if(index === -1) { + // No decimal found - if we want decimals, then we need to add it + if(decimals !== 0) { + toPrecision += '.'; + } + // Calculate how long the string should be + index = toPrecision.length + decimals; + } + else if(decimals !== 0) { + // Calculate how long the string should be - accounting for the decimal place + index += decimals + 1; + } + if(index > toPrecision.length) { + // We need to add zeros! + for(var cnt = index - toPrecision.length; cnt > 0; cnt--) { + toPrecision += '0'; + } + } + else { + // we need to remove characters + toPrecision = toPrecision.slice(0, index); + } + // Add the exponent if there is one + toPrecision += exp; + } + else { + if (toPrecision.indexOf(",") != -1 || toPrecision.indexOf(".") != -1) { + // If no decimal is specified, and there are decimal places, remove trailing zeros + for (var i = toPrecision.length - 1; i > 0; i--) { + if (toPrecision[i] == "0") { + toPrecision = toPrecision.slice(0, i); + } + else if (toPrecision[i] == "." || toPrecision[i] == ",") { + toPrecision = toPrecision.slice(0, i); + break; + } + else { + break; } } } } + + return toPrecision; }; - /**--------------------------------------------------------------------------**/ /** - * Get the horizontal mouse position from a mouse event - * @param {Event} event - * @return {Number} mouse x + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - getMouseX = function(event) { - if ('clientX' in event) return event.clientX; - return event.targetTouches[0] && event.targetTouches[0].clientX || 0; + DataStep.prototype.snap = function(date) { + }; /** - * Get the vertical mouse position from a mouse event - * @param {Event} event - * @return {Number} mouse y + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. */ - getMouseY = function(event) { - if ('clientY' in event) return event.clientY; - return event.targetTouches[0] && event.targetTouches[0].clientY || 0; + DataStep.prototype.isMajor = function() { + return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); }; - module.exports = Graph3d; + module.exports = DataStep; /***/ }, -/* 11 */ +/* 17 */ /***/ function(module, exports, __webpack_require__) { - + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(47); + var moment = __webpack_require__(44); + var Component = __webpack_require__(20); + var DateUtil = __webpack_require__(15); + /** - * Expose `Emitter`. + * @constructor Range + * A Range controls a numeric range with a start and end value. + * The Range adjusts the range based on mouse events or programmatic changes, + * and triggers events when the range is changing or has been changed. + * @param {{dom: Object, domProps: Object, emitter: Emitter}} body + * @param {Object} [options] See description at Range.setOptions */ + function Range(body, options) { + var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); + this.start = now.clone().add(-3, 'days').valueOf(); // Number + this.end = now.clone().add(4, 'days').valueOf(); // Number - module.exports = Emitter; + this.body = body; + this.deltaDifference = 0; + this.scaleOffset = 0; + this.startToFront = false; + this.endToFront = true; + + // default options + this.defaultOptions = { + start: null, + end: null, + direction: 'horizontal', // 'horizontal' or 'vertical' + moveable: true, + zoomable: true, + min: null, + max: null, + zoomMin: 10, // milliseconds + zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds + }; + this.options = util.extend({}, this.defaultOptions); + + this.props = { + touch: {} + }; + this.animateTimer = null; + + // drag listeners for dragging + this.body.emitter.on('dragstart', this._onDragStart.bind(this)); + this.body.emitter.on('drag', this._onDrag.bind(this)); + this.body.emitter.on('dragend', this._onDragEnd.bind(this)); + + // ignore dragging when holding + this.body.emitter.on('hold', this._onHold.bind(this)); + + // mouse wheel for zooming + this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); + this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + + // pinch to zoom + this.body.emitter.on('touch', this._onTouch.bind(this)); + this.body.emitter.on('pinch', this._onPinch.bind(this)); + + this.setOptions(options); + } + + Range.prototype = new Component(); /** - * Initialize a new `Emitter`. - * - * @api public + * Set options for the range controller + * @param {Object} options Available options: + * {Number | Date | String} start Start date for the range + * {Number | Date | String} end End date for the range + * {Number} min Minimum value for start + * {Number} max Maximum value for end + * {Number} zoomMin Set a minimum value for + * (end - start). + * {Number} zoomMax Set a maximum value for + * (end - start). + * {Boolean} moveable Enable moving of the range + * by dragging. True by default + * {Boolean} zoomable Enable zooming of the range + * by pinching/scrolling. True by default */ + Range.prototype.setOptions = function (options) { + if (options) { + // copy the options that we know + var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'activate', 'hiddenDates']; + util.selectiveExtend(fields, this.options, options); - function Emitter(obj) { - if (obj) return mixin(obj); + if ('start' in options || 'end' in options) { + // apply a new range. both start and end are optional + this.setRange(options.start, options.end); + } + } }; /** - * Mixin the emitter properties. + * Test whether direction has a valid value + * @param {String} direction 'horizontal' or 'vertical' + */ + function validateDirection (direction) { + if (direction != 'horizontal' && direction != 'vertical') { + throw new TypeError('Unknown direction "' + direction + '". ' + + 'Choose "horizontal" or "vertical".'); + } + } + + /** + * Set a new start and end range + * @param {Date | Number | String} [start] + * @param {Date | Number | String} [end] + * @param {boolean | number} [animate=false] If true, the range is animated + * smoothly to the new window. + * If animate is a number, the + * number is taken as duration + * Default duration is 500 ms. * - * @param {Object} obj - * @return {Object} - * @api private */ + Range.prototype.setRange = function(start, end, animate) { + var _start = start != undefined ? util.convert(start, 'Date').valueOf() : null; + var _end = end != undefined ? util.convert(end, 'Date').valueOf() : null; + this._cancelAnimation(); + + if (animate) { + var me = this; + var initStart = this.start; + var initEnd = this.end; + var duration = typeof animate === 'number' ? animate : 500; + var initTime = new Date().valueOf(); + var anyChanged = false; + + function next() { + if (!me.props.touch.dragging) { + var now = new Date().valueOf(); + var time = now - initTime; + var done = time > duration; + var s = (done || _start === null) ? _start : util.easeInOutQuad(time, initStart, _start, duration); + var e = (done || _end === null) ? _end : util.easeInOutQuad(time, initEnd, _end, duration); - function mixin(obj) { - for (var key in Emitter.prototype) { - obj[key] = Emitter.prototype[key]; - } - return obj; - } + changed = me._applyRange(s, e); + DateUtil.updateHiddenDates(me.body, me.options.hiddenDates); + anyChanged = anyChanged || changed; + if (changed) { + me.body.emitter.emit('rangechange', {start: new Date(me.start), end: new Date(me.end)}); + } - /** - * Listen on the given `event` with `fn`. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ + if (done) { + if (anyChanged) { + me.body.emitter.emit('rangechanged', {start: new Date(me.start), end: new Date(me.end)}); + } + } + else { + // animate with as high as possible frame rate, leave 20 ms in between + // each to prevent the browser from blocking + me.animateTimer = setTimeout(next, 20); + } + } + } - Emitter.prototype.on = - Emitter.prototype.addEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - (this._callbacks[event] = this._callbacks[event] || []) - .push(fn); - return this; + return next(); + } + else { + var changed = this._applyRange(_start, _end); + DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + if (changed) { + var params = {start: new Date(this.start), end: new Date(this.end)}; + this.body.emitter.emit('rangechange', params); + this.body.emitter.emit('rangechanged', params); + } + } }; /** - * Adds an `event` listener that will be invoked a single - * time then automatically removed. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * Stop an animation + * @private */ - - Emitter.prototype.once = function(event, fn){ - var self = this; - this._callbacks = this._callbacks || {}; - - function on() { - self.off(event, on); - fn.apply(this, arguments); + Range.prototype._cancelAnimation = function () { + if (this.animateTimer) { + clearTimeout(this.animateTimer); + this.animateTimer = null; } - - on.fn = fn; - this.on(event, on); - return this; }; /** - * Remove the given callback for `event` or all - * registered callbacks. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * Set a new start and end range. This method is the same as setRange, but + * does not trigger a range change and range changed event, and it returns + * true when the range is changed + * @param {Number} [start] + * @param {Number} [end] + * @return {Boolean} changed + * @private */ + Range.prototype._applyRange = function(start, end) { + var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, + newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, + max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, + min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, + diff; - Emitter.prototype.off = - Emitter.prototype.removeListener = - Emitter.prototype.removeAllListeners = - Emitter.prototype.removeEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - - // all - if (0 == arguments.length) { - this._callbacks = {}; - return this; + // check for valid number + if (isNaN(newStart) || newStart === null) { + throw new Error('Invalid start "' + start + '"'); + } + if (isNaN(newEnd) || newEnd === null) { + throw new Error('Invalid end "' + end + '"'); } - // specific event - var callbacks = this._callbacks[event]; - if (!callbacks) return this; - - // remove all handlers - if (1 == arguments.length) { - delete this._callbacks[event]; - return this; + // prevent start < end + if (newEnd < newStart) { + newEnd = newStart; } - // remove specific handler - var cb; - for (var i = 0; i < callbacks.length; i++) { - cb = callbacks[i]; - if (cb === fn || cb.fn === fn) { - callbacks.splice(i, 1); - break; + // prevent start < min + if (min !== null) { + if (newStart < min) { + diff = (min - newStart); + newStart += diff; + newEnd += diff; + + // prevent end > max + if (max != null) { + if (newEnd > max) { + newEnd = max; + } + } } } - return this; - }; - - /** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - * @return {Emitter} - */ - Emitter.prototype.emit = function(event){ - this._callbacks = this._callbacks || {}; - var args = [].slice.call(arguments, 1) - , callbacks = this._callbacks[event]; + // prevent end > max + if (max !== null) { + if (newEnd > max) { + diff = (newEnd - max); + newStart -= diff; + newEnd -= diff; - if (callbacks) { - callbacks = callbacks.slice(0); - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args); + // prevent start < min + if (min != null) { + if (newStart < min) { + newStart = min; + } + } } } - return this; - }; + // prevent (end-start) < zoomMin + if (this.options.zoomMin !== null) { + var zoomMin = parseFloat(this.options.zoomMin); + if (zoomMin < 0) { + zoomMin = 0; + } + if ((newEnd - newStart) < zoomMin) { + if ((this.end - this.start) === zoomMin) { + // ignore this action, we are already zoomed to the minimum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the minimum + diff = (zoomMin - (newEnd - newStart)); + newStart -= diff / 2; + newEnd += diff / 2; + } + } + } - /** - * Return array of callbacks for `event`. - * - * @param {String} event - * @return {Array} - * @api public - */ + // prevent (end-start) > zoomMax + if (this.options.zoomMax !== null) { + var zoomMax = parseFloat(this.options.zoomMax); + if (zoomMax < 0) { + zoomMax = 0; + } + if ((newEnd - newStart) > zoomMax) { + if ((this.end - this.start) === zoomMax) { + // ignore this action, we are already zoomed to the maximum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the maximum + diff = ((newEnd - newStart) - zoomMax); + newStart += diff / 2; + newEnd -= diff / 2; + } + } + } - Emitter.prototype.listeners = function(event){ - this._callbacks = this._callbacks || {}; - return this._callbacks[event] || []; - }; + var changed = (this.start != newStart || this.end != newEnd); - /** - * Check if this emitter has `event` handlers. - * - * @param {String} event - * @return {Boolean} - * @api public - */ + // if the new range does NOT overlap with the old range, emit checkRangedItems to avoid not showing ranged items (ranged meaning has end time, not neccesarily of type Range) + if (!((newStart >= this.start && newStart <= this.end) || (newEnd >= this.start && newEnd <= this.end)) && + !((this.start >= newStart && this.start <= newEnd) || (this.end >= newStart && this.end <= newEnd) )) { + this.body.emitter.emit('checkRangedItems'); + } - Emitter.prototype.hasListeners = function(event){ - return !! this.listeners(event).length; + this.start = newStart; + this.end = newEnd; + return changed; }; - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - /** - * @prototype Point3d - * @param {Number} [x] - * @param {Number} [y] - * @param {Number} [z] + * Retrieve the current range. + * @return {Object} An object with start and end properties */ - function Point3d(x, y, z) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - this.z = z !== undefined ? z : 0; + Range.prototype.getRange = function() { + return { + start: this.start, + end: this.end + }; }; /** - * Subtract the two provided points, returns a-b - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} a-b + * Calculate the conversion offset and scale for current range, based on + * the provided width + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion */ - Point3d.subtract = function(a, b) { - var sub = new Point3d(); - sub.x = a.x - b.x; - sub.y = a.y - b.y; - sub.z = a.z - b.z; - return sub; + Range.prototype.conversion = function (width, totalHidden) { + return Range.conversion(this.start, this.end, width, totalHidden); }; /** - * Add the two provided points, returns a+b - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} a+b + * Static method to calculate the conversion offset and scale for a range, + * based on the provided start, end, and width + * @param {Number} start + * @param {Number} end + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion */ - Point3d.add = function(a, b) { - var sum = new Point3d(); - sum.x = a.x + b.x; - sum.y = a.y + b.y; - sum.z = a.z + b.z; - return sum; + Range.conversion = function (start, end, width, totalHidden) { + if (totalHidden === undefined) { + totalHidden = 0; + } + if (width != 0 && (end - start != 0)) { + return { + offset: start, + scale: width / (end - start - totalHidden) + } + } + else { + return { + offset: 0, + scale: 1 + }; + } }; /** - * Calculate the average of two 3d points - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} The average, (a+b)/2 + * Start dragging horizontally or vertically + * @param {Event} event + * @private */ - Point3d.avg = function(a, b) { - return new Point3d( - (a.x + b.x) / 2, - (a.y + b.y) / 2, - (a.z + b.z) / 2 - ); - }; + Range.prototype._onDragStart = function(event) { + this.deltaDifference = 0; + this.previousDelta = 0; + // only allow dragging when configured as movable + if (!this.options.moveable) return; - /** - * Calculate the cross product of the two provided points, returns axb - * Documentation: http://en.wikipedia.org/wiki/Cross_product - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} cross product axb - */ - Point3d.crossProduct = function(a, b) { - var crossproduct = new Point3d(); + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; - crossproduct.x = a.y * b.z - a.z * b.y; - crossproduct.y = a.z * b.x - a.x * b.z; - crossproduct.z = a.x * b.y - a.y * b.x; + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.dragging = true; - return crossproduct; + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'move'; + } }; - /** - * Rtrieve the length of the vector (or the distance from this point to the origin - * @return {Number} length + * Perform dragging operation + * @param {Event} event + * @private */ - Point3d.prototype.length = function() { - return Math.sqrt( - this.x * this.x + - this.y * this.y + - this.z * this.z - ); - }; - - module.exports = Point3d; - - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { + Range.prototype._onDrag = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; - /** - * @prototype Point2d - * @param {Number} [x] - * @param {Number} [y] - */ - Point2d = function (x, y) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - }; + var direction = this.options.direction; + validateDirection(direction); - module.exports = Point2d; + var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY; + delta -= this.deltaDifference; + var interval = (this.props.touch.end - this.props.touch.start); + // normalize dragging speed if cutout is in between. + var duration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); + interval -= duration; -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { + var width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height; + var diffRange = -delta / width * interval; + var newStart = this.props.touch.start + diffRange; + var newEnd = this.props.touch.end + diffRange; - var Point3d = __webpack_require__(12); - /** - * @class Camera - * The camera is mounted on a (virtual) camera arm. The camera arm can rotate - * The camera is always looking in the direction of the origin of the arm. - * This way, the camera always rotates around one fixed point, the location - * of the camera arm. - * - * Documentation: - * http://en.wikipedia.org/wiki/3D_projection - */ - Camera = function () { - this.armLocation = new Point3d(); - this.armRotation = {}; - this.armRotation.horizontal = 0; - this.armRotation.vertical = 0; - this.armLength = 1.7; + // snapping times away from hidden zones + var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, this.previousDelta-delta, true); + var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, this.previousDelta-delta, true); + if (safeStart != newStart || safeEnd != newEnd) { + this.deltaDifference += delta; + this.props.touch.start = safeStart; + this.props.touch.end = safeEnd; + this._onDrag(event); + return; + } - this.cameraLocation = new Point3d(); - this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); + this.previousDelta = delta; + this._applyRange(newStart, newEnd); - this.calculateCameraOrientation(); + // fire a rangechange event + this.body.emitter.emit('rangechange', { + start: new Date(this.start), + end: new Date(this.end) + }); }; /** - * Set the location (origin) of the arm - * @param {Number} x Normalized value of x - * @param {Number} y Normalized value of y - * @param {Number} z Normalized value of z + * Stop dragging operation + * @param {event} event + * @private */ - Camera.prototype.setArmLocation = function(x, y, z) { - this.armLocation.x = x; - this.armLocation.y = y; - this.armLocation.z = z; - - this.calculateCameraOrientation(); - }; + Range.prototype._onDragEnd = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; - /** - * Set the rotation of the camera arm - * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. - * Optional, can be left undefined. - * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI - * if vertical=0.5*PI, the graph is shown from the - * top. Optional, can be left undefined. - */ - Camera.prototype.setArmRotation = function(horizontal, vertical) { - if (horizontal !== undefined) { - this.armRotation.horizontal = horizontal; - } + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; - if (vertical !== undefined) { - this.armRotation.vertical = vertical; - if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; - if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; + this.props.touch.dragging = false; + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'auto'; } - if (horizontal !== undefined || vertical !== undefined) { - this.calculateCameraOrientation(); - } + // fire a rangechanged event + this.body.emitter.emit('rangechanged', { + start: new Date(this.start), + end: new Date(this.end) + }); }; /** - * Retrieve the current arm rotation - * @return {object} An object with parameters horizontal and vertical + * Event handler for mouse wheel event, used to zoom + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {Event} event + * @private */ - Camera.prototype.getArmRotation = function() { - var rot = {}; - rot.horizontal = this.armRotation.horizontal; - rot.vertical = this.armRotation.vertical; + Range.prototype._onMouseWheel = function(event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - return rot; - }; + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta / 120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail / 3; + } - /** - * Set the (normalized) length of the camera arm. - * @param {Number} length A length between 0.71 and 5.0 - */ - Camera.prototype.setArmLength = function(length) { - if (length === undefined) - return; + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + // perform the zoom action. Delta is normally 1 or -1 - this.armLength = length; + // adjust a negative delta such that zooming in with delta 0.1 + // equals zooming out with a delta -0.1 + var scale; + if (delta < 0) { + scale = 1 - (delta / 5); + } + else { + scale = 1 / (1 + (delta / 5)) ; + } - // Radius must be larger than the corner of the graph, - // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the - // graph - if (this.armLength < 0.71) this.armLength = 0.71; - if (this.armLength > 5.0) this.armLength = 5.0; + // calculate center, the date to zoom around + var gesture = hammerUtil.fakeGesture(this, event), + pointer = getPointer(gesture.center, this.body.dom.center), + pointerDate = this._pointerToDate(pointer); - this.calculateCameraOrientation(); - }; + this.zoom(scale, pointerDate, delta); + } - /** - * Retrieve the arm length - * @return {Number} length - */ - Camera.prototype.getArmLength = function() { - return this.armLength; + // Prevent default actions caused by mouse wheel + // (else the page and timeline both zoom and scroll) + event.preventDefault(); }; /** - * Retrieve the camera location - * @return {Point3d} cameraLocation + * Start of a touch gesture + * @private */ - Camera.prototype.getCameraLocation = function() { - return this.cameraLocation; + Range.prototype._onTouch = function (event) { + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.allowDragging = true; + this.props.touch.center = null; + this.scaleOffset = 0; + this.deltaDifference = 0; }; /** - * Retrieve the camera rotation - * @return {Point3d} cameraRotation + * On start of a hold gesture + * @private */ - Camera.prototype.getCameraRotation = function() { - return this.cameraRotation; + Range.prototype._onHold = function () { + this.props.touch.allowDragging = false; }; /** - * Calculate the location and rotation of the camera based on the - * position and orientation of the camera arm + * Handle pinch event + * @param {Event} event + * @private */ - Camera.prototype.calculateCameraOrientation = function() { - // calculate location of the camera - this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); - this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); - this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); + Range.prototype._onPinch = function (event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - // calculate rotation of the camera - this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; - this.cameraRotation.y = 0; - this.cameraRotation.z = -this.armRotation.horizontal; - }; + this.props.touch.allowDragging = false; - module.exports = Camera; + if (event.gesture.touches.length > 1) { + if (!this.props.touch.center) { + this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); + } -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { + var scale = 1 / (event.gesture.scale + this.scaleOffset); + var center = this._pointerToDate(this.props.touch.center); - var DataView = __webpack_require__(9); + var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); + var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; - /** - * @class Filter - * - * @param {DataSet} data The google data table - * @param {Number} column The index of the column to be filtered - * @param {Graph} graph The graph - */ - function Filter (data, column, graph) { - this.data = data; - this.column = column; - this.graph = graph; // the parent graph + // calculate new start and end + var newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale; + var newEnd = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale; - this.index = undefined; - this.value = undefined; + // snapping times away from hidden zones + this.startToFront = 1 - scale > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + this.endToFront = scale - 1 > 0 ? false : true; // used to do the right autocorrection with periodic hidden times - // read all distinct values and select the first one - this.values = graph.getDistinctValues(data.get(), this.column); + var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, 1 - scale, true); + var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, scale - 1, true); + if (safeStart != newStart || safeEnd != newEnd) { + this.props.touch.start = safeStart; + this.props.touch.end = safeEnd; + this.scaleOffset = 1 - event.gesture.scale; + newStart = safeStart; + newEnd = safeEnd; + } - // sort both numeric and string values correctly - this.values.sort(function (a, b) { - return a > b ? 1 : a < b ? -1 : 0; - }); + this.setRange(newStart, newEnd); - if (this.values.length > 0) { - this.selectValue(0); + this.startToFront = false; // revert to default + this.endToFront = true; // revert to default } + }; - // create an array with the filtered datapoints. this will be loaded afterwards - this.dataPoints = []; + /** + * Helper function to calculate the center date for zooming + * @param {{x: Number, y: Number}} pointer + * @return {number} date + * @private + */ + Range.prototype._pointerToDate = function (pointer) { + var conversion; + var direction = this.options.direction; - this.loaded = false; - this.onLoadCallback = undefined; + validateDirection(direction); - if (graph.animationPreload) { - this.loaded = false; - this.loadInBackground(); + if (direction == 'horizontal') { + return this.body.util.toTime(pointer.x).valueOf(); } else { - this.loaded = true; + var height = this.body.domProps.center.height; + conversion = this.conversion(height); + return pointer.y / conversion.scale + conversion.offset; } }; - /** - * Return the label - * @return {string} label + * Get the pointer location relative to the location of the dom element + * @param {{pageX: Number, pageY: Number}} touch + * @param {Element} element HTML DOM element + * @return {{x: Number, y: Number}} pointer + * @private */ - Filter.prototype.isLoaded = function() { - return this.loaded; - }; - + function getPointer (touch, element) { + return { + x: touch.pageX - util.getAbsoluteLeft(element), + y: touch.pageY - util.getAbsoluteTop(element) + }; + } /** - * Return the loaded progress - * @return {Number} percentage between 0 and 100 + * Zoom the range the given scale in or out. Start and end date will + * be adjusted, and the timeline will be redrawn. You can optionally give a + * date around which to zoom. + * For example, try scale = 0.9 or 1.1 + * @param {Number} scale Scaling factor. Values above 1 will zoom out, + * values below 1 will zoom in. + * @param {Number} [center] Value representing a date around which will + * be zoomed. */ - Filter.prototype.getLoadedProgress = function() { - var len = this.values.length; - - var i = 0; - while (this.dataPoints[i]) { - i++; + Range.prototype.zoom = function(scale, center, delta) { + // if centerDate is not provided, take it half between start Date and end Date + if (center == null) { + center = (this.start + this.end) / 2; } - return Math.round(i / len * 100); - }; + var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); + var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; + // calculate new start and end + var newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale; + var newEnd = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale; - /** - * Return the label - * @return {string} label - */ - Filter.prototype.getLabel = function() { - return this.graph.filterLabel; - }; + // snapping times away from hidden zones + this.startToFront = delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + this.endToFront = -delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, delta, true); + var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, -delta, true); + if (safeStart != newStart || safeEnd != newEnd) { + newStart = safeStart; + newEnd = safeEnd; + } + this.setRange(newStart, newEnd); - /** - * Return the columnIndex of the filter - * @return {Number} columnIndex - */ - Filter.prototype.getColumn = function() { - return this.column; + this.startToFront = false; // revert to default + this.endToFront = true; // revert to default }; - /** - * Return the currently selected value. Returns undefined if there is no selection - * @return {*} value - */ - Filter.prototype.getSelectedValue = function() { - if (this.index === undefined) - return undefined; - return this.values[this.index]; - }; /** - * Retrieve all values of the filter - * @return {Array} values + * Move the range with a given delta to the left or right. Start and end + * value will be adjusted. For example, try delta = 0.1 or -0.1 + * @param {Number} delta Moving amount. Positive value will move right, + * negative value will move left */ - Filter.prototype.getValues = function() { - return this.values; - }; + Range.prototype.move = function(delta) { + // zoom start Date and end Date relative to the centerDate + var diff = (this.end - this.start); - /** - * Retrieve one value of the filter - * @param {Number} index - * @return {*} value - */ - Filter.prototype.getValue = function(index) { - if (index >= this.values.length) - throw 'Error: index out of range'; + // apply new values + var newStart = this.start + diff * delta; + var newEnd = this.end + diff * delta; - return this.values[index]; - }; + // TODO: reckon with min and max range + this.start = newStart; + this.end = newEnd; + }; /** - * Retrieve the (filtered) dataPoints for the currently selected filter index - * @param {Number} [index] (optional) - * @return {Array} dataPoints + * Move the range to a new center point + * @param {Number} moveTo New center point of the range */ - Filter.prototype._getDataPoints = function(index) { - if (index === undefined) - index = this.index; + Range.prototype.moveTo = function(moveTo) { + var center = (this.start + this.end) / 2; - if (index === undefined) - return []; + var diff = center - moveTo; - var dataPoints; - if (this.dataPoints[index]) { - dataPoints = this.dataPoints[index]; - } - else { - var f = {}; - f.column = this.column; - f.value = this.values[index]; + // calculate new start and end + var newStart = this.start - diff; + var newEnd = this.end - diff; - var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); - dataPoints = this.graph._getDataPoints(dataView); + this.setRange(newStart, newEnd); + }; - this.dataPoints[index] = dataPoints; - } + module.exports = Range; - return dataPoints; - }; +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + // Utility functions for ordering and stacking of items + var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors /** - * Set a callback function when the filter is fully loaded. + * Order items by their start data + * @param {Item[]} items */ - Filter.prototype.setOnLoadCallback = function(callback) { - this.onLoadCallback = callback; + exports.orderByStart = function(items) { + items.sort(function (a, b) { + return a.data.start - b.data.start; + }); }; - /** - * Add a value to the list with available values for this filter - * No double entries will be created. - * @param {Number} index + * Order items by their end date. If they have no end date, their start date + * is used. + * @param {Item[]} items */ - Filter.prototype.selectValue = function(index) { - if (index >= this.values.length) - throw 'Error: index out of range'; + exports.orderByEnd = function(items) { + items.sort(function (a, b) { + var aTime = ('end' in a.data) ? a.data.end : a.data.start, + bTime = ('end' in b.data) ? b.data.end : b.data.start; - this.index = index; - this.value = this.values[index]; + return aTime - bTime; + }); }; /** - * Load all filtered rows in the background one by one - * Start this method without providing an index! + * Adjust vertical positions of the items such that they don't overlap each + * other. + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. + * @param {boolean} [force=false] + * If true, all items will be repositioned. If false (default), only + * items having a top===null will be re-stacked */ - Filter.prototype.loadInBackground = function(index) { - if (index === undefined) - index = 0; + exports.stack = function(items, margin, force) { + var i, iMax; - var frame = this.graph.frame; + if (force) { + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + items[i].top = null; + } + } - if (index < this.values.length) { - var dataPointsTemp = this._getDataPoints(index); - //this.graph.redrawInfo(); // TODO: not neat + // calculate new, non-overlapping positions + for (i = 0, iMax = items.length; i < iMax; i++) { + var item = items[i]; + if (item.stack && item.top === null) { + // initialize top position + item.top = margin.axis; - // create a progress box - if (frame.progress === undefined) { - frame.progress = document.createElement('DIV'); - frame.progress.style.position = 'absolute'; - frame.progress.style.color = 'gray'; - frame.appendChild(frame.progress); - } - var progress = this.getLoadedProgress(); - frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; - // TODO: this is no nice solution... - frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider - frame.progress.style.left = 10 + 'px'; + do { + // TODO: optimize checking for overlap. when there is a gap without items, + // you only need to check for items from the next item on, not from zero + var collidingItem = null; + for (var j = 0, jj = items.length; j < jj; j++) { + var other = items[j]; + if (other.top !== null && other !== item && other.stack && exports.collision(item, other, margin.item)) { + collidingItem = other; + break; + } + } - var me = this; - setTimeout(function() {me.loadInBackground(index+1);}, 10); - this.loaded = false; + if (collidingItem != null) { + // There is a collision. Reposition the items above the colliding element + item.top = collidingItem.top + collidingItem.height + margin.item.vertical; + } + } while (collidingItem); + } } - else { - this.loaded = true; + }; - // remove the progress box - if (frame.progress !== undefined) { - frame.removeChild(frame.progress); - frame.progress = undefined; - } - if (this.onLoadCallback) - this.onLoadCallback(); + /** + * Adjust vertical positions of the items without stacking them + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. + */ + exports.nostack = function(items, margin, subgroups) { + var i, iMax, newTop; + + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + if (items[i].data.subgroup !== undefined) { + newTop = margin.axis; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroups[items[i].data.subgroup].index) { + newTop += subgroups[subgroup].height + margin.item.vertical; + } + } + } + items[i].top = newTop; + } + else { + items[i].top = margin.axis; + } } }; - module.exports = Filter; + /** + * Test if the two provided items collide + * The items must have parameters left, width, top, and height. + * @param {Item} a The first item + * @param {Item} b The second item + * @param {{horizontal: number, vertical: number}} margin + * An object containing a horizontal and vertical + * minimum required margin. + * @return {boolean} true if a and b collide, else false + */ + exports.collision = function(a, b, margin) { + return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && + (a.left + a.width + margin.horizontal - EPSILON) > b.left && + (a.top - margin.vertical + EPSILON) < (b.top + b.height) && + (a.top + a.height + margin.vertical - EPSILON) > b.top); + }; /***/ }, -/* 16 */ +/* 19 */ /***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); + var moment = __webpack_require__(44); + var DateUtil = __webpack_require__(15); /** - * @constructor Slider + * @constructor TimeStep + * The class TimeStep is an iterator for dates. You provide a start date and an + * end date. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. * - * An html slider control with start/stop/prev/next buttons - * @param {Element} container The element where the slider will be created - * @param {Object} options Available options: - * {boolean} visible If true (default) the - * slider is visible. + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - function Slider(container, options) { - if (container === undefined) { - throw 'Error: No container element defined'; - } - this.container = container; - this.visible = (options && options.visible != undefined) ? options.visible : true; - - if (this.visible) { - this.frame = document.createElement('DIV'); - //this.frame.style.backgroundColor = '#E5E5E5'; - this.frame.style.width = '100%'; - this.frame.style.position = 'relative'; - this.container.appendChild(this.frame); - - this.frame.prev = document.createElement('INPUT'); - this.frame.prev.type = 'BUTTON'; - this.frame.prev.value = 'Prev'; - this.frame.appendChild(this.frame.prev); - - this.frame.play = document.createElement('INPUT'); - this.frame.play.type = 'BUTTON'; - this.frame.play.value = 'Play'; - this.frame.appendChild(this.frame.play); - - this.frame.next = document.createElement('INPUT'); - this.frame.next.type = 'BUTTON'; - this.frame.next.value = 'Next'; - this.frame.appendChild(this.frame.next); + function TimeStep(start, end, minimumStep, hiddenDates) { + // variables + this.current = new Date(); + this._start = new Date(); + this._end = new Date(); - this.frame.bar = document.createElement('INPUT'); - this.frame.bar.type = 'BUTTON'; - this.frame.bar.style.position = 'absolute'; - this.frame.bar.style.border = '1px solid red'; - this.frame.bar.style.width = '100px'; - this.frame.bar.style.height = '6px'; - this.frame.bar.style.borderRadius = '2px'; - this.frame.bar.style.MozBorderRadius = '2px'; - this.frame.bar.style.border = '1px solid #7F7F7F'; - this.frame.bar.style.backgroundColor = '#E5E5E5'; - this.frame.appendChild(this.frame.bar); + this.autoScale = true; + this.scale = TimeStep.SCALE.DAY; + this.step = 1; - this.frame.slide = document.createElement('INPUT'); - this.frame.slide.type = 'BUTTON'; - this.frame.slide.style.margin = '0px'; - this.frame.slide.value = ' '; - this.frame.slide.style.position = 'relative'; - this.frame.slide.style.left = '-100px'; - this.frame.appendChild(this.frame.slide); + // initialize the range + this.setRange(start, end, minimumStep); - // create events - var me = this; - this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; - this.frame.prev.onclick = function (event) {me.prev(event);}; - this.frame.play.onclick = function (event) {me.togglePlay(event);}; - this.frame.next.onclick = function (event) {me.next(event);}; + // hidden Dates options + this.switchedDay = false; + this.switchedMonth = false; + this.switchedYear = false; + this.hiddenDates = hiddenDates; + if (hiddenDates === undefined) { + this.hiddenDates = []; } + } - this.onChangeCallback = undefined; - - this.values = []; - this.index = undefined; + /// enum scale + TimeStep.SCALE = { + MILLISECOND: 1, + SECOND: 2, + MINUTE: 3, + HOUR: 4, + DAY: 5, + WEEKDAY: 6, + MONTH: 7, + YEAR: 8 + }; - this.playTimeout = undefined; - this.playInterval = 1000; // milliseconds - this.playLoop = true; - } /** - * Select the previous index + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Date} [start] The start date and time. + * @param {Date} [end] The end date and time. + * @param {int} [minimumStep] Optional. Minimum step size in milliseconds */ - Slider.prototype.prev = function() { - var index = this.getIndex(); - if (index > 0) { - index--; - this.setIndex(index); + TimeStep.prototype.setRange = function(start, end, minimumStep) { + if (!(start instanceof Date) || !(end instanceof Date)) { + throw "No legal start or end date in method setRange"; + } + + this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); + this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); + + if (this.autoScale) { + this.setMinimumStep(minimumStep); } }; /** - * Select the next index + * Set the range iterator to the start date. */ - Slider.prototype.next = function() { - var index = this.getIndex(); - if (index < this.values.length - 1) { - index++; - this.setIndex(index); - } + TimeStep.prototype.first = function() { + this.current = new Date(this._start.valueOf()); + this.roundToMinor(); }; /** - * Select the next index + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date */ - Slider.prototype.playNext = function() { - var start = new Date(); - - var index = this.getIndex(); - if (index < this.values.length - 1) { - index++; - this.setIndex(index); - } - else if (this.playLoop) { - // jump to the start - index = 0; - this.setIndex(index); + TimeStep.prototype.roundToMinor = function() { + // round to floor + // IMPORTANT: we have no breaks in this switch! (this is no bug) + //noinspection FallthroughInSwitchStatementJS + switch (this.scale) { + case TimeStep.SCALE.YEAR: + this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); + this.current.setMonth(0); + case TimeStep.SCALE.MONTH: this.current.setDate(1); + case TimeStep.SCALE.DAY: // intentional fall through + case TimeStep.SCALE.WEEKDAY: this.current.setHours(0); + case TimeStep.SCALE.HOUR: this.current.setMinutes(0); + case TimeStep.SCALE.MINUTE: this.current.setSeconds(0); + case TimeStep.SCALE.SECOND: this.current.setMilliseconds(0); + //case TimeStep.SCALE.MILLISECOND: // nothing to do for milliseconds } - var end = new Date(); - var diff = (end - start); - - // calculate how much time it to to set the index and to execute the callback - // function. - var interval = Math.max(this.playInterval - diff, 0); - // document.title = diff // TODO: cleanup - - var me = this; - this.playTimeout = setTimeout(function() {me.playNext();}, interval); + if (this.step != 1) { + // round down to the first minor value that is a multiple of the current step size + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; + case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; + case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; + case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; + default: break; + } + } }; /** - * Toggle start or stop playing + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date */ - Slider.prototype.togglePlay = function() { - if (this.playTimeout === undefined) { - this.play(); - } else { - this.stop(); - } + TimeStep.prototype.hasNext = function () { + return (this.current.valueOf() <= this._end.valueOf()); }; /** - * Start playing + * Do the next step */ - Slider.prototype.play = function() { - // Test whether already playing - if (this.playTimeout) return; + TimeStep.prototype.next = function() { + var prev = this.current.valueOf(); - this.playNext(); + // Two cases, needed to prevent issues with switching daylight savings + // (end of March and end of October) + if (this.current.getMonth() < 6) { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: - if (this.frame) { - this.frame.play.value = 'Stop'; + this.current = new Date(this.current.valueOf() + this.step); break; + case TimeStep.SCALE.SECOND: this.current = new Date(this.current.valueOf() + this.step * 1000); break; + case TimeStep.SCALE.MINUTE: this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; + case TimeStep.SCALE.HOUR: + this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); + // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) + var h = this.current.getHours(); + this.current.setHours(h - (h % this.step)); + break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; + } + } + else { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: this.current = new Date(this.current.valueOf() + this.step); break; + case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() + this.step); break; + case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() + this.step); break; + case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() + this.step); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; + } } - }; - /** - * Stop playing - */ - Slider.prototype.stop = function() { - clearInterval(this.playTimeout); - this.playTimeout = undefined; + if (this.step != 1) { + // round down to the correct major value + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; + case TimeStep.SCALE.SECOND: if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; + case TimeStep.SCALE.MINUTE: if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; + case TimeStep.SCALE.HOUR: if(this.current.getHours() < this.step) this.current.setHours(0); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: if(this.current.getDate() < this.step+1) this.current.setDate(1); break; + case TimeStep.SCALE.MONTH: if(this.current.getMonth() < this.step) this.current.setMonth(0); break; + case TimeStep.SCALE.YEAR: break; // nothing to do for year + default: break; + } + } - if (this.frame) { - this.frame.play.value = 'Play'; + // safety mechanism: if current time is still unchanged, move to the end + if (this.current.valueOf() == prev) { + this.current = new Date(this._end.valueOf()); } - }; - /** - * Set a callback function which will be triggered when the value of the - * slider bar has changed. - */ - Slider.prototype.setOnChangeCallback = function(callback) { - this.onChangeCallback = callback; + DateUtil.stepOverHiddenDates(this, prev); }; + /** - * Set the interval for playing the list - * @param {Number} interval The interval in milliseconds + * Get the current datetime + * @return {Date} current The current date */ - Slider.prototype.setPlayInterval = function(interval) { - this.playInterval = interval; + TimeStep.prototype.getCurrent = function() { + return this.current; }; /** - * Retrieve the current play interval - * @return {Number} interval The interval in milliseconds + * Set a custom scale. Autoscaling will be disabled. + * For example setScale(SCALE.MINUTES, 5) will result + * in minor steps of 5 minutes, and major steps of an hour. + * + * @param {TimeStep.SCALE} newScale + * A scale. Choose from SCALE.MILLISECOND, + * SCALE.SECOND, SCALE.MINUTE, SCALE.HOUR, + * SCALE.WEEKDAY, SCALE.DAY, SCALE.MONTH, + * SCALE.YEAR. + * @param {Number} newStep A step size, by default 1. Choose for + * example 1, 2, 5, or 10. */ - Slider.prototype.getPlayInterval = function(interval) { - return this.playInterval; + TimeStep.prototype.setScale = function(newScale, newStep) { + this.scale = newScale; + + if (newStep > 0) { + this.step = newStep; + } + + this.autoScale = false; }; /** - * Set looping on or off - * @pararm {boolean} doLoop If true, the slider will jump to the start when - * the end is passed, and will jump to the end - * when the start is passed. + * Enable or disable autoscaling + * @param {boolean} enable If true, autoascaling is set true */ - Slider.prototype.setPlayLoop = function(doLoop) { - this.playLoop = doLoop; + TimeStep.prototype.setAutoScale = function (enable) { + this.autoScale = enable; }; /** - * Execute the onchange callback function + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds */ - Slider.prototype.onChange = function() { - if (this.onChangeCallback !== undefined) { - this.onChangeCallback(); + TimeStep.prototype.setMinimumStep = function(minimumStep) { + if (minimumStep == undefined) { + return; } + + //var b = asc + ds; + + var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); + var stepMonth = (1000 * 60 * 60 * 24 * 30); + var stepDay = (1000 * 60 * 60 * 24); + var stepHour = (1000 * 60 * 60); + var stepMinute = (1000 * 60); + var stepSecond = (1000); + var stepMillisecond= (1); + + // find the smallest step that is larger than the provided minimumStep + if (stepYear*1000 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1000;} + if (stepYear*500 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 500;} + if (stepYear*100 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 100;} + if (stepYear*50 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 50;} + if (stepYear*10 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 10;} + if (stepYear*5 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 5;} + if (stepYear > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1;} + if (stepMonth*3 > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 3;} + if (stepMonth > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 1;} + if (stepDay*5 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 5;} + if (stepDay*2 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 2;} + if (stepDay > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 1;} + if (stepDay/2 > minimumStep) {this.scale = TimeStep.SCALE.WEEKDAY; this.step = 1;} + if (stepHour*4 > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 4;} + if (stepHour > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 1;} + if (stepMinute*15 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 15;} + if (stepMinute*10 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 10;} + if (stepMinute*5 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 5;} + if (stepMinute > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 1;} + if (stepSecond*15 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 15;} + if (stepSecond*10 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 10;} + if (stepSecond*5 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 5;} + if (stepSecond > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 1;} + if (stepMillisecond*200 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 200;} + if (stepMillisecond*100 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 100;} + if (stepMillisecond*50 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 50;} + if (stepMillisecond*10 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 10;} + if (stepMillisecond*5 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 5;} + if (stepMillisecond > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 1;} }; /** - * redraw the slider on the correct place + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - Slider.prototype.redraw = function() { - if (this.frame) { - // resize the bar - this.frame.bar.style.top = (this.frame.clientHeight/2 - - this.frame.bar.offsetHeight/2) + 'px'; - this.frame.bar.style.width = (this.frame.clientWidth - - this.frame.prev.clientWidth - - this.frame.play.clientWidth - - this.frame.next.clientWidth - 30) + 'px'; + TimeStep.prototype.snap = function(date) { + var clone = new Date(date.valueOf()); - // position the slider button - var left = this.indexToLeft(this.index); - this.frame.slide.style.left = (left) + 'px'; + if (this.scale == TimeStep.SCALE.YEAR) { + var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); + clone.setFullYear(Math.round(year / this.step) * this.step); + clone.setMonth(0); + clone.setDate(0); + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); } - }; + else if (this.scale == TimeStep.SCALE.MONTH) { + if (clone.getDate() > 15) { + clone.setDate(1); + clone.setMonth(clone.getMonth() + 1); + // important: first set Date to 1, after that change the month. + } + else { + clone.setDate(1); + } + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.DAY) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 24) * 24); break; + default: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.WEEKDAY) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + default: + clone.setHours(Math.round(clone.getHours() / 6) * 6); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.HOUR) { + switch (this.step) { + case 4: + clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; + default: + clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; + } + clone.setSeconds(0); + clone.setMilliseconds(0); + } else if (this.scale == TimeStep.SCALE.MINUTE) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 15: + case 10: + clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); + clone.setSeconds(0); + break; + case 5: + clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; + default: + clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; + } + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.SECOND) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 15: + case 10: + clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); + clone.setMilliseconds(0); + break; + case 5: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; + default: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; + } + } + else if (this.scale == TimeStep.SCALE.MILLISECOND) { + var step = this.step > 5 ? this.step / 2 : 1; + clone.setMilliseconds(Math.round(clone.getMilliseconds() / step) * step); + } + + return clone; + }; /** - * Set the list with values for the slider - * @param {Array} values A javascript array with values (any type) + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. */ - Slider.prototype.setValues = function(values) { - this.values = values; + TimeStep.prototype.isMajor = function() { + if (this.switchedYear == true) { + this.switchedYear = false; + switch (this.scale) { + case TimeStep.SCALE.YEAR: + case TimeStep.SCALE.MONTH: + case TimeStep.SCALE.WEEKDAY: + case TimeStep.SCALE.DAY: + case TimeStep.SCALE.HOUR: + case TimeStep.SCALE.MINUTE: + case TimeStep.SCALE.SECOND: + case TimeStep.SCALE.MILLISECOND: + return true; + default: + return false; + } + } + else if (this.switchedMonth == true) { + this.switchedMonth = false; + switch (this.scale) { + case TimeStep.SCALE.WEEKDAY: + case TimeStep.SCALE.DAY: + case TimeStep.SCALE.HOUR: + case TimeStep.SCALE.MINUTE: + case TimeStep.SCALE.SECOND: + case TimeStep.SCALE.MILLISECOND: + return true; + default: + return false; + } + } + else if (this.switchedDay == true) { + this.switchedDay = false; + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: + case TimeStep.SCALE.SECOND: + case TimeStep.SCALE.MINUTE: + case TimeStep.SCALE.HOUR: + return true; + default: + return false; + } + } - if (this.values.length > 0) - this.setIndex(0); - else - this.index = undefined; + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: + return (this.current.getMilliseconds() == 0); + case TimeStep.SCALE.SECOND: + return (this.current.getSeconds() == 0); + case TimeStep.SCALE.MINUTE: + return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); + case TimeStep.SCALE.HOUR: + return (this.current.getHours() == 0); + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: + return (this.current.getDate() == 1); + case TimeStep.SCALE.MONTH: + return (this.current.getMonth() == 0); + case TimeStep.SCALE.YEAR: + return false; + default: + return false; + } }; + /** - * Select a value by its index - * @param {Number} index + * Returns formatted text for the minor axislabel, depending on the current + * date and the scale. For example when scale is MINUTE, the current time is + * formatted as "hh:mm". + * @param {Date} [date] custom date. if not provided, current date is taken */ - Slider.prototype.setIndex = function(index) { - if (index < this.values.length) { - this.index = index; - - this.redraw(); - this.onChange(); - } - else { - throw 'Error: index out of range'; + TimeStep.prototype.getLabelMinor = function(date) { + if (date == undefined) { + date = this.current; } - }; - /** - * retrieve the index of the currently selected vaue - * @return {Number} index - */ - Slider.prototype.getIndex = function() { - return this.index; + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: return moment(date).format('SSS'); + case TimeStep.SCALE.SECOND: return moment(date).format('s'); + case TimeStep.SCALE.MINUTE: return moment(date).format('HH:mm'); + case TimeStep.SCALE.HOUR: return moment(date).format('HH:mm'); + case TimeStep.SCALE.WEEKDAY: return moment(date).format('ddd D'); + case TimeStep.SCALE.DAY: return moment(date).format('D'); + case TimeStep.SCALE.MONTH: return moment(date).format('MMM'); + case TimeStep.SCALE.YEAR: return moment(date).format('YYYY'); + default: return ''; + } }; /** - * retrieve the currently selected value - * @return {*} value + * Returns formatted text for the major axis label, depending on the current + * date and the scale. For example when scale is MINUTE, the major scale is + * hours, and the hour will be formatted as "hh". + * @param {Date} [date] custom date. if not provided, current date is taken */ - Slider.prototype.get = function() { - return this.values[this.index]; - }; - - - Slider.prototype._onMouseDown = function(event) { - // only react on left mouse button down - var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); - if (!leftButtonDown) return; - - this.startClientX = event.clientX; - this.startSlideX = parseFloat(this.frame.slide.style.left); - - this.frame.style.cursor = 'move'; - - // add event listeners to handle moving the contents - // we store the function onmousemove and onmouseup in the graph, so we can - // remove the eventlisteners lateron in the function mouseUp() - var me = this; - this.onmousemove = function (event) {me._onMouseMove(event);}; - this.onmouseup = function (event) {me._onMouseUp(event);}; - util.addEventListener(document, 'mousemove', this.onmousemove); - util.addEventListener(document, 'mouseup', this.onmouseup); - util.preventDefault(event); - }; - - - Slider.prototype.leftToIndex = function (left) { - var width = parseFloat(this.frame.bar.style.width) - - this.frame.slide.clientWidth - 10; - var x = left - 3; - - var index = Math.round(x / width * (this.values.length-1)); - if (index < 0) index = 0; - if (index > this.values.length-1) index = this.values.length-1; - - return index; - }; - - Slider.prototype.indexToLeft = function (index) { - var width = parseFloat(this.frame.bar.style.width) - - this.frame.slide.clientWidth - 10; - - var x = index / (this.values.length-1) * width; - var left = x + 3; - - return left; - }; - - - - Slider.prototype._onMouseMove = function (event) { - var diff = event.clientX - this.startClientX; - var x = this.startSlideX + diff; - - var index = this.leftToIndex(x); - - this.setIndex(index); - - util.preventDefault(); - }; - - - Slider.prototype._onMouseUp = function (event) { - this.frame.style.cursor = 'auto'; - - // remove event listeners - util.removeEventListener(document, 'mousemove', this.onmousemove); - util.removeEventListener(document, 'mouseup', this.onmouseup); + TimeStep.prototype.getLabelMajor = function(date) { + if (date == undefined) { + date = this.current; + } - util.preventDefault(); + //noinspection FallthroughInSwitchStatementJS + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND:return moment(date).format('HH:mm:ss'); + case TimeStep.SCALE.SECOND: return moment(date).format('D MMMM HH:mm'); + case TimeStep.SCALE.MINUTE: + case TimeStep.SCALE.HOUR: return moment(date).format('ddd D MMMM'); + case TimeStep.SCALE.WEEKDAY: + case TimeStep.SCALE.DAY: return moment(date).format('MMMM YYYY'); + case TimeStep.SCALE.MONTH: return moment(date).format('YYYY'); + case TimeStep.SCALE.YEAR: return ''; + default: return ''; + } }; - module.exports = Slider; + module.exports = TimeStep; /***/ }, -/* 17 */ +/* 20 */ /***/ function(module, exports, __webpack_require__) { /** - * @prototype StepNumber - * The class StepNumber is an iterator for Numbers. You provide a start and end - * value, and a best step size. StepNumber itself rounds to fixed values and - * a finds the step that best fits the provided step. - * - * If prettyStep is true, the step size is chosen as close as possible to the - * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... - * - * Example usage: - * var step = new StepNumber(0, 10, 2.5, true); - * step.start(); - * while (!step.end()) { - * alert(step.getCurrent()); - * step.next(); - * } - * - * Version: 1.0 - * - * @param {Number} start The start value - * @param {Number} end The end value - * @param {Number} step Optional. Step size. Must be a positive value. - * @param {boolean} prettyStep Optional. If true, the step size is rounded - * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - function StepNumber(start, end, step, prettyStep) { - // set default values - this._start = 0; - this._end = 0; - this._step = 1; - this.prettyStep = true; - this.precision = 5; - - this._current = 0; - this.setRange(start, end, step, prettyStep); - }; - - /** - * Set a new range: start, end and step. - * - * @param {Number} start The start value - * @param {Number} end The end value - * @param {Number} step Optional. Step size. Must be a positive value. - * @param {boolean} prettyStep Optional. If true, the step size is rounded - * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - StepNumber.prototype.setRange = function(start, end, step, prettyStep) { - this._start = start ? start : 0; - this._end = end ? end : 0; - - this.setStep(step, prettyStep); - }; - - /** - * Set a new step size - * @param {Number} step New step size. Must be a positive value - * @param {boolean} prettyStep Optional. If true, the provided step is rounded - * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) + * Prototype for visual components + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] + * @param {Object} [options] */ - StepNumber.prototype.setStep = function(step, prettyStep) { - if (step === undefined || step <= 0) - return; - - if (prettyStep !== undefined) - this.prettyStep = prettyStep; - - if (this.prettyStep === true) - this._step = StepNumber.calculatePrettyStep(step); - else - this._step = step; - }; + function Component (body, options) { + this.options = null; + this.props = null; + } /** - * Calculate a nice step size, closest to the desired step size. - * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an - * integer Number. For example 1, 2, 5, 10, 20, 50, etc... - * @param {Number} step Desired step size - * @return {Number} Nice step size + * Set options for the component. The new options will be merged into the + * current options. + * @param {Object} options */ - StepNumber.calculatePrettyStep = function (step) { - var log10 = function (x) {return Math.log(x) / Math.LN10;}; - - // try three steps (multiple of 1, 2, or 5 - var step1 = Math.pow(10, Math.round(log10(step))), - step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), - step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); - - // choose the best step (closest to minimum step) - var prettyStep = step1; - if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; - if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; - - // for safety - if (prettyStep <= 0) { - prettyStep = 1; + Component.prototype.setOptions = function(options) { + if (options) { + util.extend(this.options, options); } - - return prettyStep; }; /** - * returns the current value of the step - * @return {Number} current value + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - StepNumber.prototype.getCurrent = function () { - return parseFloat(this._current.toPrecision(this.precision)); + Component.prototype.redraw = function() { + // should be implemented by the component + return false; }; /** - * returns the current step size - * @return {Number} current step size + * Destroy the component. Cleanup DOM and event listeners */ - StepNumber.prototype.getStep = function () { - return this._step; + Component.prototype.destroy = function() { + // should be implemented by the component }; /** - * Set the current value to the largest value smaller than start, which - * is a multiple of the step size + * Test whether the component is resized since the last time _isResized() was + * called. + * @return {Boolean} Returns true if the component is resized + * @protected */ - StepNumber.prototype.start = function() { - this._current = this._start - this._start % this._step; - }; + Component.prototype._isResized = function() { + var resized = (this.props._previousWidth !== this.props.width || + this.props._previousHeight !== this.props.height); - /** - * Do a step, add the step size to the current value - */ - StepNumber.prototype.next = function () { - this._current += this._step; - }; + this.props._previousWidth = this.props.width; + this.props._previousHeight = this.props.height; - /** - * Returns true whether the end is reached - * @return {boolean} True if the current value has passed the end value. - */ - StepNumber.prototype.end = function () { - return (this._current > this._end); + return resized; }; - module.exports = StepNumber; + module.exports = Component; /***/ }, -/* 18 */ +/* 21 */ /***/ function(module, exports, __webpack_require__) { - var Emitter = __webpack_require__(11); - var Hammer = __webpack_require__(19); var util = __webpack_require__(1); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var Range = __webpack_require__(21); - var Core = __webpack_require__(25); - var TimeAxis = __webpack_require__(37); - var CurrentTime = __webpack_require__(39); - var CustomTime = __webpack_require__(41); - var ItemSet = __webpack_require__(26); + var Component = __webpack_require__(20); + var moment = __webpack_require__(44); + var locales = __webpack_require__(48); /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {vis.DataSet | Array | google.visualization.DataTable} [groups] - * @param {Object} [options] See Timeline.setOptions for the available options. - * @constructor - * @extends Core + * A current time bar + * @param {{range: Range, dom: Object, domProps: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCurrentTime] + * @constructor CurrentTime + * @extends Component */ - function Timeline (container, items, groups, options) { - if (!(this instanceof Timeline)) { - throw new SyntaxError('Constructor must be called with the new operator'); - } - - // if the third element is options, the forth is groups (optionally); - if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { - var forthArgument = options; - options = groups; - groups = forthArgument; - } + function CurrentTime (body, options) { + this.body = body; - var me = this; + // default options this.defaultOptions = { - start: null, - end: null, - - autoResize: true, + showCurrentTime: true, - orientation: 'bottom', - width: null, - height: null, - maxHeight: null, - minHeight: null + locales: locales, + locale: 'en' }; - this.options = util.deepExtend({}, this.defaultOptions); - - // Create the DOM, props, and emitter - this._create(container); - - // all components listed here will be repainted automatically - this.components = []; + this.options = util.extend({}, this.defaultOptions); + this.offset = 0; - this.body = { - dom: this.dom, - domProps: this.props, - emitter: { - on: this.on.bind(this), - off: this.off.bind(this), - emit: this.emit.bind(this) - }, - hiddenDates: [], - util: { - snap: null, // will be specified after TimeAxis is created - toScreen: me._toScreen.bind(me), - toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width - toTime: me._toTime.bind(me), - toGlobalTime : me._toGlobalTime.bind(me) - } - }; + this._create(); - // range - this.range = new Range(this.body); - this.components.push(this.range); - this.body.range = this.range; + this.setOptions(options); + } - // time axis - this.timeAxis = new TimeAxis(this.body); - this.components.push(this.timeAxis); - this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); + CurrentTime.prototype = new Component(); - // current time bar - this.currentTime = new CurrentTime(this.body); - this.components.push(this.currentTime); + /** + * Create the HTML DOM for the current time bar + * @private + */ + CurrentTime.prototype._create = function() { + var bar = document.createElement('div'); + bar.className = 'currenttime'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; - // custom time bar - // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(this.body); - this.components.push(this.customTime); + this.bar = bar; + }; - // item set - this.itemSet = new ItemSet(this.body); - this.components.push(this.itemSet); + /** + * Destroy the CurrentTime bar + */ + CurrentTime.prototype.destroy = function () { + this.options.showCurrentTime = false; + this.redraw(); // will remove the bar from the DOM and stop refreshing - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + this.body = null; + }; - // apply options + /** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCurrentTime] + */ + CurrentTime.prototype.setOptions = function(options) { if (options) { - this.setOptions(options); - } - - // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! - if (groups) { - this.setGroups(groups); - } - - // create itemset - if (items) { - this.setItems(items); - } - else { - this.redraw(); + // copy all options that we know + util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); } - } - - // Extend the functionality from Core - Timeline.prototype = new Core(); + }; /** - * Set items - * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - Timeline.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); - - // convert to type DataSet when needed - var newDataSet; - if (!items) { - newDataSet = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - newDataSet = items; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(items, { - type: { - start: 'Date', - end: 'Date' + CurrentTime.prototype.redraw = function() { + if (this.options.showCurrentTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); } - }); - } + parent.appendChild(this.bar); - // set items - this.itemsData = newDataSet; - this.itemSet && this.itemSet.setItems(newDataSet); + this.start(); + } - if (initialLoad) { - if (this.options.start != undefined || this.options.end != undefined) { - if (this.options.start == undefined || this.options.end == undefined) { - var dataRange = this._getDataRange(); - } + var now = new Date(new Date().valueOf() + this.offset); + var x = this.body.util.toScreen(now); - var start = this.options.start != undefined ? this.options.start : dataRange.start; - var end = this.options.end != undefined ? this.options.end : dataRange.end; + var locale = this.options.locales[this.options.locale]; + var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); - this.setWindow(start, end, {animate: false}); - } - else { - this.fit({animate: false}); + this.bar.style.left = x + 'px'; + this.bar.title = title; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); } + this.stop(); } + + return false; }; /** - * Set groups - * @param {vis.DataSet | Array | google.visualization.DataTable} groups + * Start auto refreshing the current time bar */ - Timeline.prototype.setGroups = function(groups) { - // convert to type DataSet when needed - var newDataSet; - if (!groups) { - newDataSet = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - newDataSet = groups; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(groups); + CurrentTime.prototype.start = function() { + var me = this; + + function update () { + me.stop(); + + // determine interval to refresh + var scale = me.body.range.conversion(me.body.domProps.center.width).scale; + var interval = 1 / scale / 10; + if (interval < 30) interval = 30; + if (interval > 1000) interval = 1000; + + me.redraw(); + + // start a timer to adjust for the new time + me.currentTimeTimer = setTimeout(update, interval); } - this.groupsData = newDataSet; - this.itemSet.setGroups(newDataSet); + update(); }; /** - * Set selected items by their id. Replaces the current selection - * Unknown id's are silently ignored. - * @param {string[] | string} [ids] An array with zero or more id's of the items to be - * selected. If ids is an empty array, all items will be - * unselected. - * @param {Object} [options] Available options: - * `focus: boolean` - * If true, focus will be set to the selected item(s) - * `animate: boolean | number` - * If true (default), the range is animated - * smoothly to the new window. - * If a number, the number is taken as duration - * for the animation. Default duration is 500 ms. - * Only applicable when option focus is true. + * Stop auto refreshing the current time bar */ - Timeline.prototype.setSelection = function(ids, options) { - this.itemSet && this.itemSet.setSelection(ids); - - if (options && options.focus) { - this.focus(ids, options); + CurrentTime.prototype.stop = function() { + if (this.currentTimeTimer !== undefined) { + clearTimeout(this.currentTimeTimer); + delete this.currentTimeTimer; } }; /** - * Get the selected items by their id - * @return {Array} ids The ids of the selected items + * Set a current time. This can be used for example to ensure that a client's + * time is synchronized with a shared server time. + * @param {Date | String | Number} time A Date, unix timestamp, or + * ISO date string. */ - Timeline.prototype.getSelection = function() { - return this.itemSet && this.itemSet.getSelection() || []; + CurrentTime.prototype.setCurrentTime = function(time) { + var t = util.convert(time, 'Date').valueOf(); + var now = new Date().valueOf(); + this.offset = t - now; + this.redraw(); }; /** - * Adjust the visible window such that the selected item (or multiple items) - * are centered on screen. - * @param {String | String[]} id An item id or array with item ids - * @param {Object} [options] Available options: - * `animate: boolean | number` - * If true (default), the range is animated - * smoothly to the new window. - * If a number, the number is taken as duration - * for the animation. Default duration is 500 ms. - * Only applicable when option focus is true + * Get the current time. + * @return {Date} Returns the current time. */ - Timeline.prototype.focus = function(id, options) { - if (!this.itemsData || id == undefined) return; - - var ids = Array.isArray(id) ? id : [id]; - - // get the specified item(s) - var itemsData = this.itemsData.getDataSet().get(ids, { - type: { - start: 'Date', - end: 'Date' - } - }); - - // calculate minimum start and maximum end of specified items - var start = null; - var end = null; - itemsData.forEach(function (itemData) { - var s = itemData.start.valueOf(); - var e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf(); + CurrentTime.prototype.getCurrentTime = function() { + return new Date(new Date().valueOf() + this.offset); + }; - if (start === null || s < start) { - start = s; - } + module.exports = CurrentTime; - if (end === null || e > end) { - end = e; - } - }); - if (start !== null && end !== null) { - // calculate the new middle and interval for the window - var middle = (start + end) / 2; - var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1); +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { - var animate = (options && options.animate !== undefined) ? options.animate : true; - this.range.setRange(middle - interval / 2, middle + interval / 2, animate); - } - }; + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var Component = __webpack_require__(20); + var moment = __webpack_require__(44); + var locales = __webpack_require__(48); /** - * Get the data range of the item set. - * @returns {{min: Date, max: Date}} range A range with a start and end Date. - * When no minimum is found, min==null - * When no maximum is found, max==null + * A custom time bar + * @param {{range: Range, dom: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCustomTime] + * @constructor CustomTime + * @extends Component */ - Timeline.prototype.getItemRange = function() { - // calculate min from start filed - var dataset = this.itemsData.getDataSet(), - min = null, - max = null; - - if (dataset) { - // calculate the minimum value of the field 'start' - var minItem = dataset.min('start'); - min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; - // Note: we convert first to Date and then to number because else - // a conversion from ISODate to Number will fail - // calculate maximum value of fields 'start' and 'end' - var maxStartItem = dataset.max('start'); - if (maxStartItem) { - max = util.convert(maxStartItem.start, 'Date').valueOf(); - } - var maxEndItem = dataset.max('end'); - if (maxEndItem) { - if (max == null) { - max = util.convert(maxEndItem.end, 'Date').valueOf(); - } - else { - max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); - } - } - } + function CustomTime (body, options) { + this.body = body; - return { - min: (min != null) ? new Date(min) : null, - max: (max != null) ? new Date(max) : null + // default options + this.defaultOptions = { + showCustomTime: false, + locales: locales, + locale: 'en' }; - }; - - - module.exports = Timeline; + this.options = util.extend({}, this.defaultOptions); + this.customTime = new Date(); + this.eventParams = {}; // stores state parameters while dragging the bar -/***/ }, -/* 19 */ -/***/ function(module, exports, __webpack_require__) { + // create the DOM + this._create(); - // Only load hammer.js when in a browser environment - // (loading hammer.js in a node.js environment gives errors) - if (typeof window !== 'undefined') { - module.exports = window['Hammer'] || __webpack_require__(20); - } - else { - module.exports = function () { - throw Error('hammer.js is only available in a browser, not in node.js.'); - } + this.setOptions(options); } - -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 - * http://eightmedia.github.io/hammer.js - * - * Copyright (c) 2014 Jorik Tangelder ; - * Licensed under the MIT license */ - - (function(window, undefined) { - 'use strict'; + CustomTime.prototype = new Component(); /** - * @main - * @module hammer - * - * @class Hammer - * @static + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCustomTime] */ + CustomTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCustomTime', 'locale', 'locales'], this.options, options); + } + }; /** - * Hammer, use this to create instances - * ```` - * var hammertime = new Hammer(myElement); - * ```` - * - * @method Hammer - * @param {HTMLElement} element - * @param {Object} [options={}] - * @return {Hammer.Instance} + * Create the DOM for the custom time + * @private */ - var Hammer = function Hammer(element, options) { - return new Hammer.Instance(element, options || {}); + CustomTime.prototype._create = function() { + var bar = document.createElement('div'); + bar.className = 'customtime'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; + this.bar = bar; + + var drag = document.createElement('div'); + drag.style.position = 'relative'; + drag.style.top = '0px'; + drag.style.left = '-10px'; + drag.style.height = '100%'; + drag.style.width = '20px'; + bar.appendChild(drag); + + // attach event listeners + this.hammer = Hammer(bar, { + prevent_default: true + }); + this.hammer.on('dragstart', this._onDragStart.bind(this)); + this.hammer.on('drag', this._onDrag.bind(this)); + this.hammer.on('dragend', this._onDragEnd.bind(this)); }; /** - * version, as defined in package.json - * the value will be set at each build - * @property VERSION - * @final - * @type {String} + * Destroy the CustomTime bar */ - Hammer.VERSION = '1.1.3'; + CustomTime.prototype.destroy = function () { + this.options.showCustomTime = false; + this.redraw(); // will remove the bar from the DOM - /** - * default settings. - * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled - * by setting it's name (like `swipe`) to false. - * You can set the defaults for all instances by changing this object before creating an instance. - * @example - * ```` - * Hammer.defaults.drag = false; - * Hammer.defaults.behavior.touchAction = 'pan-y'; - * delete Hammer.defaults.behavior.userSelect; - * ```` - * @property defaults - * @type {Object} - */ - Hammer.defaults = { - /** - * this setting object adds styles and attributes to the element to prevent the browser from doing - * its native behavior. The css properties are auto prefixed for the browsers when needed. - * @property defaults.behavior - * @type {Object} - */ - behavior: { - /** - * Disables text selection to improve the dragging gesture. When the value is `none` it also sets - * `onselectstart=false` for IE on the element. Mainly for desktop browsers. - * @property defaults.behavior.userSelect - * @type {String} - * @default 'none' - */ - userSelect: 'none', + this.hammer.enable(false); + this.hammer = null; - /** - * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). - * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. - * @property defaults.behavior.touchAction - * @type {String} - * @default: 'pan-y' - */ - touchAction: 'pan-y', + this.body = null; + }; - /** - * Disables the default callout shown when you touch and hold a touch target. - * On iOS, when you touch and hold a touch target such as a link, Safari displays - * a callout containing information about the link. This property allows you to disable that callout. - * @property defaults.behavior.touchCallout - * @type {String} - * @default 'none' - */ - touchCallout: 'none', + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + CustomTime.prototype.redraw = function () { + if (this.options.showCustomTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); + } - /** - * Specifies whether zooming is enabled. Used by IE10> - * @property defaults.behavior.contentZooming - * @type {String} - * @default 'none' - */ - contentZooming: 'none', + var x = this.body.util.toScreen(this.customTime); - /** - * Specifies that an entire element should be draggable instead of its contents. - * Mainly for desktop browsers. - * @property defaults.behavior.userDrag - * @type {String} - * @default 'none' - */ - userDrag: 'none', + var locale = this.options.locales[this.options.locale]; + var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); - /** - * Overrides the highlight color shown when the user taps a link or a JavaScript - * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. - * - * If you don't specify an alpha value, Safari on iPhone applies a default alpha value - * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). - * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. - * @property defaults.behavior.tapHighlightColor - * @type {String} - * @default 'rgba(0,0,0,0)' - */ - tapHighlightColor: 'rgba(0,0,0,0)' + this.bar.style.left = x + 'px'; + this.bar.title = title; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); } + } + + return false; }; /** - * hammer document where the base events are added at - * @property DOCUMENT - * @type {HTMLElement} - * @default window.document + * Set custom time. + * @param {Date | number | string} time */ - Hammer.DOCUMENT = document; + CustomTime.prototype.setCustomTime = function(time) { + this.customTime = util.convert(time, 'Date'); + this.redraw(); + }; /** - * detect support for pointer events - * @property HAS_POINTEREVENTS - * @type {Boolean} + * Retrieve the current custom time. + * @return {Date} customTime */ - Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; + CustomTime.prototype.getCustomTime = function() { + return new Date(this.customTime.valueOf()); + }; /** - * detect support for touch events - * @property HAS_TOUCHEVENTS - * @type {Boolean} + * Start moving horizontally + * @param {Event} event + * @private */ - Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + CustomTime.prototype._onDragStart = function(event) { + this.eventParams.dragging = true; + this.eventParams.customTime = this.customTime; - /** - * detect mobile browsers - * @property IS_MOBILE - * @type {Boolean} - */ - Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); + event.stopPropagation(); + event.preventDefault(); + }; /** - * detect if we want to support mouseevents at all - * @property NO_MOUSEEVENTS - * @type {Boolean} + * Perform moving operating. + * @param {Event} event + * @private */ - Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; + CustomTime.prototype._onDrag = function (event) { + if (!this.eventParams.dragging) return; - /** - * interval in which Hammer recalculates current velocity/direction/angle in ms - * @property CALCULATE_INTERVAL - * @type {Number} - * @default 25 - */ - Hammer.CALCULATE_INTERVAL = 25; + var deltaX = event.gesture.deltaX, + x = this.body.util.toScreen(this.eventParams.customTime) + deltaX, + time = this.body.util.toTime(x); + + this.setCustomTime(time); + + // fire a timechange event + this.body.emitter.emit('timechange', { + time: new Date(this.customTime.valueOf()) + }); + + event.stopPropagation(); + event.preventDefault(); + }; /** - * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` - * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) - * @property EVENT_TYPES + * Stop moving operating. + * @param {event} event * @private - * @writeOnce - * @type {Object} */ - var EVENT_TYPES = {}; + CustomTime.prototype._onDragEnd = function (event) { + if (!this.eventParams.dragging) return; - /** - * direction strings, for safe comparisons - * @property DIRECTION_DOWN|LEFT|UP|RIGHT - * @final - * @type {String} - * @default 'down' 'left' 'up' 'right' - */ - var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; - var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; - var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; - var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; + // fire a timechanged event + this.body.emitter.emit('timechanged', { + time: new Date(this.customTime.valueOf()) + }); + + event.stopPropagation(); + event.preventDefault(); + }; + + module.exports = CustomTime; + + +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var Component = __webpack_require__(20); + var DataStep = __webpack_require__(16); /** - * pointertype strings, for safe comparisons - * @property POINTER_MOUSE|TOUCH|PEN - * @final - * @type {String} - * @default 'mouse' 'touch' 'pen' + * A horizontal time axis + * @param {Object} [options] See DataAxis.setOptions for the available + * options. + * @constructor DataAxis + * @extends Component + * @param body */ - var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; - var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; - var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; + function DataAxis (body, options, svg, linegraphOptions) { + this.id = util.randomUUID(); + this.body = body; + + this.defaultOptions = { + orientation: 'left', // supported: 'left', 'right' + showMinorLabels: true, + showMajorLabels: true, + icons: true, + majorLinesOffset: 7, + minorLinesOffset: 4, + labelOffsetX: 10, + labelOffsetY: 2, + iconWidth: 20, + width: '40px', + visible: true, + alignZeros: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + }, + title: { + left: {text:undefined}, + right: {text:undefined} + }, + format: { + left: {decimals: undefined}, + right: {decimals: undefined} + } + }; + + this.linegraphOptions = linegraphOptions; + this.linegraphSVG = svg; + this.props = {}; + this.DOMelements = { // dynamic elements + lines: {}, + labels: {}, + title: {} + }; + + this.dom = {}; - /** - * eventtypes - * @property EVENT_START|MOVE|END|RELEASE|TOUCH - * @final - * @type {String} - * @default 'start' 'change' 'move' 'end' 'release' 'touch' - */ - var EVENT_START = Hammer.EVENT_START = 'start'; - var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; - var EVENT_END = Hammer.EVENT_END = 'end'; - var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; - var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; + this.range = {start:0, end:0}; - /** - * if the window events are set... - * @property READY - * @writeOnce - * @type {Boolean} - * @default false - */ - Hammer.READY = false; + this.options = util.extend({}, this.defaultOptions); + this.conversionFactor = 1; - /** - * plugins namespace - * @property plugins - * @type {Object} - */ - Hammer.plugins = Hammer.plugins || {}; + this.setOptions(options); + this.width = Number(('' + this.options.width).replace("px","")); + this.minWidth = this.width; + this.height = this.linegraphSVG.offsetHeight; - /** - * gestures namespace - * see `/gestures` for the definitions - * @property gestures - * @type {Object} - */ - Hammer.gestures = Hammer.gestures || {}; + this.stepPixels = 25; + this.stepPixelsForced = 25; + this.zeroCrossing = -1; - /** - * setup events to detect gestures on the document - * this function is called when creating an new instance - * @private - */ - function setup() { - if(Hammer.READY) { - return; - } + this.lineOffset = 0; + this.master = true; + this.svgElements = {}; + this.iconsRemoved = false; - // find what eventtypes we add listeners to - Event.determineEventTypes(); - // Register all gestures inside Hammer.gestures - Utils.each(Hammer.gestures, function(gesture) { - Detection.register(gesture); - }); + this.groups = {}; + this.amountOfGroups = 0; - // Add touch events on the document - Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); - Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); + // create the HTML DOM + this._create(); - // Hammer is ready...! - Hammer.READY = true; + var me = this; + this.body.emitter.on("verticalDrag", function() { + me.dom.lineContainer.style.top = me.body.domProps.scrollTop + 'px'; + }); } - /** - * @module hammer - * - * @class Utils - * @static - */ - var Utils = Hammer.utils = { - /** - * extend method, could also be used for cloning when `dest` is an empty object. - * changes the dest object - * @method extend - * @param {Object} dest - * @param {Object} src - * @param {Boolean} [merge=false] do a merge - * @return {Object} dest - */ - extend: function extend(dest, src, merge) { - for(var key in src) { - if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { - continue; - } - dest[key] = src[key]; - } - return dest; - }, + DataAxis.prototype = new Component(); - /** - * simple addEventListener wrapper - * @method on - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - on: function on(element, type, handler) { - element.addEventListener(type, handler, false); - }, - /** - * simple removeEventListener wrapper - * @method off - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - off: function off(element, type, handler) { - element.removeEventListener(type, handler, false); - }, - /** - * forEach over arrays and objects - * @method each - * @param {Object|Array} obj - * @param {Function} iterator - * @param {any} iterator.item - * @param {Number} iterator.index - * @param {Object|Array} iterator.obj the source object - * @param {Object} context value to use as `this` in the iterator - */ - each: function each(obj, iterator, context) { - var i, len; + DataAxis.prototype.addGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; + }; - // native forEach on arrays - if('forEach' in obj) { - obj.forEach(iterator, context); - // arrays - } else if(obj.length !== undefined) { - for(i = 0, len = obj.length; i < len; i++) { - if(iterator.call(context, obj[i], i, obj) === false) { - return; - } - } - // objects - } else { - for(i in obj) { - if(obj.hasOwnProperty(i) && - iterator.call(context, obj[i], i, obj) === false) { - return; - } - } - } - }, + DataAxis.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; - /** - * find if a string contains the string using indexOf - * @method inStr - * @param {String} src - * @param {String} find - * @return {Boolean} found - */ - inStr: function inStr(src, find) { - return src.indexOf(find) > -1; - }, + DataAxis.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; + } + }; - /** - * find if a array contains the object using indexOf or a simple polyfill - * @method inArray - * @param {String} src - * @param {String} find - * @return {Boolean|Number} false when not found, or the index - */ - inArray: function inArray(src, find) { - if(src.indexOf) { - var index = src.indexOf(find); - return (index === -1) ? false : index; - } else { - for(var i = 0, len = src.length; i < len; i++) { - if(src[i] === find) { - return i; - } - } - return false; - } - }, - /** - * convert an array-like object (`arguments`, `touchlist`) to an array - * @method toArray - * @param {Object} obj - * @return {Array} - */ - toArray: function toArray(obj) { - return Array.prototype.slice.call(obj, 0); - }, + DataAxis.prototype.setOptions = function (options) { + if (options) { + var redraw = false; + if (this.options.orientation != options.orientation && options.orientation !== undefined) { + redraw = true; + } + var fields = [ + 'orientation', + 'showMinorLabels', + 'showMajorLabels', + 'icons', + 'majorLinesOffset', + 'minorLinesOffset', + 'labelOffsetX', + 'labelOffsetY', + 'iconWidth', + 'width', + 'visible', + 'customRange', + 'title', + 'format', + 'alignZeros' + ]; + util.selectiveExtend(fields, this.options, options); - /** - * find if a node is in the given parent - * @method hasParent - * @param {HTMLElement} node - * @param {HTMLElement} parent - * @return {Boolean} found - */ - hasParent: function hasParent(node, parent) { - while(node) { - if(node == parent) { - return true; - } - node = node.parentNode; - } - return false; - }, + this.minWidth = Number(('' + this.options.width).replace("px","")); - /** - * get the center of all the touches - * @method getCenter - * @param {Array} touches - * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties - */ - getCenter: function getCenter(touches) { - var pageX = [], - pageY = [], - clientX = [], - clientY = [], - min = Math.min, - max = Math.max; + if (redraw == true && this.dom.frame) { + this.hide(); + this.show(); + } + } + }; - // no need to loop when only one touch - if(touches.length === 1) { - return { - pageX: touches[0].pageX, - pageY: touches[0].pageY, - clientX: touches[0].clientX, - clientY: touches[0].clientY - }; - } - Utils.each(touches, function(touch) { - pageX.push(touch.pageX); - pageY.push(touch.pageY); - clientX.push(touch.clientX); - clientY.push(touch.clientY); - }); + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.style.width = this.options.width; + this.dom.frame.style.height = this.height; - return { - pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, - pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, - clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, - clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 - }; - }, + this.dom.lineContainer = document.createElement('div'); + this.dom.lineContainer.style.width = '100%'; + this.dom.lineContainer.style.height = this.height; + this.dom.lineContainer.style.position = 'relative'; - /** - * calculate the velocity between two points. unit is in px per ms. - * @method getVelocity - * @param {Number} deltaTime - * @param {Number} deltaX - * @param {Number} deltaY - * @return {Object} velocity `x` and `y` - */ - getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { - return { - x: Math.abs(deltaX / deltaTime) || 0, - y: Math.abs(deltaY / deltaTime) || 0 - }; - }, + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = "absolute"; + this.svg.style.top = '0px'; + this.svg.style.height = '100%'; + this.svg.style.width = '100%'; + this.svg.style.display = "block"; + this.dom.frame.appendChild(this.svg); + }; - /** - * calculate the angle between two coordinates - * @method getAngle - * @param {Touch} touch1 - * @param {Touch} touch2 - * @return {Number} angle - */ - getAngle: function getAngle(touch1, touch2) { - var x = touch2.clientX - touch1.clientX, - y = touch2.clientY - touch1.clientY; + DataAxis.prototype._redrawGroupIcons = function () { + DOMutil.prepareElements(this.svgElements); - return Math.atan2(y, x) * 180 / Math.PI; - }, + var x; + var iconWidth = this.options.iconWidth; + var iconHeight = 15; + var iconOffset = 4; + var y = iconOffset + 0.5 * iconHeight; - /** - * do a small comparision to get the direction between two touches. - * @method getDirection - * @param {Touch} touch1 - * @param {Touch} touch2 - * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` - */ - getDirection: function getDirection(touch1, touch2) { - var x = Math.abs(touch1.clientX - touch2.clientX), - y = Math.abs(touch1.clientY - touch2.clientY); + if (this.options.orientation == 'left') { + x = iconOffset; + } + else { + x = this.width - iconWidth - iconOffset; + } - if(x >= y) { - return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; - }, + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + iconOffset; + } + } + } - /** - * calculate the distance between two touches - * @method getDistance - * @param {Touch}touch1 - * @param {Touch} touch2 - * @return {Number} distance - */ - getDistance: function getDistance(touch1, touch2) { - var x = touch2.clientX - touch1.clientX, - y = touch2.clientY - touch1.clientY; + DOMutil.cleanupElements(this.svgElements); + this.iconsRemoved = false; + }; - return Math.sqrt((x * x) + (y * y)); - }, + DataAxis.prototype._cleanupIcons = function() { + if (this.iconsRemoved == false) { + DOMutil.prepareElements(this.svgElements); + DOMutil.cleanupElements(this.svgElements); + this.iconsRemoved = true; + } + } - /** - * calculate the scale factor between two touchLists - * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out - * @method getScale - * @param {Array} start array of touches - * @param {Array} end array of touches - * @return {Number} scale - */ - getScale: function getScale(start, end) { - // need two fingers... - if(start.length >= 2 && end.length >= 2) { - return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); - } - return 1; - }, + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.show = function() { + if (!this.dom.frame.parentNode) { + if (this.options.orientation == 'left') { + this.body.dom.left.appendChild(this.dom.frame); + } + else { + this.body.dom.right.appendChild(this.dom.frame); + } + } - /** - * calculate the rotation degrees between two touchLists - * @method getRotation - * @param {Array} start array of touches - * @param {Array} end array of touches - * @return {Number} rotation - */ - getRotation: function getRotation(start, end) { - // need two fingers - if(start.length >= 2 && end.length >= 2) { - return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); - } - return 0; - }, + if (!this.dom.lineContainer.parentNode) { + this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); + } + }; - /** - * find out if the direction is vertical * - * @method isVertical - * @param {String} direction matches `DIRECTION_UP|DOWN` - * @return {Boolean} is_vertical - */ - isVertical: function isVertical(direction) { - return direction == DIRECTION_UP || direction == DIRECTION_DOWN; - }, + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.hide = function() { + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } - /** - * set css properties with their prefixes - * @param {HTMLElement} element - * @param {String} prop - * @param {String} value - * @param {Boolean} [toggle=true] - * @return {Boolean} - */ - setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { - var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; - prop = Utils.toCamelCase(prop); + if (this.dom.lineContainer.parentNode) { + this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); + } + }; + + /** + * Set a range (start and end) + * @param end + * @param start + * @param end + */ + DataAxis.prototype.setRange = function (start, end) { + if (this.master == false && this.options.alignZeros == true && this.zeroCrossing != -1) { + if (start > 0) { + start = 0; + } + } + this.range.start = start; + this.range.end = end; + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + DataAxis.prototype.redraw = function () { + var changeCalled = false; + var activeGroups = 0; + + // Make sure the line container adheres to the vertical scrolling. + this.dom.lineContainer.style.top = this.body.domProps.scrollTop + 'px'; + + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; + } + } + } + if (this.amountOfGroups == 0 || activeGroups == 0) { + this.hide(); + } + else { + this.show(); + this.height = Number(this.linegraphSVG.style.height.replace("px","")); + + // svg offsetheight did not work in firefox and explorer... + this.dom.lineContainer.style.height = this.height + 'px'; + this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; - for(var i = 0; i < prefixes.length; i++) { - var p = prop; - // prefixes - if(prefixes[i]) { - p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); - } + var props = this.props; + var frame = this.dom.frame; - // test the style - if(p in element.style) { - element.style[p] = (toggle == null || toggle) && value || ''; - break; - } - } - }, + // update classname + frame.className = 'dataaxis'; - /** - * toggle browser default behavior by setting css properties. - * `userSelect='none'` also sets `element.onselectstart` to false - * `userDrag='none'` also sets `element.ondragstart` to false - * - * @method toggleBehavior - * @param {HtmlElement} element - * @param {Object} props - * @param {Boolean} [toggle=true] - */ - toggleBehavior: function toggleBehavior(element, props, toggle) { - if(!props || !element || !element.style) { - return; - } + // calculate character width and height + this._calculateCharSize(); - // set the css properties - Utils.each(props, function(value, prop) { - Utils.setPrefixedCss(element, prop, value, toggle); - }); + var orientation = this.options.orientation; + var showMinorLabels = this.options.showMinorLabels; + var showMajorLabels = this.options.showMajorLabels; - var falseFn = toggle && function() { - return false; - }; + // determine the width and height of the elements for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; - // also the disable onselectstart - if(props.userSelect == 'none') { - element.onselectstart = falseFn; - } - // and disable ondragstart - if(props.userDrag == 'none') { - element.ondragstart = falseFn; - } - }, + props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; + props.minorLineHeight = 1; + props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; + props.majorLineHeight = 1; - /** - * convert a string with underscores to camelCase - * so prevent_default becomes preventDefault - * @param {String} str - * @return {String} camelCaseStr - */ - toCamelCase: function toCamelCase(str) { - return str.replace(/[_-]([a-z])/g, function(s) { - return s[1].toUpperCase(); - }); + // take frame offline while updating (is almost twice as fast) + if (orientation == 'left') { + frame.style.top = '0'; + frame.style.left = '0'; + frame.style.bottom = ''; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; } - }; + else { // right + frame.style.top = ''; + frame.style.bottom = '0'; + frame.style.left = '0'; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + } + changeCalled = this._redrawLabels(); + if (this.options.icons == true) { + this._redrawGroupIcons(); + } + else { + this._cleanupIcons(); + } + + this._redrawTitle(orientation); + } + return changeCalled; + }; /** - * @module hammer - */ - /** - * @class Event - * @static + * Repaint major and minor text labels and vertical grid lines + * @private */ - var Event = Hammer.event = { - /** - * when touch events have been fired, this is true - * this is used to stop mouse events - * @property prevent_mouseevents - * @private - * @type {Boolean} - */ - preventMouseEvents: false, + DataAxis.prototype._redrawLabels = function () { + DOMutil.prepareElements(this.DOMelements.lines); + DOMutil.prepareElements(this.DOMelements.labels); - /** - * if EVENT_START has been fired - * @property started - * @private - * @type {Boolean} - */ - started: false, + var orientation = this.options['orientation']; - /** - * when the mouse is hold down, this is true - * @property should_detect - * @private - * @type {Boolean} - */ - shouldDetect: false, + // calculate range and step (step such that we have space for 7 characters per label) + var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; - /** - * simple event binder with a hook and support for multiple types - * @method on - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - * @param {Function} [hook] - * @param {Object} hook.type - */ - on: function on(element, type, handler, hook) { - var types = type.split(' '); - Utils.each(types, function(type) { - Utils.on(element, type, handler); - hook && hook(type); - }); - }, + var step = new DataStep( + this.range.start, + this.range.end, + minimumStep, + this.dom.frame.offsetHeight, + this.options.customRange[this.options.orientation], + this.master == false && this.options.alignZeros // doess the step have to align zeros? only if not master and the options is on + ); - /** - * simple event unbinder with a hook and support for multiple types - * @method off - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - * @param {Function} [hook] - * @param {Object} hook.type - */ - off: function off(element, type, handler, hook) { - var types = type.split(' '); - Utils.each(types, function(type) { - Utils.off(element, type, handler); - hook && hook(type); - }); - }, + this.step = step; + // get the distance in pixels for a step + // dead space is space that is "left over" after a step + var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); - /** - * the core touch event handler. - * this finds out if we should to detect gestures - * @method onTouch - * @param {HTMLElement} element - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Function} handler - * @return onTouchHandler {Function} the core event handler - */ - onTouch: function onTouch(element, eventType, handler) { - var self = this; + this.stepPixels = stepPixels; - var onTouchHandler = function onTouchHandler(ev) { - var srcType = ev.type.toLowerCase(), - isPointer = Hammer.HAS_POINTEREVENTS, - isMouse = Utils.inStr(srcType, 'mouse'), - triggerType; + var amountOfSteps = this.height / stepPixels; + var stepDifference = 0; - // if we are in a mouseevent, but there has been a touchevent triggered in this session - // we want to do nothing. simply break out of the event. - if(isMouse && self.preventMouseEvents) { - return; + // the slave axis needs to use the same horizontal lines as the master axis. + if (this.master == false) { + stepPixels = this.stepPixelsForced; + stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); + for (var i = 0; i < 0.5 * stepDifference; i++) { + step.previous(); + } + amountOfSteps = this.height / stepPixels; - // mousebutton must be down - } else if(isMouse && eventType == EVENT_START && ev.button === 0) { - self.preventMouseEvents = false; - self.shouldDetect = true; - } else if(isPointer && eventType == EVENT_START) { - self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); - // just a valid start event, but no mouse - } else if(!isMouse && eventType == EVENT_START) { - self.preventMouseEvents = true; - self.shouldDetect = true; - } + if (this.zeroCrossing != -1 && this.options.alignZeros == true) { + var zeroStepDifference = (step.marginEnd / step.step) - this.zeroCrossing; + if (zeroStepDifference > 0) { + for (var i = 0; i < zeroStepDifference; i++) {step.next();} + } + else if (zeroStepDifference < 0) { + for (var i = 0; i < -zeroStepDifference; i++) {step.previous();} + } + } + } + else { + amountOfSteps += 0.25; + } - // update the pointer event before entering the detection - if(isPointer && eventType != EVENT_END) { - PointerEvent.updatePointer(eventType, ev); - } - // we are in a touch/down state, so allowed detection of gestures - if(self.shouldDetect) { - triggerType = self.doDetect.call(self, ev, eventType, element, handler); - } + this.valueAtZero = step.marginEnd; + var marginStartPos = 0; - // ...and we are done with the detection - // so reset everything to start each detection totally fresh - if(triggerType == EVENT_END) { - self.preventMouseEvents = false; - self.shouldDetect = false; - PointerEvent.reset(); - // update the pointerevent object after the detection - } + // do not draw the first label + var max = 1; - if(isPointer && eventType == EVENT_END) { - PointerEvent.updatePointer(eventType, ev); - } - }; + // Get the number of decimal places + var decimals; + if(this.options.format[orientation] !== undefined) { + decimals = this.options.format[orientation].decimals; + } - this.on(element, EVENT_TYPES[eventType], onTouchHandler); - return onTouchHandler; - }, + this.maxLabelSize = 0; + var y = 0; + while (max < Math.round(amountOfSteps)) { + step.next(); + y = Math.round(max * stepPixels); + marginStartPos = max * stepPixels; + var isMajor = step.isMajor(); - /** - * the core detection method - * this finds out what hammer-touch-events to trigger - * @method doDetect - * @param {Object} ev - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {HTMLElement} element - * @param {Function} handler - * @return {String} triggerType matches `EVENT_START|MOVE|END` - */ - doDetect: function doDetect(ev, eventType, element, handler) { - var touchList = this.getTouchList(ev, eventType); - var touchListLength = touchList.length; - var triggerType = eventType; - var triggerChange = touchList.trigger; // used by fakeMultitouch plugin - var changedLength = touchListLength; + if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { + this._redrawLabel(y - 2, step.getCurrent(decimals), orientation, 'yAxis minor', this.props.minorCharHeight); + } - // at each touchstart-like event we want also want to trigger a TOUCH event... - if(eventType == EVENT_START) { - triggerChange = EVENT_TOUCH; - // ...the same for a touchend-like event - } else if(eventType == EVENT_END) { - triggerChange = EVENT_RELEASE; + if (isMajor && this.options['showMajorLabels'] && this.master == true || + this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { + if (y >= 0) { + this._redrawLabel(y - 2, step.getCurrent(decimals), orientation, 'yAxis major', this.props.majorCharHeight); + } + this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); + } + else { + this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); + } - // keep track of how many touches have been removed - changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); - } + if (this.master == true && step.current == 0) { + this.zeroCrossing = max; + } - // after there are still touches on the screen, - // we just want to trigger a MOVE event. so change the START or END to a MOVE - // but only after detection has been started, the first time we actualy want a START - if(changedLength > 0 && this.started) { - triggerType = EVENT_MOVE; - } + max++; + } - // detection has been started, we keep track of this, see above - this.started = true; + if (this.master == false) { + this.conversionFactor = y / (this.valueAtZero - step.current); + } + else { + this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; + } - // generate some event data, some basic information - var evData = this.collectEventData(element, triggerType, touchList, ev); + // Note that title is rotated, so we're using the height, not width! + var titleWidth = 0; + if (this.options.title[orientation] !== undefined && this.options.title[orientation].text !== undefined) { + titleWidth = this.props.titleCharHeight; + } + var offset = this.options.icons == true ? Math.max(this.options.iconWidth, titleWidth) + this.options.labelOffsetX + 15 : titleWidth + this.options.labelOffsetX + 15; - // trigger the triggerType event before the change (TOUCH, RELEASE) events - // but the END event should be at last - if(eventType != EVENT_END) { - handler.call(Detection, evData); - } + // this will resize the yAxis to accommodate the labels. + if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { + this.width = this.maxLabelSize + offset; + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + return true; + } + // this will resize the yAxis if it is too big for the labels. + else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { + this.width = Math.max(this.minWidth,this.maxLabelSize + offset); + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + return true; + } + else { + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + return false; + } + }; - // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed - if(triggerChange) { - evData.changedLength = changedLength; - evData.eventType = triggerChange; + DataAxis.prototype.convertValue = function (value) { + var invertedValue = this.valueAtZero - value; + var convertedValue = invertedValue * this.conversionFactor; + return convertedValue; + }; - handler.call(Detection, evData); + /** + * Create a label for the axis at position x + * @private + * @param y + * @param text + * @param orientation + * @param className + * @param characterHeight + */ + DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { + // reuse redundant label + var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); + label.className = className; + label.innerHTML = text; + if (orientation == 'left') { + label.style.left = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "right"; + } + else { + label.style.right = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "left"; + } - evData.eventType = triggerType; - delete evData.changedLength; - } + label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; - // trigger the END event - if(triggerType == EVENT_END) { - handler.call(Detection, evData); + text += ''; - // ...and we are done with the detection - // so reset everything to start each detection totally fresh - this.started = false; - } + var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); + if (this.maxLabelSize < text.length * largestWidth) { + this.maxLabelSize = text.length * largestWidth; + } + }; - return triggerType; - }, + /** + * Create a minor line for the axis at position y + * @param y + * @param orientation + * @param className + * @param offset + * @param width + */ + DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { + if (this.master == true) { + var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); + line.className = className; + line.innerHTML = ''; - /** - * we have different events for each device/browser - * determine what we need and set them in the EVENT_TYPES constant - * the `onTouch` method is bind to these properties. - * @method determineEventTypes - * @return {Object} events - */ - determineEventTypes: function determineEventTypes() { - var types; - if(Hammer.HAS_POINTEREVENTS) { - if(window.PointerEvent) { - types = [ - 'pointerdown', - 'pointermove', - 'pointerup pointercancel lostpointercapture' - ]; - } else { - types = [ - 'MSPointerDown', - 'MSPointerMove', - 'MSPointerUp MSPointerCancel MSLostPointerCapture' - ]; - } - } else if(Hammer.NO_MOUSEEVENTS) { - types = [ - 'touchstart', - 'touchmove', - 'touchend touchcancel' - ]; - } else { - types = [ - 'touchstart mousedown', - 'touchmove mousemove', - 'touchend touchcancel mouseup' - ]; - } + if (orientation == 'left') { + line.style.left = (this.width - offset) + 'px'; + } + else { + line.style.right = (this.width - offset) + 'px'; + } - EVENT_TYPES[EVENT_START] = types[0]; - EVENT_TYPES[EVENT_MOVE] = types[1]; - EVENT_TYPES[EVENT_END] = types[2]; - return EVENT_TYPES; - }, + line.style.width = width + 'px'; + line.style.top = y + 'px'; + } + }; + + /** + * Create a title for the axis + * @private + * @param orientation + */ + DataAxis.prototype._redrawTitle = function (orientation) { + DOMutil.prepareElements(this.DOMelements.title); + + // Check if the title is defined for this axes + if (this.options.title[orientation] !== undefined && this.options.title[orientation].text !== undefined) { + var title = DOMutil.getDOMElement('div', this.DOMelements.title, this.dom.frame); + title.className = 'yAxis title ' + orientation; + title.innerHTML = this.options.title[orientation].text; + + // Add style - if provided + if (this.options.title[orientation].style !== undefined) { + util.addCssText(title, this.options.title[orientation].style); + } + + if (orientation == 'left') { + title.style.left = this.props.titleCharHeight + 'px'; + } + else { + title.style.right = this.props.titleCharHeight + 'px'; + } + + title.style.width = this.height + 'px'; + } + + // we need to clean up in case we did not use all elements. + DOMutil.cleanupElements(this.DOMelements.title); + }; - /** - * create touchList depending on the event - * @method getTouchList - * @param {Object} ev - * @param {String} eventType - * @return {Array} touches - */ - getTouchList: function getTouchList(ev, eventType) { - // get the fake pointerEvent touchlist - if(Hammer.HAS_POINTEREVENTS) { - return PointerEvent.getTouchList(); - } - // get the touchlist - if(ev.touches) { - if(eventType == EVENT_MOVE) { - return ev.touches; - } - var identifiers = []; - var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); - var touchList = []; - Utils.each(concat, function(touch) { - if(Utils.inArray(identifiers, touch.identifier) === false) { - touchList.push(touch); - } - identifiers.push(touch.identifier); - }); + /** + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. + * @private + */ + DataAxis.prototype._calculateCharSize = function () { + // determine the char width and height on the minor axis + if (!('minorCharHeight' in this.props)) { + var textMinor = document.createTextNode('0'); + var measureCharMinor = document.createElement('div'); + measureCharMinor.className = 'yAxis minor measure'; + measureCharMinor.appendChild(textMinor); + this.dom.frame.appendChild(measureCharMinor); - return touchList; - } + this.props.minorCharHeight = measureCharMinor.clientHeight; + this.props.minorCharWidth = measureCharMinor.clientWidth; - // make fake touchList from mouse position - ev.identifier = 1; - return [ev]; - }, + this.dom.frame.removeChild(measureCharMinor); + } - /** - * collect basic event data - * @method collectEventData - * @param {HTMLElement} element - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Array} touches - * @param {Object} ev - * @return {Object} ev - */ - collectEventData: function collectEventData(element, eventType, touches, ev) { - // find out pointerType - var pointerType = POINTER_TOUCH; - if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { - pointerType = POINTER_MOUSE; - } else if(PointerEvent.matchType(POINTER_PEN, ev)) { - pointerType = POINTER_PEN; - } + if (!('majorCharHeight' in this.props)) { + var textMajor = document.createTextNode('0'); + var measureCharMajor = document.createElement('div'); + measureCharMajor.className = 'yAxis major measure'; + measureCharMajor.appendChild(textMajor); + this.dom.frame.appendChild(measureCharMajor); - return { - center: Utils.getCenter(touches), - timeStamp: Date.now(), - target: ev.target, - touches: touches, - eventType: eventType, - pointerType: pointerType, - srcEvent: ev, + this.props.majorCharHeight = measureCharMajor.clientHeight; + this.props.majorCharWidth = measureCharMajor.clientWidth; - /** - * prevent the browser default actions - * mostly used to disable scrolling of the browser - */ - preventDefault: function() { - var srcEvent = this.srcEvent; - srcEvent.preventManipulation && srcEvent.preventManipulation(); - srcEvent.preventDefault && srcEvent.preventDefault(); - }, + this.dom.frame.removeChild(measureCharMajor); + } - /** - * stop bubbling the event up to its parents - */ - stopPropagation: function() { - this.srcEvent.stopPropagation(); - }, + if (!('titleCharHeight' in this.props)) { + var textTitle = document.createTextNode('0'); + var measureCharTitle = document.createElement('div'); + measureCharTitle.className = 'yAxis title measure'; + measureCharTitle.appendChild(textTitle); + this.dom.frame.appendChild(measureCharTitle); - /** - * immediately stop gesture detection - * might be useful after a swipe was detected - * @return {*} - */ - stopDetect: function() { - return Detection.stopDetect(); - } - }; - } - }; + this.props.titleCharHeight = measureCharTitle.clientHeight; + this.props.titleCharWidth = measureCharTitle.clientWidth; + this.dom.frame.removeChild(measureCharTitle); + } + }; /** - * @module hammer - * - * @class PointerEvent - * @static + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - var PointerEvent = Hammer.PointerEvent = { - /** - * holds all pointers, by `identifier` - * @property pointers - * @type {Object} - */ - pointers: {}, + DataAxis.prototype.snap = function(date) { + return this.step.snap(date); + }; - /** - * get the pointers as an array - * @method getTouchList - * @return {Array} touchlist - */ - getTouchList: function getTouchList() { - var touchlist = []; - // we can use forEach since pointerEvents only is in IE10 - Utils.each(this.pointers, function(pointer) { - touchlist.push(pointer); - }); - return touchlist; - }, + module.exports = DataAxis; - /** - * update the position of a pointer - * @method updatePointer - * @param {String} eventType matches `EVENT_START|MOVE|END` - * @param {Object} pointerEvent - */ - updatePointer: function updatePointer(eventType, pointerEvent) { - if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { - delete this.pointers[pointerEvent.pointerId]; - } else { - pointerEvent.identifier = pointerEvent.pointerId; - this.pointers[pointerEvent.pointerId] = pointerEvent; - } - }, - /** - * check if ev matches pointertype - * @method matchType - * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` - * @param {PointerEvent} ev - */ - matchType: function matchType(pointerType, ev) { - if(!ev.pointerType) { - return false; - } +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { - var pt = ev.pointerType, - types = {}; + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var Line = __webpack_require__(51); + var Bar = __webpack_require__(52); + var Points = __webpack_require__(53); - types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); - types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); - types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); - return types[pointerType]; - }, + /** + * /** + * @param {object} group | the object of the group from the dataset + * @param {string} groupId | ID of the group + * @param {object} options | the default options + * @param {array} groupsUsingDefaultStyles | this array has one entree. + * It is passed as an array so it is passed by reference. + * It enumerates through the default styles + * @constructor + */ + function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { + this.id = groupId; + var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] + this.options = util.selectiveBridgeObject(fields,options); + this.usingDefaultStyle = group.className === undefined; + this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; + this.zeroPosition = 0; + this.update(group); + if (this.usingDefaultStyle == true) { + this.groupsUsingDefaultStyles[0] += 1; + } + this.itemsData = []; + this.visible = group.visible === undefined ? true : group.visible; + } - /** - * reset the stored pointers - * @method reset - */ - reset: function resetList() { - this.pointers = {}; + + /** + * this loads a reference to all items in this group into this group. + * @param {array} items + */ + GraphGroup.prototype.setItems = function(items) { + if (items != null) { + this.itemsData = items; + if (this.options.sort == true) { + this.itemsData.sort(function (a,b) {return a.x - b.x;}) } + } + else { + this.itemsData = []; + } }; /** - * @module hammer - * - * @class Detection - * @static + * this is used for plotting barcharts, this way, we only have to calculate it once. + * @param pos */ - var Detection = Hammer.detection = { - // contains all registred Hammer.gestures in the correct order - gestures: [], + GraphGroup.prototype.setZeroPosition = function(pos) { + this.zeroPosition = pos; + }; - // data of the current Hammer.gesture detection session - current: null, - // the previous Hammer.gesture session data - // is a full clone of the previous gesture.current object - previous: null, + /** + * set the options of the graph group over the default options. + * @param options + */ + GraphGroup.prototype.setOptions = function(options) { + if (options !== undefined) { + var fields = ['sampling','style','sort','yAxisOrientation','barChart']; + util.selectiveDeepExtend(fields, this.options, options); - // when this becomes true, no gestures are fired - stopped: false, + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); - /** - * start Hammer.gesture detection - * @method startDetect - * @param {Hammer.Instance} inst - * @param {Object} eventData - */ - startDetect: function startDetect(inst, eventData) { - // already busy with a Hammer.gesture detection on an element - if(this.current) { - return; + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } } + } + } + } - this.stopped = false; + if (this.options.style == 'line') { + this.type = new Line(this.id, this.options); + } + else if (this.options.style == 'bar') { + this.type = new Bar(this.id, this.options); + } + else if (this.options.style == 'points') { + this.type = new Points(this.id, this.options); + } + }; - // holds current session - this.current = { - inst: inst, // reference to HammerInstance we're working for - startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc - lastEvent: false, // last eventData - lastCalcEvent: false, // last eventData for calculations. - futureCalcEvent: false, // last eventData for calculations. - lastCalcData: {}, // last lastCalcData - name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc - }; - this.detect(eventData); - }, + /** + * this updates the current group class with the latest group dataset entree, used in _updateGroup in linegraph + * @param group + */ + GraphGroup.prototype.update = function(group) { + this.group = group; + this.content = group.content || 'graph'; + this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; + this.visible = group.visible === undefined ? true : group.visible; + this.style = group.style; + this.setOptions(group.options); + }; - /** - * Hammer.gesture detection - * @method detect - * @param {Object} eventData - * @return {any} - */ - detect: function detect(eventData) { - if(!this.current || this.stopped) { - return; - } - // extend event data with calculations about scale, distance etc - eventData = this.extendEventData(eventData); + /** + * draw the icon for the legend. + * + * @param x + * @param y + * @param JSONcontainer + * @param SVGcontainer + * @param iconWidth + * @param iconHeight + */ + GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; - // hammer instance and instance options - var inst = this.current.inst, - instOptions = inst.options; + var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2*fillHeight); + outline.setAttributeNS(null, "class", "outline"); - // call Hammer.gesture handlers - Utils.each(this.gestures, function triggerGesture(gesture) { - // only when the instance options have enabled this gesture - if(!this.stopped && inst.enabled && instOptions[gesture.name]) { - gesture.handler.call(gesture, eventData, inst); - } - }, this); + if (this.options.style == 'line') { + path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + path.setAttributeNS(null, "class", this.className); + if(this.style !== undefined) { + path.setAttributeNS(null, "style", this.style); + } - // store as previous event event - if(this.current) { - this.current.lastEvent = eventData; - } + path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); + if (this.options.shaded.enabled == true) { + fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + if (this.options.shaded.orientation == 'top') { + fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + + "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); + } + else { + fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + + "L"+x+"," + (y + fillHeight) + " " + + "L"+ (x + iconWidth) + "," + (y + fillHeight) + + "L"+ (x + iconWidth) + ","+y); + } + fillPath.setAttributeNS(null, "class", this.className + " iconFill"); + } - if(eventData.eventType == EVENT_END) { - this.stopDetect(); - } + if (this.options.drawPoints.enabled == true) { + DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); + } + } + else { + var barWidth = Math.round(0.3 * iconWidth); + var bar1Height = Math.round(0.4 * iconHeight); + var bar2Height = Math.round(0.75 * iconHeight); - return eventData; - }, + var offset = Math.round((iconWidth - (2 * barWidth))/3); - /** - * clear the Hammer.gesture vars - * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected - * to stop other Hammer.gestures from being fired - * @method stopDetect - */ - stopDetect: function stopDetect() { - // clone current data to the store as the previous gesture - // used for the double tap gesture, since this is an other gesture detect session - this.previous = Utils.extend({}, this.current); + DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); + DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + } + }; - // reset the current - this.current = null; - this.stopped = true; - }, - /** - * calculate velocity, angle and direction - * @method getVelocityData - * @param {Object} ev - * @param {Object} center - * @param {Number} deltaTime - * @param {Number} deltaX - * @param {Number} deltaY - */ - getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { - var cur = this.current, - recalc = false, - calcEv = cur.lastCalcEvent, - calcData = cur.lastCalcData; + /** + * return the legend entree for this group. + * + * @param iconWidth + * @param iconHeight + * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} + */ + GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { + var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); + return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; + } - if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { - center = calcEv.center; - deltaTime = ev.timeStamp - calcEv.timeStamp; - deltaX = ev.center.clientX - calcEv.center.clientX; - deltaY = ev.center.clientY - calcEv.center.clientY; - recalc = true; - } + GraphGroup.prototype.getYRange = function(groupData) { + return this.type.getYRange(groupData); + } - if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { - cur.futureCalcEvent = ev; - } + GraphGroup.prototype.draw = function(dataset, group, framework) { + this.type.draw(dataset, group, framework); + } - if(!cur.lastCalcEvent || recalc) { - calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); - calcData.angle = Utils.getAngle(center, ev.center); - calcData.direction = Utils.getDirection(center, ev.center); - cur.lastCalcEvent = cur.futureCalcEvent || ev; - cur.futureCalcEvent = ev; - } + module.exports = GraphGroup; - ev.velocityX = calcData.velocity.x; - ev.velocityY = calcData.velocity.y; - ev.interimAngle = calcData.angle; - ev.interimDirection = calcData.direction; - }, - /** - * extend eventData for Hammer.gestures - * @method extendEventData - * @param {Object} ev - * @return {Object} ev - */ - extendEventData: function extendEventData(ev) { - var cur = this.current, - startEv = cur.startEvent, - lastEv = cur.lastEvent || startEv; +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var stack = __webpack_require__(18); + var RangeItem = __webpack_require__(35); + + /** + * @constructor Group + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet + */ + function Group (groupId, data, itemSet) { + this.groupId = groupId; + this.subgroups = {}; + this.subgroupIndex = 0; + this.subgroupOrderer = data && data.subgroupOrder; + this.itemSet = itemSet; + + this.dom = {}; + this.props = { + label: { + width: 0, + height: 0 + } + }; + this.className = null; - // update the start touchlist to calculate the scale/rotation - if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { - startEv.touches = []; - Utils.each(ev.touches, function(touch) { - startEv.touches.push({ - clientX: touch.clientX, - clientY: touch.clientY - }); - }); - } + this.items = {}; // items filtered by groupId of this group + this.visibleItems = []; // items currently visible in window + this.orderedItems = { + byStart: [], + byEnd: [] + }; + this.checkRangedItems = false; // needed to refresh the ranged items if the window is programatically changed with NO overlap. + var me = this; + this.itemSet.body.emitter.on("checkRangedItems", function () { + me.checkRangedItems = true; + }) - var deltaTime = ev.timeStamp - startEv.timeStamp, - deltaX = ev.center.clientX - startEv.center.clientX, - deltaY = ev.center.clientY - startEv.center.clientY; + this._create(); - this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); + this.setData(data); + } - Utils.extend(ev, { - startEvent: startEv, + /** + * Create DOM elements for the group + * @private + */ + Group.prototype._create = function() { + var label = document.createElement('div'); + label.className = 'vlabel'; + this.dom.label = label; - deltaTime: deltaTime, - deltaX: deltaX, - deltaY: deltaY, + var inner = document.createElement('div'); + inner.className = 'inner'; + label.appendChild(inner); + this.dom.inner = inner; - distance: Utils.getDistance(startEv.center, ev.center), - angle: Utils.getAngle(startEv.center, ev.center), - direction: Utils.getDirection(startEv.center, ev.center), - scale: Utils.getScale(startEv.touches, ev.touches), - rotation: Utils.getRotation(startEv.touches, ev.touches) - }); + var foreground = document.createElement('div'); + foreground.className = 'group'; + foreground['timeline-group'] = this; + this.dom.foreground = foreground; - return ev; - }, + this.dom.background = document.createElement('div'); + this.dom.background.className = 'group'; - /** - * register new gesture - * @method register - * @param {Object} gesture object, see `gestures/` for documentation - * @return {Array} gestures - */ - register: function register(gesture) { - // add an enable gesture options if there is no given - var options = gesture.defaults || {}; - if(options[gesture.name] === undefined) { - options[gesture.name] = true; - } + this.dom.axis = document.createElement('div'); + this.dom.axis.className = 'group'; - // extend Hammer default options with the Hammer.gesture options - Utils.extend(Hammer.defaults, options, true); + // create a hidden marker to detect when the Timelines container is attached + // to the DOM, or the style of a parent of the Timeline is changed from + // display:none is changed to visible. + this.dom.marker = document.createElement('div'); + this.dom.marker.style.visibility = 'hidden'; // TODO: ask jos why this is not none? + this.dom.marker.innerHTML = '?'; + this.dom.background.appendChild(this.dom.marker); + }; - // set its index - gesture.index = gesture.index || 1000; + /** + * Set the group data for this group + * @param {Object} data Group data, can contain properties content and className + */ + Group.prototype.setData = function(data) { + // update contents + var content = data && data.content; + if (content instanceof Element) { + this.dom.inner.appendChild(content); + } + else if (content !== undefined && content !== null) { + this.dom.inner.innerHTML = content; + } + else { + this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null + } - // add Hammer.gesture to the list - this.gestures.push(gesture); + // update title + this.dom.label.title = data && data.title || ''; - // sort the list by index - this.gestures.sort(function(a, b) { - if(a.index < b.index) { - return -1; - } - if(a.index > b.index) { - return 1; - } - return 0; - }); + if (!this.dom.inner.firstChild) { + util.addClassName(this.dom.inner, 'hidden'); + } + else { + util.removeClassName(this.dom.inner, 'hidden'); + } - return this.gestures; + // update className + var className = data && data.className || null; + if (className != this.className) { + if (this.className) { + util.removeClassName(this.dom.label, this.className); + util.removeClassName(this.dom.foreground, this.className); + util.removeClassName(this.dom.background, this.className); + util.removeClassName(this.dom.axis, this.className); } - }; + util.addClassName(this.dom.label, className); + util.addClassName(this.dom.foreground, className); + util.addClassName(this.dom.background, className); + util.addClassName(this.dom.axis, className); + this.className = className; + } + // update style + if (this.style) { + util.removeCssText(this.dom.label, this.style); + this.style = null; + } + if (data && data.style) { + util.addCssText(this.dom.label, data.style); + this.style = data.style; + } + }; /** - * @module hammer + * Get the width of the group label + * @return {number} width */ + Group.prototype.getLabelWidth = function() { + return this.props.label.width; + }; + /** - * create new hammer instance - * all methods should return the instance itself, so it is chainable. - * - * @class Instance - * @constructor - * @param {HTMLElement} element - * @param {Object} [options={}] options are merged with `Hammer.defaults` - * @return {Hammer.Instance} + * Repaint this group + * @param {{start: number, end: number}} range + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @param {boolean} [restack=false] Force restacking of all items + * @return {boolean} Returns true if the group is resized */ - Hammer.Instance = function(element, options) { - var self = this; - - // setup HammerJS window events and register all gestures - // this also sets up the default options - setup(); + Group.prototype.redraw = function(range, margin, restack) { + var resized = false; - /** - * @property element - * @type {HTMLElement} - */ - this.element = element; + this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); - /** - * @property enabled - * @type {Boolean} - * @protected - */ - this.enabled = true; + // force recalculation of the height of the items when the marker height changed + // (due to the Timeline being attached to the DOM or changed from display:none to visible) + var markerHeight = this.dom.marker.clientHeight; + if (markerHeight != this.lastMarkerHeight) { + this.lastMarkerHeight = markerHeight; - /** - * options, merged with the defaults - * options with an _ are converted to camelCase - * @property options - * @type {Object} - */ - Utils.each(options, function(value, name) { - delete options[name]; - options[Utils.toCamelCase(name)] = value; + util.forEach(this.items, function (item) { + item.dirty = true; + if (item.displayed) item.redraw(); }); - this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); + restack = true; + } - // add some css to the element to prevent the browser from doing its native behavoir - if(this.options.behavior) { - Utils.toggleBehavior(this.element, this.options.behavior, true); - } + // reposition visible items vertically + if (this.itemSet.options.stack) { // TODO: ugly way to access options... + stack.stack(this.visibleItems, margin, restack); + } + else { // no stacking + stack.nostack(this.visibleItems, margin, this.subgroups); + } - /** - * event start handler on the element to start the detection - * @property eventStartHandler - * @type {Object} - */ - this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { - if(self.enabled && ev.eventType == EVENT_START) { - Detection.startDetect(self, ev); - } else if(ev.eventType == EVENT_TOUCH) { - Detection.detect(ev); - } - }); + // recalculate the height of the group + var height = this._calculateHeight(margin); - /** - * keep a list of user event handlers which needs to be removed when calling 'dispose' - * @property eventHandlers - * @type {Array} - */ - this.eventHandlers = []; - }; + // calculate actual size and position + var foreground = this.dom.foreground; + this.top = foreground.offsetTop; + this.left = foreground.offsetLeft; + this.width = foreground.offsetWidth; + resized = util.updateProperty(this, 'height', height) || resized; - Hammer.Instance.prototype = { - /** - * bind events to the instance - * @method on - * @chainable - * @param {String} gestures multiple gestures by splitting with a space - * @param {Function} handler - * @param {Object} handler.ev event object - */ - on: function onEvent(gestures, handler) { - var self = this; - Event.on(self.element, gestures, handler, function(type) { - self.eventHandlers.push({ gesture: type, handler: handler }); - }); - return self; - }, + // recalculate size of label + resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized; + resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized; - /** - * unbind events to the instance - * @method off - * @chainable - * @param {String} gestures - * @param {Function} handler - */ - off: function offEvent(gestures, handler) { - var self = this; + // apply new height + this.dom.background.style.height = height + 'px'; + this.dom.foreground.style.height = height + 'px'; + this.dom.label.style.height = height + 'px'; - Event.off(self.element, gestures, handler, function(type) { - var index = Utils.inArray({ gesture: type, handler: handler }); - if(index !== false) { - self.eventHandlers.splice(index, 1); - } - }); - return self; - }, + // update vertical position of items after they are re-stacked and the height of the group is calculated + for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { + var item = this.visibleItems[i]; + item.repositionY(margin); + } - /** - * trigger gesture event - * @method trigger - * @chainable - * @param {String} gesture - * @param {Object} [eventData] - */ - trigger: function triggerEvent(gesture, eventData) { - // optional - if(!eventData) { - eventData = {}; - } + return resized; + }; - // create DOM event - var event = Hammer.DOCUMENT.createEvent('Event'); - event.initEvent(gesture, true, true); - event.gesture = eventData; + /** + * recalculate the height of the group + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @returns {number} Returns the height + * @private + */ + Group.prototype._calculateHeight = function (margin) { + // recalculate the height of the group + var height; + var visibleItems = this.visibleItems; + //var visibleSubgroups = []; + //this.visibleSubgroups = 0; + this.resetSubgroups(); + var me = this; + if (visibleItems.length) { + var min = visibleItems[0].top; + var max = visibleItems[0].top + visibleItems[0].height; + util.forEach(visibleItems, function (item) { + min = Math.min(min, item.top); + max = Math.max(max, (item.top + item.height)); + if (item.data.subgroup !== undefined) { + me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height,item.height); + me.subgroups[item.data.subgroup].visible = true; + //if (visibleSubgroups.indexOf(item.data.subgroup) == -1){ + // visibleSubgroups.push(item.data.subgroup); + // me.visibleSubgroups += 1; + //} + } + }); + if (min > margin.axis) { + // there is an empty gap between the lowest item and the axis + var offset = min - margin.axis; + max -= offset; + util.forEach(visibleItems, function (item) { + item.top -= offset; + }); + } + height = max + margin.item.vertical / 2; + } + else { + height = margin.axis + margin.item.vertical; + } + height = Math.max(height, this.props.label.height); - // trigger on the target if it is in the instance element, - // this is for event delegation tricks - var element = this.element; - if(Utils.hasParent(eventData.target, element)) { - element = eventData.target; - } + return height; + }; - element.dispatchEvent(event); - return this; - }, + /** + * Show this group: attach to the DOM + */ + Group.prototype.show = function() { + if (!this.dom.label.parentNode) { + this.itemSet.dom.labelSet.appendChild(this.dom.label); + } - /** - * enable of disable hammer.js detection - * @method enable - * @chainable - * @param {Boolean} state - */ - enable: function enable(state) { - this.enabled = state; - return this; - }, + if (!this.dom.foreground.parentNode) { + this.itemSet.dom.foreground.appendChild(this.dom.foreground); + } - /** - * dispose this hammer instance - * @method dispose - * @return {Null} - */ - dispose: function dispose() { - var i, eh; + if (!this.dom.background.parentNode) { + this.itemSet.dom.background.appendChild(this.dom.background); + } - // undo all changes made by stop_browser_behavior - Utils.toggleBehavior(this.element, this.options.behavior, false); + if (!this.dom.axis.parentNode) { + this.itemSet.dom.axis.appendChild(this.dom.axis); + } + }; - // unbind all custom event handlers - for(i = -1; (eh = this.eventHandlers[++i]);) { - Utils.off(this.element, eh.gesture, eh.handler); - } + /** + * Hide this group: remove from the DOM + */ + Group.prototype.hide = function() { + var label = this.dom.label; + if (label.parentNode) { + label.parentNode.removeChild(label); + } - this.eventHandlers = []; + var foreground = this.dom.foreground; + if (foreground.parentNode) { + foreground.parentNode.removeChild(foreground); + } - // unbind the start event listener - Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); + var background = this.dom.background; + if (background.parentNode) { + background.parentNode.removeChild(background); + } - return null; - } + var axis = this.dom.axis; + if (axis.parentNode) { + axis.parentNode.removeChild(axis); + } }; - - /** - * @module gestures - */ - /** - * Move with x fingers (default 1) around on the page. - * Preventing the default browser behavior is a good way to improve feel and working. - * ```` - * hammertime.on("drag", function(ev) { - * console.log(ev); - * ev.gesture.preventDefault(); - * }); - * ```` - * - * @class Drag - * @static - */ - /** - * @event drag - * @param {Object} ev - */ - /** - * @event dragstart - * @param {Object} ev - */ - /** - * @event dragend - * @param {Object} ev - */ - /** - * @event drapleft - * @param {Object} ev - */ - /** - * @event dragright - * @param {Object} ev - */ - /** - * @event dragup - * @param {Object} ev - */ /** - * @event dragdown - * @param {Object} ev + * Add an item to the group + * @param {Item} item */ + Group.prototype.add = function(item) { + this.items[item.id] = item; + item.setParent(this); + + // add to + if (item.data.subgroup !== undefined) { + if (this.subgroups[item.data.subgroup] === undefined) { + this.subgroups[item.data.subgroup] = {height:0, visible: false, index:this.subgroupIndex, items: []}; + this.subgroupIndex++; + } + this.subgroups[item.data.subgroup].items.push(item); + } + this.orderSubgroups(); + + if (this.visibleItems.indexOf(item) == -1) { + var range = this.itemSet.body.range; // TODO: not nice accessing the range like this + this._checkIfVisible(item, this.visibleItems, range); + } + }; + + Group.prototype.orderSubgroups = function() { + if (this.subgroupOrderer !== undefined) { + var sortArray = []; + if (typeof this.subgroupOrderer == 'string') { + for (var subgroup in this.subgroups) { + sortArray.push({subgroup: subgroup, sortField: this.subgroups[subgroup].items[0].data[this.subgroupOrderer]}) + } + sortArray.sort(function (a, b) { + return a.sortField - b.sortField; + }) + } + else if (typeof this.subgroupOrderer == 'function') { + for (var subgroup in this.subgroups) { + sortArray.push(this.subgroups[subgroup].items[0].data); + } + sortArray.sort(this.subgroupOrderer); + } + + if (sortArray.length > 0) { + for (var i = 0; i < sortArray.length; i++) { + this.subgroups[sortArray[i].subgroup].index = i; + } + } + } + }; + + Group.prototype.resetSubgroups = function() { + for (var subgroup in this.subgroups) { + if (this.subgroups.hasOwnProperty(subgroup)) { + this.subgroups[subgroup].visible = false; + } + } + }; /** - * @param {String} name + * Remove an item from the group + * @param {Item} item */ - (function(name) { - var triggered = false; + Group.prototype.remove = function(item) { + delete this.items[item.id]; + item.setParent(null); - function dragGesture(ev, inst) { - var cur = Detection.current; + // remove from visible items + var index = this.visibleItems.indexOf(item); + if (index != -1) this.visibleItems.splice(index, 1); - // max touches - if(inst.options.dragMaxTouches > 0 && - ev.touches.length > inst.options.dragMaxTouches) { - return; - } + // TODO: also remove from ordered items? + }; - switch(ev.eventType) { - case EVENT_START: - triggered = false; - break; - case EVENT_MOVE: - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.distance < inst.options.dragMinDistance && - cur.name != name) { - return; - } + /** + * Remove an item from the corresponding DataSet + * @param {Item} item + */ + Group.prototype.removeFromDataSet = function(item) { + this.itemSet.removeItem(item.id); + }; - var startCenter = cur.startEvent.center; - // we are dragging! - if(cur.name != name) { - cur.name = name; - if(inst.options.dragDistanceCorrection && ev.distance > 0) { - // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. - // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. - // It might be useful to save the original start point somewhere - var factor = Math.abs(inst.options.dragMinDistance / ev.distance); - startCenter.pageX += ev.deltaX * factor; - startCenter.pageY += ev.deltaY * factor; - startCenter.clientX += ev.deltaX * factor; - startCenter.clientY += ev.deltaY * factor; + /** + * Reorder the items + */ + Group.prototype.order = function() { + var array = util.toArray(this.items); + var startArray = []; + var endArray = []; - // recalculate event data using new start point - ev = Detection.extendEventData(ev); - } - } + for (var i = 0; i < array.length; i++) { + if (array[i].data.end !== undefined) { + endArray.push(array[i]); + } + startArray.push(array[i]); + } + this.orderedItems = { + byStart: startArray, + byEnd: endArray + }; - // lock drag to axis? - if(cur.lastEvent.dragLockToAxis || - ( inst.options.dragLockToAxis && - inst.options.dragLockMinDistance <= ev.distance - )) { - ev.dragLockToAxis = true; - } + stack.orderByStart(this.orderedItems.byStart); + stack.orderByEnd(this.orderedItems.byEnd); + }; - // keep direction on the axis that the drag gesture started on - var lastDirection = cur.lastEvent.direction; - if(ev.dragLockToAxis && lastDirection !== ev.direction) { - if(Utils.isVertical(lastDirection)) { - ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; - } else { - ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - } - // first time, trigger dragstart event - if(!triggered) { - inst.trigger(name + 'start', ev); - triggered = true; - } + /** + * Update the visible items + * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date + * @param {Item[]} visibleItems The previously visible items. + * @param {{start: number, end: number}} range Visible range + * @return {Item[]} visibleItems The new visible items. + * @private + */ + Group.prototype._updateVisibleItems = function(orderedItems, oldVisibleItems, range) { + var visibleItems = []; + var visibleItemsLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems + var interval = (range.end - range.start) / 4; + var lowerBound = range.start - interval; + var upperBound = range.end + interval; + var item, i; - // trigger events - inst.trigger(name, ev); - inst.trigger(name + ev.direction, ev); + // this function is used to do the binary search. + var searchFunction = function (value) { + if (value < lowerBound) {return -1;} + else if (value <= upperBound) {return 0;} + else {return 1;} + } - var isVertical = Utils.isVertical(ev.direction); + // first check if the items that were in view previously are still in view. + // IMPORTANT: this handles the case for the items with startdate before the window and enddate after the window! + // also cleans up invisible items. + if (oldVisibleItems.length > 0) { + for (i = 0; i < oldVisibleItems.length; i++) { + this._checkIfVisibleWithReference(oldVisibleItems[i], visibleItems, visibleItemsLookup, range); + } + } - // block the browser events - if((inst.options.dragBlockVertical && isVertical) || - (inst.options.dragBlockHorizontal && !isVertical)) { - ev.preventDefault(); - } - break; + // we do a binary search for the items that have only start values. + var initialPosByStart = util.binarySearchCustom(orderedItems.byStart, searchFunction, 'data','start'); - case EVENT_RELEASE: - if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { - inst.trigger(name + 'end', ev); - triggered = false; - } - break; + // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the start values. + this._traceVisible(initialPosByStart, orderedItems.byStart, visibleItems, visibleItemsLookup, function (item) { + return (item.data.start < lowerBound || item.data.start > upperBound); + }); - case EVENT_END: - triggered = false; - break; - } + // if the window has changed programmatically without overlapping the old window, the ranged items with start < lowerBound and end > upperbound are not shown. + // We therefore have to brute force check all items in the byEnd list + if (this.checkRangedItems == true) { + this.checkRangedItems = false; + for (i = 0; i < orderedItems.byEnd.length; i++) { + this._checkIfVisibleWithReference(orderedItems.byEnd[i], visibleItems, visibleItemsLookup, range); } + } + else { + // we do a binary search for the items that have defined end times. + var initialPosByEnd = util.binarySearchCustom(orderedItems.byEnd, searchFunction, 'data','end'); - Hammer.gestures.Drag = { - name: name, - index: 50, - handler: dragGesture, - defaults: { - /** - * minimal movement that have to be made before the drag event gets triggered - * @property dragMinDistance - * @type {Number} - * @default 10 - */ - dragMinDistance: 10, + // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the end values. + this._traceVisible(initialPosByEnd, orderedItems.byEnd, visibleItems, visibleItemsLookup, function (item) { + return (item.data.end < lowerBound || item.data.end > upperBound); + }); + } - /** - * Set dragDistanceCorrection to true to make the starting point of the drag - * be calculated from where the drag was triggered, not from where the touch started. - * Useful to avoid a jerk-starting drag, which can make fine-adjustments - * through dragging difficult, and be visually unappealing. - * @property dragDistanceCorrection - * @type {Boolean} - * @default true - */ - dragDistanceCorrection: true, - /** - * set 0 for unlimited, but this can conflict with transform - * @property dragMaxTouches - * @type {Number} - * @default 1 - */ - dragMaxTouches: 1, + // finally, we reposition all the visible items. + for (i = 0; i < visibleItems.length; i++) { + item = visibleItems[i]; + if (!item.displayed) item.show(); + // reposition item horizontally + item.repositionX(); + } - /** - * prevent default browser behavior when dragging occurs - * be careful with it, it makes the element a blocking element - * when you are using the drag gesture, it is a good practice to set this true - * @property dragBlockHorizontal - * @type {Boolean} - * @default false - */ - dragBlockHorizontal: false, + // debug + //console.log("new line") + //if (this.groupId == null) { + // for (i = 0; i < orderedItems.byStart.length; i++) { + // item = orderedItems.byStart[i].data; + // console.log('start',i,initialPosByStart, item.start.valueOf(), item.content, item.start >= lowerBound && item.start <= upperBound,i == initialPosByStart ? "<------------------- HEREEEE" : "") + // } + // for (i = 0; i < orderedItems.byEnd.length; i++) { + // item = orderedItems.byEnd[i].data; + // console.log('rangeEnd',i,initialPosByEnd, item.end.valueOf(), item.content, item.end >= range.start && item.end <= range.end,i == initialPosByEnd ? "<------------------- HEREEEE" : "") + // } + //} - /** - * same as `dragBlockHorizontal`, but for vertical movement - * @property dragBlockVertical - * @type {Boolean} - * @default false - */ - dragBlockVertical: false, + return visibleItems; + }; - /** - * dragLockToAxis keeps the drag gesture on the axis that it started on, - * It disallows vertical directions if the initial direction was horizontal, and vice versa. - * @property dragLockToAxis - * @type {Boolean} - * @default false - */ - dragLockToAxis: false, + Group.prototype._traceVisible = function (initialPos, items, visibleItems, visibleItemsLookup, breakCondition) { + var item; + var i; - /** - * drag lock only kicks in when distance > dragLockMinDistance - * This way, locking occurs only when the distance has become large enough to reliably determine the direction - * @property dragLockMinDistance - * @type {Number} - * @default 25 - */ - dragLockMinDistance: 25 + if (initialPos != -1) { + for (i = initialPos; i >= 0; i--) { + item = items[i]; + if (breakCondition(item)) { + break; + } + else { + if (visibleItemsLookup[item.id] === undefined) { + visibleItemsLookup[item.id] = true; + visibleItems.push(item); } - }; - })('drag'); + } + } + + for (i = initialPos + 1; i < items.length; i++) { + item = items[i]; + if (breakCondition(item)) { + break; + } + else { + if (visibleItemsLookup[item.id] === undefined) { + visibleItemsLookup[item.id] = true; + visibleItems.push(item); + } + } + } + } + } + /** - * @module gestures - */ - /** - * trigger a simple gesture event, so you can do anything in your handler. - * only usable if you know what your doing... + * this function is very similar to the _checkIfInvisible() but it does not + * return booleans, hides the item if it should not be seen and always adds to + * the visibleItems. + * this one is for brute forcing and hiding. * - * @class Gesture - * @static - */ - /** - * @event gesture - * @param {Object} ev + * @param {Item} item + * @param {Array} visibleItems + * @param {{start:number, end:number}} range + * @private */ - Hammer.gestures.Gesture = { - name: 'gesture', - index: 1337, - handler: function releaseGesture(ev, inst) { - inst.trigger(this.name, ev); + Group.prototype._checkIfVisible = function(item, visibleItems, range) { + if (item.isVisible(range)) { + if (!item.displayed) item.show(); + // reposition item horizontally + item.repositionX(); + visibleItems.push(item); + } + else { + if (item.displayed) item.hide(); } }; - /** - * @module gestures - */ - /** - * Touch stays at the same place for x time - * - * @class Hold - * @static - */ - /** - * @event hold - * @param {Object} ev - */ /** - * @param {String} name + * this function is very similar to the _checkIfInvisible() but it does not + * return booleans, hides the item if it should not be seen and always adds to + * the visibleItems. + * this one is for brute forcing and hiding. + * + * @param {Item} item + * @param {Array} visibleItems + * @param {{start:number, end:number}} range + * @private */ - (function(name) { - var timer; - - function holdGesture(ev, inst) { - var options = inst.options, - current = Detection.current; - - switch(ev.eventType) { - case EVENT_START: - clearTimeout(timer); + Group.prototype._checkIfVisibleWithReference = function(item, visibleItems, visibleItemsLookup, range) { + if (item.isVisible(range)) { + if (visibleItemsLookup[item.id] === undefined) { + visibleItemsLookup[item.id] = true; + visibleItems.push(item); + } + } + else { + if (item.displayed) item.hide(); + } + }; - // set the gesture so we can check in the timeout if it still is - current.name = name; - // set timer and if after the timeout it still is hold, - // we trigger the hold event - timer = setTimeout(function() { - if(current && current.name == name) { - inst.trigger(name, ev); - } - }, options.holdTimeout); - break; - case EVENT_MOVE: - if(ev.distance > options.holdThreshold) { - clearTimeout(timer); - } - break; + module.exports = Group; - case EVENT_RELEASE: - clearTimeout(timer); - break; - } - } - Hammer.gestures.Hold = { - name: name, - index: 10, - defaults: { - /** - * @property holdTimeout - * @type {Number} - * @default 500 - */ - holdTimeout: 500, +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { - /** - * movement allowed while holding - * @property holdThreshold - * @type {Number} - * @default 2 - */ - holdThreshold: 2 - }, - handler: holdGesture - }; - })('hold'); + var util = __webpack_require__(1); + var Group = __webpack_require__(25); /** - * @module gestures - */ - /** - * when a touch is being released from the page - * - * @class Release - * @static - */ - /** - * @event release - * @param {Object} ev + * @constructor BackgroundGroup + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet */ - Hammer.gestures.Release = { - name: 'release', - index: Infinity, - handler: function releaseGesture(ev, inst) { - if(ev.eventType == EVENT_RELEASE) { - inst.trigger(this.name, ev); - } - } - }; + function BackgroundGroup (groupId, data, itemSet) { + Group.call(this, groupId, data, itemSet); + + this.width = 0; + this.height = 0; + this.top = 0; + this.left = 0; + } + + BackgroundGroup.prototype = Object.create(Group.prototype); /** - * @module gestures - */ - /** - * triggers swipe events when the end velocity is above the threshold - * for best usage, set `preventDefault` (on the drag gesture) to `true` - * ```` - * hammertime.on("dragleft swipeleft", function(ev) { - * console.log(ev); - * ev.gesture.preventDefault(); - * }); - * ```` - * - * @class Swipe - * @static - */ - /** - * @event swipe - * @param {Object} ev - */ - /** - * @event swipeleft - * @param {Object} ev - */ - /** - * @event swiperight - * @param {Object} ev - */ - /** - * @event swipeup - * @param {Object} ev - */ - /** - * @event swipedown - * @param {Object} ev + * Repaint this group + * @param {{start: number, end: number}} range + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @param {boolean} [restack=false] Force restacking of all items + * @return {boolean} Returns true if the group is resized */ - Hammer.gestures.Swipe = { - name: 'swipe', - index: 40, - defaults: { - /** - * @property swipeMinTouches - * @type {Number} - * @default 1 - */ - swipeMinTouches: 1, - - /** - * @property swipeMaxTouches - * @type {Number} - * @default 1 - */ - swipeMaxTouches: 1, + BackgroundGroup.prototype.redraw = function(range, margin, restack) { + var resized = false; - /** - * horizontal swipe velocity - * @property swipeVelocityX - * @type {Number} - * @default 0.6 - */ - swipeVelocityX: 0.6, + this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); - /** - * vertical swipe velocity - * @property swipeVelocityY - * @type {Number} - * @default 0.6 - */ - swipeVelocityY: 0.6 - }, + // calculate actual size + this.width = this.dom.background.offsetWidth; - handler: function swipeGesture(ev, inst) { - if(ev.eventType == EVENT_RELEASE) { - var touches = ev.touches.length, - options = inst.options; + // apply new height (just always zero for BackgroundGroup + this.dom.background.style.height = '0'; - // max touches - if(touches < options.swipeMinTouches || - touches > options.swipeMaxTouches) { - return; - } + // update vertical position of items after they are re-stacked and the height of the group is calculated + for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { + var item = this.visibleItems[i]; + item.repositionY(margin); + } - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.velocityX > options.swipeVelocityX || - ev.velocityY > options.swipeVelocityY) { - // trigger swipe events - inst.trigger(this.name, ev); - inst.trigger(this.name + ev.direction, ev); - } - } - } + return resized; }; /** - * @module gestures - */ - /** - * Single tap and a double tap on a place - * - * @class Tap - * @static - */ - /** - * @event tap - * @param {Object} ev - */ - /** - * @event doubletap - * @param {Object} ev + * Show this group: attach to the DOM */ + BackgroundGroup.prototype.show = function() { + if (!this.dom.background.parentNode) { + this.itemSet.dom.background.appendChild(this.dom.background); + } + }; + + module.exports = BackgroundGroup; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Component = __webpack_require__(20); + var Group = __webpack_require__(25); + var BackgroundGroup = __webpack_require__(26); + var BoxItem = __webpack_require__(33); + var PointItem = __webpack_require__(34); + var RangeItem = __webpack_require__(35); + var BackgroundItem = __webpack_require__(32); + + + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + var BACKGROUND = '__background__'; // reserved group id for background items without group /** - * @param {String} name + * An ItemSet holds a set of items and ranges which can be displayed in a + * range. The width is determined by the parent of the ItemSet, and the height + * is determined by the size of the items. + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body + * @param {Object} [options] See ItemSet.setOptions for the available options. + * @constructor ItemSet + * @extends Component */ - (function(name) { - var hasMoved = false; + function ItemSet(body, options) { + this.body = body; - function tapGesture(ev, inst) { - var options = inst.options, - current = Detection.current, - prev = Detection.previous, - sincePrev, - didDoubleTap; + this.defaultOptions = { + type: null, // 'box', 'point', 'range', 'background' + orientation: 'bottom', // 'top' or 'bottom' + align: 'auto', // alignment of box items + stack: true, + groupOrder: null, - switch(ev.eventType) { - case EVENT_START: - hasMoved = false; - break; + selectable: true, + editable: { + updateTime: false, + updateGroup: false, + add: false, + remove: false + }, - case EVENT_MOVE: - hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); - break; + onAdd: function (item, callback) { + callback(item); + }, + onUpdate: function (item, callback) { + callback(item); + }, + onMove: function (item, callback) { + callback(item); + }, + onRemove: function (item, callback) { + callback(item); + }, + onMoving: function (item, callback) { + callback(item); + }, - case EVENT_END: - if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { - // previous gesture, for the double tap since these are two different gesture detections - sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; - didDoubleTap = false; + margin: { + item: { + horizontal: 10, + vertical: 10 + }, + axis: 20 + }, + padding: 5 + }; - // check if double tap - if(prev && prev.name == name && - (sincePrev && sincePrev < options.doubleTapInterval) && - ev.distance < options.doubleTapDistance) { - inst.trigger('doubletap', ev); - didDoubleTap = true; - } + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); - // do a single tap - if(!didDoubleTap || options.tapAlways) { - current.name = name; - inst.trigger(current.name, ev); - } - } - break; - } - } + // options for getting items from the DataSet with the correct type + this.itemOptions = { + type: {start: 'Date', end: 'Date'} + }; - Hammer.gestures.Tap = { - name: name, - index: 100, - handler: tapGesture, - defaults: { - /** - * max time of a tap, this is for the slow tappers - * @property tapMaxTime - * @type {Number} - * @default 250 - */ - tapMaxTime: 250, + this.conversion = { + toScreen: body.util.toScreen, + toTime: body.util.toTime + }; + this.dom = {}; + this.props = {}; + this.hammer = null; - /** - * max distance of movement of a tap, this is for the slow tappers - * @property tapMaxDistance - * @type {Number} - * @default 10 - */ - tapMaxDistance: 10, + var me = this; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet - /** - * always trigger the `tap` event, even while double-tapping - * @property tapAlways - * @type {Boolean} - * @default true - */ - tapAlways: true, + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); + } + }; - /** - * max distance between two taps - * @property doubleTapDistance - * @type {Number} - * @default 20 - */ - doubleTapDistance: 20, + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); + } + }; - /** - * max time between two taps - * @property doubleTapInterval - * @type {Number} - * @default 300 - */ - doubleTapInterval: 300 - } - }; - })('tap'); + this.items = {}; // object with an Item for every data item + this.groups = {}; // Group object for every group + this.groupIds = []; - /** - * @module gestures - */ - /** - * when a touch is being touched at the page - * - * @class Touch - * @static - */ - /** - * @event touch - * @param {Object} ev - */ - Hammer.gestures.Touch = { - name: 'touch', - index: -Infinity, - defaults: { - /** - * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, - * but it improves gestures like transforming and dragging. - * be careful with using this, it can be very annoying for users to be stuck on the page - * @property preventDefault - * @type {Boolean} - * @default false - */ - preventDefault: false, + this.selection = []; // list with the ids of all selected nodes + this.stackDirty = true; // if true, all items will be restacked on next redraw - /** - * disable mouse events, so only touch (or pen!) input triggers events - * @property preventMouse - * @type {Boolean} - * @default false - */ - preventMouse: false - }, - handler: function touchGesture(ev, inst) { - if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { - ev.stopDetect(); - return; - } + this.touchParams = {}; // stores properties while dragging + // create the HTML DOM - if(inst.options.preventDefault) { - ev.preventDefault(); - } + this._create(); - if(ev.eventType == EVENT_TOUCH) { - inst.trigger('touch', ev); - } - } + this.setOptions(options); + } + + ItemSet.prototype = new Component(); + + // available item types will be registered here + ItemSet.types = { + background: BackgroundItem, + box: BoxItem, + range: RangeItem, + point: PointItem }; /** - * @module gestures - */ - /** - * User want to scale or rotate with 2 fingers - * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the - * `preventDefault` option. - * - * @class Transform - * @static - */ - /** - * @event transform - * @param {Object} ev - */ - /** - * @event transformstart - * @param {Object} ev - */ - /** - * @event transformend - * @param {Object} ev - */ - /** - * @event pinchin - * @param {Object} ev - */ - /** - * @event pinchout - * @param {Object} ev - */ - /** - * @event rotate - * @param {Object} ev + * Create the HTML DOM for the ItemSet */ + ItemSet.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'itemset'; + frame['timeline-itemset'] = this; + this.dom.frame = frame; - /** - * @param {String} name - */ - (function(name) { - var triggered = false; + // create background panel + var background = document.createElement('div'); + background.className = 'background'; + frame.appendChild(background); + this.dom.background = background; - function transformGesture(ev, inst) { - switch(ev.eventType) { - case EVENT_START: - triggered = false; - break; + // create foreground panel + var foreground = document.createElement('div'); + foreground.className = 'foreground'; + frame.appendChild(foreground); + this.dom.foreground = foreground; - case EVENT_MOVE: - // at least multitouch - if(ev.touches.length < 2) { - return; - } + // create axis panel + var axis = document.createElement('div'); + axis.className = 'axis'; + this.dom.axis = axis; - var scaleThreshold = Math.abs(1 - ev.scale); - var rotationThreshold = Math.abs(ev.rotation); + // create labelset + var labelSet = document.createElement('div'); + labelSet.className = 'labelset'; + this.dom.labelSet = labelSet; - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(scaleThreshold < inst.options.transformMinScale && - rotationThreshold < inst.options.transformMinRotation) { - return; - } + // create ungrouped Group + this._updateUngrouped(); - // we are transforming! - Detection.current.name = name; + // create background Group + var backgroundGroup = new BackgroundGroup(BACKGROUND, null, this); + backgroundGroup.show(); + this.groups[BACKGROUND] = backgroundGroup; - // first time, trigger dragstart event - if(!triggered) { - inst.trigger(name + 'start', ev); - triggered = true; - } + // attach event listeners + // Note: we bind to the centerContainer for the case where the height + // of the center container is larger than of the ItemSet, so we + // can click in the empty area to create a new item or deselect an item. + this.hammer = Hammer(this.body.dom.centerContainer, { + prevent_default: true + }); - inst.trigger(name, ev); // basic transform event + // drag items when selected + this.hammer.on('touch', this._onTouch.bind(this)); + this.hammer.on('dragstart', this._onDragStart.bind(this)); + this.hammer.on('drag', this._onDrag.bind(this)); + this.hammer.on('dragend', this._onDragEnd.bind(this)); - // trigger rotate event - if(rotationThreshold > inst.options.transformMinRotation) { - inst.trigger('rotate', ev); - } + // single select (or unselect) when tapping an item + this.hammer.on('tap', this._onSelectItem.bind(this)); - // trigger pinch event - if(scaleThreshold > inst.options.transformMinScale) { - inst.trigger('pinch', ev); - inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); - } - break; + // multi select when holding mouse/touch, or on ctrl+click + this.hammer.on('hold', this._onMultiSelectItem.bind(this)); - case EVENT_RELEASE: - if(triggered && ev.changedLength < 2) { - inst.trigger(name + 'end', ev); - triggered = false; - } - break; + // add item on doubletap + this.hammer.on('doubletap', this._onAddItem.bind(this)); + + // attach to the DOM + this.show(); + }; + + /** + * Set options for the ItemSet. Existing options will be extended/overwritten. + * @param {Object} [options] The following options are available: + * {String} type + * Default type for the items. Choose from 'box' + * (default), 'point', 'range', or 'background'. + * The default style can be overwritten by + * individual items. + * {String} align + * Alignment for the items, only applicable for + * BoxItem. Choose 'center' (default), 'left', or + * 'right'. + * {String} orientation + * Orientation of the item set. Choose 'top' or + * 'bottom' (default). + * {Function} groupOrder + * A sorting function for ordering groups + * {Boolean} stack + * If true (deafult), items will be stacked on + * top of each other. + * {Number} margin.axis + * Margin between the axis and the items in pixels. + * Default is 20. + * {Number} margin.item.horizontal + * Horizontal margin between items in pixels. + * Default is 10. + * {Number} margin.item.vertical + * Vertical Margin between items in pixels. + * Default is 10. + * {Number} margin.item + * Margin between items in pixels in both horizontal + * and vertical direction. Default is 10. + * {Number} margin + * Set margin for both axis and items in pixels. + * {Number} padding + * Padding of the contents of an item in pixels. + * Must correspond with the items css. Default is 5. + * {Boolean} selectable + * If true (default), items can be selected. + * {Boolean} editable + * Set all editable options to true or false + * {Boolean} editable.updateTime + * Allow dragging an item to an other moment in time + * {Boolean} editable.updateGroup + * Allow dragging an item to an other group + * {Boolean} editable.add + * Allow creating new items on double tap + * {Boolean} editable.remove + * Allow removing items by clicking the delete button + * top right of a selected item. + * {Function(item: Item, callback: Function)} onAdd + * Callback function triggered when an item is about to be added: + * when the user double taps an empty space in the Timeline. + * {Function(item: Item, callback: Function)} onUpdate + * Callback function fired when an item is about to be updated. + * This function typically has to show a dialog where the user + * change the item. If not implemented, nothing happens. + * {Function(item: Item, callback: Function)} onMove + * Fired when an item has been moved. If not implemented, + * the move action will be accepted. + * {Function(item: Item, callback: Function)} onRemove + * Fired when an item is about to be deleted. + * If not implemented, the item will be always removed. + */ + ItemSet.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + var fields = ['type', 'align', 'orientation', 'padding', 'stack', 'selectable', 'groupOrder', 'dataAttributes', 'template','hide']; + util.selectiveExtend(fields, this.options, options); + + if ('margin' in options) { + if (typeof options.margin === 'number') { + this.options.margin.axis = options.margin; + this.options.margin.item.horizontal = options.margin; + this.options.margin.item.vertical = options.margin; + } + else if (typeof options.margin === 'object') { + util.selectiveExtend(['axis'], this.options.margin, options.margin); + if ('item' in options.margin) { + if (typeof options.margin.item === 'number') { + this.options.margin.item.horizontal = options.margin.item; + this.options.margin.item.vertical = options.margin.item; + } + else if (typeof options.margin.item === 'object') { + util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); + } } + } } - Hammer.gestures.Transform = { - name: name, - index: 45, - defaults: { - /** - * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 - * @property transformMinScale - * @type {Number} - * @default 0.01 - */ - transformMinScale: 0.01, + if ('editable' in options) { + if (typeof options.editable === 'boolean') { + this.options.editable.updateTime = options.editable; + this.options.editable.updateGroup = options.editable; + this.options.editable.add = options.editable; + this.options.editable.remove = options.editable; + } + else if (typeof options.editable === 'object') { + util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); + } + } - /** - * rotation in degrees - * @property transformMinRotation - * @type {Number} - * @default 1 - */ - transformMinRotation: 1 - }, + // callback functions + var addCallback = (function (name) { + var fn = options[name]; + if (fn) { + if (!(fn instanceof Function)) { + throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)'); + } + this.options[name] = fn; + } + }).bind(this); + ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving'].forEach(addCallback); - handler: transformGesture - }; - })('transform'); + // force the itemSet to refresh: options like orientation and margins may be changed + this.markDirty(); + } + }; /** - * @module hammer + * Mark the ItemSet dirty so it will refresh everything with next redraw */ - - // AMD export - if(true) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { - return Hammer; - }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - // commonjs export - } else if(typeof module !== 'undefined' && module.exports) { - module.exports = Hammer; - // browser export - } else { - window.Hammer = Hammer; - } - - })(window); - -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(22); - var moment = __webpack_require__(2); - var Component = __webpack_require__(23); - var DateUtil = __webpack_require__(24); + ItemSet.prototype.markDirty = function() { + this.groupIds = []; + this.stackDirty = true; + }; /** - * @constructor Range - * A Range controls a numeric range with a start and end value. - * The Range adjusts the range based on mouse events or programmatic changes, - * and triggers events when the range is changing or has been changed. - * @param {{dom: Object, domProps: Object, emitter: Emitter}} body - * @param {Object} [options] See description at Range.setOptions + * Destroy the ItemSet */ - function Range(body, options) { - var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); - this.start = now.clone().add(-3, 'days').valueOf(); // Number - this.end = now.clone().add(4, 'days').valueOf(); // Number - - this.body = body; - this.deltaDifference = 0; - this.scaleOffset = 0; - this.startToFront = false; - this.endToFront = true; + ItemSet.prototype.destroy = function() { + this.hide(); + this.setItems(null); + this.setGroups(null); - // default options - this.defaultOptions = { - start: null, - end: null, - direction: 'horizontal', // 'horizontal' or 'vertical' - moveable: true, - zoomable: true, - min: null, - max: null, - zoomMin: 10, // milliseconds - zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds - }; - this.options = util.extend({}, this.defaultOptions); + this.hammer = null; - this.props = { - touch: {} - }; - this.animateTimer = null; + this.body = null; + this.conversion = null; + }; - // drag listeners for dragging - this.body.emitter.on('dragstart', this._onDragStart.bind(this)); - this.body.emitter.on('drag', this._onDrag.bind(this)); - this.body.emitter.on('dragend', this._onDragEnd.bind(this)); + /** + * Hide the component from the DOM + */ + ItemSet.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } - // ignore dragging when holding - this.body.emitter.on('hold', this._onHold.bind(this)); + // remove the axis with dots + if (this.dom.axis.parentNode) { + this.dom.axis.parentNode.removeChild(this.dom.axis); + } - // mouse wheel for zooming - this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); - this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + // remove the labelset containing all group labels + if (this.dom.labelSet.parentNode) { + this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); + } + }; - // pinch to zoom - this.body.emitter.on('touch', this._onTouch.bind(this)); - this.body.emitter.on('pinch', this._onPinch.bind(this)); + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + ItemSet.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } - this.setOptions(options); - } + // show axis with dots + if (!this.dom.axis.parentNode) { + this.body.dom.backgroundVertical.appendChild(this.dom.axis); + } - Range.prototype = new Component(); + // show labelset containing labels + if (!this.dom.labelSet.parentNode) { + this.body.dom.left.appendChild(this.dom.labelSet); + } + }; /** - * Set options for the range controller - * @param {Object} options Available options: - * {Number | Date | String} start Start date for the range - * {Number | Date | String} end End date for the range - * {Number} min Minimum value for start - * {Number} max Maximum value for end - * {Number} zoomMin Set a minimum value for - * (end - start). - * {Number} zoomMax Set a maximum value for - * (end - start). - * {Boolean} moveable Enable moving of the range - * by dragging. True by default - * {Boolean} zoomable Enable zooming of the range - * by pinching/scrolling. True by default + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected, or a single item id. If ids is undefined + * or an empty array, all items will be unselected. */ - Range.prototype.setOptions = function (options) { - if (options) { - // copy the options that we know - var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'activate', 'hiddenDates']; - util.selectiveExtend(fields, this.options, options); + ItemSet.prototype.setSelection = function(ids) { + var i, ii, id, item; - if ('start' in options || 'end' in options) { - // apply a new range. both start and end are optional - this.setRange(options.start, options.end); + if (ids == undefined) ids = []; + if (!Array.isArray(ids)) ids = [ids]; + + // unselect currently selected items + for (i = 0, ii = this.selection.length; i < ii; i++) { + id = this.selection[i]; + item = this.items[id]; + if (item) item.unselect(); + } + + // select items + this.selection = []; + for (i = 0, ii = ids.length; i < ii; i++) { + id = ids[i]; + item = this.items[id]; + if (item) { + this.selection.push(id); + item.select(); } } }; /** - * Test whether direction has a valid value - * @param {String} direction 'horizontal' or 'vertical' + * Get the selected items by their id + * @return {Array} ids The ids of the selected items */ - function validateDirection (direction) { - if (direction != 'horizontal' && direction != 'vertical') { - throw new TypeError('Unknown direction "' + direction + '". ' + - 'Choose "horizontal" or "vertical".'); - } - } + ItemSet.prototype.getSelection = function() { + return this.selection.concat([]); + }; /** - * Set a new start and end range - * @param {Date | Number | String} [start] - * @param {Date | Number | String} [end] - * @param {boolean | number} [animate=false] If true, the range is animated - * smoothly to the new window. - * If animate is a number, the - * number is taken as duration - * Default duration is 500 ms. - * + * Get the id's of the currently visible items. + * @returns {Array} The ids of the visible items */ - Range.prototype.setRange = function(start, end, animate) { - var _start = start != undefined ? util.convert(start, 'Date').valueOf() : null; - var _end = end != undefined ? util.convert(end, 'Date').valueOf() : null; - this._cancelAnimation(); - - if (animate) { - var me = this; - var initStart = this.start; - var initEnd = this.end; - var duration = typeof animate === 'number' ? animate : 500; - var initTime = new Date().valueOf(); - var anyChanged = false; - - function next() { - if (!me.props.touch.dragging) { - var now = new Date().valueOf(); - var time = now - initTime; - var done = time > duration; - var s = (done || _start === null) ? _start : util.easeInOutQuad(time, initStart, _start, duration); - var e = (done || _end === null) ? _end : util.easeInOutQuad(time, initEnd, _end, duration); + ItemSet.prototype.getVisibleItems = function() { + var range = this.body.range.getRange(); + var left = this.body.util.toScreen(range.start); + var right = this.body.util.toScreen(range.end); - changed = me._applyRange(s, e); - DateUtil.updateHiddenDates(me.body, me.options.hiddenDates); - anyChanged = anyChanged || changed; - if (changed) { - me.body.emitter.emit('rangechange', {start: new Date(me.start), end: new Date(me.end)}); - } + var ids = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + var group = this.groups[groupId]; + var rawVisibleItems = group.visibleItems; - if (done) { - if (anyChanged) { - me.body.emitter.emit('rangechanged', {start: new Date(me.start), end: new Date(me.end)}); - } - } - else { - // animate with as high as possible frame rate, leave 20 ms in between - // each to prevent the browser from blocking - me.animateTimer = setTimeout(next, 20); + // filter the "raw" set with visibleItems into a set which is really + // visible by pixels + for (var i = 0; i < rawVisibleItems.length; i++) { + var item = rawVisibleItems[i]; + // TODO: also check whether visible vertically + if ((item.left < right) && (item.left + item.width > left)) { + ids.push(item.id); } } } - - return next(); - } - else { - var changed = this._applyRange(_start, _end); - DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); - if (changed) { - var params = {start: new Date(this.start), end: new Date(this.end)}; - this.body.emitter.emit('rangechange', params); - this.body.emitter.emit('rangechanged', params); - } } + + return ids; }; /** - * Stop an animation + * Deselect a selected item + * @param {String | Number} id * @private */ - Range.prototype._cancelAnimation = function () { - if (this.animateTimer) { - clearTimeout(this.animateTimer); - this.animateTimer = null; + ItemSet.prototype._deselect = function(id) { + var selection = this.selection; + for (var i = 0, ii = selection.length; i < ii; i++) { + if (selection[i] == id) { // non-strict comparison! + selection.splice(i, 1); + break; + } } }; /** - * Set a new start and end range. This method is the same as setRange, but - * does not trigger a range change and range changed event, and it returns - * true when the range is changed - * @param {Number} [start] - * @param {Number} [end] - * @return {Boolean} changed - * @private + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - Range.prototype._applyRange = function(start, end) { - var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, - newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, - max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, - min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, - diff; + ItemSet.prototype.redraw = function() { + var margin = this.options.margin, + range = this.body.range, + asSize = util.option.asSize, + options = this.options, + orientation = options.orientation, + resized = false, + frame = this.dom.frame, + editable = options.editable.updateTime || options.editable.updateGroup; - // check for valid number - if (isNaN(newStart) || newStart === null) { - throw new Error('Invalid start "' + start + '"'); - } - if (isNaN(newEnd) || newEnd === null) { - throw new Error('Invalid end "' + end + '"'); - } + // recalculate absolute position (before redrawing groups) + this.props.top = this.body.domProps.top.height + this.body.domProps.border.top; + this.props.left = this.body.domProps.left.width + this.body.domProps.border.left; - // prevent start < end - if (newEnd < newStart) { - newEnd = newStart; - } + // update class name + frame.className = 'itemset' + (editable ? ' editable' : ''); - // prevent start < min - if (min !== null) { - if (newStart < min) { - diff = (min - newStart); - newStart += diff; - newEnd += diff; + // reorder the groups (if needed) + resized = this._orderGroups() || resized; - // prevent end > max - if (max != null) { - if (newEnd > max) { - newEnd = max; - } - } - } - } + // check whether zoomed (in that case we need to re-stack everything) + // TODO: would be nicer to get this as a trigger from Range + var visibleInterval = range.end - range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); + if (zoomed) this.stackDirty = true; + this.lastVisibleInterval = visibleInterval; + this.props.lastWidth = this.props.width; - // prevent end > max - if (max !== null) { - if (newEnd > max) { - diff = (newEnd - max); - newStart -= diff; - newEnd -= diff; + var restack = this.stackDirty; + var firstGroup = this._firstGroup(); + var firstMargin = { + item: margin.item, + axis: margin.axis + }; + var nonFirstMargin = { + item: margin.item, + axis: margin.item.vertical / 2 + }; + var height = 0; + var minHeight = margin.axis + margin.item.vertical; - // prevent start < min - if (min != null) { - if (newStart < min) { - newStart = min; - } - } - } - } + // redraw the background group + this.groups[BACKGROUND].redraw(range, nonFirstMargin, restack); - // prevent (end-start) < zoomMin - if (this.options.zoomMin !== null) { - var zoomMin = parseFloat(this.options.zoomMin); - if (zoomMin < 0) { - zoomMin = 0; - } - if ((newEnd - newStart) < zoomMin) { - if ((this.end - this.start) === zoomMin) { - // ignore this action, we are already zoomed to the minimum - newStart = this.start; - newEnd = this.end; - } - else { - // zoom to the minimum - diff = (zoomMin - (newEnd - newStart)); - newStart -= diff / 2; - newEnd += diff / 2; - } - } - } + // redraw all regular groups + util.forEach(this.groups, function (group) { + var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; + var groupResized = group.redraw(range, groupMargin, restack); + resized = groupResized || resized; + height += group.height; + }); + height = Math.max(height, minHeight); + this.stackDirty = false; - // prevent (end-start) > zoomMax - if (this.options.zoomMax !== null) { - var zoomMax = parseFloat(this.options.zoomMax); - if (zoomMax < 0) { - zoomMax = 0; - } - if ((newEnd - newStart) > zoomMax) { - if ((this.end - this.start) === zoomMax) { - // ignore this action, we are already zoomed to the maximum - newStart = this.start; - newEnd = this.end; - } - else { - // zoom to the maximum - diff = ((newEnd - newStart) - zoomMax); - newStart += diff / 2; - newEnd -= diff / 2; + // update frame height + frame.style.height = asSize(height); + + // calculate actual size + this.props.width = frame.offsetWidth; + this.props.height = height; + + // reposition axis + this.dom.axis.style.top = asSize((orientation == 'top') ? + (this.body.domProps.top.height + this.body.domProps.border.top) : + (this.body.domProps.top.height + this.body.domProps.centerContainer.height)); + this.dom.axis.style.left = '0'; + + // check if this component is resized + resized = this._isResized() || resized; + + return resized; + }; + + /** + * Get the first group, aligned with the axis + * @return {Group | null} firstGroup + * @private + */ + ItemSet.prototype._firstGroup = function() { + var firstGroupIndex = (this.options.orientation == 'top') ? 0 : (this.groupIds.length - 1); + var firstGroupId = this.groupIds[firstGroupIndex]; + var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED]; + + return firstGroup || null; + }; + + /** + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. + * @protected + */ + ItemSet.prototype._updateUngrouped = function() { + var ungrouped = this.groups[UNGROUPED]; + var background = this.groups[BACKGROUND]; + var item, itemId; + + if (this.groupsData) { + // remove the group holding all ungrouped items + if (ungrouped) { + ungrouped.hide(); + delete this.groups[UNGROUPED]; + + for (itemId in this.items) { + if (this.items.hasOwnProperty(itemId)) { + item = this.items[itemId]; + item.parent && item.parent.remove(item); + var groupId = this._getGroupId(item.data); + var group = this.groups[groupId]; + group && group.add(item) || item.hide(); + } } } } + else { + // create a group holding all (unfiltered) items + if (!ungrouped) { + var id = null; + var data = null; + ungrouped = new Group(id, data, this); + this.groups[UNGROUPED] = ungrouped; - var changed = (this.start != newStart || this.end != newEnd); + for (itemId in this.items) { + if (this.items.hasOwnProperty(itemId)) { + item = this.items[itemId]; + ungrouped.add(item); + } + } - // if the new range does NOT overlap with the old range, emit checkRangedItems to avoid not showing ranged items (ranged meaning has end time, not neccesarily of type Range) - if (!((newStart >= this.start && newStart <= this.end) || (newEnd >= this.start && newEnd <= this.end)) && - !((this.start >= newStart && this.start <= newEnd) || (this.end >= newStart && this.end <= newEnd) )) { - this.body.emitter.emit('checkRangedItems'); + ungrouped.show(); + } } - - this.start = newStart; - this.end = newEnd; - return changed; }; /** - * Retrieve the current range. - * @return {Object} An object with start and end properties + * Get the element for the labelset + * @return {HTMLElement} labelSet */ - Range.prototype.getRange = function() { - return { - start: this.start, - end: this.end - }; + ItemSet.prototype.getLabelSet = function() { + return this.dom.labelSet; }; /** - * Calculate the conversion offset and scale for current range, based on - * the provided width - * @param {Number} width - * @returns {{offset: number, scale: number}} conversion + * Set items + * @param {vis.DataSet | null} items */ - Range.prototype.conversion = function (width, totalHidden) { - return Range.conversion(this.start, this.end, width, totalHidden); - }; + ItemSet.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; - /** - * Static method to calculate the conversion offset and scale for a range, - * based on the provided start, end, and width - * @param {Number} start - * @param {Number} end - * @param {Number} width - * @returns {{offset: number, scale: number}} conversion - */ - Range.conversion = function (start, end, width, totalHidden) { - if (totalHidden === undefined) { - totalHidden = 0; + // replace the dataset + if (!items) { + this.itemsData = null; } - if (width != 0 && (end - start != 0)) { - return { - offset: start, - scale: width / (end - start - totalHidden) - } + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; } else { - return { - offset: 0, - scale: 1 - }; + throw new TypeError('Data must be an instance of DataSet or DataView'); } - }; - /** - * Start dragging horizontally or vertically - * @param {Event} event - * @private - */ - Range.prototype._onDragStart = function(event) { - this.deltaDifference = 0; - this.previousDelta = 0; - // only allow dragging when configured as movable - if (!this.options.moveable) return; + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); + }); - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); + } - this.props.touch.start = this.start; - this.props.touch.end = this.end; - this.props.touch.dragging = true; + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); - if (this.body.dom.root) { - this.body.dom.root.style.cursor = 'move'; + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); + + // update the group holding all ungrouped items + this._updateUngrouped(); } }; /** - * Perform dragging operation - * @param {Event} event - * @private + * Get the current items + * @returns {vis.DataSet | null} */ - Range.prototype._onDrag = function (event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; + ItemSet.prototype.getItems = function() { + return this.itemsData; + }; - var direction = this.options.direction; - validateDirection(direction); + /** + * Set groups + * @param {vis.DataSet} groups + */ + ItemSet.prototype.setGroups = function(groups) { + var me = this, + ids; - var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY; - delta -= this.deltaDifference; - var interval = (this.props.touch.end - this.props.touch.start); + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); - // normalize dragging speed if cutout is in between. - var duration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - interval -= duration; + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw + } - var width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height; - var diffRange = -delta / width * interval; - var newStart = this.props.touch.start + diffRange; - var newEnd = this.props.touch.end + diffRange; + // replace the dataset + if (!groups) { + this.groupsData = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); - // snapping times away from hidden zones - var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, this.previousDelta-delta, true); - var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, this.previousDelta-delta, true); - if (safeStart != newStart || safeEnd != newEnd) { - this.deltaDifference += delta; - this.props.touch.start = safeStart; - this.props.touch.end = safeEnd; - this._onDrag(event); - return; + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); } - this.previousDelta = delta; - this._applyRange(newStart, newEnd); + // update the group holding all ungrouped items + this._updateUngrouped(); - // fire a rangechange event - this.body.emitter.emit('rangechange', { - start: new Date(this.start), - end: new Date(this.end) - }); + // update the order of all items in each group + this._order(); + + this.body.emitter.emit('change', {queue: true}); }; /** - * Stop dragging operation - * @param {event} event - * @private + * Get the current groups + * @returns {vis.DataSet | null} groups */ - Range.prototype._onDragEnd = function (event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; + ItemSet.prototype.getGroups = function() { + return this.groupsData; + }; - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; + /** + * Remove an item by its id + * @param {String | Number} id + */ + ItemSet.prototype.removeItem = function(id) { + var item = this.itemsData.get(id), + dataset = this.itemsData.getDataSet(); - this.props.touch.dragging = false; - if (this.body.dom.root) { - this.body.dom.root.style.cursor = 'auto'; + if (item) { + // confirm deletion + this.options.onRemove(item, function (item) { + if (item) { + // remove by id here, it is possible that an item has no id defined + // itself, so better not delete by the item itself + dataset.remove(id); + } + }); } - - // fire a rangechanged event - this.body.emitter.emit('rangechanged', { - start: new Date(this.start), - end: new Date(this.end) - }); }; /** - * Event handler for mouse wheel event, used to zoom - * Code from http://adomas.org/javascript-mouse-wheel/ - * @param {Event} event + * Get the time of an item based on it's data and options.type + * @param {Object} itemData + * @returns {string} Returns the type * @private */ - Range.prototype._onMouseWheel = function(event) { - // only allow zooming when configured as zoomable and moveable - if (!(this.options.zoomable && this.options.moveable)) return; + ItemSet.prototype._getType = function (itemData) { + return itemData.type || this.options.type || (itemData.end ? 'range' : 'box'); + }; - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta / 120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail / 3; + + /** + * Get the group id for an item + * @param {Object} itemData + * @returns {string} Returns the groupId + * @private + */ + ItemSet.prototype._getGroupId = function (itemData) { + var type = this._getType(itemData); + if (type == 'background' && itemData.group == undefined) { + return BACKGROUND; + } + else { + return this.groupsData ? itemData.group : UNGROUPED; } + }; - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - // perform the zoom action. Delta is normally 1 or -1 + /** + * Handle updated items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onUpdate = function(ids) { + var me = this; - // adjust a negative delta such that zooming in with delta 0.1 - // equals zooming out with a delta -0.1 - var scale; - if (delta < 0) { - scale = 1 - (delta / 5); + ids.forEach(function (id) { + var itemData = me.itemsData.get(id, me.itemOptions); + var item = me.items[id]; + var type = me._getType(itemData); + + var constructor = ItemSet.types[type]; + + if (item) { + // update item + if (!constructor || !(item instanceof constructor)) { + // item type has changed, delete the item and recreate it + me._removeItem(item); + item = null; + } + else { + me._updateItem(item, itemData); + } } - else { - scale = 1 / (1 + (delta / 5)) ; + + if (!item) { + // create item + if (constructor) { + item = new constructor(itemData, me.conversion, me.options); + item.id = id; // TODO: not so nice setting id afterwards + me._addItem(item); + } + else if (type == 'rangeoverflow') { + // TODO: deprecated since version 2.1.0 (or 3.0.0?). cleanup some day + throw new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: ' + + '.vis.timeline .item.range .content {overflow: visible;}'); + } + else { + throw new TypeError('Unknown item type "' + type + '"'); + } } + }); - // calculate center, the date to zoom around - var gesture = hammerUtil.fakeGesture(this, event), - pointer = getPointer(gesture.center, this.body.dom.center), - pointerDate = this._pointerToDate(pointer); + this._order(); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change', {queue: true}); + }; - this.zoom(scale, pointerDate, delta); - } + /** + * Handle added items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; - // Prevent default actions caused by mouse wheel - // (else the page and timeline both zoom and scroll) - event.preventDefault(); + /** + * Handle removed items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onRemove = function(ids) { + var count = 0; + var me = this; + ids.forEach(function (id) { + var item = me.items[id]; + if (item) { + count++; + me._removeItem(item); + } + }); + + if (count) { + // update order + this._order(); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change', {queue: true}); + } }; /** - * Start of a touch gesture + * Update the order of item in all groups * @private */ - Range.prototype._onTouch = function (event) { - this.props.touch.start = this.start; - this.props.touch.end = this.end; - this.props.touch.allowDragging = true; - this.props.touch.center = null; - this.scaleOffset = 0; - this.deltaDifference = 0; + ItemSet.prototype._order = function() { + // reorder the items in all groups + // TODO: optimization: only reorder groups affected by the changed items + util.forEach(this.groups, function (group) { + group.order(); + }); }; /** - * On start of a hold gesture + * Handle updated groups + * @param {Number[]} ids * @private */ - Range.prototype._onHold = function () { - this.props.touch.allowDragging = false; + ItemSet.prototype._onUpdateGroups = function(ids) { + this._onAddGroups(ids); }; /** - * Handle pinch event - * @param {Event} event + * Handle changed groups (added or updated) + * @param {Number[]} ids * @private */ - Range.prototype._onPinch = function (event) { - // only allow zooming when configured as zoomable and moveable - if (!(this.options.zoomable && this.options.moveable)) return; + ItemSet.prototype._onAddGroups = function(ids) { + var me = this; - this.props.touch.allowDragging = false; + ids.forEach(function (id) { + var groupData = me.groupsData.get(id); + var group = me.groups[id]; - if (event.gesture.touches.length > 1) { - if (!this.props.touch.center) { - this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); - } + if (!group) { + // check for reserved ids + if (id == UNGROUPED || id == BACKGROUND) { + throw new Error('Illegal group id. ' + id + ' is a reserved id.'); + } - var scale = 1 / (event.gesture.scale + this.scaleOffset); - var center = this._pointerToDate(this.props.touch.center); + var groupOptions = Object.create(me.options); + util.extend(groupOptions, { + height: null + }); - var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); - var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; + group = new Group(id, groupData, me); + me.groups[id] = group; - // calculate new start and end - var newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale; - var newEnd = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale; + // add items with this groupId to the new group + for (var itemId in me.items) { + if (me.items.hasOwnProperty(itemId)) { + var item = me.items[itemId]; + if (item.data.group == id) { + group.add(item); + } + } + } - // snapping times away from hidden zones - this.startToFront = 1 - scale > 0 ? false : true; // used to do the right autocorrection with periodic hidden times - this.endToFront = scale - 1 > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + group.order(); + group.show(); + } + else { + // update group + group.setData(groupData); + } + }); - var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, 1 - scale, true); - var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, scale - 1, true); - if (safeStart != newStart || safeEnd != newEnd) { - this.props.touch.start = safeStart; - this.props.touch.end = safeEnd; - this.scaleOffset = 1 - event.gesture.scale; - newStart = safeStart; - newEnd = safeEnd; + this.body.emitter.emit('change', {queue: true}); + }; + + /** + * Handle removed groups + * @param {Number[]} ids + * @private + */ + ItemSet.prototype._onRemoveGroups = function(ids) { + var groups = this.groups; + ids.forEach(function (id) { + var group = groups[id]; + + if (group) { + group.hide(); + delete groups[id]; } + }); - this.setRange(newStart, newEnd); + this.markDirty(); - this.startToFront = false; // revert to default - this.endToFront = true; // revert to default - } + this.body.emitter.emit('change', {queue: true}); }; /** - * Helper function to calculate the center date for zooming - * @param {{x: Number, y: Number}} pointer - * @return {number} date + * Reorder the groups if needed + * @return {boolean} changed * @private */ - Range.prototype._pointerToDate = function (pointer) { - var conversion; - var direction = this.options.direction; + ItemSet.prototype._orderGroups = function () { + if (this.groupsData) { + // reorder the groups + var groupIds = this.groupsData.getIds({ + order: this.options.groupOrder + }); + + var changed = !util.equalArray(groupIds, this.groupIds); + if (changed) { + // hide all groups, removes them from the DOM + var groups = this.groups; + groupIds.forEach(function (groupId) { + groups[groupId].hide(); + }); - validateDirection(direction); + // show the groups again, attach them to the DOM in correct order + groupIds.forEach(function (groupId) { + groups[groupId].show(); + }); - if (direction == 'horizontal') { - return this.body.util.toTime(pointer.x).valueOf(); + this.groupIds = groupIds; + } + + return changed; } else { - var height = this.body.domProps.center.height; - conversion = this.conversion(height); - return pointer.y / conversion.scale + conversion.offset; + return false; } }; /** - * Get the pointer location relative to the location of the dom element - * @param {{pageX: Number, pageY: Number}} touch - * @param {Element} element HTML DOM element - * @return {{x: Number, y: Number}} pointer + * Add a new item + * @param {Item} item * @private */ - function getPointer (touch, element) { - return { - x: touch.pageX - util.getAbsoluteLeft(element), - y: touch.pageY - util.getAbsoluteTop(element) - }; - } + ItemSet.prototype._addItem = function(item) { + this.items[item.id] = item; + + // add to group + var groupId = this._getGroupId(item.data); + var group = this.groups[groupId]; + if (group) group.add(item); + }; /** - * Zoom the range the given scale in or out. Start and end date will - * be adjusted, and the timeline will be redrawn. You can optionally give a - * date around which to zoom. - * For example, try scale = 0.9 or 1.1 - * @param {Number} scale Scaling factor. Values above 1 will zoom out, - * values below 1 will zoom in. - * @param {Number} [center] Value representing a date around which will - * be zoomed. + * Update an existing item + * @param {Item} item + * @param {Object} itemData + * @private */ - Range.prototype.zoom = function(scale, center, delta) { - // if centerDate is not provided, take it half between start Date and end Date - if (center == null) { - center = (this.start + this.end) / 2; - } + ItemSet.prototype._updateItem = function(item, itemData) { + var oldGroupId = item.data.group; - var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); - var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; + // update the items data (will redraw the item when displayed) + item.setData(itemData); - // calculate new start and end - var newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale; - var newEnd = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale; + // update group + if (oldGroupId != item.data.group) { + var oldGroup = this.groups[oldGroupId]; + if (oldGroup) oldGroup.remove(item); - // snapping times away from hidden zones - this.startToFront = delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times - this.endToFront = -delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times - var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, delta, true); - var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, -delta, true); - if (safeStart != newStart || safeEnd != newEnd) { - newStart = safeStart; - newEnd = safeEnd; + var groupId = this._getGroupId(item.data); + var group = this.groups[groupId]; + if (group) group.add(item); } + }; - this.setRange(newStart, newEnd); + /** + * Delete an item from the ItemSet: remove it from the DOM, from the map + * with items, and from the map with visible items, and from the selection + * @param {Item} item + * @private + */ + ItemSet.prototype._removeItem = function(item) { + // remove from DOM + item.hide(); - this.startToFront = false; // revert to default - this.endToFront = true; // revert to default - }; + // remove from items + delete this.items[item.id]; + // remove from selection + var index = this.selection.indexOf(item.id); + if (index != -1) this.selection.splice(index, 1); + // remove from group + item.parent && item.parent.remove(item); + }; /** - * Move the range with a given delta to the left or right. Start and end - * value will be adjusted. For example, try delta = 0.1 or -0.1 - * @param {Number} delta Moving amount. Positive value will move right, - * negative value will move left + * Create an array containing all items being a range (having an end date) + * @param array + * @returns {Array} + * @private */ - Range.prototype.move = function(delta) { - // zoom start Date and end Date relative to the centerDate - var diff = (this.end - this.start); - - // apply new values - var newStart = this.start + diff * delta; - var newEnd = this.end + diff * delta; + ItemSet.prototype._constructByEndArray = function(array) { + var endArray = []; - // TODO: reckon with min and max range + for (var i = 0; i < array.length; i++) { + if (array[i] instanceof RangeItem) { + endArray.push(array[i]); + } + } + return endArray; + }; - this.start = newStart; - this.end = newEnd; + /** + * Register the clicked item on touch, before dragStart is initiated. + * + * dragStart is initiated from a mousemove event, which can have left the item + * already resulting in an item == null + * + * @param {Event} event + * @private + */ + ItemSet.prototype._onTouch = function (event) { + // store the touched item, used in _onDragStart + this.touchParams.item = ItemSet.itemFromTarget(event); }; /** - * Move the range to a new center point - * @param {Number} moveTo New center point of the range + * Start dragging the selected events + * @param {Event} event + * @private */ - Range.prototype.moveTo = function(moveTo) { - var center = (this.start + this.end) / 2; + ItemSet.prototype._onDragStart = function (event) { + if (!this.options.editable.updateTime && !this.options.editable.updateGroup) { + return; + } - var diff = center - moveTo; + var item = this.touchParams.item || null; + var me = this; + var props; - // calculate new start and end - var newStart = this.start - diff; - var newEnd = this.end - diff; + if (item && item.selected) { + var dragLeftItem = event.target.dragLeftItem; + var dragRightItem = event.target.dragRightItem; - this.setRange(newStart, newEnd); - }; + if (dragLeftItem) { + props = { + item: dragLeftItem, + initialX: event.gesture.center.clientX + }; - module.exports = Range; + if (me.options.editable.updateTime) { + props.start = item.data.start.valueOf(); + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } + + this.touchParams.itemProps = [props]; + } + else if (dragRightItem) { + props = { + item: dragRightItem, + initialX: event.gesture.center.clientX + }; + if (me.options.editable.updateTime) { + props.end = item.data.end.valueOf(); + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } -/***/ }, -/* 22 */ -/***/ function(module, exports, __webpack_require__) { + this.touchParams.itemProps = [props]; + } + else { + this.touchParams.itemProps = this.getSelection().map(function (id) { + var item = me.items[id]; + var props = { + item: item, + initialX: event.gesture.center.clientX + }; + + if (me.options.editable.updateTime) { + if ('start' in item.data) props.start = item.data.start.valueOf(); + if ('end' in item.data) props.end = item.data.end.valueOf(); + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } + + return props; + }); + } - var Hammer = __webpack_require__(19); + event.stopPropagation(); + } + }; /** - * Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent - * @param {Element} element + * Drag selected items * @param {Event} event + * @private */ - exports.fakeGesture = function(element, event) { - var eventType = null; - - // for hammer.js 1.0.5 - // var gesture = Hammer.event.collectEventData(this, eventType, event); + ItemSet.prototype._onDrag = function (event) { + if (this.touchParams.itemProps) { + var me = this; + var snap = this.body.util.snap || null; + var xOffset = this.body.dom.root.offsetLeft + this.body.domProps.left.width; - // for hammer.js 1.0.6+ - var touches = Hammer.event.getTouchList(event, eventType); - var gesture = Hammer.event.collectEventData(this, eventType, touches, event); + // move + this.touchParams.itemProps.forEach(function (props) { + var newProps = {}; + var current = me.body.util.toTime(event.gesture.center.clientX - xOffset); + var initial = me.body.util.toTime(props.initialX - xOffset); + var offset = current - initial; - // on IE in standards mode, no touches are recognized by hammer.js, - // resulting in NaN values for center.pageX and center.pageY - if (isNaN(gesture.center.pageX)) { - gesture.center.pageX = event.pageX; - } - if (isNaN(gesture.center.pageY)) { - gesture.center.pageY = event.pageY; - } + if ('start' in props) { + var start = new Date(props.start + offset); + newProps.start = snap ? snap(start) : start; + } - return gesture; - }; + if ('end' in props) { + var end = new Date(props.end + offset); + newProps.end = snap ? snap(end) : end; + } + if ('group' in props) { + // drag from one group to another + var group = ItemSet.groupFromTarget(event); + newProps.group = group && group.groupId; + } -/***/ }, -/* 23 */ -/***/ function(module, exports, __webpack_require__) { + // confirm moving the item + var itemData = util.extend({}, props.item.data, newProps); + me.options.onMoving(itemData, function (itemData) { + if (itemData) { + me._updateItemProps(props.item, itemData); + } + }); + }); - /** - * Prototype for visual components - * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] - * @param {Object} [options] - */ - function Component (body, options) { - this.options = null; - this.props = null; - } + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); - /** - * Set options for the component. The new options will be merged into the - * current options. - * @param {Object} options - */ - Component.prototype.setOptions = function(options) { - if (options) { - util.extend(this.options, options); + event.stopPropagation(); } }; /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Update an items properties + * @param {Item} item + * @param {Object} props Can contain properties start, end, and group. + * @private */ - Component.prototype.redraw = function() { - // should be implemented by the component - return false; + ItemSet.prototype._updateItemProps = function(item, props) { + // TODO: copy all properties from props to item? (also new ones) + if ('start' in props) item.data.start = props.start; + if ('end' in props) item.data.end = props.end; + if ('group' in props && item.data.group != props.group) { + this._moveToGroup(item, props.group) + } }; /** - * Destroy the component. Cleanup DOM and event listeners + * Move an item to another group + * @param {Item} item + * @param {String | Number} groupId + * @private */ - Component.prototype.destroy = function() { - // should be implemented by the component + ItemSet.prototype._moveToGroup = function(item, groupId) { + var group = this.groups[groupId]; + if (group && group.groupId != item.data.group) { + var oldGroup = item.parent; + oldGroup.remove(item); + oldGroup.order(); + group.add(item); + group.order(); + + item.data.group = group.groupId; + } }; /** - * Test whether the component is resized since the last time _isResized() was - * called. - * @return {Boolean} Returns true if the component is resized - * @protected + * End of dragging selected items + * @param {Event} event + * @private */ - Component.prototype._isResized = function() { - var resized = (this.props._previousWidth !== this.props.width || - this.props._previousHeight !== this.props.height); + ItemSet.prototype._onDragEnd = function (event) { + if (this.touchParams.itemProps) { + // prepare a change set for the changed items + var changes = [], + me = this, + dataset = this.itemsData.getDataSet(); - this.props._previousWidth = this.props.width; - this.props._previousHeight = this.props.height; + var itemProps = this.touchParams.itemProps ; + this.touchParams.itemProps = null; + itemProps.forEach(function (props) { + var id = props.item.id, + itemData = me.itemsData.get(id, me.itemOptions); - return resized; - }; + var changed = false; + if ('start' in props.item.data) { + changed = (props.start != props.item.data.start.valueOf()); + itemData.start = util.convert(props.item.data.start, + dataset._options.type && dataset._options.type.start || 'Date'); + } + if ('end' in props.item.data) { + changed = changed || (props.end != props.item.data.end.valueOf()); + itemData.end = util.convert(props.item.data.end, + dataset._options.type && dataset._options.type.end || 'Date'); + } + if ('group' in props.item.data) { + changed = changed || (props.group != props.item.data.group); + itemData.group = props.item.data.group; + } - module.exports = Component; + // only apply changes when start or end is actually changed + if (changed) { + me.options.onMove(itemData, function (itemData) { + if (itemData) { + // apply changes + itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined) + changes.push(itemData); + } + else { + // restore original values + me._updateItemProps(props.item, props); + me.stackDirty = true; // force re-stacking of all items next redraw + me.body.emitter.emit('change'); + } + }); + } + }); -/***/ }, -/* 24 */ -/***/ function(module, exports, __webpack_require__) { + // apply the changes to the data (if there are changes) + if (changes.length) { + dataset.update(changes); + } + + event.stopPropagation(); + } + }; /** - * Created by Alex on 10/3/2014. + * Handle selecting/deselecting an item when tapping it + * @param {Event} event + * @private */ - var moment = __webpack_require__(2); + ItemSet.prototype._onSelectItem = function (event) { + if (!this.options.selectable) return; + var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; + var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; + if (ctrlKey || shiftKey) { + this._onMultiSelectItem(event); + return; + } - /** - * used in Core to convert the options into a volatile variable - * - * @param Core - */ - exports.convertHiddenOptions = function(body, hiddenDates) { - body.hiddenDates = []; - if (hiddenDates) { - if (Array.isArray(hiddenDates) == true) { - for (var i = 0; i < hiddenDates.length; i++) { - if (hiddenDates[i].repeat === undefined) { - var dateItem = {}; - dateItem.start = moment(hiddenDates[i].start).toDate().valueOf(); - dateItem.end = moment(hiddenDates[i].end).toDate().valueOf(); - body.hiddenDates.push(dateItem); - } - } - body.hiddenDates.sort(function (a, b) { - return a.start - b.start; - }); // sort by start time - } + var oldSelection = this.getSelection(); + + var item = ItemSet.itemFromTarget(event); + var selection = item ? [item.id] : []; + this.setSelection(selection); + + var newSelection = this.getSelection(); + + // emit a select event, + // except when old selection is empty and new selection is still empty + if (newSelection.length > 0 || oldSelection.length > 0) { + this.body.emitter.emit('select', { + items: newSelection + }); } }; - /** - * create new entrees for the repeating hidden dates - * @param body - * @param hiddenDates + * Handle creation and updates of an item on double tap + * @param event + * @private */ - exports.updateHiddenDates = function (body, hiddenDates) { - if (hiddenDates && body.domProps.centerContainer.width !== undefined) { - exports.convertHiddenOptions(body, hiddenDates); - - var start = moment(body.range.start); - var end = moment(body.range.end); + ItemSet.prototype._onAddItem = function (event) { + if (!this.options.selectable) return; + if (!this.options.editable.add) return; - var totalRange = (body.range.end - body.range.start); - var pixelTime = totalRange / body.domProps.centerContainer.width; + var me = this, + snap = this.body.util.snap || null, + item = ItemSet.itemFromTarget(event); - for (var i = 0; i < hiddenDates.length; i++) { - if (hiddenDates[i].repeat !== undefined) { - var startDate = moment(hiddenDates[i].start); - var endDate = moment(hiddenDates[i].end); + if (item) { + // update item - if (startDate._d == "Invalid Date") { - throw new Error("Supplied start date is not valid: " + hiddenDates[i].start); - } - if (endDate._d == "Invalid Date") { - throw new Error("Supplied end date is not valid: " + hiddenDates[i].end); - } + // execute async handler to update the item (or cancel it) + var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset + this.options.onUpdate(itemData, function (itemData) { + if (itemData) { + me.itemsData.getDataSet().update(itemData); + } + }); + } + else { + // add item + var xAbs = util.getAbsoluteLeft(this.dom.frame); + var x = event.gesture.center.pageX - xAbs; + var start = this.body.util.toTime(x); + var newItem = { + start: snap ? snap(start) : start, + content: 'new item' + }; - var duration = endDate - startDate; - if (duration >= 4 * pixelTime) { + // when default type is a range, add a default end date to the new item + if (this.options.type === 'range') { + var end = this.body.util.toTime(x + this.props.width / 5); + newItem.end = snap ? snap(end) : end; + } - var offset = 0; - var runUntil = end.clone(); - switch (hiddenDates[i].repeat) { - case "daily": // case of time - if (startDate.day() != endDate.day()) { - offset = 1; - } - startDate.dayOfYear(start.dayOfYear()); - startDate.year(start.year()); - startDate.subtract(7,'days'); + newItem[this.itemsData._fieldId] = util.randomUUID(); - endDate.dayOfYear(start.dayOfYear()); - endDate.year(start.year()); - endDate.subtract(7 - offset,'days'); + var group = ItemSet.groupFromTarget(event); + if (group) { + newItem.group = group.groupId; + } - runUntil.add(1, 'weeks'); - break; - case "weekly": - var dayOffset = endDate.diff(startDate,'days') - var day = startDate.day(); + // execute async handler to customize (or cancel) adding an item + this.options.onAdd(newItem, function (item) { + if (item) { + me.itemsData.getDataSet().add(item); + // TODO: need to trigger a redraw? + } + }); + } + }; - // set the start date to the range.start - startDate.date(start.date()); - startDate.month(start.month()); - startDate.year(start.year()); - endDate = startDate.clone(); + /** + * Handle selecting/deselecting multiple items when holding an item + * @param {Event} event + * @private + */ + ItemSet.prototype._onMultiSelectItem = function (event) { + if (!this.options.selectable) return; - // force - startDate.day(day); - endDate.day(day); - endDate.add(dayOffset,'days'); + var selection, + item = ItemSet.itemFromTarget(event); - startDate.subtract(1,'weeks'); - endDate.subtract(1,'weeks'); + if (item) { + // multi select items + selection = this.getSelection(); // current selection - runUntil.add(1, 'weeks'); - break - case "monthly": - if (startDate.month() != endDate.month()) { - offset = 1; - } - startDate.month(start.month()); - startDate.year(start.year()); - startDate.subtract(1,'months'); + var shiftKey = event.gesture.touches[0] && event.gesture.touches[0].shiftKey || false; + if (shiftKey) { + // select all items between the old selection and the tapped item - endDate.month(start.month()); - endDate.year(start.year()); - endDate.subtract(1,'months'); - endDate.add(offset,'months'); + // determine the selection range + selection.push(item.id); + var range = ItemSet._getItemRange(this.itemsData.get(selection, this.itemOptions)); - runUntil.add(1, 'months'); - break; - case "yearly": - if (startDate.year() != endDate.year()) { - offset = 1; - } - startDate.year(start.year()); - startDate.subtract(1,'years'); - endDate.year(start.year()); - endDate.subtract(1,'years'); - endDate.add(offset,'years'); + // select all items within the selection range + selection = []; + for (var id in this.items) { + if (this.items.hasOwnProperty(id)) { + var _item = this.items[id]; + var start = _item.data.start; + var end = (_item.data.end !== undefined) ? _item.data.end : start; - runUntil.add(1, 'years'); - break; - default: - console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); - return; - } - while (startDate < runUntil) { - body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); - switch (hiddenDates[i].repeat) { - case "daily": - startDate.add(1, 'days'); - endDate.add(1, 'days'); - break; - case "weekly": - startDate.add(1, 'weeks'); - endDate.add(1, 'weeks'); - break - case "monthly": - startDate.add(1, 'months'); - endDate.add(1, 'months'); - break; - case "yearly": - startDate.add(1, 'y'); - endDate.add(1, 'y'); - break; - default: - console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); - return; - } + if (start >= range.min && end <= range.max) { + selection.push(_item.id); // do not use id but item.id, id itself is stringified } - body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); } } } - // remove duplicates, merge where possible - exports.removeDuplicates(body); - // ensure the new positions are not on hidden dates - var startHidden = exports.isHidden(body.range.start, body.hiddenDates); - var endHidden = exports.isHidden(body.range.end,body.hiddenDates); - var rangeStart = body.range.start; - var rangeEnd = body.range.end; - if (startHidden.hidden == true) {rangeStart = body.range.startToFront == true ? startHidden.startDate - 1 : startHidden.endDate + 1;} - if (endHidden.hidden == true) {rangeEnd = body.range.endToFront == true ? endHidden.startDate - 1 : endHidden.endDate + 1;} - if (startHidden.hidden == true || endHidden.hidden == true) { - body.range._applyRange(rangeStart, rangeEnd); + else { + // add/remove this item from the current selection + var index = selection.indexOf(item.id); + if (index == -1) { + // item is not yet selected -> select it + selection.push(item.id); + } + else { + // item is already selected -> deselect it + selection.splice(index, 1); + } } - } - } + this.setSelection(selection); + this.body.emitter.emit('select', { + items: this.getSelection() + }); + } + }; /** - * remove duplicates from the hidden dates list. Duplicates are evil. They mess everything up. - * Scales with N^2 - * @param body + * Calculate the time range of a list of items + * @param {Array.} itemsData + * @return {{min: Date, max: Date}} Returns the range of the provided items + * @private */ - exports.removeDuplicates = function(body) { - var hiddenDates = body.hiddenDates; - var safeDates = []; - for (var i = 0; i < hiddenDates.length; i++) { - for (var j = 0; j < hiddenDates.length; j++) { - if (i != j && hiddenDates[j].remove != true && hiddenDates[i].remove != true) { - // j inside i - if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { - hiddenDates[j].remove = true; - } - // j start inside i - else if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].start <= hiddenDates[i].end) { - hiddenDates[i].end = hiddenDates[j].end; - hiddenDates[j].remove = true; - } - // j end inside i - else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { - hiddenDates[i].start = hiddenDates[j].start; - hiddenDates[j].remove = true; - } + ItemSet._getItemRange = function(itemsData) { + var max = null; + var min = null; + + itemsData.forEach(function (data) { + if (min == null || data.start < min) { + min = data.start; + } + + if (data.end != undefined) { + if (max == null || data.end > max) { + max = data.end; + } + } + else { + if (max == null || data.start > max) { + max = data.start; } } + }); + + return { + min: min, + max: max } + }; - for (var i = 0; i < hiddenDates.length; i++) { - if (hiddenDates[i].remove !== true) { - safeDates.push(hiddenDates[i]); + /** + * Find an item from an event target: + * searches for the attribute 'timeline-item' in the event target's element tree + * @param {Event} event + * @return {Item | null} item + */ + ItemSet.itemFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-item')) { + return target['timeline-item']; } + target = target.parentNode; } - body.hiddenDates = safeDates; - body.hiddenDates.sort(function (a, b) { - return a.start - b.start; - }); // sort by start time - } - - exports.printDates = function(dates) { - for (var i =0; i < dates.length; i++) { - console.log(i, new Date(dates[i].start),new Date(dates[i].end), dates[i].start, dates[i].end, dates[i].remove); - } - } + return null; + }; /** - * Used in TimeStep to avoid the hidden times. - * @param timeStep - * @param previousTime + * Find the Group from an event target: + * searches for the attribute 'timeline-group' in the event target's element tree + * @param {Event} event + * @return {Group | null} group */ - exports.stepOverHiddenDates = function(timeStep, previousTime) { - var stepInHidden = false; - var currentValue = timeStep.current.valueOf(); - for (var i = 0; i < timeStep.hiddenDates.length; i++) { - var startDate = timeStep.hiddenDates[i].start; - var endDate = timeStep.hiddenDates[i].end; - if (currentValue >= startDate && currentValue < endDate) { - stepInHidden = true; - break; + ItemSet.groupFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-group')) { + return target['timeline-group']; } + target = target.parentNode; } - if (stepInHidden == true && currentValue < timeStep._end.valueOf() && currentValue != previousTime) { - var prevValue = moment(previousTime); - var newValue = moment(endDate); - //check if the next step should be major - if (prevValue.year() != newValue.year()) {timeStep.switchedYear = true;} - else if (prevValue.month() != newValue.month()) {timeStep.switchedMonth = true;} - else if (prevValue.dayOfYear() != newValue.dayOfYear()) {timeStep.switchedDay = true;} + return null; + }; - timeStep.current = newValue.toDate(); + /** + * Find the ItemSet from an event target: + * searches for the attribute 'timeline-itemset' in the event target's element tree + * @param {Event} event + * @return {ItemSet | null} item + */ + ItemSet.itemSetFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-itemset')) { + return target['timeline-itemset']; + } + target = target.parentNode; } + + return null; }; + module.exports = ItemSet; - ///** - // * Used in TimeStep to avoid the hidden times. - // * @param timeStep - // * @param previousTime - // */ - //exports.checkFirstStep = function(timeStep) { - // var stepInHidden = false; - // var currentValue = timeStep.current.valueOf(); - // for (var i = 0; i < timeStep.hiddenDates.length; i++) { - // var startDate = timeStep.hiddenDates[i].start; - // var endDate = timeStep.hiddenDates[i].end; - // if (currentValue >= startDate && currentValue < endDate) { - // stepInHidden = true; - // break; - // } - // } - // - // if (stepInHidden == true && currentValue <= timeStep._end.valueOf()) { - // var newValue = moment(endDate); - // timeStep.current = newValue.toDate(); - // } - //}; + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var Component = __webpack_require__(20); /** - * replaces the Core toScreen methods - * @param Core - * @param time - * @param width - * @returns {number} + * Legend for Graph2d */ - exports.toScreen = function(Core, time, width) { - if (Core.body.hiddenDates.length == 0) { - var conversion = Core.range.conversion(width); - return (time.valueOf() - conversion.offset) * conversion.scale; - } - else { - var hidden = exports.isHidden(time, Core.body.hiddenDates) - if (hidden.hidden == true) { - time = hidden.startDate; + function Legend(body, options, side, linegraphOptions) { + this.body = body; + this.defaultOptions = { + enabled: true, + icons: true, + iconSize: 20, + iconSpacing: 6, + left: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + }, + right: { + visible: true, + position: 'top-left' // top/bottom - left,center,right } + } + this.side = side; + this.options = util.extend({},this.defaultOptions); + this.linegraphOptions = linegraphOptions; - var duration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); - time = exports.correctTimeForHidden(Core.body.hiddenDates, Core.range, time); + this.svgElements = {}; + this.dom = {}; + this.groups = {}; + this.amountOfGroups = 0; + this._create(); - var conversion = Core.range.conversion(width, duration); - return (time.valueOf() - conversion.offset) * conversion.scale; - } - }; + this.setOptions(options); + } + Legend.prototype = new Component(); - /** - * Replaces the core toTime methods - * @param body - * @param range - * @param x - * @param width - * @returns {Date} - */ - exports.toTime = function(Core, x, width) { - if (Core.body.hiddenDates.length == 0) { - var conversion = Core.range.conversion(width); - return new Date(x / conversion.scale + conversion.offset); + Legend.prototype.clear = function() { + this.groups = {}; + this.amountOfGroups = 0; + } + + Legend.prototype.addGroup = function(label, graphOptions) { + + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; } - else { - var hiddenDuration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); - var totalDuration = Core.range.end - Core.range.start - hiddenDuration; - var partialDuration = totalDuration * x / width; - var accumulatedHiddenDuration = exports.getAccumulatedHiddenDuration(Core.body.hiddenDates, Core.range, partialDuration); + this.amountOfGroups += 1; + }; - var newTime = new Date(accumulatedHiddenDuration + partialDuration + Core.range.start); - return newTime; + Legend.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; + + Legend.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; } }; + Legend.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.className = 'legend'; + this.dom.frame.style.position = "absolute"; + this.dom.frame.style.top = "10px"; + this.dom.frame.style.display = "block"; + + this.dom.textArea = document.createElement('div'); + this.dom.textArea.className = 'legendText'; + this.dom.textArea.style.position = "relative"; + this.dom.textArea.style.top = "0px"; + + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = 'absolute'; + this.svg.style.top = 0 +'px'; + this.svg.style.width = this.options.iconSize + 5 + 'px'; + this.svg.style.height = '100%'; + + this.dom.frame.appendChild(this.svg); + this.dom.frame.appendChild(this.dom.textArea); + }; /** - * Support function - * - * @param hiddenDates - * @param range - * @returns {number} + * Hide the component from the DOM */ - exports.getHiddenDurationBetween = function(hiddenDates, start, end) { - var duration = 0; - for (var i = 0; i < hiddenDates.length; i++) { - var startDate = hiddenDates[i].start; - var endDate = hiddenDates[i].end; - // if time after the cutout, and the - if (startDate >= start && endDate < end) { - duration += endDate - startDate; - } + Legend.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); } - return duration; }; - /** - * Support function - * @param hiddenDates - * @param range - * @param time - * @returns {{duration: number, time: *, offset: number}} + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed */ - exports.correctTimeForHidden = function(hiddenDates, range, time) { - time = moment(time).toDate().valueOf(); - time -= exports.getHiddenDurationBefore(hiddenDates,range,time); - return time; + Legend.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } }; - exports.getHiddenDurationBefore = function(hiddenDates, range, time) { - var timeOffset = 0; - time = moment(time).toDate().valueOf(); + Legend.prototype.setOptions = function(options) { + var fields = ['enabled','orientation','icons','left','right']; + util.selectiveDeepExtend(fields, this.options, options); + }; - for (var i = 0; i < hiddenDates.length; i++) { - var startDate = hiddenDates[i].start; - var endDate = hiddenDates[i].end; - // if time after the cutout, and the - if (startDate >= range.start && endDate < range.end) { - if (time >= endDate) { - timeOffset += (endDate - startDate); + Legend.prototype.redraw = function() { + var activeGroups = 0; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; } } } - return timeOffset; - } - /** - * sum the duration from start to finish, including the hidden duration, - * until the required amount has been reached, return the accumulated hidden duration - * @param hiddenDates - * @param range - * @param time - * @returns {{duration: number, time: *, offset: number}} - */ - exports.getAccumulatedHiddenDuration = function(hiddenDates, range, requiredDuration) { - var hiddenDuration = 0; - var duration = 0; - var previousPoint = range.start; - //exports.printDates(hiddenDates) - for (var i = 0; i < hiddenDates.length; i++) { - var startDate = hiddenDates[i].start; - var endDate = hiddenDates[i].end; - // if time after the cutout, and the - if (startDate >= range.start && endDate < range.end) { - duration += startDate - previousPoint; - previousPoint = endDate; - if (duration >= requiredDuration) { - break; - } - else { - hiddenDuration += endDate - startDate; - } - } + if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { + this.hide(); } + else { + this.show(); + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { + this.dom.frame.style.left = '4px'; + this.dom.frame.style.textAlign = "left"; + this.dom.textArea.style.textAlign = "left"; + this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.right = ''; + this.svg.style.left = 0 +'px'; + this.svg.style.right = ''; + } + else { + this.dom.frame.style.right = '4px'; + this.dom.frame.style.textAlign = "right"; + this.dom.textArea.style.textAlign = "right"; + this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.left = ''; + this.svg.style.right = 0 +'px'; + this.svg.style.left = ''; + } - return hiddenDuration; - }; - - + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { + this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.bottom = ''; + } + else { + var scrollableHeight = this.body.domProps.center.height - this.body.domProps.centerContainer.height; + this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.top = ''; + } - /** - * used to step over to either side of a hidden block. Correction is disabled on tablets, might be set to true - * @param hiddenDates - * @param time - * @param direction - * @param correctionEnabled - * @returns {*} - */ - exports.snapAwayFromHidden = function(hiddenDates, time, direction, correctionEnabled) { - var isHidden = exports.isHidden(time, hiddenDates); - if (isHidden.hidden == true) { - if (direction < 0) { - if (correctionEnabled == true) { - return isHidden.startDate - (isHidden.endDate - time) - 1; - } - else { - return isHidden.startDate - 1; - } + if (this.options.icons == false) { + this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; + this.dom.textArea.style.right = ''; + this.dom.textArea.style.left = ''; + this.svg.style.width = '0px'; } else { - if (correctionEnabled == true) { - return isHidden.endDate + (time - isHidden.startDate) + 1; - } - else { - return isHidden.endDate + 1; + this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' + this.drawLegendIcons(); + } + + var content = ''; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + content += this.groups[groupId].content + '
'; + } } } + this.dom.textArea.innerHTML = content; + this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; } - else { - return time; - } - - } + }; + Legend.prototype.drawLegendIcons = function() { + if (this.dom.frame.parentNode) { + DOMutil.prepareElements(this.svgElements); + var padding = window.getComputedStyle(this.dom.frame).paddingTop; + var iconOffset = Number(padding.replace('px','')); + var x = iconOffset; + var iconWidth = this.options.iconSize; + var iconHeight = 0.75 * this.options.iconSize; + var y = iconOffset + 0.5 * iconHeight + 3; - /** - * Check if a time is hidden - * - * @param time - * @param hiddenDates - * @returns {{hidden: boolean, startDate: Window.start, endDate: *}} - */ - exports.isHidden = function(time, hiddenDates) { - for (var i = 0; i < hiddenDates.length; i++) { - var startDate = hiddenDates[i].start; - var endDate = hiddenDates[i].end; + this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; - if (time >= startDate && time < endDate) { // if the start is entering a hidden zone - return {hidden: true, startDate: startDate, endDate: endDate}; - break; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + this.options.iconSpacing; + } + } } + + DOMutil.cleanupElements(this.svgElements); } - return {hidden: false, startDate: startDate, endDate: endDate}; - } + }; + + module.exports = Legend; + /***/ }, -/* 25 */ +/* 29 */ /***/ function(module, exports, __webpack_require__) { - var Emitter = __webpack_require__(11); - var Hammer = __webpack_require__(19); var util = __webpack_require__(1); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var Range = __webpack_require__(21); - var ItemSet = __webpack_require__(26); - var Activator = __webpack_require__(35); - var DateUtil = __webpack_require__(24); + var DOMutil = __webpack_require__(2); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Component = __webpack_require__(20); + var DataAxis = __webpack_require__(23); + var GraphGroup = __webpack_require__(24); + var Legend = __webpack_require__(28); + var BarGraphFunctions = __webpack_require__(52); + + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Core.setOptions for the available options. + * This is the constructor of the LineGraph. It requires a Timeline body and options. + * + * @param body + * @param options * @constructor */ - function Core () {} + function LineGraph(body, options) { + this.id = util.randomUUID(); + this.body = body; - // turn Core into an event emitter - Emitter(Core.prototype); + this.defaultOptions = { + yAxisOrientation: 'left', + defaultGroup: 'default', + sort: true, + sampling: true, + graphHeight: '400px', + shaded: { + enabled: false, + orientation: 'bottom' // top, bottom + }, + style: 'line', // line, bar + barChart: { + width: 50, + handleOverlap: 'overlap', + align: 'center' // left, center, right + }, + catmullRom: { + enabled: true, + parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) + alpha: 0.5 + }, + drawPoints: { + enabled: true, + size: 6, + style: 'square' // square, circle + }, + dataAxis: { + showMinorLabels: true, + showMajorLabels: true, + icons: false, + width: '40px', + visible: true, + alignZeros: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + } + //, these options are not set by default, but this shows the format they will be in + //format: { + // left: {decimals: 2}, + // right: {decimals: 2} + //}, + //title: { + // left: { + // text: 'left', + // style: 'color:black;' + // }, + // right: { + // text: 'right', + // style: 'color:black;' + // } + //} + }, + legend: { + enabled: false, + icons: true, + left: { + visible: true, + position: 'top-left' // top/bottom - left,right + }, + right: { + visible: true, + position: 'top-right' // top/bottom - left,right + } + }, + groups: { + visibility: {} + } + }; - /** - * Create the main DOM for the Core: a root panel containing left, right, - * top, bottom, content, and background panel. - * @param {Element} container The container element where the Core will - * be attached. - * @private - */ - Core.prototype._create = function (container) { + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); this.dom = {}; - - this.dom.root = document.createElement('div'); - this.dom.background = document.createElement('div'); - this.dom.backgroundVertical = document.createElement('div'); - this.dom.backgroundHorizontal = document.createElement('div'); - this.dom.centerContainer = document.createElement('div'); - this.dom.leftContainer = document.createElement('div'); - this.dom.rightContainer = document.createElement('div'); - this.dom.center = document.createElement('div'); - this.dom.left = document.createElement('div'); - this.dom.right = document.createElement('div'); - this.dom.top = document.createElement('div'); - this.dom.bottom = document.createElement('div'); - this.dom.shadowTop = document.createElement('div'); - this.dom.shadowBottom = document.createElement('div'); - this.dom.shadowTopLeft = document.createElement('div'); - this.dom.shadowBottomLeft = document.createElement('div'); - this.dom.shadowTopRight = document.createElement('div'); - this.dom.shadowBottomRight = document.createElement('div'); - - this.dom.root.className = 'vis timeline root'; - this.dom.background.className = 'vispanel background'; - this.dom.backgroundVertical.className = 'vispanel background vertical'; - this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; - this.dom.centerContainer.className = 'vispanel center'; - this.dom.leftContainer.className = 'vispanel left'; - this.dom.rightContainer.className = 'vispanel right'; - this.dom.top.className = 'vispanel top'; - this.dom.bottom.className = 'vispanel bottom'; - this.dom.left.className = 'content'; - this.dom.center.className = 'content'; - this.dom.right.className = 'content'; - this.dom.shadowTop.className = 'shadow top'; - this.dom.shadowBottom.className = 'shadow bottom'; - this.dom.shadowTopLeft.className = 'shadow top'; - this.dom.shadowBottomLeft.className = 'shadow bottom'; - this.dom.shadowTopRight.className = 'shadow top'; - this.dom.shadowBottomRight.className = 'shadow bottom'; - - this.dom.root.appendChild(this.dom.background); - this.dom.root.appendChild(this.dom.backgroundVertical); - this.dom.root.appendChild(this.dom.backgroundHorizontal); - this.dom.root.appendChild(this.dom.centerContainer); - this.dom.root.appendChild(this.dom.leftContainer); - this.dom.root.appendChild(this.dom.rightContainer); - this.dom.root.appendChild(this.dom.top); - this.dom.root.appendChild(this.dom.bottom); - - this.dom.centerContainer.appendChild(this.dom.center); - this.dom.leftContainer.appendChild(this.dom.left); - this.dom.rightContainer.appendChild(this.dom.right); - - this.dom.centerContainer.appendChild(this.dom.shadowTop); - this.dom.centerContainer.appendChild(this.dom.shadowBottom); - this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); - this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); - this.dom.rightContainer.appendChild(this.dom.shadowTopRight); - this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - - this.on('rangechange', this.redraw.bind(this)); - this.on('touch', this._onTouch.bind(this)); - this.on('pinch', this._onPinch.bind(this)); - this.on('dragstart', this._onDragStart.bind(this)); - this.on('drag', this._onDrag.bind(this)); + this.props = {}; + this.hammer = null; + this.groups = {}; + this.abortedGraphUpdate = false; + this.autoSizeSVG = false; var me = this; - this.on('change', function (properties) { - if (properties && properties.queue == true) { - // redraw once on next tick - if (!me._redrawTimer) { - me._redrawTimer = setTimeout(function () { - me._redrawTimer = null; - me.redraw(); - }, 0) - } + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); } - else { - // redraw immediately - me.redraw(); + }; + + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); } - }); + }; - // create event listeners for all interesting events, these events will be - // emitted via emitter - this.hammer = Hammer(this.dom.root, { - preventDefault: true - }); - this.listeners = {}; + this.items = {}; // object with an Item for every data item + this.selection = []; // list with the ids of all selected nodes + this.lastStart = this.body.range.start; + this.touchParams = {}; // stores properties while dragging - var events = [ - 'touch', 'pinch', - 'tap', 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox - ]; - events.forEach(function (event) { - var listener = function () { - var args = [event].concat(Array.prototype.slice.call(arguments, 0)); - if (me.isActive()) { - me.emit.apply(me, args); - } - }; - me.hammer.on(event, listener); - me.listeners[event] = listener; + this.svgElements = {}; + this.setOptions(options); + this.groupsUsingDefaultStyles = [0]; + + this.body.emitter.on('rangechanged', function() { + me.lastStart = me.body.range.start; + me.svg.style.left = util.option.asSize(-me.width); + me._updateGraph.apply(me); }); - // size properties of each of the panels - this.props = { - root: {}, - background: {}, - centerContainer: {}, - leftContainer: {}, - rightContainer: {}, - center: {}, - left: {}, - right: {}, - top: {}, - bottom: {}, - border: {}, - scrollTop: 0, - scrollTopMin: 0 - }; - this.touch = {}; // store state information needed for touch events + // create the HTML DOM + this._create(); + this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; + this.body.emitter.emit('change'); - this.redrawCount = 0; + } - // attach the root panel to the provided container - if (!container) throw new Error('No container provided'); - container.appendChild(this.dom.root); - }; + LineGraph.prototype = new Component(); /** - * Set options. Options will be passed to all components loaded in the Timeline. - * @param {Object} [options] - * {String} orientation - * Vertical orientation for the Timeline, - * can be 'bottom' (default) or 'top'. - * {String | Number} width - * Width for the timeline, a number in pixels or - * a css string like '1000px' or '75%'. '100%' by default. - * {String | Number} height - * Fixed height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. If undefined, - * The Timeline will automatically size such that - * its contents fit. - * {String | Number} minHeight - * Minimum height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. - * {String | Number} maxHeight - * Maximum height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. - * {Number | Date | String} start - * Start date for the visible window - * {Number | Date | String} end - * End date for the visible window + * Create the HTML DOM for the ItemSet */ - Core.prototype.setOptions = function (options) { - if (options) { - // copy the known options - var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation', 'clickToUse', 'dataAttributes', 'hiddenDates']; - util.selectiveExtend(fields, this.options, options); - - if ('hiddenDates' in this.options) { - DateUtil.convertHiddenOptions(this.body, this.options.hiddenDates); - } - - if ('clickToUse' in options) { - if (options.clickToUse) { - this.activator = new Activator(this.dom.root); - } - else { - if (this.activator) { - this.activator.destroy(); - delete this.activator; - } - } - } + LineGraph.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'LineGraph'; + this.dom.frame = frame; - // enable/disable autoResize - this._initAutoResize(); - } + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg','svg'); + this.svg.style.position = 'relative'; + this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + this.svg.style.display = 'block'; + frame.appendChild(this.svg); - // propagate options to all components - this.components.forEach(function (component) { - component.setOptions(options); - }); + // data axis + this.options.dataAxis.orientation = 'left'; + this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); - // TODO: remove deprecation error one day (deprecated since version 0.8.0) - if (options && options.order) { - throw new Error('Option order is deprecated. There is no replacement for this feature.'); - } + this.options.dataAxis.orientation = 'right'; + this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); + delete this.options.dataAxis.orientation; - // redraw everything - this.redraw(); - }; + // legends + this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); + this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); - /** - * Returns true when the Timeline is active. - * @returns {boolean} - */ - Core.prototype.isActive = function () { - return !this.activator || this.activator.active; + this.show(); }; /** - * Destroy the Core, clean up all DOM elements and event listeners. + * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. + * @param {object} options */ - Core.prototype.destroy = function () { - // unbind datasets - this.clear(); - - // remove all event listeners - this.off(); - - // stop checking for changed size - this._stopAutoResize(); - - // remove from DOM - if (this.dom.root.parentNode) { - this.dom.root.parentNode.removeChild(this.dom.root); - } - this.dom = null; - - // remove Activator - if (this.activator) { - this.activator.destroy(); - delete this.activator; - } - - // cleanup hammer touch events - for (var event in this.listeners) { - if (this.listeners.hasOwnProperty(event)) { - delete this.listeners[event]; + LineGraph.prototype.setOptions = function(options) { + if (options) { + var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; + if (options.graphHeight === undefined && options.height !== undefined && this.body.domProps.centerContainer.height !== undefined) { + this.autoSizeSVG = true; } - } - this.listeners = null; - this.hammer = null; + else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) { + if (parseInt((options.graphHeight + '').replace("px",'')) < this.body.domProps.centerContainer.height) { + this.autoSizeSVG = true; + } + } + util.selectiveDeepExtend(fields, this.options, options); + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); + util.mergeOptions(this.options, options,'legend'); - // give all components the opportunity to cleanup - this.components.forEach(function (component) { - component.destroy(); - }); + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } + } + } + } - this.body = null; - }; + if (this.yAxisLeft) { + if (options.dataAxis !== undefined) { + this.yAxisLeft.setOptions(this.options.dataAxis); + this.yAxisRight.setOptions(this.options.dataAxis); + } + } + if (this.legendLeft) { + if (options.legend !== undefined) { + this.legendLeft.setOptions(this.options.legend); + this.legendRight.setOptions(this.options.legend); + } + } - /** - * Set a custom time bar - * @param {Date} time - */ - Core.prototype.setCustomTime = function (time) { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); + if (this.groups.hasOwnProperty(UNGROUPED)) { + this.groups[UNGROUPED].setOptions(options); + } + } + if (this.dom.frame) { + this._updateGraph(); } - - this.customTime.setCustomTime(time); }; /** - * Retrieve the current custom time. - * @return {Date} customTime + * Hide the component from the DOM */ - Core.prototype.getCustomTime = function() { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); + LineGraph.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); } - - return this.customTime.getCustomTime(); }; /** - * Get the id's of the currently visible items. - * @returns {Array} The ids of the visible items + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed */ - Core.prototype.getVisibleItems = function() { - return this.itemSet && this.itemSet.getVisibleItems() || []; + LineGraph.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } }; - /** - * Clear the Core. By Default, items, groups and options are cleared. - * Example usage: - * - * timeline.clear(); // clear items, groups, and options - * timeline.clear({options: true}); // clear options only - * - * @param {Object} [what] Optionally specify what to clear. By default: - * {items: true, groups: true, options: true} + * Set items + * @param {vis.DataSet | null} items */ - Core.prototype.clear = function(what) { - // clear items - if (!what || what.items) { - this.setItems(null); - } + LineGraph.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; - // clear groups - if (!what || what.groups) { - this.setGroups(null); + // replace the dataset + if (!items) { + this.itemsData = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); } - // clear options of timeline and of each of the components - if (!what || what.options) { - this.components.forEach(function (component) { - component.setOptions(component.defaultOptions); + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); }); - this.setOptions(this.defaultOptions); // this will also do a redraw + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); } - }; - /** - * Set Core window such that it fits all items - * @param {Object} [options] Available options: - * `animate: boolean | number` - * If true (default), the range is animated - * smoothly to the new window. - * If a number, the number is taken as duration - * for the animation. Default duration is 500 ms. - */ - Core.prototype.fit = function(options) { - var range = this._getDataRange(); + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); - // skip range set if there is no start and end date - if (range.start === null && range.end === null) { - return; + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); } - - var animate = (options && options.animate !== undefined) ? options.animate : true; - this.range.setRange(range.start, range.end, animate); + this._updateUngrouped(); + this._updateGraph(); + this.redraw(); }; + /** - * Calculate the data range of the items and applies a 5% window around it. - * @returns {{start: Date | null, end: Date | null}} - * @protected + * Set groups + * @param {vis.DataSet} groups */ - Core.prototype._getDataRange = function() { - // apply the data range as range - var dataRange = this.getItemRange(); + LineGraph.prototype.setGroups = function(groups) { + var me = this; + var ids; - // add 5% space on both sides - var start = dataRange.min; - var end = dataRange.max; - if (start != null && end != null) { - var interval = (end.valueOf() - start.valueOf()); - if (interval <= 0) { - // prevent an empty interval - interval = 24 * 60 * 60 * 1000; // 1 day - } - start = new Date(start.valueOf() - interval * 0.05); - end = new Date(end.valueOf() + interval * 0.05); - } + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); - return { - start: start, - end: end + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw } - }; - /** - * Set the visible window. Both parameters are optional, you can change only - * start or only end. Syntax: - * - * TimeLine.setWindow(start, end) - * TimeLine.setWindow(range) - * - * Where start and end can be a Date, number, or string, and range is an - * object with properties start and end. - * - * @param {Date | Number | String | Object} [start] Start date of visible window - * @param {Date | Number | String} [end] End date of visible window - * @param {Object} [options] Available options: - * `animate: boolean | number` - * If true (default), the range is animated - * smoothly to the new window. - * If a number, the number is taken as duration - * for the animation. Default duration is 500 ms. - */ - Core.prototype.setWindow = function(start, end, options) { - var animate = (options && options.animate !== undefined) ? options.animate : true; - if (arguments.length == 1) { - var range = arguments[0]; - this.range.setRange(range.start, range.end, animate); + // replace the dataset + if (!groups) { + this.groupsData = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; } else { - this.range.setRange(start, end, animate); + throw new TypeError('Data must be an instance of DataSet or DataView'); + } + + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); + + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); } + this._onUpdate(); }; + /** - * Move the window such that given time is centered on screen. - * @param {Date | Number | String} time - * @param {Object} [options] Available options: - * `animate: boolean | number` - * If true (default), the range is animated - * smoothly to the new window. - * If a number, the number is taken as duration - * for the animation. Default duration is 500 ms. + * Update the data + * @param [ids] + * @private */ - Core.prototype.moveTo = function(time, options) { - var interval = this.range.end - this.range.start; - var t = util.convert(time, 'Date').valueOf(); - - var start = t - interval / 2; - var end = t + interval / 2; - var animate = (options && options.animate !== undefined) ? options.animate : true; + LineGraph.prototype._onUpdate = function(ids) { + this._updateUngrouped(); + this._updateAllGroupData(); + this._updateGraph(); + this.redraw(); + }; + LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onUpdateGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + var group = this.groupsData.get(groupIds[i]); + this._updateGroup(group, groupIds[i]); + } - this.range.setRange(start, end, animate); + this._updateGraph(); + this.redraw(); }; + LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; + /** - * Get the visible window - * @return {{start: Date, end: Date}} Visible range + * this cleans the group out off the legends and the dataaxis, updates the ungrouped and updates the graph + * @param {Array} groupIds + * @private */ - Core.prototype.getWindow = function() { - var range = this.range.getRange(); - return { - start: new Date(range.start), - end: new Date(range.end) - }; + LineGraph.prototype._onRemoveGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + if (this.groups.hasOwnProperty(groupIds[i])) { + if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { + this.yAxisRight.removeGroup(groupIds[i]); + this.legendRight.removeGroup(groupIds[i]); + this.legendRight.redraw(); + } + else { + this.yAxisLeft.removeGroup(groupIds[i]); + this.legendLeft.removeGroup(groupIds[i]); + this.legendLeft.redraw(); + } + delete this.groups[groupIds[i]]; + } + } + this._updateUngrouped(); + this._updateGraph(); + this.redraw(); }; + /** - * Force a redraw of the Core. Can be useful to manually redraw when - * option autoResize=false + * update a group object with the group dataset entree + * + * @param group + * @param groupId + * @private */ - Core.prototype.redraw = function() { - var resized = false; - var options = this.options; - var props = this.props; - var dom = this.dom; - - if (!dom) return; // when destroyed - - DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); - - // update class names - if (options.orientation == 'top') { - util.addClassName(dom.root, 'top'); - util.removeClassName(dom.root, 'bottom'); + LineGraph.prototype._updateGroup = function (group, groupId) { + if (!this.groups.hasOwnProperty(groupId)) { + this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.addGroup(groupId, this.groups[groupId]); + this.legendRight.addGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.addGroup(groupId, this.groups[groupId]); + this.legendLeft.addGroup(groupId, this.groups[groupId]); + } } else { - util.removeClassName(dom.root, 'top'); - util.addClassName(dom.root, 'bottom'); + this.groups[groupId].update(group); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.updateGroup(groupId, this.groups[groupId]); + this.legendRight.updateGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); + this.legendLeft.updateGroup(groupId, this.groups[groupId]); + } } + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; - // update root width and height options - dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); - dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); - dom.root.style.width = util.option.asSize(options.width, ''); - - // calculate border widths - props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; - props.border.right = props.border.left; - props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; - props.border.bottom = props.border.top; - var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; - var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; - // workaround for a bug in IE: the clientWidth of an element with - // a height:0px and overflow:hidden is not calculated and always has value 0 - if (dom.centerContainer.clientHeight === 0) { - props.border.left = props.border.top; - props.border.right = props.border.left; - } - if (dom.root.clientHeight === 0) { - borderRootWidth = borderRootHeight; + /** + * this updates all groups, it is used when there is an update the the itemset. + * + * @private + */ + LineGraph.prototype._updateAllGroupData = function () { + if (this.itemsData != null) { + var groupsContent = {}; + var groupId; + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + groupsContent[groupId] = []; + } + } + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + if (groupsContent[item.group] === undefined) { + throw new Error('Cannot find referenced group. Possible reason: items added before groups? Groups need to be added before items, as items refer to groups.') + } + item.x = util.convert(item.x,'Date'); + groupsContent[item.group].push(item); + } + } + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + this.groups[groupId].setItems(groupsContent[groupId]); + } + } } + }; - // calculate the heights. If any of the side panels is empty, we set the height to - // minus the border width, such that the border will be invisible - props.center.height = dom.center.offsetHeight; - props.left.height = dom.left.offsetHeight; - props.right.height = dom.right.offsetHeight; - props.top.height = dom.top.clientHeight || -props.border.top; - props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; - - // TODO: compensate borders when any of the panels is empty. - - // apply auto height - // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) - var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); - var autoHeight = props.top.height + contentHeight + props.bottom.height + - borderRootHeight + props.border.top + props.border.bottom; - dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); - - // calculate heights of the content panels - props.root.height = dom.root.offsetHeight; - props.background.height = props.root.height - borderRootHeight; - var containerHeight = props.root.height - props.top.height - props.bottom.height - - borderRootHeight; - props.centerContainer.height = containerHeight; - props.leftContainer.height = containerHeight; - props.rightContainer.height = props.leftContainer.height; - - // calculate the widths of the panels - props.root.width = dom.root.offsetWidth; - props.background.width = props.root.width - borderRootWidth; - props.left.width = dom.leftContainer.clientWidth || -props.border.left; - props.leftContainer.width = props.left.width; - props.right.width = dom.rightContainer.clientWidth || -props.border.right; - props.rightContainer.width = props.right.width; - var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; - props.center.width = centerWidth; - props.centerContainer.width = centerWidth; - props.top.width = centerWidth; - props.bottom.width = centerWidth; - - // resize the panels - dom.background.style.height = props.background.height + 'px'; - dom.backgroundVertical.style.height = props.background.height + 'px'; - dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; - dom.centerContainer.style.height = props.centerContainer.height + 'px'; - dom.leftContainer.style.height = props.leftContainer.height + 'px'; - dom.rightContainer.style.height = props.rightContainer.height + 'px'; - - dom.background.style.width = props.background.width + 'px'; - dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; - dom.backgroundHorizontal.style.width = props.background.width + 'px'; - dom.centerContainer.style.width = props.center.width + 'px'; - dom.top.style.width = props.top.width + 'px'; - dom.bottom.style.width = props.bottom.width + 'px'; - - // reposition the panels - dom.background.style.left = '0'; - dom.background.style.top = '0'; - dom.backgroundVertical.style.left = (props.left.width + props.border.left) + 'px'; - dom.backgroundVertical.style.top = '0'; - dom.backgroundHorizontal.style.left = '0'; - dom.backgroundHorizontal.style.top = props.top.height + 'px'; - dom.centerContainer.style.left = props.left.width + 'px'; - dom.centerContainer.style.top = props.top.height + 'px'; - dom.leftContainer.style.left = '0'; - dom.leftContainer.style.top = props.top.height + 'px'; - dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; - dom.rightContainer.style.top = props.top.height + 'px'; - dom.top.style.left = props.left.width + 'px'; - dom.top.style.top = '0'; - dom.bottom.style.left = props.left.width + 'px'; - dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; - - // update the scrollTop, feasible range for the offset can be changed - // when the height of the Core or of the contents of the center changed - this._updateScrollTop(); - - // reposition the scrollable contents - var offset = this.props.scrollTop; - if (options.orientation == 'bottom') { - offset += Math.max(this.props.centerContainer.height - this.props.center.height - - this.props.border.top - this.props.border.bottom, 0); - } - dom.center.style.left = '0'; - dom.center.style.top = offset + 'px'; - dom.left.style.left = '0'; - dom.left.style.top = offset + 'px'; - dom.right.style.left = '0'; - dom.right.style.top = offset + 'px'; - // show shadows when vertical scrolling is available - var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; - var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; - dom.shadowTop.style.visibility = visibilityTop; - dom.shadowBottom.style.visibility = visibilityBottom; - dom.shadowTopLeft.style.visibility = visibilityTop; - dom.shadowBottomLeft.style.visibility = visibilityBottom; - dom.shadowTopRight.style.visibility = visibilityTop; - dom.shadowBottomRight.style.visibility = visibilityBottom; + /** + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. This anonymous group is called 'graph'. + * @protected + */ + LineGraph.prototype._updateUngrouped = function() { + if (this.itemsData && this.itemsData != null) { + var ungroupedCounter = 0; + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + if (item != undefined) { + if (item.hasOwnProperty('group')) { + if (item.group === undefined) { + item.group = UNGROUPED; + } + } + else { + item.group = UNGROUPED; + } + ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; + } + } + } - // redraw all components - this.components.forEach(function (component) { - resized = component.redraw() || resized; - }); - if (resized) { - // keep repainting until all sizes are settled - var MAX_REDRAWS = 2; // maximum number of consecutive redraws - if (this.redrawCount < MAX_REDRAWS) { - this.redrawCount++; - this.redraw(); + if (ungroupedCounter == 0) { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); } else { - console.log('WARNING: infinite loop in redraw?') + var group = {id: UNGROUPED, content: this.options.defaultGroup}; + this._updateGroup(group, UNGROUPED); } - this.redrawCount = 0; + } + else { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); } - this.emit("finishedRedraw"); + this.legendLeft.redraw(); + this.legendRight.redraw(); }; - // TODO: deprecated since version 1.1.0, remove some day - Core.prototype.repaint = function () { - throw new Error('Function repaint is deprecated. Use redraw instead.'); - }; /** - * Set a current time. This can be used for example to ensure that a client's - * time is synchronized with a shared server time. - * Only applicable when option `showCurrentTime` is true. - * @param {Date | String | Number} time A Date, unix timestamp, or - * ISO date string. + * Redraw the component, mandatory function + * @return {boolean} Returns true if the component is resized */ - Core.prototype.setCurrentTime = function(time) { - if (!this.currentTime) { - throw new Error('Option showCurrentTime must be true'); + LineGraph.prototype.redraw = function() { + var resized = false; + + this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + if (this.lastWidth === undefined && this.width || this.lastWidth != this.width) { + resized = true; } + // check if this component is resized + resized = this._isResized() || resized; + // check whether zoomed (in that case we need to re-stack everything) + var visibleInterval = this.body.range.end - this.body.range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); + this.lastVisibleInterval = visibleInterval; + this.lastWidth = this.width; - this.currentTime.setCurrentTime(time); - }; + // calculate actual size and position + this.width = this.dom.frame.offsetWidth; - /** - * Get the current time. - * Only applicable when option `showCurrentTime` is true. - * @return {Date} Returns the current time. - */ - Core.prototype.getCurrentTime = function() { - if (!this.currentTime) { - throw new Error('Option showCurrentTime must be true'); + // the svg element is three times as big as the width, this allows for fully dragging left and right + // without reloading the graph. the controls for this are bound to events in the constructor + if (resized == true) { + this.svg.style.width = util.option.asSize(3*this.width); + this.svg.style.left = util.option.asSize(-this.width); } - return this.currentTime.getCurrentTime(); + if (zoomed == true || this.abortedGraphUpdate == true) { + this._updateGraph(); + } + else { + // move the whole svg while dragging + if (this.lastStart != 0) { + var offset = this.body.range.start - this.lastStart; + var range = this.body.range.end - this.body.range.start; + if (this.width != 0) { + var rangePerPixelInv = this.width/range; + var xOffset = offset * rangePerPixelInv; + this.svg.style.left = (-this.width - xOffset) + 'px'; + } + } + + } + + this.legendLeft.redraw(); + this.legendRight.redraw(); + + return resized; }; + /** - * Convert a position on screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x - * @private + * Update and redraw the graph. + * */ - // TODO: move this function to Range - Core.prototype._toTime = function(x) { - return DateUtil.toTime(this, x, this.props.center.width); + LineGraph.prototype._updateGraph = function () { + // reset the svg elements + DOMutil.prepareElements(this.svgElements); + if (this.width != 0 && this.itemsData != null) { + var group, i; + var preprocessedGroupData = {}; + var processedGroupData = {}; + var groupRanges = {}; + var changeCalled = false; + + // update the height of the graph on each redraw of the graph. + if (this.autoSizeSVG == true) { + if (this.options.graphHeight != this.body.domProps.centerContainer.height + 'px') { + this.options.graphHeight = this.body.domProps.centerContainer.height + 'px'; + this.svg.style.height = this.body.domProps.centerContainer.height + 'px'; + } + this.autoSizeSVG = false; + } + + // getting group Ids + var groupIds = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + group = this.groups[groupId]; + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { + groupIds.push(groupId); + } + } + } + if (groupIds.length > 0) { + // this is the range of the SVG canvas + var minDate = this.body.util.toGlobalTime(- this.body.domProps.root.width); + var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); + var groupsData = {}; + // fill groups data, this only loads the data we require based on the timewindow + this._getRelevantData(groupIds, groupsData, minDate, maxDate); + + // apply sampling, if disabled, it will pass through this function. + this._applySampling(groupIds, groupsData); + + // we transform the X coordinates to detect collisions + for (i = 0; i < groupIds.length; i++) { + preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); + } + + // now all needed data has been collected we start the processing. + this._getYRanges(groupIds, preprocessedGroupData, groupRanges); + + // update the Y axis first, we use this data to draw at the correct Y points + // changeCalled is required to clean the SVG on a change emit. + changeCalled = this._updateYAxis(groupIds, groupRanges); + if (changeCalled == true) { + DOMutil.cleanupElements(this.svgElements); + this.abortedGraphUpdate = true; + this.body.emitter.emit('change'); + return; + } + this.abortedGraphUpdate = false; + + // With the yAxis scaled correctly, use this to get the Y values of the points. + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); + } + + + // draw the groups + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style != 'bar') { // bar needs to be drawn enmasse + group.draw(processedGroupData[groupIds[i]], group, this.framework); + } + } + BarGraphFunctions.draw(groupIds, processedGroupData, this.framework); + } + } + + // cleanup unused svg elements + DOMutil.cleanupElements(this.svgElements); }; + /** - * Convert a position on the global screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x + * first select and preprocess the data from the datasets. + * the groups have their preselection of data, we now loop over this data to see + * what data we need to draw. Sorted data is much faster. + * more optimization is possible by doing the sampling before and using the binary search + * to find the end date to determine the increment. + * + * @param {array} groupIds + * @param {object} groupsData + * @param {date} minDate + * @param {date} maxDate * @private */ - // TODO: move this function to Range - Core.prototype._toGlobalTime = function(x) { - return DateUtil.toTime(this, x, this.props.root.width); - //var conversion = this.range.conversion(this.props.root.width); - //return new Date(x / conversion.scale + conversion.offset); + LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { + var group, i, j, item; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + groupsData[groupIds[i]] = []; + var dataContainer = groupsData[groupIds[i]]; + // optimization for sorted data + if (group.options.sort == true) { + var guess = Math.max(0, util.binarySearchValue(group.itemsData, minDate, 'x', 'before')); + for (j = guess; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > maxDate) { + dataContainer.push(item); + break; + } + else { + dataContainer.push(item); + } + } + } + } + else { + for (j = 0; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > minDate && item.x < maxDate) { + dataContainer.push(item); + } + } + } + } + } + } }; + /** - * Convert a datetime (Date object) into a position on the screen - * @param {Date} time A date - * @return {int} x The position on the screen in pixels which corresponds - * with the given date. + * + * @param groupIds + * @param groupsData * @private */ - // TODO: move this function to Range - Core.prototype._toScreen = function(time) { - return DateUtil.toScreen(this, time, this.props.center.width); - }; + LineGraph.prototype._applySampling = function (groupIds, groupsData) { + var group; + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.sampling == true) { + var dataContainer = groupsData[groupIds[i]]; + if (dataContainer.length > 0) { + var increment = 1; + var amountOfPoints = dataContainer.length; + // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop + // of width changing of the yAxis. + var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); + var pointsPerPixel = amountOfPoints / xDistance; + increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); + var sampledData = []; + for (var j = 0; j < amountOfPoints; j += increment) { + sampledData.push(dataContainer[j]); - /** - * Convert a datetime (Date object) into a position on the root - * This is used to get the pixel density estimate for the screen, not the center panel - * @param {Date} time A date - * @return {int} x The position on root in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Core.prototype._toGlobalScreen = function(time) { - return DateUtil.toScreen(this, time, this.props.root.width); - //var conversion = this.range.conversion(this.props.root.width); - //return (time.valueOf() - conversion.offset) * conversion.scale; + } + groupsData[groupIds[i]] = sampledData; + } + } + } + } }; /** - * Initialize watching when option autoResize is true + * + * + * @param {array} groupIds + * @param {object} groupsData + * @param {object} groupRanges | this is being filled here * @private */ - Core.prototype._initAutoResize = function () { - if (this.options.autoResize == true) { - this._startAutoResize(); - } - else { - this._stopAutoResize(); + LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { + var groupData, group, i; + var barCombinedDataLeft = []; + var barCombinedDataRight = []; + var options; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + groupData = groupsData[groupIds[i]]; + options = this.groups[groupIds[i]].options; + if (groupData.length > 0) { + group = this.groups[groupIds[i]]; + // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. + if (options.barChart.handleOverlap == 'stack' && options.style == 'bar') { + if (options.yAxisOrientation == 'left') {barCombinedDataLeft = barCombinedDataLeft.concat(group.getYRange(groupData)) ;} + else {barCombinedDataRight = barCombinedDataRight.concat(group.getYRange(groupData));} + } + else { + groupRanges[groupIds[i]] = group.getYRange(groupData,groupIds[i]); + } + } + } + + // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. + BarGraphFunctions.getStackedBarYRange(barCombinedDataLeft , groupRanges, groupIds, '__barchartLeft' , 'left' ); + BarGraphFunctions.getStackedBarYRange(barCombinedDataRight, groupRanges, groupIds, '__barchartRight', 'right'); } }; + /** - * Watch for changes in the size of the container. On resize, the Panel will - * automatically redraw itself. + * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. + * @param {Array} groupIds + * @param {Object} groupRanges * @private */ - Core.prototype._startAutoResize = function () { - var me = this; + LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { + var changeCalled = false; + var yAxisLeftUsed = false; + var yAxisRightUsed = false; + var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; + // if groups are present + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + if (groupRanges.hasOwnProperty(groupIds[i])) { + if (groupRanges[groupIds[i]].ignore !== true) { + minVal = groupRanges[groupIds[i]].min; + maxVal = groupRanges[groupIds[i]].max; - this._stopAutoResize(); + if (groupRanges[groupIds[i]].yAxisOrientation == 'left') { + yAxisLeftUsed = true; + minLeft = minLeft > minVal ? minVal : minLeft; + maxLeft = maxLeft < maxVal ? maxVal : maxLeft; + } + else { + yAxisRightUsed = true; + minRight = minRight > minVal ? minVal : minRight; + maxRight = maxRight < maxVal ? maxVal : maxRight; + } + } + } + } - this._onResize = function() { - if (me.options.autoResize != true) { - // stop watching when the option autoResize is changed to false - me._stopAutoResize(); - return; + if (yAxisLeftUsed == true) { + this.yAxisLeft.setRange(minLeft, maxLeft); + } + if (yAxisRightUsed == true) { + this.yAxisRight.setRange(minRight, maxRight); } + } - if (me.dom.root) { - // check whether the frame is resized - // Note: we compare offsetWidth here, not clientWidth. For some reason, - // IE does not restore the clientWidth from 0 to the actual width after - // changing the timeline's container display style from none to visible - if ((me.dom.root.offsetWidth != me.props.lastWidth) || - (me.dom.root.offsetHeight != me.props.lastHeight)) { - me.props.lastWidth = me.dom.root.offsetWidth; - me.props.lastHeight = me.dom.root.offsetHeight; + changeCalled = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || changeCalled; + changeCalled = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || changeCalled; - me.emit('change'); - } - } - }; + if (yAxisRightUsed == true && yAxisLeftUsed == true) { + this.yAxisLeft.drawIcons = true; + this.yAxisRight.drawIcons = true; + } + else { + this.yAxisLeft.drawIcons = false; + this.yAxisRight.drawIcons = false; + } - // add event listener to window resize - util.addEventListener(window, 'resize', this._onResize); + this.yAxisRight.master = !yAxisLeftUsed; - this.watchTimer = setInterval(this._onResize, 1000); - }; + if (this.yAxisRight.master == false) { + if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} + else {this.yAxisLeft.lineOffset = 0;} - /** - * Stop watching for a resize of the frame. - * @private - */ - Core.prototype._stopAutoResize = function () { - if (this.watchTimer) { - clearInterval(this.watchTimer); - this.watchTimer = undefined; + changeCalled = this.yAxisLeft.redraw() || changeCalled; + this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; + this.yAxisRight.zeroCrossing = this.yAxisLeft.zeroCrossing; + changeCalled = this.yAxisRight.redraw() || changeCalled; + } + else { + changeCalled = this.yAxisRight.redraw() || changeCalled; } - // remove event listener on window.resize - util.removeEventListener(window, 'resize', this._onResize); - this._onResize = null; - }; + // clean the accumulated lists + if (groupIds.indexOf('__barchartLeft') != -1) { + groupIds.splice(groupIds.indexOf('__barchartLeft'),1); + } + if (groupIds.indexOf('__barchartRight') != -1) { + groupIds.splice(groupIds.indexOf('__barchartRight'),1); + } - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Core.prototype._onTouch = function (event) { - this.touch.allowDragging = true; + return changeCalled; }; - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Core.prototype._onPinch = function (event) { - this.touch.allowDragging = false; - }; /** - * Start moving the timeline vertically - * @param {Event} event + * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function + * + * @param {boolean} axisUsed + * @returns {boolean} * @private + * @param axis */ - Core.prototype._onDragStart = function (event) { - this.touch.initialScrollTop = this.props.scrollTop; + LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { + var changed = false; + if (axisUsed == false) { + if (axis.dom.frame.parentNode) { + axis.hide(); + changed = true; + } + } + else { + if (!axis.dom.frame.parentNode) { + axis.show(); + changed = true; + } + } + return changed; }; + /** - * Move the timeline vertically - * @param {Event} event + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @returns {Array} * @private */ - Core.prototype._onDrag = function (event) { - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.touch.allowDragging) return; - - var delta = event.gesture.deltaY; - - var oldScrollTop = this._getScrollTop(); - var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); - + LineGraph.prototype._convertXcoordinates = function (datapoints) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; - if (newScrollTop != oldScrollTop) { - this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already - this.emit("verticalDrag"); + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.width; + yValue = datapoints[i].y; + extractedData.push({x: xValue, y: yValue}); } - }; - /** - * Apply a scrollTop - * @param {Number} scrollTop - * @returns {Number} scrollTop Returns the applied scrollTop - * @private - */ - Core.prototype._setScrollTop = function (scrollTop) { - this.props.scrollTop = scrollTop; - this._updateScrollTop(); - return this.props.scrollTop; + return extractedData; }; + /** - * Update the current scrollTop when the height of the containers has been changed - * @returns {Number} scrollTop Returns the applied scrollTop + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @param group + * @returns {Array} * @private */ - Core.prototype._updateScrollTop = function () { - // recalculate the scrollTopMin - var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero - if (scrollTopMin != this.props.scrollTopMin) { - // in case of bottom orientation, change the scrollTop such that the contents - // do not move relative to the time axis at the bottom - if (this.options.orientation == 'bottom') { - this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); - } - this.props.scrollTopMin = scrollTopMin; + LineGraph.prototype._convertYcoordinates = function (datapoints, group) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; + var axis = this.yAxisLeft; + var svgHeight = Number(this.svg.style.height.replace('px','')); + if (group.options.yAxisOrientation == 'right') { + axis = this.yAxisRight; } - // limit the scrollTop to the feasible scroll range - if (this.props.scrollTop > 0) this.props.scrollTop = 0; - if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.width; + yValue = Math.round(axis.convertValue(datapoints[i].y)); + extractedData.push({x: xValue, y: yValue}); + } - return this.props.scrollTop; - }; + group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); - /** - * Get the current scrollTop - * @returns {number} scrollTop - * @private - */ - Core.prototype._getScrollTop = function () { - return this.props.scrollTop; + return extractedData; }; - module.exports = Core; + + module.exports = LineGraph; /***/ }, -/* 26 */ +/* 30 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(19); var util = __webpack_require__(1); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var Component = __webpack_require__(23); - var Group = __webpack_require__(27); - var BackgroundGroup = __webpack_require__(31); - var BoxItem = __webpack_require__(32); - var PointItem = __webpack_require__(33); - var RangeItem = __webpack_require__(29); - var BackgroundItem = __webpack_require__(34); - - - var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items - var BACKGROUND = '__background__'; // reserved group id for background items without group + var Component = __webpack_require__(20); + var TimeStep = __webpack_require__(19); + var DateUtil = __webpack_require__(15); + var moment = __webpack_require__(44); /** - * An ItemSet holds a set of items and ranges which can be displayed in a - * range. The width is determined by the parent of the ItemSet, and the height - * is determined by the size of the items. + * A horizontal time axis * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body - * @param {Object} [options] See ItemSet.setOptions for the available options. - * @constructor ItemSet + * @param {Object} [options] See TimeAxis.setOptions for the available + * options. + * @constructor TimeAxis * @extends Component */ - function ItemSet(body, options) { - this.body = body; - - this.defaultOptions = { - type: null, // 'box', 'point', 'range', 'background' - orientation: 'bottom', // 'top' or 'bottom' - align: 'auto', // alignment of box items - stack: true, - groupOrder: null, - - selectable: true, - editable: { - updateTime: false, - updateGroup: false, - add: false, - remove: false - }, - - onAdd: function (item, callback) { - callback(item); - }, - onUpdate: function (item, callback) { - callback(item); - }, - onMove: function (item, callback) { - callback(item); - }, - onRemove: function (item, callback) { - callback(item); - }, - onMoving: function (item, callback) { - callback(item); - }, - - margin: { - item: { - horizontal: 10, - vertical: 10 - }, - axis: 20 - }, - padding: 5 - }; - - // options is shared by this ItemSet and all its items - this.options = util.extend({}, this.defaultOptions); - - // options for getting items from the DataSet with the correct type - this.itemOptions = { - type: {start: 'Date', end: 'Date'} - }; - - this.conversion = { - toScreen: body.util.toScreen, - toTime: body.util.toTime - }; - this.dom = {}; - this.props = {}; - this.hammer = null; - - var me = this; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet - - // listeners for the DataSet of the items - this.itemListeners = { - 'add': function (event, params, senderId) { - me._onAdd(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdate(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemove(params.items); + function TimeAxis (body, options) { + this.dom = { + foreground: null, + majorLines: [], + majorTexts: [], + minorLines: [], + minorTexts: [], + redundant: { + majorLines: [], + majorTexts: [], + minorLines: [], + minorTexts: [] } }; - - // listeners for the DataSet of the groups - this.groupListeners = { - 'add': function (event, params, senderId) { - me._onAddGroups(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdateGroups(params.items); + this.props = { + range: { + start: 0, + end: 0, + minimumStep: 0 }, - 'remove': function (event, params, senderId) { - me._onRemoveGroups(params.items); - } + lineTop: 0 }; - this.items = {}; // object with an Item for every data item - this.groups = {}; // Group object for every group - this.groupIds = []; + this.defaultOptions = { + orientation: 'bottom', // supported: 'top', 'bottom' + // TODO: implement timeaxis orientations 'left' and 'right' + showMinorLabels: true, + showMajorLabels: true + }; + this.options = util.extend({}, this.defaultOptions); - this.selection = []; // list with the ids of all selected nodes - this.stackDirty = true; // if true, all items will be restacked on next redraw + this.body = body; - this.touchParams = {}; // stores properties while dragging // create the HTML DOM - this._create(); this.setOptions(options); } - ItemSet.prototype = new Component(); - - // available item types will be registered here - ItemSet.types = { - background: BackgroundItem, - box: BoxItem, - range: RangeItem, - point: PointItem - }; - - /** - * Create the HTML DOM for the ItemSet - */ - ItemSet.prototype._create = function(){ - var frame = document.createElement('div'); - frame.className = 'itemset'; - frame['timeline-itemset'] = this; - this.dom.frame = frame; - - // create background panel - var background = document.createElement('div'); - background.className = 'background'; - frame.appendChild(background); - this.dom.background = background; - - // create foreground panel - var foreground = document.createElement('div'); - foreground.className = 'foreground'; - frame.appendChild(foreground); - this.dom.foreground = foreground; - - // create axis panel - var axis = document.createElement('div'); - axis.className = 'axis'; - this.dom.axis = axis; - - // create labelset - var labelSet = document.createElement('div'); - labelSet.className = 'labelset'; - this.dom.labelSet = labelSet; - - // create ungrouped Group - this._updateUngrouped(); - - // create background Group - var backgroundGroup = new BackgroundGroup(BACKGROUND, null, this); - backgroundGroup.show(); - this.groups[BACKGROUND] = backgroundGroup; - - // attach event listeners - // Note: we bind to the centerContainer for the case where the height - // of the center container is larger than of the ItemSet, so we - // can click in the empty area to create a new item or deselect an item. - this.hammer = Hammer(this.body.dom.centerContainer, { - prevent_default: true - }); - - // drag items when selected - this.hammer.on('touch', this._onTouch.bind(this)); - this.hammer.on('dragstart', this._onDragStart.bind(this)); - this.hammer.on('drag', this._onDrag.bind(this)); - this.hammer.on('dragend', this._onDragEnd.bind(this)); - - // single select (or unselect) when tapping an item - this.hammer.on('tap', this._onSelectItem.bind(this)); - - // multi select when holding mouse/touch, or on ctrl+click - this.hammer.on('hold', this._onMultiSelectItem.bind(this)); - - // add item on doubletap - this.hammer.on('doubletap', this._onAddItem.bind(this)); - - // attach to the DOM - this.show(); - }; + TimeAxis.prototype = new Component(); /** - * Set options for the ItemSet. Existing options will be extended/overwritten. - * @param {Object} [options] The following options are available: - * {String} type - * Default type for the items. Choose from 'box' - * (default), 'point', 'range', or 'background'. - * The default style can be overwritten by - * individual items. - * {String} align - * Alignment for the items, only applicable for - * BoxItem. Choose 'center' (default), 'left', or - * 'right'. - * {String} orientation - * Orientation of the item set. Choose 'top' or - * 'bottom' (default). - * {Function} groupOrder - * A sorting function for ordering groups - * {Boolean} stack - * If true (deafult), items will be stacked on - * top of each other. - * {Number} margin.axis - * Margin between the axis and the items in pixels. - * Default is 20. - * {Number} margin.item.horizontal - * Horizontal margin between items in pixels. - * Default is 10. - * {Number} margin.item.vertical - * Vertical Margin between items in pixels. - * Default is 10. - * {Number} margin.item - * Margin between items in pixels in both horizontal - * and vertical direction. Default is 10. - * {Number} margin - * Set margin for both axis and items in pixels. - * {Number} padding - * Padding of the contents of an item in pixels. - * Must correspond with the items css. Default is 5. - * {Boolean} selectable - * If true (default), items can be selected. - * {Boolean} editable - * Set all editable options to true or false - * {Boolean} editable.updateTime - * Allow dragging an item to an other moment in time - * {Boolean} editable.updateGroup - * Allow dragging an item to an other group - * {Boolean} editable.add - * Allow creating new items on double tap - * {Boolean} editable.remove - * Allow removing items by clicking the delete button - * top right of a selected item. - * {Function(item: Item, callback: Function)} onAdd - * Callback function triggered when an item is about to be added: - * when the user double taps an empty space in the Timeline. - * {Function(item: Item, callback: Function)} onUpdate - * Callback function fired when an item is about to be updated. - * This function typically has to show a dialog where the user - * change the item. If not implemented, nothing happens. - * {Function(item: Item, callback: Function)} onMove - * Fired when an item has been moved. If not implemented, - * the move action will be accepted. - * {Function(item: Item, callback: Function)} onRemove - * Fired when an item is about to be deleted. - * If not implemented, the item will be always removed. + * Set options for the TimeAxis. + * Parameters will be merged in current options. + * @param {Object} options Available options: + * {string} [orientation] + * {boolean} [showMinorLabels] + * {boolean} [showMajorLabels] */ - ItemSet.prototype.setOptions = function(options) { + TimeAxis.prototype.setOptions = function(options) { if (options) { // copy all options that we know - var fields = ['type', 'align', 'orientation', 'padding', 'stack', 'selectable', 'groupOrder', 'dataAttributes', 'template','hide']; - util.selectiveExtend(fields, this.options, options); - - if ('margin' in options) { - if (typeof options.margin === 'number') { - this.options.margin.axis = options.margin; - this.options.margin.item.horizontal = options.margin; - this.options.margin.item.vertical = options.margin; - } - else if (typeof options.margin === 'object') { - util.selectiveExtend(['axis'], this.options.margin, options.margin); - if ('item' in options.margin) { - if (typeof options.margin.item === 'number') { - this.options.margin.item.horizontal = options.margin.item; - this.options.margin.item.vertical = options.margin.item; - } - else if (typeof options.margin.item === 'object') { - util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); - } - } - } - } + util.selectiveExtend(['orientation', 'showMinorLabels', 'showMajorLabels','hiddenDates'], this.options, options); - if ('editable' in options) { - if (typeof options.editable === 'boolean') { - this.options.editable.updateTime = options.editable; - this.options.editable.updateGroup = options.editable; - this.options.editable.add = options.editable; - this.options.editable.remove = options.editable; + // apply locale to moment.js + // TODO: not so nice, this is applied globally to moment.js + if ('locale' in options) { + if (typeof moment.locale === 'function') { + // moment.js 2.8.1+ + moment.locale(options.locale); } - else if (typeof options.editable === 'object') { - util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); + else { + moment.lang(options.locale); } } - - // callback functions - var addCallback = (function (name) { - var fn = options[name]; - if (fn) { - if (!(fn instanceof Function)) { - throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)'); - } - this.options[name] = fn; - } - }).bind(this); - ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving'].forEach(addCallback); - - // force the itemSet to refresh: options like orientation and margins may be changed - this.markDirty(); } }; /** - * Mark the ItemSet dirty so it will refresh everything with next redraw - */ - ItemSet.prototype.markDirty = function() { - this.groupIds = []; - this.stackDirty = true; - }; - - /** - * Destroy the ItemSet - */ - ItemSet.prototype.destroy = function() { - this.hide(); - this.setItems(null); - this.setGroups(null); - - this.hammer = null; - - this.body = null; - this.conversion = null; - }; - - /** - * Hide the component from the DOM + * Create the HTML DOM for the TimeAxis */ - ItemSet.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); - } - - // remove the axis with dots - if (this.dom.axis.parentNode) { - this.dom.axis.parentNode.removeChild(this.dom.axis); - } + TimeAxis.prototype._create = function() { + this.dom.foreground = document.createElement('div'); + this.dom.background = document.createElement('div'); - // remove the labelset containing all group labels - if (this.dom.labelSet.parentNode) { - this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); - } + this.dom.foreground.className = 'timeaxis foreground'; + this.dom.background.className = 'timeaxis background'; }; /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * Destroy the TimeAxis */ - ItemSet.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); + TimeAxis.prototype.destroy = function() { + // remove from DOM + if (this.dom.foreground.parentNode) { + this.dom.foreground.parentNode.removeChild(this.dom.foreground); } - - // show axis with dots - if (!this.dom.axis.parentNode) { - this.body.dom.backgroundVertical.appendChild(this.dom.axis); + if (this.dom.background.parentNode) { + this.dom.background.parentNode.removeChild(this.dom.background); } - // show labelset containing labels - if (!this.dom.labelSet.parentNode) { - this.body.dom.left.appendChild(this.dom.labelSet); - } + this.body = null; }; /** - * Set selected items by their id. Replaces the current selection - * Unknown id's are silently ignored. - * @param {string[] | string} [ids] An array with zero or more id's of the items to be - * selected, or a single item id. If ids is undefined - * or an empty array, all items will be unselected. + * Repaint the component + * @return {boolean} Returns true if the component is resized */ - ItemSet.prototype.setSelection = function(ids) { - var i, ii, id, item; - - if (ids == undefined) ids = []; - if (!Array.isArray(ids)) ids = [ids]; + TimeAxis.prototype.redraw = function () { + var options = this.options; + var props = this.props; + var foreground = this.dom.foreground; + var background = this.dom.background; - // unselect currently selected items - for (i = 0, ii = this.selection.length; i < ii; i++) { - id = this.selection[i]; - item = this.items[id]; - if (item) item.unselect(); - } + // determine the correct parent DOM element (depending on option orientation) + var parent = (options.orientation == 'top') ? this.body.dom.top : this.body.dom.bottom; + var parentChanged = (foreground.parentNode !== parent); - // select items - this.selection = []; - for (i = 0, ii = ids.length; i < ii; i++) { - id = ids[i]; - item = this.items[id]; - if (item) { - this.selection.push(id); - item.select(); - } - } - }; + // calculate character width and height + this._calculateCharSize(); - /** - * Get the selected items by their id - * @return {Array} ids The ids of the selected items - */ - ItemSet.prototype.getSelection = function() { - return this.selection.concat([]); - }; + // TODO: recalculate sizes only needed when parent is resized or options is changed + var orientation = this.options.orientation, + showMinorLabels = this.options.showMinorLabels, + showMajorLabels = this.options.showMajorLabels; - /** - * Get the id's of the currently visible items. - * @returns {Array} The ids of the visible items - */ - ItemSet.prototype.getVisibleItems = function() { - var range = this.body.range.getRange(); - var left = this.body.util.toScreen(range.start); - var right = this.body.util.toScreen(range.end); + // determine the width and height of the elemens for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + props.height = props.minorLabelHeight + props.majorLabelHeight; + props.width = foreground.offsetWidth; - var ids = []; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - var group = this.groups[groupId]; - var rawVisibleItems = group.visibleItems; + props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - + (options.orientation == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); + props.minorLineWidth = 1; // TODO: really calculate width + props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; + props.majorLineWidth = 1; // TODO: really calculate width - // filter the "raw" set with visibleItems into a set which is really - // visible by pixels - for (var i = 0; i < rawVisibleItems.length; i++) { - var item = rawVisibleItems[i]; - // TODO: also check whether visible vertically - if ((item.left < right) && (item.left + item.width > left)) { - ids.push(item.id); - } - } - } + // take foreground and background offline while updating (is almost twice as fast) + var foregroundNextSibling = foreground.nextSibling; + var backgroundNextSibling = background.nextSibling; + foreground.parentNode && foreground.parentNode.removeChild(foreground); + background.parentNode && background.parentNode.removeChild(background); + + foreground.style.height = this.props.height + 'px'; + + this._repaintLabels(); + + // put DOM online again (at the same place) + if (foregroundNextSibling) { + parent.insertBefore(foreground, foregroundNextSibling); + } + else { + parent.appendChild(foreground) + } + if (backgroundNextSibling) { + this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); + } + else { + this.body.dom.backgroundVertical.appendChild(background) } - return ids; + return this._isResized() || parentChanged; }; /** - * Deselect a selected item - * @param {String | Number} id + * Repaint major and minor text labels and vertical grid lines * @private */ - ItemSet.prototype._deselect = function(id) { - var selection = this.selection; - for (var i = 0, ii = selection.length; i < ii; i++) { - if (selection[i] == id) { // non-strict comparison! - selection.splice(i, 1); - break; - } - } - }; + TimeAxis.prototype._repaintLabels = function () { + var orientation = this.options.orientation; - /** - * Repaint the component - * @return {boolean} Returns true if the component is resized - */ - ItemSet.prototype.redraw = function() { - var margin = this.options.margin, - range = this.body.range, - asSize = util.option.asSize, - options = this.options, - orientation = options.orientation, - resized = false, - frame = this.dom.frame, - editable = options.editable.updateTime || options.editable.updateGroup; + // calculate range and step (step such that we have space for 7 characters per label) + var start = util.convert(this.body.range.start, 'Number'); + var end = util.convert(this.body.range.end, 'Number'); + var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf(); + var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this.body.range, timeLabelsize); + minimumStep -= this.body.util.toTime(0).valueOf(); - // recalculate absolute position (before redrawing groups) - this.props.top = this.body.domProps.top.height + this.body.domProps.border.top; - this.props.left = this.body.domProps.left.width + this.body.domProps.border.left; - // update class name - frame.className = 'itemset' + (editable ? ' editable' : ''); + var step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates); + this.step = step; - // reorder the groups (if needed) - resized = this._orderGroups() || resized; + // Move all DOM elements to a "redundant" list, where they + // can be picked for re-use, and clear the lists with lines and texts. + // At the end of the function _repaintLabels, left over elements will be cleaned up + var dom = this.dom; + dom.redundant.majorLines = dom.majorLines; + dom.redundant.majorTexts = dom.majorTexts; + dom.redundant.minorLines = dom.minorLines; + dom.redundant.minorTexts = dom.minorTexts; + dom.majorLines = []; + dom.majorTexts = []; + dom.minorLines = []; + dom.minorTexts = []; - // check whether zoomed (in that case we need to re-stack everything) - // TODO: would be nicer to get this as a trigger from Range - var visibleInterval = range.end - range.start; - var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); - if (zoomed) this.stackDirty = true; - this.lastVisibleInterval = visibleInterval; - this.props.lastWidth = this.props.width; + step.first(); + var xFirstMajorLabel = undefined; + var max = 0; + while (step.hasNext() && max < 1000) { + max++; + var cur = step.getCurrent(); + var x = this.body.util.toScreen(cur); + var isMajor = step.isMajor(); - var restack = this.stackDirty; - var firstGroup = this._firstGroup(); - var firstMargin = { - item: margin.item, - axis: margin.axis - }; - var nonFirstMargin = { - item: margin.item, - axis: margin.item.vertical / 2 - }; - var height = 0; - var minHeight = margin.axis + margin.item.vertical; - // redraw the background group - this.groups[BACKGROUND].redraw(range, nonFirstMargin, restack); + // TODO: lines must have a width, such that we can create css backgrounds - // redraw all regular groups - util.forEach(this.groups, function (group) { - var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; - var groupResized = group.redraw(range, groupMargin, restack); - resized = groupResized || resized; - height += group.height; - }); - height = Math.max(height, minHeight); - this.stackDirty = false; + if (this.options.showMinorLabels) { + this._repaintMinorText(x, step.getLabelMinor(), orientation); + } - // update frame height - frame.style.height = asSize(height); + if (isMajor && this.options.showMajorLabels) { + if (x > 0) { + if (xFirstMajorLabel == undefined) { + xFirstMajorLabel = x; + } + this._repaintMajorText(x, step.getLabelMajor(), orientation); + } + this._repaintMajorLine(x, orientation); + } + else { + this._repaintMinorLine(x, orientation); + } - // calculate actual size - this.props.width = frame.offsetWidth; - this.props.height = height; + step.next(); + } - // reposition axis - this.dom.axis.style.top = asSize((orientation == 'top') ? - (this.body.domProps.top.height + this.body.domProps.border.top) : - (this.body.domProps.top.height + this.body.domProps.centerContainer.height)); - this.dom.axis.style.left = '0'; + // create a major label on the left when needed + if (this.options.showMajorLabels) { + var leftTime = this.body.util.toTime(0), + leftText = step.getLabelMajor(leftTime), + widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation - // check if this component is resized - resized = this._isResized() || resized; + if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) { + this._repaintMajorText(0, leftText, orientation); + } + } - return resized; + // Cleanup leftover DOM elements from the redundant list + util.forEach(this.dom.redundant, function (arr) { + while (arr.length) { + var elem = arr.pop(); + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } + } + }); }; /** - * Get the first group, aligned with the axis - * @return {Group | null} firstGroup + * Create a minor label for the axis at position x + * @param {Number} x + * @param {String} text + * @param {String} orientation "top" or "bottom" (default) * @private */ - ItemSet.prototype._firstGroup = function() { - var firstGroupIndex = (this.options.orientation == 'top') ? 0 : (this.groupIds.length - 1); - var firstGroupId = this.groupIds[firstGroupIndex]; - var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED]; + TimeAxis.prototype._repaintMinorText = function (x, text, orientation) { + // reuse redundant label + var label = this.dom.redundant.minorTexts.shift(); - return firstGroup || null; + if (!label) { + // create new label + var content = document.createTextNode(''); + label = document.createElement('div'); + label.appendChild(content); + label.className = 'text minor'; + this.dom.foreground.appendChild(label); + } + this.dom.minorTexts.push(label); + + label.childNodes[0].nodeValue = text; + + label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0'; + label.style.left = x + 'px'; + //label.title = title; // TODO: this is a heavy operation }; /** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. - * @protected + * Create a Major label for the axis at position x + * @param {Number} x + * @param {String} text + * @param {String} orientation "top" or "bottom" (default) + * @private */ - ItemSet.prototype._updateUngrouped = function() { - var ungrouped = this.groups[UNGROUPED]; - var background = this.groups[BACKGROUND]; - var item, itemId; - - if (this.groupsData) { - // remove the group holding all ungrouped items - if (ungrouped) { - ungrouped.hide(); - delete this.groups[UNGROUPED]; + TimeAxis.prototype._repaintMajorText = function (x, text, orientation) { + // reuse redundant label + var label = this.dom.redundant.majorTexts.shift(); - for (itemId in this.items) { - if (this.items.hasOwnProperty(itemId)) { - item = this.items[itemId]; - item.parent && item.parent.remove(item); - var groupId = this._getGroupId(item.data); - var group = this.groups[groupId]; - group && group.add(item) || item.hide(); - } - } - } + if (!label) { + // create label + var content = document.createTextNode(text); + label = document.createElement('div'); + label.className = 'text major'; + label.appendChild(content); + this.dom.foreground.appendChild(label); } - else { - // create a group holding all (unfiltered) items - if (!ungrouped) { - var id = null; - var data = null; - ungrouped = new Group(id, data, this); - this.groups[UNGROUPED] = ungrouped; + this.dom.majorTexts.push(label); - for (itemId in this.items) { - if (this.items.hasOwnProperty(itemId)) { - item = this.items[itemId]; - ungrouped.add(item); - } - } + label.childNodes[0].nodeValue = text; + //label.title = title; // TODO: this is a heavy operation - ungrouped.show(); - } - } + label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight + 'px'); + label.style.left = x + 'px'; }; /** - * Get the element for the labelset - * @return {HTMLElement} labelSet + * Create a minor line for the axis at position x + * @param {Number} x + * @param {String} orientation "top" or "bottom" (default) + * @private */ - ItemSet.prototype.getLabelSet = function() { - return this.dom.labelSet; + TimeAxis.prototype._repaintMinorLine = function (x, orientation) { + // reuse redundant line + var line = this.dom.redundant.minorLines.shift(); + + if (!line) { + // create vertical line + line = document.createElement('div'); + line.className = 'grid vertical minor'; + this.dom.background.appendChild(line); + } + this.dom.minorLines.push(line); + + var props = this.props; + if (orientation == 'top') { + line.style.top = props.majorLabelHeight + 'px'; + } + else { + line.style.top = this.body.domProps.top.height + 'px'; + } + line.style.height = props.minorLineHeight + 'px'; + line.style.left = (x - props.minorLineWidth / 2) + 'px'; }; /** - * Set items - * @param {vis.DataSet | null} items + * Create a Major line for the axis at position x + * @param {Number} x + * @param {String} orientation "top" or "bottom" (default) + * @private */ - ItemSet.prototype.setItems = function(items) { - var me = this, - ids, - oldItemsData = this.itemsData; + TimeAxis.prototype._repaintMajorLine = function (x, orientation) { + // reuse redundant line + var line = this.dom.redundant.majorLines.shift(); - // replace the dataset - if (!items) { - this.itemsData = null; + if (!line) { + // create vertical line + line = document.createElement('DIV'); + line.className = 'grid vertical major'; + this.dom.background.appendChild(line); } - else if (items instanceof DataSet || items instanceof DataView) { - this.itemsData = items; + this.dom.majorLines.push(line); + + var props = this.props; + if (orientation == 'top') { + line.style.top = '0'; } else { - throw new TypeError('Data must be an instance of DataSet or DataView'); + line.style.top = this.body.domProps.top.height + 'px'; } + line.style.left = (x - props.majorLineWidth / 2) + 'px'; + line.style.height = props.majorLineHeight + 'px'; + }; - if (oldItemsData) { - // unsubscribe from old dataset - util.forEach(this.itemListeners, function (callback, event) { - oldItemsData.off(event, callback); - }); + /** + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. + * @private + */ + TimeAxis.prototype._calculateCharSize = function () { + // Note: We calculate char size with every redraw. Size may change, for + // example when any of the timelines parents had display:none for example. - // remove all drawn items - ids = oldItemsData.getIds(); - this._onRemove(ids); - } + // determine the char width and height on the minor axis + if (!this.dom.measureCharMinor) { + this.dom.measureCharMinor = document.createElement('DIV'); + this.dom.measureCharMinor.className = 'text minor measure'; + this.dom.measureCharMinor.style.position = 'absolute'; - if (this.itemsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.itemListeners, function (callback, event) { - me.itemsData.on(event, callback, id); - }); + this.dom.measureCharMinor.appendChild(document.createTextNode('0')); + this.dom.foreground.appendChild(this.dom.measureCharMinor); + } + this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; + this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; - // add all new items - ids = this.itemsData.getIds(); - this._onAdd(ids); + // determine the char width and height on the major axis + if (!this.dom.measureCharMajor) { + this.dom.measureCharMajor = document.createElement('DIV'); + this.dom.measureCharMajor.className = 'text major measure'; + this.dom.measureCharMajor.style.position = 'absolute'; - // update the group holding all ungrouped items - this._updateUngrouped(); + this.dom.measureCharMajor.appendChild(document.createTextNode('0')); + this.dom.foreground.appendChild(this.dom.measureCharMajor); } + this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; + this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; }; /** - * Get the current items - * @returns {vis.DataSet | null} + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - ItemSet.prototype.getItems = function() { - return this.itemsData; + TimeAxis.prototype.snap = function(date) { + return this.step.snap(date); }; - /** - * Set groups - * @param {vis.DataSet} groups - */ - ItemSet.prototype.setGroups = function(groups) { - var me = this, - ids; + module.exports = TimeAxis; - // unsubscribe from current dataset - if (this.groupsData) { - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.unsubscribe(event, callback); - }); - // remove all drawn groups - ids = this.groupsData.getIds(); - this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw - } +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { - // replace the dataset - if (!groups) { - this.groupsData = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - this.groupsData = groups; - } - else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); - if (this.groupsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.on(event, callback, id); - }); + /** + * @constructor Item + * @param {Object} data Object containing (optional) parameters type, + * start, end, content, group, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} options Configuration options + * // TODO: describe available options + */ + function Item (data, conversion, options) { + this.id = null; + this.parent = null; + this.data = data; + this.dom = null; + this.conversion = conversion || {}; + this.options = options || {}; - // draw all ms - ids = this.groupsData.getIds(); - this._onAddGroups(ids); - } + this.selected = false; + this.displayed = false; + this.dirty = true; - // update the group holding all ungrouped items - this._updateUngrouped(); + this.top = null; + this.left = null; + this.width = null; + this.height = null; + } - // update the order of all items in each group - this._order(); + Item.prototype.stack = true; - this.body.emitter.emit('change', {queue: true}); + /** + * Select current item + */ + Item.prototype.select = function() { + this.selected = true; + this.dirty = true; + if (this.displayed) this.redraw(); }; /** - * Get the current groups - * @returns {vis.DataSet | null} groups + * Unselect current item */ - ItemSet.prototype.getGroups = function() { - return this.groupsData; + Item.prototype.unselect = function() { + this.selected = false; + this.dirty = true; + if (this.displayed) this.redraw(); }; /** - * Remove an item by its id - * @param {String | Number} id + * Set data for the item. Existing data will be updated. The id should not + * be changed. When the item is displayed, it will be redrawn immediately. + * @param {Object} data */ - ItemSet.prototype.removeItem = function(id) { - var item = this.itemsData.get(id), - dataset = this.itemsData.getDataSet(); + Item.prototype.setData = function(data) { + this.data = data; + this.dirty = true; + if (this.displayed) this.redraw(); + }; - if (item) { - // confirm deletion - this.options.onRemove(item, function (item) { - if (item) { - // remove by id here, it is possible that an item has no id defined - // itself, so better not delete by the item itself - dataset.remove(id); - } - }); + /** + * Set a parent for the item + * @param {ItemSet | Group} parent + */ + Item.prototype.setParent = function(parent) { + if (this.displayed) { + this.hide(); + this.parent = parent; + if (this.parent) { + this.show(); + } + } + else { + this.parent = parent; } }; /** - * Get the time of an item based on it's data and options.type - * @param {Object} itemData - * @returns {string} Returns the type - * @private + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + Item.prototype.isVisible = function(range) { + // Should be implemented by Item implementations + return false; + }; + + /** + * Show the Item in the DOM (when not already visible) + * @return {Boolean} changed + */ + Item.prototype.show = function() { + return false; + }; + + /** + * Hide the Item from the DOM (when visible) + * @return {Boolean} changed + */ + Item.prototype.hide = function() { + return false; + }; + + /** + * Repaint the item */ - ItemSet.prototype._getType = function (itemData) { - return itemData.type || this.options.type || (itemData.end ? 'range' : 'box'); + Item.prototype.redraw = function() { + // should be implemented by the item }; + /** + * Reposition the Item horizontally + */ + Item.prototype.repositionX = function() { + // should be implemented by the item + }; /** - * Get the group id for an item - * @param {Object} itemData - * @returns {string} Returns the groupId - * @private + * Reposition the Item vertically */ - ItemSet.prototype._getGroupId = function (itemData) { - var type = this._getType(itemData); - if (type == 'background' && itemData.group == undefined) { - return BACKGROUND; - } - else { - return this.groupsData ? itemData.group : UNGROUPED; - } + Item.prototype.repositionY = function() { + // should be implemented by the item }; /** - * Handle updated items - * @param {Number[]} ids + * Repaint a delete button on the top right of the item when the item is selected + * @param {HTMLElement} anchor * @protected */ - ItemSet.prototype._onUpdate = function(ids) { - var me = this; - - ids.forEach(function (id) { - var itemData = me.itemsData.get(id, me.itemOptions); - var item = me.items[id]; - var type = me._getType(itemData); + Item.prototype._repaintDeleteButton = function (anchor) { + if (this.selected && this.options.editable.remove && !this.dom.deleteButton) { + // create and show button + var me = this; - var constructor = ItemSet.types[type]; + var deleteButton = document.createElement('div'); + deleteButton.className = 'delete'; + deleteButton.title = 'Delete this item'; - if (item) { - // update item - if (!constructor || !(item instanceof constructor)) { - // item type has changed, delete the item and recreate it - me._removeItem(item); - item = null; - } - else { - me._updateItem(item, itemData); - } - } + Hammer(deleteButton, { + preventDefault: true + }).on('tap', function (event) { + me.parent.removeFromDataSet(me); + event.stopPropagation(); + }); - if (!item) { - // create item - if (constructor) { - item = new constructor(itemData, me.conversion, me.options); - item.id = id; // TODO: not so nice setting id afterwards - me._addItem(item); - } - else if (type == 'rangeoverflow') { - // TODO: deprecated since version 2.1.0 (or 3.0.0?). cleanup some day - throw new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: ' + - '.vis.timeline .item.range .content {overflow: visible;}'); - } - else { - throw new TypeError('Unknown item type "' + type + '"'); - } + anchor.appendChild(deleteButton); + this.dom.deleteButton = deleteButton; + } + else if (!this.selected && this.dom.deleteButton) { + // remove button + if (this.dom.deleteButton.parentNode) { + this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); } - }); - - this._order(); - this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change', {queue: true}); + this.dom.deleteButton = null; + } }; /** - * Handle added items - * @param {Number[]} ids - * @protected + * Set HTML contents for the item + * @param {Element} element HTML element to fill with the contents + * @private */ - ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; + Item.prototype._updateContents = function (element) { + var content; + if (this.options.template) { + var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset + content = this.options.template(itemData); + } + else { + content = this.data.content; + } - /** - * Handle removed items - * @param {Number[]} ids - * @protected - */ - ItemSet.prototype._onRemove = function(ids) { - var count = 0; - var me = this; - ids.forEach(function (id) { - var item = me.items[id]; - if (item) { - count++; - me._removeItem(item); + if(content !== this.content) { + // only replace the content when changed + if (content instanceof Element) { + element.innerHTML = ''; + element.appendChild(content); + } + else if (content != undefined) { + element.innerHTML = content; + } + else { + if (!(this.data.type == 'background' && this.data.content === undefined)) { + throw new Error('Property "content" missing in item ' + this.id); + } } - }); - if (count) { - // update order - this._order(); - this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change', {queue: true}); + this.content = content; } }; /** - * Update the order of item in all groups + * Set HTML contents for the item + * @param {Element} element HTML element to fill with the contents * @private */ - ItemSet.prototype._order = function() { - // reorder the items in all groups - // TODO: optimization: only reorder groups affected by the changed items - util.forEach(this.groups, function (group) { - group.order(); - }); + Item.prototype._updateTitle = function (element) { + if (this.data.title != null) { + element.title = this.data.title || ''; + } + else { + element.removeAttribute('title'); + } }; /** - * Handle updated groups - * @param {Number[]} ids + * Process dataAttributes timeline option and set as data- attributes on dom.content + * @param {Element} element HTML element to which the attributes will be attached * @private */ - ItemSet.prototype._onUpdateGroups = function(ids) { - this._onAddGroups(ids); + Item.prototype._updateDataAttributes = function(element) { + if (this.options.dataAttributes && this.options.dataAttributes.length > 0) { + var attributes = []; + + if (Array.isArray(this.options.dataAttributes)) { + attributes = this.options.dataAttributes; + } + else if (this.options.dataAttributes == 'all') { + attributes = Object.keys(this.data); + } + else { + return; + } + + for (var i = 0; i < attributes.length; i++) { + var name = attributes[i]; + var value = this.data[name]; + + if (value != null) { + element.setAttribute('data-' + name, value); + } + else { + element.removeAttribute('data-' + name); + } + } + } }; /** - * Handle changed groups (added or updated) - * @param {Number[]} ids + * Update custom styles of the element + * @param element * @private */ - ItemSet.prototype._onAddGroups = function(ids) { - var me = this; + Item.prototype._updateStyle = function(element) { + // remove old styles + if (this.style) { + util.removeCssText(element, this.style); + this.style = null; + } - ids.forEach(function (id) { - var groupData = me.groupsData.get(id); - var group = me.groups[id]; + // append new styles + if (this.data.style) { + util.addCssText(element, this.data.style); + this.style = this.data.style; + } + }; - if (!group) { - // check for reserved ids - if (id == UNGROUPED || id == BACKGROUND) { - throw new Error('Illegal group id. ' + id + ' is a reserved id.'); - } + module.exports = Item; - var groupOptions = Object.create(me.options); - util.extend(groupOptions, { - height: null - }); - group = new Group(id, groupData, me); - me.groups[id] = group; +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { - // add items with this groupId to the new group - for (var itemId in me.items) { - if (me.items.hasOwnProperty(itemId)) { - var item = me.items[itemId]; - if (item.data.group == id) { - group.add(item); - } - } - } + var Hammer = __webpack_require__(45); + var Item = __webpack_require__(31); + var BackgroundGroup = __webpack_require__(26); + var RangeItem = __webpack_require__(35); - group.order(); - group.show(); + /** + * @constructor BackgroundItem + * @extends Item + * @param {Object} data Object containing parameters start, end + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options + */ + // TODO: implement support for the BackgroundItem just having a start, then being displayed as a sort of an annotation + function BackgroundItem (data, conversion, options) { + this.props = { + content: { + width: 0 } - else { - // update group - group.setData(groupData); + }; + this.overflow = false; // if contents can overflow (css styling), this flag is set to true + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data.id); } - }); + if (data.end == undefined) { + throw new Error('Property "end" missing in item ' + data.id); + } + } - this.body.emitter.emit('change', {queue: true}); - }; + Item.call(this, data, conversion, options); - /** - * Handle removed groups - * @param {Number[]} ids - * @private - */ - ItemSet.prototype._onRemoveGroups = function(ids) { - var groups = this.groups; - ids.forEach(function (id) { - var group = groups[id]; + this.emptyContent = false; + } - if (group) { - group.hide(); - delete groups[id]; - } - }); + BackgroundItem.prototype = new Item (null, null, null); - this.markDirty(); + BackgroundItem.prototype.baseClassName = 'item background'; + BackgroundItem.prototype.stack = false; - this.body.emitter.emit('change', {queue: true}); + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + BackgroundItem.prototype.isVisible = function(range) { + // determine visibility + return (this.data.start < range.end) && (this.data.end > range.start); }; /** - * Reorder the groups if needed - * @return {boolean} changed - * @private + * Repaint the item */ - ItemSet.prototype._orderGroups = function () { - if (this.groupsData) { - // reorder the groups - var groupIds = this.groupsData.getIds({ - order: this.options.groupOrder - }); + BackgroundItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; - var changed = !util.equalArray(groupIds, this.groupIds); - if (changed) { - // hide all groups, removes them from the DOM - var groups = this.groups; - groupIds.forEach(function (groupId) { - groups[groupId].hide(); - }); + // background box + dom.box = document.createElement('div'); + // className is updated in redraw() - // show the groups again, attach them to the DOM in correct order - groupIds.forEach(function (groupId) { - groups[groupId].show(); - }); + // contents box + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); - this.groupIds = groupIds; - } + // Note: we do NOT attach this item as attribute to the DOM, + // such that background items cannot be selected + //dom.box['timeline-item'] = this; - return changed; - } - else { - return false; + this.dirty = true; } - }; - /** - * Add a new item - * @param {Item} item - * @private - */ - ItemSet.prototype._addItem = function(item) { - this.items[item.id] = item; + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.box.parentNode) { + var background = this.parent.dom.background; + if (!background) { + throw new Error('Cannot redraw item: parent has no background container element'); + } + background.appendChild(dom.box); + } + this.displayed = true; - // add to group - var groupId = this._getGroupId(item.data); - var group = this.groups[groupId]; - if (group) group.add(item); - }; + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.content); + this._updateDataAttributes(this.dom.content); + this._updateStyle(this.dom.box); - /** - * Update an existing item - * @param {Item} item - * @param {Object} itemData - * @private - */ - ItemSet.prototype._updateItem = function(item, itemData) { - var oldGroupId = item.data.group; + // update class + var className = (this.data.className ? (' ' + this.data.className) : '') + + (this.selected ? ' selected' : ''); + dom.box.className = this.baseClassName + className; - // update the items data (will redraw the item when displayed) - item.setData(itemData); + // determine from css whether this box has overflow + this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; - // update group - if (oldGroupId != item.data.group) { - var oldGroup = this.groups[oldGroupId]; - if (oldGroup) oldGroup.remove(item); + // recalculate size + this.props.content.width = this.dom.content.offsetWidth; + this.height = 0; // set height zero, so this item will be ignored when stacking items - var groupId = this._getGroupId(item.data); - var group = this.groups[groupId]; - if (group) group.add(item); + this.dirty = false; } }; /** - * Delete an item from the ItemSet: remove it from the DOM, from the map - * with items, and from the map with visible items, and from the selection - * @param {Item} item - * @private + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. */ - ItemSet.prototype._removeItem = function(item) { - // remove from DOM - item.hide(); - - // remove from items - delete this.items[item.id]; + BackgroundItem.prototype.show = RangeItem.prototype.show; - // remove from selection - var index = this.selection.indexOf(item.id); - if (index != -1) this.selection.splice(index, 1); + /** + * Hide the item from the DOM (when visible) + * @return {Boolean} changed + */ + BackgroundItem.prototype.hide = RangeItem.prototype.hide; - // remove from group - item.parent && item.parent.remove(item); - }; + /** + * Reposition the item horizontally + * @Override + */ + BackgroundItem.prototype.repositionX = RangeItem.prototype.repositionX; /** - * Create an array containing all items being a range (having an end date) - * @param array - * @returns {Array} - * @private + * Reposition the item vertically + * @Override */ - ItemSet.prototype._constructByEndArray = function(array) { - var endArray = []; + BackgroundItem.prototype.repositionY = function(margin) { + var onTop = this.options.orientation === 'top'; + this.dom.content.style.top = onTop ? '' : '0'; + this.dom.content.style.bottom = onTop ? '0' : ''; + var height; - for (var i = 0; i < array.length; i++) { - if (array[i] instanceof RangeItem) { - endArray.push(array[i]); + // special positioning for subgroups + if (this.data.subgroup !== undefined) { + var itemSubgroup = this.data.subgroup; + var subgroups = this.parent.subgroups; + var subgroupIndex = subgroups[itemSubgroup].index; + // if the orientation is top, we need to take the difference in height into account. + if (onTop == true) { + // the first subgroup will have to account for the distance from the top to the first item. + height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; + height += subgroupIndex == 0 ? margin.axis - 0.5*margin.item.vertical : 0; + var newTop = this.parent.top; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroupIndex) { + newTop += subgroups[subgroup].height + margin.item.vertical; + } + } + } + + // the others will have to be offset downwards with this same distance. + newTop += subgroupIndex != 0 ? margin.axis - 0.5 * margin.item.vertical : 0; + this.dom.box.style.top = newTop + 'px'; + this.dom.box.style.bottom = ''; + } + // and when the orientation is bottom: + else { + var newTop = this.parent.top; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true && subgroups[subgroup].index > subgroupIndex) { + newTop += subgroups[subgroup].height + margin.item.vertical; + } + } + } + height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; + this.dom.box.style.top = newTop + 'px'; + this.dom.box.style.bottom = ''; + } + } + // and in the case of no subgroups: + else { + // we want backgrounds with groups to only show in groups. + if (this.parent instanceof BackgroundGroup) { + // if the item is not in a group: + height = Math.max(this.parent.height, + this.parent.itemSet.body.domProps.center.height, + this.parent.itemSet.body.domProps.centerContainer.height); + this.dom.box.style.top = onTop ? '0' : ''; + this.dom.box.style.bottom = onTop ? '' : '0'; + } + else { + height = this.parent.height; + // same alignment for items when orientation is top or bottom + this.dom.box.style.top = this.parent.top + 'px'; + this.dom.box.style.bottom = ''; } } - return endArray; - }; - - /** - * Register the clicked item on touch, before dragStart is initiated. - * - * dragStart is initiated from a mousemove event, which can have left the item - * already resulting in an item == null - * - * @param {Event} event - * @private - */ - ItemSet.prototype._onTouch = function (event) { - // store the touched item, used in _onDragStart - this.touchParams.item = ItemSet.itemFromTarget(event); + this.dom.box.style.height = height + 'px'; }; - /** - * Start dragging the selected events - * @param {Event} event - * @private - */ - ItemSet.prototype._onDragStart = function (event) { - if (!this.options.editable.updateTime && !this.options.editable.updateGroup) { - return; - } - - var item = this.touchParams.item || null; - var me = this; - var props; + module.exports = BackgroundItem; - if (item && item.selected) { - var dragLeftItem = event.target.dragLeftItem; - var dragRightItem = event.target.dragRightItem; - if (dragLeftItem) { - props = { - item: dragLeftItem, - initialX: event.gesture.center.clientX - }; +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { - if (me.options.editable.updateTime) { - props.start = item.data.start.valueOf(); - } - if (me.options.editable.updateGroup) { - if ('group' in item.data) props.group = item.data.group; - } + var Item = __webpack_require__(31); + var util = __webpack_require__(1); - this.touchParams.itemProps = [props]; + /** + * @constructor BoxItem + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options + */ + function BoxItem (data, conversion, options) { + this.props = { + dot: { + width: 0, + height: 0 + }, + line: { + width: 0, + height: 0 } - else if (dragRightItem) { - props = { - item: dragRightItem, - initialX: event.gesture.center.clientX - }; - - if (me.options.editable.updateTime) { - props.end = item.data.end.valueOf(); - } - if (me.options.editable.updateGroup) { - if ('group' in item.data) props.group = item.data.group; - } + }; - this.touchParams.itemProps = [props]; + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); } - else { - this.touchParams.itemProps = this.getSelection().map(function (id) { - var item = me.items[id]; - var props = { - item: item, - initialX: event.gesture.center.clientX - }; + } - if (me.options.editable.updateTime) { - if ('start' in item.data) props.start = item.data.start.valueOf(); - if ('end' in item.data) props.end = item.data.end.valueOf(); - } - if (me.options.editable.updateGroup) { - if ('group' in item.data) props.group = item.data.group; - } + Item.call(this, data, conversion, options); + } - return props; - }); - } + BoxItem.prototype = new Item (null, null, null); - event.stopPropagation(); - } + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + BoxItem.prototype.isVisible = function(range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); }; /** - * Drag selected items - * @param {Event} event - * @private + * Repaint the item */ - ItemSet.prototype._onDrag = function (event) { - if (this.touchParams.itemProps) { - var me = this; - var snap = this.body.util.snap || null; - var xOffset = this.body.dom.root.offsetLeft + this.body.domProps.left.width; + BoxItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; - // move - this.touchParams.itemProps.forEach(function (props) { - var newProps = {}; - var current = me.body.util.toTime(event.gesture.center.clientX - xOffset); - var initial = me.body.util.toTime(props.initialX - xOffset); - var offset = current - initial; + // create main box + dom.box = document.createElement('DIV'); - if ('start' in props) { - var start = new Date(props.start + offset); - newProps.start = snap ? snap(start) : start; - } + // contents box (inside the background box). used for making margins + dom.content = document.createElement('DIV'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); - if ('end' in props) { - var end = new Date(props.end + offset); - newProps.end = snap ? snap(end) : end; - } + // line to axis + dom.line = document.createElement('DIV'); + dom.line.className = 'line'; - if ('group' in props) { - // drag from one group to another - var group = ItemSet.groupFromTarget(event); - newProps.group = group && group.groupId; - } + // dot on axis + dom.dot = document.createElement('DIV'); + dom.dot.className = 'dot'; - // confirm moving the item - var itemData = util.extend({}, props.item.data, newProps); - me.options.onMoving(itemData, function (itemData) { - if (itemData) { - me._updateItemProps(props.item, itemData); - } - }); - }); + // attach this item as attribute + dom.box['timeline-item'] = this; - this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change'); + this.dirty = true; + } - event.stopPropagation(); + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); } - }; + if (!dom.box.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) throw new Error('Cannot redraw item: parent has no foreground container element'); + foreground.appendChild(dom.box); + } + if (!dom.line.parentNode) { + var background = this.parent.dom.background; + if (!background) throw new Error('Cannot redraw item: parent has no background container element'); + background.appendChild(dom.line); + } + if (!dom.dot.parentNode) { + var axis = this.parent.dom.axis; + if (!background) throw new Error('Cannot redraw item: parent has no axis container element'); + axis.appendChild(dom.dot); + } + this.displayed = true; - /** - * Update an items properties - * @param {Item} item - * @param {Object} props Can contain properties start, end, and group. - * @private - */ - ItemSet.prototype._updateItemProps = function(item, props) { - // TODO: copy all properties from props to item? (also new ones) - if ('start' in props) item.data.start = props.start; - if ('end' in props) item.data.end = props.end; - if ('group' in props && item.data.group != props.group) { - this._moveToGroup(item, props.group) + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.box); + this._updateDataAttributes(this.dom.box); + this._updateStyle(this.dom.box); + + // update class + var className = (this.data.className? ' ' + this.data.className : '') + + (this.selected ? ' selected' : ''); + dom.box.className = 'item box' + className; + dom.line.className = 'item line' + className; + dom.dot.className = 'item dot' + className; + + // recalculate size + this.props.dot.height = dom.dot.offsetHeight; + this.props.dot.width = dom.dot.offsetWidth; + this.props.line.width = dom.line.offsetWidth; + this.width = dom.box.offsetWidth; + this.height = dom.box.offsetHeight; + + this.dirty = false; } + + this._repaintDeleteButton(dom.box); }; /** - * Move an item to another group - * @param {Item} item - * @param {String | Number} groupId - * @private + * Show the item in the DOM (when not already displayed). The items DOM will + * be created when needed. */ - ItemSet.prototype._moveToGroup = function(item, groupId) { - var group = this.groups[groupId]; - if (group && group.groupId != item.data.group) { - var oldGroup = item.parent; - oldGroup.remove(item); - oldGroup.order(); - group.add(item); - group.order(); - - item.data.group = group.groupId; + BoxItem.prototype.show = function() { + if (!this.displayed) { + this.redraw(); } }; /** - * End of dragging selected items - * @param {Event} event - * @private + * Hide the item from the DOM (when visible) */ - ItemSet.prototype._onDragEnd = function (event) { - if (this.touchParams.itemProps) { - // prepare a change set for the changed items - var changes = [], - me = this, - dataset = this.itemsData.getDataSet(); - - var itemProps = this.touchParams.itemProps ; - this.touchParams.itemProps = null; - itemProps.forEach(function (props) { - var id = props.item.id, - itemData = me.itemsData.get(id, me.itemOptions); - - var changed = false; - if ('start' in props.item.data) { - changed = (props.start != props.item.data.start.valueOf()); - itemData.start = util.convert(props.item.data.start, - dataset._options.type && dataset._options.type.start || 'Date'); - } - if ('end' in props.item.data) { - changed = changed || (props.end != props.item.data.end.valueOf()); - itemData.end = util.convert(props.item.data.end, - dataset._options.type && dataset._options.type.end || 'Date'); - } - if ('group' in props.item.data) { - changed = changed || (props.group != props.item.data.group); - itemData.group = props.item.data.group; - } - - // only apply changes when start or end is actually changed - if (changed) { - me.options.onMove(itemData, function (itemData) { - if (itemData) { - // apply changes - itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined) - changes.push(itemData); - } - else { - // restore original values - me._updateItemProps(props.item, props); + BoxItem.prototype.hide = function() { + if (this.displayed) { + var dom = this.dom; - me.stackDirty = true; // force re-stacking of all items next redraw - me.body.emitter.emit('change'); - } - }); - } - }); + if (dom.box.parentNode) dom.box.parentNode.removeChild(dom.box); + if (dom.line.parentNode) dom.line.parentNode.removeChild(dom.line); + if (dom.dot.parentNode) dom.dot.parentNode.removeChild(dom.dot); - // apply the changes to the data (if there are changes) - if (changes.length) { - dataset.update(changes); - } + this.top = null; + this.left = null; - event.stopPropagation(); + this.displayed = false; } }; /** - * Handle selecting/deselecting an item when tapping it - * @param {Event} event - * @private + * Reposition the item horizontally + * @Override */ - ItemSet.prototype._onSelectItem = function (event) { - if (!this.options.selectable) return; + BoxItem.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start); + var align = this.options.align; + var left; + var box = this.dom.box; + var line = this.dom.line; + var dot = this.dom.dot; - var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; - var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; - if (ctrlKey || shiftKey) { - this._onMultiSelectItem(event); - return; + // calculate left position of the box + if (align == 'right') { + this.left = start - this.width; + } + else if (align == 'left') { + this.left = start; + } + else { + // default or 'center' + this.left = start - this.width / 2; } - var oldSelection = this.getSelection(); - - var item = ItemSet.itemFromTarget(event); - var selection = item ? [item.id] : []; - this.setSelection(selection); + // reposition box + box.style.left = this.left + 'px'; - var newSelection = this.getSelection(); + // reposition line + line.style.left = (start - this.props.line.width / 2) + 'px'; - // emit a select event, - // except when old selection is empty and new selection is still empty - if (newSelection.length > 0 || oldSelection.length > 0) { - this.body.emitter.emit('select', { - items: newSelection - }); - } + // reposition dot + dot.style.left = (start - this.props.dot.width / 2) + 'px'; }; /** - * Handle creation and updates of an item on double tap - * @param event - * @private + * Reposition the item vertically + * @Override */ - ItemSet.prototype._onAddItem = function (event) { - if (!this.options.selectable) return; - if (!this.options.editable.add) return; + BoxItem.prototype.repositionY = function() { + var orientation = this.options.orientation; + var box = this.dom.box; + var line = this.dom.line; + var dot = this.dom.dot; - var me = this, - snap = this.body.util.snap || null, - item = ItemSet.itemFromTarget(event); + if (orientation == 'top') { + box.style.top = (this.top || 0) + 'px'; - if (item) { - // update item + line.style.top = '0'; + line.style.height = (this.parent.top + this.top + 1) + 'px'; + line.style.bottom = ''; + } + else { // orientation 'bottom' + var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty + var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; - // execute async handler to update the item (or cancel it) - var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset - this.options.onUpdate(itemData, function (itemData) { - if (itemData) { - me.itemsData.getDataSet().update(itemData); - } - }); + box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; + line.style.top = (itemSetHeight - lineHeight) + 'px'; + line.style.bottom = '0'; } - else { - // add item - var xAbs = util.getAbsoluteLeft(this.dom.frame); - var x = event.gesture.center.pageX - xAbs; - var start = this.body.util.toTime(x); - var newItem = { - start: snap ? snap(start) : start, - content: 'new item' - }; - // when default type is a range, add a default end date to the new item - if (this.options.type === 'range') { - var end = this.body.util.toTime(x + this.props.width / 5); - newItem.end = snap ? snap(end) : end; - } + dot.style.top = (-this.props.dot.height / 2) + 'px'; + }; - newItem[this.itemsData._fieldId] = util.randomUUID(); + module.exports = BoxItem; - var group = ItemSet.groupFromTarget(event); - if (group) { - newItem.group = group.groupId; + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + var Item = __webpack_require__(31); + + /** + * @constructor PointItem + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options + */ + function PointItem (data, conversion, options) { + this.props = { + dot: { + top: 0, + width: 0, + height: 0 + }, + content: { + height: 0, + marginLeft: 0 } + }; - // execute async handler to customize (or cancel) adding an item - this.options.onAdd(newItem, function (item) { - if (item) { - me.itemsData.getDataSet().add(item); - // TODO: need to trigger a redraw? - } - }); + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); + } } + + Item.call(this, data, conversion, options); + } + + PointItem.prototype = new Item (null, null, null); + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + PointItem.prototype.isVisible = function(range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); }; /** - * Handle selecting/deselecting multiple items when holding an item - * @param {Event} event - * @private + * Repaint the item */ - ItemSet.prototype._onMultiSelectItem = function (event) { - if (!this.options.selectable) return; + PointItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; + + // background box + dom.point = document.createElement('div'); + // className is updated in redraw() + + // contents box, right from the dot + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.point.appendChild(dom.content); + + // dot at start + dom.dot = document.createElement('div'); + dom.point.appendChild(dom.dot); + + // attach this item as attribute + dom.point['timeline-item'] = this; - var selection, - item = ItemSet.itemFromTarget(event); + this.dirty = true; + } - if (item) { - // multi select items - selection = this.getSelection(); // current selection + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.point.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw item: parent has no foreground container element'); + } + foreground.appendChild(dom.point); + } + this.displayed = true; - var shiftKey = event.gesture.touches[0] && event.gesture.touches[0].shiftKey || false; - if (shiftKey) { - // select all items between the old selection and the tapped item + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.point); + this._updateDataAttributes(this.dom.point); + this._updateStyle(this.dom.point); - // determine the selection range - selection.push(item.id); - var range = ItemSet._getItemRange(this.itemsData.get(selection, this.itemOptions)); + // update class + var className = (this.data.className? ' ' + this.data.className : '') + + (this.selected ? ' selected' : ''); + dom.point.className = 'item point' + className; + dom.dot.className = 'item dot' + className; - // select all items within the selection range - selection = []; - for (var id in this.items) { - if (this.items.hasOwnProperty(id)) { - var _item = this.items[id]; - var start = _item.data.start; - var end = (_item.data.end !== undefined) ? _item.data.end : start; + // recalculate size + this.width = dom.point.offsetWidth; + this.height = dom.point.offsetHeight; + this.props.dot.width = dom.dot.offsetWidth; + this.props.dot.height = dom.dot.offsetHeight; + this.props.content.height = dom.content.offsetHeight; - if (start >= range.min && end <= range.max) { - selection.push(_item.id); // do not use id but item.id, id itself is stringified - } - } - } - } - else { - // add/remove this item from the current selection - var index = selection.indexOf(item.id); - if (index == -1) { - // item is not yet selected -> select it - selection.push(item.id); - } - else { - // item is already selected -> deselect it - selection.splice(index, 1); - } - } + // resize contents + dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; + //dom.content.style.marginRight = ... + 'px'; // TODO: margin right - this.setSelection(selection); + dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; + dom.dot.style.left = (this.props.dot.width / 2) + 'px'; - this.body.emitter.emit('select', { - items: this.getSelection() - }); + this.dirty = false; } + + this._repaintDeleteButton(dom.point); }; /** - * Calculate the time range of a list of items - * @param {Array.} itemsData - * @return {{min: Date, max: Date}} Returns the range of the provided items - * @private + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. */ - ItemSet._getItemRange = function(itemsData) { - var max = null; - var min = null; - - itemsData.forEach(function (data) { - if (min == null || data.start < min) { - min = data.start; - } - - if (data.end != undefined) { - if (max == null || data.end > max) { - max = data.end; - } - } - else { - if (max == null || data.start > max) { - max = data.start; - } - } - }); - - return { - min: min, - max: max + PointItem.prototype.show = function() { + if (!this.displayed) { + this.redraw(); } }; /** - * Find an item from an event target: - * searches for the attribute 'timeline-item' in the event target's element tree - * @param {Event} event - * @return {Item | null} item + * Hide the item from the DOM (when visible) */ - ItemSet.itemFromTarget = function(event) { - var target = event.target; - while (target) { - if (target.hasOwnProperty('timeline-item')) { - return target['timeline-item']; + PointItem.prototype.hide = function() { + if (this.displayed) { + if (this.dom.point.parentNode) { + this.dom.point.parentNode.removeChild(this.dom.point); } - target = target.parentNode; - } - return null; + this.top = null; + this.left = null; + + this.displayed = false; + } }; /** - * Find the Group from an event target: - * searches for the attribute 'timeline-group' in the event target's element tree - * @param {Event} event - * @return {Group | null} group + * Reposition the item horizontally + * @Override */ - ItemSet.groupFromTarget = function(event) { - var target = event.target; - while (target) { - if (target.hasOwnProperty('timeline-group')) { - return target['timeline-group']; - } - target = target.parentNode; - } + PointItem.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start); - return null; + this.left = start - this.props.dot.width; + + // reposition point + this.dom.point.style.left = this.left + 'px'; }; /** - * Find the ItemSet from an event target: - * searches for the attribute 'timeline-itemset' in the event target's element tree - * @param {Event} event - * @return {ItemSet | null} item + * Reposition the item vertically + * @Override */ - ItemSet.itemSetFromTarget = function(event) { - var target = event.target; - while (target) { - if (target.hasOwnProperty('timeline-itemset')) { - return target['timeline-itemset']; - } - target = target.parentNode; - } + PointItem.prototype.repositionY = function() { + var orientation = this.options.orientation, + point = this.dom.point; - return null; + if (orientation == 'top') { + point.style.top = this.top + 'px'; + } + else { + point.style.top = (this.parent.height - this.top - this.height) + 'px'; + } }; - module.exports = ItemSet; + module.exports = PointItem; /***/ }, -/* 27 */ +/* 35 */ /***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); - var stack = __webpack_require__(28); - var RangeItem = __webpack_require__(29); + var Hammer = __webpack_require__(45); + var Item = __webpack_require__(31); /** - * @constructor Group - * @param {Number | String} groupId - * @param {Object} data - * @param {ItemSet} itemSet + * @constructor RangeItem + * @extends Item + * @param {Object} data Object containing parameters start, end + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options */ - function Group (groupId, data, itemSet) { - this.groupId = groupId; - this.subgroups = {}; - this.subgroupIndex = 0; - this.subgroupOrderer = data && data.subgroupOrder; - this.itemSet = itemSet; - - this.dom = {}; + function RangeItem (data, conversion, options) { this.props = { - label: { - width: 0, - height: 0 + content: { + width: 0 } }; - this.className = null; - - this.items = {}; // items filtered by groupId of this group - this.visibleItems = []; // items currently visible in window - this.orderedItems = { - byStart: [], - byEnd: [] - }; - this.checkRangedItems = false; // needed to refresh the ranged items if the window is programatically changed with NO overlap. - var me = this; - this.itemSet.body.emitter.on("checkRangedItems", function () { - me.checkRangedItems = true; - }) + this.overflow = false; // if contents can overflow (css styling), this flag is set to true - this._create(); + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data.id); + } + if (data.end == undefined) { + throw new Error('Property "end" missing in item ' + data.id); + } + } - this.setData(data); + Item.call(this, data, conversion, options); } + RangeItem.prototype = new Item (null, null, null); + + RangeItem.prototype.baseClassName = 'item range'; + /** - * Create DOM elements for the group - * @private + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible */ - Group.prototype._create = function() { - var label = document.createElement('div'); - label.className = 'vlabel'; - this.dom.label = label; - - var inner = document.createElement('div'); - inner.className = 'inner'; - label.appendChild(inner); - this.dom.inner = inner; + RangeItem.prototype.isVisible = function(range) { + // determine visibility + return (this.data.start < range.end) && (this.data.end > range.start); + }; - var foreground = document.createElement('div'); - foreground.className = 'group'; - foreground['timeline-group'] = this; - this.dom.foreground = foreground; + /** + * Repaint the item + */ + RangeItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; - this.dom.background = document.createElement('div'); - this.dom.background.className = 'group'; + // background box + dom.box = document.createElement('div'); + // className is updated in redraw() - this.dom.axis = document.createElement('div'); - this.dom.axis.className = 'group'; + // contents box + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); - // create a hidden marker to detect when the Timelines container is attached - // to the DOM, or the style of a parent of the Timeline is changed from - // display:none is changed to visible. - this.dom.marker = document.createElement('div'); - this.dom.marker.style.visibility = 'hidden'; // TODO: ask jos why this is not none? - this.dom.marker.innerHTML = '?'; - this.dom.background.appendChild(this.dom.marker); - }; + // attach this item as attribute + dom.box['timeline-item'] = this; - /** - * Set the group data for this group - * @param {Object} data Group data, can contain properties content and className - */ - Group.prototype.setData = function(data) { - // update contents - var content = data && data.content; - if (content instanceof Element) { - this.dom.inner.appendChild(content); + this.dirty = true; } - else if (content !== undefined && content !== null) { - this.dom.inner.innerHTML = content; + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); } - else { - this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null + if (!dom.box.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw item: parent has no foreground container element'); + } + foreground.appendChild(dom.box); } + this.displayed = true; - // update title - this.dom.label.title = data && data.title || ''; + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.box); + this._updateDataAttributes(this.dom.box); + this._updateStyle(this.dom.box); - if (!this.dom.inner.firstChild) { - util.addClassName(this.dom.inner, 'hidden'); - } - else { - util.removeClassName(this.dom.inner, 'hidden'); - } + // update class + var className = (this.data.className ? (' ' + this.data.className) : '') + + (this.selected ? ' selected' : ''); + dom.box.className = this.baseClassName + className; - // update className - var className = data && data.className || null; - if (className != this.className) { - if (this.className) { - util.removeClassName(this.dom.label, this.className); - util.removeClassName(this.dom.foreground, this.className); - util.removeClassName(this.dom.background, this.className); - util.removeClassName(this.dom.axis, this.className); - } - util.addClassName(this.dom.label, className); - util.addClassName(this.dom.foreground, className); - util.addClassName(this.dom.background, className); - util.addClassName(this.dom.axis, className); - this.className = className; - } + // determine from css whether this box has overflow + this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; - // update style - if (this.style) { - util.removeCssText(this.dom.label, this.style); - this.style = null; - } - if (data && data.style) { - util.addCssText(this.dom.label, data.style); - this.style = data.style; + // recalculate size + // turn off max-width to be able to calculate the real width + // this causes an extra browser repaint/reflow, but so be it + this.dom.content.style.maxWidth = 'none'; + this.props.content.width = this.dom.content.offsetWidth; + this.height = this.dom.box.offsetHeight; + this.dom.content.style.maxWidth = ''; + + this.dirty = false; } + + this._repaintDeleteButton(dom.box); + this._repaintDragLeft(); + this._repaintDragRight(); }; /** - * Get the width of the group label - * @return {number} width + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. */ - Group.prototype.getLabelWidth = function() { - return this.props.label.width; + RangeItem.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } }; - /** - * Repaint this group - * @param {{start: number, end: number}} range - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * @param {boolean} [restack=false] Force restacking of all items - * @return {boolean} Returns true if the group is resized + * Hide the item from the DOM (when visible) + * @return {Boolean} changed */ - Group.prototype.redraw = function(range, margin, restack) { - var resized = false; - - this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); + RangeItem.prototype.hide = function() { + if (this.displayed) { + var box = this.dom.box; - // force recalculation of the height of the items when the marker height changed - // (due to the Timeline being attached to the DOM or changed from display:none to visible) - var markerHeight = this.dom.marker.clientHeight; - if (markerHeight != this.lastMarkerHeight) { - this.lastMarkerHeight = markerHeight; + if (box.parentNode) { + box.parentNode.removeChild(box); + } - util.forEach(this.items, function (item) { - item.dirty = true; - if (item.displayed) item.redraw(); - }); + this.top = null; + this.left = null; - restack = true; + this.displayed = false; } + }; - // reposition visible items vertically - if (this.itemSet.options.stack) { // TODO: ugly way to access options... - stack.stack(this.visibleItems, margin, restack); + /** + * Reposition the item horizontally + * @Override + */ + RangeItem.prototype.repositionX = function() { + var parentWidth = this.parent.width; + var start = this.conversion.toScreen(this.data.start); + var end = this.conversion.toScreen(this.data.end); + var contentLeft; + var contentWidth; + + // limit the width of the this, as browsers cannot draw very wide divs + if (start < -parentWidth) { + start = -parentWidth; } - else { // no stacking - stack.nostack(this.visibleItems, margin, this.subgroups); + if (end > 2 * parentWidth) { + end = 2 * parentWidth; } + var boxWidth = Math.max(end - start, 1); - // recalculate the height of the group - var height = this._calculateHeight(margin); - - // calculate actual size and position - var foreground = this.dom.foreground; - this.top = foreground.offsetTop; - this.left = foreground.offsetLeft; - this.width = foreground.offsetWidth; - resized = util.updateProperty(this, 'height', height) || resized; + if (this.overflow) { + this.left = start; + this.width = boxWidth + this.props.content.width; + contentWidth = this.props.content.width; - // recalculate size of label - resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized; - resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized; + // Note: The calculation of width is an optimistic calculation, giving + // a width which will not change when moving the Timeline + // So no re-stacking needed, which is nicer for the eye; + } + else { + this.left = start; + this.width = boxWidth; + contentWidth = Math.min(end - start - 2 * this.options.padding, this.props.content.width); + } - // apply new height - this.dom.background.style.height = height + 'px'; - this.dom.foreground.style.height = height + 'px'; - this.dom.label.style.height = height + 'px'; + this.dom.box.style.left = this.left + 'px'; + this.dom.box.style.width = boxWidth + 'px'; - // update vertical position of items after they are re-stacked and the height of the group is calculated - for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { - var item = this.visibleItems[i]; - item.repositionY(margin); - } + switch (this.options.align) { + case 'left': + this.dom.content.style.left = '0'; + break; - return resized; - }; + case 'right': + this.dom.content.style.left = Math.max((boxWidth - contentWidth - 2 * this.options.padding), 0) + 'px'; + break; - /** - * recalculate the height of the group - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * @returns {number} Returns the height - * @private - */ - Group.prototype._calculateHeight = function (margin) { - // recalculate the height of the group - var height; - var visibleItems = this.visibleItems; - //var visibleSubgroups = []; - //this.visibleSubgroups = 0; - this.resetSubgroups(); - var me = this; - if (visibleItems.length) { - var min = visibleItems[0].top; - var max = visibleItems[0].top + visibleItems[0].height; - util.forEach(visibleItems, function (item) { - min = Math.min(min, item.top); - max = Math.max(max, (item.top + item.height)); - if (item.data.subgroup !== undefined) { - me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height,item.height); - me.subgroups[item.data.subgroup].visible = true; - //if (visibleSubgroups.indexOf(item.data.subgroup) == -1){ - // visibleSubgroups.push(item.data.subgroup); - // me.visibleSubgroups += 1; - //} + case 'center': + this.dom.content.style.left = Math.max((boxWidth - contentWidth - 2 * this.options.padding) / 2, 0) + 'px'; + break; + + default: // 'auto' + // when range exceeds left of the window, position the contents at the left of the visible area + if (this.overflow) { + if (end > 0) { + contentLeft = Math.max(-start, 0); + } + else { + contentLeft = -contentWidth; // ensure it's not visible anymore + } } - }); - if (min > margin.axis) { - // there is an empty gap between the lowest item and the axis - var offset = min - margin.axis; - max -= offset; - util.forEach(visibleItems, function (item) { - item.top -= offset; - }); - } - height = max + margin.item.vertical / 2; - } - else { - height = margin.axis + margin.item.vertical; + else { + if (start < 0) { + contentLeft = Math.min(-start, + (end - start - contentWidth - 2 * this.options.padding)); + // TODO: remove the need for options.padding. it's terrible. + } + else { + contentLeft = 0; + } + } + this.dom.content.style.left = contentLeft + 'px'; } - height = Math.max(height, this.props.label.height); - - return height; }; /** - * Show this group: attach to the DOM + * Reposition the item vertically + * @Override */ - Group.prototype.show = function() { - if (!this.dom.label.parentNode) { - this.itemSet.dom.labelSet.appendChild(this.dom.label); - } - - if (!this.dom.foreground.parentNode) { - this.itemSet.dom.foreground.appendChild(this.dom.foreground); - } + RangeItem.prototype.repositionY = function() { + var orientation = this.options.orientation, + box = this.dom.box; - if (!this.dom.background.parentNode) { - this.itemSet.dom.background.appendChild(this.dom.background); + if (orientation == 'top') { + box.style.top = this.top + 'px'; } - - if (!this.dom.axis.parentNode) { - this.itemSet.dom.axis.appendChild(this.dom.axis); + else { + box.style.top = (this.parent.height - this.top - this.height) + 'px'; } }; /** - * Hide this group: remove from the DOM + * Repaint a drag area on the left side of the range when the range is selected + * @protected */ - Group.prototype.hide = function() { - var label = this.dom.label; - if (label.parentNode) { - label.parentNode.removeChild(label); - } + RangeItem.prototype._repaintDragLeft = function () { + if (this.selected && this.options.editable.updateTime && !this.dom.dragLeft) { + // create and show drag area + var dragLeft = document.createElement('div'); + dragLeft.className = 'drag-left'; + dragLeft.dragLeftItem = this; - var foreground = this.dom.foreground; - if (foreground.parentNode) { - foreground.parentNode.removeChild(foreground); - } + // TODO: this should be redundant? + Hammer(dragLeft, { + preventDefault: true + }).on('drag', function () { + //console.log('drag left') + }); - var background = this.dom.background; - if (background.parentNode) { - background.parentNode.removeChild(background); + this.dom.box.appendChild(dragLeft); + this.dom.dragLeft = dragLeft; } - - var axis = this.dom.axis; - if (axis.parentNode) { - axis.parentNode.removeChild(axis); + else if (!this.selected && this.dom.dragLeft) { + // delete drag area + if (this.dom.dragLeft.parentNode) { + this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft); + } + this.dom.dragLeft = null; } }; /** - * Add an item to the group - * @param {Item} item + * Repaint a drag area on the right side of the range when the range is selected + * @protected */ - Group.prototype.add = function(item) { - this.items[item.id] = item; - item.setParent(this); + RangeItem.prototype._repaintDragRight = function () { + if (this.selected && this.options.editable.updateTime && !this.dom.dragRight) { + // create and show drag area + var dragRight = document.createElement('div'); + dragRight.className = 'drag-right'; + dragRight.dragRightItem = this; - // add to - if (item.data.subgroup !== undefined) { - if (this.subgroups[item.data.subgroup] === undefined) { - this.subgroups[item.data.subgroup] = {height:0, visible: false, index:this.subgroupIndex, items: []}; - this.subgroupIndex++; - } - this.subgroups[item.data.subgroup].items.push(item); - } - this.orderSubgroups(); + // TODO: this should be redundant? + Hammer(dragRight, { + preventDefault: true + }).on('drag', function () { + //console.log('drag right') + }); - if (this.visibleItems.indexOf(item) == -1) { - var range = this.itemSet.body.range; // TODO: not nice accessing the range like this - this._checkIfVisible(item, this.visibleItems, range); + this.dom.box.appendChild(dragRight); + this.dom.dragRight = dragRight; } - }; - - Group.prototype.orderSubgroups = function() { - if (this.subgroupOrderer !== undefined) { - var sortArray = []; - if (typeof this.subgroupOrderer == 'string') { - for (var subgroup in this.subgroups) { - sortArray.push({subgroup: subgroup, sortField: this.subgroups[subgroup].items[0].data[this.subgroupOrderer]}) - } - sortArray.sort(function (a, b) { - return a.sortField - b.sortField; - }) - } - else if (typeof this.subgroupOrderer == 'function') { - for (var subgroup in this.subgroups) { - sortArray.push(this.subgroups[subgroup].items[0].data); - } - sortArray.sort(this.subgroupOrderer); - } - - if (sortArray.length > 0) { - for (var i = 0; i < sortArray.length; i++) { - this.subgroups[sortArray[i].subgroup].index = i; - } + else if (!this.selected && this.dom.dragRight) { + // delete drag area + if (this.dom.dragRight.parentNode) { + this.dom.dragRight.parentNode.removeChild(this.dom.dragRight); } + this.dom.dragRight = null; } }; - Group.prototype.resetSubgroups = function() { - for (var subgroup in this.subgroups) { - if (this.subgroups.hasOwnProperty(subgroup)) { - this.subgroups[subgroup].visible = false; - } - } - }; + module.exports = RangeItem; - /** - * Remove an item from the group - * @param {Item} item - */ - Group.prototype.remove = function(item) { - delete this.items[item.id]; - item.setParent(null); - // remove from visible items - var index = this.visibleItems.indexOf(item); - if (index != -1) this.visibleItems.splice(index, 1); +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { - // TODO: also remove from ordered items? - }; + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var keycharm = __webpack_require__(57); + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(47); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var dotparser = __webpack_require__(42); + var gephiParser = __webpack_require__(43); + var Groups = __webpack_require__(38); + var Images = __webpack_require__(39); + var Node = __webpack_require__(40); + var Edge = __webpack_require__(37); + var Popup = __webpack_require__(41); + var MixinLoader = __webpack_require__(54); + var Activator = __webpack_require__(55); + var locales = __webpack_require__(49); + // Load custom shapes into CanvasRenderingContext2D + __webpack_require__(50); /** - * Remove an item from the corresponding DataSet - * @param {Item} item + * @constructor Network + * Create a network visualization, displaying nodes and edges. + * + * @param {Element} container The DOM element in which the Network will + * be created. Normally a div element. + * @param {Object} data An object containing parameters + * {Array} nodes + * {Array} edges + * @param {Object} options Options */ - Group.prototype.removeFromDataSet = function(item) { - this.itemSet.removeItem(item.id); - }; + function Network (container, data, options) { + if (!(this instanceof Network)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this._initializeMixinLoaders(); + + // create variables and set default values + this.containerElement = container; + + // render and calculation settings + this.renderRefreshRate = 60; // hz (fps) + this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on + this.renderTime = 0.5 * this.renderTimestep; // measured time it takes to render a frame + this.maxPhysicsTicksPerRender = 3; // max amount of physics ticks per render step. + this.physicsDiscreteStepsize = 0.50; // discrete stepsize of the simulation + + this.initializing = true; + + this.triggerFunctions = {add:null,edit:null,editEdge:null,connect:null,del:null}; + + // set constant values + this.defaultOptions = { + nodes: { + mass: 1, + radiusMin: 10, + radiusMax: 30, + radius: 10, + shape: 'ellipse', + image: undefined, + widthMin: 16, // px + widthMax: 64, // px + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + fontFill: undefined, + level: -1, + color: { + border: '#2B7CE9', + background: '#97C2FC', + highlight: { + border: '#2B7CE9', + background: '#D2E5FF' + }, + hover: { + border: '#2B7CE9', + background: '#D2E5FF' + } + }, + borderColor: '#2B7CE9', + backgroundColor: '#97C2FC', + highlightColor: '#D2E5FF', + group: undefined, + borderWidth: 1, + borderWidthSelected: undefined + }, + edges: { + widthMin: 1, // + widthMax: 15,// + width: 1, + widthSelectionMultiplier: 2, + hoverWidth: 1.5, + style: 'line', + color: { + color:'#848484', + highlight:'#848484', + hover: '#848484' + }, + fontColor: '#343434', + fontSize: 14, // px + fontFace: 'arial', + fontFill: 'white', + arrowScaleFactor: 1, + dash: { + length: 10, + gap: 5, + altLength: undefined + }, + inheritColor: "from" // to, from, false, true (== from) + }, + configurePhysics:false, + physics: { + barnesHut: { + enabled: true, + theta: 1 / 0.6, // inverted to save time during calculation + gravitationalConstant: -2000, + centralGravity: 0.3, + springLength: 95, + springConstant: 0.04, + damping: 0.09 + }, + repulsion: { + centralGravity: 0.0, + springLength: 200, + springConstant: 0.05, + nodeDistance: 100, + damping: 0.09 + }, + hierarchicalRepulsion: { + enabled: false, + centralGravity: 0.0, + springLength: 100, + springConstant: 0.01, + nodeDistance: 150, + damping: 0.09 + }, + damping: null, + centralGravity: null, + springLength: null, + springConstant: null + }, + clustering: { // Per Node in Cluster = PNiC + enabled: false, // (Boolean) | global on/off switch for clustering. + initialMaxNodes: 100, // (# nodes) | if the initial amount of nodes is larger than this, we cluster until the total number is less than this threshold. + clusterThreshold:500, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than this. If it is, cluster until reduced to reduceToNodes + reduceToNodes:300, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than clusterThreshold. If it is, cluster until reduced to this + chainThreshold: 0.4, // (% of all drawn nodes)| maximum percentage of allowed chainnodes (long strings of connected nodes) within all nodes. (lower means less chains). + clusterEdgeThreshold: 20, // (px) | edge length threshold. if smaller, this node is clustered. + sectorThreshold: 100, // (# nodes in cluster) | cluster size threshold. If larger, expanding in own sector. + screenSizeThreshold: 0.2, // (% of canvas) | relative size threshold. If the width or height of a clusternode takes up this much of the screen, decluster node. + fontSizeMultiplier: 4.0, // (px PNiC) | how much the cluster font size grows per node in cluster (in px). + maxFontSize: 1000, + forceAmplification: 0.1, // (multiplier PNiC) | factor of increase fo the repulsion force of a cluster (per node in cluster). + distanceAmplification: 0.1, // (multiplier PNiC) | factor how much the repulsion distance of a cluster increases (per node in cluster). + edgeGrowth: 20, // (px PNiC) | amount of clusterSize connected to the edge is multiplied with this and added to edgeLength. + nodeScaling: {width: 1, // (px PNiC) | growth of the width per node in cluster. + height: 1, // (px PNiC) | growth of the height per node in cluster. + radius: 1}, // (px PNiC) | growth of the radius per node in cluster. + maxNodeSizeIncrements: 600, // (# increments) | max growth of the width per node in cluster. + activeAreaBoxSize: 80, // (px) | box area around the curser where clusters are popped open. + clusterLevelDifference: 2 + }, + navigation: { + enabled: false + }, + keyboard: { + enabled: false, + speed: {x: 10, y: 10, zoom: 0.02} + }, + dataManipulation: { + enabled: false, + initiallyVisible: false + }, + hierarchicalLayout: { + enabled:false, + levelSeparation: 150, + nodeSpacing: 100, + direction: "UD", // UD, DU, LR, RL + layout: "hubsize" // hubsize, directed + }, + freezeForStabilization: false, + smoothCurves: { + enabled: true, + dynamic: true, + type: "continuous", + roundness: 0.5 + }, + maxVelocity: 30, + minVelocity: 0.1, // px/s + stabilize: true, // stabilize before displaying the network + stabilizationIterations: 1000, // maximum number of iteration to stabilize + locale: 'en', + locales: locales, + tooltip: { + delay: 300, + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' + } + }, + dragNetwork: true, + dragNodes: true, + zoomable: true, + hover: false, + hideEdgesOnDrag: false, + hideNodesOnDrag: false, + width : '100%', + height : '100%', + selectable: true + }; + this.constants = util.extend({}, this.defaultOptions); + this.pixelRatio = 1; + + + this.hoverObj = {nodes:{},edges:{}}; + this.controlNodesActive = false; + this.navigationHammers = {existing:[], new: []}; + + // animation properties + this.animationSpeed = 1/this.renderRefreshRate; + this.animationEasingFunction = "easeInOutQuint"; + this.easingTime = 0; + this.sourceScale = 0; + this.targetScale = 0; + this.sourceTranslation = 0; + this.targetTranslation = 0; + this.lockedOnNodeId = null; + this.lockedOnNodeOffset = null; + + // Node variables + var network = this; + this.groups = new Groups(); // object with groups + this.images = new Images(); // object with images + this.images.setOnloadCallback(function () { + network._redraw(); + }); + + // keyboard navigation variables + this.xIncrement = 0; + this.yIncrement = 0; + this.zoomIncrement = 0; + + // loading all the mixins: + // load the force calculation functions, grouped under the physics system. + this._loadPhysicsSystem(); + // create a frame and canvas + this._create(); + // load the sector system. (mandatory, fully integrated with Network) + this._loadSectorSystem(); + // load the cluster system. (mandatory, even when not using the cluster system, there are function calls to it) + this._loadClusterSystem(); + // load the selection system. (mandatory, required by Network) + this._loadSelectionSystem(); + // load the selection system. (mandatory, required by Network) + this._loadHierarchySystem(); + + + // apply options + this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); + this._setScale(1); + this.setOptions(options); + + // other vars + this.freezeSimulation = false;// freeze the simulation + this.cachedFunctions = {}; + this.startedStabilization = false; + this.stabilized = false; + this.stabilizationIterations = null; + this.draggingNodes = false; + + // containers for nodes and edges + this.calculationNodes = {}; + this.calculationNodeIndices = []; + this.nodeIndices = []; // array with all the indices of the nodes. Used to speed up forces calculation + this.nodes = {}; // object with Node objects + this.edges = {}; // object with Edge objects + + // position and scale variables and objects + this.canvasTopLeft = {"x": 0,"y": 0}; // coordinates of the top left of the canvas. they will be set during _redraw. + this.canvasBottomRight = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw + this.pointerPosition = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw + this.areaCenter = {}; // object with x and y elements used for determining the center of the zoom action + this.scale = 1; // defining the global scale variable in the constructor + this.previousScale = this.scale; // this is used to check if the zoom operation is zooming in or out + + // datasets or dataviews + this.nodesData = null; // A DataSet or DataView + this.edgesData = null; // A DataSet or DataView + + // create event listeners used to subscribe on the DataSets of the nodes and edges + this.nodesListeners = { + 'add': function (event, params) { + network._addNodes(params.items); + network.start(); + }, + 'update': function (event, params) { + network._updateNodes(params.items, params.data); + network.start(); + }, + 'remove': function (event, params) { + network._removeNodes(params.items); + network.start(); + } + }; + this.edgesListeners = { + 'add': function (event, params) { + network._addEdges(params.items); + network.start(); + }, + 'update': function (event, params) { + network._updateEdges(params.items); + network.start(); + }, + 'remove': function (event, params) { + network._removeEdges(params.items); + network.start(); + } + }; + + // properties for the animation + this.moving = true; + this.timer = undefined; // Scheduling function. Is definded in this.start(); + + // load data (the disable start variable will be the same as the enabled clustering) + this.setData(data,this.constants.clustering.enabled || this.constants.hierarchicalLayout.enabled); + + // hierarchical layout + this.initializing = false; + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + } + else { + // zoom so all data will fit on the screen, if clustering is enabled, we do not want start to be called here. + if (this.constants.stabilize == false) { + this.zoomExtent(undefined, true,this.constants.clustering.enabled); + } + } + + // if clustering is disabled, the simulation will have started in the setData function + if (this.constants.clustering.enabled) { + this.startWithClustering(); + } + } + // Extend Network with an Emitter mixin + Emitter(Network.prototype); /** - * Reorder the items + * Get the script path where the vis.js library is located + * + * @returns {string | null} path Path or null when not found. Path does not + * end with a slash. + * @private */ - Group.prototype.order = function() { - var array = util.toArray(this.items); - var startArray = []; - var endArray = []; + Network.prototype._getScriptPath = function() { + var scripts = document.getElementsByTagName( 'script' ); - for (var i = 0; i < array.length; i++) { - if (array[i].data.end !== undefined) { - endArray.push(array[i]); + // find script named vis.js or vis.min.js + for (var i = 0; i < scripts.length; i++) { + var src = scripts[i].src; + var match = src && /\/?vis(.min)?\.js$/.exec(src); + if (match) { + // return path without the script name + return src.substring(0, src.length - match[0].length); } - startArray.push(array[i]); } - this.orderedItems = { - byStart: startArray, - byEnd: endArray - }; - stack.orderByStart(this.orderedItems.byStart); - stack.orderByEnd(this.orderedItems.byEnd); + return null; }; /** - * Update the visible items - * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date - * @param {Item[]} visibleItems The previously visible items. - * @param {{start: number, end: number}} range Visible range - * @return {Item[]} visibleItems The new visible items. + * Find the center position of the network * @private */ - Group.prototype._updateVisibleItems = function(orderedItems, oldVisibleItems, range) { - var visibleItems = []; - var visibleItemsLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems - var interval = (range.end - range.start) / 4; - var lowerBound = range.start - interval; - var upperBound = range.end + interval; - var item, i; - - // this function is used to do the binary search. - var searchFunction = function (value) { - if (value < lowerBound) {return -1;} - else if (value <= upperBound) {return 0;} - else {return 1;} - } - - // first check if the items that were in view previously are still in view. - // IMPORTANT: this handles the case for the items with startdate before the window and enddate after the window! - // also cleans up invisible items. - if (oldVisibleItems.length > 0) { - for (i = 0; i < oldVisibleItems.length; i++) { - this._checkIfVisibleWithReference(oldVisibleItems[i], visibleItems, visibleItemsLookup, range); + Network.prototype._getRange = function() { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (minX > (node.x)) {minX = node.x;} + if (maxX < (node.x)) {maxX = node.x;} + if (minY > (node.y)) {minY = node.y;} + if (maxY < (node.y)) {maxY = node.y;} } } + if (minX == 1e9 && maxX == -1e9 && minY == 1e9 && maxY == -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; + } + return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + }; - // we do a binary search for the items that have only start values. - var initialPosByStart = util.binarySearchCustom(orderedItems.byStart, searchFunction, 'data','start'); - // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the start values. - this._traceVisible(initialPosByStart, orderedItems.byStart, visibleItems, visibleItemsLookup, function (item) { - return (item.data.start < lowerBound || item.data.start > upperBound); - }); + /** + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + * @returns {{x: number, y: number}} + * @private + */ + Network.prototype._findCenter = function(range) { + return {x: (0.5 * (range.maxX + range.minX)), + y: (0.5 * (range.maxY + range.minY))}; + }; - // if the window has changed programmatically without overlapping the old window, the ranged items with start < lowerBound and end > upperbound are not shown. - // We therefore have to brute force check all items in the byEnd list - if (this.checkRangedItems == true) { - this.checkRangedItems = false; - for (i = 0; i < orderedItems.byEnd.length; i++) { - this._checkIfVisibleWithReference(orderedItems.byEnd[i], visibleItems, visibleItemsLookup, range); - } - } - else { - // we do a binary search for the items that have defined end times. - var initialPosByEnd = util.binarySearchCustom(orderedItems.byEnd, searchFunction, 'data','end'); - // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the end values. - this._traceVisible(initialPosByEnd, orderedItems.byEnd, visibleItems, visibleItemsLookup, function (item) { - return (item.data.end < lowerBound || item.data.end > upperBound); - }); + /** + * This function zooms out to fit all data on screen based on amount of nodes + * + * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; + * @param {Boolean} [disableStart] | If true, start is not called. + */ + Network.prototype.zoomExtent = function(animationOptions, initialZoom, disableStart) { + if (initialZoom === undefined) { + initialZoom = false; } - - - // finally, we reposition all the visible items. - for (i = 0; i < visibleItems.length; i++) { - item = visibleItems[i]; - if (!item.displayed) item.show(); - // reposition item horizontally - item.repositionX(); + if (disableStart === undefined) { + disableStart = false; + } + if (animationOptions === undefined) { + animationOptions = false; } - // debug - //console.log("new line") - //if (this.groupId == null) { - // for (i = 0; i < orderedItems.byStart.length; i++) { - // item = orderedItems.byStart[i].data; - // console.log('start',i,initialPosByStart, item.start.valueOf(), item.content, item.start >= lowerBound && item.start <= upperBound,i == initialPosByStart ? "<------------------- HEREEEE" : "") - // } - // for (i = 0; i < orderedItems.byEnd.length; i++) { - // item = orderedItems.byEnd[i].data; - // console.log('rangeEnd',i,initialPosByEnd, item.end.valueOf(), item.content, item.end >= range.start && item.end <= range.end,i == initialPosByEnd ? "<------------------- HEREEEE" : "") - // } - //} - - return visibleItems; - }; - - Group.prototype._traceVisible = function (initialPos, items, visibleItems, visibleItemsLookup, breakCondition) { - var item; - var i; + var range = this._getRange(); + var zoomLevel; - if (initialPos != -1) { - for (i = initialPos; i >= 0; i--) { - item = items[i]; - if (breakCondition(item)) { - break; + if (initialZoom == true) { + var numberOfNodes = this.nodeIndices.length; + if (this.constants.smoothCurves == true) { + if (this.constants.clustering.enabled == true && + numberOfNodes >= this.constants.clustering.initialMaxNodes) { + zoomLevel = 49.07548 / (numberOfNodes + 142.05338) + 9.1444e-04; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. } else { - if (visibleItemsLookup[item.id] === undefined) { - visibleItemsLookup[item.id] = true; - visibleItems.push(item); - } + zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. } } - - for (i = initialPos + 1; i < items.length; i++) { - item = items[i]; - if (breakCondition(item)) { - break; + else { + if (this.constants.clustering.enabled == true && + numberOfNodes >= this.constants.clustering.initialMaxNodes) { + zoomLevel = 77.5271985 / (numberOfNodes + 187.266146) + 4.76710517e-05; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. } else { - if (visibleItemsLookup[item.id] === undefined) { - visibleItemsLookup[item.id] = true; - visibleItems.push(item); - } + zoomLevel = 30.5062972 / (numberOfNodes + 19.93597763) + 0.08413486; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. } } + + // correct for larger canvasses. + var factor = Math.min(this.frame.canvas.clientWidth / 600, this.frame.canvas.clientHeight / 600); + zoomLevel *= factor; } - } + else { + var xDistance = Math.abs(range.maxX - range.minX) * 1.1; + var yDistance = Math.abs(range.maxY - range.minY) * 1.1; + var xZoomLevel = this.frame.canvas.clientWidth / xDistance; + var yZoomLevel = this.frame.canvas.clientHeight / yDistance; - /** - * this function is very similar to the _checkIfInvisible() but it does not - * return booleans, hides the item if it should not be seen and always adds to - * the visibleItems. - * this one is for brute forcing and hiding. - * - * @param {Item} item - * @param {Array} visibleItems - * @param {{start:number, end:number}} range - * @private - */ - Group.prototype._checkIfVisible = function(item, visibleItems, range) { - if (item.isVisible(range)) { - if (!item.displayed) item.show(); - // reposition item horizontally - item.repositionX(); - visibleItems.push(item); - } - else { - if (item.displayed) item.hide(); - } - }; + zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; + } + if (zoomLevel > 1.0) { + zoomLevel = 1.0; + } - /** - * this function is very similar to the _checkIfInvisible() but it does not - * return booleans, hides the item if it should not be seen and always adds to - * the visibleItems. - * this one is for brute forcing and hiding. - * - * @param {Item} item - * @param {Array} visibleItems - * @param {{start:number, end:number}} range - * @private - */ - Group.prototype._checkIfVisibleWithReference = function(item, visibleItems, visibleItemsLookup, range) { - if (item.isVisible(range)) { - if (visibleItemsLookup[item.id] === undefined) { - visibleItemsLookup[item.id] = true; - visibleItems.push(item); - } + + var center = this._findCenter(range); + if (disableStart == false) { + var options = {position: center, scale: zoomLevel, animation: animationOptions}; + this.moveTo(options); + this.moving = true; + this.start(); } else { - if (item.displayed) item.hide(); + center.x *= zoomLevel; + center.y *= zoomLevel; + center.x -= 0.5 * this.frame.canvas.clientWidth; + center.y -= 0.5 * this.frame.canvas.clientHeight; + this._setScale(zoomLevel); + this._setTranslation(-center.x,-center.y); } }; - - module.exports = Group; - - -/***/ }, -/* 28 */ -/***/ function(module, exports, __webpack_require__) { - - // Utility functions for ordering and stacking of items - var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors - /** - * Order items by their start data - * @param {Item[]} items + * Update the this.nodeIndices with the most recent node index list + * @private */ - exports.orderByStart = function(items) { - items.sort(function (a, b) { - return a.data.start - b.data.start; - }); + Network.prototype._updateNodeIndexList = function() { + this._clearNodeIndexList(); + for (var idx in this.nodes) { + if (this.nodes.hasOwnProperty(idx)) { + this.nodeIndices.push(idx); + } + } }; - /** - * Order items by their end date. If they have no end date, their start date - * is used. - * @param {Item[]} items - */ - exports.orderByEnd = function(items) { - items.sort(function (a, b) { - var aTime = ('end' in a.data) ? a.data.end : a.data.start, - bTime = ('end' in b.data) ? b.data.end : b.data.start; - - return aTime - bTime; - }); - }; /** - * Adjust vertical positions of the items such that they don't overlap each - * other. - * @param {Item[]} items - * All visible items - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * Margins between items and between items and the axis. - * @param {boolean} [force=false] - * If true, all items will be repositioned. If false (default), only - * items having a top===null will be re-stacked + * Set nodes and edges, and optionally options as well. + * + * @param {Object} data Object containing parameters: + * {Array | DataSet | DataView} [nodes] Array with nodes + * {Array | DataSet | DataView} [edges] Array with edges + * {String} [dot] String containing data in DOT format + * {String} [gephi] String containing data in gephi JSON format + * {Options} [options] Object with options + * @param {Boolean} [disableStart] | optional: disable the calling of the start function. */ - exports.stack = function(items, margin, force) { - var i, iMax; - - if (force) { - // reset top position of all items - for (i = 0, iMax = items.length; i < iMax; i++) { - items[i].top = null; - } + Network.prototype.setData = function(data, disableStart) { + if (disableStart === undefined) { + disableStart = false; } + // we set initializing to true to ensure that the hierarchical layout is not performed until both nodes and edges are added. + this.initializing = true; - // calculate new, non-overlapping positions - for (i = 0, iMax = items.length; i < iMax; i++) { - var item = items[i]; - if (item.stack && item.top === null) { - // initialize top position - item.top = margin.axis; - - do { - // TODO: optimize checking for overlap. when there is a gap without items, - // you only need to check for items from the next item on, not from zero - var collidingItem = null; - for (var j = 0, jj = items.length; j < jj; j++) { - var other = items[j]; - if (other.top !== null && other !== item && other.stack && exports.collision(item, other, margin.item)) { - collidingItem = other; - break; - } - } + if (data && data.dot && (data.nodes || data.edges)) { + throw new SyntaxError('Data must contain either parameter "dot" or ' + + ' parameter pair "nodes" and "edges", but not both.'); + } - if (collidingItem != null) { - // There is a collision. Reposition the items above the colliding element - item.top = collidingItem.top + collidingItem.height + margin.item.vertical; - } - } while (collidingItem); + // set options + this.setOptions(data && data.options); + // set all data + if (data && data.dot) { + // parse DOT file + if(data && data.dot) { + var dotData = dotparser.DOTToGraph(data.dot); + this.setData(dotData); + return; + } + } + else if (data && data.gephi) { + // parse DOT file + if(data && data.gephi) { + var gephiData = gephiParser.parseGephi(data.gephi); + this.setData(gephiData); + return; + } + } + else { + this._setNodes(data && data.nodes); + this._setEdges(data && data.edges); + } + this._putDataInSector(); + if (disableStart == false) { + if (this.constants.hierarchicalLayout.enabled == true) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + else { + // find a stable position or start animating to a stable position + if (this.constants.stabilize) { + this._stabilize(); + } } + this.start(); } + this.initializing = false; }; - /** - * Adjust vertical positions of the items without stacking them - * @param {Item[]} items - * All visible items - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * Margins between items and between items and the axis. + * Set options + * @param {Object} options */ - exports.nostack = function(items, margin, subgroups) { - var i, iMax, newTop; + Network.prototype.setOptions = function (options) { + if (options) { + var prop; - // reset top position of all items - for (i = 0, iMax = items.length; i < iMax; i++) { - if (items[i].data.subgroup !== undefined) { - newTop = margin.axis; - for (var subgroup in subgroups) { - if (subgroups.hasOwnProperty(subgroup)) { - if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroups[items[i].data.subgroup].index) { - newTop += subgroups[subgroup].height + margin.item.vertical; + var fields = ['nodes','edges','smoothCurves','hierarchicalLayout','clustering','navigation', + 'keyboard','dataManipulation','onAdd','onEdit','onEditEdge','onConnect','onDelete','clickToUse' + ]; + // extend all but the values in fields + util.selectiveNotDeepExtend(fields,this.constants, options); + util.selectiveNotDeepExtend(['color'],this.constants.nodes, options.nodes); + util.selectiveNotDeepExtend(['color','length'],this.constants.edges, options.edges); + + if (options.physics) { + util.mergeOptions(this.constants.physics, options.physics,'barnesHut'); + util.mergeOptions(this.constants.physics, options.physics,'repulsion'); + + if (options.physics.hierarchicalRepulsion) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + for (prop in options.physics.hierarchicalRepulsion) { + if (options.physics.hierarchicalRepulsion.hasOwnProperty(prop)) { + this.constants.physics.hierarchicalRepulsion[prop] = options.physics.hierarchicalRepulsion[prop]; } } } - items[i].top = newTop; - } - else { - items[i].top = margin.axis; } - } - }; - /** - * Test if the two provided items collide - * The items must have parameters left, width, top, and height. - * @param {Item} a The first item - * @param {Item} b The second item - * @param {{horizontal: number, vertical: number}} margin - * An object containing a horizontal and vertical - * minimum required margin. - * @return {boolean} true if a and b collide, else false - */ - exports.collision = function(a, b, margin) { - return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && - (a.left + a.width + margin.horizontal - EPSILON) > b.left && - (a.top - margin.vertical + EPSILON) < (b.top + b.height) && - (a.top + a.height + margin.vertical - EPSILON) > b.top); - }; + if (options.onAdd) {this.triggerFunctions.add = options.onAdd;} + if (options.onEdit) {this.triggerFunctions.edit = options.onEdit;} + if (options.onEditEdge) {this.triggerFunctions.editEdge = options.onEditEdge;} + if (options.onConnect) {this.triggerFunctions.connect = options.onConnect;} + if (options.onDelete) {this.triggerFunctions.del = options.onDelete;} + + util.mergeOptions(this.constants, options,'smoothCurves'); + util.mergeOptions(this.constants, options,'hierarchicalLayout'); + util.mergeOptions(this.constants, options,'clustering'); + util.mergeOptions(this.constants, options,'navigation'); + util.mergeOptions(this.constants, options,'keyboard'); + util.mergeOptions(this.constants, options,'dataManipulation'); -/***/ }, -/* 29 */ -/***/ function(module, exports, __webpack_require__) { + if (options.dataManipulation) { + this.editMode = this.constants.dataManipulation.initiallyVisible; + } - var Hammer = __webpack_require__(19); - var Item = __webpack_require__(30); - /** - * @constructor RangeItem - * @extends Item - * @param {Object} data Object containing parameters start, end - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe options - */ - function RangeItem (data, conversion, options) { - this.props = { - content: { - width: 0 + // TODO: work out these options and document them + if (options.edges) { + if (options.edges.color !== undefined) { + if (util.isString(options.edges.color)) { + this.constants.edges.color = {}; + this.constants.edges.color.color = options.edges.color; + this.constants.edges.color.highlight = options.edges.color; + this.constants.edges.color.hover = options.edges.color; + } + else { + if (options.edges.color.color !== undefined) {this.constants.edges.color.color = options.edges.color.color;} + if (options.edges.color.highlight !== undefined) {this.constants.edges.color.highlight = options.edges.color.highlight;} + if (options.edges.color.hover !== undefined) {this.constants.edges.color.hover = options.edges.color.hover;} + } + } + + if (!options.edges.fontColor) { + if (options.edges.color !== undefined) { + if (util.isString(options.edges.color)) {this.constants.edges.fontColor = options.edges.color;} + else if (options.edges.color.color !== undefined) {this.constants.edges.fontColor = options.edges.color.color;} + } + } + } + + if (options.nodes) { + if (options.nodes.color) { + var newColorObj = util.parseColor(options.nodes.color); + this.constants.nodes.color.background = newColorObj.background; + this.constants.nodes.color.border = newColorObj.border; + this.constants.nodes.color.highlight.background = newColorObj.highlight.background; + this.constants.nodes.color.highlight.border = newColorObj.highlight.border; + this.constants.nodes.color.hover.background = newColorObj.hover.background; + this.constants.nodes.color.hover.border = newColorObj.hover.border; + } + } + if (options.groups) { + for (var groupname in options.groups) { + if (options.groups.hasOwnProperty(groupname)) { + var group = options.groups[groupname]; + this.groups.add(groupname, group); + } + } } - }; - this.overflow = false; // if contents can overflow (css styling), this flag is set to true - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data.id); + if (options.tooltip) { + for (prop in options.tooltip) { + if (options.tooltip.hasOwnProperty(prop)) { + this.constants.tooltip[prop] = options.tooltip[prop]; + } + } + if (options.tooltip.color) { + this.constants.tooltip.color = util.parseColor(options.tooltip.color); + } } - if (data.end == undefined) { - throw new Error('Property "end" missing in item ' + data.id); + + if ('clickToUse' in options) { + if (options.clickToUse) { + this.activator = new Activator(this.frame); + this.activator.on('change', this._createKeyBinds.bind(this)); + } + else { + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } + } } - } - Item.call(this, data, conversion, options); - } + if (options.labels) { + throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.'); + } + } - RangeItem.prototype = new Item (null, null, null); + // (Re)loading the mixins that can be enabled or disabled in the options. + // load the force calculation functions, grouped under the physics system. + this._loadPhysicsSystem(); + // load the navigation system. + this._loadNavigationControls(); + // load the data manipulation system + this._loadManipulationSystem(); + // configure the smooth curves + this._configureSmoothCurves(); - RangeItem.prototype.baseClassName = 'item range'; - /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible - */ - RangeItem.prototype.isVisible = function(range) { - // determine visibility - return (this.data.start < range.end) && (this.data.end > range.start); + // bind keys. If disabled, this will not do anything; + this._createKeyBinds(); + this.setSize(this.constants.width, this.constants.height); + this.moving = true; + this.start(); }; + + /** - * Repaint the item + * Create the main frame for the Network. + * This function is executed once when a Network object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. + * @private */ - RangeItem.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; + Network.prototype._create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); + } - // background box - dom.box = document.createElement('div'); - // className is updated in redraw() + this.frame = document.createElement('div'); + this.frame.className = 'vis network-frame'; + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; - // contents box - dom.content = document.createElement('div'); - dom.content.className = 'content'; - dom.box.appendChild(dom.content); - // attach this item as attribute - dom.box['timeline-item'] = this; + ////////////////////////////////////////////////////////////////// - this.dirty = true; - } + this.frame.canvas = document.createElement("canvas"); - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.box.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) { - throw new Error('Cannot redraw item: parent has no foreground container element'); - } - foreground.appendChild(dom.box); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + + + if (!this.frame.canvas.getContext) { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); } - this.displayed = true; + else { - // Update DOM when item is marked dirty. An item is marked dirty when: - // - the item is not yet rendered - // - the item's data is changed - // - the item is selected/deselected - if (this.dirty) { - this._updateContents(this.dom.content); - this._updateTitle(this.dom.box); - this._updateDataAttributes(this.dom.box); - this._updateStyle(this.dom.box); + var ctx = this.frame.canvas.getContext("2d"); - // update class - var className = (this.data.className ? (' ' + this.data.className) : '') + - (this.selected ? ' selected' : ''); - dom.box.className = this.baseClassName + className; + this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1); - // determine from css whether this box has overflow - this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; - // recalculate size - this.props.content.width = this.dom.content.offsetWidth; - this.height = this.dom.box.offsetHeight; - this.dirty = false; + this.frame.canvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); } - this._repaintDeleteButton(dom.box); - this._repaintDragLeft(); - this._repaintDragRight(); - }; + ////////////////////////////////////////////////////////////////// - /** - * Show the item in the DOM (when not already visible). The items DOM will - * be created when needed. - */ - RangeItem.prototype.show = function() { - if (!this.displayed) { - this.redraw(); - } - }; - /** - * Hide the item from the DOM (when visible) - * @return {Boolean} changed - */ - RangeItem.prototype.hide = function() { - if (this.displayed) { - var box = this.dom.box; + var me = this; + this.drag = {}; + this.pinch = {}; + this.hammer = Hammer(this.frame.canvas, { + prevent_default: true + }); + this.hammer.on('tap', me._onTap.bind(me) ); + this.hammer.on('doubletap', me._onDoubleTap.bind(me) ); + this.hammer.on('hold', me._onHold.bind(me) ); + this.hammer.on('pinch', me._onPinch.bind(me) ); + this.hammer.on('touch', me._onTouch.bind(me) ); + this.hammer.on('dragstart', me._onDragStart.bind(me) ); + this.hammer.on('drag', me._onDrag.bind(me) ); + this.hammer.on('dragend', me._onDragEnd.bind(me) ); + this.hammer.on('mousewheel',me._onMouseWheel.bind(me) ); + this.hammer.on('DOMMouseScroll',me._onMouseWheel.bind(me) ); // for FF + this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); - if (box.parentNode) { - box.parentNode.removeChild(box); - } + this.hammerFrame = Hammer(this.frame, { + prevent_default: true + }); - this.top = null; - this.left = null; + this.hammerFrame.on('release', me._onRelease.bind(me) ); + + // add the frame to the container element + this.containerElement.appendChild(this.frame); - this.displayed = false; - } }; + /** - * Reposition the item horizontally - * @Override + * Binding the keys for keyboard navigation. These functions are defined in the NavigationMixin + * @private */ - RangeItem.prototype.repositionX = function() { - var parentWidth = this.parent.width; - var start = this.conversion.toScreen(this.data.start); - var end = this.conversion.toScreen(this.data.end); - var contentLeft; - var contentWidth; - - // limit the width of the this, as browsers cannot draw very wide divs - if (start < -parentWidth) { - start = -parentWidth; - } - if (end > 2 * parentWidth) { - end = 2 * parentWidth; + Network.prototype._createKeyBinds = function() { + var me = this; + if (this.keycharm !== undefined) { + this.keycharm.destroy(); } - var boxWidth = Math.max(end - start, 1); + this.keycharm = keycharm(); - if (this.overflow) { - this.left = start; - this.width = boxWidth + this.props.content.width; - contentWidth = this.props.content.width; + this.keycharm.reset(); - // Note: The calculation of width is an optimistic calculation, giving - // a width which will not change when moving the Timeline - // So no re-stacking needed, which is nicer for the eye; - } - else { - this.left = start; - this.width = boxWidth; - contentWidth = Math.min(end - start, this.props.content.width); + if (this.constants.keyboard.enabled && this.isActive()) { + this.keycharm.bind("up", this._moveUp.bind(me) , "keydown"); + this.keycharm.bind("up", this._yStopMoving.bind(me), "keyup"); + this.keycharm.bind("down", this._moveDown.bind(me) , "keydown"); + this.keycharm.bind("down", this._yStopMoving.bind(me), "keyup"); + this.keycharm.bind("left", this._moveLeft.bind(me) , "keydown"); + this.keycharm.bind("left", this._xStopMoving.bind(me), "keyup"); + this.keycharm.bind("right",this._moveRight.bind(me), "keydown"); + this.keycharm.bind("right",this._xStopMoving.bind(me), "keyup"); + this.keycharm.bind("=", this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("=", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("num+", this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("num+", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("num-", this._zoomOut.bind(me), "keydown"); + this.keycharm.bind("num-", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("-", this._zoomOut.bind(me), "keydown"); + this.keycharm.bind("-", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("[", this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("[", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("]", this._zoomOut.bind(me), "keydown"); + this.keycharm.bind("]", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("pageup",this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("pageup",this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("pagedown",this._zoomOut.bind(me),"keydown"); + this.keycharm.bind("pagedown",this._stopZoom.bind(me), "keyup"); } - this.dom.box.style.left = this.left + 'px'; - this.dom.box.style.width = boxWidth + 'px'; - - switch (this.options.align) { - case 'left': - this.dom.content.style.left = '0'; - break; - - case 'right': - this.dom.content.style.left = Math.max((boxWidth - contentWidth - 2 * this.options.padding), 0) + 'px'; - break; - - case 'center': - this.dom.content.style.left = Math.max((boxWidth - contentWidth - 2 * this.options.padding) / 2, 0) + 'px'; - break; - - default: // 'auto' - if (this.overflow) { - // when range exceeds left of the window, position the contents at the left of the visible area - contentLeft = Math.max(-start, 0); - } - else { - // when range exceeds left of the window, position the contents at the left of the visible area - if (start < 0) { - contentLeft = Math.min(-start, - (end - start - this.props.content.width - 2 * this.options.padding)); - // TODO: remove the need for options.padding. it's terrible. - } - else { - contentLeft = 0; - } - } - this.dom.content.style.left = contentLeft + 'px'; + if (this.constants.dataManipulation.enabled == true) { + this.keycharm.bind("esc",this._createManipulatorBar.bind(me)); + this.keycharm.bind("delete",this._deleteSelected.bind(me)); } }; /** - * Reposition the item vertically - * @Override + * Get the pointer location from a touch location + * @param {{pageX: Number, pageY: Number}} touch + * @return {{x: Number, y: Number}} pointer + * @private */ - RangeItem.prototype.repositionY = function() { - var orientation = this.options.orientation, - box = this.dom.box; - - if (orientation == 'top') { - box.style.top = this.top + 'px'; - } - else { - box.style.top = (this.parent.height - this.top - this.height) + 'px'; - } + Network.prototype._getPointer = function (touch) { + return { + x: touch.pageX - util.getAbsoluteLeft(this.frame.canvas), + y: touch.pageY - util.getAbsoluteTop(this.frame.canvas) + }; }; /** - * Repaint a drag area on the left side of the range when the range is selected - * @protected + * On start of a touch gesture, store the pointer + * @param event + * @private */ - RangeItem.prototype._repaintDragLeft = function () { - if (this.selected && this.options.editable.updateTime && !this.dom.dragLeft) { - // create and show drag area - var dragLeft = document.createElement('div'); - dragLeft.className = 'drag-left'; - dragLeft.dragLeftItem = this; + Network.prototype._onTouch = function (event) { + this.drag.pointer = this._getPointer(event.gesture.center); + this.drag.pinched = false; + this.pinch.scale = this._getScale(); - // TODO: this should be redundant? - Hammer(dragLeft, { - preventDefault: true - }).on('drag', function () { - //console.log('drag left') - }); + this._handleTouch(this.drag.pointer); + }; - this.dom.box.appendChild(dragLeft); - this.dom.dragLeft = dragLeft; - } - else if (!this.selected && this.dom.dragLeft) { - // delete drag area - if (this.dom.dragLeft.parentNode) { - this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft); - } - this.dom.dragLeft = null; - } + /** + * handle drag start event + * @private + */ + Network.prototype._onDragStart = function () { + this._handleDragStart(); }; + /** - * Repaint a drag area on the right side of the range when the range is selected - * @protected + * This function is called by _onDragStart. + * It is separated out because we can then overload it for the datamanipulation system. + * + * @private */ - RangeItem.prototype._repaintDragRight = function () { - if (this.selected && this.options.editable.updateTime && !this.dom.dragRight) { - // create and show drag area - var dragRight = document.createElement('div'); - dragRight.className = 'drag-right'; - dragRight.dragRightItem = this; + Network.prototype._handleDragStart = function() { + var drag = this.drag; + var node = this._getNodeAt(drag.pointer); + // note: drag.pointer is set in _onTouch to get the initial touch location - // TODO: this should be redundant? - Hammer(dragRight, { - preventDefault: true - }).on('drag', function () { - //console.log('drag right') - }); + drag.dragging = true; + drag.selection = []; + drag.translation = this._getTranslation(); + drag.nodeId = null; + this.draggingNodes = false; - this.dom.box.appendChild(dragRight); - this.dom.dragRight = dragRight; - } - else if (!this.selected && this.dom.dragRight) { - // delete drag area - if (this.dom.dragRight.parentNode) { - this.dom.dragRight.parentNode.removeChild(this.dom.dragRight); + if (node != null && this.constants.dragNodes == true) { + this.draggingNodes = true; + drag.nodeId = node.id; + // select the clicked node if not yet selected + if (!node.isSelected()) { + this._selectObject(node,false); + } + + this.emit("dragStart",{nodeIds:this.getSelection().nodes}); + + // create an array with the selected nodes and their original location and status + for (var objectId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(objectId)) { + var object = this.selectionObj.nodes[objectId]; + var s = { + id: object.id, + node: object, + + // store original x, y, xFixed and yFixed, make the node temporarily Fixed + x: object.x, + y: object.y, + xFixed: object.xFixed, + yFixed: object.yFixed + }; + + object.xFixed = true; + object.yFixed = true; + + drag.selection.push(s); + } } - this.dom.dragRight = null; } }; - module.exports = RangeItem; - -/***/ }, -/* 30 */ -/***/ function(module, exports, __webpack_require__) { + /** + * handle drag event + * @private + */ + Network.prototype._onDrag = function (event) { + this._handleOnDrag(event) + }; - var Hammer = __webpack_require__(19); - var util = __webpack_require__(1); /** - * @constructor Item - * @param {Object} data Object containing (optional) parameters type, - * start, end, content, group, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} options Configuration options - * // TODO: describe available options + * This function is called by _onDrag. + * It is separated out because we can then overload it for the datamanipulation system. + * + * @private */ - function Item (data, conversion, options) { - this.id = null; - this.parent = null; - this.data = data; - this.dom = null; - this.conversion = conversion || {}; - this.options = options || {}; + Network.prototype._handleOnDrag = function(event) { + if (this.drag.pinched) { + return; + } - this.selected = false; - this.displayed = false; - this.dirty = true; + // remove the focus on node if it is focussed on by the focusOnNode + this.releaseNode(); - this.top = null; - this.left = null; - this.width = null; - this.height = null; - } + var pointer = this._getPointer(event.gesture.center); + var me = this; + var drag = this.drag; + var selection = drag.selection; + if (selection && selection.length && this.constants.dragNodes == true) { + // calculate delta's and new location + var deltaX = pointer.x - drag.pointer.x; + var deltaY = pointer.y - drag.pointer.y; - Item.prototype.stack = true; + // update position of all selected nodes + selection.forEach(function (s) { + var node = s.node; - /** - * Select current item - */ - Item.prototype.select = function() { - this.selected = true; - this.dirty = true; - if (this.displayed) this.redraw(); + if (!s.xFixed) { + node.x = me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x) + deltaX); + } + + if (!s.yFixed) { + node.y = me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y) + deltaY); + } + }); + + + // start _animationStep if not yet running + if (!this.moving) { + this.moving = true; + this.start(); + } + } + else { + if (this.constants.dragNetwork == true) { + // move the network + var diffX = pointer.x - this.drag.pointer.x; + var diffY = pointer.y - this.drag.pointer.y; + + this._setTranslation( + this.drag.translation.x + diffX, + this.drag.translation.y + diffY + ); + this._redraw(); + // this.moving = true; + // this.start(); + } + } }; /** - * Unselect current item + * handle drag start event + * @private */ - Item.prototype.unselect = function() { - this.selected = false; - this.dirty = true; - if (this.displayed) this.redraw(); + Network.prototype._onDragEnd = function (event) { + this._handleDragEnd(event); }; - /** - * Set data for the item. Existing data will be updated. The id should not - * be changed. When the item is displayed, it will be redrawn immediately. - * @param {Object} data - */ - Item.prototype.setData = function(data) { - this.data = data; - this.dirty = true; - if (this.displayed) this.redraw(); - }; - /** - * Set a parent for the item - * @param {ItemSet | Group} parent - */ - Item.prototype.setParent = function(parent) { - if (this.displayed) { - this.hide(); - this.parent = parent; - if (this.parent) { - this.show(); - } + Network.prototype._handleDragEnd = function(event) { + this.drag.dragging = false; + var selection = this.drag.selection; + if (selection && selection.length) { + selection.forEach(function (s) { + // restore original xFixed and yFixed + s.node.xFixed = s.xFixed; + s.node.yFixed = s.yFixed; + }); + this.moving = true; + this.start(); } else { - this.parent = parent; + this._redraw(); + } + if (this.draggingNodes == false) { + this.emit("dragEnd",{nodeIds:[]}); + } + else { + this.emit("dragEnd",{nodeIds:this.getSelection().nodes}); } - }; + } /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible + * handle tap/click event: select/unselect a node + * @private */ - Item.prototype.isVisible = function(range) { - // Should be implemented by Item implementations - return false; - }; + Network.prototype._onTap = function (event) { + var pointer = this._getPointer(event.gesture.center); + this.pointerPosition = pointer; + this._handleTap(pointer); - /** - * Show the Item in the DOM (when not already visible) - * @return {Boolean} changed - */ - Item.prototype.show = function() { - return false; }; - /** - * Hide the Item from the DOM (when visible) - * @return {Boolean} changed - */ - Item.prototype.hide = function() { - return false; - }; /** - * Repaint the item + * handle doubletap event + * @private */ - Item.prototype.redraw = function() { - // should be implemented by the item + Network.prototype._onDoubleTap = function (event) { + var pointer = this._getPointer(event.gesture.center); + this._handleDoubleTap(pointer); }; + /** - * Reposition the Item horizontally + * handle long tap event: multi select nodes + * @private */ - Item.prototype.repositionX = function() { - // should be implemented by the item + Network.prototype._onHold = function (event) { + var pointer = this._getPointer(event.gesture.center); + this.pointerPosition = pointer; + this._handleOnHold(pointer); }; /** - * Reposition the Item vertically + * handle the release of the screen + * + * @private */ - Item.prototype.repositionY = function() { - // should be implemented by the item + Network.prototype._onRelease = function (event) { + var pointer = this._getPointer(event.gesture.center); + this._handleOnRelease(pointer); }; /** - * Repaint a delete button on the top right of the item when the item is selected - * @param {HTMLElement} anchor - * @protected + * Handle pinch event + * @param event + * @private */ - Item.prototype._repaintDeleteButton = function (anchor) { - if (this.selected && this.options.editable.remove && !this.dom.deleteButton) { - // create and show button - var me = this; - - var deleteButton = document.createElement('div'); - deleteButton.className = 'delete'; - deleteButton.title = 'Delete this item'; - - Hammer(deleteButton, { - preventDefault: true - }).on('tap', function (event) { - me.parent.removeFromDataSet(me); - event.stopPropagation(); - }); + Network.prototype._onPinch = function (event) { + var pointer = this._getPointer(event.gesture.center); - anchor.appendChild(deleteButton); - this.dom.deleteButton = deleteButton; - } - else if (!this.selected && this.dom.deleteButton) { - // remove button - if (this.dom.deleteButton.parentNode) { - this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); - } - this.dom.deleteButton = null; + this.drag.pinched = true; + if (!('scale' in this.pinch)) { + this.pinch.scale = 1; } + + // TODO: enabled moving while pinching? + var scale = this.pinch.scale * event.gesture.scale; + this._zoom(scale, pointer) }; /** - * Set HTML contents for the item - * @param {Element} element HTML element to fill with the contents + * Zoom the network in or out + * @param {Number} scale a number around 1, and between 0.01 and 10 + * @param {{x: Number, y: Number}} pointer Position on screen + * @return {Number} appliedScale scale is limited within the boundaries * @private */ - Item.prototype._updateContents = function (element) { - var content; - if (this.options.template) { - var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset - content = this.options.template(itemData); - } - else { - content = this.data.content; - } + Network.prototype._zoom = function(scale, pointer) { + if (this.constants.zoomable == true) { + var scaleOld = this._getScale(); + if (scale < 0.00001) { + scale = 0.00001; + } + if (scale > 10) { + scale = 10; + } - if(content !== this.content) { - // only replace the content when changed - if (content instanceof Element) { - element.innerHTML = ''; - element.appendChild(content); + var preScaleDragPointer = null; + if (this.drag !== undefined) { + if (this.drag.dragging == true) { + preScaleDragPointer = this.DOMtoCanvas(this.drag.pointer); + } } - else if (content != undefined) { - element.innerHTML = content; + // + this.frame.canvas.clientHeight / 2 + var translation = this._getTranslation(); + + var scaleFrac = scale / scaleOld; + var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; + var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; + + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; + + this._setScale(scale); + this._setTranslation(tx, ty); + this.updateClustersDefault(); + + if (preScaleDragPointer != null) { + var postScaleDragPointer = this.canvasToDOM(preScaleDragPointer); + this.drag.pointer.x = postScaleDragPointer.x; + this.drag.pointer.y = postScaleDragPointer.y; + } + + this._redraw(); + + if (scaleOld < scale) { + this.emit("zoom", {direction:"+"}); } else { - if (!(this.data.type == 'background' && this.data.content === undefined)) { - throw new Error('Property "content" missing in item ' + this.id); - } + this.emit("zoom", {direction:"-"}); } - this.content = content; + return scale; } }; + /** - * Set HTML contents for the item - * @param {Element} element HTML element to fill with the contents + * Event handler for mouse wheel event, used to zoom the timeline + * See http://adomas.org/javascript-mouse-wheel/ + * https://github.com/EightMedia/hammer.js/issues/256 + * @param {MouseEvent} event * @private */ - Item.prototype._updateTitle = function (element) { - if (this.data.title != null) { - element.title = this.data.title || ''; - } - else { - element.removeAttribute('title'); + Network.prototype._onMouseWheel = function(event) { + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; } - }; - /** - * Process dataAttributes timeline option and set as data- attributes on dom.content - * @param {Element} element HTML element to which the attributes will be attached - * @private - */ - Item.prototype._updateDataAttributes = function(element) { - if (this.options.dataAttributes && this.options.dataAttributes.length > 0) { - var attributes = []; + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { - if (Array.isArray(this.options.dataAttributes)) { - attributes = this.options.dataAttributes; - } - else if (this.options.dataAttributes == 'all') { - attributes = Object.keys(this.data); - } - else { - return; + // calculate the new scale + var scale = this._getScale(); + var zoom = delta / 10; + if (delta < 0) { + zoom = zoom / (1 - zoom); } + scale *= (1 + zoom); - for (var i = 0; i < attributes.length; i++) { - var name = attributes[i]; - var value = this.data[name]; + // calculate the pointer location + var gesture = hammerUtil.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); - if (value != null) { - element.setAttribute('data-' + name, value); - } - else { - element.removeAttribute('data-' + name); - } - } + // apply the new scale + this._zoom(scale, pointer); } + + // Prevent default actions caused by mouse wheel. + event.preventDefault(); }; + /** - * Update custom styles of the element - * @param element + * Mouse move handler for checking whether the title moves over a node with a title. + * @param {Event} event * @private */ - Item.prototype._updateStyle = function(element) { - // remove old styles - if (this.style) { - util.removeCssText(element, this.style); - this.style = null; + Network.prototype._onMouseMoveTitle = function (event) { + var gesture = hammerUtil.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + + // check if the previously selected node is still selected + if (this.popupObj) { + this._checkHidePopup(pointer); } - // append new styles - if (this.data.style) { - util.addCssText(element, this.data.style); - this.style = this.data.style; + // start a timeout that will check if the mouse is positioned above + // an element + var me = this; + var checkShow = function() { + me._checkShowPopup(pointer); + }; + if (this.popupTimer) { + clearInterval(this.popupTimer); // stop any running calculationTimer + } + if (!this.drag.dragging) { + this.popupTimer = setTimeout(checkShow, this.constants.tooltip.delay); } - }; - module.exports = Item; + /** + * Adding hover highlights + */ + if (this.constants.hover == true) { + // removing all hover highlights + for (var edgeId in this.hoverObj.edges) { + if (this.hoverObj.edges.hasOwnProperty(edgeId)) { + this.hoverObj.edges[edgeId].hover = false; + delete this.hoverObj.edges[edgeId]; + } + } -/***/ }, -/* 31 */ -/***/ function(module, exports, __webpack_require__) { + // adding hover highlights + var obj = this._getNodeAt(pointer); + if (obj == null) { + obj = this._getEdgeAt(pointer); + } + if (obj != null) { + this._hoverObject(obj); + } - var util = __webpack_require__(1); - var Group = __webpack_require__(27); + // removing all node hover highlights except for the selected one. + for (var nodeId in this.hoverObj.nodes) { + if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { + if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { + this._blurObject(this.hoverObj.nodes[nodeId]); + delete this.hoverObj.nodes[nodeId]; + } + } + } + this.redraw(); + } + }; /** - * @constructor BackgroundGroup - * @param {Number | String} groupId - * @param {Object} data - * @param {ItemSet} itemSet + * Check if there is an element on the given position in the network + * (a node or edge). If so, and if this element has a title, + * show a popup window with its title. + * + * @param {{x:Number, y:Number}} pointer + * @private */ - function BackgroundGroup (groupId, data, itemSet) { - Group.call(this, groupId, data, itemSet); - - this.width = 0; - this.height = 0; - this.top = 0; - this.left = 0; - } - - BackgroundGroup.prototype = Object.create(Group.prototype); + Network.prototype._checkShowPopup = function (pointer) { + var obj = { + left: this._XconvertDOMtoCanvas(pointer.x), + top: this._YconvertDOMtoCanvas(pointer.y), + right: this._XconvertDOMtoCanvas(pointer.x), + bottom: this._YconvertDOMtoCanvas(pointer.y) + }; - /** - * Repaint this group - * @param {{start: number, end: number}} range - * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin - * @param {boolean} [restack=false] Force restacking of all items - * @return {boolean} Returns true if the group is resized - */ - BackgroundGroup.prototype.redraw = function(range, margin, restack) { - var resized = false; + var id; + var lastPopupNode = this.popupObj; - this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); + if (this.popupObj == undefined) { + // search the nodes for overlap, select the top one in case of multiple nodes + var nodes = this.nodes; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + var node = nodes[id]; + if (node.getTitle() !== undefined && node.isOverlappingWith(obj)) { + this.popupObj = node; + break; + } + } + } + } - // calculate actual size - this.width = this.dom.background.offsetWidth; + if (this.popupObj === undefined) { + // search the edges for overlap + var edges = this.edges; + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + if (edge.connected && (edge.getTitle() !== undefined) && + edge.isOverlappingWith(obj)) { + this.popupObj = edge; + break; + } + } + } + } - // apply new height (just always zero for BackgroundGroup - this.dom.background.style.height = '0'; + if (this.popupObj) { + // show popup message window + if (this.popupObj != lastPopupNode) { + var me = this; + if (!me.popup) { + me.popup = new Popup(me.frame, me.constants.tooltip); + } - // update vertical position of items after they are re-stacked and the height of the group is calculated - for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { - var item = this.visibleItems[i]; - item.repositionY(margin); + // adjust a small offset such that the mouse cursor is located in the + // bottom left location of the popup, and you can easily move over the + // popup area + me.popup.setPosition(pointer.x - 3, pointer.y - 3); + me.popup.setText(me.popupObj.getTitle()); + me.popup.show(); + } + } + else { + if (this.popup) { + this.popup.hide(); + } } - - return resized; }; + /** - * Show this group: attach to the DOM + * Check if the popup must be hided, which is the case when the mouse is no + * longer hovering on the object + * @param {{x:Number, y:Number}} pointer + * @private */ - BackgroundGroup.prototype.show = function() { - if (!this.dom.background.parentNode) { - this.itemSet.dom.background.appendChild(this.dom.background); + Network.prototype._checkHidePopup = function (pointer) { + if (!this.popupObj || !this._getNodeAt(pointer) ) { + this.popupObj = undefined; + if (this.popup) { + this.popup.hide(); + } } }; - module.exports = BackgroundGroup; + /** + * Set a new size for the network + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') + */ + Network.prototype.setSize = function(width, height) { + var emitEvent = false; + var oldWidth = this.frame.canvas.width; + var oldHeight = this.frame.canvas.height; + if (width != this.constants.width || height != this.constants.height || this.frame.style.width != width || this.frame.style.height != height) { + this.frame.style.width = width; + this.frame.style.height = height; -/***/ }, -/* 32 */ -/***/ function(module, exports, __webpack_require__) { + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; - var Item = __webpack_require__(30); - var util = __webpack_require__(1); + this.frame.canvas.width = this.frame.canvas.clientWidth * this.pixelRatio; + this.frame.canvas.height = this.frame.canvas.clientHeight * this.pixelRatio; - /** - * @constructor BoxItem - * @extends Item - * @param {Object} data Object containing parameters start - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe available options - */ - function BoxItem (data, conversion, options) { - this.props = { - dot: { - width: 0, - height: 0 - }, - line: { - width: 0, - height: 0 - } - }; + this.constants.width = width; + this.constants.height = height; - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data); + emitEvent = true; + } + else { + // this would adapt the width of the canvas to the width from 100% if and only if + // there is a change. + + if (this.frame.canvas.width != this.frame.canvas.clientWidth * this.pixelRatio) { + this.frame.canvas.width = this.frame.canvas.clientWidth * this.pixelRatio; + emitEvent = true; + } + if (this.frame.canvas.height != this.frame.canvas.clientHeight * this.pixelRatio) { + this.frame.canvas.height = this.frame.canvas.clientHeight * this.pixelRatio; + emitEvent = true; } } - Item.call(this, data, conversion, options); - } - - BoxItem.prototype = new Item (null, null, null); - - /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible - */ - BoxItem.prototype.isVisible = function(range) { - // determine visibility - // TODO: account for the real width of the item. Right now we just add 1/4 to the window - var interval = (range.end - range.start) / 4; - return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); + if (emitEvent == true) { + this.emit('resize', {width:this.frame.canvas.width * this.pixelRatio,height:this.frame.canvas.height * this.pixelRatio, oldWidth: oldWidth * this.pixelRatio, oldHeight: oldHeight * this.pixelRatio}); + } }; /** - * Repaint the item + * Set a data set with nodes for the network + * @param {Array | DataSet | DataView} nodes The data containing the nodes. + * @private */ - BoxItem.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; - - // create main box - dom.box = document.createElement('DIV'); - - // contents box (inside the background box). used for making margins - dom.content = document.createElement('DIV'); - dom.content.className = 'content'; - dom.box.appendChild(dom.content); - - // line to axis - dom.line = document.createElement('DIV'); - dom.line.className = 'line'; - - // dot on axis - dom.dot = document.createElement('DIV'); - dom.dot.className = 'dot'; - - // attach this item as attribute - dom.box['timeline-item'] = this; + Network.prototype._setNodes = function(nodes) { + var oldNodesData = this.nodesData; - this.dirty = true; + if (nodes instanceof DataSet || nodes instanceof DataView) { + this.nodesData = nodes; } - - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); + else if (Array.isArray(nodes)) { + this.nodesData = new DataSet(); + this.nodesData.add(nodes); } - if (!dom.box.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) throw new Error('Cannot redraw item: parent has no foreground container element'); - foreground.appendChild(dom.box); + else if (!nodes) { + this.nodesData = new DataSet(); } - if (!dom.line.parentNode) { - var background = this.parent.dom.background; - if (!background) throw new Error('Cannot redraw item: parent has no background container element'); - background.appendChild(dom.line); + else { + throw new TypeError('Array or DataSet expected'); } - if (!dom.dot.parentNode) { - var axis = this.parent.dom.axis; - if (!background) throw new Error('Cannot redraw item: parent has no axis container element'); - axis.appendChild(dom.dot); + + if (oldNodesData) { + // unsubscribe from old dataset + util.forEach(this.nodesListeners, function (callback, event) { + oldNodesData.off(event, callback); + }); } - this.displayed = true; - // Update DOM when item is marked dirty. An item is marked dirty when: - // - the item is not yet rendered - // - the item's data is changed - // - the item is selected/deselected - if (this.dirty) { - this._updateContents(this.dom.content); - this._updateTitle(this.dom.box); - this._updateDataAttributes(this.dom.box); - this._updateStyle(this.dom.box); + // remove drawn nodes + this.nodes = {}; - // update class - var className = (this.data.className? ' ' + this.data.className : '') + - (this.selected ? ' selected' : ''); - dom.box.className = 'item box' + className; - dom.line.className = 'item line' + className; - dom.dot.className = 'item dot' + className; + if (this.nodesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.nodesListeners, function (callback, event) { + me.nodesData.on(event, callback); + }); - // recalculate size - this.props.dot.height = dom.dot.offsetHeight; - this.props.dot.width = dom.dot.offsetWidth; - this.props.line.width = dom.line.offsetWidth; - this.width = dom.box.offsetWidth; - this.height = dom.box.offsetHeight; + // draw all new nodes + var ids = this.nodesData.getIds(); + this._addNodes(ids); + } + this._updateSelection(); + }; - this.dirty = false; + /** + * Add nodes + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._addNodes = function(ids) { + var id; + for (var i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + var data = this.nodesData.get(id); + var node = new Node(data, this.images, this.groups, this.constants); + this.nodes[id] = node; // note: this may replace an existing node + if ((node.xFixed == false || node.yFixed == false) && (node.x === null || node.y === null)) { + var radius = 10 * 0.1*ids.length + 10; + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + } + this.moving = true; } - this._repaintDeleteButton(dom.box); + this._updateNodeIndexList(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + this._reconnectEdges(); + this._updateValueRange(this.nodes); + this.updateLabels(); }; /** - * Show the item in the DOM (when not already displayed). The items DOM will - * be created when needed. + * Update existing nodes, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private */ - BoxItem.prototype.show = function() { - if (!this.displayed) { - this.redraw(); + Network.prototype._updateNodes = function(ids,changedData) { + var nodes = this.nodes; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var node = nodes[id]; + var data = changedData[i]; + if (node) { + // update node + node.setProperties(data, this.constants); + } + else { + // create node + node = new Node(properties, this.images, this.groups, this.constants); + nodes[id] = node; + } } + this.moving = true; + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateNodeIndexList(); + this._updateValueRange(nodes); }; /** - * Hide the item from the DOM (when visible) + * Remove existing nodes. If nodes do not exist, the method will just ignore it. + * @param {Number[] | String[]} ids + * @private */ - BoxItem.prototype.hide = function() { - if (this.displayed) { - var dom = this.dom; - - if (dom.box.parentNode) dom.box.parentNode.removeChild(dom.box); - if (dom.line.parentNode) dom.line.parentNode.removeChild(dom.line); - if (dom.dot.parentNode) dom.dot.parentNode.removeChild(dom.dot); - - this.top = null; - this.left = null; - - this.displayed = false; + Network.prototype._removeNodes = function(ids) { + var nodes = this.nodes; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + delete nodes[id]; + } + this._updateNodeIndexList(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); } + this._updateCalculationNodes(); + this._reconnectEdges(); + this._updateSelection(); + this._updateValueRange(nodes); }; /** - * Reposition the item horizontally - * @Override + * Load edges by reading the data table + * @param {Array | DataSet | DataView} edges The data containing the edges. + * @private + * @private */ - BoxItem.prototype.repositionX = function() { - var start = this.conversion.toScreen(this.data.start); - var align = this.options.align; - var left; - var box = this.dom.box; - var line = this.dom.line; - var dot = this.dom.dot; + Network.prototype._setEdges = function(edges) { + var oldEdgesData = this.edgesData; - // calculate left position of the box - if (align == 'right') { - this.left = start - this.width; + if (edges instanceof DataSet || edges instanceof DataView) { + this.edgesData = edges; } - else if (align == 'left') { - this.left = start; + else if (Array.isArray(edges)) { + this.edgesData = new DataSet(); + this.edgesData.add(edges); + } + else if (!edges) { + this.edgesData = new DataSet(); } else { - // default or 'center' - this.left = start - this.width / 2; + throw new TypeError('Array or DataSet expected'); } - // reposition box - box.style.left = this.left + 'px'; + if (oldEdgesData) { + // unsubscribe from old dataset + util.forEach(this.edgesListeners, function (callback, event) { + oldEdgesData.off(event, callback); + }); + } - // reposition line - line.style.left = (start - this.props.line.width / 2) + 'px'; + // remove drawn edges + this.edges = {}; - // reposition dot - dot.style.left = (start - this.props.dot.width / 2) + 'px'; + if (this.edgesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.edgesListeners, function (callback, event) { + me.edgesData.on(event, callback); + }); + + // draw all new nodes + var ids = this.edgesData.getIds(); + this._addEdges(ids); + } + + this._reconnectEdges(); }; /** - * Reposition the item vertically - * @Override + * Add edges + * @param {Number[] | String[]} ids + * @private */ - BoxItem.prototype.repositionY = function() { - var orientation = this.options.orientation; - var box = this.dom.box; - var line = this.dom.line; - var dot = this.dom.dot; + Network.prototype._addEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; - if (orientation == 'top') { - box.style.top = (this.top || 0) + 'px'; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; - line.style.top = '0'; - line.style.height = (this.parent.top + this.top + 1) + 'px'; - line.style.bottom = ''; - } - else { // orientation 'bottom' - var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty - var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; + var oldEdge = edges[id]; + if (oldEdge) { + oldEdge.disconnect(); + } - box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; - line.style.top = (itemSetHeight - lineHeight) + 'px'; - line.style.bottom = '0'; + var data = edgesData.get(id, {"showInternalIds" : true}); + edges[id] = new Edge(data, this, this.constants); + } + this.moving = true; + this._updateValueRange(edges); + this._createBezierNodes(); + this._updateCalculationNodes(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); } - - dot.style.top = (-this.props.dot.height / 2) + 'px'; }; - module.exports = BoxItem; - - -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { - - var Item = __webpack_require__(30); - /** - * @constructor PointItem - * @extends Item - * @param {Object} data Object containing parameters start - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe available options + * Update existing edges, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private */ - function PointItem (data, conversion, options) { - this.props = { - dot: { - top: 0, - width: 0, - height: 0 - }, - content: { - height: 0, - marginLeft: 0 - } - }; + Network.prototype._updateEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data); + var data = edgesData.get(id); + var edge = edges[id]; + if (edge) { + // update edge + edge.disconnect(); + edge.setProperties(data, this.constants); + edge.connect(); + } + else { + // create edge + edge = new Edge(data, this, this.constants); + this.edges[id] = edge; } } - Item.call(this, data, conversion, options); - } - - PointItem.prototype = new Item (null, null, null); + this._createBezierNodes(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this.moving = true; + this._updateValueRange(edges); + }; /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible + * Remove existing edges. Non existing ids will be ignored + * @param {Number[] | String[]} ids + * @private */ - PointItem.prototype.isVisible = function(range) { - // determine visibility - // TODO: account for the real width of the item. Right now we just add 1/4 to the window - var interval = (range.end - range.start) / 4; - return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); + Network.prototype._removeEdges = function (ids) { + var edges = this.edges; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var edge = edges[id]; + if (edge) { + if (edge.via != null) { + delete this.sectors['support']['nodes'][edge.via.id]; + } + edge.disconnect(); + delete edges[id]; + } + } + + this.moving = true; + this._updateValueRange(edges); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); }; /** - * Repaint the item + * Reconnect all edges + * @private */ - PointItem.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; - - // background box - dom.point = document.createElement('div'); - // className is updated in redraw() - - // contents box, right from the dot - dom.content = document.createElement('div'); - dom.content.className = 'content'; - dom.point.appendChild(dom.content); - - // dot at start - dom.dot = document.createElement('div'); - dom.point.appendChild(dom.dot); - - // attach this item as attribute - dom.point['timeline-item'] = this; - - this.dirty = true; + Network.prototype._reconnectEdges = function() { + var id, + nodes = this.nodes, + edges = this.edges; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].edges = []; + nodes[id].dynamicEdges = []; + } } - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.point.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) { - throw new Error('Cannot redraw item: parent has no foreground container element'); + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.from = null; + edge.to = null; + edge.connect(); } - foreground.appendChild(dom.point); } - this.displayed = true; - - // Update DOM when item is marked dirty. An item is marked dirty when: - // - the item is not yet rendered - // - the item's data is changed - // - the item is selected/deselected - if (this.dirty) { - this._updateContents(this.dom.content); - this._updateTitle(this.dom.point); - this._updateDataAttributes(this.dom.point); - this._updateStyle(this.dom.point); - - // update class - var className = (this.data.className? ' ' + this.data.className : '') + - (this.selected ? ' selected' : ''); - dom.point.className = 'item point' + className; - dom.dot.className = 'item dot' + className; - - // recalculate size - this.width = dom.point.offsetWidth; - this.height = dom.point.offsetHeight; - this.props.dot.width = dom.dot.offsetWidth; - this.props.dot.height = dom.dot.offsetHeight; - this.props.content.height = dom.content.offsetHeight; - - // resize contents - dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; - //dom.content.style.marginRight = ... + 'px'; // TODO: margin right + }; - dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; - dom.dot.style.left = (this.props.dot.width / 2) + 'px'; + /** + * Update the values of all object in the given array according to the current + * value range of the objects in the array. + * @param {Object} obj An object containing a set of Edges or Nodes + * The objects must have a method getValue() and + * setValueRange(min, max). + * @private + */ + Network.prototype._updateValueRange = function(obj) { + var id; - this.dirty = false; + // determine the range of the objects + var valueMin = undefined; + var valueMax = undefined; + for (id in obj) { + if (obj.hasOwnProperty(id)) { + var value = obj[id].getValue(); + if (value !== undefined) { + valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); + valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); + } + } } - this._repaintDeleteButton(dom.point); + // adjust the range of all objects + if (valueMin !== undefined && valueMax !== undefined) { + for (id in obj) { + if (obj.hasOwnProperty(id)) { + obj[id].setValueRange(valueMin, valueMax); + } + } + } }; /** - * Show the item in the DOM (when not already visible). The items DOM will - * be created when needed. + * Redraw the network with the current data + * chart will be resized too. */ - PointItem.prototype.show = function() { - if (!this.displayed) { - this.redraw(); - } + Network.prototype.redraw = function() { + this.setSize(this.constants.width, this.constants.height); + this._redraw(); }; /** - * Hide the item from the DOM (when visible) + * Redraw the network with the current data + * @private */ - PointItem.prototype.hide = function() { - if (this.displayed) { - if (this.dom.point.parentNode) { - this.dom.point.parentNode.removeChild(this.dom.point); - } + Network.prototype._redraw = function() { + var ctx = this.frame.canvas.getContext('2d'); - this.top = null; - this.left = null; + ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); - this.displayed = false; + // clear the canvas + var w = this.frame.canvas.width * this.pixelRatio; + var h = this.frame.canvas.height * this.pixelRatio; + ctx.clearRect(0, 0, w, h); + + // set scaling and translation + ctx.save(); + ctx.translate(this.translation.x, this.translation.y); + ctx.scale(this.scale, this.scale); + + this.canvasTopLeft = { + "x": this._XconvertDOMtoCanvas(0), + "y": this._YconvertDOMtoCanvas(0) + }; + this.canvasBottomRight = { + "x": this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth * this.pixelRatio), + "y": this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight * this.pixelRatio) + }; + + + this._doInAllSectors("_drawAllSectorNodes",ctx); + if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideEdgesOnDrag == false) { + this._doInAllSectors("_drawEdges",ctx); } - }; - /** - * Reposition the item horizontally - * @Override - */ - PointItem.prototype.repositionX = function() { - var start = this.conversion.toScreen(this.data.start); + if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideNodesOnDrag == false) { + this._doInAllSectors("_drawNodes",ctx,false); + } - this.left = start - this.props.dot.width; + if (this.controlNodesActive == true) { + this._doInAllSectors("_drawControlNodes",ctx); + } - // reposition point - this.dom.point.style.left = this.left + 'px'; + // this._doInSupportSector("_drawNodes",ctx,true); + // this._drawTree(ctx,"#F00F0F"); + + // restore original scaling and translation + ctx.restore(); }; /** - * Reposition the item vertically - * @Override + * Set the translation of the network + * @param {Number} offsetX Horizontal offset + * @param {Number} offsetY Vertical offset + * @private */ - PointItem.prototype.repositionY = function() { - var orientation = this.options.orientation, - point = this.dom.point; + Network.prototype._setTranslation = function(offsetX, offsetY) { + if (this.translation === undefined) { + this.translation = { + x: 0, + y: 0 + }; + } - if (orientation == 'top') { - point.style.top = this.top + 'px'; + if (offsetX !== undefined) { + this.translation.x = offsetX; } - else { - point.style.top = (this.parent.height - this.top - this.height) + 'px'; + if (offsetY !== undefined) { + this.translation.y = offsetY; } - }; - - module.exports = PointItem; - - -/***/ }, -/* 34 */ -/***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(19); - var Item = __webpack_require__(30); - var BackgroundGroup = __webpack_require__(31); - var RangeItem = __webpack_require__(29); + this.emit('viewChanged'); + }; /** - * @constructor BackgroundItem - * @extends Item - * @param {Object} data Object containing parameters start, end - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe options + * Get the translation of the network + * @return {Object} translation An object with parameters x and y, both a number + * @private */ - // TODO: implement support for the BackgroundItem just having a start, then being displayed as a sort of an annotation - function BackgroundItem (data, conversion, options) { - this.props = { - content: { - width: 0 - } + Network.prototype._getTranslation = function() { + return { + x: this.translation.x, + y: this.translation.y }; - this.overflow = false; // if contents can overflow (css styling), this flag is set to true - - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data.id); - } - if (data.end == undefined) { - throw new Error('Property "end" missing in item ' + data.id); - } - } + }; - Item.call(this, data, conversion, options); + /** + * Scale the network + * @param {Number} scale Scaling factor 1.0 is unscaled + * @private + */ + Network.prototype._setScale = function(scale) { + this.scale = scale; + }; - this.emptyContent = false; - } + /** + * Get the current scale of the network + * @return {Number} scale Scaling factor 1.0 is unscaled + * @private + */ + Network.prototype._getScale = function() { + return this.scale; + }; - BackgroundItem.prototype = new Item (null, null, null); + /** + * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to + * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) + * @param {number} x + * @returns {number} + * @private + */ + Network.prototype._XconvertDOMtoCanvas = function(x) { + return (x - this.translation.x) / this.scale; + }; - BackgroundItem.prototype.baseClassName = 'item background'; - BackgroundItem.prototype.stack = false; + /** + * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the X coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} x + * @returns {number} + * @private + */ + Network.prototype._XconvertCanvasToDOM = function(x) { + return x * this.scale + this.translation.x; + }; /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible + * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to + * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) + * @param {number} y + * @returns {number} + * @private */ - BackgroundItem.prototype.isVisible = function(range) { - // determine visibility - return (this.data.start < range.end) && (this.data.end > range.start); + Network.prototype._YconvertDOMtoCanvas = function(y) { + return (y - this.translation.y) / this.scale; }; /** - * Repaint the item + * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} y + * @returns {number} + * @private */ - BackgroundItem.prototype.redraw = function() { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; + Network.prototype._YconvertCanvasToDOM = function(y) { + return y * this.scale + this.translation.y ; + }; - // background box - dom.box = document.createElement('div'); - // className is updated in redraw() - // contents box - dom.content = document.createElement('div'); - dom.content.className = 'content'; - dom.box.appendChild(dom.content); + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.canvasToDOM = function (pos) { + return {x: this._XconvertCanvasToDOM(pos.x), y: this._YconvertCanvasToDOM(pos.y)}; + }; - // Note: we do NOT attach this item as attribute to the DOM, - // such that background items cannot be selected - //dom.box['timeline-item'] = this; + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.DOMtoCanvas = function (pos) { + return {x: this._XconvertDOMtoCanvas(pos.x), y: this._YconvertDOMtoCanvas(pos.y)}; + }; - this.dirty = true; + /** + * Redraw all nodes + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @param {Boolean} [alwaysShow] + * @private + */ + Network.prototype._drawNodes = function(ctx,alwaysShow) { + if (alwaysShow === undefined) { + alwaysShow = false; } - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.box.parentNode) { - var background = this.parent.dom.background; - if (!background) { - throw new Error('Cannot redraw item: parent has no background container element'); + // first draw the unselected nodes + var nodes = this.nodes; + var selected = []; + + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); + if (nodes[id].isSelected()) { + selected.push(id); + } + else { + if (nodes[id].inArea() || alwaysShow) { + nodes[id].draw(ctx); + } + } } - background.appendChild(dom.box); } - this.displayed = true; - - // Update DOM when item is marked dirty. An item is marked dirty when: - // - the item is not yet rendered - // - the item's data is changed - // - the item is selected/deselected - if (this.dirty) { - this._updateContents(this.dom.content); - this._updateTitle(this.dom.content); - this._updateDataAttributes(this.dom.content); - this._updateStyle(this.dom.box); - - // update class - var className = (this.data.className ? (' ' + this.data.className) : '') + - (this.selected ? ' selected' : ''); - dom.box.className = this.baseClassName + className; - // determine from css whether this box has overflow - this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; - - // recalculate size - this.props.content.width = this.dom.content.offsetWidth; - this.height = 0; // set height zero, so this item will be ignored when stacking items - - this.dirty = false; + // draw the selected nodes on top + for (var s = 0, sMax = selected.length; s < sMax; s++) { + if (nodes[selected[s]].inArea() || alwaysShow) { + nodes[selected[s]].draw(ctx); + } } }; /** - * Show the item in the DOM (when not already visible). The items DOM will - * be created when needed. + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private */ - BackgroundItem.prototype.show = RangeItem.prototype.show; + Network.prototype._drawEdges = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.setScale(this.scale); + if (edge.connected) { + edges[id].draw(ctx); + } + } + } + }; /** - * Hide the item from the DOM (when visible) - * @return {Boolean} changed + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private */ - BackgroundItem.prototype.hide = RangeItem.prototype.hide; + Network.prototype._drawControlNodes = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + edges[id]._drawControlNodes(ctx); + } + } + }; /** - * Reposition the item horizontally - * @Override + * Find a stable position for all nodes + * @private */ - BackgroundItem.prototype.repositionX = RangeItem.prototype.repositionX; + Network.prototype._stabilize = function() { + if (this.constants.freezeForStabilization == true) { + this._freezeDefinedNodes(); + } + + // find stable position + var count = 0; + while (this.moving && count < this.constants.stabilizationIterations) { + this._physicsTick(); + count++; + } + this.zoomExtent(undefined,false,true); + if (this.constants.freezeForStabilization == true) { + this._restoreFrozenNodes(); + } + }; /** - * Reposition the item vertically - * @Override + * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization + * because only the supportnodes for the smoothCurves have to settle. + * + * @private */ - BackgroundItem.prototype.repositionY = function(margin) { - var onTop = this.options.orientation === 'top'; - this.dom.content.style.top = onTop ? '' : '0'; - this.dom.content.style.bottom = onTop ? '0' : ''; - var height; - - // special positioning for subgroups - if (this.data.subgroup !== undefined) { - var itemSubgroup = this.data.subgroup; - var subgroups = this.parent.subgroups; - var subgroupIndex = subgroups[itemSubgroup].index; - // if the orientation is top, we need to take the difference in height into account. - if (onTop == true) { - // the first subgroup will have to account for the distance from the top to the first item. - height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; - height += subgroupIndex == 0 ? margin.axis - 0.5*margin.item.vertical : 0; - var newTop = this.parent.top; - for (var subgroup in subgroups) { - if (subgroups.hasOwnProperty(subgroup)) { - if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroupIndex) { - newTop += subgroups[subgroup].height + margin.item.vertical; - } - } - } - - // the others will have to be offset downwards with this same distance. - newTop += subgroupIndex != 0 ? margin.axis - 0.5 * margin.item.vertical : 0; - this.dom.box.style.top = newTop + 'px'; - this.dom.box.style.bottom = ''; - } - // and when the orientation is bottom: - else { - var newTop = this.parent.top; - for (var subgroup in subgroups) { - if (subgroups.hasOwnProperty(subgroup)) { - if (subgroups[subgroup].visible == true && subgroups[subgroup].index > subgroupIndex) { - newTop += subgroups[subgroup].height + margin.item.vertical; - } - } + Network.prototype._freezeDefinedNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].x != null && nodes[id].y != null) { + nodes[id].fixedData.x = nodes[id].xFixed; + nodes[id].fixedData.y = nodes[id].yFixed; + nodes[id].xFixed = true; + nodes[id].yFixed = true; } - height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; - this.dom.box.style.top = newTop + 'px'; - this.dom.box.style.bottom = ''; } } - // and in the case of no subgroups: - else { - // we want backgrounds with groups to only show in groups. - if (this.parent instanceof BackgroundGroup) { - // if the item is not in a group: - height = Math.max(this.parent.height, - this.parent.itemSet.body.domProps.center.height, - this.parent.itemSet.body.domProps.centerContainer.height); - this.dom.box.style.top = onTop ? '0' : ''; - this.dom.box.style.bottom = onTop ? '' : '0'; - } - else { - height = this.parent.height; - // same alignment for items when orientation is top or bottom - this.dom.box.style.top = this.parent.top + 'px'; - this.dom.box.style.bottom = ''; + }; + + /** + * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. + * + * @private + */ + Network.prototype._restoreFrozenNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].fixedData.x != null) { + nodes[id].xFixed = nodes[id].fixedData.x; + nodes[id].yFixed = nodes[id].fixedData.y; + } } } - this.dom.box.style.height = height + 'px'; }; - module.exports = BackgroundItem; - -/***/ }, -/* 35 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Check if any of the nodes is still moving + * @param {number} vmin the minimum velocity considered as 'moving' + * @return {boolean} true if moving, false if non of the nodes is moving + * @private + */ + Network.prototype._isMoving = function(vmin) { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { + return true; + } + } + return false; + }; - var keycharm = __webpack_require__(36); - var Emitter = __webpack_require__(11); - var Hammer = __webpack_require__(19); - var util = __webpack_require__(1); /** - * Turn an element into an clickToUse element. - * When not active, the element has a transparent overlay. When the overlay is - * clicked, the mode is changed to active. - * When active, the element is displayed with a blue border around it, and - * the interactive contents of the element can be used. When clicked outside - * the element, the elements mode is changed to inactive. - * @param {Element} container - * @constructor + * /** + * Perform one discrete step for all nodes + * + * @private */ - function Activator(container) { - this.active = false; + Network.prototype._discreteStepNodes = function() { + var interval = this.physicsDiscreteStepsize; + var nodes = this.nodes; + var nodeId; + var nodesPresent = false; - this.dom = { - container: container - }; + if (this.constants.maxVelocity > 0) { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); + nodesPresent = true; + } + } + } + else { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStep(interval); + nodesPresent = true; + } + } + } - this.dom.overlay = document.createElement('div'); - this.dom.overlay.className = 'overlay'; + if (nodesPresent == true) { + var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); + if (vminCorrected > 0.5*this.constants.maxVelocity) { + return true; + } + else { + return this._isMoving(vminCorrected); + } + } + return false; + }; - this.dom.container.appendChild(this.dom.overlay); + /** + * A single simulation step (or "tick") in the physics simulation + * + * @private + */ + Network.prototype._physicsTick = function() { + if (!this.freezeSimulation) { + if (this.moving == true) { + var mainMovingStatus = false; + var supportMovingStatus = false; - this.hammer = Hammer(this.dom.overlay, {prevent_default: false}); - this.hammer.on('tap', this._onTapOverlay.bind(this)); + this._doInAllActiveSectors("_initializeForceCalculation"); + var mainMoving = this._doInAllActiveSectors("_discreteStepNodes"); + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + supportMovingStatus = this._doInSupportSector("_discreteStepNodes"); + } + // gather movement data from all sectors, if one moves, we are NOT stabilzied + for (var i = 0; i < mainMoving.length; i++) {mainMovingStatus = mainMoving[0] || mainMovingStatus;} - // block all touch events (except tap) - var me = this; - var events = [ - 'touch', 'pinch', - 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox - ]; - events.forEach(function (event) { - me.hammer.on(event, function (event) { - event.stopPropagation(); - }); - }); + // determine if the network has stabilzied + this.moving = mainMovingStatus || supportMovingStatus; - // attach a tap event to the window, in order to deactivate when clicking outside the timeline - this.windowHammer = Hammer(window, {prevent_default: false}); - this.windowHammer.on('tap', function (event) { - // deactivate when clicked outside the container - if (!_hasParent(event.target, container)) { - me.deactivate(); + this.stabilizationIterations++; } - }); - - if (this.keycharm !== undefined) { - this.keycharm.destroy(); } - this.keycharm = keycharm(); - - // keycharm listener only bounded when active) - this.escListener = this.deactivate.bind(this); - } - - // turn into an event emitter - Emitter(Activator.prototype); + }; - // The currently active activator - Activator.current = null; /** - * Destroy the activator. Cleans up all created DOM and event listeners + * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. + * It reschedules itself at the beginning of the function + * + * @private */ - Activator.prototype.destroy = function () { - this.deactivate(); + Network.prototype._animationStep = function() { + // reset the timer so a new scheduled animation step can be set + this.timer = undefined; + // handle the keyboad movement + this._handleNavigation(); - // remove dom - this.dom.overlay.parentNode.removeChild(this.dom.overlay); + // this schedules a new animation step + this.start(); - // cleanup hammer instances - this.hammer = null; - this.windowHammer = null; - // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory) + // start the physics simulation + var calculationTime = Date.now(); + var maxSteps = 1; + this._physicsTick(); + var timeRequired = Date.now() - calculationTime; + while (timeRequired < 0.9*(this.renderTimestep - this.renderTime) && maxSteps < this.maxPhysicsTicksPerRender) { + this._physicsTick(); + timeRequired = Date.now() - calculationTime; + maxSteps++; + } + // start the rendering process + var renderTime = Date.now(); + this._redraw(); + this.renderTime = Date.now() - renderTime; }; + if (typeof window !== 'undefined') { + window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + } + /** - * Activate the element - * Overlay is hidden, element is decorated with a blue shadow border + * Schedule a animation step with the refreshrate interval. */ - Activator.prototype.activate = function () { - // we allow only one active activator at a time - if (Activator.current) { - Activator.current.deactivate(); - } - Activator.current = this; + Network.prototype.start = function() { + if (this.moving == true || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { + if (this.startedStabilization == false) { + this.emit("startStabilization"); + this.startedStabilization = true; + } - this.active = true; - this.dom.overlay.style.display = 'none'; - util.addClassName(this.dom.container, 'vis-active'); + if (!this.timer) { + var ua = navigator.userAgent.toLowerCase(); - this.emit('change'); - this.emit('activate'); + var requiresTimeout = false; + if (ua.indexOf('msie 9.0') != -1) { // IE 9 + requiresTimeout = true; + } + else if (ua.indexOf('safari') != -1) { // safari + if (ua.indexOf('chrome') <= -1) { + requiresTimeout = true; + } + } - // ugly hack: bind ESC after emitting the events, as the Network rebinds all - // keyboard events on a 'change' event - this.keycharm.bind('esc', this.escListener); + if (requiresTimeout == true) { + this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + else{ + this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + } + } + else { + this._redraw(); + if (this.stabilizationIterations > 0) { + // trigger the "stabilized" event. + // The event is triggered on the next tick, to prevent the case that + // it is fired while initializing the Network, in which case you would not + // be able to catch it + var me = this; + var params = { + iterations: me.stabilizationIterations + }; + me.stabilizationIterations = 0; + me.startedStabilization = false; + setTimeout(function () { + me.emit("stabilized", params); + }, 0); + } + } }; + /** - * Deactivate the element - * Overlay is displayed on top of the element + * Move the network according to the keyboard presses. + * + * @private */ - Activator.prototype.deactivate = function () { - this.active = false; - this.dom.overlay.style.display = ''; - util.removeClassName(this.dom.container, 'vis-active'); - this.keycharm.unbind('esc', this.escListener); - - this.emit('change'); - this.emit('deactivate'); + Network.prototype._handleNavigation = function() { + if (this.xIncrement != 0 || this.yIncrement != 0) { + var translation = this._getTranslation(); + this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); + } + if (this.zoomIncrement != 0) { + var center = { + x: this.frame.canvas.clientWidth / 2, + y: this.frame.canvas.clientHeight / 2 + }; + this._zoom(this.scale*(1 + this.zoomIncrement), center); + } }; + /** - * Handle a tap event: activate the container - * @param event - * @private + * Freeze the _animationStep */ - Activator.prototype._onTapOverlay = function (event) { - // activate the container - this.activate(); - event.stopPropagation(); + Network.prototype.toggleFreeze = function() { + if (this.freezeSimulation == false) { + this.freezeSimulation = true; + } + else { + this.freezeSimulation = false; + this.start(); + } }; + /** - * Test whether the element has the requested parent element somewhere in - * its chain of parent nodes. - * @param {HTMLElement} element - * @param {HTMLElement} parent - * @returns {boolean} Returns true when the parent is found somewhere in the - * chain of parent nodes. + * This function cleans the support nodes if they are not needed and adds them when they are. + * + * @param {boolean} [disableStart] * @private */ - function _hasParent(element, parent) { - while (element) { - if (element === parent) { - return true + Network.prototype._configureSmoothCurves = function(disableStart) { + if (disableStart === undefined) { + disableStart = true; + } + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._createBezierNodes(); + // cleanup unused support nodes + for (var nodeId in this.sectors['support']['nodes']) { + if (this.sectors['support']['nodes'].hasOwnProperty(nodeId)) { + if (this.edges[this.sectors['support']['nodes'][nodeId].parentEdgeId] === undefined) { + delete this.sectors['support']['nodes'][nodeId]; + } + } } - element = element.parentNode; } - return false; - } - - module.exports = Activator; - - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** - * Created by Alex on 11/6/2014. - */ - - // https://github.com/umdjs/umd/blob/master/returnExports.js#L40-L60 - // if the module has no dependencies, the above pattern can be simplified to - (function (root, factory) { - if (true) { - // AMD. Register as an anonymous module. - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals (root is window) - root.keycharm = factory(); + else { + // delete the support nodes + this.sectors['support']['nodes'] = {}; + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.edges[edgeId].via = null; + } + } } - }(this, function () { - - function keycharm(options) { - var preventDefault = options && options.preventDefault || false; - - var _bound = {keydown:{}, keyup:{}}; - var _keys = {}; - var i; - - // a - z - for (i = 97; i <= 122; i++) {_keys[String.fromCharCode(i)] = {code:65 + (i - 97), shift: false};} - // A - Z - for (i = 65; i <= 90; i++) {_keys[String.fromCharCode(i)] = {code:i, shift: true};} - // 0 - 9 - for (i = 0; i <= 9; i++) {_keys['' + i] = {code:48 + i, shift: false};} - // F1 - F12 - for (i = 1; i <= 12; i++) {_keys['F' + i] = {code:111 + i, shift: false};} - // num0 - num9 - for (i = 0; i <= 9; i++) {_keys['num' + i] = {code:96 + i, shift: false};} - - // numpad misc - _keys['num*'] = {code:106, shift: false}; - _keys['num+'] = {code:107, shift: false}; - _keys['num-'] = {code:109, shift: false}; - _keys['num/'] = {code:111, shift: false}; - _keys['num.'] = {code:110, shift: false}; - // arrows - _keys['left'] = {code:37, shift: false}; - _keys['up'] = {code:38, shift: false}; - _keys['right'] = {code:39, shift: false}; - _keys['down'] = {code:40, shift: false}; - // extra keys - _keys['space'] = {code:32, shift: false}; - _keys['enter'] = {code:13, shift: false}; - _keys['shift'] = {code:16, shift: undefined}; - _keys['esc'] = {code:27, shift: false}; - _keys['backspace'] = {code:8, shift: false}; - _keys['tab'] = {code:9, shift: false}; - _keys['ctrl'] = {code:17, shift: false}; - _keys['alt'] = {code:18, shift: false}; - _keys['delete'] = {code:46, shift: false}; - _keys['pageup'] = {code:33, shift: false}; - _keys['pagedown'] = {code:34, shift: false}; - // symbols - _keys['='] = {code:187, shift: false}; - _keys['-'] = {code:189, shift: false}; - _keys[']'] = {code:221, shift: false}; - _keys['['] = {code:219, shift: false}; + this._updateCalculationNodes(); + if (!disableStart) { + this.moving = true; + this.start(); + } + }; - var down = function(event) {handleEvent(event,'keydown');}; - var up = function(event) {handleEvent(event,'keyup');}; - - // handle the actualy bound key with the event - var handleEvent = function(event,type) { - if (_bound[type][event.keyCode] !== undefined) { - var bound = _bound[type][event.keyCode]; - for (var i = 0; i < bound.length; i++) { - if (bound[i].shift === undefined) { - bound[i].fn(event); - } - else if (bound[i].shift == true && event.shiftKey == true) { - bound[i].fn(event); - } - else if (bound[i].shift == false && event.shiftKey == false) { - bound[i].fn(event); - } - } - if (preventDefault == true) { - event.preventDefault(); + /** + * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but + * are used for the force calculation. + * + * @private + */ + Network.prototype._createBezierNodes = function() { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.via == null) { + var nodeId = "edgeId:".concat(edge.id); + this.sectors['support']['nodes'][nodeId] = new Node( + {id:nodeId, + mass:1, + shape:'circle', + image:"", + internalMultiplier:1 + },{},{},this.constants); + edge.via = this.sectors['support']['nodes'][nodeId]; + edge.via.parentEdgeId = edge.id; + edge.positionBezierNode(); } } - }; + } + } + }; - // bind a key to a callback - this.bind = function(key, callback, type) { - if (type === undefined) { - type = 'keydown'; - } - if (_keys[key] === undefined) { - throw new Error("unsupported key: " + key); - } - if (_bound[type][_keys[key].code] === undefined) { - _bound[type][_keys[key].code] = []; - } - _bound[type][_keys[key].code].push({fn:callback, shift:_keys[key].shift}); - }; + /** + * load the functions that load the mixins into the prototype. + * + * @private + */ + Network.prototype._initializeMixinLoaders = function () { + for (var mixin in MixinLoader) { + if (MixinLoader.hasOwnProperty(mixin)) { + Network.prototype[mixin] = MixinLoader[mixin]; + } + } + }; + /** + * Load the XY positions of the nodes into the dataset. + */ + Network.prototype.storePosition = function() { + console.log("storePosition is depricated: use .storePositions() from now on.") + this.storePositions(); + }; - // bind all keys to a call back (demo purposes) - this.bindAll = function(callback, type) { - if (type === undefined) { - type = 'keydown'; - } - for (key in _keys) { - if (_keys.hasOwnProperty(key)) { - this.bind(key,callback,type); - } + /** + * Load the XY positions of the nodes into the dataset. + */ + Network.prototype.storePositions = function() { + var dataArray = []; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + var allowedToMoveX = !this.nodes.xFixed; + var allowedToMoveY = !this.nodes.yFixed; + if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { + dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); } } + } + this.nodesData.update(dataArray); + }; - // get the key label from an event - this.getKey = function(event) { - for (key in _keys) { - if (_keys.hasOwnProperty(key)) { - if (event.shiftKey == true && _keys[key].shift == true && event.keyCode == _keys[key].code) { - return key; - } - else if (event.shiftKey == false && _keys[key].shift == false && event.keyCode == _keys[key].code) { - return key; - } - else if (event.keyCode == _keys[key].code && key == 'shift') { - return key; - } + /** + * Return the positions of the nodes. + */ + Network.prototype.getPositions = function(ids) { + var dataArray = {}; + if (ids !== undefined) { + if (Array.isArray(ids) == true) { + for (var i = 0; i < ids.length; i++) { + if (this.nodes[ids[i]] !== undefined) { + var node = this.nodes[ids[i]]; + dataArray[ids[i]] = {x: Math.round(node.x), y: Math.round(node.y)}; } } - return "unknown key, currently not supported"; - }; - - // unbind either a specific callback from a key or all of them (by leaving callback undefined) - this.unbind = function(key, callback, type) { - if (type === undefined) { - type = 'keydown'; - } - if (_keys[key] === undefined) { - throw new Error("unsupported key: " + key); - } - if (callback !== undefined) { - var newBindings = []; - var bound = _bound[type][_keys[key].code] - for (var i = 0; i < bound.length; i++) { - if (!(bound[i].fn == callback && bound[i].shift == _keys[key].shift)) { - newBindings.push(_bound[type][_keys[key].code][i]); - } - } - _bound[type][_keys[key].code] = newBindings; + } + else { + if (this.nodes[ids] !== undefined) { + var node = this.nodes[ids]; + dataArray[ids] = {x: Math.round(node.x), y: Math.round(node.y)}; } - else { - _bound[type][_keys[key].code] = []; + } + } + else { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + dataArray[nodeId] = {x: Math.round(node.x), y: Math.round(node.y)}; } - }; + } + } + return dataArray; + }; - // reset all bound variables. - this.reset = function() { - _bound = {keydown:{}, keyup:{}}; - }; - // unbind all listeners and reset all variables. - this.destroy = function() { - _bound = {keydown:{}, keyup:{}}; - window.removeEventListener('keydown', down, true); - window.removeEventListener('keyup', up, true); - }; - // create listeners. - window.addEventListener('keydown',down,true); - window.addEventListener('keyup',up,true); + /** + * Center a node in view. + * + * @param {Number} nodeId + * @param {Number} [options] + */ + Network.prototype.focusOnNode = function (nodeId, options) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (options === undefined) { + options = {}; + } + var nodePosition = {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; + options.position = nodePosition; + options.lockedOnNode = nodeId; - // return the public functions. - return this; + this.moveTo(options) + } + else { + console.log("This nodeId cannot be found."); } + }; - return keycharm; - })); + /** + * + * @param {Object} options | options.offset = {x:Number, y:Number} // offset from the center in DOM pixels + * | options.scale = Number // scale to move to + * | options.position = {x:Number, y:Number} // position to move to + * | options.animation = {duration:Number, easingFunction:String} || Boolean // position to move to + */ + Network.prototype.moveTo = function (options) { + if (options === undefined) { + options = {}; + return; + } + if (options.offset === undefined) {options.offset = {x: 0, y: 0}; } + if (options.offset.x === undefined) {options.offset.x = 0; } + if (options.offset.y === undefined) {options.offset.y = 0; } + if (options.scale === undefined) {options.scale = this._getScale(); } + if (options.position === undefined) {options.position = this._getTranslation();} + if (options.animation === undefined) {options.animation = {duration:0}; } + if (options.animation === false ) {options.animation = {duration:0}; } + if (options.animation === true ) {options.animation = {}; } + if (options.animation.duration === undefined) {options.animation.duration = 1000; } // default duration + if (options.animation.easingFunction === undefined) {options.animation.easingFunction = "easeInOutQuad"; } // default easing function + this.animateView(options); + }; + /** + * + * @param {Object} options | options.offset = {x:Number, y:Number} // offset from the center in DOM pixels + * | options.time = Number // animation time in milliseconds + * | options.scale = Number // scale to animate to + * | options.position = {x:Number, y:Number} // position to animate to + * | options.easingFunction = String // linear, easeInQuad, easeOutQuad, easeInOutQuad, + * // easeInCubic, easeOutCubic, easeInOutCubic, + * // easeInQuart, easeOutQuart, easeInOutQuart, + * // easeInQuint, easeOutQuint, easeInOutQuint + */ + Network.prototype.animateView = function (options) { + if (options === undefined) { + options = {}; + return; + } + // release if something focussed on the node + this.releaseNode(); + if (options.locked == true) { + this.lockedOnNodeId = options.lockedOnNode; + this.lockedOnNodeOffset = options.offset; + } -/***/ }, -/* 37 */ -/***/ function(module, exports, __webpack_require__) { + // forcefully complete the old animation if it was still running + if (this.easingTime != 0) { + this._transitionRedraw(1); // by setting easingtime to 1, we finish the animation. + } - var util = __webpack_require__(1); - var Component = __webpack_require__(23); - var TimeStep = __webpack_require__(38); - var DateUtil = __webpack_require__(24); - var moment = __webpack_require__(2); + this.sourceScale = this._getScale(); + this.sourceTranslation = this._getTranslation(); + this.targetScale = options.scale; - /** - * A horizontal time axis - * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body - * @param {Object} [options] See TimeAxis.setOptions for the available - * options. - * @constructor TimeAxis - * @extends Component - */ - function TimeAxis (body, options) { - this.dom = { - foreground: null, - majorLines: [], - majorTexts: [], - minorLines: [], - minorTexts: [], - redundant: { - majorLines: [], - majorTexts: [], - minorLines: [], - minorTexts: [] - } + // set the scale so the viewCenter is based on the correct zoom level. This is overridden in the transitionRedraw + // but at least then we'll have the target transition + this._setScale(this.targetScale); + var viewCenter = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); + var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + x: viewCenter.x - options.position.x, + y: viewCenter.y - options.position.y }; - this.props = { - range: { - start: 0, - end: 0, - minimumStep: 0 - }, - lineTop: 0 + this.targetTranslation = { + x: this.sourceTranslation.x + distanceFromCenter.x * this.targetScale + options.offset.x, + y: this.sourceTranslation.y + distanceFromCenter.y * this.targetScale + options.offset.y }; - this.defaultOptions = { - orientation: 'bottom', // supported: 'top', 'bottom' - // TODO: implement timeaxis orientations 'left' and 'right' - showMinorLabels: true, - showMajorLabels: true - }; - this.options = util.extend({}, this.defaultOptions); + // if the time is set to 0, don't do an animation + if (options.animation.duration == 0) { + if (this.lockedOnNodeId != null) { + this._classicRedraw = this._redraw; + this._redraw = this._lockedRedraw; + } + else { + this._setScale(this.targetScale); + this._setTranslation(this.targetTranslation.x, this.targetTranslation.y); + this._redraw(); + } + } + else { + this.animationSpeed = 1 / (this.renderRefreshRate * options.animation.duration * 0.001) || 1 / this.renderRefreshRate; + this.animationEasingFunction = options.animation.easingFunction; + this._classicRedraw = this._redraw; + this._redraw = this._transitionRedraw; + this._redraw(); + this.moving = true; + this.start(); + } + }; - this.body = body; - // create the HTML DOM - this._create(); + Network.prototype._lockedRedraw = function () { + var nodePosition = {x: this.nodes[this.lockedOnNodeId].x, y: this.nodes[this.lockedOnNodeId].y}; + var viewCenter = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); + var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + x: viewCenter.x - nodePosition.x, + y: viewCenter.y - nodePosition.y + }; + var sourceTranslation = this._getTranslation(); + var targetTranslation = { + x: sourceTranslation.x + distanceFromCenter.x * this.scale + this.lockedOnNodeOffset.x, + y: sourceTranslation.y + distanceFromCenter.y * this.scale + this.lockedOnNodeOffset.y + }; - this.setOptions(options); + this._setTranslation(targetTranslation.x,targetTranslation.y); + this._classicRedraw(); } - TimeAxis.prototype = new Component(); + Network.prototype.releaseNode = function () { + if (this.lockedOnNodeId != null) { + this._redraw = this._classicRedraw; + this.lockedOnNodeId = null; + this.lockedOnNodeOffset = null; + } + } /** - * Set options for the TimeAxis. - * Parameters will be merged in current options. - * @param {Object} options Available options: - * {string} [orientation] - * {boolean} [showMinorLabels] - * {boolean} [showMajorLabels] + * + * @param easingTime + * @private */ - TimeAxis.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['orientation', 'showMinorLabels', 'showMajorLabels','hiddenDates'], this.options, options); + Network.prototype._transitionRedraw = function (easingTime) { + this.easingTime = easingTime || this.easingTime + this.animationSpeed; + this.easingTime += this.animationSpeed; - // apply locale to moment.js - // TODO: not so nice, this is applied globally to moment.js - if ('locale' in options) { - if (typeof moment.locale === 'function') { - // moment.js 2.8.1+ - moment.locale(options.locale); - } - else { - moment.lang(options.locale); - } + var progress = util.easingFunctions[this.animationEasingFunction](this.easingTime); + + this._setScale(this.sourceScale + (this.targetScale - this.sourceScale) * progress); + this._setTranslation( + this.sourceTranslation.x + (this.targetTranslation.x - this.sourceTranslation.x) * progress, + this.sourceTranslation.y + (this.targetTranslation.y - this.sourceTranslation.y) * progress + ); + + this._classicRedraw(); + this.moving = true; + + // cleanup + if (this.easingTime >= 1.0) { + this.easingTime = 0; + if (this.lockedOnNodeId != null) { + this._redraw = this._lockedRedraw; } + else { + this._redraw = this._classicRedraw; + } + this.emit("animationFinished"); } }; - /** - * Create the HTML DOM for the TimeAxis - */ - TimeAxis.prototype._create = function() { - this.dom.foreground = document.createElement('div'); - this.dom.background = document.createElement('div'); - - this.dom.foreground.className = 'timeaxis foreground'; - this.dom.background.className = 'timeaxis background'; + Network.prototype._classicRedraw = function () { + // placeholder function to be overloaded by animations; }; /** - * Destroy the TimeAxis + * Returns true when the Network is active. + * @returns {boolean} */ - TimeAxis.prototype.destroy = function() { - // remove from DOM - if (this.dom.foreground.parentNode) { - this.dom.foreground.parentNode.removeChild(this.dom.foreground); - } - if (this.dom.background.parentNode) { - this.dom.background.parentNode.removeChild(this.dom.background); - } - - this.body = null; + Network.prototype.isActive = function () { + return !this.activator || this.activator.active; }; + /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Sets the scale + * @returns {Number} */ - TimeAxis.prototype.redraw = function () { - var options = this.options; - var props = this.props; - var foreground = this.dom.foreground; - var background = this.dom.background; - - // determine the correct parent DOM element (depending on option orientation) - var parent = (options.orientation == 'top') ? this.body.dom.top : this.body.dom.bottom; - var parentChanged = (foreground.parentNode !== parent); - - // calculate character width and height - this._calculateCharSize(); + Network.prototype.setScale = function () { + return this._setScale(); + }; - // TODO: recalculate sizes only needed when parent is resized or options is changed - var orientation = this.options.orientation, - showMinorLabels = this.options.showMinorLabels, - showMajorLabels = this.options.showMajorLabels; - // determine the width and height of the elemens for the axis - props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; - props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; - props.height = props.minorLabelHeight + props.majorLabelHeight; - props.width = foreground.offsetWidth; + /** + * Returns the scale + * @returns {Number} + */ + Network.prototype.getScale = function () { + return this._getScale(); + }; - props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - - (options.orientation == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); - props.minorLineWidth = 1; // TODO: really calculate width - props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; - props.majorLineWidth = 1; // TODO: really calculate width - // take foreground and background offline while updating (is almost twice as fast) - var foregroundNextSibling = foreground.nextSibling; - var backgroundNextSibling = background.nextSibling; - foreground.parentNode && foreground.parentNode.removeChild(foreground); - background.parentNode && background.parentNode.removeChild(background); + /** + * Returns the scale + * @returns {Number} + */ + Network.prototype.getCenterCoordinates = function () { + return this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); + }; - foreground.style.height = this.props.height + 'px'; + module.exports = Network; - this._repaintLabels(); - // put DOM online again (at the same place) - if (foregroundNextSibling) { - parent.insertBefore(foreground, foregroundNextSibling); - } - else { - parent.appendChild(foreground) - } - if (backgroundNextSibling) { - this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); - } - else { - this.body.dom.backgroundVertical.appendChild(background) - } +/***/ }, +/* 37 */ +/***/ function(module, exports, __webpack_require__) { - return this._isResized() || parentChanged; - }; + var util = __webpack_require__(1); + var Node = __webpack_require__(40); /** - * Repaint major and minor text labels and vertical grid lines - * @private + * @class Edge + * + * A edge connects two nodes + * @param {Object} properties Object with properties. Must contain + * At least properties from and to. + * Available properties: from (number), + * to (number), label (string, color (string), + * width (number), style (string), + * length (number), title (string) + * @param {Network} network A Network object, used to find and edge to + * nodes. + * @param {Object} constants An object with default values for + * example for the color */ - TimeAxis.prototype._repaintLabels = function () { - var orientation = this.options.orientation; + function Edge (properties, network, networkConstants) { + if (!network) { + throw "No network provided"; + } + var fields = ['edges','physics']; + var constants = util.selectiveBridgeObject(fields,networkConstants); + this.options = constants.edges; + this.physics = constants.physics; + this.options['smoothCurves'] = networkConstants['smoothCurves']; - // calculate range and step (step such that we have space for 7 characters per label) - var start = util.convert(this.body.range.start, 'Number'); - var end = util.convert(this.body.range.end, 'Number'); - var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf(); - var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this.body.range, timeLabelsize); - minimumStep -= this.body.util.toTime(0).valueOf(); + this.network = network; - var step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates); - this.step = step; + // initialize variables + this.id = undefined; + this.fromId = undefined; + this.toId = undefined; + this.title = undefined; + this.widthSelected = this.options.width * this.options.widthSelectionMultiplier; + this.value = undefined; + this.selected = false; + this.hover = false; + this.labelDimensions = {top:0,left:0,width:0,height:0,yLine:0}; // could be cached + this.dirtyLabel = true; - // Move all DOM elements to a "redundant" list, where they - // can be picked for re-use, and clear the lists with lines and texts. - // At the end of the function _repaintLabels, left over elements will be cleaned up - var dom = this.dom; - dom.redundant.majorLines = dom.majorLines; - dom.redundant.majorTexts = dom.majorTexts; - dom.redundant.minorLines = dom.minorLines; - dom.redundant.minorTexts = dom.minorTexts; - dom.majorLines = []; - dom.majorTexts = []; - dom.minorLines = []; - dom.minorTexts = []; + this.from = null; // a node + this.to = null; // a node + this.via = null; // a temp node - step.first(); - var xFirstMajorLabel = undefined; - var max = 0; - while (step.hasNext() && max < 1000) { - max++; - var cur = step.getCurrent(); - var x = this.body.util.toScreen(cur); - var isMajor = step.isMajor(); + // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster + // by storing the original information we can revert to the original connection when the cluser is opened. + this.originalFromId = []; + this.originalToId = []; + this.connected = false; - // TODO: lines must have a width, such that we can create css backgrounds + this.widthFixed = false; + this.lengthFixed = false; - if (this.options.showMinorLabels) { - this._repaintMinorText(x, step.getLabelMinor(), orientation); - } + this.setProperties(properties); - if (isMajor && this.options.showMajorLabels) { - if (x > 0) { - if (xFirstMajorLabel == undefined) { - xFirstMajorLabel = x; - } - this._repaintMajorText(x, step.getLabelMajor(), orientation); - } - this._repaintMajorLine(x, orientation); - } - else { - this._repaintMinorLine(x, orientation); - } + this.controlNodesEnabled = false; + this.controlNodes = {from:null, to:null, positions:{}}; + this.connectedNode = null; + } - step.next(); + /** + * Set or overwrite properties for the edge + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties + */ + Edge.prototype.setProperties = function(properties) { + if (!properties) { + return; } - // create a major label on the left when needed - if (this.options.showMajorLabels) { - var leftTime = this.body.util.toTime(0), - leftText = step.getLabelMajor(leftTime), - widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation + var fields = ['style','fontSize','fontFace','fontColor','fontFill','width', + 'widthSelectionMultiplier','hoverWidth','arrowScaleFactor','dash','inheritColor' + ]; + util.selectiveDeepExtend(fields, this.options, properties); - if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) { - this._repaintMajorText(0, leftText, orientation); - } - } + if (properties.from !== undefined) {this.fromId = properties.from;} + if (properties.to !== undefined) {this.toId = properties.to;} - // Cleanup leftover DOM elements from the redundant list - util.forEach(this.dom.redundant, function (arr) { - while (arr.length) { - var elem = arr.pop(); - if (elem && elem.parentNode) { - elem.parentNode.removeChild(elem); - } - } - }); - }; + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.dirtyLabel = true;} - /** - * Create a minor label for the axis at position x - * @param {Number} x - * @param {String} text - * @param {String} orientation "top" or "bottom" (default) - * @private - */ - TimeAxis.prototype._repaintMinorText = function (x, text, orientation) { - // reuse redundant label - var label = this.dom.redundant.minorTexts.shift(); + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.length !== undefined) {this.physics.springLength = properties.length;} - if (!label) { - // create new label - var content = document.createTextNode(''); - label = document.createElement('div'); - label.appendChild(content); - label.className = 'text minor'; - this.dom.foreground.appendChild(label); + if (properties.color !== undefined) { + this.options.inheritColor = false; + if (util.isString(properties.color)) { + this.options.color.color = properties.color; + this.options.color.highlight = properties.color; + } + else { + if (properties.color.color !== undefined) {this.options.color.color = properties.color.color;} + if (properties.color.highlight !== undefined) {this.options.color.highlight = properties.color.highlight;} + if (properties.color.hover !== undefined) {this.options.color.hover = properties.color.hover;} + } } - this.dom.minorTexts.push(label); - - label.childNodes[0].nodeValue = text; - - label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0'; - label.style.left = x + 'px'; - //label.title = title; // TODO: this is a heavy operation - }; - /** - * Create a Major label for the axis at position x - * @param {Number} x - * @param {String} text - * @param {String} orientation "top" or "bottom" (default) - * @private - */ - TimeAxis.prototype._repaintMajorText = function (x, text, orientation) { - // reuse redundant label - var label = this.dom.redundant.majorTexts.shift(); + // A node is connected when it has a from and to node. + this.connect(); - if (!label) { - // create label - var content = document.createTextNode(text); - label = document.createElement('div'); - label.className = 'text major'; - label.appendChild(content); - this.dom.foreground.appendChild(label); - } - this.dom.majorTexts.push(label); + this.widthFixed = this.widthFixed || (properties.width !== undefined); + this.lengthFixed = this.lengthFixed || (properties.length !== undefined); - label.childNodes[0].nodeValue = text; - //label.title = title; // TODO: this is a heavy operation + this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; - label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight + 'px'); - label.style.left = x + 'px'; + // set draw method based on style + switch (this.options.style) { + case 'line': this.draw = this._drawLine; break; + case 'arrow': this.draw = this._drawArrow; break; + case 'arrow-center': this.draw = this._drawArrowCenter; break; + case 'dash-line': this.draw = this._drawDashLine; break; + default: this.draw = this._drawLine; break; + } }; /** - * Create a minor line for the axis at position x - * @param {Number} x - * @param {String} orientation "top" or "bottom" (default) - * @private + * Connect an edge to its nodes */ - TimeAxis.prototype._repaintMinorLine = function (x, orientation) { - // reuse redundant line - var line = this.dom.redundant.minorLines.shift(); + Edge.prototype.connect = function () { + this.disconnect(); - if (!line) { - // create vertical line - line = document.createElement('div'); - line.className = 'grid vertical minor'; - this.dom.background.appendChild(line); - } - this.dom.minorLines.push(line); + this.from = this.network.nodes[this.fromId] || null; + this.to = this.network.nodes[this.toId] || null; + this.connected = (this.from && this.to); - var props = this.props; - if (orientation == 'top') { - line.style.top = props.majorLabelHeight + 'px'; + if (this.connected) { + this.from.attachEdge(this); + this.to.attachEdge(this); } else { - line.style.top = this.body.domProps.top.height + 'px'; + if (this.from) { + this.from.detachEdge(this); + } + if (this.to) { + this.to.detachEdge(this); + } } - line.style.height = props.minorLineHeight + 'px'; - line.style.left = (x - props.minorLineWidth / 2) + 'px'; }; /** - * Create a Major line for the axis at position x - * @param {Number} x - * @param {String} orientation "top" or "bottom" (default) - * @private + * Disconnect an edge from its nodes */ - TimeAxis.prototype._repaintMajorLine = function (x, orientation) { - // reuse redundant line - var line = this.dom.redundant.majorLines.shift(); - - if (!line) { - // create vertical line - line = document.createElement('DIV'); - line.className = 'grid vertical major'; - this.dom.background.appendChild(line); - } - this.dom.majorLines.push(line); - - var props = this.props; - if (orientation == 'top') { - line.style.top = '0'; + Edge.prototype.disconnect = function () { + if (this.from) { + this.from.detachEdge(this); + this.from = null; } - else { - line.style.top = this.body.domProps.top.height + 'px'; + if (this.to) { + this.to.detachEdge(this); + this.to = null; } - line.style.left = (x - props.majorLineWidth / 2) + 'px'; - line.style.height = props.majorLineHeight + 'px'; + + this.connected = false; }; /** - * Determine the size of text on the axis (both major and minor axis). - * The size is calculated only once and then cached in this.props. - * @private + * get the title of this edge. + * @return {string} title The title of the edge, or undefined when no title + * has been set. */ - TimeAxis.prototype._calculateCharSize = function () { - // Note: We calculate char size with every redraw. Size may change, for - // example when any of the timelines parents had display:none for example. - - // determine the char width and height on the minor axis - if (!this.dom.measureCharMinor) { - this.dom.measureCharMinor = document.createElement('DIV'); - this.dom.measureCharMinor.className = 'text minor measure'; - this.dom.measureCharMinor.style.position = 'absolute'; + Edge.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; + }; - this.dom.measureCharMinor.appendChild(document.createTextNode('0')); - this.dom.foreground.appendChild(this.dom.measureCharMinor); - } - this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; - this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; - // determine the char width and height on the major axis - if (!this.dom.measureCharMajor) { - this.dom.measureCharMajor = document.createElement('DIV'); - this.dom.measureCharMajor.className = 'text major measure'; - this.dom.measureCharMajor.style.position = 'absolute'; + /** + * Retrieve the value of the edge. Can be undefined + * @return {Number} value + */ + Edge.prototype.getValue = function() { + return this.value; + }; - this.dom.measureCharMajor.appendChild(document.createTextNode('0')); - this.dom.foreground.appendChild(this.dom.measureCharMajor); + /** + * Adjust the value range of the edge. The edge will adjust it's width + * based on its value. + * @param {Number} min + * @param {Number} max + */ + Edge.prototype.setValueRange = function(min, max) { + if (!this.widthFixed && this.value !== undefined) { + var scale = (this.options.widthMax - this.options.widthMin) / (max - min); + this.options.width= (this.value - min) * scale + this.options.widthMin; + this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; } - this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; - this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; }; /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * Redraw a edge + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx */ - TimeAxis.prototype.snap = function(date) { - return this.step.snap(date); + Edge.prototype.draw = function(ctx) { + throw "Method draw not initialized in edge"; }; - module.exports = TimeAxis; + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top + * @return {boolean} True if location is located on the edge + */ + Edge.prototype.isOverlappingWith = function(obj) { + if (this.connected) { + var distMax = 10; + var xFrom = this.from.x; + var yFrom = this.from.y; + var xTo = this.to.x; + var yTo = this.to.y; + var xObj = obj.left; + var yObj = obj.top; + var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { + return (dist < distMax); + } + else { + return false + } + }; + + Edge.prototype._getColor = function() { + var colorObj = this.options.color; + if (this.options.inheritColor == "to") { + colorObj = { + highlight: this.to.options.color.highlight.border, + hover: this.to.options.color.hover.border, + color: this.to.options.color.border + }; + } + else if (this.options.inheritColor == "from" || this.options.inheritColor == true) { + colorObj = { + highlight: this.from.options.color.highlight.border, + hover: this.from.options.color.hover.border, + color: this.from.options.color.border + }; + } + + if (this.selected == true) {return colorObj.highlight;} + else if (this.hover == true) {return colorObj.hover;} + else {return colorObj.color;} + }; - var moment = __webpack_require__(2); - var DateUtil = __webpack_require__(24); /** - * @constructor TimeStep - * The class TimeStep is an iterator for dates. You provide a start date and an - * end date. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * Redraw a edge as a line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - function TimeStep(start, end, minimumStep, hiddenDates) { - // variables - this.current = new Date(); - this._start = new Date(); - this._end = new Date(); - - this.autoScale = true; - this.scale = TimeStep.SCALE.DAY; - this.step = 1; + Edge.prototype._drawLine = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(); + ctx.lineWidth = this._getLineWidth(); - // initialize the range - this.setRange(start, end, minimumStep); + if (this.from != this.to) { + // draw line + var via = this._line(ctx); - // hidden Dates options - this.switchedDay = false; - this.switchedMonth = false; - this.switchedYear = false; - this.hiddenDates = hiddenDates; - if (hiddenDates === undefined) { - this.hiddenDates = []; + // draw label + var point; + if (this.label) { + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + } + else { + var x, y; + var radius = this.physics.springLength / 4; + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width / 2; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height / 2; + } + this._circle(ctx, x, y, radius); + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); } - } - - /// enum scale - TimeStep.SCALE = { - MILLISECOND: 1, - SECOND: 2, - MINUTE: 3, - HOUR: 4, - DAY: 5, - WEEKDAY: 6, - MONTH: 7, - YEAR: 8 }; - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Date} [start] The start date and time. - * @param {Date} [end] The end date and time. - * @param {int} [minimumStep] Optional. Minimum step size in milliseconds + * Get the line width of the edge. Depends on width and whether one of the + * connected nodes is selected. + * @return {Number} width + * @private */ - TimeStep.prototype.setRange = function(start, end, minimumStep) { - if (!(start instanceof Date) || !(end instanceof Date)) { - throw "No legal start or end date in method setRange"; + Edge.prototype._getLineWidth = function() { + if (this.selected == true) { + return Math.max(Math.min(this.widthSelected, this.options.widthMax), 0.3*this.networkScaleInv); + } + else { + if (this.hover == true) { + return Math.max(Math.min(this.options.hoverWidth, this.options.widthMax), 0.3*this.networkScaleInv); + } + else { + return Math.max(this.options.width, 0.3*this.networkScaleInv); + } } + }; - this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); - this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); + Edge.prototype._getViaCoordinates = function () { + var xVia = null; + var yVia = null; + var factor = this.options.smoothCurves.roundness; + var type = this.options.smoothCurves.type; - if (this.autoScale) { - this.setMinimumStep(minimumStep); + var dx = Math.abs(this.from.x - this.to.x); + var dy = Math.abs(this.from.y - this.to.y); + if (type == 'discrete' || type == 'diagonalCross') { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + } + } + if (type == "discrete") { + xVia = dx < factor * dy ? this.from.x : xVia; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + } + } + if (type == "discrete") { + yVia = dy < factor * dx ? this.from.y : yVia; + } + } + } + else if (type == "straightCross") { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { // up - down + xVia = this.from.x; + if (this.from.y < this.to.y) { + yVia = this.to.y - (1-factor) * dy; + } + else { + yVia = this.to.y + (1-factor) * dy; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { // left - right + if (this.from.x < this.to.x) { + xVia = this.to.x - (1-factor) * dx; + } + else { + xVia = this.to.x + (1-factor) * dx; + } + yVia = this.from.y; + } + } + else if (type == 'horizontal') { + if (this.from.x < this.to.x) { + xVia = this.to.x - (1-factor) * dx; + } + else { + xVia = this.to.x + (1-factor) * dx; + } + yVia = this.from.y; + } + else if (type == 'vertical') { + xVia = this.from.x; + if (this.from.y < this.to.y) { + yVia = this.to.y - (1-factor) * dy; + } + else { + yVia = this.to.y + (1-factor) * dy; + } + } + else { // continuous + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + // console.log(1) + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; + } + else if (this.from.x > this.to.x) { + // console.log(2) + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x > xVia ? this.to.x :xVia; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + // console.log(3) + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; + } + else if (this.from.x > this.to.x) { + // console.log(4, this.from.x, this.to.x) + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x > xVia ? this.to.x : xVia; + } + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + // console.log(5) + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; + } + else if (this.from.x > this.to.x) { + // console.log(6) + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + // console.log(7) + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; + } + else if (this.from.x > this.to.x) { + // console.log(8) + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; + } + } + } + } + + + return {x:xVia, y:yVia}; + }; + + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._line = function (ctx) { + // draw a straight line + ctx.beginPath(); + ctx.moveTo(this.from.x, this.from.y); + if (this.options.smoothCurves.enabled == true) { + if (this.options.smoothCurves.dynamic == false) { + var via = this._getViaCoordinates(); + if (via.x == null) { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; + } + else { + // this.via.x = via.x; + // this.via.y = via.y; + ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); + ctx.stroke(); + return via; + } + } + else { + ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); + ctx.stroke(); + return this.via; + } + } + else { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; } }; /** - * Set the range iterator to the start date. + * Draw a line from a node to itself, a circle + * @param {CanvasRenderingContext2D} ctx + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @private */ - TimeStep.prototype.first = function() { - this.current = new Date(this._start.valueOf()); - this.roundToMinor(); + Edge.prototype._circle = function (ctx, x, y, radius) { + // draw a circle + ctx.beginPath(); + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); }; /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date + * Draw label with white background and with the middle at (x, y) + * @param {CanvasRenderingContext2D} ctx + * @param {String} text + * @param {Number} x + * @param {Number} y + * @private */ - TimeStep.prototype.roundToMinor = function() { - // round to floor - // IMPORTANT: we have no breaks in this switch! (this is no bug) - //noinspection FallthroughInSwitchStatementJS - switch (this.scale) { - case TimeStep.SCALE.YEAR: - this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); - this.current.setMonth(0); - case TimeStep.SCALE.MONTH: this.current.setDate(1); - case TimeStep.SCALE.DAY: // intentional fall through - case TimeStep.SCALE.WEEKDAY: this.current.setHours(0); - case TimeStep.SCALE.HOUR: this.current.setMinutes(0); - case TimeStep.SCALE.MINUTE: this.current.setSeconds(0); - case TimeStep.SCALE.SECOND: this.current.setMilliseconds(0); - //case TimeStep.SCALE.MILLISECOND: // nothing to do for milliseconds - } + Edge.prototype._label = function (ctx, text, x, y) { + if (text) { + ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + + this.options.fontSize + "px " + this.options.fontFace; + var yLine; - if (this.step != 1) { - // round down to the first minor value that is a multiple of the current step size - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; - case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; - case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; - case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; - default: break; + if (this.dirtyLabel == true) { + var lines = String(text).split('\n'); + var lineCount = lines.length; + var fontSize = (Number(this.options.fontSize) + 4); + yLine = y + (1 - lineCount) / 2 * fontSize; + + var width = ctx.measureText(lines[0]).width; + for (var i = 1; i < lineCount; i++) { + var lineWidth = ctx.measureText(lines[i]).width; + width = lineWidth > width ? lineWidth : width; + } + var height = this.options.fontSize * lineCount; + var left = x - width / 2; + var top = y - height / 2; + + // cache + this.labelDimensions = {top:top,left:left,width:width,height:height,yLine:yLine}; + } + + + if (this.options.fontFill !== undefined && this.options.fontFill !== null && this.options.fontFill !== "none") { + ctx.fillStyle = this.options.fontFill; + ctx.fillRect(this.labelDimensions.left, + this.labelDimensions.top, + this.labelDimensions.width, + this.labelDimensions.height); + } + + // draw text + ctx.fillStyle = this.options.fontColor || "black"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + yLine = this.labelDimensions.yLine; + for (var i = 0; i < lineCount; i++) { + ctx.fillText(lines[i], x, yLine); + yLine += fontSize; } } }; /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date + * Redraw a edge as a dashed line + * Draw this edge in the given canvas + * @author David Jordan + * @date 2012-08-08 + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - TimeStep.prototype.hasNext = function () { - return (this.current.valueOf() <= this._end.valueOf()); - }; + Edge.prototype._drawDashLine = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(); + ctx.lineWidth = this._getLineWidth(); - /** - * Do the next step - */ - TimeStep.prototype.next = function() { - var prev = this.current.valueOf(); + var via = null; + // only firefox and chrome support this method, else we use the legacy one. + if (ctx.mozDash !== undefined || ctx.setLineDash !== undefined) { + // configure the dash pattern + var pattern = [0]; + if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) { + pattern = [this.options.dash.length,this.options.dash.gap]; + } + else { + pattern = [5,5]; + } - // Two cases, needed to prevent issues with switching daylight savings - // (end of March and end of October) - if (this.current.getMonth() < 6) { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: + // set dash settings for chrome or firefox + if (typeof ctx.setLineDash !== 'undefined') { //Chrome + ctx.setLineDash(pattern); + ctx.lineDashOffset = 0; - this.current = new Date(this.current.valueOf() + this.step); break; - case TimeStep.SCALE.SECOND: this.current = new Date(this.current.valueOf() + this.step * 1000); break; - case TimeStep.SCALE.MINUTE: this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; - case TimeStep.SCALE.HOUR: - this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); - // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) - var h = this.current.getHours(); - this.current.setHours(h - (h % this.step)); - break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; + } else { //Firefox + ctx.mozDash = pattern; + ctx.mozDashOffset = 0; + } + + // draw the line + via = this._line(ctx); + + // restore the dash settings. + if (typeof ctx.setLineDash !== 'undefined') { //Chrome + ctx.setLineDash([0]); + ctx.lineDashOffset = 0; + + } else { //Firefox + ctx.mozDash = [0]; + ctx.mozDashOffset = 0; } } - else { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: this.current = new Date(this.current.valueOf() + this.step); break; - case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() + this.step); break; - case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() + this.step); break; - case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() + this.step); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; + else { // unsupporting smooth lines + // draw dashed line + ctx.beginPath(); + ctx.lineCap = 'round'; + if (this.options.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]); + } + else if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.options.dash.length,this.options.dash.gap]); + } + else //If all else fails draw a line + { + ctx.moveTo(this.from.x, this.from.y); + ctx.lineTo(this.to.x, this.to.y); } + ctx.stroke(); } - if (this.step != 1) { - // round down to the correct major value - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; - case TimeStep.SCALE.SECOND: if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; - case TimeStep.SCALE.MINUTE: if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; - case TimeStep.SCALE.HOUR: if(this.current.getHours() < this.step) this.current.setHours(0); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: if(this.current.getDate() < this.step+1) this.current.setDate(1); break; - case TimeStep.SCALE.MONTH: if(this.current.getMonth() < this.step) this.current.setMonth(0); break; - case TimeStep.SCALE.YEAR: break; // nothing to do for year - default: break; + // draw label + if (this.label) { + var point; + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); } + this._label(ctx, this.label, point.x, point.y); } + }; - // safety mechanism: if current time is still unchanged, move to the end - if (this.current.valueOf() == prev) { - this.current = new Date(this._end.valueOf()); + /** + * Get a point on a line + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private + */ + Edge.prototype._pointOnLine = function (percentage) { + return { + x: (1 - percentage) * this.from.x + percentage * this.to.x, + y: (1 - percentage) * this.from.y + percentage * this.to.y } - - DateUtil.stepOverHiddenDates(this, prev); }; - /** - * Get the current datetime - * @return {Date} current The current date + * Get a point on a circle + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private */ - TimeStep.prototype.getCurrent = function() { - return this.current; + Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { + var angle = (percentage - 3/8) * 2 * Math.PI; + return { + x: x + radius * Math.cos(angle), + y: y - radius * Math.sin(angle) + } }; /** - * Set a custom scale. Autoscaling will be disabled. - * For example setScale(SCALE.MINUTES, 5) will result - * in minor steps of 5 minutes, and major steps of an hour. - * - * @param {TimeStep.SCALE} newScale - * A scale. Choose from SCALE.MILLISECOND, - * SCALE.SECOND, SCALE.MINUTE, SCALE.HOUR, - * SCALE.WEEKDAY, SCALE.DAY, SCALE.MONTH, - * SCALE.YEAR. - * @param {Number} newStep A step size, by default 1. Choose for - * example 1, 2, 5, or 10. + * Redraw a edge as a line with an arrow halfway the line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - TimeStep.prototype.setScale = function(newScale, newStep) { - this.scale = newScale; + Edge.prototype._drawArrowCenter = function(ctx) { + var point; + // set style + ctx.strokeStyle = this._getColor(); + ctx.fillStyle = ctx.strokeStyle; + ctx.lineWidth = this._getLineWidth(); - if (newStep > 0) { - this.step = newStep; + if (this.from != this.to) { + // draw line + var via = this._line(ctx); + + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + // draw an arrow halfway the line + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + this._label(ctx, this.label, point.x, point.y); + } } + else { + // draw circle + var x, y; + var radius = 0.25 * Math.max(100,this.physics.springLength); + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + } + this._circle(ctx, x, y, radius); - this.autoScale = false; - }; + // draw all arrows + var angle = 0.2 * Math.PI; + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + point = this._pointOnCircle(x, y, radius, 0.5); + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); - /** - * Enable or disable autoscaling - * @param {boolean} enable If true, autoascaling is set true - */ - TimeStep.prototype.setAutoScale = function (enable) { - this.autoScale = enable; + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + } }; + /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds + * Redraw a edge as a line with an arrow + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - TimeStep.prototype.setMinimumStep = function(minimumStep) { - if (minimumStep == undefined) { - return; - } + Edge.prototype._drawArrow = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(); + ctx.fillStyle = ctx.strokeStyle; + ctx.lineWidth = this._getLineWidth(); - //var b = asc + ds; + var angle, length; + //draw a line + if (this.from != this.to) { + angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); - var stepMonth = (1000 * 60 * 60 * 24 * 30); - var stepDay = (1000 * 60 * 60 * 24); - var stepHour = (1000 * 60 * 60); - var stepMinute = (1000 * 60); - var stepSecond = (1000); - var stepMillisecond= (1); + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - // find the smallest step that is larger than the provided minimumStep - if (stepYear*1000 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1000;} - if (stepYear*500 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 500;} - if (stepYear*100 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 100;} - if (stepYear*50 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 50;} - if (stepYear*10 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 10;} - if (stepYear*5 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 5;} - if (stepYear > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1;} - if (stepMonth*3 > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 3;} - if (stepMonth > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 1;} - if (stepDay*5 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 5;} - if (stepDay*2 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 2;} - if (stepDay > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 1;} - if (stepDay/2 > minimumStep) {this.scale = TimeStep.SCALE.WEEKDAY; this.step = 1;} - if (stepHour*4 > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 4;} - if (stepHour > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 1;} - if (stepMinute*15 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 15;} - if (stepMinute*10 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 10;} - if (stepMinute*5 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 5;} - if (stepMinute > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 1;} - if (stepSecond*15 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 15;} - if (stepSecond*10 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 10;} - if (stepSecond*5 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 5;} - if (stepSecond > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 1;} - if (stepMillisecond*200 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 200;} - if (stepMillisecond*100 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 100;} - if (stepMillisecond*50 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 50;} - if (stepMillisecond*10 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 10;} - if (stepMillisecond*5 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 5;} - if (stepMillisecond > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 1;} - }; + var via; + if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true ) { + via = this.via; + } + else if (this.options.smoothCurves.enabled == true) { + via = this._getViaCoordinates(); + } - /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate - */ - TimeStep.prototype.snap = function(date) { - var clone = new Date(date.valueOf()); + if (this.options.smoothCurves.enabled == true && via.x != null) { + angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); + dx = (this.to.x - via.x); + dy = (this.to.y - via.y); + edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + } + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - if (this.scale == TimeStep.SCALE.YEAR) { - var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); - clone.setFullYear(Math.round(year / this.step) * this.step); - clone.setMonth(0); - clone.setDate(0); - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.MONTH) { - if (clone.getDate() > 15) { - clone.setDate(1); - clone.setMonth(clone.getMonth() + 1); - // important: first set Date to 1, after that change the month. + var xTo,yTo; + if (this.options.smoothCurves.enabled == true && via.x != null) { + xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; } else { - clone.setDate(1); + xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; } - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.DAY) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 24) * 24); break; - default: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + ctx.beginPath(); + ctx.moveTo(xFrom,yFrom); + if (this.options.smoothCurves.enabled == true && via.x != null) { + ctx.quadraticCurveTo(via.x,via.y,xTo, yTo); } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.WEEKDAY) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; - default: - clone.setHours(Math.round(clone.getHours() / 6) * 6); break; + else { + ctx.lineTo(xTo, yTo); + } + ctx.stroke(); + + // draw arrow at the end of the line + length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + ctx.arrow(xTo, yTo, angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + var point; + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); } - else if (this.scale == TimeStep.SCALE.HOUR) { - switch (this.step) { - case 4: - clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; - default: - clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; + else { + // draw circle + var node = this.from; + var x, y, arrow; + var radius = 0.25 * Math.max(100,this.physics.springLength); + if (!node.width) { + node.resize(ctx); } - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (this.scale == TimeStep.SCALE.MINUTE) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 15: - case 10: - clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); - clone.setSeconds(0); - break; - case 5: - clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; - default: - clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + arrow = { + x: x, + y: node.y, + angle: 0.9 * Math.PI + }; } - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.SECOND) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 15: - case 10: - clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); - clone.setMilliseconds(0); - break; - case 5: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; - default: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + arrow = { + x: node.x, + y: y, + angle: 0.6 * Math.PI + }; + } + ctx.beginPath(); + // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); + + // draw all arrows + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + ctx.arrow(arrow.x, arrow.y, arrow.angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); } } - else if (this.scale == TimeStep.SCALE.MILLISECOND) { - var step = this.step > 5 ? this.step / 2 : 1; - clone.setMilliseconds(Math.round(clone.getMilliseconds() / step) * step); - } - - return clone; }; + + /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. + * Calculate the distance between a point (x3,y3) and a line segment from + * (x1,y1) to (x2,y2). + * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @private */ - TimeStep.prototype.isMajor = function() { - if (this.switchedYear == true) { - this.switchedYear = false; - switch (this.scale) { - case TimeStep.SCALE.YEAR: - case TimeStep.SCALE.MONTH: - case TimeStep.SCALE.WEEKDAY: - case TimeStep.SCALE.DAY: - case TimeStep.SCALE.HOUR: - case TimeStep.SCALE.MINUTE: - case TimeStep.SCALE.SECOND: - case TimeStep.SCALE.MILLISECOND: - return true; - default: - return false; + Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point + var returnValue = 0; + if (this.from != this.to) { + if (this.options.smoothCurves.enabled == true) { + var xVia, yVia; + if (this.options.smoothCurves.enabled == true && this.options.smoothCurves.dynamic == true) { + xVia = this.via.x; + yVia = this.via.y; + } + else { + var via = this._getViaCoordinates(); + xVia = via.x; + yVia = via.y; + } + var minDistance = 1e9; + var distance; + var i,t,x,y, lastX, lastY; + for (i = 0; i < 10; i++) { + t = 0.1*i; + x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; + y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; + if (i > 0) { + distance = this._getDistanceToLine(lastX,lastY,x,y, x3,y3); + minDistance = distance < minDistance ? distance : minDistance; + } + lastX = x; lastY = y; + } + returnValue = minDistance; } - } - else if (this.switchedMonth == true) { - this.switchedMonth = false; - switch (this.scale) { - case TimeStep.SCALE.WEEKDAY: - case TimeStep.SCALE.DAY: - case TimeStep.SCALE.HOUR: - case TimeStep.SCALE.MINUTE: - case TimeStep.SCALE.SECOND: - case TimeStep.SCALE.MILLISECOND: - return true; - default: - return false; + else { + returnValue = this._getDistanceToLine(x1,y1,x2,y2,x3,y3); } } - else if (this.switchedDay == true) { - this.switchedDay = false; - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: - case TimeStep.SCALE.SECOND: - case TimeStep.SCALE.MINUTE: - case TimeStep.SCALE.HOUR: - return true; - default: - return false; + else { + var x, y, dx, dy; + var radius = 0.25 * this.physics.springLength; + var node = this.from; + if (node.width > node.height) { + x = node.x + 0.5 * node.width; + y = node.y - radius; } + else { + x = node.x + radius; + y = node.y - 0.5 * node.height; + } + dx = x - x3; + dy = y - y3; + returnValue = Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); } - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: - return (this.current.getMilliseconds() == 0); - case TimeStep.SCALE.SECOND: - return (this.current.getSeconds() == 0); - case TimeStep.SCALE.MINUTE: - return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); - case TimeStep.SCALE.HOUR: - return (this.current.getHours() == 0); - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: - return (this.current.getDate() == 1); - case TimeStep.SCALE.MONTH: - return (this.current.getMonth() == 0); - case TimeStep.SCALE.YEAR: - return false; - default: - return false; - } - }; - - - /** - * Returns formatted text for the minor axislabel, depending on the current - * date and the scale. For example when scale is MINUTE, the current time is - * formatted as "hh:mm". - * @param {Date} [date] custom date. if not provided, current date is taken - */ - TimeStep.prototype.getLabelMinor = function(date) { - if (date == undefined) { - date = this.current; + if (this.labelDimensions.left < x3 && + this.labelDimensions.left + this.labelDimensions.width > x3 && + this.labelDimensions.top < y3 && + this.labelDimensions.top + this.labelDimensions.height > y3) { + return 0; } - - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: return moment(date).format('SSS'); - case TimeStep.SCALE.SECOND: return moment(date).format('s'); - case TimeStep.SCALE.MINUTE: return moment(date).format('HH:mm'); - case TimeStep.SCALE.HOUR: return moment(date).format('HH:mm'); - case TimeStep.SCALE.WEEKDAY: return moment(date).format('ddd D'); - case TimeStep.SCALE.DAY: return moment(date).format('D'); - case TimeStep.SCALE.MONTH: return moment(date).format('MMM'); - case TimeStep.SCALE.YEAR: return moment(date).format('YYYY'); - default: return ''; + else { + return returnValue; } }; + Edge.prototype._getDistanceToLine = function(x1,y1,x2,y2,x3,y3) { + var px = x2-x1, + py = y2-y1, + something = px*px + py*py, + u = ((x3 - x1) * px + (y3 - y1) * py) / something; - /** - * Returns formatted text for the major axis label, depending on the current - * date and the scale. For example when scale is MINUTE, the major scale is - * hours, and the hour will be formatted as "hh". - * @param {Date} [date] custom date. if not provided, current date is taken - */ - TimeStep.prototype.getLabelMajor = function(date) { - if (date == undefined) { - date = this.current; + if (u > 1) { + u = 1; } - - //noinspection FallthroughInSwitchStatementJS - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND:return moment(date).format('HH:mm:ss'); - case TimeStep.SCALE.SECOND: return moment(date).format('D MMMM HH:mm'); - case TimeStep.SCALE.MINUTE: - case TimeStep.SCALE.HOUR: return moment(date).format('ddd D MMMM'); - case TimeStep.SCALE.WEEKDAY: - case TimeStep.SCALE.DAY: return moment(date).format('MMMM YYYY'); - case TimeStep.SCALE.MONTH: return moment(date).format('YYYY'); - case TimeStep.SCALE.YEAR: return ''; - default: return ''; + else if (u < 0) { + u = 0; } - }; - - module.exports = TimeStep; + var x = x1 + u * px, + y = y1 + u * py, + dx = x - x3, + dy = y - y3; -/***/ }, -/* 39 */ -/***/ function(module, exports, __webpack_require__) { + //# Note: If the actual distance does not matter, + //# if you only want to compare what this function + //# returns to other results of this function, you + //# can just return the squared distance instead + //# (i.e. remove the sqrt) to gain a little performance - var util = __webpack_require__(1); - var Component = __webpack_require__(23); - var moment = __webpack_require__(2); - var locales = __webpack_require__(40); + return Math.sqrt(dx*dx + dy*dy); + }; /** - * A current time bar - * @param {{range: Range, dom: Object, domProps: Object}} body - * @param {Object} [options] Available parameters: - * {Boolean} [showCurrentTime] - * @constructor CurrentTime - * @extends Component + * This allows the zoom level of the network to influence the rendering + * + * @param scale */ - function CurrentTime (body, options) { - this.body = body; - - // default options - this.defaultOptions = { - showCurrentTime: true, - - locales: locales, - locale: 'en' - }; - this.options = util.extend({}, this.defaultOptions); - this.offset = 0; - - this._create(); - - this.setOptions(options); - } - - CurrentTime.prototype = new Component(); + Edge.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + }; - /** - * Create the HTML DOM for the current time bar - * @private - */ - CurrentTime.prototype._create = function() { - var bar = document.createElement('div'); - bar.className = 'currenttime'; - bar.style.position = 'absolute'; - bar.style.top = '0px'; - bar.style.height = '100%'; - this.bar = bar; + Edge.prototype.select = function() { + this.selected = true; }; - /** - * Destroy the CurrentTime bar - */ - CurrentTime.prototype.destroy = function () { - this.options.showCurrentTime = false; - this.redraw(); // will remove the bar from the DOM and stop refreshing - - this.body = null; + Edge.prototype.unselect = function() { + this.selected = false; }; - /** - * Set options for the component. Options will be merged in current options. - * @param {Object} options Available parameters: - * {boolean} [showCurrentTime] - */ - CurrentTime.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); + Edge.prototype.positionBezierNode = function() { + if (this.via !== null && this.from !== null && this.to !== null) { + this.via.x = 0.5 * (this.from.x + this.to.x); + this.via.y = 0.5 * (this.from.y + this.to.y); } }; /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. + * @param ctx */ - CurrentTime.prototype.redraw = function() { - if (this.options.showCurrentTime) { - var parent = this.body.dom.backgroundVertical; - if (this.bar.parentNode != parent) { - // attach to the dom - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); - } - parent.appendChild(this.bar); - - this.start(); + Edge.prototype._drawControlNodes = function(ctx) { + if (this.controlNodesEnabled == true) { + if (this.controlNodes.from === null && this.controlNodes.to === null) { + var nodeIdFrom = "edgeIdFrom:".concat(this.id); + var nodeIdTo = "edgeIdTo:".concat(this.id); + var constants = { + nodes:{group:'', radius:8}, + physics:{damping:0}, + clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} + }; + this.controlNodes.from = new Node( + {id:nodeIdFrom, + shape:'dot', + color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); + this.controlNodes.to = new Node( + {id:nodeIdTo, + shape:'dot', + color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); } - var now = new Date(new Date().valueOf() + this.offset); - var x = this.body.util.toScreen(now); - - var locale = this.options.locales[this.options.locale]; - var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); + if (this.controlNodes.from.selected == false && this.controlNodes.to.selected == false) { + this.controlNodes.positions = this.getControlNodePositions(ctx); + this.controlNodes.from.x = this.controlNodes.positions.from.x; + this.controlNodes.from.y = this.controlNodes.positions.from.y; + this.controlNodes.to.x = this.controlNodes.positions.to.x; + this.controlNodes.to.y = this.controlNodes.positions.to.y; + } - this.bar.style.left = x + 'px'; - this.bar.title = title; + this.controlNodes.from.draw(ctx); + this.controlNodes.to.draw(ctx); } else { - // remove the line from the DOM - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); - } - this.stop(); + this.controlNodes = {from:null, to:null, positions:{}}; } - - return false; }; /** - * Start auto refreshing the current time bar + * Enable control nodes. + * @private */ - CurrentTime.prototype.start = function() { - var me = this; - - function update () { - me.stop(); - - // determine interval to refresh - var scale = me.body.range.conversion(me.body.domProps.center.width).scale; - var interval = 1 / scale / 10; - if (interval < 30) interval = 30; - if (interval > 1000) interval = 1000; - - me.redraw(); - - // start a timer to adjust for the new time - me.currentTimeTimer = setTimeout(update, interval); - } - - update(); + Edge.prototype._enableControlNodes = function() { + this.controlNodesEnabled = true; }; /** - * Stop auto refreshing the current time bar + * disable control nodes + * @private */ - CurrentTime.prototype.stop = function() { - if (this.currentTimeTimer !== undefined) { - clearTimeout(this.currentTimeTimer); - delete this.currentTimeTimer; - } + Edge.prototype._disableControlNodes = function() { + this.controlNodesEnabled = false; }; /** - * Set a current time. This can be used for example to ensure that a client's - * time is synchronized with a shared server time. - * @param {Date | String | Number} time A Date, unix timestamp, or - * ISO date string. + * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. + * @param x + * @param y + * @returns {null} + * @private */ - CurrentTime.prototype.setCurrentTime = function(time) { - var t = util.convert(time, 'Date').valueOf(); - var now = new Date().valueOf(); - this.offset = t - now; - this.redraw(); + Edge.prototype._getSelectedControlNode = function(x,y) { + var positions = this.controlNodes.positions; + var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); + var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); + + if (fromDistance < 15) { + this.connectedNode = this.from; + this.from = this.controlNodes.from; + return this.controlNodes.from; + } + else if (toDistance < 15) { + this.connectedNode = this.to; + this.to = this.controlNodes.to; + return this.controlNodes.to; + } + else { + return null; + } }; + /** - * Get the current time. - * @return {Date} Returns the current time. + * this resets the control nodes to their original position. + * @private */ - CurrentTime.prototype.getCurrentTime = function() { - return new Date(new Date().valueOf() + this.offset); + Edge.prototype._restoreControlNodes = function() { + if (this.controlNodes.from.selected == true) { + this.from = this.connectedNode; + this.connectedNode = null; + this.controlNodes.from.unselect(); + } + if (this.controlNodes.to.selected == true) { + this.to = this.connectedNode; + this.connectedNode = null; + this.controlNodes.to.unselect(); + } }; - module.exports = CurrentTime; + /** + * this calculates the position of the control nodes on the edges of the parent nodes. + * + * @param ctx + * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} + */ + Edge.prototype.getControlNodePositions = function(ctx) { + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; + var via; + if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true) { + via = this.via; + } + else if (this.options.smoothCurves.enabled == true) { + via = this._getViaCoordinates(); + } -/***/ }, -/* 40 */ -/***/ function(module, exports, __webpack_require__) { + if (this.options.smoothCurves.enabled == true && via.x != null) { + angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); + dx = (this.to.x - via.x); + dy = (this.to.y - via.y); + edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + } + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - // English - exports['en'] = { - current: 'current', - time: 'time' - }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; + var xTo,yTo; + if (this.options.smoothCurves.enabled == true && via.x != null) { + xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; + } + else { + xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; + } - // Dutch - exports['nl'] = { - custom: 'aangepaste', - time: 'tijd' + return {from:{x:xFrom,y:yFrom},to:{x:xTo,y:yTo}}; }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; + module.exports = Edge; /***/ }, -/* 41 */ +/* 38 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(19); var util = __webpack_require__(1); - var Component = __webpack_require__(23); - var moment = __webpack_require__(2); - var locales = __webpack_require__(40); /** - * A custom time bar - * @param {{range: Range, dom: Object}} body - * @param {Object} [options] Available parameters: - * {Boolean} [showCustomTime] - * @constructor CustomTime - * @extends Component + * @class Groups + * This class can store groups and properties specific for groups. */ - - function CustomTime (body, options) { - this.body = body; - - // default options - this.defaultOptions = { - showCustomTime: false, - locales: locales, - locale: 'en' - }; - this.options = util.extend({}, this.defaultOptions); - - this.customTime = new Date(); - this.eventParams = {}; // stores state parameters while dragging the bar - - // create the DOM - this._create(); - - this.setOptions(options); + function Groups() { + this.clear(); + this.defaultIndex = 0; } - CustomTime.prototype = new Component(); - - /** - * Set options for the component. Options will be merged in current options. - * @param {Object} options Available parameters: - * {boolean} [showCustomTime] - */ - CustomTime.prototype.setOptions = function(options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['showCustomTime', 'locale', 'locales'], this.options, options); - } - }; - - /** - * Create the DOM for the custom time - * @private - */ - CustomTime.prototype._create = function() { - var bar = document.createElement('div'); - bar.className = 'customtime'; - bar.style.position = 'absolute'; - bar.style.top = '0px'; - bar.style.height = '100%'; - this.bar = bar; - - var drag = document.createElement('div'); - drag.style.position = 'relative'; - drag.style.top = '0px'; - drag.style.left = '-10px'; - drag.style.height = '100%'; - drag.style.width = '20px'; - bar.appendChild(drag); - - // attach event listeners - this.hammer = Hammer(bar, { - prevent_default: true - }); - this.hammer.on('dragstart', this._onDragStart.bind(this)); - this.hammer.on('drag', this._onDrag.bind(this)); - this.hammer.on('dragend', this._onDragEnd.bind(this)); - }; /** - * Destroy the CustomTime bar + * default constants for group colors */ - CustomTime.prototype.destroy = function () { - this.options.showCustomTime = false; - this.redraw(); // will remove the bar from the DOM - - this.hammer.enable(false); - this.hammer = null; + Groups.DEFAULT = [ + {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // blue + {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // yellow + {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // red + {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // green + {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // magenta + {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // purple + {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // orange + {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // darkblue + {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // pink + {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}} // mint + ]; - this.body = null; - }; /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Clear all groups */ - CustomTime.prototype.redraw = function () { - if (this.options.showCustomTime) { - var parent = this.body.dom.backgroundVertical; - if (this.bar.parentNode != parent) { - // attach to the dom - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); + Groups.prototype.clear = function () { + this.groups = {}; + this.groups.length = function() + { + var i = 0; + for ( var p in this ) { + if (this.hasOwnProperty(p)) { + i++; } - parent.appendChild(this.bar); - } - - var x = this.body.util.toScreen(this.customTime); - - var locale = this.options.locales[this.options.locale]; - var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); - - this.bar.style.left = x + 'px'; - this.bar.title = title; - } - else { - // remove the line from the DOM - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); } + return i; } - - return false; }; + /** - * Set custom time. - * @param {Date | number | string} time + * get group properties of a groupname. If groupname is not found, a new group + * is added. + * @param {*} groupname Can be a number, string, Date, etc. + * @return {Object} group The created group, containing all group properties */ - CustomTime.prototype.setCustomTime = function(time) { - this.customTime = util.convert(time, 'Date'); - this.redraw(); + Groups.prototype.get = function (groupname) { + var group = this.groups[groupname]; + if (group == undefined) { + // create new group + var index = this.defaultIndex % Groups.DEFAULT.length; + this.defaultIndex++; + group = {}; + group.color = Groups.DEFAULT[index]; + this.groups[groupname] = group; + } + + return group; }; /** - * Retrieve the current custom time. - * @return {Date} customTime + * Add a custom group style + * @param {String} groupname + * @param {Object} style An object containing borderColor, + * backgroundColor, etc. + * @return {Object} group The created group object */ - CustomTime.prototype.getCustomTime = function() { - return new Date(this.customTime.valueOf()); + Groups.prototype.add = function (groupname, style) { + this.groups[groupname] = style; + if (style.color) { + style.color = util.parseColor(style.color); + } + return style; }; - /** - * Start moving horizontally - * @param {Event} event - * @private - */ - CustomTime.prototype._onDragStart = function(event) { - this.eventParams.dragging = true; - this.eventParams.customTime = this.customTime; + module.exports = Groups; - event.stopPropagation(); - event.preventDefault(); - }; + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { /** - * Perform moving operating. - * @param {Event} event - * @private + * @class Images + * This class loads images and keeps them stored. */ - CustomTime.prototype._onDrag = function (event) { - if (!this.eventParams.dragging) return; - - var deltaX = event.gesture.deltaX, - x = this.body.util.toScreen(this.eventParams.customTime) + deltaX, - time = this.body.util.toTime(x); - - this.setCustomTime(time); + function Images() { + this.images = {}; - // fire a timechange event - this.body.emitter.emit('timechange', { - time: new Date(this.customTime.valueOf()) - }); + this.callback = undefined; + } - event.stopPropagation(); - event.preventDefault(); + /** + * Set an onload callback function. This will be called each time an image + * is loaded + * @param {function} callback + */ + Images.prototype.setOnloadCallback = function(callback) { + this.callback = callback; }; /** - * Stop moving operating. - * @param {event} event - * @private + * + * @param {string} url Url of the image + * @param {string} url Url of an image to use if the url image is not found + * @return {Image} img The image object */ - CustomTime.prototype._onDragEnd = function (event) { - if (!this.eventParams.dragging) return; - - // fire a timechanged event - this.body.emitter.emit('timechanged', { - time: new Date(this.customTime.valueOf()) - }); + Images.prototype.load = function(url, brokenUrl) { + var img = this.images[url]; + if (img == undefined) { + // create the image + var images = this; + img = new Image(); + this.images[url] = img; + img.onload = function() { + if (images.callback) { + images.callback(this); + } + }; + + img.onerror = function () { + this.src = brokenUrl; + if (images.callback) { + images.callback(this); + } + }; + + img.src = url; + } - event.stopPropagation(); - event.preventDefault(); + return img; }; - module.exports = CustomTime; + module.exports = Images; /***/ }, -/* 42 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { - var Emitter = __webpack_require__(11); - var Hammer = __webpack_require__(19); var util = __webpack_require__(1); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var Range = __webpack_require__(21); - var Core = __webpack_require__(25); - var TimeAxis = __webpack_require__(37); - var CurrentTime = __webpack_require__(39); - var CustomTime = __webpack_require__(41); - var LineGraph = __webpack_require__(43); /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Graph2d.setOptions for the available options. - * @constructor - * @extends Core + * @class Node + * A node. A node can be connected to other nodes via one or multiple edges. + * @param {object} properties An object containing properties for the node. All + * properties are optional, except for the id. + * {number} id Id of the node. Required + * {string} label Text label for the node + * {number} x Horizontal position of the node + * {number} y Vertical position of the node + * {string} shape Node shape, available: + * "database", "circle", "ellipse", + * "box", "image", "text", "dot", + * "star", "triangle", "triangleDown", + * "square" + * {string} image An image url + * {string} title An title text, can be HTML + * {anytype} group A group name or number + * @param {Network.Images} imagelist A list with images. Only needed + * when the node has an image + * @param {Network.Groups} grouplist A list with groups. Needed for + * retrieving group properties + * @param {Object} constants An object with default values for + * example for the color + * */ - function Graph2d (container, items, groups, options) { - // if the third element is options, the forth is groups (optionally); - if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { - var forthArgument = options; - options = groups; - groups = forthArgument; - } - - var me = this; - this.defaultOptions = { - start: null, - end: null, - - autoResize: true, - - orientation: 'bottom', - width: null, - height: null, - maxHeight: null, - minHeight: null - }; - this.options = util.deepExtend({}, this.defaultOptions); - - // Create the DOM, props, and emitter - this._create(container); - - // all components listed here will be repainted automatically - this.components = []; + function Node(properties, imagelist, grouplist, networkConstants) { + var constants = util.selectiveBridgeObject(['nodes'],networkConstants); + this.options = constants.nodes; - this.body = { - dom: this.dom, - domProps: this.props, - emitter: { - on: this.on.bind(this), - off: this.off.bind(this), - emit: this.emit.bind(this) - }, - hiddenDates: [], - util: { - snap: null, // will be specified after TimeAxis is created - toScreen: me._toScreen.bind(me), - toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width - toTime: me._toTime.bind(me), - toGlobalTime : me._toGlobalTime.bind(me) - } - }; + this.selected = false; + this.hover = false; - // range - this.range = new Range(this.body); - this.components.push(this.range); - this.body.range = this.range; + this.edges = []; // all edges connected to this node + this.dynamicEdges = []; + this.reroutedEdges = {}; - // time axis - this.timeAxis = new TimeAxis(this.body); - this.components.push(this.timeAxis); - this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); + this.fontDrawThreshold = 3; - // current time bar - this.currentTime = new CurrentTime(this.body); - this.components.push(this.currentTime); + // set defaults for the properties + this.id = undefined; + this.x = null; + this.y = null; + this.allowedToMoveX = false; + this.allowedToMoveY = false; + this.xFixed = false; + this.yFixed = false; + this.horizontalAlignLeft = true; // these are for the navigation controls + this.verticalAlignTop = true; // these are for the navigation controls + this.baseRadiusValue = networkConstants.nodes.radius; + this.radiusFixed = false; + this.level = -1; + this.preassignedLevel = false; + this.hierarchyEnumerated = false; + this.labelDimensions = {top:0,left:0,width:0,height:0,yLine:0}; // could be cached - // custom time bar - // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(this.body); - this.components.push(this.customTime); - // item set - this.linegraph = new LineGraph(this.body); - this.components.push(this.linegraph); + this.imagelist = imagelist; + this.grouplist = grouplist; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + // physics properties + this.fx = 0.0; // external force x + this.fy = 0.0; // external force y + this.vx = 0.0; // velocity x + this.vy = 0.0; // velocity y + this.damping = networkConstants.physics.damping; // written every time gravity is calculated + this.fixedData = {x:null,y:null}; - // apply options - if (options) { - this.setOptions(options); - } + this.setProperties(properties, constants); - // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! - if (groups) { - this.setGroups(groups); - } + // creating the variables for clustering + this.resetCluster(); + this.dynamicEdgesLength = 0; + this.clusterSession = 0; + this.clusterSizeWidthFactor = networkConstants.clustering.nodeScaling.width; + this.clusterSizeHeightFactor = networkConstants.clustering.nodeScaling.height; + this.clusterSizeRadiusFactor = networkConstants.clustering.nodeScaling.radius; + this.maxNodeSizeIncrements = networkConstants.clustering.maxNodeSizeIncrements; + this.growthIndicator = 0; - // create itemset - if (items) { - this.setItems(items); - } - else { - this.redraw(); - } + // variables to tell the node about the network. + this.networkScaleInv = 1; + this.networkScale = 1; + this.canvasTopLeft = {"x": -300, "y": -300}; + this.canvasBottomRight = {"x": 300, "y": 300}; + this.parentEdgeId = null; } - // Extend the functionality from Core - Graph2d.prototype = new Core(); - - /** - * Set items - * @param {vis.DataSet | Array | google.visualization.DataTable | null} items - */ - Graph2d.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); - - // convert to type DataSet when needed - var newDataSet; - if (!items) { - newDataSet = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - newDataSet = items; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(items, { - type: { - start: 'Date', - end: 'Date' - } - }); - } - - // set items - this.itemsData = newDataSet; - this.linegraph && this.linegraph.setItems(newDataSet); - - if (initialLoad) { - if (this.options.start != undefined || this.options.end != undefined) { - var start = this.options.start != undefined ? this.options.start : null; - var end = this.options.end != undefined ? this.options.end : null; - - this.setWindow(start, end, {animate: false}); - } - else { - this.fit({animate: false}); - } - } - }; - /** - * Set groups - * @param {vis.DataSet | Array | google.visualization.DataTable} groups + * (re)setting the clustering variables and objects */ - Graph2d.prototype.setGroups = function(groups) { - // convert to type DataSet when needed - var newDataSet; - if (!groups) { - newDataSet = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - newDataSet = groups; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(groups); - } - - this.groupsData = newDataSet; - this.linegraph.setGroups(newDataSet); + Node.prototype.resetCluster = function() { + // clustering variables + this.formationScale = undefined; // this is used to determine when to open the cluster + this.clusterSize = 1; // this signifies the total amount of nodes in this cluster + this.containedNodes = {}; + this.containedEdges = {}; + this.clusterSessions = []; }; /** - * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right). - * @param groupId - * @param width - * @param height + * Attach a edge to the node + * @param {Edge} edge */ - Graph2d.prototype.getLegend = function(groupId, width, height) { - if (width === undefined) {width = 15;} - if (height === undefined) {height = 15;} - if (this.linegraph.groups[groupId] !== undefined) { - return this.linegraph.groups[groupId].getLegend(width,height); + Node.prototype.attachEdge = function(edge) { + if (this.edges.indexOf(edge) == -1) { + this.edges.push(edge); } - else { - return "cannot find group:" + groupId; + if (this.dynamicEdges.indexOf(edge) == -1) { + this.dynamicEdges.push(edge); } - } + this.dynamicEdgesLength = this.dynamicEdges.length; + }; /** - * This checks if the visible option of the supplied group (by ID) is true or false. - * @param groupId - * @returns {*} + * Detach a edge from the node + * @param {Edge} edge */ - Graph2d.prototype.isGroupVisible = function(groupId) { - if (this.linegraph.groups[groupId] !== undefined) { - return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true)); + Node.prototype.detachEdge = function(edge) { + var index = this.edges.indexOf(edge); + if (index != -1) { + this.edges.splice(index, 1); } - else { - return false; + index = this.dynamicEdges.indexOf(edge); + if (index != -1) { + this.dynamicEdges.splice(index, 1); } - } + this.dynamicEdgesLength = this.dynamicEdges.length; + }; /** - * Get the data range of the item set. - * @returns {{min: Date, max: Date}} range A range with a start and end Date. - * When no minimum is found, min==null - * When no maximum is found, max==null + * Set or overwrite properties for the node + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties */ - Graph2d.prototype.getItemRange = function() { - var min = null; - var max = null; - - // calculate min from start filed - for (var groupId in this.linegraph.groups) { - if (this.linegraph.groups.hasOwnProperty(groupId)) { - if (this.linegraph.groups[groupId].visible == true) { - for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) { - var item = this.linegraph.groups[groupId].itemsData[i]; - var value = util.convert(item.x, 'Date').valueOf(); - min = min == null ? value : min > value ? value : min; - max = max == null ? value : max < value ? value : max; - } - } - } + Node.prototype.setProperties = function(properties, constants) { + if (!properties) { + return; } - return { - min: (min != null) ? new Date(min) : null, - max: (max != null) ? new Date(max) : null - }; - }; - - - - module.exports = Graph2d; - - -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { + var fields = ['borderWidth','borderWidthSelected','shape','image','brokenImage','radius','fontColor', + 'fontSize','fontFace','fontFill','group','mass' + ]; + util.selectiveDeepExtend(fields, this.options, properties); - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var Component = __webpack_require__(23); - var DataAxis = __webpack_require__(44); - var GraphGroup = __webpack_require__(46); - var Legend = __webpack_require__(50); - var BarGraphFunctions = __webpack_require__(49); + // basic properties + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.x !== undefined) {this.x = properties.x;} + if (properties.y !== undefined) {this.y = properties.y;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} - var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + // navigation controls properties + if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} + if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} + if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} - /** - * This is the constructor of the LineGraph. It requires a Timeline body and options. - * - * @param body - * @param options - * @constructor - */ - function LineGraph(body, options) { - this.id = util.randomUUID(); - this.body = body; + if (this.id === undefined) { + throw "Node must have an id"; + } - this.defaultOptions = { - yAxisOrientation: 'left', - defaultGroup: 'default', - sort: true, - sampling: true, - graphHeight: '400px', - shaded: { - enabled: false, - orientation: 'bottom' // top, bottom - }, - style: 'line', // line, bar - barChart: { - width: 50, - handleOverlap: 'overlap', - align: 'center' // left, center, right - }, - catmullRom: { - enabled: true, - parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) - alpha: 0.5 - }, - drawPoints: { - enabled: true, - size: 6, - style: 'square' // square, circle - }, - dataAxis: { - showMinorLabels: true, - showMajorLabels: true, - icons: false, - width: '40px', - visible: true, - alignZeros: true, - customRange: { - left: {min:undefined, max:undefined}, - right: {min:undefined, max:undefined} - } - //, these options are not set by default, but this shows the format they will be in - //format: { - // left: {decimals: 2}, - // right: {decimals: 2} - //}, - //title: { - // left: { - // text: 'left', - // style: 'color:black;' - // }, - // right: { - // text: 'right', - // style: 'color:black;' - // } - //} - }, - legend: { - enabled: false, - icons: true, - left: { - visible: true, - position: 'top-left' // top/bottom - left,right - }, - right: { - visible: true, - position: 'top-right' // top/bottom - left,right + // copy group properties + if (typeof this.options.group === 'number' || (typeof this.options.group === 'string' && this.options.group != '')) { + var groupObj = this.grouplist.get(this.options.group); + for (var prop in groupObj) { + if (groupObj.hasOwnProperty(prop)) { + this.options[prop] = groupObj[prop]; } - }, - groups: { - visibility: {} } - }; + } - // options is shared by this ItemSet and all its items - this.options = util.extend({}, this.defaultOptions); - this.dom = {}; - this.props = {}; - this.hammer = null; - this.groups = {}; - this.abortedGraphUpdate = false; - this.autoSizeSVG = false; - var me = this; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + // individual shape properties + if (properties.radius !== undefined) {this.baseRadiusValue = this.options.radius;} + if (properties.color !== undefined) {this.options.color = util.parseColor(properties.color);} - // listeners for the DataSet of the items - this.itemListeners = { - 'add': function (event, params, senderId) { - me._onAdd(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdate(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemove(params.items); + if (this.options.image!== undefined && this.options.image!= "") { + if (this.imagelist) { + this.imageObj = this.imagelist.load(this.options.image, this.options.brokenImage); } - }; - - // listeners for the DataSet of the groups - this.groupListeners = { - 'add': function (event, params, senderId) { - me._onAddGroups(params.items); - }, - 'update': function (event, params, senderId) { - me._onUpdateGroups(params.items); - }, - 'remove': function (event, params, senderId) { - me._onRemoveGroups(params.items); + else { + throw "No imagelist provided"; } - }; + } - this.items = {}; // object with an Item for every data item - this.selection = []; // list with the ids of all selected nodes - this.lastStart = this.body.range.start; - this.touchParams = {}; // stores properties while dragging + if (properties.allowedToMoveX !== undefined) { + this.xFixed = !properties.allowedToMoveX; + this.allowedToMoveX = properties.allowedToMoveX; + } + else if (properties.x !== undefined && this.allowedToMoveX == false) { + this.xFixed = true; + } - this.svgElements = {}; - this.setOptions(options); - this.groupsUsingDefaultStyles = [0]; - this.body.emitter.on('rangechanged', function() { - me.lastStart = me.body.range.start; - me.svg.style.left = util.option.asSize(-me.width); - me._updateGraph.apply(me); - }); + if (properties.allowedToMoveY !== undefined) { + this.yFixed = !properties.allowedToMoveY; + this.allowedToMoveY = properties.allowedToMoveY; + } + else if (properties.y !== undefined && this.allowedToMoveY == false) { + this.yFixed = true; + } - // create the HTML DOM - this._create(); - this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; - this.body.emitter.emit('change'); + this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); - } + if (this.options.shape == 'image') { + this.options.radiusMin = constants.nodes.widthMin; + this.options.radiusMax = constants.nodes.widthMax; + } - LineGraph.prototype = new Component(); + + + // choose draw method depending on the shape + switch (this.options.shape) { + case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; + case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; + case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; + case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + // TODO: add diamond shape + case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; + case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; + case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; + case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; + case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; + case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; + case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; + default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + } + // reset the size of the node, this can be changed + this._reset(); + + }; /** - * Create the HTML DOM for the ItemSet + * select this node */ - LineGraph.prototype._create = function(){ - var frame = document.createElement('div'); - frame.className = 'LineGraph'; - this.dom.frame = frame; + Node.prototype.select = function() { + this.selected = true; + this._reset(); + }; - // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg','svg'); - this.svg.style.position = 'relative'; - this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; - this.svg.style.display = 'block'; - frame.appendChild(this.svg); + /** + * unselect this node + */ + Node.prototype.unselect = function() { + this.selected = false; + this._reset(); + }; - // data axis - this.options.dataAxis.orientation = 'left'; - this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); - this.options.dataAxis.orientation = 'right'; - this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); - delete this.options.dataAxis.orientation; + /** + * Reset the calculated size of the node, forces it to recalculate its size + */ + Node.prototype.clearSizeCache = function() { + this._reset(); + }; - // legends - this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); - this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); + /** + * Reset the calculated size of the node, forces it to recalculate its size + * @private + */ + Node.prototype._reset = function() { + this.width = undefined; + this.height = undefined; + }; - this.show(); + /** + * get the title of this node. + * @return {string} title The title of the node, or undefined when no title + * has been set. + */ + Node.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; }; /** - * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. - * @param {object} options + * Calculate the distance to the border of the Node + * @param {CanvasRenderingContext2D} ctx + * @param {Number} angle Angle in radians + * @returns {number} distance Distance to the border in pixels */ - LineGraph.prototype.setOptions = function(options) { - if (options) { - var fields = ['sampling','defaultGroup','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; - if (options.graphHeight === undefined && options.height !== undefined && this.body.domProps.centerContainer.height !== undefined) { - this.autoSizeSVG = true; - } - else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) { - if (parseInt((options.graphHeight + '').replace("px",'')) < this.body.domProps.centerContainer.height) { - console.log(this.body.domProps) - this.autoSizeSVG = true; - } - } - util.selectiveDeepExtend(fields, this.options, options); - util.mergeOptions(this.options, options,'catmullRom'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); - util.mergeOptions(this.options, options,'legend'); + Node.prototype.distanceToBorder = function (ctx, angle) { + var borderWidth = 1; - if (options.catmullRom) { - if (typeof options.catmullRom == 'object') { - if (options.catmullRom.parametrization) { - if (options.catmullRom.parametrization == 'uniform') { - this.options.catmullRom.alpha = 0; - } - else if (options.catmullRom.parametrization == 'chordal') { - this.options.catmullRom.alpha = 1.0; - } - else { - this.options.catmullRom.parametrization = 'centripetal'; - this.options.catmullRom.alpha = 0.5; - } - } - } - } + if (!this.width) { + this.resize(ctx); + } - if (this.yAxisLeft) { - if (options.dataAxis !== undefined) { - this.yAxisLeft.setOptions(this.options.dataAxis); - this.yAxisRight.setOptions(this.options.dataAxis); - } - } + switch (this.options.shape) { + case 'circle': + case 'dot': + return this.options.radius+ borderWidth; - if (this.legendLeft) { - if (options.legend !== undefined) { - this.legendLeft.setOptions(this.options.legend); - this.legendRight.setOptions(this.options.legend); + case 'ellipse': + var a = this.width / 2; + var b = this.height / 2; + var w = (Math.sin(angle) * a); + var h = (Math.cos(angle) * b); + return a * b / Math.sqrt(w * w + h * h); + + // TODO: implement distanceToBorder for database + // TODO: implement distanceToBorder for triangle + // TODO: implement distanceToBorder for triangleDown + + case 'box': + case 'image': + case 'text': + default: + if (this.width) { + return Math.min( + Math.abs(this.width / 2 / Math.cos(angle)), + Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; + // TODO: reckon with border radius too in case of box + } + else { + return 0; } - } - if (this.groups.hasOwnProperty(UNGROUPED)) { - this.groups[UNGROUPED].setOptions(options); - } - } - if (this.dom.frame) { - this._updateGraph(); } + // TODO: implement calculation of distance to border for all shapes }; /** - * Hide the component from the DOM + * Set forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction */ - LineGraph.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); - } + Node.prototype._setForce = function(fx, fy) { + this.fx = fx; + this.fy = fy; }; - /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * Add forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + * @private */ - LineGraph.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); - } + Node.prototype._addForce = function(fx, fy) { + this.fx += fx; + this.fy += fy; }; - /** - * Set items - * @param {vis.DataSet | null} items + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds */ - LineGraph.prototype.setItems = function(items) { - var me = this, - ids, - oldItemsData = this.itemsData; - - // replace the dataset - if (!items) { - this.itemsData = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - this.itemsData = items; + Node.prototype.discreteStep = function(interval) { + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.options.mass; // acceleration + this.vx += ax * interval; // velocity + this.x += this.vx * interval; // position } else { - throw new TypeError('Data must be an instance of DataSet or DataView'); - } - - if (oldItemsData) { - // unsubscribe from old dataset - util.forEach(this.itemListeners, function (callback, event) { - oldItemsData.off(event, callback); - }); - - // remove all drawn items - ids = oldItemsData.getIds(); - this._onRemove(ids); - } - - if (this.itemsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.itemListeners, function (callback, event) { - me.itemsData.on(event, callback, id); - }); - - // add all new items - ids = this.itemsData.getIds(); - this._onAdd(ids); + this.fx = 0; + this.vx = 0; + } + + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.options.mass; // acceleration + this.vy += ay * interval; // velocity + this.y += this.vy * interval; // position + } + else { + this.fy = 0; + this.vy = 0; } - this._updateUngrouped(); - this._updateGraph(); - this.redraw(); }; + /** - * Set groups - * @param {vis.DataSet} groups + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + * @param {number} maxVelocity The speed limit imposed on the velocity */ - LineGraph.prototype.setGroups = function(groups) { - var me = this; - var ids; - - // unsubscribe from current dataset - if (this.groupsData) { - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.unsubscribe(event, callback); - }); - - // remove all drawn groups - ids = this.groupsData.getIds(); - this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw - } - - // replace the dataset - if (!groups) { - this.groupsData = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - this.groupsData = groups; + Node.prototype.discreteStepLimited = function(interval, maxVelocity) { + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.options.mass; // acceleration + this.vx += ax * interval; // velocity + this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; + this.x += this.vx * interval; // position } else { - throw new TypeError('Data must be an instance of DataSet or DataView'); + this.fx = 0; + this.vx = 0; } - if (this.groupsData) { - // subscribe to new dataset - var id = this.id; - util.forEach(this.groupListeners, function (callback, event) { - me.groupsData.on(event, callback, id); - }); - - // draw all ms - ids = this.groupsData.getIds(); - this._onAddGroups(ids); + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.options.mass; // acceleration + this.vy += ay * interval; // velocity + this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; + this.y += this.vy * interval; // position + } + else { + this.fy = 0; + this.vy = 0; } - this._onUpdate(); }; - /** - * Update the data - * @param [ids] - * @private + * Check if this node has a fixed x and y position + * @return {boolean} true if fixed, false if not */ - LineGraph.prototype._onUpdate = function(ids) { - this._updateUngrouped(); - this._updateAllGroupData(); - this._updateGraph(); - this.redraw(); + Node.prototype.isFixed = function() { + return (this.xFixed && this.yFixed); }; - LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; - LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; - LineGraph.prototype._onUpdateGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - var group = this.groupsData.get(groupIds[i]); - this._updateGroup(group, groupIds[i]); - } - this._updateGraph(); - this.redraw(); + /** + * Check if this node is moving + * @param {number} vmin the minimum velocity considered as "moving" + * @return {boolean} true if moving, false if it has no velocity + */ + Node.prototype.isMoving = function(vmin) { + var velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)); + // this.velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)) + return (velocity > vmin); }; - LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; - /** - * this cleans the group out off the legends and the dataaxis, updates the ungrouped and updates the graph - * @param {Array} groupIds - * @private + * check if this node is selecte + * @return {boolean} selected True if node is selected, else false */ - LineGraph.prototype._onRemoveGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - if (this.groups.hasOwnProperty(groupIds[i])) { - if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { - this.yAxisRight.removeGroup(groupIds[i]); - this.legendRight.removeGroup(groupIds[i]); - this.legendRight.redraw(); - } - else { - this.yAxisLeft.removeGroup(groupIds[i]); - this.legendLeft.removeGroup(groupIds[i]); - this.legendLeft.redraw(); - } - delete this.groups[groupIds[i]]; - } - } - this._updateUngrouped(); - this._updateGraph(); - this.redraw(); + Node.prototype.isSelected = function() { + return this.selected; }; - /** - * update a group object with the group dataset entree - * - * @param group - * @param groupId - * @private + * Retrieve the value of the node. Can be undefined + * @return {Number} value */ - LineGraph.prototype._updateGroup = function (group, groupId) { - if (!this.groups.hasOwnProperty(groupId)) { - this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); - if (this.groups[groupId].options.yAxisOrientation == 'right') { - this.yAxisRight.addGroup(groupId, this.groups[groupId]); - this.legendRight.addGroup(groupId, this.groups[groupId]); - } - else { - this.yAxisLeft.addGroup(groupId, this.groups[groupId]); - this.legendLeft.addGroup(groupId, this.groups[groupId]); - } - } - else { - this.groups[groupId].update(group); - if (this.groups[groupId].options.yAxisOrientation == 'right') { - this.yAxisRight.updateGroup(groupId, this.groups[groupId]); - this.legendRight.updateGroup(groupId, this.groups[groupId]); - } - else { - this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); - this.legendLeft.updateGroup(groupId, this.groups[groupId]); - } - } - this.legendLeft.redraw(); - this.legendRight.redraw(); + Node.prototype.getValue = function() { + return this.value; }; - /** - * this updates all groups, it is used when there is an update the the itemset. - * - * @private + * Calculate the distance from the nodes location to the given location (x,y) + * @param {Number} x + * @param {Number} y + * @return {Number} value */ - LineGraph.prototype._updateAllGroupData = function () { - if (this.itemsData != null) { - var groupsContent = {}; - var groupId; - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - groupsContent[groupId] = []; - } - } - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (groupsContent[item.group] === undefined) { - throw new Error('Cannot find referenced group. Possible reason: items added before groups? Groups need to be added before items, as items refer to groups.') - } - item.x = util.convert(item.x,'Date'); - groupsContent[item.group].push(item); - } - } - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - this.groups[groupId].setItems(groupsContent[groupId]); - } - } - } + Node.prototype.getDistance = function(x, y) { + var dx = this.x - x, + dy = this.y - y; + return Math.sqrt(dx * dx + dy * dy); }; /** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. This anonymous group is called 'graph'. - * @protected + * Adjust the value range of the node. The node will adjust it's radius + * based on its value. + * @param {Number} min + * @param {Number} max */ - LineGraph.prototype._updateUngrouped = function() { - if (this.itemsData && this.itemsData != null) { - var ungroupedCounter = 0; - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (item != undefined) { - if (item.hasOwnProperty('group')) { - if (item.group === undefined) { - item.group = UNGROUPED; - } - } - else { - item.group = UNGROUPED; - } - ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; - } - } - } - - if (ungroupedCounter == 0) { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); + Node.prototype.setValueRange = function(min, max) { + if (!this.radiusFixed && this.value !== undefined) { + if (max == min) { + this.options.radius= (this.options.radiusMin + this.options.radiusMax) / 2; } else { - var group = {id: UNGROUPED, content: this.options.defaultGroup}; - this._updateGroup(group, UNGROUPED); + var scale = (this.options.radiusMax - this.options.radiusMin) / (max - min); + this.options.radius= (this.value - min) * scale + this.options.radiusMin; } } - else { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } - - this.legendLeft.redraw(); - this.legendRight.redraw(); + this.baseRadiusValue = this.options.radius; }; - /** - * Redraw the component, mandatory function - * @return {boolean} Returns true if the component is resized + * Draw this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx */ - LineGraph.prototype.redraw = function() { - var resized = false; + Node.prototype.draw = function(ctx) { + throw "Draw method not initialized for node"; + }; - this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; - if (this.lastWidth === undefined && this.width || this.lastWidth != this.width) { - resized = true; - } - // check if this component is resized - resized = this._isResized() || resized; - // check whether zoomed (in that case we need to re-stack everything) - var visibleInterval = this.body.range.end - this.body.range.start; - var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); - this.lastVisibleInterval = visibleInterval; - this.lastWidth = this.width; + /** + * Recalculate the size of this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.resize = function(ctx) { + throw "Resize method not initialized for node"; + }; - // calculate actual size and position - this.width = this.dom.frame.offsetWidth; + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top, right, bottom + * @return {boolean} True if location is located on node + */ + Node.prototype.isOverlappingWith = function(obj) { + return (this.left < obj.right && + this.left + this.width > obj.left && + this.top < obj.bottom && + this.top + this.height > obj.top); + }; - // the svg element is three times as big as the width, this allows for fully dragging left and right - // without reloading the graph. the controls for this are bound to events in the constructor - if (resized == true) { - this.svg.style.width = util.option.asSize(3*this.width); - this.svg.style.left = util.option.asSize(-this.width); - } + Node.prototype._resizeImage = function (ctx) { + // TODO: pre calculate the image size - if (zoomed == true || this.abortedGraphUpdate == true) { - this._updateGraph(); - } - else { - // move the whole svg while dragging - if (this.lastStart != 0) { - var offset = this.body.range.start - this.lastStart; - var range = this.body.range.end - this.body.range.start; - if (this.width != 0) { - var rangePerPixelInv = this.width/range; - var xOffset = offset * rangePerPixelInv; - this.svg.style.left = (-this.width - xOffset) + 'px'; + if (!this.width || !this.height) { // undefined or 0 + var width, height; + if (this.value) { + this.options.radius= this.baseRadiusValue; + var scale = this.imageObj.height / this.imageObj.width; + if (scale !== undefined) { + width = this.options.radius|| this.imageObj.width; + height = this.options.radius* scale || this.imageObj.height; + } + else { + width = 0; + height = 0; } } + else { + width = this.imageObj.width; + height = this.imageObj.height; + } + this.width = width; + this.height = height; + this.growthIndicator = 0; + if (this.width > 0 && this.height > 0) { + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - width; + } } - this.legendLeft.redraw(); - this.legendRight.redraw(); - - return resized; }; + Node.prototype._drawImage = function (ctx) { + this._resizeImage(ctx); - /** - * Update and redraw the graph. - * - */ - LineGraph.prototype._updateGraph = function () { - // reset the svg elements - DOMutil.prepareElements(this.svgElements); - if (this.width != 0 && this.itemsData != null) { - var group, i; - var preprocessedGroupData = {}; - var processedGroupData = {}; - var groupRanges = {}; - var changeCalled = false; + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - // update the height of the graph on each redraw of the graph. - if (this.autoSizeSVG == true) { - if (this.options.graphHeight != this.body.domProps.centerContainer.height + 'px') { - this.options.graphHeight = this.body.domProps.centerContainer.height + 'px'; - this.svg.style.height = this.body.domProps.centerContainer.height + 'px'; - } - this.autoSizeSVG = false; - } + var yLabel; + if (this.imageObj.width != 0 ) { + // draw the shade + if (this.clusterSize > 1) { + var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); + lineWidth *= this.networkScaleInv; + lineWidth = Math.min(0.2 * this.width,lineWidth); - // getting group Ids - var groupIds = []; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - group = this.groups[groupId]; - if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { - groupIds.push(groupId); - } - } + ctx.globalAlpha = 0.5; + ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); } - if (groupIds.length > 0) { - // this is the range of the SVG canvas - var minDate = this.body.util.toGlobalTime(- this.body.domProps.root.width); - var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); - var groupsData = {}; - // fill groups data, this only loads the data we require based on the timewindow - this._getRelevantData(groupIds, groupsData, minDate, maxDate); - - // apply sampling, if disabled, it will pass through this function. - this._applySampling(groupIds, groupsData); - // we transform the X coordinates to detect collisions - for (i = 0; i < groupIds.length; i++) { - preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); - } + // draw the image + ctx.globalAlpha = 1.0; + ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); + yLabel = this.y + this.height / 2; + } + else { + // image still loading... just draw the label for now + yLabel = this.y; + } - // now all needed data has been collected we start the processing. - this._getYRanges(groupIds, preprocessedGroupData, groupRanges); + this._label(ctx, this.label, this.x, yLabel, undefined, "top"); + }; - // update the Y axis first, we use this data to draw at the correct Y points - // changeCalled is required to clean the SVG on a change emit. - changeCalled = this._updateYAxis(groupIds, groupRanges); - if (changeCalled == true) { - DOMutil.cleanupElements(this.svgElements); - this.abortedGraphUpdate = true; - this.body.emitter.emit('change'); - return; - } - this.abortedGraphUpdate = false; - // With the yAxis scaled correctly, use this to get the Y values of the points. - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); - } + Node.prototype._resizeBox = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + // this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - // draw the groups - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style != 'bar') { // bar needs to be drawn enmasse - group.draw(processedGroupData[groupIds[i]], group, this.framework); - } - } - BarGraphFunctions.draw(groupIds, processedGroupData, this.framework); - } } - - // cleanup unused svg elements - DOMutil.cleanupElements(this.svgElements); }; + Node.prototype._drawBox = function (ctx) { + this._resizeBox(ctx); - /** - * first select and preprocess the data from the datasets. - * the groups have their preselection of data, we now loop over this data to see - * what data we need to draw. Sorted data is much faster. - * more optimization is possible by doing the sampling before and using the binary search - * to find the end date to determine the increment. - * - * @param {array} groupIds - * @param {object} groupsData - * @param {date} minDate - * @param {date} maxDate - * @private - */ - LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { - var group, i, j, item; - if (groupIds.length > 0) { - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - groupsData[groupIds[i]] = []; - var dataContainer = groupsData[groupIds[i]]; - // optimization for sorted data - if (group.options.sort == true) { - var guess = Math.max(0, util.binarySearchValue(group.itemsData, minDate, 'x', 'before')); - for (j = guess; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > maxDate) { - dataContainer.push(item); - break; - } - else { - dataContainer.push(item); - } - } - } - } - else { - for (j = 0; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > minDate && item.x < maxDate) { - dataContainer.push(item); - } - } - } - } - } + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.options.radius); + ctx.stroke(); } - }; + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.options.color.background; - /** - * - * @param groupIds - * @param groupsData - * @private - */ - LineGraph.prototype._applySampling = function (groupIds, groupsData) { - var group; - if (groupIds.length > 0) { - for (var i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.sampling == true) { - var dataContainer = groupsData[groupIds[i]]; - if (dataContainer.length > 0) { - var increment = 1; - var amountOfPoints = dataContainer.length; + ctx.roundRect(this.left, this.top, this.width, this.height, this.options.radius); + ctx.fill(); + ctx.stroke(); - // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop - // of width changing of the yAxis. - var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); - var pointsPerPixel = amountOfPoints / xDistance; - increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); + this._label(ctx, this.label, this.x, this.y); + }; - var sampledData = []; - for (var j = 0; j < amountOfPoints; j += increment) { - sampledData.push(dataContainer[j]); - } - groupsData[groupIds[i]] = sampledData; - } - } - } + Node.prototype._resizeDatabase = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var size = textSize.width + 2 * margin; + this.width = size; + this.height = size; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; } }; + Node.prototype._drawDatabase = function (ctx) { + this._resizeDatabase(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - /** - * - * - * @param {array} groupIds - * @param {object} groupsData - * @param {object} groupRanges | this is being filled here - * @private - */ - LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { - var groupData, group, i; - var barCombinedDataLeft = []; - var barCombinedDataRight = []; - var options; - if (groupIds.length > 0) { - for (i = 0; i < groupIds.length; i++) { - groupData = groupsData[groupIds[i]]; - options = this.groups[groupIds[i]].options; - if (groupData.length > 0) { - group = this.groups[groupIds[i]]; - // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. - if (options.barChart.handleOverlap == 'stack' && options.style == 'bar') { - if (options.yAxisOrientation == 'left') {barCombinedDataLeft = barCombinedDataLeft.concat(group.getYRange(groupData)) ;} - else {barCombinedDataRight = barCombinedDataRight.concat(group.getYRange(groupData));} - } - else { - groupRanges[groupIds[i]] = group.getYRange(groupData,groupIds[i]); - } - } - } + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. - BarGraphFunctions.getStackedBarYRange(barCombinedDataLeft , groupRanges, groupIds, '__barchartLeft' , 'left' ); - BarGraphFunctions.getStackedBarYRange(barCombinedDataRight, groupRanges, groupIds, '__barchartRight', 'right'); + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); + ctx.stroke(); } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); + ctx.fill(); + ctx.stroke(); + + this._label(ctx, this.label, this.x, this.y); }; - /** - * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. - * @param {Array} groupIds - * @param {Object} groupRanges - * @private - */ - LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { - var changeCalled = false; - var yAxisLeftUsed = false; - var yAxisRightUsed = false; - var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; - // if groups are present - if (groupIds.length > 0) { - for (var i = 0; i < groupIds.length; i++) { - if (groupRanges.hasOwnProperty(groupIds[i])) { - if (groupRanges[groupIds[i]].ignore !== true) { - minVal = groupRanges[groupIds[i]].min; - maxVal = groupRanges[groupIds[i]].max; + Node.prototype._resizeCircle = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; + this.options.radius = diameter / 2; - if (groupRanges[groupIds[i]].yAxisOrientation == 'left') { - yAxisLeftUsed = true; - minLeft = minLeft > minVal ? minVal : minLeft; - maxLeft = maxLeft < maxVal ? maxVal : maxLeft; - } - else { - yAxisRightUsed = true; - minRight = minRight > minVal ? minVal : minRight; - maxRight = maxRight < maxVal ? maxVal : maxRight; - } - } - } - } + this.width = diameter; + this.height = diameter; - if (yAxisLeftUsed == true) { - this.yAxisLeft.setRange(minLeft, maxLeft); - } - if (yAxisRightUsed == true) { - this.yAxisRight.setRange(minRight, maxRight); - } + // scaling used for clustering + // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.options.radius- 0.5*diameter; } + }; - changeCalled = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || changeCalled; - changeCalled = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || changeCalled; + Node.prototype._drawCircle = function (ctx) { + this._resizeCircle(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - if (yAxisRightUsed == true && yAxisLeftUsed == true) { - this.yAxisLeft.drawIcons = true; - this.yAxisRight.drawIcons = true; - } - else { - this.yAxisLeft.drawIcons = false; - this.yAxisRight.drawIcons = false; - } + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - this.yAxisRight.master = !yAxisLeftUsed; + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - if (this.yAxisRight.master == false) { - if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} - else {this.yAxisLeft.lineOffset = 0;} + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - changeCalled = this.yAxisLeft.redraw() || changeCalled; - this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; - this.yAxisRight.zeroCrossing = this.yAxisLeft.zeroCrossing; - changeCalled = this.yAxisRight.redraw() || changeCalled; - } - else { - changeCalled = this.yAxisRight.redraw() || changeCalled; + ctx.circle(this.x, this.y, this.options.radius+2*ctx.lineWidth); + ctx.stroke(); } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - // clean the accumulated lists - if (groupIds.indexOf('__barchartLeft') != -1) { - groupIds.splice(groupIds.indexOf('__barchartLeft'),1); - } - if (groupIds.indexOf('__barchartRight') != -1) { - groupIds.splice(groupIds.indexOf('__barchartRight'),1); - } + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx.circle(this.x, this.y, this.options.radius); + ctx.fill(); + ctx.stroke(); - return changeCalled; + this._label(ctx, this.label, this.x, this.y); }; + Node.prototype._resizeEllipse = function (ctx) { + if (!this.width) { + var textSize = this.getTextSize(ctx); - /** - * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function - * - * @param {boolean} axisUsed - * @returns {boolean} - * @private - * @param axis - */ - LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { - var changed = false; - if (axisUsed == false) { - if (axis.dom.frame.parentNode) { - axis.hide(); - changed = true; - } - } - else { - if (!axis.dom.frame.parentNode) { - axis.show(); - changed = true; + this.width = textSize.width * 1.5; + this.height = textSize.height * 2; + if (this.width < this.height) { + this.width = this.height; } + var defaultSize = this.width; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - defaultSize; } - return changed; }; + Node.prototype._drawEllipse = function (ctx) { + this._resizeEllipse(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the - * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for - * the yAxis. - * - * @param datapoints - * @returns {Array} - * @private - */ - LineGraph.prototype._convertXcoordinates = function (datapoints) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.width; - yValue = datapoints[i].y; - extractedData.push({x: xValue, y: yValue}); + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); + ctx.stroke(); } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - return extractedData; + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + + ctx.ellipse(this.left, this.top, this.width, this.height); + ctx.fill(); + ctx.stroke(); + this._label(ctx, this.label, this.x, this.y); }; + Node.prototype._drawDot = function (ctx) { + this._drawShape(ctx, 'circle'); + }; - /** - * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the - * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for - * the yAxis. - * - * @param datapoints - * @param group - * @returns {Array} - * @private - */ - LineGraph.prototype._convertYcoordinates = function (datapoints, group) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; - var axis = this.yAxisLeft; - var svgHeight = Number(this.svg.style.height.replace('px','')); - if (group.options.yAxisOrientation == 'right') { - axis = this.yAxisRight; - } + Node.prototype._drawTriangle = function (ctx) { + this._drawShape(ctx, 'triangle'); + }; - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.width; - yValue = Math.round(axis.convertValue(datapoints[i].y)); - extractedData.push({x: xValue, y: yValue}); - } + Node.prototype._drawTriangleDown = function (ctx) { + this._drawShape(ctx, 'triangleDown'); + }; - group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); + Node.prototype._drawSquare = function (ctx) { + this._drawShape(ctx, 'square'); + }; - return extractedData; + Node.prototype._drawStar = function (ctx) { + this._drawShape(ctx, 'star'); }; + Node.prototype._resizeShape = function (ctx) { + if (!this.width) { + this.options.radius= this.baseRadiusValue; + var size = 2 * this.options.radius; + this.width = size; + this.height = size; - module.exports = LineGraph; + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; + } + }; + Node.prototype._drawShape = function (ctx, shape) { + this._resizeShape(ctx); -/***/ }, -/* 44 */ -/***/ function(module, exports, __webpack_require__) { + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - var Component = __webpack_require__(23); - var DataStep = __webpack_require__(45); + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var radiusMultiplier = 2; - /** - * A horizontal time axis - * @param {Object} [options] See DataAxis.setOptions for the available - * options. - * @constructor DataAxis - * @extends Component - * @param body - */ - function DataAxis (body, options, svg, linegraphOptions) { - this.id = util.randomUUID(); - this.body = body; + // choose draw method depending on the shape + switch (shape) { + case 'dot': radiusMultiplier = 2; break; + case 'square': radiusMultiplier = 2; break; + case 'triangle': radiusMultiplier = 3; break; + case 'triangleDown': radiusMultiplier = 3; break; + case 'star': radiusMultiplier = 4; break; + } - this.defaultOptions = { - orientation: 'left', // supported: 'left', 'right' - showMinorLabels: true, - showMajorLabels: true, - icons: true, - majorLinesOffset: 7, - minorLinesOffset: 4, - labelOffsetX: 10, - labelOffsetY: 2, - iconWidth: 20, - width: '40px', - visible: true, - alignZeros: true, - customRange: { - left: {min:undefined, max:undefined}, - right: {min:undefined, max:undefined} - }, - title: { - left: {text:undefined}, - right: {text:undefined} - }, - format: { - left: {decimals: undefined}, - right: {decimals: undefined} - } - }; + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - this.linegraphOptions = linegraphOptions; - this.linegraphSVG = svg; - this.props = {}; - this.DOMelements = { // dynamic elements - lines: {}, - labels: {}, - title: {} - }; + ctx[shape](this.x, this.y, this.options.radius+ radiusMultiplier * ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - this.dom = {}; + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx[shape](this.x, this.y, this.options.radius); + ctx.fill(); + ctx.stroke(); - this.range = {start:0, end:0}; + if (this.label) { + this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'top',true); + } + }; - this.options = util.extend({}, this.defaultOptions); - this.conversionFactor = 1; + Node.prototype._resizeText = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; - this.setOptions(options); - this.width = Number(('' + this.options.width).replace("px","")); - this.minWidth = this.width; - this.height = this.linegraphSVG.offsetHeight; + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + } + }; - this.stepPixels = 25; - this.stepPixelsForced = 25; - this.zeroCrossing = -1; + Node.prototype._drawText = function (ctx) { + this._resizeText(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - this.lineOffset = 0; - this.master = true; - this.svgElements = {}; - this.iconsRemoved = false; + this._label(ctx, this.label, this.x, this.y); + }; - this.groups = {}; - this.amountOfGroups = 0; + Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { + if (text && Number(this.options.fontSize) * this.networkScale > this.fontDrawThreshold) { + ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; - // create the HTML DOM - this._create(); + var lines = text.split('\n'); + var lineCount = lines.length; + var fontSize = (Number(this.options.fontSize) + 4); // TODO: why is this +4 ? + var yLine = y + (1 - lineCount) / 2 * fontSize; + if (labelUnderNode == true) { + yLine = y + (1 - lineCount) / (2 * fontSize); + } + + // font fill from edges now for nodes! + var width = ctx.measureText(lines[0]).width; + for (var i = 1; i < lineCount; i++) { + var lineWidth = ctx.measureText(lines[i]).width; + width = lineWidth > width ? lineWidth : width; + } + var height = this.options.fontSize * lineCount; + var left = x - width / 2; + var top = y - height / 2; + if (baseline == "top") { + top += 0.5 * fontSize; + } + this.labelDimensions = {top:top,left:left,width:width,height:height,yLine:yLine}; + + // create the fontfill background + if (this.options.fontFill !== undefined && this.options.fontFill !== null && this.options.fontFill !== "none") { + ctx.fillStyle = this.options.fontFill; + ctx.fillRect(left, top, width, height); + } + + // draw text + ctx.fillStyle = this.options.fontColor || "black"; + ctx.textAlign = align || "center"; + ctx.textBaseline = baseline || "middle"; + for (var i = 0; i < lineCount; i++) { + ctx.fillText(lines[i], x, yLine); + yLine += fontSize; + } + } + }; - var me = this; - this.body.emitter.on("verticalDrag", function() { - me.dom.lineContainer.style.top = me.body.domProps.scrollTop + 'px'; - }); - } - DataAxis.prototype = new Component(); + Node.prototype.getTextSize = function(ctx) { + if (this.label !== undefined) { + ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; + var lines = this.label.split('\n'), + height = (Number(this.options.fontSize) + 4) * lines.length, + width = 0; + for (var i = 0, iMax = lines.length; i < iMax; i++) { + width = Math.max(width, ctx.measureText(lines[i]).width); + } - DataAxis.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; + return {"width": width, "height": height}; + } + else { + return {"width": 0, "height": 0}; } - this.amountOfGroups += 1; - }; - - DataAxis.prototype.updateGroup = function(label, graphOptions) { - this.groups[label] = graphOptions; }; - DataAxis.prototype.removeGroup = function(label) { - if (this.groups.hasOwnProperty(label)) { - delete this.groups[label]; - this.amountOfGroups -= 1; + /** + * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. + * there is a safety margin of 0.3 * width; + * + * @returns {boolean} + */ + Node.prototype.inArea = function() { + if (this.width !== undefined) { + return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && + this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && + this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && + this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); + } + else { + return true; } }; + /** + * checks if the core of the node is in the display area, this is used for opening clusters around zoom + * @returns {boolean} + */ + Node.prototype.inView = function() { + return (this.x >= this.canvasTopLeft.x && + this.x < this.canvasBottomRight.x && + this.y >= this.canvasTopLeft.y && + this.y < this.canvasBottomRight.y); + }; - DataAxis.prototype.setOptions = function (options) { - if (options) { - var redraw = false; - if (this.options.orientation != options.orientation && options.orientation !== undefined) { - redraw = true; - } - var fields = [ - 'orientation', - 'showMinorLabels', - 'showMajorLabels', - 'icons', - 'majorLinesOffset', - 'minorLinesOffset', - 'labelOffsetX', - 'labelOffsetY', - 'iconWidth', - 'width', - 'visible', - 'customRange', - 'title', - 'format', - 'alignZeros' - ]; - util.selectiveExtend(fields, this.options, options); + /** + * This allows the zoom level of the network to influence the rendering + * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas + * + * @param scale + * @param canvasTopLeft + * @param canvasBottomRight + */ + Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + this.canvasTopLeft = canvasTopLeft; + this.canvasBottomRight = canvasBottomRight; + }; - this.minWidth = Number(('' + this.options.width).replace("px","")); - if (redraw == true && this.dom.frame) { - this.hide(); - this.show(); - } - } + /** + * This allows the zoom level of the network to influence the rendering + * + * @param scale + */ + Node.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; }; + /** - * Create the HTML DOM for the DataAxis + * set the velocity at 0. Is called when this node is contained in another during clustering */ - DataAxis.prototype._create = function() { - this.dom.frame = document.createElement('div'); - this.dom.frame.style.width = this.options.width; - this.dom.frame.style.height = this.height; + Node.prototype.clearVelocity = function() { + this.vx = 0; + this.vy = 0; + }; - this.dom.lineContainer = document.createElement('div'); - this.dom.lineContainer.style.width = '100%'; - this.dom.lineContainer.style.height = this.height; - this.dom.lineContainer.style.position = 'relative'; - // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = "absolute"; - this.svg.style.top = '0px'; - this.svg.style.height = '100%'; - this.svg.style.width = '100%'; - this.svg.style.display = "block"; - this.dom.frame.appendChild(this.svg); + /** + * Basic preservation of (kinectic) energy + * + * @param massBeforeClustering + */ + Node.prototype.updateVelocity = function(massBeforeClustering) { + var energyBefore = this.vx * this.vx * massBeforeClustering; + //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); + this.vx = Math.sqrt(energyBefore/this.options.mass); + energyBefore = this.vy * this.vy * massBeforeClustering; + //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); + this.vy = Math.sqrt(energyBefore/this.options.mass); }; - DataAxis.prototype._redrawGroupIcons = function () { - DOMutil.prepareElements(this.svgElements); + module.exports = Node; - var x; - var iconWidth = this.options.iconWidth; - var iconHeight = 15; - var iconOffset = 4; - var y = iconOffset + 0.5 * iconHeight; - if (this.options.orientation == 'left') { - x = iconOffset; +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Popup is a class to create a popup window with some text + * @param {Element} container The container object. + * @param {Number} [x] + * @param {Number} [y] + * @param {String} [text] + * @param {Object} [style] An object containing borderColor, + * backgroundColor, etc. + */ + function Popup(container, x, y, text, style) { + if (container) { + this.container = container; } else { - x = this.width - iconWidth - iconOffset; + this.container = document.body; } - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); - y += iconHeight + iconOffset; + // x, y and text are optional, see if a style object was passed in their place + if (style === undefined) { + if (typeof x === "object") { + style = x; + x = undefined; + } else if (typeof text === "object") { + style = text; + text = undefined; + } else { + // for backwards compatibility, in case clients other than Network are creating Popup directly + style = { + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' + } } } } - DOMutil.cleanupElements(this.svgElements); - this.iconsRemoved = false; - }; + this.x = 0; + this.y = 0; + this.padding = 5; - DataAxis.prototype._cleanupIcons = function() { - if (this.iconsRemoved == false) { - DOMutil.prepareElements(this.svgElements); - DOMutil.cleanupElements(this.svgElements); - this.iconsRemoved = true; + if (x !== undefined && y !== undefined ) { + this.setPosition(x, y); + } + if (text !== undefined) { + this.setText(text); } + + // create the frame + this.frame = document.createElement("div"); + var styleAttr = this.frame.style; + styleAttr.position = "absolute"; + styleAttr.visibility = "hidden"; + styleAttr.border = "1px solid " + style.color.border; + styleAttr.color = style.fontColor; + styleAttr.fontSize = style.fontSize + "px"; + styleAttr.fontFamily = style.fontFace; + styleAttr.padding = this.padding + "px"; + styleAttr.backgroundColor = style.color.background; + styleAttr.borderRadius = "3px"; + styleAttr.MozBorderRadius = "3px"; + styleAttr.WebkitBorderRadius = "3px"; + styleAttr.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; + styleAttr.whiteSpace = "nowrap"; + this.container.appendChild(this.frame); } /** - * Create the HTML DOM for the DataAxis + * @param {number} x Horizontal position of the popup window + * @param {number} y Vertical position of the popup window */ - DataAxis.prototype.show = function() { - if (!this.dom.frame.parentNode) { - if (this.options.orientation == 'left') { - this.body.dom.left.appendChild(this.dom.frame); - } - else { - this.body.dom.right.appendChild(this.dom.frame); - } - } + Popup.prototype.setPosition = function(x, y) { + this.x = parseInt(x); + this.y = parseInt(y); + }; - if (!this.dom.lineContainer.parentNode) { - this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); + /** + * Set the content for the popup window. This can be HTML code or text. + * @param {string | Element} content + */ + Popup.prototype.setText = function(content) { + if (content instanceof Element) { + this.frame.innerHTML = ''; + this.frame.appendChild(content); + } + else { + this.frame.innerHTML = content; // string containing text or HTML } }; /** - * Create the HTML DOM for the DataAxis + * Show the popup window + * @param {boolean} show Optional. Show or hide the window */ - DataAxis.prototype.hide = function() { - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); + Popup.prototype.show = function (show) { + if (show === undefined) { + show = true; } - if (this.dom.lineContainer.parentNode) { - this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); + if (show) { + var height = this.frame.clientHeight; + var width = this.frame.clientWidth; + var maxHeight = this.frame.parentNode.clientHeight; + var maxWidth = this.frame.parentNode.clientWidth; + + var top = (this.y - height); + if (top + height + this.padding > maxHeight) { + top = maxHeight - height - this.padding; + } + if (top < this.padding) { + top = this.padding; + } + + var left = this.x; + if (left + width + this.padding > maxWidth) { + left = maxWidth - width - this.padding; + } + if (left < this.padding) { + left = this.padding; + } + + this.frame.style.left = left + "px"; + this.frame.style.top = top + "px"; + this.frame.style.visibility = "visible"; + } + else { + this.hide(); } }; /** - * Set a range (start and end) - * @param end - * @param start - * @param end + * Hide the popup window */ - DataAxis.prototype.setRange = function (start, end) { - if (this.master == false && this.options.alignZeros == true && this.zeroCrossing != -1) { - if (start > 0) { - start = 0; - } - } - this.range.start = start; - this.range.end = end; + Popup.prototype.hide = function () { + this.frame.style.visibility = "hidden"; }; + module.exports = Popup; + + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Parse a text source containing data in DOT language into a JSON object. + * The object contains two lists: one with nodes and one with edges. + * + * DOT language reference: http://www.graphviz.org/doc/info/lang.html + * + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graph An object containing two parameters: + * {Object[]} nodes + * {Object[]} edges */ - DataAxis.prototype.redraw = function () { - var changeCalled = false; - var activeGroups = 0; - - // Make sure the line container adheres to the vertical scrolling. - this.dom.lineContainer.style.top = this.body.domProps.scrollTop + 'px'; + function parseDOT (data) { + dot = data; + return parseGraph(); + } - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - activeGroups++; - } - } - } - if (this.amountOfGroups == 0 || activeGroups == 0) { - this.hide(); - } - else { - this.show(); - this.height = Number(this.linegraphSVG.style.height.replace("px","")); + // token types enumeration + var TOKENTYPE = { + NULL : 0, + DELIMITER : 1, + IDENTIFIER: 2, + UNKNOWN : 3 + }; - // svg offsetheight did not work in firefox and explorer... - this.dom.lineContainer.style.height = this.height + 'px'; - this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; + // map with all delimiters + var DELIMITERS = { + '{': true, + '}': true, + '[': true, + ']': true, + ';': true, + '=': true, + ',': true, - var props = this.props; - var frame = this.dom.frame; + '->': true, + '--': true + }; - // update classname - frame.className = 'dataaxis'; + var dot = ''; // current dot file + var index = 0; // current index in dot file + var c = ''; // current token character in expr + var token = ''; // current token + var tokenType = TOKENTYPE.NULL; // type of the token - // calculate character width and height - this._calculateCharSize(); + /** + * Get the first character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function first() { + index = 0; + c = dot.charAt(0); + } - var orientation = this.options.orientation; - var showMinorLabels = this.options.showMinorLabels; - var showMajorLabels = this.options.showMajorLabels; + /** + * Get the next character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function next() { + index++; + c = dot.charAt(index); + } - // determine the width and height of the elements for the axis - props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; - props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + /** + * Preview the next character from the dot file. + * @return {String} cNext + */ + function nextPreview() { + return dot.charAt(index + 1); + } - props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; - props.minorLineHeight = 1; - props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; - props.majorLineHeight = 1; + /** + * Test whether given character is alphabetic or numeric + * @param {String} c + * @return {Boolean} isAlphaNumeric + */ + var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; + function isAlphaNumeric(c) { + return regexAlphaNumeric.test(c); + } - // take frame offline while updating (is almost twice as fast) - if (orientation == 'left') { - frame.style.top = '0'; - frame.style.left = '0'; - frame.style.bottom = ''; - frame.style.width = this.width + 'px'; - frame.style.height = this.height + "px"; + /** + * Merge all properties of object b into object b + * @param {Object} a + * @param {Object} b + * @return {Object} a + */ + function merge (a, b) { + if (!a) { + a = {}; + } + + if (b) { + for (var name in b) { + if (b.hasOwnProperty(name)) { + a[name] = b[name]; + } + } + } + return a; + } + + /** + * Set a value in an object, where the provided parameter name can be a + * path with nested parameters. For example: + * + * var obj = {a: 2}; + * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} + * + * @param {Object} obj + * @param {String} path A parameter name or dot-separated parameter path, + * like "color.highlight.border". + * @param {*} value + */ + function setValue(obj, path, value) { + var keys = path.split('.'); + var o = obj; + while (keys.length) { + var key = keys.shift(); + if (keys.length) { + // this isn't the end point + if (!o[key]) { + o[key] = {}; + } + o = o[key]; + } + else { + // this is the end point + o[key] = value; + } + } + } + + /** + * Add a node to a graph object. If there is already a node with + * the same id, their attributes will be merged. + * @param {Object} graph + * @param {Object} node + */ + function addNode(graph, node) { + var i, len; + var current = null; + + // find root graph (in case of subgraph) + var graphs = [graph]; // list with all graphs from current graph to root graph + var root = graph; + while (root.parent) { + graphs.push(root.parent); + root = root.parent; + } + + // find existing node (at root level) by its id + if (root.nodes) { + for (i = 0, len = root.nodes.length; i < len; i++) { + if (node.id === root.nodes[i].id) { + current = root.nodes[i]; + break; + } } - else { // right - frame.style.top = ''; - frame.style.bottom = '0'; - frame.style.left = '0'; - frame.style.width = this.width + 'px'; - frame.style.height = this.height + "px"; + } + + if (!current) { + // this is a new node + current = { + id: node.id + }; + if (graph.node) { + // clone default attributes + current.attr = merge(current.attr, graph.node); } - changeCalled = this._redrawLabels(); + } - if (this.options.icons == true) { - this._redrawGroupIcons(); + // add node to this (sub)graph and all its parent graphs + for (i = graphs.length - 1; i >= 0; i--) { + var g = graphs[i]; + + if (!g.nodes) { + g.nodes = []; } - else { - this._cleanupIcons(); + if (g.nodes.indexOf(current) == -1) { + g.nodes.push(current); } + } - this._redrawTitle(orientation); + // merge attributes + if (node.attr) { + current.attr = merge(current.attr, node.attr); } - return changeCalled; - }; + } /** - * Repaint major and minor text labels and vertical grid lines - * @private + * Add an edge to a graph object + * @param {Object} graph + * @param {Object} edge */ - DataAxis.prototype._redrawLabels = function () { - DOMutil.prepareElements(this.DOMelements.lines); - DOMutil.prepareElements(this.DOMelements.labels); + function addEdge(graph, edge) { + if (!graph.edges) { + graph.edges = []; + } + graph.edges.push(edge); + if (graph.edge) { + var attr = merge({}, graph.edge); // clone default attributes + edge.attr = merge(attr, edge.attr); // merge attributes + } + } - var orientation = this.options['orientation']; + /** + * Create an edge to a graph object + * @param {Object} graph + * @param {String | Number | Object} from + * @param {String | Number | Object} to + * @param {String} type + * @param {Object | null} attr + * @return {Object} edge + */ + function createEdge(graph, from, to, type, attr) { + var edge = { + from: from, + to: to, + type: type + }; - // calculate range and step (step such that we have space for 7 characters per label) - var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; + if (graph.edge) { + edge.attr = merge({}, graph.edge); // clone default attributes + } + edge.attr = merge(edge.attr || {}, attr); // merge attributes - var step = new DataStep( - this.range.start, - this.range.end, - minimumStep, - this.dom.frame.offsetHeight, - this.options.customRange[this.options.orientation], - this.master == false && this.options.alignZeros // doess the step have to align zeros? only if not master and the options is on - ); + return edge; + } - this.step = step; - // get the distance in pixels for a step - // dead space is space that is "left over" after a step - var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); + /** + * Get next token in the current dot file. + * The token and token type are available as token and tokenType + */ + function getToken() { + tokenType = TOKENTYPE.NULL; + token = ''; - this.stepPixels = stepPixels; + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); + } - var amountOfSteps = this.height / stepPixels; - var stepDifference = 0; + do { + var isComment = false; - // the slave axis needs to use the same horizontal lines as the master axis. - if (this.master == false) { - stepPixels = this.stepPixelsForced; - stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); - for (var i = 0; i < 0.5 * stepDifference; i++) { - step.previous(); + // skip comment + if (c == '#') { + // find the previous non-space character + var i = index - 1; + while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { + i--; + } + if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { + // the # is at the start of a line, this is indeed a line comment + while (c != '' && c != '\n') { + next(); + } + isComment = true; + } } - amountOfSteps = this.height / stepPixels; - - if (this.zeroCrossing != -1 && this.options.alignZeros == true) { - var zeroStepDifference = (step.marginEnd / step.step) - this.zeroCrossing; - if (zeroStepDifference > 0) { - for (var i = 0; i < zeroStepDifference; i++) {step.next();} + if (c == '/' && nextPreview() == '/') { + // skip line comment + while (c != '' && c != '\n') { + next(); } - else if (zeroStepDifference < 0) { - for (var i = 0; i < -zeroStepDifference; i++) {step.previous();} + isComment = true; + } + if (c == '/' && nextPreview() == '*') { + // skip block comment + while (c != '') { + if (c == '*' && nextPreview() == '/') { + // end of block comment found. skip these last two characters + next(); + next(); + break; + } + else { + next(); + } } + isComment = true; } - } - else { - amountOfSteps += 0.25; - } + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); + } + } + while (isComment); - this.valueAtZero = step.marginEnd; - var marginStartPos = 0; + // check for end of dot file + if (c == '') { + // token is still empty + tokenType = TOKENTYPE.DELIMITER; + return; + } - // do not draw the first label - var max = 1; + // check for delimiters consisting of 2 characters + var c2 = c + nextPreview(); + if (DELIMITERS[c2]) { + tokenType = TOKENTYPE.DELIMITER; + token = c2; + next(); + next(); + return; + } - // Get the number of decimal places - var decimals; - if(this.options.format[orientation] !== undefined) { - decimals = this.options.format[orientation].decimals; + // check for delimiters consisting of 1 character + if (DELIMITERS[c]) { + tokenType = TOKENTYPE.DELIMITER; + token = c; + next(); + return; } - this.maxLabelSize = 0; - var y = 0; - while (max < Math.round(amountOfSteps)) { - step.next(); - y = Math.round(max * stepPixels); - marginStartPos = max * stepPixels; - var isMajor = step.isMajor(); + // check for an identifier (number or string) + // TODO: more precise parsing of numbers/strings (and the port separator ':') + if (isAlphaNumeric(c) || c == '-') { + token += c; + next(); - if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { - this._redrawLabel(y - 2, step.getCurrent(decimals), orientation, 'yAxis minor', this.props.minorCharHeight); + while (isAlphaNumeric(c)) { + token += c; + next(); } - - if (isMajor && this.options['showMajorLabels'] && this.master == true || - this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { - if (y >= 0) { - this._redrawLabel(y - 2, step.getCurrent(decimals), orientation, 'yAxis major', this.props.majorCharHeight); - } - this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); + if (token == 'false') { + token = false; // convert to boolean } - else { - this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); + else if (token == 'true') { + token = true; // convert to boolean + } + else if (!isNaN(Number(token))) { + token = Number(token); // convert to number } + tokenType = TOKENTYPE.IDENTIFIER; + return; + } - if (this.master == true && step.current == 0) { - this.zeroCrossing = max; + // check for a string enclosed by double quotes + if (c == '"') { + next(); + while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { + token += c; + if (c == '"') { // skip the escape character + next(); + } + next(); + } + if (c != '"') { + throw newSyntaxError('End of string " expected'); } + next(); + tokenType = TOKENTYPE.IDENTIFIER; + return; + } - max++; + // something unknown is found, wrong characters, a syntax error + tokenType = TOKENTYPE.UNKNOWN; + while (c != '') { + token += c; + next(); } + throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); + } - if (this.master == false) { - this.conversionFactor = y / (this.valueAtZero - step.current); + /** + * Parse a graph. + * @returns {Object} graph + */ + function parseGraph() { + var graph = {}; + + first(); + getToken(); + + // optional strict keyword + if (token == 'strict') { + graph.strict = true; + getToken(); } - else { - this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; + + // graph or digraph keyword + if (token == 'graph' || token == 'digraph') { + graph.type = token; + getToken(); } - // Note that title is rotated, so we're using the height, not width! - var titleWidth = 0; - if (this.options.title[orientation] !== undefined && this.options.title[orientation].text !== undefined) { - titleWidth = this.props.titleCharHeight; + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + graph.id = token; + getToken(); } - var offset = this.options.icons == true ? Math.max(this.options.iconWidth, titleWidth) + this.options.labelOffsetX + 15 : titleWidth + this.options.labelOffsetX + 15; - // this will resize the yAxis to accommodate the labels. - if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { - this.width = this.maxLabelSize + offset; - this.options.width = this.width + "px"; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - return true; + // open angle bracket + if (token != '{') { + throw newSyntaxError('Angle bracket { expected'); } - // this will resize the yAxis if it is too big for the labels. - else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { - this.width = Math.max(this.minWidth,this.maxLabelSize + offset); - this.options.width = this.width + "px"; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - return true; + getToken(); + + // statements + parseStatements(graph); + + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); } - else { - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - return false; + getToken(); + + // end of file + if (token !== '') { + throw newSyntaxError('End of file expected'); } - }; + getToken(); - DataAxis.prototype.convertValue = function (value) { - var invertedValue = this.valueAtZero - value; - var convertedValue = invertedValue * this.conversionFactor; - return convertedValue; - }; + // remove temporary default properties + delete graph.node; + delete graph.edge; + delete graph.graph; + + return graph; + } /** - * Create a label for the axis at position x - * @private - * @param y - * @param text - * @param orientation - * @param className - * @param characterHeight + * Parse a list with statements. + * @param {Object} graph */ - DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { - // reuse redundant label - var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); - label.className = className; - label.innerHTML = text; - if (orientation == 'left') { - label.style.left = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = "right"; - } - else { - label.style.right = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = "left"; + function parseStatements (graph) { + while (token !== '' && token != '}') { + parseStatement(graph); + if (token == ';') { + getToken(); + } } + } - label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; + /** + * Parse a single statement. Can be a an attribute statement, node + * statement, a series of node statements and edge statements, or a + * parameter. + * @param {Object} graph + */ + function parseStatement(graph) { + // parse subgraph + var subgraph = parseSubgraph(graph); + if (subgraph) { + // edge statements + parseEdge(graph, subgraph); - text += ''; + return; + } - var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); - if (this.maxLabelSize < text.length * largestWidth) { - this.maxLabelSize = text.length * largestWidth; + // parse an attribute statement + var attr = parseAttributeStatement(graph); + if (attr) { + return; } - }; - /** - * Create a minor line for the axis at position y - * @param y - * @param orientation - * @param className - * @param offset - * @param width - */ - DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { - if (this.master == true) { - var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); - line.className = className; - line.innerHTML = ''; + // parse node + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); + } + var id = token; // id can be a string or a number + getToken(); - if (orientation == 'left') { - line.style.left = (this.width - offset) + 'px'; - } - else { - line.style.right = (this.width - offset) + 'px'; + if (token == '=') { + // id statement + getToken(); + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); } - - line.style.width = width + 'px'; - line.style.top = y + 'px'; + graph[id] = token; + getToken(); + // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " } - }; + else { + parseNodeStatement(graph, id); + } + } /** - * Create a title for the axis - * @private - * @param orientation + * Parse a subgraph + * @param {Object} graph parent graph object + * @return {Object | null} subgraph */ - DataAxis.prototype._redrawTitle = function (orientation) { - DOMutil.prepareElements(this.DOMelements.title); - - // Check if the title is defined for this axes - if (this.options.title[orientation] !== undefined && this.options.title[orientation].text !== undefined) { - var title = DOMutil.getDOMElement('div', this.DOMelements.title, this.dom.frame); - title.className = 'yAxis title ' + orientation; - title.innerHTML = this.options.title[orientation].text; + function parseSubgraph (graph) { + var subgraph = null; - // Add style - if provided - if (this.options.title[orientation].style !== undefined) { - util.addCssText(title, this.options.title[orientation].style); - } + // optional subgraph keyword + if (token == 'subgraph') { + subgraph = {}; + subgraph.type = 'subgraph'; + getToken(); - if (orientation == 'left') { - title.style.left = this.props.titleCharHeight + 'px'; - } - else { - title.style.right = this.props.titleCharHeight + 'px'; + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + subgraph.id = token; + getToken(); } - - title.style.width = this.height + 'px'; } - // we need to clean up in case we did not use all elements. - DOMutil.cleanupElements(this.DOMelements.title); - }; - + // open angle bracket + if (token == '{') { + getToken(); + if (!subgraph) { + subgraph = {}; + } + subgraph.parent = graph; + subgraph.node = graph.node; + subgraph.edge = graph.edge; + subgraph.graph = graph.graph; + // statements + parseStatements(subgraph); - /** - * Determine the size of text on the axis (both major and minor axis). - * The size is calculated only once and then cached in this.props. - * @private - */ - DataAxis.prototype._calculateCharSize = function () { - // determine the char width and height on the minor axis - if (!('minorCharHeight' in this.props)) { - var textMinor = document.createTextNode('0'); - var measureCharMinor = document.createElement('div'); - measureCharMinor.className = 'yAxis minor measure'; - measureCharMinor.appendChild(textMinor); - this.dom.frame.appendChild(measureCharMinor); + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); - this.props.minorCharHeight = measureCharMinor.clientHeight; - this.props.minorCharWidth = measureCharMinor.clientWidth; + // remove temporary default properties + delete subgraph.node; + delete subgraph.edge; + delete subgraph.graph; + delete subgraph.parent; - this.dom.frame.removeChild(measureCharMinor); + // register at the parent graph + if (!graph.subgraphs) { + graph.subgraphs = []; + } + graph.subgraphs.push(subgraph); } - if (!('majorCharHeight' in this.props)) { - var textMajor = document.createTextNode('0'); - var measureCharMajor = document.createElement('div'); - measureCharMajor.className = 'yAxis major measure'; - measureCharMajor.appendChild(textMajor); - this.dom.frame.appendChild(measureCharMajor); + return subgraph; + } - this.props.majorCharHeight = measureCharMajor.clientHeight; - this.props.majorCharWidth = measureCharMajor.clientWidth; + /** + * parse an attribute statement like "node [shape=circle fontSize=16]". + * Available keywords are 'node', 'edge', 'graph'. + * The previous list with default attributes will be replaced + * @param {Object} graph + * @returns {String | null} keyword Returns the name of the parsed attribute + * (node, edge, graph), or null if nothing + * is parsed. + */ + function parseAttributeStatement (graph) { + // attribute statements + if (token == 'node') { + getToken(); - this.dom.frame.removeChild(measureCharMajor); + // node attributes + graph.node = parseAttributeList(); + return 'node'; } + else if (token == 'edge') { + getToken(); - if (!('titleCharHeight' in this.props)) { - var textTitle = document.createTextNode('0'); - var measureCharTitle = document.createElement('div'); - measureCharTitle.className = 'yAxis title measure'; - measureCharTitle.appendChild(textTitle); - this.dom.frame.appendChild(measureCharTitle); - - this.props.titleCharHeight = measureCharTitle.clientHeight; - this.props.titleCharWidth = measureCharTitle.clientWidth; + // edge attributes + graph.edge = parseAttributeList(); + return 'edge'; + } + else if (token == 'graph') { + getToken(); - this.dom.frame.removeChild(measureCharTitle); + // graph attributes + graph.graph = parseAttributeList(); + return 'graph'; } - }; + + return null; + } /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * parse a node statement + * @param {Object} graph + * @param {String | Number} id */ - DataAxis.prototype.snap = function(date) { - return this.step.snap(date); - }; - - module.exports = DataAxis; - + function parseNodeStatement(graph, id) { + // node statement + var node = { + id: id + }; + var attr = parseAttributeList(); + if (attr) { + node.attr = attr; + } + addNode(graph, node); -/***/ }, -/* 45 */ -/***/ function(module, exports, __webpack_require__) { + // edge statements + parseEdge(graph, id); + } /** - * @constructor DataStep - * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an - * end data point. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * Parse an edge or a series of edges + * @param {Object} graph + * @param {String | Number} from Id of the from node */ - function DataStep(start, end, minimumStep, containerHeight, customRange, alignZeros) { - // variables - this.current = 0; - - this.autoScale = true; - this.stepIndex = 0; - this.step = 1; - this.scale = 1; + function parseEdge(graph, from) { + while (token == '->' || token == '--') { + var to; + var type = token; + getToken(); - this.marginStart; - this.marginEnd; - this.deadSpace = 0; + var subgraph = parseSubgraph(graph); + if (subgraph) { + to = subgraph; + } + else { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier or subgraph expected'); + } + to = token; + addNode(graph, { + id: to + }); + getToken(); + } - this.majorSteps = [1, 2, 5, 10]; - this.minorSteps = [0.25, 0.5, 1, 2]; + // parse edge attributes + var attr = parseAttributeList(); - this.alignZeros = alignZeros; + // create edge + var edge = createEdge(graph, from, to, type, attr); + addEdge(graph, edge); - this.setRange(start, end, minimumStep, containerHeight, customRange); + from = to; + } } - - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Number} [start] The start date and time. - * @param {Number} [end] The end date and time. - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * Parse a set with attributes, + * for example [label="1.000", shape=solid] + * @return {Object | null} attr */ - DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { - this._start = customRange.min === undefined ? start : customRange.min; - this._end = customRange.max === undefined ? end : customRange.max; + function parseAttributeList() { + var attr = null; - if (this._start == this._end) { - this._start -= 0.75; - this._end += 1; - } + while (token == '[') { + getToken(); + attr = {}; + while (token !== '' && token != ']') { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute name expected'); + } + var name = token; - if (this.autoScale == true) { - this.setMinimumStep(minimumStep, containerHeight); + getToken(); + if (token != '=') { + throw newSyntaxError('Equal sign = expected'); + } + getToken(); + + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute value expected'); + } + var value = token; + setValue(attr, name, value); // name can be a path + + getToken(); + if (token ==',') { + getToken(); + } + } + + if (token != ']') { + throw newSyntaxError('Bracket ] expected'); + } + getToken(); } - this.setFirst(customRange); - }; + return attr; + } /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds + * Create a syntax error with extra information on current token and index. + * @param {String} message + * @returns {SyntaxError} err */ - DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { - // round to floor - var size = this._end - this._start; - var safeSize = size * 1.2; - var minimumStepValue = minimumStep * (safeSize / containerHeight); - var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); - - var minorStepIdx = -1; - var magnitudefactor = Math.pow(10,orderOfMagnitude); + function newSyntaxError(message) { + return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); + } - var start = 0; - if (orderOfMagnitude < 0) { - start = orderOfMagnitude; - } + /** + * Chop off text after a maximum length + * @param {String} text + * @param {Number} maxLength + * @returns {String} + */ + function chop (text, maxLength) { + return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); + } - var solutionFound = false; - for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { - magnitudefactor = Math.pow(10,i); - for (var j = 0; j < this.minorSteps.length; j++) { - var stepSize = magnitudefactor * this.minorSteps[j]; - if (stepSize >= minimumStepValue) { - solutionFound = true; - minorStepIdx = j; - break; + /** + * Execute a function fn for each pair of elements in two arrays + * @param {Array | *} array1 + * @param {Array | *} array2 + * @param {function} fn + */ + function forEach2(array1, array2, fn) { + if (Array.isArray(array1)) { + array1.forEach(function (elem1) { + if (Array.isArray(array2)) { + array2.forEach(function (elem2) { + fn(elem1, elem2); + }); + } + else { + fn(elem1, array2); } + }); + } + else { + if (Array.isArray(array2)) { + array2.forEach(function (elem2) { + fn(array1, elem2); + }); } - if (solutionFound == true) { - break; + else { + fn(array1, array2); } } - this.stepIndex = minorStepIdx; - this.scale = magnitudefactor; - this.step = magnitudefactor * this.minorSteps[minorStepIdx]; - }; - - + } /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date + * Convert a string containing a graph in DOT language into a map containing + * with nodes and edges in the format of graph. + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graphData */ - DataStep.prototype.setFirst = function(customRange) { - if (customRange === undefined) { - customRange = {}; - } + function DOTToGraph (data) { + // parse the DOT file + var dotData = parseDOT(data); + var graphData = { + nodes: [], + edges: [], + options: {} + }; - var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; - var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; + // copy the nodes + if (dotData.nodes) { + dotData.nodes.forEach(function (dotNode) { + var graphNode = { + id: dotNode.id, + label: String(dotNode.label || dotNode.id) + }; + merge(graphNode, dotNode.attr); + if (graphNode.image) { + graphNode.shape = 'image'; + } + graphData.nodes.push(graphNode); + }); + } - this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; - this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; + // copy the edges + if (dotData.edges) { + /** + * Convert an edge in DOT format to an edge with VisGraph format + * @param {Object} dotEdge + * @returns {Object} graphEdge + */ + function convertEdge(dotEdge) { + var graphEdge = { + from: dotEdge.from, + to: dotEdge.to + }; + merge(graphEdge, dotEdge.attr); + graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; + return graphEdge; + } - // if we need to align the zero's we need to make sure that there is a zero to use. - if (this.alignZeros == true && (this.marginEnd - this.marginStart) % this.step != 0) { - this.marginEnd += this.marginEnd % this.step; - } + dotData.edges.forEach(function (dotEdge) { + var from, to; + if (dotEdge.from instanceof Object) { + from = dotEdge.from.nodes; + } + else { + from = { + id: dotEdge.from + } + } - this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; - this.marginRange = this.marginEnd - this.marginStart; + if (dotEdge.to instanceof Object) { + to = dotEdge.to.nodes; + } + else { + to = { + id: dotEdge.to + } + } + if (dotEdge.from instanceof Object && dotEdge.from.edges) { + dotEdge.from.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } - this.current = this.marginEnd; - }; + forEach2(from, to, function (from, to) { + var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); - DataStep.prototype.roundToMinor = function(value) { - var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); - if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { - return rounded + (this.scale * this.minorSteps[this.stepIndex]); + if (dotEdge.to instanceof Object && dotEdge.to.edges) { + dotEdge.to.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } + }); } - else { - return rounded; + + // copy the options + if (dotData.attr) { + graphData.options = dotData.attr; } - } + return graphData; + } - /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date - */ - DataStep.prototype.hasNext = function () { - return (this.current >= this.marginStart); - }; + // exports + exports.parseDOT = parseDOT; + exports.DOTToGraph = DOTToGraph; - /** - * Do the next step - */ - DataStep.prototype.next = function() { - var prev = this.current; - this.current -= this.step; - // safety mechanism: if current time is still unchanged, move to the end - if (this.current == prev) { - this.current = this._end; - } - }; +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { - /** - * Do the next step - */ - DataStep.prototype.previous = function() { - this.current += this.step; - this.marginEnd += this.step; - this.marginRange = this.marginEnd - this.marginStart; - }; + + function parseGephi(gephiJSON, options) { + var edges = []; + var nodes = []; + this.options = { + edges: { + inheritColor: true + }, + nodes: { + allowedToMove: false, + parseColor: false + } + }; + if (options !== undefined) { + this.options.nodes['allowedToMove'] = options.allowedToMove | false; + this.options.nodes['parseColor'] = options.parseColor | false; + this.options.edges['inheritColor'] = options.inheritColor | true; + } + var gEdges = gephiJSON.edges; + var gNodes = gephiJSON.nodes; + for (var i = 0; i < gEdges.length; i++) { + var edge = {}; + var gEdge = gEdges[i]; + edge['id'] = gEdge.id; + edge['from'] = gEdge.source; + edge['to'] = gEdge.target; + edge['attributes'] = gEdge.attributes; + // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; + // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; + edge['color'] = gEdge.color; + edge['inheritColor'] = edge['color'] !== undefined ? false : this.options.inheritColor; + edges.push(edge); + } - /** - * Get the current datetime - * @return {String} current The current date - */ - DataStep.prototype.getCurrent = function(decimals) { - var toPrecision = '' + Number(this.current).toPrecision(5); - // If decimals is specified, then limit or extend the string as required - if(decimals !== undefined && !isNaN(Number(decimals))) { - // If string includes exponent, then we need to add it to the end - var exp = ""; - var index = toPrecision.indexOf("e"); - if(index != -1) { - // Get the exponent - exp = toPrecision.slice(index); - // Remove the exponent in case we need to zero-extend - toPrecision = toPrecision.slice(0, index); - } - index = Math.max(toPrecision.indexOf(","), toPrecision.indexOf(".")); - if(index === -1) { - // No decimal found - if we want decimals, then we need to add it - if(decimals !== 0) { - toPrecision += '.'; - } - // Calculate how long the string should be - index = toPrecision.length + decimals; - } - else if(decimals !== 0) { - // Calculate how long the string should be - accounting for the decimal place - index += decimals + 1; - } - if(index > toPrecision.length) { - // We need to add zeros! - for(var cnt = index - toPrecision.length; cnt > 0; cnt--) { - toPrecision += '0'; - } - } - else { - // we need to remove characters - toPrecision = toPrecision.slice(0, index); + for (var i = 0; i < gNodes.length; i++) { + var node = {}; + var gNode = gNodes[i]; + node['id'] = gNode.id; + node['attributes'] = gNode.attributes; + node['x'] = gNode.x; + node['y'] = gNode.y; + node['label'] = gNode.label; + if (this.options.nodes.parseColor == true) { + node['color'] = gNode.color; } - // Add the exponent if there is one - toPrecision += exp; - } - else { - if (toPrecision.indexOf(",") != -1 || toPrecision.indexOf(".") != -1) { - // If no decimal is specified, and there are decimal places, remove trailing zeros - for (var i = toPrecision.length - 1; i > 0; i--) { - if (toPrecision[i] == "0") { - toPrecision = toPrecision.slice(0, i); - } - else if (toPrecision[i] == "." || toPrecision[i] == ",") { - toPrecision = toPrecision.slice(0, i); - break; - } - else { - break; - } - } + else { + node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color} : undefined; } + node['radius'] = gNode.size; + node['allowedToMoveX'] = this.options.nodes.allowedToMove; + node['allowedToMoveY'] = this.options.nodes.allowedToMove; + nodes.push(node); } - return toPrecision; - }; + return {nodes:nodes, edges:edges}; + } + exports.parseGephi = parseGephi; +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { - /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate - */ - DataStep.prototype.snap = function(date) { + // first check if moment.js is already loaded in the browser window, if so, + // use this instance. Else, load via commonjs. + module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(58); - }; - /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. - */ - DataStep.prototype.isMajor = function() { - return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); - }; +/***/ }, +/* 45 */ +/***/ function(module, exports, __webpack_require__) { - module.exports = DataStep; + // Only load hammer.js when in a browser environment + // (loading hammer.js in a node.js environment gives errors) + if (typeof window !== 'undefined') { + module.exports = window['Hammer'] || __webpack_require__(59); + } + else { + module.exports = function () { + throw Error('hammer.js is only available in a browser, not in node.js.'); + } + } /***/ }, /* 46 */ /***/ function(module, exports, __webpack_require__) { + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - var Line = __webpack_require__(47); - var Bar = __webpack_require__(49); - var Points = __webpack_require__(48); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(17); + var ItemSet = __webpack_require__(27); + var Activator = __webpack_require__(55); + var DateUtil = __webpack_require__(15); /** - * /** - * @param {object} group | the object of the group from the dataset - * @param {string} groupId | ID of the group - * @param {object} options | the default options - * @param {array} groupsUsingDefaultStyles | this array has one entree. - * It is passed as an array so it is passed by reference. - * It enumerates through the default styles + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Core.setOptions for the available options. * @constructor */ - function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { - this.id = groupId; - var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] - this.options = util.selectiveBridgeObject(fields,options); - this.usingDefaultStyle = group.className === undefined; - this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; - this.zeroPosition = 0; - this.update(group); - if (this.usingDefaultStyle == true) { - this.groupsUsingDefaultStyles[0] += 1; - } - this.itemsData = []; - this.visible = group.visible === undefined ? true : group.visible; - } + function Core () {} + // turn Core into an event emitter + Emitter(Core.prototype); /** - * this loads a reference to all items in this group into this group. - * @param {array} items + * Create the main DOM for the Core: a root panel containing left, right, + * top, bottom, content, and background panel. + * @param {Element} container The container element where the Core will + * be attached. + * @private */ - GraphGroup.prototype.setItems = function(items) { - if (items != null) { - this.itemsData = items; - if (this.options.sort == true) { - this.itemsData.sort(function (a,b) {return a.x - b.x;}) - } - } - else { - this.itemsData = []; - } - }; + Core.prototype._create = function (container) { + this.dom = {}; + + this.dom.root = document.createElement('div'); + this.dom.background = document.createElement('div'); + this.dom.backgroundVertical = document.createElement('div'); + this.dom.backgroundHorizontal = document.createElement('div'); + this.dom.centerContainer = document.createElement('div'); + this.dom.leftContainer = document.createElement('div'); + this.dom.rightContainer = document.createElement('div'); + this.dom.center = document.createElement('div'); + this.dom.left = document.createElement('div'); + this.dom.right = document.createElement('div'); + this.dom.top = document.createElement('div'); + this.dom.bottom = document.createElement('div'); + this.dom.shadowTop = document.createElement('div'); + this.dom.shadowBottom = document.createElement('div'); + this.dom.shadowTopLeft = document.createElement('div'); + this.dom.shadowBottomLeft = document.createElement('div'); + this.dom.shadowTopRight = document.createElement('div'); + this.dom.shadowBottomRight = document.createElement('div'); + this.dom.root.className = 'vis timeline root'; + this.dom.background.className = 'vispanel background'; + this.dom.backgroundVertical.className = 'vispanel background vertical'; + this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; + this.dom.centerContainer.className = 'vispanel center'; + this.dom.leftContainer.className = 'vispanel left'; + this.dom.rightContainer.className = 'vispanel right'; + this.dom.top.className = 'vispanel top'; + this.dom.bottom.className = 'vispanel bottom'; + this.dom.left.className = 'content'; + this.dom.center.className = 'content'; + this.dom.right.className = 'content'; + this.dom.shadowTop.className = 'shadow top'; + this.dom.shadowBottom.className = 'shadow bottom'; + this.dom.shadowTopLeft.className = 'shadow top'; + this.dom.shadowBottomLeft.className = 'shadow bottom'; + this.dom.shadowTopRight.className = 'shadow top'; + this.dom.shadowBottomRight.className = 'shadow bottom'; - /** - * this is used for plotting barcharts, this way, we only have to calculate it once. - * @param pos - */ - GraphGroup.prototype.setZeroPosition = function(pos) { - this.zeroPosition = pos; - }; + this.dom.root.appendChild(this.dom.background); + this.dom.root.appendChild(this.dom.backgroundVertical); + this.dom.root.appendChild(this.dom.backgroundHorizontal); + this.dom.root.appendChild(this.dom.centerContainer); + this.dom.root.appendChild(this.dom.leftContainer); + this.dom.root.appendChild(this.dom.rightContainer); + this.dom.root.appendChild(this.dom.top); + this.dom.root.appendChild(this.dom.bottom); + this.dom.centerContainer.appendChild(this.dom.center); + this.dom.leftContainer.appendChild(this.dom.left); + this.dom.rightContainer.appendChild(this.dom.right); - /** - * set the options of the graph group over the default options. - * @param options - */ - GraphGroup.prototype.setOptions = function(options) { - if (options !== undefined) { - var fields = ['sampling','style','sort','yAxisOrientation','barChart']; - util.selectiveDeepExtend(fields, this.options, options); + this.dom.centerContainer.appendChild(this.dom.shadowTop); + this.dom.centerContainer.appendChild(this.dom.shadowBottom); + this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); + this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); + this.dom.rightContainer.appendChild(this.dom.shadowTopRight); + this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - util.mergeOptions(this.options, options,'catmullRom'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); + this.on('rangechange', this.redraw.bind(this)); + this.on('touch', this._onTouch.bind(this)); + this.on('pinch', this._onPinch.bind(this)); + this.on('dragstart', this._onDragStart.bind(this)); + this.on('drag', this._onDrag.bind(this)); - if (options.catmullRom) { - if (typeof options.catmullRom == 'object') { - if (options.catmullRom.parametrization) { - if (options.catmullRom.parametrization == 'uniform') { - this.options.catmullRom.alpha = 0; - } - else if (options.catmullRom.parametrization == 'chordal') { - this.options.catmullRom.alpha = 1.0; - } - else { - this.options.catmullRom.parametrization = 'centripetal'; - this.options.catmullRom.alpha = 0.5; - } - } + var me = this; + this.on('change', function (properties) { + if (properties && properties.queue == true) { + // redraw once on next tick + if (!me._redrawTimer) { + me._redrawTimer = setTimeout(function () { + me._redrawTimer = null; + me.redraw(); + }, 0) } } - } + else { + // redraw immediately + me.redraw(); + } + }); - if (this.options.style == 'line') { - this.type = new Line(this.id, this.options); - } - else if (this.options.style == 'bar') { - this.type = new Bar(this.id, this.options); - } - else if (this.options.style == 'points') { - this.type = new Points(this.id, this.options); - } - }; + // create event listeners for all interesting events, these events will be + // emitted via emitter + this.hammer = Hammer(this.dom.root, { + preventDefault: true + }); + this.listeners = {}; + var events = [ + 'touch', 'pinch', + 'tap', 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + var listener = function () { + var args = [event].concat(Array.prototype.slice.call(arguments, 0)); + if (me.isActive()) { + me.emit.apply(me, args); + } + }; + me.hammer.on(event, listener); + me.listeners[event] = listener; + }); - /** - * this updates the current group class with the latest group dataset entree, used in _updateGroup in linegraph - * @param group - */ - GraphGroup.prototype.update = function(group) { - this.group = group; - this.content = group.content || 'graph'; - this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; - this.visible = group.visible === undefined ? true : group.visible; - this.style = group.style; - this.setOptions(group.options); - }; + // size properties of each of the panels + this.props = { + root: {}, + background: {}, + centerContainer: {}, + leftContainer: {}, + rightContainer: {}, + center: {}, + left: {}, + right: {}, + top: {}, + bottom: {}, + border: {}, + scrollTop: 0, + scrollTopMin: 0 + }; + this.touch = {}; // store state information needed for touch events + + this.redrawCount = 0; + // attach the root panel to the provided container + if (!container) throw new Error('No container provided'); + container.appendChild(this.dom.root); + }; /** - * draw the icon for the legend. - * - * @param x - * @param y - * @param JSONcontainer - * @param SVGcontainer - * @param iconWidth - * @param iconHeight + * Set options. Options will be passed to all components loaded in the Timeline. + * @param {Object} [options] + * {String} orientation + * Vertical orientation for the Timeline, + * can be 'bottom' (default) or 'top'. + * {String | Number} width + * Width for the timeline, a number in pixels or + * a css string like '1000px' or '75%'. '100%' by default. + * {String | Number} height + * Fixed height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. If undefined, + * The Timeline will automatically size such that + * its contents fit. + * {String | Number} minHeight + * Minimum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {String | Number} maxHeight + * Maximum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {Number | Date | String} start + * Start date for the visible window + * {Number | Date | String} end + * End date for the visible window */ - GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { - var fillHeight = iconHeight * 0.5; - var path, fillPath; - - var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); - outline.setAttributeNS(null, "x", x); - outline.setAttributeNS(null, "y", y - fillHeight); - outline.setAttributeNS(null, "width", iconWidth); - outline.setAttributeNS(null, "height", 2*fillHeight); - outline.setAttributeNS(null, "class", "outline"); + Core.prototype.setOptions = function (options) { + if (options) { + // copy the known options + var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation', 'clickToUse', 'dataAttributes', 'hiddenDates']; + util.selectiveExtend(fields, this.options, options); - if (this.options.style == 'line') { - path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - path.setAttributeNS(null, "class", this.className); - if(this.style !== undefined) { - path.setAttributeNS(null, "style", this.style); + if ('hiddenDates' in this.options) { + DateUtil.convertHiddenOptions(this.body, this.options.hiddenDates); } - path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); - if (this.options.shaded.enabled == true) { - fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - if (this.options.shaded.orientation == 'top') { - fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + - "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); + if ('clickToUse' in options) { + if (options.clickToUse) { + this.activator = new Activator(this.dom.root); } else { - fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + - "L"+x+"," + (y + fillHeight) + " " + - "L"+ (x + iconWidth) + "," + (y + fillHeight) + - "L"+ (x + iconWidth) + ","+y); + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } } - fillPath.setAttributeNS(null, "class", this.className + " iconFill"); } - if (this.options.drawPoints.enabled == true) { - DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); - } + // enable/disable autoResize + this._initAutoResize(); } - else { - var barWidth = Math.round(0.3 * iconWidth); - var bar1Height = Math.round(0.4 * iconHeight); - var bar2Height = Math.round(0.75 * iconHeight); - var offset = Math.round((iconWidth - (2 * barWidth))/3); + // propagate options to all components + this.components.forEach(function (component) { + component.setOptions(options); + }); - DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); - DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + // TODO: remove deprecation error one day (deprecated since version 0.8.0) + if (options && options.order) { + throw new Error('Option order is deprecated. There is no replacement for this feature.'); } - }; - - - /** - * return the legend entree for this group. - * - * @param iconWidth - * @param iconHeight - * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} - */ - GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { - var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); - return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; - } - - GraphGroup.prototype.getYRange = function(groupData) { - return this.type.getYRange(groupData); - } - - GraphGroup.prototype.draw = function(dataset, group, framework) { - this.type.draw(dataset, group, framework); - } - - - module.exports = GraphGroup; - - -/***/ }, -/* 47 */ -/***/ function(module, exports, __webpack_require__) { - - /** - * Created by Alex on 11/11/2014. - */ - var DOMutil = __webpack_require__(6); - var Points = __webpack_require__(48); - - function Line(groupId, options) { - this.groupId = groupId; - this.options = options; - } - Line.prototype.getYRange = function(groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; + // redraw everything + this.redraw(); }; - /** - * draw a line graph - * - * @param dataset - * @param group + * Returns true when the Timeline is active. + * @returns {boolean} */ - Line.prototype.draw = function (dataset, group, framework) { - if (dataset != null) { - if (dataset.length > 0) { - var path, d; - var svgHeight = Number(framework.svg.style.height.replace('px','')); - path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); - path.setAttributeNS(null, "class", group.className); - if(group.style !== undefined) { - path.setAttributeNS(null, "style", group.style); - } - - // construct path from dataset - if (group.options.catmullRom.enabled == true) { - d = Line._catmullRom(dataset, group); - } - else { - d = Line._linear(dataset); - } - - // append with points for fill and finalize the path - if (group.options.shaded.enabled == true) { - var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); - var dFill; - if (group.options.shaded.orientation == 'top') { - dFill = 'M' + dataset[0].x + ',' + 0 + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + 0; - } - else { - dFill = 'M' + dataset[0].x + ',' + svgHeight + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + svgHeight; - } - fillPath.setAttributeNS(null, "class", group.className + " fill"); - if(group.options.shaded.style !== undefined) { - fillPath.setAttributeNS(null, "style", group.options.shaded.style); - } - fillPath.setAttributeNS(null, "d", dFill); - } - // copy properties to path for drawing. - path.setAttributeNS(null, 'd', 'M' + d); - - // draw points - if (group.options.drawPoints.enabled == true) { - Points.draw(dataset, group, framework); - } - } - } + Core.prototype.isActive = function () { + return !this.activator || this.activator.active; }; - - /** - * This uses an uniform parametrization of the CatmullRom algorithm: - * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al. - * @param data - * @returns {string} - * @private + * Destroy the Core, clean up all DOM elements and event listeners. */ - Line._catmullRomUniform = function(data) { - // catmull rom - var p0, p1, p2, p3, bp1, bp2; - var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; - var normalization = 1/6; - var length = data.length; - for (var i = 0; i < length - 1; i++) { + Core.prototype.destroy = function () { + // unbind datasets + this.clear(); - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + // remove all event listeners + this.off(); + // stop checking for changed size + this._stopAutoResize(); - // Catmull-Rom to Cubic Bezier conversion matrix - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 + // remove from DOM + if (this.dom.root.parentNode) { + this.dom.root.parentNode.removeChild(this.dom.root); + } + this.dom = null; - // bp0 = { x: p1.x, y: p1.y }; - bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; - bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; - // bp0 = { x: p2.x, y: p2.y }; + // remove Activator + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } - d += 'C' + - bp1.x + ',' + - bp1.y + ' ' + - bp2.x + ',' + - bp2.y + ' ' + - p2.x + ',' + - p2.y + ' '; + // cleanup hammer touch events + for (var event in this.listeners) { + if (this.listeners.hasOwnProperty(event)) { + delete this.listeners[event]; + } } + this.listeners = null; + this.hammer = null; - return d; + // give all components the opportunity to cleanup + this.components.forEach(function (component) { + component.destroy(); + }); + + this.body = null; }; + /** - * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. - * By default, the centripetal parameterization is used because this gives the nicest results. - * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. - * - * One optimization can be used to reuse distances since this is a sliding window approach. - * @param data - * @param group - * @returns {string} - * @private + * Set a custom time bar + * @param {Date} time */ - Line._catmullRom = function(data, group) { - var alpha = group.options.catmullRom.alpha; - if (alpha == 0 || alpha === undefined) { - return this._catmullRomUniform(data); + Core.prototype.setCustomTime = function (time) { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); } - else { - var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; - var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; - var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; - var length = data.length; - for (var i = 0; i < length - 1; i++) { - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + this.customTime.setCustomTime(time); + }; - d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); - d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); - d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); + /** + * Retrieve the current custom time. + * @return {Date} customTime + */ + Core.prototype.getCustomTime = function() { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); + } - // Catmull-Rom to Cubic Bezier conversion matrix + return this.customTime.getCustomTime(); + }; - // A = 2d1^2a + 3d1^a * d2^a + d3^2a - // B = 2d3^2a + 3d3^a * d2^a + d2^2a - // [ 0 1 0 0 ] - // [ -d2^2a /N A/N d1^2a /N 0 ] - // [ 0 d3^2a /M B/M -d2^2a /M ] - // [ 0 0 1 0 ] + /** + * Get the id's of the currently visible items. + * @returns {Array} The ids of the visible items + */ + Core.prototype.getVisibleItems = function() { + return this.itemSet && this.itemSet.getVisibleItems() || []; + }; - d3powA = Math.pow(d3, alpha); - d3pow2A = Math.pow(d3,2*alpha); - d2powA = Math.pow(d2, alpha); - d2pow2A = Math.pow(d2,2*alpha); - d1powA = Math.pow(d1, alpha); - d1pow2A = Math.pow(d1,2*alpha); - A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; - B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; - N = 3*d1powA * (d1powA + d2powA); - if (N > 0) {N = 1 / N;} - M = 3*d3powA * (d3powA + d2powA); - if (M > 0) {M = 1 / M;} - bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), - y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; + /** + * Clear the Core. By Default, items, groups and options are cleared. + * Example usage: + * + * timeline.clear(); // clear items, groups, and options + * timeline.clear({options: true}); // clear options only + * + * @param {Object} [what] Optionally specify what to clear. By default: + * {items: true, groups: true, options: true} + */ + Core.prototype.clear = function(what) { + // clear items + if (!what || what.items) { + this.setItems(null); + } - bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), - y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; + // clear groups + if (!what || what.groups) { + this.setGroups(null); + } - if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} - if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} - d += 'C' + - bp1.x + ',' + - bp1.y + ' ' + - bp2.x + ',' + - bp2.y + ' ' + - p2.x + ',' + - p2.y + ' '; - } + // clear options of timeline and of each of the components + if (!what || what.options) { + this.components.forEach(function (component) { + component.setOptions(component.defaultOptions); + }); - return d; + this.setOptions(this.defaultOptions); // this will also do a redraw } }; /** - * this generates the SVG path for a linear drawing between datapoints. - * @param data - * @returns {string} - * @private + * Set Core window such that it fits all items + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. */ - Line._linear = function(data) { - // linear - var d = ''; - for (var i = 0; i < data.length; i++) { - if (i == 0) { - d += data[i].x + ',' + data[i].y; - } - else { - d += ' ' + data[i].x + ',' + data[i].y; - } - } - return d; - }; - - module.exports = Line; + Core.prototype.fit = function(options) { + var range = this._getDataRange(); + // skip range set if there is no start and end date + if (range.start === null && range.end === null) { + return; + } -/***/ }, -/* 48 */ -/***/ function(module, exports, __webpack_require__) { + var animate = (options && options.animate !== undefined) ? options.animate : true; + this.range.setRange(range.start, range.end, animate); + }; /** - * Created by Alex on 11/11/2014. + * Calculate the data range of the items and applies a 5% window around it. + * @returns {{start: Date | null, end: Date | null}} + * @protected */ - var DOMutil = __webpack_require__(6); - - function Points(groupId, options) { - this.groupId = groupId; - this.options = options; - } + Core.prototype._getDataRange = function() { + // apply the data range as range + var dataRange = this.getItemRange(); + // add 5% space on both sides + var start = dataRange.min; + var end = dataRange.max; + if (start != null && end != null) { + var interval = (end.valueOf() - start.valueOf()); + if (interval <= 0) { + // prevent an empty interval + interval = 24 * 60 * 60 * 1000; // 1 day + } + start = new Date(start.valueOf() - interval * 0.05); + end = new Date(end.valueOf() + interval * 0.05); + } - Points.prototype.getYRange = function(groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + return { + start: start, + end: end } - return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; }; - Points.prototype.draw = function(dataset, group, framework, offset) { - Points.draw(dataset, group, framework, offset); - } - /** - * draw the data points + * Set the visible window. Both parameters are optional, you can change only + * start or only end. Syntax: * - * @param {Array} dataset - * @param {Object} JSONcontainer - * @param {Object} svg | SVG DOM element - * @param {GraphGroup} group - * @param {Number} [offset] + * TimeLine.setWindow(start, end) + * TimeLine.setWindow(range) + * + * Where start and end can be a Date, number, or string, and range is an + * object with properties start and end. + * + * @param {Date | Number | String | Object} [start] Start date of visible window + * @param {Date | Number | String} [end] End date of visible window + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. */ - Points.draw = function (dataset, group, framework, offset) { - if (offset === undefined) {offset = 0;} - for (var i = 0; i < dataset.length; i++) { - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, framework.svgElements, framework.svg); + Core.prototype.setWindow = function(start, end, options) { + var animate = (options && options.animate !== undefined) ? options.animate : true; + if (arguments.length == 1) { + var range = arguments[0]; + this.range.setRange(range.start, range.end, animate); + } + else { + this.range.setRange(start, end, animate); } }; + /** + * Move the window such that given time is centered on screen. + * @param {Date | Number | String} time + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + */ + Core.prototype.moveTo = function(time, options) { + var interval = this.range.end - this.range.start; + var t = util.convert(time, 'Date').valueOf(); + + var start = t - interval / 2; + var end = t + interval / 2; + var animate = (options && options.animate !== undefined) ? options.animate : true; - module.exports = Points; + this.range.setRange(start, end, animate); + }; -/***/ }, -/* 49 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Get the visible window + * @return {{start: Date, end: Date}} Visible range + */ + Core.prototype.getWindow = function() { + var range = this.range.getRange(); + return { + start: new Date(range.start), + end: new Date(range.end) + }; + }; /** - * Created by Alex on 11/11/2014. + * Force a redraw of the Core. Can be useful to manually redraw when + * option autoResize=false */ - var DOMutil = __webpack_require__(6); - var Points = __webpack_require__(48); + Core.prototype.redraw = function() { + var resized = false; + var options = this.options; + var props = this.props; + var dom = this.dom; - function Bargraph(groupId, options) { - this.groupId = groupId; - this.options = options; - } + if (!dom) return; // when destroyed - Bargraph.prototype.getYRange = function(groupData) { - if (this.options.barChart.handleOverlap != 'stack') { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; + DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + + // update class names + if (options.orientation == 'top') { + util.addClassName(dom.root, 'top'); + util.removeClassName(dom.root, 'bottom'); } else { - var barCombinedData = []; - for (var j = 0; j < groupData.length; j++) { - barCombinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: this.groupId - }); - } - return barCombinedData; + util.removeClassName(dom.root, 'top'); + util.addClassName(dom.root, 'bottom'); } - }; + // update root width and height options + dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); + dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); + dom.root.style.width = util.option.asSize(options.width, ''); + // calculate border widths + props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; + props.border.right = props.border.left; + props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; + props.border.bottom = props.border.top; + var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; + var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; - /** - * draw a bar graph - * - * @param groupIds - * @param processedGroupData - */ - Bargraph.draw = function (groupIds, processedGroupData, framework) { - var combinedData = []; - var intersections = {}; - var coreDistance; - var key, drawData; - var group; - var i,j; - var barPoints = 0; + // workaround for a bug in IE: the clientWidth of an element with + // a height:0px and overflow:hidden is not calculated and always has value 0 + if (dom.centerContainer.clientHeight === 0) { + props.border.left = props.border.top; + props.border.right = props.border.left; + } + if (dom.root.clientHeight === 0) { + borderRootWidth = borderRootHeight; + } - // combine all barchart data - for (i = 0; i < groupIds.length; i++) { - group = framework.groups[groupIds[i]]; - if (group.options.style == 'bar') { - if (group.visible == true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] == true)) { - for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { - combinedData.push({ - x: processedGroupData[groupIds[i]][j].x, - y: processedGroupData[groupIds[i]][j].y, - groupId: groupIds[i] - }); - barPoints += 1; - } - } - } + // calculate the heights. If any of the side panels is empty, we set the height to + // minus the border width, such that the border will be invisible + props.center.height = dom.center.offsetHeight; + props.left.height = dom.left.offsetHeight; + props.right.height = dom.right.offsetHeight; + props.top.height = dom.top.clientHeight || -props.border.top; + props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; + + // TODO: compensate borders when any of the panels is empty. + + // apply auto height + // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) + var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); + var autoHeight = props.top.height + contentHeight + props.bottom.height + + borderRootHeight + props.border.top + props.border.bottom; + dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); + + // calculate heights of the content panels + props.root.height = dom.root.offsetHeight; + props.background.height = props.root.height - borderRootHeight; + var containerHeight = props.root.height - props.top.height - props.bottom.height - + borderRootHeight; + props.centerContainer.height = containerHeight; + props.leftContainer.height = containerHeight; + props.rightContainer.height = props.leftContainer.height; + + // calculate the widths of the panels + props.root.width = dom.root.offsetWidth; + props.background.width = props.root.width - borderRootWidth; + props.left.width = dom.leftContainer.clientWidth || -props.border.left; + props.leftContainer.width = props.left.width; + props.right.width = dom.rightContainer.clientWidth || -props.border.right; + props.rightContainer.width = props.right.width; + var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; + props.center.width = centerWidth; + props.centerContainer.width = centerWidth; + props.top.width = centerWidth; + props.bottom.width = centerWidth; + + // resize the panels + dom.background.style.height = props.background.height + 'px'; + dom.backgroundVertical.style.height = props.background.height + 'px'; + dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; + dom.centerContainer.style.height = props.centerContainer.height + 'px'; + dom.leftContainer.style.height = props.leftContainer.height + 'px'; + dom.rightContainer.style.height = props.rightContainer.height + 'px'; + + dom.background.style.width = props.background.width + 'px'; + dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; + dom.backgroundHorizontal.style.width = props.background.width + 'px'; + dom.centerContainer.style.width = props.center.width + 'px'; + dom.top.style.width = props.top.width + 'px'; + dom.bottom.style.width = props.bottom.width + 'px'; + + // reposition the panels + dom.background.style.left = '0'; + dom.background.style.top = '0'; + dom.backgroundVertical.style.left = (props.left.width + props.border.left) + 'px'; + dom.backgroundVertical.style.top = '0'; + dom.backgroundHorizontal.style.left = '0'; + dom.backgroundHorizontal.style.top = props.top.height + 'px'; + dom.centerContainer.style.left = props.left.width + 'px'; + dom.centerContainer.style.top = props.top.height + 'px'; + dom.leftContainer.style.left = '0'; + dom.leftContainer.style.top = props.top.height + 'px'; + dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; + dom.rightContainer.style.top = props.top.height + 'px'; + dom.top.style.left = props.left.width + 'px'; + dom.top.style.top = '0'; + dom.bottom.style.left = props.left.width + 'px'; + dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; + + // update the scrollTop, feasible range for the offset can be changed + // when the height of the Core or of the contents of the center changed + this._updateScrollTop(); + + // reposition the scrollable contents + var offset = this.props.scrollTop; + if (options.orientation == 'bottom') { + offset += Math.max(this.props.centerContainer.height - this.props.center.height - + this.props.border.top - this.props.border.bottom, 0); } + dom.center.style.left = '0'; + dom.center.style.top = offset + 'px'; + dom.left.style.left = '0'; + dom.left.style.top = offset + 'px'; + dom.right.style.left = '0'; + dom.right.style.top = offset + 'px'; - if (barPoints == 0) {return;} + // show shadows when vertical scrolling is available + var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; + var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; + dom.shadowTop.style.visibility = visibilityTop; + dom.shadowBottom.style.visibility = visibilityBottom; + dom.shadowTopLeft.style.visibility = visibilityTop; + dom.shadowBottomLeft.style.visibility = visibilityBottom; + dom.shadowTopRight.style.visibility = visibilityTop; + dom.shadowBottomRight.style.visibility = visibilityBottom; - // sort by time and by group - combinedData.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; - } + // redraw all components + this.components.forEach(function (component) { + resized = component.redraw() || resized; }); + if (resized) { + // keep repainting until all sizes are settled + var MAX_REDRAWS = 2; // maximum number of consecutive redraws + if (this.redrawCount < MAX_REDRAWS) { + this.redrawCount++; + this.redraw(); + } + else { + console.log('WARNING: infinite loop in redraw?') + } + this.redrawCount = 0; + } + + this.emit("finishedRedraw"); + }; + + // TODO: deprecated since version 1.1.0, remove some day + Core.prototype.repaint = function () { + throw new Error('Function repaint is deprecated. Use redraw instead.'); + }; + + /** + * Set a current time. This can be used for example to ensure that a client's + * time is synchronized with a shared server time. + * Only applicable when option `showCurrentTime` is true. + * @param {Date | String | Number} time A Date, unix timestamp, or + * ISO date string. + */ + Core.prototype.setCurrentTime = function(time) { + if (!this.currentTime) { + throw new Error('Option showCurrentTime must be true'); + } - // get intersections - Bargraph._getDataIntersections(intersections, combinedData); + this.currentTime.setCurrentTime(time); + }; - // plot barchart - for (i = 0; i < combinedData.length; i++) { - group = framework.groups[combinedData[i].groupId]; - var minWidth = 0.1 * group.options.barChart.width; + /** + * Get the current time. + * Only applicable when option `showCurrentTime` is true. + * @return {Date} Returns the current time. + */ + Core.prototype.getCurrentTime = function() { + if (!this.currentTime) { + throw new Error('Option showCurrentTime must be true'); + } - key = combinedData[i].x; - var heightOffset = 0; - if (intersections[key] === undefined) { - if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} - if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} - drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); - } - else { - var nextKey = i + (intersections[key].amount - intersections[key].resolved); - var prevKey = i - (intersections[key].resolved + 1); - if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} - if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} - drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); - intersections[key].resolved += 1; + return this.currentTime.getCurrentTime(); + }; - if (group.options.barChart.handleOverlap == 'stack') { - heightOffset = intersections[key].accumulated; - intersections[key].accumulated += group.zeroPosition - combinedData[i].y; - } - else if (group.options.barChart.handleOverlap == 'sideBySide') { - drawData.width = drawData.width / intersections[key].amount; - drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); - if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} - else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} - } - } - DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', framework.svgElements, framework.svg); - // draw points - if (group.options.drawPoints.enabled == true) { - DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg); - } - } + /** + * Convert a position on screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Core.prototype._toTime = function(x) { + return DateUtil.toTime(this, x, this.props.center.width); }; + /** + * Convert a position on the global screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Core.prototype._toGlobalTime = function(x) { + return DateUtil.toTime(this, x, this.props.root.width); + //var conversion = this.range.conversion(this.props.root.width); + //return new Date(x / conversion.scale + conversion.offset); + }; /** - * Fill the intersections object with counters of how many datapoints share the same x coordinates - * @param intersections - * @param combinedData + * Convert a datetime (Date object) into a position on the screen + * @param {Date} time A date + * @return {int} x The position on the screen in pixels which corresponds + * with the given date. * @private */ - Bargraph._getDataIntersections = function (intersections, combinedData) { - // get intersections - var coreDistance; - for (var i = 0; i < combinedData.length; i++) { - if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); - } - if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); - } - if (coreDistance == 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; - } - intersections[combinedData[i].x].amount += 1; - } - } + // TODO: move this function to Range + Core.prototype._toScreen = function(time) { + return DateUtil.toScreen(this, time, this.props.center.width); }; + /** - * Get the width and offset for bargraphs based on the coredistance between datapoints - * - * @param coreDistance - * @param group - * @param minWidth - * @returns {{width: Number, offset: Number}} + * Convert a datetime (Date object) into a position on the root + * This is used to get the pixel density estimate for the screen, not the center panel + * @param {Date} time A date + * @return {int} x The position on root in pixels which corresponds + * with the given date. * @private */ - Bargraph._getSafeDrawData = function (coreDistance, group, minWidth) { - var width, offset; - if (coreDistance < group.options.barChart.width && coreDistance > 0) { - width = coreDistance < minWidth ? minWidth : coreDistance; + // TODO: move this function to Range + Core.prototype._toGlobalScreen = function(time) { + return DateUtil.toScreen(this, time, this.props.root.width); + //var conversion = this.range.conversion(this.props.root.width); + //return (time.valueOf() - conversion.offset) * conversion.scale; + }; - offset = 0; // recalculate offset with the new width; - if (group.options.barChart.align == 'left') { - offset -= 0.5 * coreDistance; - } - else if (group.options.barChart.align == 'right') { - offset += 0.5 * coreDistance; - } + + /** + * Initialize watching when option autoResize is true + * @private + */ + Core.prototype._initAutoResize = function () { + if (this.options.autoResize == true) { + this._startAutoResize(); } else { - // default settings - width = group.options.barChart.width; - offset = 0; - if (group.options.barChart.align == 'left') { - offset -= 0.5 * group.options.barChart.width; - } - else if (group.options.barChart.align == 'right') { - offset += 0.5 * group.options.barChart.width; - } + this._stopAutoResize(); } - - return {width: width, offset: offset}; }; - Bargraph.getStackedBarYRange = function(barCombinedData, groupRanges, groupIds, groupLabel, orientation) { - if (barCombinedData.length > 0) { - // sort by time and by group - barCombinedData.sort(function (a, b) { - if (a.x == b.x) { - return a.groupId - b.groupId; - } else { - return a.x - b.x; - } - }); - var intersections = {}; + /** + * Watch for changes in the size of the container. On resize, the Panel will + * automatically redraw itself. + * @private + */ + Core.prototype._startAutoResize = function () { + var me = this; - Bargraph._getDataIntersections(intersections, barCombinedData); - groupRanges[groupLabel] = Bargraph._getStackedBarYRange(intersections, barCombinedData); - groupRanges[groupLabel].yAxisOrientation = orientation; - groupIds.push(groupLabel); - } - } + this._stopAutoResize(); - Bargraph._getStackedBarYRange = function (intersections, combinedData) { - var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; - for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; - if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; - } - else { - intersections[key].accumulated += combinedData[i].y; + this._onResize = function() { + if (me.options.autoResize != true) { + // stop watching when the option autoResize is changed to false + me._stopAutoResize(); + return; } - } - for (var xpos in intersections) { - if (intersections.hasOwnProperty(xpos)) { - yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; - yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; + + if (me.dom.root) { + // check whether the frame is resized + // Note: we compare offsetWidth here, not clientWidth. For some reason, + // IE does not restore the clientWidth from 0 to the actual width after + // changing the timeline's container display style from none to visible + if ((me.dom.root.offsetWidth != me.props.lastWidth) || + (me.dom.root.offsetHeight != me.props.lastHeight)) { + me.props.lastWidth = me.dom.root.offsetWidth; + me.props.lastHeight = me.dom.root.offsetHeight; + + me.emit('change'); + } } - } + }; - return {min: yMin, max: yMax}; + // add event listener to window resize + util.addEventListener(window, 'resize', this._onResize); + + this.watchTimer = setInterval(this._onResize, 1000); }; - module.exports = Bargraph; + /** + * Stop watching for a resize of the frame. + * @private + */ + Core.prototype._stopAutoResize = function () { + if (this.watchTimer) { + clearInterval(this.watchTimer); + this.watchTimer = undefined; + } -/***/ }, -/* 50 */ -/***/ function(module, exports, __webpack_require__) { + // remove event listener on window.resize + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; + }; - var util = __webpack_require__(1); - var DOMutil = __webpack_require__(6); - var Component = __webpack_require__(23); + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onTouch = function (event) { + this.touch.allowDragging = true; + }; /** - * Legend for Graph2d + * Start moving the timeline vertically + * @param {Event} event + * @private */ - function Legend(body, options, side, linegraphOptions) { - this.body = body; - this.defaultOptions = { - enabled: true, - icons: true, - iconSize: 20, - iconSpacing: 6, - left: { - visible: true, - position: 'top-left' // top/bottom - left,center,right - }, - right: { - visible: true, - position: 'top-left' // top/bottom - left,center,right - } - } - this.side = side; - this.options = util.extend({},this.defaultOptions); - this.linegraphOptions = linegraphOptions; + Core.prototype._onPinch = function (event) { + this.touch.allowDragging = false; + }; - this.svgElements = {}; - this.dom = {}; - this.groups = {}; - this.amountOfGroups = 0; - this._create(); + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onDragStart = function (event) { + this.touch.initialScrollTop = this.props.scrollTop; + }; - this.setOptions(options); - } + /** + * Move the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onDrag = function (event) { + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.touch.allowDragging) return; - Legend.prototype = new Component(); + var delta = event.gesture.deltaY; - Legend.prototype.clear = function() { - this.groups = {}; - this.amountOfGroups = 0; - } + var oldScrollTop = this._getScrollTop(); + var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); - Legend.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; + if (newScrollTop != oldScrollTop) { + this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + this.emit("verticalDrag"); } - this.amountOfGroups += 1; }; - Legend.prototype.updateGroup = function(label, graphOptions) { - this.groups[label] = graphOptions; + /** + * Apply a scrollTop + * @param {Number} scrollTop + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Core.prototype._setScrollTop = function (scrollTop) { + this.props.scrollTop = scrollTop; + this._updateScrollTop(); + return this.props.scrollTop; }; - Legend.prototype.removeGroup = function(label) { - if (this.groups.hasOwnProperty(label)) { - delete this.groups[label]; - this.amountOfGroups -= 1; + /** + * Update the current scrollTop when the height of the containers has been changed + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Core.prototype._updateScrollTop = function () { + // recalculate the scrollTopMin + var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero + if (scrollTopMin != this.props.scrollTopMin) { + // in case of bottom orientation, change the scrollTop such that the contents + // do not move relative to the time axis at the bottom + if (this.options.orientation == 'bottom') { + this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); + } + this.props.scrollTopMin = scrollTopMin; } - }; - - Legend.prototype._create = function() { - this.dom.frame = document.createElement('div'); - this.dom.frame.className = 'legend'; - this.dom.frame.style.position = "absolute"; - this.dom.frame.style.top = "10px"; - this.dom.frame.style.display = "block"; - - this.dom.textArea = document.createElement('div'); - this.dom.textArea.className = 'legendText'; - this.dom.textArea.style.position = "relative"; - this.dom.textArea.style.top = "0px"; - this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.svg.style.position = 'absolute'; - this.svg.style.top = 0 +'px'; - this.svg.style.width = this.options.iconSize + 5 + 'px'; - this.svg.style.height = '100%'; + // limit the scrollTop to the feasible scroll range + if (this.props.scrollTop > 0) this.props.scrollTop = 0; + if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; - this.dom.frame.appendChild(this.svg); - this.dom.frame.appendChild(this.dom.textArea); + return this.props.scrollTop; }; /** - * Hide the component from the DOM + * Get the current scrollTop + * @returns {number} scrollTop + * @private */ - Legend.prototype.hide = function() { - // remove the frame containing the items - if (this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame); - } + Core.prototype._getScrollTop = function () { + return this.props.scrollTop; }; + module.exports = Core; + + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + /** - * Show the component in the DOM (when not already visible). - * @return {Boolean} changed + * Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent + * @param {Element} element + * @param {Event} event */ - Legend.prototype.show = function() { - // show frame containing the items - if (!this.dom.frame.parentNode) { - this.body.dom.center.appendChild(this.dom.frame); + exports.fakeGesture = function(element, event) { + var eventType = null; + + // for hammer.js 1.0.5 + // var gesture = Hammer.event.collectEventData(this, eventType, event); + + // for hammer.js 1.0.6+ + var touches = Hammer.event.getTouchList(event, eventType); + var gesture = Hammer.event.collectEventData(this, eventType, touches, event); + + // on IE in standards mode, no touches are recognized by hammer.js, + // resulting in NaN values for center.pageX and center.pageY + if (isNaN(gesture.center.pageX)) { + gesture.center.pageX = event.pageX; } + if (isNaN(gesture.center.pageY)) { + gesture.center.pageY = event.pageY; + } + + return gesture; }; - Legend.prototype.setOptions = function(options) { - var fields = ['enabled','orientation','icons','left','right']; - util.selectiveDeepExtend(fields, this.options, options); + +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { + + // English + exports['en'] = { + current: 'current', + time: 'time' }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; - Legend.prototype.redraw = function() { - var activeGroups = 0; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - activeGroups++; - } - } - } + // Dutch + exports['nl'] = { + custom: 'aangepaste', + time: 'tijd' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; - if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { - this.hide(); - } - else { - this.show(); - if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { - this.dom.frame.style.left = '4px'; - this.dom.frame.style.textAlign = "left"; - this.dom.textArea.style.textAlign = "left"; - this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; - this.dom.textArea.style.right = ''; - this.svg.style.left = 0 +'px'; - this.svg.style.right = ''; - } - else { - this.dom.frame.style.right = '4px'; - this.dom.frame.style.textAlign = "right"; - this.dom.textArea.style.textAlign = "right"; - this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; - this.dom.textArea.style.left = ''; - this.svg.style.right = 0 +'px'; - this.svg.style.left = ''; - } - if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { - this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; - this.dom.frame.style.bottom = ''; - } - else { - var scrollableHeight = this.body.domProps.center.height - this.body.domProps.centerContainer.height; - this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace("px","")) + 'px'; - this.dom.frame.style.top = ''; - } +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { - if (this.options.icons == false) { - this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; - this.dom.textArea.style.right = ''; - this.dom.textArea.style.left = ''; - this.svg.style.width = '0px'; - } - else { - this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' - this.drawLegendIcons(); - } + // English + exports['en'] = { + edit: 'Edit', + del: 'Delete selected', + back: 'Back', + addNode: 'Add Node', + addEdge: 'Add Edge', + editNode: 'Edit Node', + editEdge: 'Edit Edge', + addDescription: 'Click in an empty space to place a new node.', + edgeDescription: 'Click on a node and drag the edge to another node to connect them.', + editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.', + createEdgeError: 'Cannot link edges to a cluster.', + deleteClusterError: 'Clusters cannot be deleted.' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; - var content = ''; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - content += this.groups[groupId].content + '
'; - } - } - } - this.dom.textArea.innerHTML = content; - this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; - } + // Dutch + exports['nl'] = { + edit: 'Wijzigen', + del: 'Selectie verwijderen', + back: 'Terug', + addNode: 'Node toevoegen', + addEdge: 'Link toevoegen', + editNode: 'Node wijzigen', + editEdge: 'Link wijzigen', + addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.', + edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.', + editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.', + createEdgeError: 'Kan geen link maken naar een cluster.', + deleteClusterError: 'Clusters kunnen niet worden verwijderd.' }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; - Legend.prototype.drawLegendIcons = function() { - if (this.dom.frame.parentNode) { - DOMutil.prepareElements(this.svgElements); - var padding = window.getComputedStyle(this.dom.frame).paddingTop; - var iconOffset = Number(padding.replace('px','')); - var x = iconOffset; - var iconWidth = this.options.iconSize; - var iconHeight = 0.75 * this.options.iconSize; - var y = iconOffset + 0.5 * iconHeight + 3; - this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); - y += iconHeight + this.options.iconSpacing; - } - } - } + /** + * Canvas shapes used by Network + */ + if (typeof CanvasRenderingContext2D !== 'undefined') { - DOMutil.cleanupElements(this.svgElements); - } - }; + /** + * Draw a circle shape + */ + CanvasRenderingContext2D.prototype.circle = function(x, y, r) { + this.beginPath(); + this.arc(x, y, r, 0, 2*Math.PI, false); + }; - module.exports = Legend; + /** + * Draw a square shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r size, width and height of the square + */ + CanvasRenderingContext2D.prototype.square = function(x, y, r) { + this.beginPath(); + this.rect(x - r, y - r, r * 2, r * 2); + }; + /** + * Draw a triangle shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); -/***/ }, -/* 51 */ -/***/ function(module, exports, __webpack_require__) { + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height - var Emitter = __webpack_require__(11); - var Hammer = __webpack_require__(19); - var keycharm = __webpack_require__(36); - var util = __webpack_require__(1); - var hammerUtil = __webpack_require__(22); - var DataSet = __webpack_require__(7); - var DataView = __webpack_require__(9); - var dotparser = __webpack_require__(52); - var gephiParser = __webpack_require__(53); - var Groups = __webpack_require__(54); - var Images = __webpack_require__(55); - var Node = __webpack_require__(56); - var Edge = __webpack_require__(57); - var Popup = __webpack_require__(58); - var MixinLoader = __webpack_require__(59); - var Activator = __webpack_require__(35); - var locales = __webpack_require__(70); + this.moveTo(x, y - (h - ir)); + this.lineTo(x + s2, y + ir); + this.lineTo(x - s2, y + ir); + this.lineTo(x, y - (h - ir)); + this.closePath(); + }; - // Load custom shapes into CanvasRenderingContext2D - __webpack_require__(71); + /** + * Draw a triangle shape in downward orientation + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius + */ + CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); - /** - * @constructor Network - * Create a network visualization, displaying nodes and edges. - * - * @param {Element} container The DOM element in which the Network will - * be created. Normally a div element. - * @param {Object} data An object containing parameters - * {Array} nodes - * {Array} edges - * @param {Object} options Options - */ - function Network (container, data, options) { - if (!(this instanceof Network)) { - throw new SyntaxError('Constructor must be called with the new operator'); - } + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height - this._initializeMixinLoaders(); + this.moveTo(x, y + (h - ir)); + this.lineTo(x + s2, y - ir); + this.lineTo(x - s2, y - ir); + this.lineTo(x, y + (h - ir)); + this.closePath(); + }; - // create variables and set default values - this.containerElement = container; + /** + * Draw a star shape, a star with 5 points + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.star = function(x, y, r) { + // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ + this.beginPath(); - // render and calculation settings - this.renderRefreshRate = 60; // hz (fps) - this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on - this.renderTime = 0.5 * this.renderTimestep; // measured time it takes to render a frame - this.maxPhysicsTicksPerRender = 3; // max amount of physics ticks per render step. - this.physicsDiscreteStepsize = 0.50; // discrete stepsize of the simulation + for (var n = 0; n < 10; n++) { + var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; + this.lineTo( + x + radius * Math.sin(n * 2 * Math.PI / 10), + y - radius * Math.cos(n * 2 * Math.PI / 10) + ); + } - this.initializing = true; + this.closePath(); + }; - this.triggerFunctions = {add:null,edit:null,editEdge:null,connect:null,del:null}; + /** + * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas + */ + CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { + var r2d = Math.PI/180; + if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x + if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y + this.beginPath(); + this.moveTo(x+r,y); + this.lineTo(x+w-r,y); + this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); + this.lineTo(x+w,y+h-r); + this.arc(x+w-r,y+h-r,r,0,r2d*90,false); + this.lineTo(x+r,y+h); + this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); + this.lineTo(x,y+r); + this.arc(x+r,y+r,r,r2d*180,r2d*270,false); + }; - // set constant values - this.defaultOptions = { - nodes: { - mass: 1, - radiusMin: 10, - radiusMax: 30, - radius: 10, - shape: 'ellipse', - image: undefined, - widthMin: 16, // px - widthMax: 64, // px - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - fontFill: undefined, - level: -1, - color: { - border: '#2B7CE9', - background: '#97C2FC', - highlight: { - border: '#2B7CE9', - background: '#D2E5FF' - }, - hover: { - border: '#2B7CE9', - background: '#D2E5FF' - } - }, - borderColor: '#2B7CE9', - backgroundColor: '#97C2FC', - highlightColor: '#D2E5FF', - group: undefined, - borderWidth: 1, - borderWidthSelected: undefined - }, - edges: { - widthMin: 1, // - widthMax: 15,// - width: 1, - widthSelectionMultiplier: 2, - hoverWidth: 1.5, - style: 'line', - color: { - color:'#848484', - highlight:'#848484', - hover: '#848484' - }, - fontColor: '#343434', - fontSize: 14, // px - fontFace: 'arial', - fontFill: 'white', - arrowScaleFactor: 1, - dash: { - length: 10, - gap: 5, - altLength: undefined - }, - inheritColor: "from" // to, from, false, true (== from) - }, - configurePhysics:false, - physics: { - barnesHut: { - enabled: true, - theta: 1 / 0.6, // inverted to save time during calculation - gravitationalConstant: -2000, - centralGravity: 0.3, - springLength: 95, - springConstant: 0.04, - damping: 0.09 - }, - repulsion: { - centralGravity: 0.0, - springLength: 200, - springConstant: 0.05, - nodeDistance: 100, - damping: 0.09 - }, - hierarchicalRepulsion: { - enabled: false, - centralGravity: 0.0, - springLength: 100, - springConstant: 0.01, - nodeDistance: 150, - damping: 0.09 - }, - damping: null, - centralGravity: null, - springLength: null, - springConstant: null - }, - clustering: { // Per Node in Cluster = PNiC - enabled: false, // (Boolean) | global on/off switch for clustering. - initialMaxNodes: 100, // (# nodes) | if the initial amount of nodes is larger than this, we cluster until the total number is less than this threshold. - clusterThreshold:500, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than this. If it is, cluster until reduced to reduceToNodes - reduceToNodes:300, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than clusterThreshold. If it is, cluster until reduced to this - chainThreshold: 0.4, // (% of all drawn nodes)| maximum percentage of allowed chainnodes (long strings of connected nodes) within all nodes. (lower means less chains). - clusterEdgeThreshold: 20, // (px) | edge length threshold. if smaller, this node is clustered. - sectorThreshold: 100, // (# nodes in cluster) | cluster size threshold. If larger, expanding in own sector. - screenSizeThreshold: 0.2, // (% of canvas) | relative size threshold. If the width or height of a clusternode takes up this much of the screen, decluster node. - fontSizeMultiplier: 4.0, // (px PNiC) | how much the cluster font size grows per node in cluster (in px). - maxFontSize: 1000, - forceAmplification: 0.1, // (multiplier PNiC) | factor of increase fo the repulsion force of a cluster (per node in cluster). - distanceAmplification: 0.1, // (multiplier PNiC) | factor how much the repulsion distance of a cluster increases (per node in cluster). - edgeGrowth: 20, // (px PNiC) | amount of clusterSize connected to the edge is multiplied with this and added to edgeLength. - nodeScaling: {width: 1, // (px PNiC) | growth of the width per node in cluster. - height: 1, // (px PNiC) | growth of the height per node in cluster. - radius: 1}, // (px PNiC) | growth of the radius per node in cluster. - maxNodeSizeIncrements: 600, // (# increments) | max growth of the width per node in cluster. - activeAreaBoxSize: 80, // (px) | box area around the curser where clusters are popped open. - clusterLevelDifference: 2 - }, - navigation: { - enabled: false - }, - keyboard: { - enabled: false, - speed: {x: 10, y: 10, zoom: 0.02} - }, - dataManipulation: { - enabled: false, - initiallyVisible: false - }, - hierarchicalLayout: { - enabled:false, - levelSeparation: 150, - nodeSpacing: 100, - direction: "UD", // UD, DU, LR, RL - layout: "hubsize" // hubsize, directed - }, - freezeForStabilization: false, - smoothCurves: { - enabled: true, - dynamic: true, - type: "continuous", - roundness: 0.5 - }, - maxVelocity: 30, - minVelocity: 0.1, // px/s - stabilize: true, // stabilize before displaying the network - stabilizationIterations: 1000, // maximum number of iteration to stabilize - locale: 'en', - locales: locales, - tooltip: { - delay: 300, - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - color: { - border: '#666', - background: '#FFFFC6' - } - }, - dragNetwork: true, - dragNodes: true, - zoomable: true, - hover: false, - hideEdgesOnDrag: false, - hideNodesOnDrag: false, - width : '100%', - height : '100%', - selectable: true + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + this.beginPath(); + this.moveTo(x, ym); + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); }; - this.constants = util.extend({}, this.defaultOptions); - this.pixelRatio = 1; - - - this.hoverObj = {nodes:{},edges:{}}; - this.controlNodesActive = false; - this.navigationHammers = {existing:[], new: []}; - // animation properties - this.animationSpeed = 1/this.renderRefreshRate; - this.animationEasingFunction = "easeInOutQuint"; - this.easingTime = 0; - this.sourceScale = 0; - this.targetScale = 0; - this.sourceTranslation = 0; - this.targetTranslation = 0; - this.lockedOnNodeId = null; - this.lockedOnNodeOffset = null; - // Node variables - var network = this; - this.groups = new Groups(); // object with groups - this.images = new Images(); // object with images - this.images.setOnloadCallback(function () { - network._redraw(); - }); - // keyboard navigation variables - this.xIncrement = 0; - this.yIncrement = 0; - this.zoomIncrement = 0; + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { + var f = 1/3; + var wEllipse = w; + var hEllipse = h * f; - // loading all the mixins: - // load the force calculation functions, grouped under the physics system. - this._loadPhysicsSystem(); - // create a frame and canvas - this._create(); - // load the sector system. (mandatory, fully integrated with Network) - this._loadSectorSystem(); - // load the cluster system. (mandatory, even when not using the cluster system, there are function calls to it) - this._loadClusterSystem(); - // load the selection system. (mandatory, required by Network) - this._loadSelectionSystem(); - // load the selection system. (mandatory, required by Network) - this._loadHierarchySystem(); + var kappa = .5522848, + ox = (wEllipse / 2) * kappa, // control point offset horizontal + oy = (hEllipse / 2) * kappa, // control point offset vertical + xe = x + wEllipse, // x-end + ye = y + hEllipse, // y-end + xm = x + wEllipse / 2, // x-middle + ym = y + hEllipse / 2, // y-middle + ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse + yeb = y + h; // y-end, bottom ellipse + this.beginPath(); + this.moveTo(xe, ym); - // apply options - this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); - this._setScale(1); - this.setOptions(options); + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - // other vars - this.freezeSimulation = false;// freeze the simulation - this.cachedFunctions = {}; - this.startedStabilization = false; - this.stabilized = false; - this.stabilizationIterations = null; - this.draggingNodes = false; + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - // containers for nodes and edges - this.calculationNodes = {}; - this.calculationNodeIndices = []; - this.nodeIndices = []; // array with all the indices of the nodes. Used to speed up forces calculation - this.nodes = {}; // object with Node objects - this.edges = {}; // object with Edge objects + this.lineTo(xe, ymb); - // position and scale variables and objects - this.canvasTopLeft = {"x": 0,"y": 0}; // coordinates of the top left of the canvas. they will be set during _redraw. - this.canvasBottomRight = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw - this.pointerPosition = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw - this.areaCenter = {}; // object with x and y elements used for determining the center of the zoom action - this.scale = 1; // defining the global scale variable in the constructor - this.previousScale = this.scale; // this is used to check if the zoom operation is zooming in or out + this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); + this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); - // datasets or dataviews - this.nodesData = null; // A DataSet or DataView - this.edgesData = null; // A DataSet or DataView + this.lineTo(x, ym); + }; - // create event listeners used to subscribe on the DataSets of the nodes and edges - this.nodesListeners = { - 'add': function (event, params) { - network._addNodes(params.items); - network.start(); - }, - 'update': function (event, params) { - network._updateNodes(params.items, params.data); - network.start(); - }, - 'remove': function (event, params) { - network._removeNodes(params.items); - network.start(); - } + + /** + * Draw an arrow point (no line) + */ + CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { + // tail + var xt = x - length * Math.cos(angle); + var yt = y - length * Math.sin(angle); + + // inner tail + // TODO: allow to customize different shapes + var xi = x - length * 0.9 * Math.cos(angle); + var yi = y - length * 0.9 * Math.sin(angle); + + // left + var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); + var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); + + // right + var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); + var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); + + this.beginPath(); + this.moveTo(x, y); + this.lineTo(xl, yl); + this.lineTo(xi, yi); + this.lineTo(xr, yr); + this.closePath(); }; - this.edgesListeners = { - 'add': function (event, params) { - network._addEdges(params.items); - network.start(); - }, - 'update': function (event, params) { - network._updateEdges(params.items); - network.start(); - }, - 'remove': function (event, params) { - network._removeEdges(params.items); - network.start(); + + /** + * Sets up the dashedLine functionality for drawing + * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas + * @author David Jordan + * @date 2012-08-08 + */ + CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ + if (!dashArray) dashArray=[10,5]; + if (dashLength==0) dashLength = 0.001; // Hack for Safari + var dashCount = dashArray.length; + this.moveTo(x, y); + var dx = (x2-x), dy = (y2-y); + var slope = dy/dx; + var distRemaining = Math.sqrt( dx*dx + dy*dy ); + var dashIndex=0, draw=true; + while (distRemaining>=0.1){ + var dashLength = dashArray[dashIndex++%dashCount]; + if (dashLength > distRemaining) dashLength = distRemaining; + var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); + if (dx<0) xStep = -xStep; + x += xStep; + y += slope*xStep; + this[draw ? 'lineTo' : 'moveTo'](x,y); + distRemaining -= dashLength; + draw = !draw; } }; - // properties for the animation - this.moving = true; - this.timer = undefined; // Scheduling function. Is definded in this.start(); - - // load data (the disable start variable will be the same as the enabled clustering) - this.setData(data,this.constants.clustering.enabled || this.constants.hierarchicalLayout.enabled); - - // hierarchical layout - this.initializing = false; - if (this.constants.hierarchicalLayout.enabled == true) { - this._setupHierarchicalLayout(); - } - else { - // zoom so all data will fit on the screen, if clustering is enabled, we do not want start to be called here. - if (this.constants.stabilize == false) { - this.zoomExtent(undefined, true,this.constants.clustering.enabled); - } - } - - // if clustering is disabled, the simulation will have started in the setData function - if (this.constants.clustering.enabled) { - this.startWithClustering(); - } + // TODO: add diamond shape } - // Extend Network with an Emitter mixin - Emitter(Network.prototype); + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { /** - * Get the script path where the vis.js library is located - * - * @returns {string | null} path Path or null when not found. Path does not - * end with a slash. - * @private + * Created by Alex on 11/11/2014. */ - Network.prototype._getScriptPath = function() { - var scripts = document.getElementsByTagName( 'script' ); + var DOMutil = __webpack_require__(2); + var Points = __webpack_require__(53); - // find script named vis.js or vis.min.js - for (var i = 0; i < scripts.length; i++) { - var src = scripts[i].src; - var match = src && /\/?vis(.min)?\.js$/.exec(src); - if (match) { - // return path without the script name - return src.substring(0, src.length - match[0].length); - } - } + function Line(groupId, options) { + this.groupId = groupId; + this.options = options; + } - return null; + Line.prototype.getYRange = function(groupData) { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; }; /** - * Find the center position of the network - * @private + * draw a line graph + * + * @param dataset + * @param group */ - Network.prototype._getRange = function() { - var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (minX > (node.x)) {minX = node.x;} - if (maxX < (node.x)) {maxX = node.x;} - if (minY > (node.y)) {minY = node.y;} - if (maxY < (node.y)) {maxY = node.y;} + Line.prototype.draw = function (dataset, group, framework) { + if (dataset != null) { + if (dataset.length > 0) { + var path, d; + var svgHeight = Number(framework.svg.style.height.replace('px','')); + path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + path.setAttributeNS(null, "class", group.className); + if(group.style !== undefined) { + path.setAttributeNS(null, "style", group.style); + } + + // construct path from dataset + if (group.options.catmullRom.enabled == true) { + d = Line._catmullRom(dataset, group); + } + else { + d = Line._linear(dataset); + } + + // append with points for fill and finalize the path + if (group.options.shaded.enabled == true) { + var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + var dFill; + if (group.options.shaded.orientation == 'top') { + dFill = 'M' + dataset[0].x + ',' + 0 + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + 0; + } + else { + dFill = 'M' + dataset[0].x + ',' + svgHeight + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + svgHeight; + } + fillPath.setAttributeNS(null, "class", group.className + " fill"); + if(group.options.shaded.style !== undefined) { + fillPath.setAttributeNS(null, "style", group.options.shaded.style); + } + fillPath.setAttributeNS(null, "d", dFill); + } + // copy properties to path for drawing. + path.setAttributeNS(null, 'd', 'M' + d); + + // draw points + if (group.options.drawPoints.enabled == true) { + Points.draw(dataset, group, framework); + } } } - if (minX == 1e9 && maxX == -1e9 && minY == 1e9 && maxY == -1e9) { - minY = 0, maxY = 0, minX = 0, maxX = 0; - } - return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; }; + /** - * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - * @returns {{x: number, y: number}} + * This uses an uniform parametrization of the CatmullRom algorithm: + * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al. + * @param data + * @returns {string} * @private */ - Network.prototype._findCenter = function(range) { - return {x: (0.5 * (range.maxX + range.minX)), - y: (0.5 * (range.maxY + range.minY))}; - }; + Line._catmullRomUniform = function(data) { + // catmull rom + var p0, p1, p2, p3, bp1, bp2; + var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; + var normalization = 1/6; + var length = data.length; + for (var i = 0; i < length - 1; i++) { + + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; + + + // Catmull-Rom to Cubic Bezier conversion matrix + // 0 1 0 0 + // -1/6 1 1/6 0 + // 0 1/6 1 -1/6 + // 0 0 1 0 + // bp0 = { x: p1.x, y: p1.y }; + bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; + bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; + // bp0 = { x: p2.x, y: p2.y }; + + d += 'C' + + bp1.x + ',' + + bp1.y + ' ' + + bp2.x + ',' + + bp2.y + ' ' + + p2.x + ',' + + p2.y + ' '; + } + + return d; + }; /** - * This function zooms out to fit all data on screen based on amount of nodes + * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. + * By default, the centripetal parameterization is used because this gives the nicest results. + * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. * - * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; - * @param {Boolean} [disableStart] | If true, start is not called. + * One optimization can be used to reuse distances since this is a sliding window approach. + * @param data + * @param group + * @returns {string} + * @private */ - Network.prototype.zoomExtent = function(animationOptions, initialZoom, disableStart) { - if (initialZoom === undefined) { - initialZoom = false; - } - if (disableStart === undefined) { - disableStart = false; - } - if (animationOptions === undefined) { - animationOptions = false; + Line._catmullRom = function(data, group) { + var alpha = group.options.catmullRom.alpha; + if (alpha == 0 || alpha === undefined) { + return this._catmullRomUniform(data); } + else { + var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; + var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; + var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; + var length = data.length; + for (var i = 0; i < length - 1; i++) { - var range = this._getRange(); - var zoomLevel; + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; - if (initialZoom == true) { - var numberOfNodes = this.nodeIndices.length; - if (this.constants.smoothCurves == true) { - if (this.constants.clustering.enabled == true && - numberOfNodes >= this.constants.clustering.initialMaxNodes) { - zoomLevel = 49.07548 / (numberOfNodes + 142.05338) + 9.1444e-04; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. - } - else { - zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. - } - } - else { - if (this.constants.clustering.enabled == true && - numberOfNodes >= this.constants.clustering.initialMaxNodes) { - zoomLevel = 77.5271985 / (numberOfNodes + 187.266146) + 4.76710517e-05; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. - } - else { - zoomLevel = 30.5062972 / (numberOfNodes + 19.93597763) + 0.08413486; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. - } - } + d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); + d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); + d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); - // correct for larger canvasses. - var factor = Math.min(this.frame.canvas.clientWidth / 600, this.frame.canvas.clientHeight / 600); - zoomLevel *= factor; - } - else { - var xDistance = Math.abs(range.maxX - range.minX) * 1.1; - var yDistance = Math.abs(range.maxY - range.minY) * 1.1; + // Catmull-Rom to Cubic Bezier conversion matrix - var xZoomLevel = this.frame.canvas.clientWidth / xDistance; - var yZoomLevel = this.frame.canvas.clientHeight / yDistance; + // A = 2d1^2a + 3d1^a * d2^a + d3^2a + // B = 2d3^2a + 3d3^a * d2^a + d2^2a - zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; - } + // [ 0 1 0 0 ] + // [ -d2^2a /N A/N d1^2a /N 0 ] + // [ 0 d3^2a /M B/M -d2^2a /M ] + // [ 0 0 1 0 ] - if (zoomLevel > 1.0) { - zoomLevel = 1.0; - } + d3powA = Math.pow(d3, alpha); + d3pow2A = Math.pow(d3,2*alpha); + d2powA = Math.pow(d2, alpha); + d2pow2A = Math.pow(d2,2*alpha); + d1powA = Math.pow(d1, alpha); + d1pow2A = Math.pow(d1,2*alpha); + A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; + B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; + N = 3*d1powA * (d1powA + d2powA); + if (N > 0) {N = 1 / N;} + M = 3*d3powA * (d3powA + d2powA); + if (M > 0) {M = 1 / M;} - var center = this._findCenter(range); - if (disableStart == false) { - var options = {position: center, scale: zoomLevel, animation: animationOptions}; - this.moveTo(options); - this.moving = true; - this.start(); - } - else { - center.x *= zoomLevel; - center.y *= zoomLevel; - center.x -= 0.5 * this.frame.canvas.clientWidth; - center.y -= 0.5 * this.frame.canvas.clientHeight; - this._setScale(zoomLevel); - this._setTranslation(-center.x,-center.y); + bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), + y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; + + bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), + y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; + + if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} + if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} + d += 'C' + + bp1.x + ',' + + bp1.y + ' ' + + bp2.x + ',' + + bp2.y + ' ' + + p2.x + ',' + + p2.y + ' '; + } + + return d; } }; - /** - * Update the this.nodeIndices with the most recent node index list + * this generates the SVG path for a linear drawing between datapoints. + * @param data + * @returns {string} * @private */ - Network.prototype._updateNodeIndexList = function() { - this._clearNodeIndexList(); - for (var idx in this.nodes) { - if (this.nodes.hasOwnProperty(idx)) { - this.nodeIndices.push(idx); + Line._linear = function(data) { + // linear + var d = ''; + for (var i = 0; i < data.length; i++) { + if (i == 0) { + d += data[i].x + ',' + data[i].y; + } + else { + d += ' ' + data[i].x + ',' + data[i].y; } } + return d; }; + module.exports = Line; + + +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { /** - * Set nodes and edges, and optionally options as well. - * - * @param {Object} data Object containing parameters: - * {Array | DataSet | DataView} [nodes] Array with nodes - * {Array | DataSet | DataView} [edges] Array with edges - * {String} [dot] String containing data in DOT format - * {String} [gephi] String containing data in gephi JSON format - * {Options} [options] Object with options - * @param {Boolean} [disableStart] | optional: disable the calling of the start function. + * Created by Alex on 11/11/2014. */ - Network.prototype.setData = function(data, disableStart) { - if (disableStart === undefined) { - disableStart = false; - } - // we set initializing to true to ensure that the hierarchical layout is not performed until both nodes and edges are added. - this.initializing = true; + var DOMutil = __webpack_require__(2); + var Points = __webpack_require__(53); - if (data && data.dot && (data.nodes || data.edges)) { - throw new SyntaxError('Data must contain either parameter "dot" or ' + - ' parameter pair "nodes" and "edges", but not both.'); - } + function Bargraph(groupId, options) { + this.groupId = groupId; + this.options = options; + } - // set options - this.setOptions(data && data.options); - // set all data - if (data && data.dot) { - // parse DOT file - if(data && data.dot) { - var dotData = dotparser.DOTToGraph(data.dot); - this.setData(dotData); - return; - } - } - else if (data && data.gephi) { - // parse DOT file - if(data && data.gephi) { - var gephiData = gephiParser.parseGephi(data.gephi); - this.setData(gephiData); - return; + Bargraph.prototype.getYRange = function(groupData) { + if (this.options.barChart.handleOverlap != 'stack') { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (var j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; } else { - this._setNodes(data && data.nodes); - this._setEdges(data && data.edges); - } - this._putDataInSector(); - if (disableStart == false) { - if (this.constants.hierarchicalLayout.enabled == true) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - else { - // find a stable position or start animating to a stable position - if (this.constants.stabilize) { - this._stabilize(); - } + var barCombinedData = []; + for (var j = 0; j < groupData.length; j++) { + barCombinedData.push({ + x: groupData[j].x, + y: groupData[j].y, + groupId: this.groupId + }); } - this.start(); + return barCombinedData; } - this.initializing = false; }; - /** - * Set options - * @param {Object} options - */ - Network.prototype.setOptions = function (options) { - if (options) { - var prop; - - var fields = ['nodes','edges','smoothCurves','hierarchicalLayout','clustering','navigation', - 'keyboard','dataManipulation','onAdd','onEdit','onEditEdge','onConnect','onDelete','clickToUse' - ]; - // extend all but the values in fields - util.selectiveNotDeepExtend(fields,this.constants, options); - util.selectiveNotDeepExtend(['color'],this.constants.nodes, options.nodes); - util.selectiveNotDeepExtend(['color','length'],this.constants.edges, options.edges); - - if (options.physics) { - util.mergeOptions(this.constants.physics, options.physics,'barnesHut'); - util.mergeOptions(this.constants.physics, options.physics,'repulsion'); - - if (options.physics.hierarchicalRepulsion) { - this.constants.hierarchicalLayout.enabled = true; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this.constants.physics.barnesHut.enabled = false; - for (prop in options.physics.hierarchicalRepulsion) { - if (options.physics.hierarchicalRepulsion.hasOwnProperty(prop)) { - this.constants.physics.hierarchicalRepulsion[prop] = options.physics.hierarchicalRepulsion[prop]; - } - } - } - } - - if (options.onAdd) {this.triggerFunctions.add = options.onAdd;} - if (options.onEdit) {this.triggerFunctions.edit = options.onEdit;} - if (options.onEditEdge) {this.triggerFunctions.editEdge = options.onEditEdge;} - if (options.onConnect) {this.triggerFunctions.connect = options.onConnect;} - if (options.onDelete) {this.triggerFunctions.del = options.onDelete;} - - util.mergeOptions(this.constants, options,'smoothCurves'); - util.mergeOptions(this.constants, options,'hierarchicalLayout'); - util.mergeOptions(this.constants, options,'clustering'); - util.mergeOptions(this.constants, options,'navigation'); - util.mergeOptions(this.constants, options,'keyboard'); - util.mergeOptions(this.constants, options,'dataManipulation'); - - - if (options.dataManipulation) { - this.editMode = this.constants.dataManipulation.initiallyVisible; - } - - // TODO: work out these options and document them - if (options.edges) { - if (options.edges.color !== undefined) { - if (util.isString(options.edges.color)) { - this.constants.edges.color = {}; - this.constants.edges.color.color = options.edges.color; - this.constants.edges.color.highlight = options.edges.color; - this.constants.edges.color.hover = options.edges.color; - } - else { - if (options.edges.color.color !== undefined) {this.constants.edges.color.color = options.edges.color.color;} - if (options.edges.color.highlight !== undefined) {this.constants.edges.color.highlight = options.edges.color.highlight;} - if (options.edges.color.hover !== undefined) {this.constants.edges.color.hover = options.edges.color.hover;} - } - } - if (!options.edges.fontColor) { - if (options.edges.color !== undefined) { - if (util.isString(options.edges.color)) {this.constants.edges.fontColor = options.edges.color;} - else if (options.edges.color.color !== undefined) {this.constants.edges.fontColor = options.edges.color.color;} - } - } - } + /** + * draw a bar graph + * + * @param groupIds + * @param processedGroupData + */ + Bargraph.draw = function (groupIds, processedGroupData, framework) { + var combinedData = []; + var intersections = {}; + var coreDistance; + var key, drawData; + var group; + var i,j; + var barPoints = 0; - if (options.nodes) { - if (options.nodes.color) { - var newColorObj = util.parseColor(options.nodes.color); - this.constants.nodes.color.background = newColorObj.background; - this.constants.nodes.color.border = newColorObj.border; - this.constants.nodes.color.highlight.background = newColorObj.highlight.background; - this.constants.nodes.color.highlight.border = newColorObj.highlight.border; - this.constants.nodes.color.hover.background = newColorObj.hover.background; - this.constants.nodes.color.hover.border = newColorObj.hover.border; - } - } - if (options.groups) { - for (var groupname in options.groups) { - if (options.groups.hasOwnProperty(groupname)) { - var group = options.groups[groupname]; - this.groups.add(groupname, group); + // combine all barchart data + for (i = 0; i < groupIds.length; i++) { + group = framework.groups[groupIds[i]]; + if (group.options.style == 'bar') { + if (group.visible == true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] == true)) { + for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { + combinedData.push({ + x: processedGroupData[groupIds[i]][j].x, + y: processedGroupData[groupIds[i]][j].y, + groupId: groupIds[i] + }); + barPoints += 1; } } } + } - if (options.tooltip) { - for (prop in options.tooltip) { - if (options.tooltip.hasOwnProperty(prop)) { - this.constants.tooltip[prop] = options.tooltip[prop]; - } - } - if (options.tooltip.color) { - this.constants.tooltip.color = util.parseColor(options.tooltip.color); - } + if (barPoints == 0) {return;} + + // sort by time and by group + combinedData.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; } + }); - if ('clickToUse' in options) { - if (options.clickToUse) { - this.activator = new Activator(this.frame); - this.activator.on('change', this._createKeyBinds.bind(this)); + // get intersections + Bargraph._getDataIntersections(intersections, combinedData); + + // plot barchart + for (i = 0; i < combinedData.length; i++) { + group = framework.groups[combinedData[i].groupId]; + var minWidth = 0.1 * group.options.barChart.width; + + key = combinedData[i].x; + var heightOffset = 0; + if (intersections[key] === undefined) { + if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} + if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} + drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); + } + else { + var nextKey = i + (intersections[key].amount - intersections[key].resolved); + var prevKey = i - (intersections[key].resolved + 1); + if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} + if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} + drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); + intersections[key].resolved += 1; + + if (group.options.barChart.handleOverlap == 'stack') { + heightOffset = intersections[key].accumulated; + intersections[key].accumulated += group.zeroPosition - combinedData[i].y; } - else { - if (this.activator) { - this.activator.destroy(); - delete this.activator; - } + else if (group.options.barChart.handleOverlap == 'sideBySide') { + drawData.width = drawData.width / intersections[key].amount; + drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); + if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} + else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} } } - - if (options.labels) { - throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.'); + DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', framework.svgElements, framework.svg); + // draw points + if (group.options.drawPoints.enabled == true) { + DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg); } } - - // (Re)loading the mixins that can be enabled or disabled in the options. - // load the force calculation functions, grouped under the physics system. - this._loadPhysicsSystem(); - // load the navigation system. - this._loadNavigationControls(); - // load the data manipulation system - this._loadManipulationSystem(); - // configure the smooth curves - this._configureSmoothCurves(); - - - // bind keys. If disabled, this will not do anything; - this._createKeyBinds(); - this.setSize(this.constants.width, this.constants.height); - this.moving = true; - this.start(); }; - /** - * Create the main frame for the Network. - * This function is executed once when a Network object is created. The frame - * contains a canvas, and this canvas contains all objects like the axis and - * nodes. + * Fill the intersections object with counters of how many datapoints share the same x coordinates + * @param intersections + * @param combinedData * @private */ - Network.prototype._create = function () { - // remove all elements from the container element. - while (this.containerElement.hasChildNodes()) { - this.containerElement.removeChild(this.containerElement.firstChild); + Bargraph._getDataIntersections = function (intersections, combinedData) { + // get intersections + var coreDistance; + for (var i = 0; i < combinedData.length; i++) { + if (i + 1 < combinedData.length) { + coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + } + if (i > 0) { + coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); + } + if (coreDistance == 0) { + if (intersections[combinedData[i].x] === undefined) { + intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; + } + intersections[combinedData[i].x].amount += 1; + } } + }; - this.frame = document.createElement('div'); - this.frame.className = 'vis network-frame'; - this.frame.style.position = 'relative'; - this.frame.style.overflow = 'hidden'; - - - ////////////////////////////////////////////////////////////////// - - this.frame.canvas = document.createElement("canvas"); - - this.frame.canvas.style.position = 'relative'; - this.frame.appendChild(this.frame.canvas); + /** + * Get the width and offset for bargraphs based on the coredistance between datapoints + * + * @param coreDistance + * @param group + * @param minWidth + * @returns {{width: Number, offset: Number}} + * @private + */ + Bargraph._getSafeDrawData = function (coreDistance, group, minWidth) { + var width, offset; + if (coreDistance < group.options.barChart.width && coreDistance > 0) { + width = coreDistance < minWidth ? minWidth : coreDistance; - if (!this.frame.canvas.getContext) { - var noCanvas = document.createElement( 'DIV' ); - noCanvas.style.color = 'red'; - noCanvas.style.fontWeight = 'bold' ; - noCanvas.style.padding = '10px'; - noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; - this.frame.canvas.appendChild(noCanvas); + offset = 0; // recalculate offset with the new width; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * coreDistance; + } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * coreDistance; + } } else { + // default settings + width = group.options.barChart.width; + offset = 0; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * group.options.barChart.width; + } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * group.options.barChart.width; + } + } - var ctx = this.frame.canvas.getContext("2d"); - - this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || - ctx.mozBackingStorePixelRatio || - ctx.msBackingStorePixelRatio || - ctx.oBackingStorePixelRatio || - ctx.backingStorePixelRatio || 1); + return {width: width, offset: offset}; + }; + Bargraph.getStackedBarYRange = function(barCombinedData, groupRanges, groupIds, groupLabel, orientation) { + if (barCombinedData.length > 0) { + // sort by time and by group + barCombinedData.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + var intersections = {}; + Bargraph._getDataIntersections(intersections, barCombinedData); + groupRanges[groupLabel] = Bargraph._getStackedBarYRange(intersections, barCombinedData); + groupRanges[groupLabel].yAxisOrientation = orientation; + groupIds.push(groupLabel); + } + } - this.frame.canvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); + Bargraph._getStackedBarYRange = function (intersections, combinedData) { + var key; + var yMin = combinedData[0].y; + var yMax = combinedData[0].y; + for (var i = 0; i < combinedData.length; i++) { + key = combinedData[i].x; + if (intersections[key] === undefined) { + yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; + yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; + } + else { + intersections[key].accumulated += combinedData[i].y; + } + } + for (var xpos in intersections) { + if (intersections.hasOwnProperty(xpos)) { + yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; + yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; + } } - ////////////////////////////////////////////////////////////////// + return {min: yMin, max: yMax}; + }; + module.exports = Bargraph; - var me = this; - this.drag = {}; - this.pinch = {}; - this.hammer = Hammer(this.frame.canvas, { - prevent_default: true - }); - this.hammer.on('tap', me._onTap.bind(me) ); - this.hammer.on('doubletap', me._onDoubleTap.bind(me) ); - this.hammer.on('hold', me._onHold.bind(me) ); - this.hammer.on('pinch', me._onPinch.bind(me) ); - this.hammer.on('touch', me._onTouch.bind(me) ); - this.hammer.on('dragstart', me._onDragStart.bind(me) ); - this.hammer.on('drag', me._onDrag.bind(me) ); - this.hammer.on('dragend', me._onDragEnd.bind(me) ); - this.hammer.on('mousewheel',me._onMouseWheel.bind(me) ); - this.hammer.on('DOMMouseScroll',me._onMouseWheel.bind(me) ); // for FF - this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { - this.hammerFrame = Hammer(this.frame, { - prevent_default: true - }); + /** + * Created by Alex on 11/11/2014. + */ + var DOMutil = __webpack_require__(2); - this.hammerFrame.on('release', me._onRelease.bind(me) ); + function Points(groupId, options) { + this.groupId = groupId; + this.options = options; + } - // add the frame to the container element - this.containerElement.appendChild(this.frame); + Points.prototype.getYRange = function(groupData) { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; }; + Points.prototype.draw = function(dataset, group, framework, offset) { + Points.draw(dataset, group, framework, offset); + } /** - * Binding the keys for keyboard navigation. These functions are defined in the NavigationMixin - * @private + * draw the data points + * + * @param {Array} dataset + * @param {Object} JSONcontainer + * @param {Object} svg | SVG DOM element + * @param {GraphGroup} group + * @param {Number} [offset] */ - Network.prototype._createKeyBinds = function() { - var me = this; - if (this.keycharm !== undefined) { - this.keycharm.destroy(); + Points.draw = function (dataset, group, framework, offset) { + if (offset === undefined) {offset = 0;} + for (var i = 0; i < dataset.length; i++) { + DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, framework.svgElements, framework.svg); } - this.keycharm = keycharm(); + }; - this.keycharm.reset(); - if (this.constants.keyboard.enabled && this.isActive()) { - this.keycharm.bind("up", this._moveUp.bind(me) , "keydown"); - this.keycharm.bind("up", this._yStopMoving.bind(me), "keyup"); - this.keycharm.bind("down", this._moveDown.bind(me) , "keydown"); - this.keycharm.bind("down", this._yStopMoving.bind(me), "keyup"); - this.keycharm.bind("left", this._moveLeft.bind(me) , "keydown"); - this.keycharm.bind("left", this._xStopMoving.bind(me), "keyup"); - this.keycharm.bind("right",this._moveRight.bind(me), "keydown"); - this.keycharm.bind("right",this._xStopMoving.bind(me), "keyup"); - this.keycharm.bind("=", this._zoomIn.bind(me), "keydown"); - this.keycharm.bind("=", this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("num+", this._zoomIn.bind(me), "keydown"); - this.keycharm.bind("num+", this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("num-", this._zoomOut.bind(me), "keydown"); - this.keycharm.bind("num-", this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("-", this._zoomOut.bind(me), "keydown"); - this.keycharm.bind("-", this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("[", this._zoomIn.bind(me), "keydown"); - this.keycharm.bind("[", this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("]", this._zoomOut.bind(me), "keydown"); - this.keycharm.bind("]", this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("pageup",this._zoomIn.bind(me), "keydown"); - this.keycharm.bind("pageup",this._stopZoom.bind(me), "keyup"); - this.keycharm.bind("pagedown",this._zoomOut.bind(me),"keydown"); - this.keycharm.bind("pagedown",this._stopZoom.bind(me), "keyup"); - } + module.exports = Points; - if (this.constants.dataManipulation.enabled == true) { - this.keycharm.bind("esc",this._createManipulatorBar.bind(me)); - this.keycharm.bind("delete",this._deleteSelected.bind(me)); - } - }; +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + var PhysicsMixin = __webpack_require__(66); + var ClusterMixin = __webpack_require__(60); + var SectorsMixin = __webpack_require__(61); + var SelectionMixin = __webpack_require__(62); + var ManipulationMixin = __webpack_require__(63); + var NavigationMixin = __webpack_require__(64); + var HierarchicalLayoutMixin = __webpack_require__(65); /** - * Get the pointer location from a touch location - * @param {{pageX: Number, pageY: Number}} touch - * @return {{x: Number, y: Number}} pointer + * Load a mixin into the network object + * + * @param {Object} sourceVariable | this object has to contain functions. * @private */ - Network.prototype._getPointer = function (touch) { - return { - x: touch.pageX - util.getAbsoluteLeft(this.frame.canvas), - y: touch.pageY - util.getAbsoluteTop(this.frame.canvas) - }; + exports._loadMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = sourceVariable[mixinFunction]; + } + } }; + /** - * On start of a touch gesture, store the pointer - * @param event + * removes a mixin from the network object. + * + * @param {Object} sourceVariable | this object has to contain functions. * @private */ - Network.prototype._onTouch = function (event) { - this.drag.pointer = this._getPointer(event.gesture.center); - this.drag.pinched = false; - this.pinch.scale = this._getScale(); - - this._handleTouch(this.drag.pointer); + exports._clearMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = undefined; + } + } }; + /** - * handle drag start event + * Mixin the physics system and initialize the parameters required. + * * @private */ - Network.prototype._onDragStart = function () { - this._handleDragStart(); + exports._loadPhysicsSystem = function () { + this._loadMixin(PhysicsMixin); + this._loadSelectedForceSolver(); + if (this.constants.configurePhysics == true) { + this._loadPhysicsConfiguration(); + } }; /** - * This function is called by _onDragStart. - * It is separated out because we can then overload it for the datamanipulation system. + * Mixin the cluster system and initialize the parameters required. * * @private */ - Network.prototype._handleDragStart = function() { - var drag = this.drag; - var node = this._getNodeAt(drag.pointer); - // note: drag.pointer is set in _onTouch to get the initial touch location - - drag.dragging = true; - drag.selection = []; - drag.translation = this._getTranslation(); - drag.nodeId = null; - this.draggingNodes = false; - - if (node != null && this.constants.dragNodes == true) { - this.draggingNodes = true; - drag.nodeId = node.id; - // select the clicked node if not yet selected - if (!node.isSelected()) { - this._selectObject(node,false); - } - - this.emit("dragStart",{nodeIds:this.getSelection().nodes}); + exports._loadClusterSystem = function () { + this.clusterSession = 0; + this.hubThreshold = 5; + this._loadMixin(ClusterMixin); + }; - // create an array with the selected nodes and their original location and status - for (var objectId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(objectId)) { - var object = this.selectionObj.nodes[objectId]; - var s = { - id: object.id, - node: object, - // store original x, y, xFixed and yFixed, make the node temporarily Fixed - x: object.x, - y: object.y, - xFixed: object.xFixed, - yFixed: object.yFixed - }; + /** + * Mixin the sector system and initialize the parameters required + * + * @private + */ + exports._loadSectorSystem = function () { + this.sectors = {}; + this.activeSector = ["default"]; + this.sectors["active"] = {}; + this.sectors["active"]["default"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; + this.sectors["frozen"] = {}; + this.sectors["support"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; - object.xFixed = true; - object.yFixed = true; + this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields - drag.selection.push(s); - } - } - } + this._loadMixin(SectorsMixin); }; /** - * handle drag event + * Mixin the selection system and initialize the parameters required + * * @private */ - Network.prototype._onDrag = function (event) { - this._handleOnDrag(event) + exports._loadSelectionSystem = function () { + this.selectionObj = {nodes: {}, edges: {}}; + + this._loadMixin(SelectionMixin); }; /** - * This function is called by _onDrag. - * It is separated out because we can then overload it for the datamanipulation system. + * Mixin the navigationUI (User Interface) system and initialize the parameters required * * @private */ - Network.prototype._handleOnDrag = function(event) { - if (this.drag.pinched) { - return; - } - - // remove the focus on node if it is focussed on by the focusOnNode - this.releaseNode(); - - var pointer = this._getPointer(event.gesture.center); - var me = this; - var drag = this.drag; - var selection = drag.selection; - if (selection && selection.length && this.constants.dragNodes == true) { - // calculate delta's and new location - var deltaX = pointer.x - drag.pointer.x; - var deltaY = pointer.y - drag.pointer.y; - - // update position of all selected nodes - selection.forEach(function (s) { - var node = s.node; + exports._loadManipulationSystem = function () { + // reset global variables -- these are used by the selection of nodes and edges. + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; - if (!s.xFixed) { - node.x = me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x) + deltaX); + if (this.constants.dataManipulation.enabled == true) { + // load the manipulator HTML elements. All styling done in css. + if (this.manipulationDiv === undefined) { + this.manipulationDiv = document.createElement('div'); + this.manipulationDiv.className = 'network-manipulationDiv'; + if (this.editMode == true) { + this.manipulationDiv.style.display = "block"; } - - if (!s.yFixed) { - node.y = me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y) + deltaY); + else { + this.manipulationDiv.style.display = "none"; } - }); - + this.frame.appendChild(this.manipulationDiv); + } - // start _animationStep if not yet running - if (!this.moving) { - this.moving = true; - this.start(); + if (this.editModeDiv === undefined) { + this.editModeDiv = document.createElement('div'); + this.editModeDiv.className = 'network-manipulation-editMode'; + if (this.editMode == true) { + this.editModeDiv.style.display = "none"; + } + else { + this.editModeDiv.style.display = "block"; + } + this.frame.appendChild(this.editModeDiv); } - } - else { - if (this.constants.dragNetwork == true) { - // move the network - var diffX = pointer.x - this.drag.pointer.x; - var diffY = pointer.y - this.drag.pointer.y; - this._setTranslation( - this.drag.translation.x + diffX, - this.drag.translation.y + diffY - ); - this._redraw(); - // this.moving = true; - // this.start(); + if (this.closeDiv === undefined) { + this.closeDiv = document.createElement('div'); + this.closeDiv.className = 'network-manipulation-closeDiv'; + this.closeDiv.style.display = this.manipulationDiv.style.display; + this.frame.appendChild(this.closeDiv); } - } - }; - - /** - * handle drag start event - * @private - */ - Network.prototype._onDragEnd = function (event) { - this._handleDragEnd(event); - }; + // load the manipulation functions + this._loadMixin(ManipulationMixin); - Network.prototype._handleDragEnd = function(event) { - this.drag.dragging = false; - var selection = this.drag.selection; - if (selection && selection.length) { - selection.forEach(function (s) { - // restore original xFixed and yFixed - s.node.xFixed = s.xFixed; - s.node.yFixed = s.yFixed; - }); - this.moving = true; - this.start(); - } - else { - this._redraw(); - } - if (this.draggingNodes == false) { - this.emit("dragEnd",{nodeIds:[]}); + // create the manipulator toolbar + this._createManipulatorBar(); } else { - this.emit("dragEnd",{nodeIds:this.getSelection().nodes}); - } + if (this.manipulationDiv !== undefined) { + // removes all the bindings and overloads + this._createManipulatorBar(); - } - /** - * handle tap/click event: select/unselect a node - * @private - */ - Network.prototype._onTap = function (event) { - var pointer = this._getPointer(event.gesture.center); - this.pointerPosition = pointer; - this._handleTap(pointer); + // remove the manipulation divs + this.frame.removeChild(this.manipulationDiv); + this.frame.removeChild(this.editModeDiv); + this.frame.removeChild(this.closeDiv); + this.manipulationDiv = undefined; + this.editModeDiv = undefined; + this.closeDiv = undefined; + // remove the mixin functions + this._clearMixin(ManipulationMixin); + } + } }; /** - * handle doubletap event + * Mixin the navigation (User Interface) system and initialize the parameters required + * * @private */ - Network.prototype._onDoubleTap = function (event) { - var pointer = this._getPointer(event.gesture.center); - this._handleDoubleTap(pointer); + exports._loadNavigationControls = function () { + this._loadMixin(NavigationMixin); + // the clean function removes the button divs, this is done to remove the bindings. + this._cleanNavigation(); + if (this.constants.navigation.enabled == true) { + this._loadNavigationElements(); + } }; /** - * handle long tap event: multi select nodes - * @private - */ - Network.prototype._onHold = function (event) { - var pointer = this._getPointer(event.gesture.center); - this.pointerPosition = pointer; - this._handleOnHold(pointer); - }; - - /** - * handle the release of the screen + * Mixin the hierarchical layout system. * * @private */ - Network.prototype._onRelease = function (event) { - var pointer = this._getPointer(event.gesture.center); - this._handleOnRelease(pointer); + exports._loadHierarchySystem = function () { + this._loadMixin(HierarchicalLayoutMixin); }; - /** - * Handle pinch event - * @param event - * @private - */ - Network.prototype._onPinch = function (event) { - var pointer = this._getPointer(event.gesture.center); - this.drag.pinched = true; - if (!('scale' in this.pinch)) { - this.pinch.scale = 1; - } +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { - // TODO: enabled moving while pinching? - var scale = this.pinch.scale * event.gesture.scale; - this._zoom(scale, pointer) - }; + var keycharm = __webpack_require__(57); + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); /** - * Zoom the network in or out - * @param {Number} scale a number around 1, and between 0.01 and 10 - * @param {{x: Number, y: Number}} pointer Position on screen - * @return {Number} appliedScale scale is limited within the boundaries - * @private + * Turn an element into an clickToUse element. + * When not active, the element has a transparent overlay. When the overlay is + * clicked, the mode is changed to active. + * When active, the element is displayed with a blue border around it, and + * the interactive contents of the element can be used. When clicked outside + * the element, the elements mode is changed to inactive. + * @param {Element} container + * @constructor */ - Network.prototype._zoom = function(scale, pointer) { - if (this.constants.zoomable == true) { - var scaleOld = this._getScale(); - if (scale < 0.00001) { - scale = 0.00001; - } - if (scale > 10) { - scale = 10; - } - - var preScaleDragPointer = null; - if (this.drag !== undefined) { - if (this.drag.dragging == true) { - preScaleDragPointer = this.DOMtoCanvas(this.drag.pointer); - } - } - // + this.frame.canvas.clientHeight / 2 - var translation = this._getTranslation(); + function Activator(container) { + this.active = false; - var scaleFrac = scale / scaleOld; - var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; - var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; + this.dom = { + container: container + }; - this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), - "y" : this._YconvertDOMtoCanvas(pointer.y)}; + this.dom.overlay = document.createElement('div'); + this.dom.overlay.className = 'overlay'; - this._setScale(scale); - this._setTranslation(tx, ty); - this.updateClustersDefault(); + this.dom.container.appendChild(this.dom.overlay); - if (preScaleDragPointer != null) { - var postScaleDragPointer = this.canvasToDOM(preScaleDragPointer); - this.drag.pointer.x = postScaleDragPointer.x; - this.drag.pointer.y = postScaleDragPointer.y; - } + this.hammer = Hammer(this.dom.overlay, {prevent_default: false}); + this.hammer.on('tap', this._onTapOverlay.bind(this)); - this._redraw(); + // block all touch events (except tap) + var me = this; + var events = [ + 'touch', 'pinch', + 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + me.hammer.on(event, function (event) { + event.stopPropagation(); + }); + }); - if (scaleOld < scale) { - this.emit("zoom", {direction:"+"}); - } - else { - this.emit("zoom", {direction:"-"}); + // attach a tap event to the window, in order to deactivate when clicking outside the timeline + this.windowHammer = Hammer(window, {prevent_default: false}); + this.windowHammer.on('tap', function (event) { + // deactivate when clicked outside the container + if (!_hasParent(event.target, container)) { + me.deactivate(); } + }); - return scale; + if (this.keycharm !== undefined) { + this.keycharm.destroy(); } - }; - + this.keycharm = keycharm(); - /** - * Event handler for mouse wheel event, used to zoom the timeline - * See http://adomas.org/javascript-mouse-wheel/ - * https://github.com/EightMedia/hammer.js/issues/256 - * @param {MouseEvent} event - * @private - */ - Network.prototype._onMouseWheel = function(event) { - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail/3; - } + // keycharm listener only bounded when active) + this.escListener = this.deactivate.bind(this); + } - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { + // turn into an event emitter + Emitter(Activator.prototype); - // calculate the new scale - var scale = this._getScale(); - var zoom = delta / 10; - if (delta < 0) { - zoom = zoom / (1 - zoom); - } - scale *= (1 + zoom); + // The currently active activator + Activator.current = null; - // calculate the pointer location - var gesture = hammerUtil.fakeGesture(this, event); - var pointer = this._getPointer(gesture.center); + /** + * Destroy the activator. Cleans up all created DOM and event listeners + */ + Activator.prototype.destroy = function () { + this.deactivate(); - // apply the new scale - this._zoom(scale, pointer); - } + // remove dom + this.dom.overlay.parentNode.removeChild(this.dom.overlay); - // Prevent default actions caused by mouse wheel. - event.preventDefault(); + // cleanup hammer instances + this.hammer = null; + this.windowHammer = null; + // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory) }; - /** - * Mouse move handler for checking whether the title moves over a node with a title. - * @param {Event} event - * @private + * Activate the element + * Overlay is hidden, element is decorated with a blue shadow border */ - Network.prototype._onMouseMoveTitle = function (event) { - var gesture = hammerUtil.fakeGesture(this, event); - var pointer = this._getPointer(gesture.center); - - // check if the previously selected node is still selected - if (this.popupObj) { - this._checkHidePopup(pointer); + Activator.prototype.activate = function () { + // we allow only one active activator at a time + if (Activator.current) { + Activator.current.deactivate(); } + Activator.current = this; - // start a timeout that will check if the mouse is positioned above - // an element - var me = this; - var checkShow = function() { - me._checkShowPopup(pointer); - }; - if (this.popupTimer) { - clearInterval(this.popupTimer); // stop any running calculationTimer - } - if (!this.drag.dragging) { - this.popupTimer = setTimeout(checkShow, this.constants.tooltip.delay); - } + this.active = true; + this.dom.overlay.style.display = 'none'; + util.addClassName(this.dom.container, 'vis-active'); + this.emit('change'); + this.emit('activate'); - /** - * Adding hover highlights - */ - if (this.constants.hover == true) { - // removing all hover highlights - for (var edgeId in this.hoverObj.edges) { - if (this.hoverObj.edges.hasOwnProperty(edgeId)) { - this.hoverObj.edges[edgeId].hover = false; - delete this.hoverObj.edges[edgeId]; - } - } + // ugly hack: bind ESC after emitting the events, as the Network rebinds all + // keyboard events on a 'change' event + this.keycharm.bind('esc', this.escListener); + }; - // adding hover highlights - var obj = this._getNodeAt(pointer); - if (obj == null) { - obj = this._getEdgeAt(pointer); - } - if (obj != null) { - this._hoverObject(obj); - } + /** + * Deactivate the element + * Overlay is displayed on top of the element + */ + Activator.prototype.deactivate = function () { + this.active = false; + this.dom.overlay.style.display = ''; + util.removeClassName(this.dom.container, 'vis-active'); + this.keycharm.unbind('esc', this.escListener); - // removing all node hover highlights except for the selected one. - for (var nodeId in this.hoverObj.nodes) { - if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { - if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { - this._blurObject(this.hoverObj.nodes[nodeId]); - delete this.hoverObj.nodes[nodeId]; - } - } - } - this.redraw(); - } + this.emit('change'); + this.emit('deactivate'); }; /** - * Check if there is an element on the given position in the network - * (a node or edge). If so, and if this element has a title, - * show a popup window with its title. - * - * @param {{x:Number, y:Number}} pointer + * Handle a tap event: activate the container + * @param event * @private */ - Network.prototype._checkShowPopup = function (pointer) { - var obj = { - left: this._XconvertDOMtoCanvas(pointer.x), - top: this._YconvertDOMtoCanvas(pointer.y), - right: this._XconvertDOMtoCanvas(pointer.x), - bottom: this._YconvertDOMtoCanvas(pointer.y) - }; - - var id; - var lastPopupNode = this.popupObj; + Activator.prototype._onTapOverlay = function (event) { + // activate the container + this.activate(); + event.stopPropagation(); + }; - if (this.popupObj == undefined) { - // search the nodes for overlap, select the top one in case of multiple nodes - var nodes = this.nodes; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - var node = nodes[id]; - if (node.getTitle() !== undefined && node.isOverlappingWith(obj)) { - this.popupObj = node; - break; - } - } + /** + * Test whether the element has the requested parent element somewhere in + * its chain of parent nodes. + * @param {HTMLElement} element + * @param {HTMLElement} parent + * @returns {boolean} Returns true when the parent is found somewhere in the + * chain of parent nodes. + * @private + */ + function _hasParent(element, parent) { + while (element) { + if (element === parent) { + return true } + element = element.parentNode; } + return false; + } - if (this.popupObj === undefined) { - // search the edges for overlap - var edges = this.edges; - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - if (edge.connected && (edge.getTitle() !== undefined) && - edge.isOverlappingWith(obj)) { - this.popupObj = edge; - break; - } - } - } - } + module.exports = Activator; - if (this.popupObj) { - // show popup message window - if (this.popupObj != lastPopupNode) { - var me = this; - if (!me.popup) { - me.popup = new Popup(me.frame, me.constants.tooltip); - } - // adjust a small offset such that the mouse cursor is located in the - // bottom left location of the popup, and you can easily move over the - // popup area - me.popup.setPosition(pointer.x - 3, pointer.y - 3); - me.popup.setText(me.popupObj.getTitle()); - me.popup.show(); - } - } - else { - if (this.popup) { - this.popup.hide(); - } - } - }; +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + + /** + * Expose `Emitter`. + */ + module.exports = Emitter; /** - * Check if the popup must be hided, which is the case when the mouse is no - * longer hovering on the object - * @param {{x:Number, y:Number}} pointer - * @private + * Initialize a new `Emitter`. + * + * @api public */ - Network.prototype._checkHidePopup = function (pointer) { - if (!this.popupObj || !this._getNodeAt(pointer) ) { - this.popupObj = undefined; - if (this.popup) { - this.popup.hide(); - } - } - }; + function Emitter(obj) { + if (obj) return mixin(obj); + }; /** - * Set a new size for the network - * @param {string} width Width in pixels or percentage (for example '800px' - * or '50%') - * @param {string} height Height in pixels or percentage (for example '400px' - * or '30%') + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private */ - Network.prototype.setSize = function(width, height) { - var emitEvent = false; - var oldWidth = this.frame.canvas.width; - var oldHeight = this.frame.canvas.height; - if (width != this.constants.width || height != this.constants.height || this.frame.style.width != width || this.frame.style.height != height) { - this.frame.style.width = width; - this.frame.style.height = height; - this.frame.canvas.style.width = '100%'; - this.frame.canvas.style.height = '100%'; + function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; + } - this.frame.canvas.width = this.frame.canvas.clientWidth * this.pixelRatio; - this.frame.canvas.height = this.frame.canvas.clientHeight * this.pixelRatio; + /** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - this.constants.width = width; - this.constants.height = height; + Emitter.prototype.on = + Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks[event] = this._callbacks[event] || []) + .push(fn); + return this; + }; - emitEvent = true; - } - else { - // this would adapt the width of the canvas to the width from 100% if and only if - // there is a change. + /** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - if (this.frame.canvas.width != this.frame.canvas.clientWidth * this.pixelRatio) { - this.frame.canvas.width = this.frame.canvas.clientWidth * this.pixelRatio; - emitEvent = true; - } - if (this.frame.canvas.height != this.frame.canvas.clientHeight * this.pixelRatio) { - this.frame.canvas.height = this.frame.canvas.clientHeight * this.pixelRatio; - emitEvent = true; - } + Emitter.prototype.once = function(event, fn){ + var self = this; + this._callbacks = this._callbacks || {}; + + function on() { + self.off(event, on); + fn.apply(this, arguments); } - if (emitEvent == true) { - this.emit('resize', {width:this.frame.canvas.width * this.pixelRatio,height:this.frame.canvas.height * this.pixelRatio, oldWidth: oldWidth * this.pixelRatio, oldHeight: oldHeight * this.pixelRatio}); - } + on.fn = fn; + this.on(event, on); + return this; }; /** - * Set a data set with nodes for the network - * @param {Array | DataSet | DataView} nodes The data containing the nodes. - * @private + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public */ - Network.prototype._setNodes = function(nodes) { - var oldNodesData = this.nodesData; - if (nodes instanceof DataSet || nodes instanceof DataView) { - this.nodesData = nodes; - } - else if (Array.isArray(nodes)) { - this.nodesData = new DataSet(); - this.nodesData.add(nodes); - } - else if (!nodes) { - this.nodesData = new DataSet(); - } - else { - throw new TypeError('Array or DataSet expected'); - } + Emitter.prototype.off = + Emitter.prototype.removeListener = + Emitter.prototype.removeAllListeners = + Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; - if (oldNodesData) { - // unsubscribe from old dataset - util.forEach(this.nodesListeners, function (callback, event) { - oldNodesData.off(event, callback); - }); + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; } - // remove drawn nodes - this.nodes = {}; + // specific event + var callbacks = this._callbacks[event]; + if (!callbacks) return this; - if (this.nodesData) { - // subscribe to new dataset - var me = this; - util.forEach(this.nodesListeners, function (callback, event) { - me.nodesData.on(event, callback); - }); + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks[event]; + return this; + } - // draw all new nodes - var ids = this.nodesData.getIds(); - this._addNodes(ids); + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } } - this._updateSelection(); + return this; }; /** - * Add nodes - * @param {Number[] | String[]} ids - * @private + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} */ - Network.prototype._addNodes = function(ids) { - var id; - for (var i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - var data = this.nodesData.get(id); - var node = new Node(data, this.images, this.groups, this.constants); - this.nodes[id] = node; // note: this may replace an existing node - if ((node.xFixed == false || node.yFixed == false) && (node.x === null || node.y === null)) { - var radius = 10 * 0.1*ids.length + 10; - var angle = 2 * Math.PI * Math.random(); - if (node.xFixed == false) {node.x = radius * Math.cos(angle);} - if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + + Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks[event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); } - this.moving = true; } - this._updateNodeIndexList(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - this._updateCalculationNodes(); - this._reconnectEdges(); - this._updateValueRange(this.nodes); - this.updateLabels(); + return this; }; /** - * Update existing nodes, or create them when not yet existing - * @param {Number[] | String[]} ids - * @private + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public */ - Network.prototype._updateNodes = function(ids,changedData) { - var nodes = this.nodes; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var node = nodes[id]; - var data = changedData[i]; - if (node) { - // update node - node.setProperties(data, this.constants); - } - else { - // create node - node = new Node(properties, this.images, this.groups, this.constants); - nodes[id] = node; - } - } - this.moving = true; - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - this._updateNodeIndexList(); - this._updateValueRange(nodes); + + Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks[event] || []; }; /** - * Remove existing nodes. If nodes do not exist, the method will just ignore it. - * @param {Number[] | String[]} ids - * @private + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public */ - Network.prototype._removeNodes = function(ids) { - var nodes = this.nodes; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - delete nodes[id]; - } - this._updateNodeIndexList(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - this._updateCalculationNodes(); - this._reconnectEdges(); - this._updateSelection(); - this._updateValueRange(nodes); + + Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; }; - /** - * Load edges by reading the data table - * @param {Array | DataSet | DataView} edges The data containing the edges. - * @private - * @private + +/***/ }, +/* 57 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** + * Created by Alex on 11/6/2014. */ - Network.prototype._setEdges = function(edges) { - var oldEdgesData = this.edgesData; - if (edges instanceof DataSet || edges instanceof DataView) { - this.edgesData = edges; - } - else if (Array.isArray(edges)) { - this.edgesData = new DataSet(); - this.edgesData.add(edges); - } - else if (!edges) { - this.edgesData = new DataSet(); - } - else { - throw new TypeError('Array or DataSet expected'); + // https://github.com/umdjs/umd/blob/master/returnExports.js#L40-L60 + // if the module has no dependencies, the above pattern can be simplified to + (function (root, factory) { + if (true) { + // AMD. Register as an anonymous module. + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.keycharm = factory(); } + }(this, function () { - if (oldEdgesData) { - // unsubscribe from old dataset - util.forEach(this.edgesListeners, function (callback, event) { - oldEdgesData.off(event, callback); - }); - } + function keycharm(options) { + var preventDefault = options && options.preventDefault || false; - // remove drawn edges - this.edges = {}; + var _bound = {keydown:{}, keyup:{}}; + var _keys = {}; + var i; - if (this.edgesData) { - // subscribe to new dataset - var me = this; - util.forEach(this.edgesListeners, function (callback, event) { - me.edgesData.on(event, callback); - }); + // a - z + for (i = 97; i <= 122; i++) {_keys[String.fromCharCode(i)] = {code:65 + (i - 97), shift: false};} + // A - Z + for (i = 65; i <= 90; i++) {_keys[String.fromCharCode(i)] = {code:i, shift: true};} + // 0 - 9 + for (i = 0; i <= 9; i++) {_keys['' + i] = {code:48 + i, shift: false};} + // F1 - F12 + for (i = 1; i <= 12; i++) {_keys['F' + i] = {code:111 + i, shift: false};} + // num0 - num9 + for (i = 0; i <= 9; i++) {_keys['num' + i] = {code:96 + i, shift: false};} - // draw all new nodes - var ids = this.edgesData.getIds(); - this._addEdges(ids); - } + // numpad misc + _keys['num*'] = {code:106, shift: false}; + _keys['num+'] = {code:107, shift: false}; + _keys['num-'] = {code:109, shift: false}; + _keys['num/'] = {code:111, shift: false}; + _keys['num.'] = {code:110, shift: false}; + // arrows + _keys['left'] = {code:37, shift: false}; + _keys['up'] = {code:38, shift: false}; + _keys['right'] = {code:39, shift: false}; + _keys['down'] = {code:40, shift: false}; + // extra keys + _keys['space'] = {code:32, shift: false}; + _keys['enter'] = {code:13, shift: false}; + _keys['shift'] = {code:16, shift: undefined}; + _keys['esc'] = {code:27, shift: false}; + _keys['backspace'] = {code:8, shift: false}; + _keys['tab'] = {code:9, shift: false}; + _keys['ctrl'] = {code:17, shift: false}; + _keys['alt'] = {code:18, shift: false}; + _keys['delete'] = {code:46, shift: false}; + _keys['pageup'] = {code:33, shift: false}; + _keys['pagedown'] = {code:34, shift: false}; + // symbols + _keys['='] = {code:187, shift: false}; + _keys['-'] = {code:189, shift: false}; + _keys[']'] = {code:221, shift: false}; + _keys['['] = {code:219, shift: false}; - this._reconnectEdges(); - }; - /** - * Add edges - * @param {Number[] | String[]} ids - * @private - */ - Network.prototype._addEdges = function (ids) { - var edges = this.edges, - edgesData = this.edgesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; + var down = function(event) {handleEvent(event,'keydown');}; + var up = function(event) {handleEvent(event,'keyup');}; - var oldEdge = edges[id]; - if (oldEdge) { - oldEdge.disconnect(); - } + // handle the actualy bound key with the event + var handleEvent = function(event,type) { + if (_bound[type][event.keyCode] !== undefined) { + var bound = _bound[type][event.keyCode]; + for (var i = 0; i < bound.length; i++) { + if (bound[i].shift === undefined) { + bound[i].fn(event); + } + else if (bound[i].shift == true && event.shiftKey == true) { + bound[i].fn(event); + } + else if (bound[i].shift == false && event.shiftKey == false) { + bound[i].fn(event); + } + } - var data = edgesData.get(id, {"showInternalIds" : true}); - edges[id] = new Edge(data, this, this.constants); - } - this.moving = true; - this._updateValueRange(edges); - this._createBezierNodes(); - this._updateCalculationNodes(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - }; + if (preventDefault == true) { + event.preventDefault(); + } + } + }; - /** - * Update existing edges, or create them when not yet existing - * @param {Number[] | String[]} ids - * @private - */ - Network.prototype._updateEdges = function (ids) { - var edges = this.edges, - edgesData = this.edgesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; + // bind a key to a callback + this.bind = function(key, callback, type) { + if (type === undefined) { + type = 'keydown'; + } + if (_keys[key] === undefined) { + throw new Error("unsupported key: " + key); + } + if (_bound[type][_keys[key].code] === undefined) { + _bound[type][_keys[key].code] = []; + } + _bound[type][_keys[key].code].push({fn:callback, shift:_keys[key].shift}); + }; - var data = edgesData.get(id); - var edge = edges[id]; - if (edge) { - // update edge - edge.disconnect(); - edge.setProperties(data, this.constants); - edge.connect(); - } - else { - // create edge - edge = new Edge(data, this, this.constants); - this.edges[id] = edge; + + // bind all keys to a call back (demo purposes) + this.bindAll = function(callback, type) { + if (type === undefined) { + type = 'keydown'; + } + for (key in _keys) { + if (_keys.hasOwnProperty(key)) { + this.bind(key,callback,type); + } + } } - } - this._createBezierNodes(); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); + // get the key label from an event + this.getKey = function(event) { + for (key in _keys) { + if (_keys.hasOwnProperty(key)) { + if (event.shiftKey == true && _keys[key].shift == true && event.keyCode == _keys[key].code) { + return key; + } + else if (event.shiftKey == false && _keys[key].shift == false && event.keyCode == _keys[key].code) { + return key; + } + else if (event.keyCode == _keys[key].code && key == 'shift') { + return key; + } + } + } + return "unknown key, currently not supported"; + }; + + // unbind either a specific callback from a key or all of them (by leaving callback undefined) + this.unbind = function(key, callback, type) { + if (type === undefined) { + type = 'keydown'; + } + if (_keys[key] === undefined) { + throw new Error("unsupported key: " + key); + } + if (callback !== undefined) { + var newBindings = []; + var bound = _bound[type][_keys[key].code] + for (var i = 0; i < bound.length; i++) { + if (!(bound[i].fn == callback && bound[i].shift == _keys[key].shift)) { + newBindings.push(_bound[type][_keys[key].code][i]); + } + } + _bound[type][_keys[key].code] = newBindings; + } + else { + _bound[type][_keys[key].code] = []; + } + }; + + // reset all bound variables. + this.reset = function() { + _bound = {keydown:{}, keyup:{}}; + }; + + // unbind all listeners and reset all variables. + this.destroy = function() { + _bound = {keydown:{}, keyup:{}}; + window.removeEventListener('keydown', down, true); + window.removeEventListener('keyup', up, true); + }; + + // create listeners. + window.addEventListener('keydown',down,true); + window.addEventListener('keyup',up,true); + + // return the public functions. + return this; } - this.moving = true; - this._updateValueRange(edges); - }; - /** - * Remove existing edges. Non existing ids will be ignored - * @param {Number[] | String[]} ids - * @private - */ - Network.prototype._removeEdges = function (ids) { - var edges = this.edges; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var edge = edges[id]; - if (edge) { - if (edge.via != null) { - delete this.sectors['support']['nodes'][edge.via.id]; - } - edge.disconnect(); - delete edges[id]; - } - } + return keycharm; + })); + + + + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js + //! version : 2.8.4 + //! authors : Tim Wood, Iskren Chernev, Moment.js contributors + //! license : MIT + //! momentjs.com + + (function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.8.4', + // the global-scope this is NOT the global object in Node.js + globalScope = typeof global !== 'undefined' ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - this.moving = true; - this._updateValueRange(edges); - if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { - this._resetLevels(); - this._setupHierarchicalLayout(); - } - this._updateCalculationNodes(); - }; + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', - /** - * Reconnect all edges - * @private - */ - Network.prototype._reconnectEdges = function() { - var id, - nodes = this.nodes, - edges = this.edges; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].edges = []; - nodes[id].dynamicEdges = []; - } - } + isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] + ], - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - edge.from = null; - edge.to = null; - edge.connect(); - } - } - }; + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], - /** - * Update the values of all object in the given array according to the current - * value range of the objects in the array. - * @param {Object} obj An object containing a set of Edges or Nodes - * The objects must have a method getValue() and - * setValueRange(min, max). - * @private - */ - Network.prototype._updateValueRange = function(obj) { - var id; + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, - // determine the range of the objects - var valueMin = undefined; - var valueMax = undefined; - for (id in obj) { - if (obj.hasOwnProperty(id)) { - var value = obj[id].getValue(); - if (value !== undefined) { - valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); - valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); - } - } - } + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, - // adjust the range of all objects - if (valueMin !== undefined && valueMax !== undefined) { - for (id in obj) { - if (obj.hasOwnProperty(id)) { - obj[id].setValueRange(valueMin, valueMax); - } - } - } - }; + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, - /** - * Redraw the network with the current data - * chart will be resized too. - */ - Network.prototype.redraw = function() { - this.setSize(this.constants.width, this.constants.height); - this._redraw(); - }; + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, - /** - * Redraw the network with the current data - * @private - */ - Network.prototype._redraw = function() { - var ctx = this.frame.canvas.getContext('2d'); + // format function strings + formatFunctions = {}, - ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, - // clear the canvas - var w = this.frame.canvas.width * this.pixelRatio; - var h = this.frame.canvas.height * this.pixelRatio; - ctx.clearRect(0, 0, w, h); + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), - // set scaling and translation - ctx.save(); - ctx.translate(this.translation.x, this.translation.y); - ctx.scale(this.scale, this.scale); + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = -this.zone(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = -this.zone(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, - this.canvasTopLeft = { - "x": this._XconvertDOMtoCanvas(0), - "y": this._YconvertDOMtoCanvas(0) - }; - this.canvasBottomRight = { - "x": this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth * this.pixelRatio), - "y": this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight * this.pixelRatio) - }; + deprecations = {}, + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; - this._doInAllSectors("_drawAllSectorNodes",ctx); - if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideEdgesOnDrag == false) { - this._doInAllSectors("_drawEdges",ctx); - } + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } - if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideNodesOnDrag == false) { - this._doInAllSectors("_drawNodes",ctx,false); - } + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } - if (this.controlNodesActive == true) { - this._doInAllSectors("_drawControlNodes",ctx); - } + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } - // this._doInSupportSector("_drawNodes",ctx,true); - // this._drawTree(ctx,"#F00F0F"); + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } - // restore original scaling and translation - ctx.restore(); - }; + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } - /** - * Set the translation of the network - * @param {Number} offsetX Horizontal offset - * @param {Number} offsetY Vertical offset - * @private - */ - Network.prototype._setTranslation = function(offsetX, offsetY) { - if (this.translation === undefined) { - this.translation = { - x: 0, - y: 0 - }; - } + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } - if (offsetX !== undefined) { - this.translation.x = offsetX; - } - if (offsetY !== undefined) { - this.translation.y = offsetY; - } + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } - this.emit('viewChanged'); - }; + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); - /** - * Get the translation of the network - * @return {Object} translation An object with parameters x and y, both a number - * @private - */ - Network.prototype._getTranslation = function() { - return { - x: this.translation.x, - y: this.translation.y - }; - }; - /** - * Scale the network - * @param {Number} scale Scaling factor 1.0 is unscaled - * @private - */ - Network.prototype._setScale = function(scale) { - this.scale = scale; - }; + /************************************ + Constructors + ************************************/ - /** - * Get the current scale of the network - * @return {Number} scale Scaling factor 1.0 is unscaled - * @private - */ - Network.prototype._getScale = function() { - return this.scale; - }; + function Locale() { + } - /** - * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to - * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) - * @param {number} x - * @returns {number} - * @private - */ - Network.prototype._XconvertDOMtoCanvas = function(x) { - return (x - this.translation.x) / this.scale; - }; + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + } - /** - * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to - * the X coordinate in DOM-space (coordinate point in browser relative to the container div) - * @param {number} x - * @returns {number} - * @private - */ - Network.prototype._XconvertCanvasToDOM = function(x) { - return x * this.scale + this.translation.x; - }; + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; - /** - * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to - * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) - * @param {number} y - * @returns {number} - * @private - */ - Network.prototype._YconvertDOMtoCanvas = function(y) { - return (y - this.translation.y) / this.scale; - }; + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; - /** - * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to - * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) - * @param {number} y - * @returns {number} - * @private - */ - Network.prototype._YconvertCanvasToDOM = function(y) { - return y * this.scale + this.translation.y ; - }; + this._data = {}; + this._locale = moment.localeData(); - /** - * - * @param {object} pos = {x: number, y: number} - * @returns {{x: number, y: number}} - * @constructor - */ - Network.prototype.canvasToDOM = function (pos) { - return {x: this._XconvertCanvasToDOM(pos.x), y: this._YconvertCanvasToDOM(pos.y)}; - }; + this._bubble(); + } - /** - * - * @param {object} pos = {x: number, y: number} - * @returns {{x: number, y: number}} - * @constructor - */ - Network.prototype.DOMtoCanvas = function (pos) { - return {x: this._XconvertDOMtoCanvas(pos.x), y: this._YconvertDOMtoCanvas(pos.y)}; - }; + /************************************ + Helpers + ************************************/ - /** - * Redraw all nodes - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @param {Boolean} [alwaysShow] - * @private - */ - Network.prototype._drawNodes = function(ctx,alwaysShow) { - if (alwaysShow === undefined) { - alwaysShow = false; - } - // first draw the unselected nodes - var nodes = this.nodes; - var selected = []; + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); - if (nodes[id].isSelected()) { - selected.push(id); - } - else { - if (nodes[id].inArea() || alwaysShow) { - nodes[id].draw(ctx); + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; } - } - } - } - // draw the selected nodes on top - for (var s = 0, sMax = selected.length; s < sMax; s++) { - if (nodes[selected[s]].inArea() || alwaysShow) { - nodes[selected[s]].draw(ctx); - } - } - }; + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } - /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Network.prototype._drawEdges = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - edge.setScale(this.scale); - if (edge.connected) { - edges[id].draw(ctx); - } + return a; } - } - }; - /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Network.prototype._drawControlNodes = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - edges[id]._drawControlNodes(ctx); - } - } - }; + function copyConfig(to, from) { + var i, prop, val; - /** - * Find a stable position for all nodes - * @private - */ - Network.prototype._stabilize = function() { - if (this.constants.freezeForStabilization == true) { - this._freezeDefinedNodes(); - } + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } - // find stable position - var count = 0; - while (this.moving && count < this.constants.stabilizationIterations) { - this._physicsTick(); - count++; - } - this.zoomExtent(undefined,false,true); - if (this.constants.freezeForStabilization == true) { - this._restoreFrozenNodes(); - } - }; + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } - /** - * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization - * because only the supportnodes for the smoothCurves have to settle. - * - * @private - */ - Network.prototype._freezeDefinedNodes = function() { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].x != null && nodes[id].y != null) { - nodes[id].fixedData.x = nodes[id].xFixed; - nodes[id].fixedData.y = nodes[id].yFixed; - nodes[id].xFixed = true; - nodes[id].yFixed = true; - } + return to; } - } - }; - /** - * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. - * - * @private - */ - Network.prototype._restoreFrozenNodes = function() { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].fixedData.x != null) { - nodes[id].xFixed = nodes[id].fixedData.x; - nodes[id].yFixed = nodes[id].fixedData.y; - } + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } } - } - }; + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; - /** - * Check if any of the nodes is still moving - * @param {number} vmin the minimum velocity considered as 'moving' - * @return {boolean} true if moving, false if non of the nodes is moving - * @private - */ - Network.prototype._isMoving = function(vmin) { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { - return true; + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; } - } - return false; - }; + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; - /** - * /** - * Perform one discrete step for all nodes - * - * @private - */ - Network.prototype._discreteStepNodes = function() { - var interval = this.physicsDiscreteStepsize; - var nodes = this.nodes; - var nodeId; - var nodesPresent = false; + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } - if (this.constants.maxVelocity > 0) { - for (nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); - nodesPresent = true; - } - } - } - else { - for (nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - nodes[nodeId].discreteStep(interval); - nodesPresent = true; - } - } - } + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - if (nodesPresent == true) { - var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); - if (vminCorrected > 0.5*this.constants.maxVelocity) { - return true; - } - else { - return this._isMoving(vminCorrected); + return res; } - } - return false; - }; - /** - * A single simulation step (or "tick") in the physics simulation - * - * @private - */ - Network.prototype._physicsTick = function() { - if (!this.freezeSimulation) { - if (this.moving == true) { - var mainMovingStatus = false; - var supportMovingStatus = false; + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } - this._doInAllActiveSectors("_initializeForceCalculation"); - var mainMoving = this._doInAllActiveSectors("_discreteStepNodes"); - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - supportMovingStatus = this._doInSupportSector("_discreteStepNodes"); - } - // gather movement data from all sectors, if one moves, we are NOT stabilzied - for (var i = 0; i < mainMoving.length; i++) {mainMovingStatus = mainMoving[0] || mainMovingStatus;} + return res; + } - // determine if the network has stabilzied - this.moving = mainMovingStatus || supportMovingStatus; + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } - this.stabilizationIterations++; + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; } - } - }; + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; - /** - * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. - * It reschedules itself at the beginning of the function - * - * @private - */ - Network.prototype._animationStep = function() { - // reset the timer so a new scheduled animation step can be set - this.timer = undefined; - // handle the keyboad movement - this._handleNavigation(); + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } - // this schedules a new animation step - this.start(); + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } - // start the physics simulation - var calculationTime = Date.now(); - var maxSteps = 1; - this._physicsTick(); - var timeRequired = Date.now() - calculationTime; - while (timeRequired < 0.9*(this.renderTimestep - this.renderTime) && maxSteps < this.maxPhysicsTicksPerRender) { - this._physicsTick(); - timeRequired = Date.now() - calculationTime; - maxSteps++; - } - // start the rendering process - var renderTime = Date.now(); - this._redraw(); - this.renderTime = Date.now() - renderTime; - }; + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } - if (typeof window !== 'undefined') { - window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; - } + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } - /** - * Schedule a animation step with the refreshrate interval. - */ - Network.prototype.start = function() { - if (this.moving == true || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { - if (this.startedStabilization == false) { - this.emit("startStabilization"); - this.startedStabilization = true; + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; } - if (!this.timer) { - var ua = navigator.userAgent.toLowerCase(); + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; - var requiresTimeout = false; - if (ua.indexOf('msie 9.0') != -1) { // IE 9 - requiresTimeout = true; - } - else if (ua.indexOf('safari') != -1) { // safari - if (ua.indexOf('chrome') <= -1) { - requiresTimeout = true; + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } } - } - if (requiresTimeout == true) { - this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function - } - else{ - this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function - } + return normalizedInput; } - } - else { - this._redraw(); - if (this.stabilizationIterations > 0) { - // trigger the "stabilized" event. - // The event is triggered on the next tick, to prevent the case that - // it is fired while initializing the Network, in which case you would not - // be able to catch it - var me = this; - var params = { - iterations: me.stabilizationIterations - }; - me.stabilizationIterations = 0; - me.startedStabilization = false; - setTimeout(function () { - me.emit("stabilized", params); - }, 0); + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; } - } - }; + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; - /** - * Move the network according to the keyboard presses. - * - * @private - */ - Network.prototype._handleNavigation = function() { - if (this.xIncrement != 0 || this.yIncrement != 0) { - var translation = this._getTranslation(); - this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); - } - if (this.zoomIncrement != 0) { - var center = { - x: this.frame.canvas.clientWidth / 2, - y: this.frame.canvas.clientHeight / 2 - }; - this._zoom(this.scale*(1 + this.zoomIncrement), center); - } - }; + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + return value; + } - /** - * Freeze the _animationStep - */ - Network.prototype.toggleFreeze = function() { - if (this.freezeSimulation == false) { - this.freezeSimulation = true; - } - else { - this.freezeSimulation = false; - this.start(); - } - }; + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } - /** - * This function cleans the support nodes if they are not needed and adds them when they are. - * - * @param {boolean} [disableStart] - * @private - */ - Network.prototype._configureSmoothCurves = function(disableStart) { - if (disableStart === undefined) { - disableStart = true; - } - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._createBezierNodes(); - // cleanup unused support nodes - for (var nodeId in this.sectors['support']['nodes']) { - if (this.sectors['support']['nodes'].hasOwnProperty(nodeId)) { - if (this.edges[this.sectors['support']['nodes'][nodeId].parentEdgeId] === undefined) { - delete this.sectors['support']['nodes'][nodeId]; - } - } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; } - } - else { - // delete the support nodes - this.sectors['support']['nodes'] = {}; - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - this.edges[edgeId].via = null; - } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } - } + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; - this._updateCalculationNodes(); - if (!disableStart) { - this.moving = true; - this.start(); - } - }; + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + m._pf.overflow = overflow; + } + } - /** - * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but - * are used for the force calculation. - * - * @private - */ - Network.prototype._createBezierNodes = function() { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - var edge = this.edges[edgeId]; - if (edge.via == null) { - var nodeId = "edgeId:".concat(edge.id); - this.sectors['support']['nodes'][nodeId] = new Node( - {id:nodeId, - mass:1, - shape:'circle', - image:"", - internalMultiplier:1 - },{},{},this.constants); - edge.via = this.sectors['support']['nodes'][nodeId]; - edge.via.parentEdgeId = edge.id; - edge.positionBezierNode(); + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } } - } + return m._isValid; } - } - }; - /** - * load the functions that load the mixins into the prototype. - * - * @private - */ - Network.prototype._initializeMixinLoaders = function () { - for (var mixin in MixinLoader) { - if (MixinLoader.hasOwnProperty(mixin)) { - Network.prototype[mixin] = MixinLoader[mixin]; + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; } - } - }; - /** - * Load the XY positions of the nodes into the dataset. - */ - Network.prototype.storePosition = function() { - console.log("storePosition is depricated: use .storePositions() from now on.") - this.storePositions(); - }; + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; - /** - * Load the XY positions of the nodes into the dataset. - */ - Network.prototype.storePositions = function() { - var dataArray = []; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - var allowedToMoveX = !this.nodes.xFixed; - var allowedToMoveY = !this.nodes.yFixed; - if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { - dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); - } + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; } - } - this.nodesData.update(dataArray); - }; - /** - * Return the positions of the nodes. - */ - Network.prototype.getPositions = function(ids) { - var dataArray = {}; - if (ids !== undefined) { - if (Array.isArray(ids) == true) { - for (var i = 0; i < ids.length; i++) { - if (this.nodes[ids[i]] !== undefined) { - var node = this.nodes[ids[i]]; - dataArray[ids[i]] = {x: Math.round(node.x), y: Math.round(node.y)}; + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + !(function webpackMissingModule() { var e = new Error("Cannot find module \"./locale\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } } - } - } - else { - if (this.nodes[ids] !== undefined) { - var node = this.nodes[ids]; - dataArray[ids] = {x: Math.round(node.x), y: Math.round(node.y)}; - } + return locales[name]; } - } - else { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - dataArray[nodeId] = {x: Math.round(node.x), y: Math.round(node.y)}; - } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } } - } - return dataArray; - }; + /************************************ + Locale + ************************************/ - /** - * Center a node in view. - * - * @param {Number} nodeId - * @param {Number} [options] - */ - Network.prototype.focusOnNode = function (nodeId, options) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (options === undefined) { - options = {}; - } - var nodePosition = {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; - options.position = nodePosition; - options.lockedOnNode = nodeId; + extend(Locale.prototype, { - this.moveTo(options) - } - else { - console.log("This nodeId cannot be found."); - } - }; + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, - /** - * - * @param {Object} options | options.offset = {x:Number, y:Number} // offset from the center in DOM pixels - * | options.scale = Number // scale to move to - * | options.position = {x:Number, y:Number} // position to move to - * | options.animation = {duration:Number, easingFunction:String} || Boolean // position to move to - */ - Network.prototype.moveTo = function (options) { - if (options === undefined) { - options = {}; - return; - } - if (options.offset === undefined) {options.offset = {x: 0, y: 0}; } - if (options.offset.x === undefined) {options.offset.x = 0; } - if (options.offset.y === undefined) {options.offset.y = 0; } - if (options.scale === undefined) {options.scale = this._getScale(); } - if (options.position === undefined) {options.position = this._getTranslation();} - if (options.animation === undefined) {options.animation = {duration:0}; } - if (options.animation === false ) {options.animation = {duration:0}; } - if (options.animation === true ) {options.animation = {}; } - if (options.animation.duration === undefined) {options.animation.duration = 1000; } // default duration - if (options.animation.easingFunction === undefined) {options.animation.easingFunction = "easeInOutQuad"; } // default easing function + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, - this.animateView(options); - }; + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, - /** - * - * @param {Object} options | options.offset = {x:Number, y:Number} // offset from the center in DOM pixels - * | options.time = Number // animation time in milliseconds - * | options.scale = Number // scale to animate to - * | options.position = {x:Number, y:Number} // position to animate to - * | options.easingFunction = String // linear, easeInQuad, easeOutQuad, easeInOutQuad, - * // easeInCubic, easeOutCubic, easeInOutCubic, - * // easeInQuart, easeOutQuart, easeInOutQuart, - * // easeInQuint, easeOutQuint, easeInOutQuint - */ - Network.prototype.animateView = function (options) { - if (options === undefined) { - options = {}; - return; - } + monthsParse : function (monthName, format, strict) { + var i, mom, regex; - // release if something focussed on the node - this.releaseNode(); - if (options.locked == true) { - this.lockedOnNodeId = options.lockedOnNode; - this.lockedOnNodeOffset = options.offset; - } + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } - // forcefully complete the old animation if it was still running - if (this.easingTime != 0) { - this._transitionRedraw(1); // by setting easingtime to 1, we finish the animation. - } + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, - this.sourceScale = this._getScale(); - this.sourceTranslation = this._getTranslation(); - this.targetScale = options.scale; + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, - // set the scale so the viewCenter is based on the correct zoom level. This is overridden in the transitionRedraw - // but at least then we'll have the target transition - this._setScale(this.targetScale); - var viewCenter = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); - var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node - x: viewCenter.x - options.position.x, - y: viewCenter.y - options.position.y - }; - this.targetTranslation = { - x: this.sourceTranslation.x + distanceFromCenter.x * this.targetScale + options.offset.x, - y: this.sourceTranslation.y + distanceFromCenter.y * this.targetScale + options.offset.y - }; + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, - // if the time is set to 0, don't do an animation - if (options.animation.duration == 0) { - if (this.lockedOnNodeId != null) { - this._classicRedraw = this._redraw; - this._redraw = this._lockedRedraw; - } - else { - this._setScale(this.targetScale); - this._setTranslation(this.targetTranslation.x, this.targetTranslation.y); - this._redraw(); - } - } - else { - this.animationSpeed = 1 / (this.renderRefreshRate * options.animation.duration * 0.001) || 1 / this.renderRefreshRate; - this.animationEasingFunction = options.animation.easingFunction; - this._classicRedraw = this._redraw; - this._redraw = this._transitionRedraw; - this._redraw(); - this.moving = true; - this.start(); - } - }; + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + weekdaysParse : function (weekdayName) { + var i, mom, regex; - Network.prototype._lockedRedraw = function () { - var nodePosition = {x: this.nodes[this.lockedOnNodeId].x, y: this.nodes[this.lockedOnNodeId].y}; - var viewCenter = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); - var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node - x: viewCenter.x - nodePosition.x, - y: viewCenter.y - nodePosition.y - }; - var sourceTranslation = this._getTranslation(); - var targetTranslation = { - x: sourceTranslation.x + distanceFromCenter.x * this.scale + this.lockedOnNodeOffset.x, - y: sourceTranslation.y + distanceFromCenter.y * this.scale + this.lockedOnNodeOffset.y - }; + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } - this._setTranslation(targetTranslation.x,targetTranslation.y); - this._classicRedraw(); - } + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, - Network.prototype.releaseNode = function () { - if (this.lockedOnNodeId != null) { - this._redraw = this._classicRedraw; - this.lockedOnNodeId = null; - this.lockedOnNodeOffset = null; - } - } + _longDateFormat : { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM D, YYYY LT' + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, - /** - * - * @param easingTime - * @private - */ - Network.prototype._transitionRedraw = function (easingTime) { - this.easingTime = easingTime || this.easingTime + this.animationSpeed; - this.easingTime += this.animationSpeed; + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, - var progress = util.easingFunctions[this.animationEasingFunction](this.easingTime); + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, + + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, - this._setScale(this.sourceScale + (this.targetScale - this.sourceScale) * progress); - this._setTranslation( - this.sourceTranslation.x + (this.targetTranslation.x - this.sourceTranslation.x) * progress, - this.sourceTranslation.y + (this.targetTranslation.y - this.sourceTranslation.y) * progress - ); + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, - this._classicRedraw(); - this.moving = true; + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, - // cleanup - if (this.easingTime >= 1.0) { - this.easingTime = 0; - if (this.lockedOnNodeId != null) { - this._redraw = this._lockedRedraw; - } - else { - this._redraw = this._classicRedraw; - } - this.emit("animationFinished"); - } - }; + preparse : function (string) { + return string; + }, - Network.prototype._classicRedraw = function () { - // placeholder function to be overloaded by animations; - }; + postformat : function (string) { + return string; + }, - /** - * Returns true when the Network is active. - * @returns {boolean} - */ - Network.prototype.isActive = function () { - return !this.activator || this.activator.active; - }; + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, - /** - * Sets the scale - * @returns {Number} - */ - Network.prototype.setScale = function () { - return this._setScale(); - }; + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + /************************************ + Formatting + ************************************/ - /** - * Returns the scale - * @returns {Number} - */ - Network.prototype.getScale = function () { - return this._getScale(); - }; + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } - /** - * Returns the scale - * @returns {Number} - */ - Network.prototype.getCenterCoordinates = function () { - return this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); - }; + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; - module.exports = Network; + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } -/***/ }, -/* 52 */ -/***/ function(module, exports, __webpack_require__) { + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } - /** - * Parse a text source containing data in DOT language into a JSON object. - * The object contains two lists: one with nodes and one with edges. - * - * DOT language reference: http://www.graphviz.org/doc/info/lang.html - * - * @param {String} data Text containing a graph in DOT-notation - * @return {Object} graph An object containing two parameters: - * {Object[]} nodes - * {Object[]} edges - */ - function parseDOT (data) { - dot = data; - return parseGraph(); - } + format = expandFormat(format, m.localeData()); - // token types enumeration - var TOKENTYPE = { - NULL : 0, - DELIMITER : 1, - IDENTIFIER: 2, - UNKNOWN : 3 - }; + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } - // map with all delimiters - var DELIMITERS = { - '{': true, - '}': true, - '[': true, - ']': true, - ';': true, - '=': true, - ',': true, + return formatFunctions[format](m); + } - '->': true, - '--': true - }; + function expandFormat(format, locale) { + var i = 5; - var dot = ''; // current dot file - var index = 0; // current index in dot file - var c = ''; // current token character in expr - var token = ''; // current token - var tokenType = TOKENTYPE.NULL; // type of the token + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } - /** - * Get the first character from the dot file. - * The character is stored into the char c. If the end of the dot file is - * reached, the function puts an empty string in c. - */ - function first() { - index = 0; - c = dot.charAt(0); - } + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } - /** - * Get the next character from the dot file. - * The character is stored into the char c. If the end of the dot file is - * reached, the function puts an empty string in c. - */ - function next() { - index++; - c = dot.charAt(index); - } + return format; + } - /** - * Preview the next character from the dot file. - * @return {String} cNext - */ - function nextPreview() { - return dot.charAt(index + 1); - } - /** - * Test whether given character is alphabetic or numeric - * @param {String} c - * @return {Boolean} isAlphaNumeric - */ - var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; - function isAlphaNumeric(c) { - return regexAlphaNumeric.test(c); - } + /************************************ + Parsing + ************************************/ - /** - * Merge all properties of object b into object b - * @param {Object} a - * @param {Object} b - * @return {Object} a - */ - function merge (a, b) { - if (!a) { - a = {}; - } - if (b) { - for (var name in b) { - if (b.hasOwnProperty(name)) { - a[name] = b[name]; - } + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } } - } - return a; - } - /** - * Set a value in an object, where the provided parameter name can be a - * path with nested parameters. For example: - * - * var obj = {a: 2}; - * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} - * - * @param {Object} obj - * @param {String} path A parameter name or dot-separated parameter path, - * like "color.highlight.border". - * @param {*} value - */ - function setValue(obj, path, value) { - var keys = path.split('.'); - var o = obj; - while (keys.length) { - var key = keys.shift(); - if (keys.length) { - // this isn't the end point - if (!o[key]) { - o[key] = {}; - } - o = o[key]; - } - else { - // this is the end point - o[key] = value; - } - } - } + function timezoneMinutesFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); - /** - * Add a node to a graph object. If there is already a node with - * the same id, their attributes will be merged. - * @param {Object} graph - * @param {Object} node - */ - function addNode(graph, node) { - var i, len; - var current = null; + return parts[0] === '+' ? -minutes : minutes; + } - // find root graph (in case of subgraph) - var graphs = [graph]; // list with all graphs from current graph to root graph - var root = graph; - while (root.parent) { - graphs.push(root.parent); - root = root.parent; - } + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; - // find existing node (at root level) by its id - if (root.nodes) { - for (i = 0, len = root.nodes.length; i < len; i++) { - if (node.id === root.nodes[i].id) { - current = root.nodes[i]; - break; - } - } - } + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } - if (!current) { - // this is a new node - current = { - id: node.id - }; - if (graph.node) { - // clone default attributes - current.attr = merge(current.attr, graph.node); + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = timezoneMinutesFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } } - } - // add node to this (sub)graph and all its parent graphs - for (i = graphs.length - 1; i >= 0; i--) { - var g = graphs[i]; + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; - if (!g.nodes) { - g.nodes = []; - } - if (g.nodes.indexOf(current) == -1) { - g.nodes.push(current); + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; } - } - // merge attributes - if (node.attr) { - current.attr = merge(current.attr, node.attr); - } - } + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; - /** - * Add an edge to a graph object - * @param {Object} graph - * @param {Object} edge - */ - function addEdge(graph, edge) { - if (!graph.edges) { - graph.edges = []; - } - graph.edges.push(edge); - if (graph.edge) { - var attr = merge({}, graph.edge); // clone default attributes - edge.attr = merge(attr, edge.attr); // merge attributes - } - } + if (config._d) { + return; + } - /** - * Create an edge to a graph object - * @param {Object} graph - * @param {String | Number | Object} from - * @param {String | Number | Object} to - * @param {String} type - * @param {Object | null} attr - * @return {Object} edge - */ - function createEdge(graph, from, to, type, attr) { - var edge = { - from: from, - to: to, - type: type - }; + currentDate = currentDateArray(config); - if (graph.edge) { - edge.attr = merge({}, graph.edge); // clone default attributes - } - edge.attr = merge(edge.attr || {}, attr); // merge attributes + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } - return edge; - } + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); - /** - * Get next token in the current dot file. - * The token and token type are available as token and tokenType - */ - function getToken() { - tokenType = TOKENTYPE.NULL; - token = ''; + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } - // skip over whitespaces - while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter - next(); - } + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } - do { - var isComment = false; + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } - // skip comment - if (c == '#') { - // find the previous non-space character - var i = index - 1; - while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { - i--; - } - if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { - // the # is at the start of a line, this is indeed a line comment - while (c != '' && c != '\n') { - next(); + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } - isComment = true; - } - } - if (c == '/' && nextPreview() == '/') { - // skip line comment - while (c != '' && c != '\n') { - next(); - } - isComment = true; - } - if (c == '/' && nextPreview() == '*') { - // skip block comment - while (c != '') { - if (c == '*' && nextPreview() == '/') { - // end of block comment found. skip these last two characters - next(); - next(); - break; + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; } - else { - next(); + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual zone can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); } - } - isComment = true; - } - // skip over whitespaces - while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter - next(); + if (config._nextDay) { + config._a[HOUR] = 24; + } } - } - while (isComment); - - // check for end of dot file - if (c == '') { - // token is still empty - tokenType = TOKENTYPE.DELIMITER; - return; - } - // check for delimiters consisting of 2 characters - var c2 = c + nextPreview(); - if (DELIMITERS[c2]) { - tokenType = TOKENTYPE.DELIMITER; - token = c2; - next(); - next(); - return; - } + function dateFromObject(config) { + var normalizedInput; - // check for delimiters consisting of 1 character - if (DELIMITERS[c]) { - tokenType = TOKENTYPE.DELIMITER; - token = c; - next(); - return; - } + if (config._d) { + return; + } - // check for an identifier (number or string) - // TODO: more precise parsing of numbers/strings (and the port separator ':') - if (isAlphaNumeric(c) || c == '-') { - token += c; - next(); + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; - while (isAlphaNumeric(c)) { - token += c; - next(); - } - if (token == 'false') { - token = false; // convert to boolean - } - else if (token == 'true') { - token = true; // convert to boolean - } - else if (!isNaN(Number(token))) { - token = Number(token); // convert to number + dateFromConfig(config); } - tokenType = TOKENTYPE.IDENTIFIER; - return; - } - // check for a string enclosed by double quotes - if (c == '"') { - next(); - while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { - token += c; - if (c == '"') { // skip the escape character - next(); - } - next(); - } - if (c != '"') { - throw newSyntaxError('End of string " expected'); + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } } - next(); - tokenType = TOKENTYPE.IDENTIFIER; - return; - } - // something unknown is found, wrong characters, a syntax error - tokenType = TOKENTYPE.UNKNOWN; - while (c != '') { - token += c; - next(); - } - throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); - } + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } - /** - * Parse a graph. - * @returns {Object} graph - */ - function parseGraph() { - var graph = {}; + config._a = []; + config._pf.empty = true; - first(); - getToken(); + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; - // optional strict keyword - if (token == 'strict') { - graph.strict = true; - getToken(); - } + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - // graph or digraph keyword - if (token == 'graph' || token == 'digraph') { - graph.type = token; - getToken(); - } + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } - // optional graph id - if (tokenType == TOKENTYPE.IDENTIFIER) { - graph.id = token; - getToken(); - } + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } - // open angle bracket - if (token != '{') { - throw newSyntaxError('Angle bracket { expected'); - } - getToken(); + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle am pm + if (config._isPm && config._a[HOUR] < 12) { + config._a[HOUR] += 12; + } + // if is 12 am, change hours to 0 + if (config._isPm === false && config._a[HOUR] === 12) { + config._a[HOUR] = 0; + } + dateFromConfig(config); + checkOverflow(config); + } - // statements - parseStatements(graph); + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } - // close angle bracket - if (token != '}') { - throw newSyntaxError('Angle bracket } expected'); - } - getToken(); + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } - // end of file - if (token !== '') { - throw newSyntaxError('End of file expected'); - } - getToken(); + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, - // remove temporary default properties - delete graph.node; - delete graph.edge; - delete graph.graph; + scoreToBeat, + i, + currentScore; - return graph; - } + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } - /** - * Parse a list with statements. - * @param {Object} graph - */ - function parseStatements (graph) { - while (token !== '' && token != '}') { - parseStatement(graph); - if (token == ';') { - getToken(); - } - } - } + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); - /** - * Parse a single statement. Can be a an attribute statement, node - * statement, a series of node statements and edge statements, or a - * parameter. - * @param {Object} graph - */ - function parseStatement(graph) { - // parse subgraph - var subgraph = parseSubgraph(graph); - if (subgraph) { - // edge statements - parseEdge(graph, subgraph); + if (!isValid(tempConfig)) { + continue; + } - return; - } + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; - // parse an attribute statement - var attr = parseAttributeStatement(graph); - if (attr) { - return; - } + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; - // parse node - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier expected'); - } - var id = token; // id can be a string or a number - getToken(); + tempConfig._pf.score = currentScore; - if (token == '=') { - // id statement - getToken(); - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier expected'); - } - graph[id] = token; - getToken(); - // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " - } - else { - parseNodeStatement(graph, id); - } - } + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } - /** - * Parse a subgraph - * @param {Object} graph parent graph object - * @return {Object | null} subgraph - */ - function parseSubgraph (graph) { - var subgraph = null; + extend(config, bestMoment || tempConfig); + } - // optional subgraph keyword - if (token == 'subgraph') { - subgraph = {}; - subgraph.type = 'subgraph'; - getToken(); + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); - // optional graph id - if (tokenType == TOKENTYPE.IDENTIFIER) { - subgraph.id = token; - getToken(); + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } } - } - - // open angle bracket - if (token == '{') { - getToken(); - if (!subgraph) { - subgraph = {}; + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } } - subgraph.parent = graph; - subgraph.node = graph.node; - subgraph.edge = graph.edge; - subgraph.graph = graph.graph; - - // statements - parseStatements(subgraph); - // close angle bracket - if (token != '}') { - throw newSyntaxError('Angle bracket } expected'); + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; } - getToken(); - - // remove temporary default properties - delete subgraph.node; - delete subgraph.edge; - delete subgraph.graph; - delete subgraph.parent; - // register at the parent graph - if (!graph.subgraphs) { - graph.subgraphs = []; + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } } - graph.subgraphs.push(subgraph); - } - return subgraph; - } + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); - /** - * parse an attribute statement like "node [shape=circle fontSize=16]". - * Available keywords are 'node', 'edge', 'graph'. - * The previous list with default attributes will be replaced - * @param {Object} graph - * @returns {String | null} keyword Returns the name of the parsed attribute - * (node, edge, graph), or null if nothing - * is parsed. - */ - function parseAttributeStatement (graph) { - // attribute statements - if (token == 'node') { - getToken(); + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } - // node attributes - graph.node = parseAttributeList(); - return 'node'; - } - else if (token == 'edge') { - getToken(); + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } - // edge attributes - graph.edge = parseAttributeList(); - return 'edge'; - } - else if (token == 'graph') { - getToken(); + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } - // graph attributes - graph.graph = parseAttributeList(); - return 'graph'; - } + /************************************ + Relative Time + ************************************/ - return null; - } - /** - * parse a node statement - * @param {Object} graph - * @param {String | Number} id - */ - function parseNodeStatement(graph, id) { - // node statement - var node = { - id: id - }; - var attr = parseAttributeList(); - if (attr) { - node.attr = attr; - } - addNode(graph, node); + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } - // edge statements - parseEdge(graph, id); - } + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), - /** - * Parse an edge or a series of edges - * @param {Object} graph - * @param {String | Number} from Id of the from node - */ - function parseEdge(graph, from) { - while (token == '->' || token == '--') { - var to; - var type = token; - getToken(); + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; - var subgraph = parseSubgraph(graph); - if (subgraph) { - to = subgraph; - } - else { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier or subgraph expected'); - } - to = token; - addNode(graph, { - id: to - }); - getToken(); + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); } - // parse edge attributes - var attr = parseAttributeList(); - - // create edge - var edge = createEdge(graph, from, to, type, attr); - addEdge(graph, edge); - from = to; - } - } + /************************************ + Week of Year + ************************************/ - /** - * Parse a set with attributes, - * for example [label="1.000", shape=solid] - * @return {Object | null} attr - */ - function parseAttributeList() { - var attr = null; - while (token == '[') { - getToken(); - attr = {}; - while (token !== '' && token != ']') { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Attribute name expected'); - } - var name = token; + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; - getToken(); - if (token != '=') { - throw newSyntaxError('Equal sign = expected'); - } - getToken(); - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Attribute value expected'); - } - var value = token; - setValue(attr, name, value); // name can be a path + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } - getToken(); - if (token ==',') { - getToken(); - } - } + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } - if (token != ']') { - throw newSyntaxError('Bracket ] expected'); + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; } - getToken(); - } - - return attr; - } - /** - * Create a syntax error with extra information on current token and index. - * @param {String} message - * @returns {SyntaxError} err - */ - function newSyntaxError(message) { - return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); - } + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; - /** - * Chop off text after a maximum length - * @param {String} text - * @param {Number} maxLength - * @returns {String} - */ - function chop (text, maxLength) { - return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); - } + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; - /** - * Execute a function fn for each pair of elements in two arrays - * @param {Array | *} array1 - * @param {Array | *} array2 - * @param {function} fn - */ - function forEach2(array1, array2, fn) { - if (Array.isArray(array1)) { - array1.forEach(function (elem1) { - if (Array.isArray(array2)) { - array2.forEach(function (elem2) { - fn(elem1, elem2); - }); - } - else { - fn(elem1, array2); - } - }); - } - else { - if (Array.isArray(array2)) { - array2.forEach(function (elem2) { - fn(array1, elem2); - }); - } - else { - fn(array1, array2); + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; } - } - } - /** - * Convert a string containing a graph in DOT language into a map containing - * with nodes and edges in the format of graph. - * @param {String} data Text containing a graph in DOT-notation - * @return {Object} graphData - */ - function DOTToGraph (data) { - // parse the DOT file - var dotData = parseDOT(data); - var graphData = { - nodes: [], - edges: [], - options: {} - }; + /************************************ + Top Level Functions + ************************************/ - // copy the nodes - if (dotData.nodes) { - dotData.nodes.forEach(function (dotNode) { - var graphNode = { - id: dotNode.id, - label: String(dotNode.label || dotNode.id) - }; - merge(graphNode, dotNode.attr); - if (graphNode.image) { - graphNode.shape = 'image'; - } - graphData.nodes.push(graphNode); - }); - } + function makeMoment(config) { + var input = config._i, + format = config._f, + res; - // copy the edges - if (dotData.edges) { - /** - * Convert an edge in DOT format to an edge with VisGraph format - * @param {Object} dotEdge - * @returns {Object} graphEdge - */ - function convertEdge(dotEdge) { - var graphEdge = { - from: dotEdge.from, - to: dotEdge.to - }; - merge(graphEdge, dotEdge.attr); - graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; - return graphEdge; - } + config._locale = config._locale || moment.localeData(config._l); - dotData.edges.forEach(function (dotEdge) { - var from, to; - if (dotEdge.from instanceof Object) { - from = dotEdge.from.nodes; - } - else { - from = { - id: dotEdge.from + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); } - } - if (dotEdge.to instanceof Object) { - to = dotEdge.to.nodes; - } - else { - to = { - id: dotEdge.to + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); } - } - if (dotEdge.from instanceof Object && dotEdge.from.edges) { - dotEdge.from.edges.forEach(function (subEdge) { - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); - } + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } - forEach2(from, to, function (from, to) { - var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } - if (dotEdge.to instanceof Object && dotEdge.to.edges) { - dotEdge.to.edges.forEach(function (subEdge) { - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); - } - }); - } + return res; + } - // copy the options - if (dotData.attr) { - graphData.options = dotData.attr; - } + moment = function (input, format, locale, strict) { + var c; - return graphData; - } + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); - // exports - exports.parseDOT = parseDOT; - exports.DOTToGraph = DOTToGraph; + return makeMoment(c); + }; + moment.suppressDeprecationWarnings = false; -/***/ }, -/* 53 */ -/***/ function(module, exports, __webpack_require__) { + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); - - function parseGephi(gephiJSON, options) { - var edges = []; - var nodes = []; - this.options = { - edges: { - inheritColor: true - }, - nodes: { - allowedToMove: false, - parseColor: false + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; } - }; - if (options !== undefined) { - this.options.nodes['allowedToMove'] = options.allowedToMove | false; - this.options.nodes['parseColor'] = options.parseColor | false; - this.options.edges['inheritColor'] = options.inheritColor | true; - } + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; - var gEdges = gephiJSON.edges; - var gNodes = gephiJSON.nodes; - for (var i = 0; i < gEdges.length; i++) { - var edge = {}; - var gEdge = gEdges[i]; - edge['id'] = gEdge.id; - edge['from'] = gEdge.source; - edge['to'] = gEdge.target; - edge['attributes'] = gEdge.attributes; - // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; - // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; - edge['color'] = gEdge.color; - edge['inheritColor'] = edge['color'] !== undefined ? false : this.options.inheritColor; - edges.push(edge); - } + moment.max = function () { + var args = [].slice.call(arguments, 0); - for (var i = 0; i < gNodes.length; i++) { - var node = {}; - var gNode = gNodes[i]; - node['id'] = gNode.id; - node['attributes'] = gNode.attributes; - node['x'] = gNode.x; - node['y'] = gNode.y; - node['label'] = gNode.label; - if (this.options.nodes.parseColor == true) { - node['color'] = gNode.color; - } - else { - node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color} : undefined; - } - node['radius'] = gNode.size; - node['allowedToMoveX'] = this.options.nodes.allowedToMove; - node['allowedToMoveY'] = this.options.nodes.allowedToMove; - nodes.push(node); - } + return pickBy('isAfter', args); + }; - return {nodes:nodes, edges:edges}; - } + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; - exports.parseGephi = parseGephi; + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); -/***/ }, -/* 54 */ -/***/ function(module, exports, __webpack_require__) { + return makeMoment(c).utc(); + }; - var util = __webpack_require__(1); + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; - /** - * @class Groups - * This class can store groups and properties specific for groups. - */ - function Groups() { - this.clear(); - this.defaultIndex = 0; - } + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); - /** - * default constants for group colors - */ - Groups.DEFAULT = [ - {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // blue - {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // yellow - {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // red - {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // green - {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // magenta - {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // purple - {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // orange - {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // darkblue - {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // pink - {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}} // mint - ]; + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + ret = new Duration(duration); - /** - * Clear all groups - */ - Groups.prototype.clear = function () { - this.groups = {}; - this.groups.length = function() - { - var i = 0; - for ( var p in this ) { - if (this.hasOwnProperty(p)) { - i++; - } - } - return i; - } - }; + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + return ret; + }; - /** - * get group properties of a groupname. If groupname is not found, a new group - * is added. - * @param {*} groupname Can be a number, string, Date, etc. - * @return {Object} group The created group, containing all group properties - */ - Groups.prototype.get = function (groupname) { - var group = this.groups[groupname]; - if (group == undefined) { - // create new group - var index = this.defaultIndex % Groups.DEFAULT.length; - this.defaultIndex++; - group = {}; - group.color = Groups.DEFAULT[index]; - this.groups[groupname] = group; - } + // version number + moment.version = VERSION; - return group; - }; + // default format + moment.defaultFormat = isoFormat; - /** - * Add a custom group style - * @param {String} groupname - * @param {Object} style An object containing borderColor, - * backgroundColor, etc. - * @return {Object} group The created group object - */ - Groups.prototype.add = function (groupname, style) { - this.groups[groupname] = style; - if (style.color) { - style.color = util.parseColor(style.color); - } - return style; - }; + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; - module.exports = Groups; + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; -/***/ }, -/* 55 */ -/***/ function(module, exports, __webpack_require__) { + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; - /** - * @class Images - * This class loads images and keeps them stored. - */ - function Images() { - this.images = {}; + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); - this.callback = undefined; - } + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } - /** - * Set an onload callback function. This will be called each time an image - * is loaded - * @param {function} callback - */ - Images.prototype.setOnloadCallback = function(callback) { - this.callback = callback; - }; + if (data) { + moment.duration._locale = moment._locale = data; + } + } - /** - * - * @param {string} url Url of the image - * @param {string} url Url of an image to use if the url image is not found - * @return {Image} img The image object - */ - Images.prototype.load = function(url, brokenUrl) { - var img = this.images[url]; - if (img == undefined) { - // create the image - var images = this; - img = new Image(); - this.images[url] = img; - img.onload = function() { - if (images.callback) { - images.callback(this); - } + return moment._locale._abbr; }; - - img.onerror = function () { - this.src = brokenUrl; - if (images.callback) { - images.callback(this); - } - }; - - img.src = url; - } - return img; - }; + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); - module.exports = Images; + // backwards compat for now: also set the locale + moment.locale(name); + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; -/***/ }, -/* 56 */ -/***/ function(module, exports, __webpack_require__) { + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); - var util = __webpack_require__(1); + // returns locale data + moment.localeData = function (key) { + var locale; - /** - * @class Node - * A node. A node can be connected to other nodes via one or multiple edges. - * @param {object} properties An object containing properties for the node. All - * properties are optional, except for the id. - * {number} id Id of the node. Required - * {string} label Text label for the node - * {number} x Horizontal position of the node - * {number} y Vertical position of the node - * {string} shape Node shape, available: - * "database", "circle", "ellipse", - * "box", "image", "text", "dot", - * "star", "triangle", "triangleDown", - * "square" - * {string} image An image url - * {string} title An title text, can be HTML - * {anytype} group A group name or number - * @param {Network.Images} imagelist A list with images. Only needed - * when the node has an image - * @param {Network.Groups} grouplist A list with groups. Needed for - * retrieving group properties - * @param {Object} constants An object with default values for - * example for the color - * - */ - function Node(properties, imagelist, grouplist, networkConstants) { - var constants = util.selectiveBridgeObject(['nodes'],networkConstants); - this.options = constants.nodes; + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } - this.selected = false; - this.hover = false; + if (!key) { + return moment._locale; + } - this.edges = []; // all edges connected to this node - this.dynamicEdges = []; - this.reroutedEdges = {}; + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } - this.fontDrawThreshold = 3; + return chooseLocale(key); + }; - // set defaults for the properties - this.id = undefined; - this.x = null; - this.y = null; - this.allowedToMoveX = false; - this.allowedToMoveY = false; - this.xFixed = false; - this.yFixed = false; - this.horizontalAlignLeft = true; // these are for the navigation controls - this.verticalAlignTop = true; // these are for the navigation controls - this.baseRadiusValue = networkConstants.nodes.radius; - this.radiusFixed = false; - this.level = -1; - this.preassignedLevel = false; - this.hierarchyEnumerated = false; - this.labelDimensions = {top:0,left:0,width:0,height:0,yLine:0}; // could be cached + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; - this.imagelist = imagelist; - this.grouplist = grouplist; + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } - // physics properties - this.fx = 0.0; // external force x - this.fy = 0.0; // external force y - this.vx = 0.0; // velocity x - this.vy = 0.0; // velocity y - this.damping = networkConstants.physics.damping; // written every time gravity is calculated - this.fixedData = {x:null,y:null}; + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; - this.setProperties(properties, constants); + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } - // creating the variables for clustering - this.resetCluster(); - this.dynamicEdgesLength = 0; - this.clusterSession = 0; - this.clusterSizeWidthFactor = networkConstants.clustering.nodeScaling.width; - this.clusterSizeHeightFactor = networkConstants.clustering.nodeScaling.height; - this.clusterSizeRadiusFactor = networkConstants.clustering.nodeScaling.radius; - this.maxNodeSizeIncrements = networkConstants.clustering.maxNodeSizeIncrements; - this.growthIndicator = 0; + return m; + }; - // variables to tell the node about the network. - this.networkScaleInv = 1; - this.networkScale = 1; - this.canvasTopLeft = {"x": -300, "y": -300}; - this.canvasBottomRight = {"x": 300, "y": 300}; - this.parentEdgeId = null; - } + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; - /** - * (re)setting the clustering variables and objects - */ - Node.prototype.resetCluster = function() { - // clustering variables - this.formationScale = undefined; // this is used to determine when to open the cluster - this.clusterSize = 1; // this signifies the total amount of nodes in this cluster - this.containedNodes = {}; - this.containedEdges = {}; - this.clusterSessions = []; - }; + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; - /** - * Attach a edge to the node - * @param {Edge} edge - */ - Node.prototype.attachEdge = function(edge) { - if (this.edges.indexOf(edge) == -1) { - this.edges.push(edge); - } - if (this.dynamicEdges.indexOf(edge) == -1) { - this.dynamicEdges.push(edge); - } - this.dynamicEdgesLength = this.dynamicEdges.length; - }; + /************************************ + Moment Prototype + ************************************/ - /** - * Detach a edge from the node - * @param {Edge} edge - */ - Node.prototype.detachEdge = function(edge) { - var index = this.edges.indexOf(edge); - if (index != -1) { - this.edges.splice(index, 1); - } - index = this.dynamicEdges.indexOf(edge); - if (index != -1) { - this.dynamicEdges.splice(index, 1); - } - this.dynamicEdgesLength = this.dynamicEdges.length; - }; + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d + ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, - /** - * Set or overwrite properties for the node - * @param {Object} properties an object with properties - * @param {Object} constants and object with default, global properties - */ - Node.prototype.setProperties = function(properties, constants) { - if (!properties) { - return; - } + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, - var fields = ['borderWidth','borderWidthSelected','shape','image','brokenImage','radius','fontColor', - 'fontSize','fontFace','fontFill','group','mass' - ]; - util.selectiveDeepExtend(fields, this.options, properties); + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, - // basic properties - if (properties.id !== undefined) {this.id = properties.id;} - if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} - if (properties.title !== undefined) {this.title = properties.title;} - if (properties.x !== undefined) {this.x = properties.x;} - if (properties.y !== undefined) {this.y = properties.y;} - if (properties.value !== undefined) {this.value = properties.value;} - if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, - // navigation controls properties - if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} - if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} - if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} + isValid : function () { + return isValid(this); + }, - if (this.id === undefined) { - throw "Node must have an id"; - } + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } - // copy group properties - if (typeof this.options.group === 'number' || (typeof this.options.group === 'string' && this.options.group != '')) { - var groupObj = this.grouplist.get(this.options.group); - for (var prop in groupObj) { - if (groupObj.hasOwnProperty(prop)) { - this.options[prop] = groupObj[prop]; - } - } - } + return false; + }, + parsingFlags : function () { + return extend({}, this._pf); + }, - // individual shape properties - if (properties.radius !== undefined) {this.baseRadiusValue = this.options.radius;} - if (properties.color !== undefined) {this.options.color = util.parseColor(properties.color);} + invalidAt: function () { + return this._pf.overflow; + }, - if (this.options.image!== undefined && this.options.image!= "") { - if (this.imagelist) { - this.imageObj = this.imagelist.load(this.options.image, this.options.brokenImage); - } - else { - throw "No imagelist provided"; - } - } + utc : function (keepLocalTime) { + return this.zone(0, keepLocalTime); + }, - if (properties.allowedToMoveX !== undefined) { - this.xFixed = !properties.allowedToMoveX; - this.allowedToMoveX = properties.allowedToMoveX; - } - else if (properties.x !== undefined && this.allowedToMoveX == false) { - this.xFixed = true; - } + local : function (keepLocalTime) { + if (this._isUTC) { + this.zone(0, keepLocalTime); + this._isUTC = false; + if (keepLocalTime) { + this.add(this._dateTzOffset(), 'm'); + } + } + return this; + }, - if (properties.allowedToMoveY !== undefined) { - this.yFixed = !properties.allowedToMoveY; - this.allowedToMoveY = properties.allowedToMoveY; - } - else if (properties.y !== undefined && this.allowedToMoveY == false) { - this.yFixed = true; - } + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, - this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); + add : createAdder(1, 'add'), - if (this.options.shape == 'image') { - this.options.radiusMin = constants.nodes.widthMin; - this.options.radiusMax = constants.nodes.widthMax; - } + subtract : createAdder(-1, 'subtract'), + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (this.zone() - that.zone()) * 6e4, + diff, output, daysAdjust; + units = normalizeUnits(units); - // choose draw method depending on the shape - switch (this.options.shape) { - case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; - case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; - case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; - case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; - // TODO: add diamond shape - case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; - case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; - case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; - case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; - case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; - case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; - case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; - default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; - } - // reset the size of the node, this can be changed - this._reset(); + if (units === 'year' || units === 'month') { + // average number of days in the months in the given dates + diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 + // difference in months + output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); + // adjust by taking difference in days, average number of days + // and dst in the given months. + daysAdjust = (this - moment(this).startOf('month')) - + (that - moment(that).startOf('month')); + // same as above but with zones, to negate all dst + daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4; + output += daysAdjust / diff; + if (units === 'year') { + output = output / 12; + } + } else { + diff = (this - that); + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, - }; + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, - /** - * select this node - */ - Node.prototype.select = function() { - this.selected = true; - this._reset(); - }; + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, - /** - * unselect this node - */ - Node.prototype.unselect = function() { - this.selected = false; - this._reset(); - }; + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're zone'd or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + isLeapYear : function () { + return isLeapYear(this.year()); + }, - /** - * Reset the calculated size of the node, forces it to recalculate its size - */ - Node.prototype.clearSizeCache = function() { - this._reset(); - }; + isDST : function () { + return (this.zone() < this.clone().month(0).zone() || + this.zone() < this.clone().month(5).zone()); + }, - /** - * Reset the calculated size of the node, forces it to recalculate its size - * @private - */ - Node.prototype._reset = function() { - this.width = undefined; - this.height = undefined; - }; + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, - /** - * get the title of this node. - * @return {string} title The title of the node, or undefined when no title - * has been set. - */ - Node.prototype.getTitle = function() { - return typeof this.title === "function" ? this.title() : this.title; - }; + month : makeAccessor('Month', true), - /** - * Calculate the distance to the border of the Node - * @param {CanvasRenderingContext2D} ctx - * @param {Number} angle Angle in radians - * @returns {number} distance Distance to the border in pixels - */ - Node.prototype.distanceToBorder = function (ctx, angle) { - var borderWidth = 1; + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } - if (!this.width) { - this.resize(ctx); - } + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } - switch (this.options.shape) { - case 'circle': - case 'dot': - return this.options.radius+ borderWidth; + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } - case 'ellipse': - var a = this.width / 2; - var b = this.height / 2; - var w = (Math.sin(angle) * a); - var h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); + return this; + }, - // TODO: implement distanceToBorder for database - // TODO: implement distanceToBorder for triangle - // TODO: implement distanceToBorder for triangleDown + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, - case 'box': - case 'image': - case 'text': - default: - if (this.width) { - return Math.min( - Math.abs(this.width / 2 / Math.cos(angle)), - Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; - // TODO: reckon with border radius too in case of box - } - else { - return 0; - } + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, - } - // TODO: implement calculation of distance to border for all shapes - }; + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, - /** - * Set forces acting on the node - * @param {number} fx Force in horizontal direction - * @param {number} fy Force in vertical direction - */ - Node.prototype._setForce = function(fx, fy) { - this.fx = fx; - this.fy = fy; - }; + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, - /** - * Add forces acting on the node - * @param {number} fx Force in horizontal direction - * @param {number} fy Force in vertical direction - * @private - */ - Node.prototype._addForce = function(fx, fy) { - this.fx += fx; - this.fy += fy; - }; + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), - /** - * Perform one discrete step for the node - * @param {number} interval Time interval in seconds - */ - Node.prototype.discreteStep = function(interval) { - if (!this.xFixed) { - var dx = this.damping * this.vx; // damping force - var ax = (this.fx - dx) / this.options.mass; // acceleration - this.vx += ax * interval; // velocity - this.x += this.vx * interval; // position - } - else { - this.fx = 0; - this.vx = 0; - } + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), - if (!this.yFixed) { - var dy = this.damping * this.vy; // damping force - var ay = (this.fy - dy) / this.options.mass; // acceleration - this.vy += ay * interval; // velocity - this.y += this.vy * interval; // position - } - else { - this.fy = 0; - this.vy = 0; - } - }; + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + zone : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = timezoneMinutesFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateTzOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.subtract(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(offset - input, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + } else { + return this._isUTC ? offset : this._dateTzOffset(); + } + return this; + }, + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, - /** - * Perform one discrete step for the node - * @param {number} interval Time interval in seconds - * @param {number} maxVelocity The speed limit imposed on the velocity - */ - Node.prototype.discreteStepLimited = function(interval, maxVelocity) { - if (!this.xFixed) { - var dx = this.damping * this.vx; // damping force - var ax = (this.fx - dx) / this.options.mass; // acceleration - this.vx += ax * interval; // velocity - this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; - this.x += this.vx * interval; // position - } - else { - this.fx = 0; - this.vx = 0; - } + parseZone : function () { + if (this._tzm) { + this.zone(this._tzm); + } else if (typeof this._i === 'string') { + this.zone(this._i); + } + return this; + }, - if (!this.yFixed) { - var dy = this.damping * this.vy; // damping force - var ay = (this.fy - dy) / this.options.mass; // acceleration - this.vy += ay * interval; // velocity - this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; - this.y += this.vy * interval; // position - } - else { - this.fy = 0; - this.vy = 0; - } - }; + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).zone(); + } - /** - * Check if this node has a fixed x and y position - * @return {boolean} true if fixed, false if not - */ - Node.prototype.isFixed = function() { - return (this.xFixed && this.yFixed); - }; + return (this.zone() - input) % 60 === 0; + }, - /** - * Check if this node is moving - * @param {number} vmin the minimum velocity considered as "moving" - * @return {boolean} true if moving, false if it has no velocity - */ - Node.prototype.isMoving = function(vmin) { - var velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)); - // this.velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)) - return (velocity > vmin); - }; + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, - /** - * check if this node is selecte - * @return {boolean} selected True if node is selected, else false - */ - Node.prototype.isSelected = function() { - return this.selected; - }; + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, - /** - * Retrieve the value of the node. Can be undefined - * @return {Number} value - */ - Node.prototype.getValue = function() { - return this.value; - }; + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, - /** - * Calculate the distance from the nodes location to the given location (x,y) - * @param {Number} x - * @param {Number} y - * @return {Number} value - */ - Node.prototype.getDistance = function(x, y) { - var dx = this.x - x, - dy = this.y - y; - return Math.sqrt(dx * dx + dy * dy); - }; + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, - /** - * Adjust the value range of the node. The node will adjust it's radius - * based on its value. - * @param {Number} min - * @param {Number} max - */ - Node.prototype.setValueRange = function(min, max) { - if (!this.radiusFixed && this.value !== undefined) { - if (max == min) { - this.options.radius= (this.options.radiusMin + this.options.radiusMax) / 2; - } - else { - var scale = (this.options.radiusMax - this.options.radiusMin) / (max - min); - this.options.radius= (this.value - min) * scale + this.options.radiusMin; - } - } - this.baseRadiusValue = this.options.radius; - }; + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, - /** - * Draw this node in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - */ - Node.prototype.draw = function(ctx) { - throw "Draw method not initialized for node"; - }; + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, - /** - * Recalculate the size of this node in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - */ - Node.prototype.resize = function(ctx) { - throw "Resize method not initialized for node"; - }; + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, - /** - * Check if this object is overlapping with the provided object - * @param {Object} obj an object with parameters left, top, right, bottom - * @return {boolean} True if location is located on node - */ - Node.prototype.isOverlappingWith = function(obj) { - return (this.left < obj.right && - this.left + this.width > obj.left && - this.top < obj.bottom && - this.top + this.height > obj.top); - }; + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, - Node.prototype._resizeImage = function (ctx) { - // TODO: pre calculate the image size + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, - if (!this.width || !this.height) { // undefined or 0 - var width, height; - if (this.value) { - this.options.radius= this.baseRadiusValue; - var scale = this.imageObj.height / this.imageObj.width; - if (scale !== undefined) { - width = this.options.radius|| this.imageObj.width; - height = this.options.radius* scale || this.imageObj.height; - } - else { - width = 0; - height = 0; - } - } - else { - width = this.imageObj.width; - height = this.imageObj.height; - } - this.width = width; - this.height = height; + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, - this.growthIndicator = 0; - if (this.width > 0 && this.height > 0) { - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - width; - } - } + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, - }; + set : function (units, value) { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + return this; + }, - Node.prototype._drawImage = function (ctx) { - this._resizeImage(ctx); + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, - var yLabel; - if (this.imageObj.width != 0 ) { - // draw the shade - if (this.clusterSize > 1) { - var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); - lineWidth *= this.networkScaleInv; - lineWidth = Math.min(0.2 * this.width,lineWidth); + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), - ctx.globalAlpha = 0.5; - ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); - } + localeData : function () { + return this._locale; + }, - // draw the image - ctx.globalAlpha = 1.0; - ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); - yLabel = this.y + this.height / 2; - } - else { - // image still loading... just draw the label for now - yLabel = this.y; - } + _dateTzOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + }); - this._label(ctx, this.label, this.x, yLabel, undefined, "top"); - }; + function rawMonthSetter(mom, value) { + var dayOfMonth; + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } - Node.prototype._resizeBox = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - this.width = textSize.width + 2 * margin; - this.height = textSize.height + 2 * margin; + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; - this.growthIndicator = this.width - (textSize.width + 2 * margin); - // this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } - } - }; + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } - Node.prototype._drawBox = function (ctx) { - this._resizeBox(ctx); + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + /************************************ + Duration Prototype + ************************************/ - ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.options.radius); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.options.color.background; + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } - ctx.roundRect(this.left, this.top, this.width, this.height, this.options.radius); - ctx.fill(); - ctx.stroke(); + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } - this._label(ctx, this.label, this.x, this.y); - }; + extend(moment.duration.fn = Duration.prototype, { + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; - Node.prototype._resizeDatabase = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - var size = textSize.width + 2 * margin; - this.width = size; - this.height = size; + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - size; - } - }; + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; - Node.prototype._drawDatabase = function (ctx) { - this._resizeDatabase(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + hours = absRound(minutes / 60); + data.hours = hours % 24; - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + days += absRound(hours / 24); - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); - ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); - ctx.fill(); - ctx.stroke(); + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; - this._label(ctx, this.label, this.x, this.y); - }; + data.days = days; + data.months = months; + data.years = years; + }, + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); - Node.prototype._resizeCircle = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; - this.options.radius = diameter / 2; + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); - this.width = diameter; - this.height = diameter; + return this; + }, - // scaling used for clustering - // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; - // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; - this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - this.growthIndicator = this.options.radius- 0.5*diameter; - } - }; + weeks : function () { + return absRound(this.days() / 7); + }, - Node.prototype._drawCircle = function (ctx) { - this._resizeCircle(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + return this.localeData().postformat(output); + }, - ctx.circle(this.x, this.y, this.options.radius+2*ctx.lineWidth); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - ctx.circle(this.x, this.y, this.options.radius); - ctx.fill(); - ctx.stroke(); + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; - this._label(ctx, this.label, this.x, this.y); - }; + this._bubble(); - Node.prototype._resizeEllipse = function (ctx) { - if (!this.width) { - var textSize = this.getTextSize(ctx); + return this; + }, - this.width = textSize.width * 1.5; - this.height = textSize.height * 2; - if (this.width < this.height) { - this.width = this.height; - } - var defaultSize = this.width; + subtract : function (input, val) { + var dur = moment.duration(input, val); - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - defaultSize; - } - }; + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, - Node.prototype._drawEllipse = function (ctx) { - this._resizeEllipse(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + as : function (units) { + var days, months; + units = normalizeUnits(units); - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + lang : moment.fn.lang, + locale : moment.fn.locale, - ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); - ctx.ellipse(this.left, this.top, this.width, this.height); - ctx.fill(); - ctx.stroke(); - this._label(ctx, this.label, this.x, this.y); - }; + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } - Node.prototype._drawDot = function (ctx) { - this._drawShape(ctx, 'circle'); - }; + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, - Node.prototype._drawTriangle = function (ctx) { - this._drawShape(ctx, 'triangle'); - }; + localeData : function () { + return this._locale; + } + }); - Node.prototype._drawTriangleDown = function (ctx) { - this._drawShape(ctx, 'triangleDown'); - }; + moment.duration.fn.toString = moment.duration.fn.toISOString; - Node.prototype._drawSquare = function (ctx) { - this._drawShape(ctx, 'square'); - }; + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } - Node.prototype._drawStar = function (ctx) { - this._drawShape(ctx, 'star'); - }; + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } - Node.prototype._resizeShape = function (ctx) { - if (!this.width) { - this.options.radius= this.baseRadiusValue; - var size = 2 * this.options.radius; - this.width = size; - this.height = size; + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - size; - } - }; + /************************************ + Default Locale + ************************************/ - Node.prototype._drawShape = function (ctx, shape) { - this._resizeShape(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); - var clusterLineWidth = 2.5; - var borderWidth = this.options.borderWidth; - var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; - var radiusMultiplier = 2; + /* EMBED_LOCALES */ - // choose draw method depending on the shape - switch (shape) { - case 'dot': radiusMultiplier = 2; break; - case 'square': radiusMultiplier = 2; break; - case 'triangle': radiusMultiplier = 3; break; - case 'triangleDown': radiusMultiplier = 3; break; - case 'star': radiusMultiplier = 4; break; - } + /************************************ + Exposing Moment + ************************************/ - ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } - ctx[shape](this.x, this.y, this.options.radius+ radiusMultiplier * ctx.lineWidth); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } - ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; - ctx[shape](this.x, this.y, this.options.radius); - ctx.fill(); - ctx.stroke(); + return moment; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + makeGlobal(true); + } else { + makeGlobal(); + } + }).call(this); + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(71)(module))) - if (this.label) { - this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'top',true); - } - }; +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { - Node.prototype._resizeText = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - this.width = textSize.width + 2 * margin; - this.height = textSize.height + 2 * margin; + var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 + * http://eightmedia.github.io/hammer.js + * + * Copyright (c) 2014 Jorik Tangelder ; + * Licensed under the MIT license */ - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - (textSize.width + 2 * margin); - } - }; + (function(window, undefined) { + 'use strict'; - Node.prototype._drawText = function (ctx) { - this._resizeText(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + /** + * @main + * @module hammer + * + * @class Hammer + * @static + */ - this._label(ctx, this.label, this.x, this.y); + /** + * Hammer, use this to create instances + * ```` + * var hammertime = new Hammer(myElement); + * ```` + * + * @method Hammer + * @param {HTMLElement} element + * @param {Object} [options={}] + * @return {Hammer.Instance} + */ + var Hammer = function Hammer(element, options) { + return new Hammer.Instance(element, options || {}); }; + /** + * version, as defined in package.json + * the value will be set at each build + * @property VERSION + * @final + * @type {String} + */ + Hammer.VERSION = '1.1.3'; - Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { - if (text && Number(this.options.fontSize) * this.networkScale > this.fontDrawThreshold) { - ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; + /** + * default settings. + * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled + * by setting it's name (like `swipe`) to false. + * You can set the defaults for all instances by changing this object before creating an instance. + * @example + * ```` + * Hammer.defaults.drag = false; + * Hammer.defaults.behavior.touchAction = 'pan-y'; + * delete Hammer.defaults.behavior.userSelect; + * ```` + * @property defaults + * @type {Object} + */ + Hammer.defaults = { + /** + * this setting object adds styles and attributes to the element to prevent the browser from doing + * its native behavior. The css properties are auto prefixed for the browsers when needed. + * @property defaults.behavior + * @type {Object} + */ + behavior: { + /** + * Disables text selection to improve the dragging gesture. When the value is `none` it also sets + * `onselectstart=false` for IE on the element. Mainly for desktop browsers. + * @property defaults.behavior.userSelect + * @type {String} + * @default 'none' + */ + userSelect: 'none', - var lines = text.split('\n'); - var lineCount = lines.length; - var fontSize = (Number(this.options.fontSize) + 4); // TODO: why is this +4 ? - var yLine = y + (1 - lineCount) / 2 * fontSize; - if (labelUnderNode == true) { - yLine = y + (1 - lineCount) / (2 * fontSize); - } + /** + * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). + * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. + * @property defaults.behavior.touchAction + * @type {String} + * @default: 'pan-y' + */ + touchAction: 'pan-y', - // font fill from edges now for nodes! - var width = ctx.measureText(lines[0]).width; - for (var i = 1; i < lineCount; i++) { - var lineWidth = ctx.measureText(lines[i]).width; - width = lineWidth > width ? lineWidth : width; - } - var height = this.options.fontSize * lineCount; - var left = x - width / 2; - var top = y - height / 2; - if (baseline == "top") { - top += 0.5 * fontSize; - } - this.labelDimensions = {top:top,left:left,width:width,height:height,yLine:yLine}; + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @property defaults.behavior.touchCallout + * @type {String} + * @default 'none' + */ + touchCallout: 'none', - // create the fontfill background - if (this.options.fontFill !== undefined && this.options.fontFill !== null && this.options.fontFill !== "none") { - ctx.fillStyle = this.options.fontFill; - ctx.fillRect(left, top, width, height); - } + /** + * Specifies whether zooming is enabled. Used by IE10> + * @property defaults.behavior.contentZooming + * @type {String} + * @default 'none' + */ + contentZooming: 'none', - // draw text - ctx.fillStyle = this.options.fontColor || "black"; - ctx.textAlign = align || "center"; - ctx.textBaseline = baseline || "middle"; - for (var i = 0; i < lineCount; i++) { - ctx.fillText(lines[i], x, yLine); - yLine += fontSize; + /** + * Specifies that an entire element should be draggable instead of its contents. + * Mainly for desktop browsers. + * @property defaults.behavior.userDrag + * @type {String} + * @default 'none' + */ + userDrag: 'none', + + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. + * + * If you don't specify an alpha value, Safari on iPhone applies a default alpha value + * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). + * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. + * @property defaults.behavior.tapHighlightColor + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' } - } }; + /** + * hammer document where the base events are added at + * @property DOCUMENT + * @type {HTMLElement} + * @default window.document + */ + Hammer.DOCUMENT = document; - Node.prototype.getTextSize = function(ctx) { - if (this.label !== undefined) { - ctx.font = (this.selected ? "bold " : "") + this.options.fontSize + "px " + this.options.fontFace; + /** + * detect support for pointer events + * @property HAS_POINTEREVENTS + * @type {Boolean} + */ + Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; - var lines = this.label.split('\n'), - height = (Number(this.options.fontSize) + 4) * lines.length, - width = 0; + /** + * detect support for touch events + * @property HAS_TOUCHEVENTS + * @type {Boolean} + */ + Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); - for (var i = 0, iMax = lines.length; i < iMax; i++) { - width = Math.max(width, ctx.measureText(lines[i]).width); - } + /** + * detect mobile browsers + * @property IS_MOBILE + * @type {Boolean} + */ + Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); - return {"width": width, "height": height}; - } - else { - return {"width": 0, "height": 0}; - } - }; + /** + * detect if we want to support mouseevents at all + * @property NO_MOUSEEVENTS + * @type {Boolean} + */ + Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; /** - * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. - * there is a safety margin of 0.3 * width; - * - * @returns {boolean} + * interval in which Hammer recalculates current velocity/direction/angle in ms + * @property CALCULATE_INTERVAL + * @type {Number} + * @default 25 */ - Node.prototype.inArea = function() { - if (this.width !== undefined) { - return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && - this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && - this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && - this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); - } - else { - return true; - } - }; + Hammer.CALCULATE_INTERVAL = 25; + + /** + * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` + * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) + * @property EVENT_TYPES + * @private + * @writeOnce + * @type {Object} + */ + var EVENT_TYPES = {}; + + /** + * direction strings, for safe comparisons + * @property DIRECTION_DOWN|LEFT|UP|RIGHT + * @final + * @type {String} + * @default 'down' 'left' 'up' 'right' + */ + var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; + var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; + var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; + var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; + + /** + * pointertype strings, for safe comparisons + * @property POINTER_MOUSE|TOUCH|PEN + * @final + * @type {String} + * @default 'mouse' 'touch' 'pen' + */ + var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; + var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; + var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; + + /** + * eventtypes + * @property EVENT_START|MOVE|END|RELEASE|TOUCH + * @final + * @type {String} + * @default 'start' 'change' 'move' 'end' 'release' 'touch' + */ + var EVENT_START = Hammer.EVENT_START = 'start'; + var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; + var EVENT_END = Hammer.EVENT_END = 'end'; + var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; + var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; /** - * checks if the core of the node is in the display area, this is used for opening clusters around zoom - * @returns {boolean} + * if the window events are set... + * @property READY + * @writeOnce + * @type {Boolean} + * @default false */ - Node.prototype.inView = function() { - return (this.x >= this.canvasTopLeft.x && - this.x < this.canvasBottomRight.x && - this.y >= this.canvasTopLeft.y && - this.y < this.canvasBottomRight.y); - }; + Hammer.READY = false; /** - * This allows the zoom level of the network to influence the rendering - * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas - * - * @param scale - * @param canvasTopLeft - * @param canvasBottomRight + * plugins namespace + * @property plugins + * @type {Object} */ - Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { - this.networkScaleInv = 1.0/scale; - this.networkScale = scale; - this.canvasTopLeft = canvasTopLeft; - this.canvasBottomRight = canvasBottomRight; - }; + Hammer.plugins = Hammer.plugins || {}; + /** + * gestures namespace + * see `/gestures` for the definitions + * @property gestures + * @type {Object} + */ + Hammer.gestures = Hammer.gestures || {}; /** - * This allows the zoom level of the network to influence the rendering - * - * @param scale + * setup events to detect gestures on the document + * this function is called when creating an new instance + * @private */ - Node.prototype.setScale = function(scale) { - this.networkScaleInv = 1.0/scale; - this.networkScale = scale; - }; + function setup() { + if(Hammer.READY) { + return; + } + // find what eventtypes we add listeners to + Event.determineEventTypes(); + // Register all gestures inside Hammer.gestures + Utils.each(Hammer.gestures, function(gesture) { + Detection.register(gesture); + }); - /** - * set the velocity at 0. Is called when this node is contained in another during clustering - */ - Node.prototype.clearVelocity = function() { - this.vx = 0; - this.vy = 0; - }; + // Add touch events on the document + Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); + Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); + // Hammer is ready...! + Hammer.READY = true; + } /** - * Basic preservation of (kinectic) energy + * @module hammer * - * @param massBeforeClustering + * @class Utils + * @static */ - Node.prototype.updateVelocity = function(massBeforeClustering) { - var energyBefore = this.vx * this.vx * massBeforeClustering; - //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); - this.vx = Math.sqrt(energyBefore/this.options.mass); - energyBefore = this.vy * this.vy * massBeforeClustering; - //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); - this.vy = Math.sqrt(energyBefore/this.options.mass); - }; + var Utils = Hammer.utils = { + /** + * extend method, could also be used for cloning when `dest` is an empty object. + * changes the dest object + * @method extend + * @param {Object} dest + * @param {Object} src + * @param {Boolean} [merge=false] do a merge + * @return {Object} dest + */ + extend: function extend(dest, src, merge) { + for(var key in src) { + if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { + continue; + } + dest[key] = src[key]; + } + return dest; + }, - module.exports = Node; + /** + * simple addEventListener wrapper + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + on: function on(element, type, handler) { + element.addEventListener(type, handler, false); + }, + /** + * simple removeEventListener wrapper + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + off: function off(element, type, handler) { + element.removeEventListener(type, handler, false); + }, -/***/ }, -/* 57 */ -/***/ function(module, exports, __webpack_require__) { + /** + * forEach over arrays and objects + * @method each + * @param {Object|Array} obj + * @param {Function} iterator + * @param {any} iterator.item + * @param {Number} iterator.index + * @param {Object|Array} iterator.obj the source object + * @param {Object} context value to use as `this` in the iterator + */ + each: function each(obj, iterator, context) { + var i, len; - var util = __webpack_require__(1); - var Node = __webpack_require__(56); + // native forEach on arrays + if('forEach' in obj) { + obj.forEach(iterator, context); + // arrays + } else if(obj.length !== undefined) { + for(i = 0, len = obj.length; i < len; i++) { + if(iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + // objects + } else { + for(i in obj) { + if(obj.hasOwnProperty(i) && + iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + } + }, - /** - * @class Edge - * - * A edge connects two nodes - * @param {Object} properties Object with properties. Must contain - * At least properties from and to. - * Available properties: from (number), - * to (number), label (string, color (string), - * width (number), style (string), - * length (number), title (string) - * @param {Network} network A Network object, used to find and edge to - * nodes. - * @param {Object} constants An object with default values for - * example for the color - */ - function Edge (properties, network, networkConstants) { - if (!network) { - throw "No network provided"; - } - var fields = ['edges','physics']; - var constants = util.selectiveBridgeObject(fields,networkConstants); - this.options = constants.edges; - this.physics = constants.physics; - this.options['smoothCurves'] = networkConstants['smoothCurves']; + /** + * find if a string contains the string using indexOf + * @method inStr + * @param {String} src + * @param {String} find + * @return {Boolean} found + */ + inStr: function inStr(src, find) { + return src.indexOf(find) > -1; + }, + /** + * find if a array contains the object using indexOf or a simple polyfill + * @method inArray + * @param {String} src + * @param {String} find + * @return {Boolean|Number} false when not found, or the index + */ + inArray: function inArray(src, find) { + if(src.indexOf) { + var index = src.indexOf(find); + return (index === -1) ? false : index; + } else { + for(var i = 0, len = src.length; i < len; i++) { + if(src[i] === find) { + return i; + } + } + return false; + } + }, - this.network = network; + /** + * convert an array-like object (`arguments`, `touchlist`) to an array + * @method toArray + * @param {Object} obj + * @return {Array} + */ + toArray: function toArray(obj) { + return Array.prototype.slice.call(obj, 0); + }, - // initialize variables - this.id = undefined; - this.fromId = undefined; - this.toId = undefined; - this.title = undefined; - this.widthSelected = this.options.width * this.options.widthSelectionMultiplier; - this.value = undefined; - this.selected = false; - this.hover = false; - this.labelDimensions = {top:0,left:0,width:0,height:0,yLine:0}; // could be cached - this.dirtyLabel = true; + /** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ + hasParent: function hasParent(node, parent) { + while(node) { + if(node == parent) { + return true; + } + node = node.parentNode; + } + return false; + }, - this.from = null; // a node - this.to = null; // a node - this.via = null; // a temp node + /** + * get the center of all the touches + * @method getCenter + * @param {Array} touches + * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties + */ + getCenter: function getCenter(touches) { + var pageX = [], + pageY = [], + clientX = [], + clientY = [], + min = Math.min, + max = Math.max; - // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster - // by storing the original information we can revert to the original connection when the cluser is opened. - this.originalFromId = []; - this.originalToId = []; + // no need to loop when only one touch + if(touches.length === 1) { + return { + pageX: touches[0].pageX, + pageY: touches[0].pageY, + clientX: touches[0].clientX, + clientY: touches[0].clientY + }; + } - this.connected = false; + Utils.each(touches, function(touch) { + pageX.push(touch.pageX); + pageY.push(touch.pageY); + clientX.push(touch.clientX); + clientY.push(touch.clientY); + }); - this.widthFixed = false; - this.lengthFixed = false; + return { + pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, + pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, + clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, + clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 + }; + }, - this.setProperties(properties); + /** + * calculate the velocity between two points. unit is in px per ms. + * @method getVelocity + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + * @return {Object} velocity `x` and `y` + */ + getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { + return { + x: Math.abs(deltaX / deltaTime) || 0, + y: Math.abs(deltaY / deltaTime) || 0 + }; + }, - this.controlNodesEnabled = false; - this.controlNodes = {from:null, to:null, positions:{}}; - this.connectedNode = null; - } + /** + * calculate the angle between two coordinates + * @method getAngle + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {Number} angle + */ + getAngle: function getAngle(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; - /** - * Set or overwrite properties for the edge - * @param {Object} properties an object with properties - * @param {Object} constants and object with default, global properties - */ - Edge.prototype.setProperties = function(properties) { - if (!properties) { - return; - } + return Math.atan2(y, x) * 180 / Math.PI; + }, - var fields = ['style','fontSize','fontFace','fontColor','fontFill','width', - 'widthSelectionMultiplier','hoverWidth','arrowScaleFactor','dash','inheritColor' - ]; - util.selectiveDeepExtend(fields, this.options, properties); + /** + * do a small comparision to get the direction between two touches. + * @method getDirection + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` + */ + getDirection: function getDirection(touch1, touch2) { + var x = Math.abs(touch1.clientX - touch2.clientX), + y = Math.abs(touch1.clientY - touch2.clientY); - if (properties.from !== undefined) {this.fromId = properties.from;} - if (properties.to !== undefined) {this.toId = properties.to;} + if(x >= y) { + return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; + }, - if (properties.id !== undefined) {this.id = properties.id;} - if (properties.label !== undefined) {this.label = properties.label; this.dirtyLabel = true;} + /** + * calculate the distance between two touches + * @method getDistance + * @param {Touch}touch1 + * @param {Touch} touch2 + * @return {Number} distance + */ + getDistance: function getDistance(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; - if (properties.title !== undefined) {this.title = properties.title;} - if (properties.value !== undefined) {this.value = properties.value;} - if (properties.length !== undefined) {this.physics.springLength = properties.length;} + return Math.sqrt((x * x) + (y * y)); + }, - if (properties.color !== undefined) { - this.options.inheritColor = false; - if (util.isString(properties.color)) { - this.options.color.color = properties.color; - this.options.color.highlight = properties.color; - } - else { - if (properties.color.color !== undefined) {this.options.color.color = properties.color.color;} - if (properties.color.highlight !== undefined) {this.options.color.highlight = properties.color.highlight;} - if (properties.color.hover !== undefined) {this.options.color.hover = properties.color.hover;} - } - } + /** + * calculate the scale factor between two touchLists + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @method getScale + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} scale + */ + getScale: function getScale(start, end) { + // need two fingers... + if(start.length >= 2 && end.length >= 2) { + return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); + } + return 1; + }, - // A node is connected when it has a from and to node. - this.connect(); + /** + * calculate the rotation degrees between two touchLists + * @method getRotation + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} rotation + */ + getRotation: function getRotation(start, end) { + // need two fingers + if(start.length >= 2 && end.length >= 2) { + return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); + } + return 0; + }, - this.widthFixed = this.widthFixed || (properties.width !== undefined); - this.lengthFixed = this.lengthFixed || (properties.length !== undefined); + /** + * find out if the direction is vertical * + * @method isVertical + * @param {String} direction matches `DIRECTION_UP|DOWN` + * @return {Boolean} is_vertical + */ + isVertical: function isVertical(direction) { + return direction == DIRECTION_UP || direction == DIRECTION_DOWN; + }, - this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; + /** + * set css properties with their prefixes + * @param {HTMLElement} element + * @param {String} prop + * @param {String} value + * @param {Boolean} [toggle=true] + * @return {Boolean} + */ + setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { + var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; + prop = Utils.toCamelCase(prop); - // set draw method based on style - switch (this.options.style) { - case 'line': this.draw = this._drawLine; break; - case 'arrow': this.draw = this._drawArrow; break; - case 'arrow-center': this.draw = this._drawArrowCenter; break; - case 'dash-line': this.draw = this._drawDashLine; break; - default: this.draw = this._drawLine; break; - } - }; + for(var i = 0; i < prefixes.length; i++) { + var p = prop; + // prefixes + if(prefixes[i]) { + p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); + } - /** - * Connect an edge to its nodes - */ - Edge.prototype.connect = function () { - this.disconnect(); + // test the style + if(p in element.style) { + element.style[p] = (toggle == null || toggle) && value || ''; + break; + } + } + }, - this.from = this.network.nodes[this.fromId] || null; - this.to = this.network.nodes[this.toId] || null; - this.connected = (this.from && this.to); + /** + * toggle browser default behavior by setting css properties. + * `userSelect='none'` also sets `element.onselectstart` to false + * `userDrag='none'` also sets `element.ondragstart` to false + * + * @method toggleBehavior + * @param {HtmlElement} element + * @param {Object} props + * @param {Boolean} [toggle=true] + */ + toggleBehavior: function toggleBehavior(element, props, toggle) { + if(!props || !element || !element.style) { + return; + } - if (this.connected) { - this.from.attachEdge(this); - this.to.attachEdge(this); - } - else { - if (this.from) { - this.from.detachEdge(this); - } - if (this.to) { - this.to.detachEdge(this); + // set the css properties + Utils.each(props, function(value, prop) { + Utils.setPrefixedCss(element, prop, value, toggle); + }); + + var falseFn = toggle && function() { + return false; + }; + + // also the disable onselectstart + if(props.userSelect == 'none') { + element.onselectstart = falseFn; + } + // and disable ondragstart + if(props.userDrag == 'none') { + element.ondragstart = falseFn; + } + }, + + /** + * convert a string with underscores to camelCase + * so prevent_default becomes preventDefault + * @param {String} str + * @return {String} camelCaseStr + */ + toCamelCase: function toCamelCase(str) { + return str.replace(/[_-]([a-z])/g, function(s) { + return s[1].toUpperCase(); + }); } - } }; + /** - * Disconnect an edge from its nodes + * @module hammer */ - Edge.prototype.disconnect = function () { - if (this.from) { - this.from.detachEdge(this); - this.from = null; - } - if (this.to) { - this.to.detachEdge(this); - this.to = null; - } - - this.connected = false; - }; - /** - * get the title of this edge. - * @return {string} title The title of the edge, or undefined when no title - * has been set. + * @class Event + * @static */ - Edge.prototype.getTitle = function() { - return typeof this.title === "function" ? this.title() : this.title; - }; + var Event = Hammer.event = { + /** + * when touch events have been fired, this is true + * this is used to stop mouse events + * @property prevent_mouseevents + * @private + * @type {Boolean} + */ + preventMouseEvents: false, + /** + * if EVENT_START has been fired + * @property started + * @private + * @type {Boolean} + */ + started: false, - /** - * Retrieve the value of the edge. Can be undefined - * @return {Number} value - */ - Edge.prototype.getValue = function() { - return this.value; - }; + /** + * when the mouse is hold down, this is true + * @property should_detect + * @private + * @type {Boolean} + */ + shouldDetect: false, - /** - * Adjust the value range of the edge. The edge will adjust it's width - * based on its value. - * @param {Number} min - * @param {Number} max - */ - Edge.prototype.setValueRange = function(min, max) { - if (!this.widthFixed && this.value !== undefined) { - var scale = (this.options.widthMax - this.options.widthMin) / (max - min); - this.options.width= (this.value - min) * scale + this.options.widthMin; - this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; - } - }; + /** + * simple event binder with a hook and support for multiple types + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + on: function on(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.on(element, type, handler); + hook && hook(type); + }); + }, - /** - * Redraw a edge - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - */ - Edge.prototype.draw = function(ctx) { - throw "Method draw not initialized in edge"; - }; + /** + * simple event unbinder with a hook and support for multiple types + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + off: function off(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.off(element, type, handler); + hook && hook(type); + }); + }, - /** - * Check if this object is overlapping with the provided object - * @param {Object} obj an object with parameters left, top - * @return {boolean} True if location is located on the edge - */ - Edge.prototype.isOverlappingWith = function(obj) { - if (this.connected) { - var distMax = 10; - var xFrom = this.from.x; - var yFrom = this.from.y; - var xTo = this.to.x; - var yTo = this.to.y; - var xObj = obj.left; - var yObj = obj.top; + /** + * the core touch event handler. + * this finds out if we should to detect gestures + * @method onTouch + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Function} handler + * @return onTouchHandler {Function} the core event handler + */ + onTouch: function onTouch(element, eventType, handler) { + var self = this; - var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); + var onTouchHandler = function onTouchHandler(ev) { + var srcType = ev.type.toLowerCase(), + isPointer = Hammer.HAS_POINTEREVENTS, + isMouse = Utils.inStr(srcType, 'mouse'), + triggerType; - return (dist < distMax); - } - else { - return false - } - }; + // if we are in a mouseevent, but there has been a touchevent triggered in this session + // we want to do nothing. simply break out of the event. + if(isMouse && self.preventMouseEvents) { + return; - Edge.prototype._getColor = function() { - var colorObj = this.options.color; - if (this.options.inheritColor == "to") { - colorObj = { - highlight: this.to.options.color.highlight.border, - hover: this.to.options.color.hover.border, - color: this.to.options.color.border - }; - } - else if (this.options.inheritColor == "from" || this.options.inheritColor == true) { - colorObj = { - highlight: this.from.options.color.highlight.border, - hover: this.from.options.color.hover.border, - color: this.from.options.color.border - }; - } + // mousebutton must be down + } else if(isMouse && eventType == EVENT_START && ev.button === 0) { + self.preventMouseEvents = false; + self.shouldDetect = true; + } else if(isPointer && eventType == EVENT_START) { + self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); + // just a valid start event, but no mouse + } else if(!isMouse && eventType == EVENT_START) { + self.preventMouseEvents = true; + self.shouldDetect = true; + } - if (this.selected == true) {return colorObj.highlight;} - else if (this.hover == true) {return colorObj.hover;} - else {return colorObj.color;} - }; + // update the pointer event before entering the detection + if(isPointer && eventType != EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } + // we are in a touch/down state, so allowed detection of gestures + if(self.shouldDetect) { + triggerType = self.doDetect.call(self, ev, eventType, element, handler); + } - /** - * Redraw a edge as a line - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Edge.prototype._drawLine = function(ctx) { - // set style - ctx.strokeStyle = this._getColor(); - ctx.lineWidth = this._getLineWidth(); + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + if(triggerType == EVENT_END) { + self.preventMouseEvents = false; + self.shouldDetect = false; + PointerEvent.reset(); + // update the pointerevent object after the detection + } - if (this.from != this.to) { - // draw line - var via = this._line(ctx); + if(isPointer && eventType == EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } + }; - // draw label - var point; - if (this.label) { - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); - } - } - else { - var x, y; - var radius = this.physics.springLength / 4; - var node = this.from; - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width / 2; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - node.height / 2; - } - this._circle(ctx, x, y, radius); - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); - } - }; + this.on(element, EVENT_TYPES[eventType], onTouchHandler); + return onTouchHandler; + }, - /** - * Get the line width of the edge. Depends on width and whether one of the - * connected nodes is selected. - * @return {Number} width - * @private - */ - Edge.prototype._getLineWidth = function() { - if (this.selected == true) { - return Math.max(Math.min(this.widthSelected, this.options.widthMax), 0.3*this.networkScaleInv); - } - else { - if (this.hover == true) { - return Math.max(Math.min(this.options.hoverWidth, this.options.widthMax), 0.3*this.networkScaleInv); - } - else { - return Math.max(this.options.width, 0.3*this.networkScaleInv); - } - } - }; + /** + * the core detection method + * this finds out what hammer-touch-events to trigger + * @method doDetect + * @param {Object} ev + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {HTMLElement} element + * @param {Function} handler + * @return {String} triggerType matches `EVENT_START|MOVE|END` + */ + doDetect: function doDetect(ev, eventType, element, handler) { + var touchList = this.getTouchList(ev, eventType); + var touchListLength = touchList.length; + var triggerType = eventType; + var triggerChange = touchList.trigger; // used by fakeMultitouch plugin + var changedLength = touchListLength; - Edge.prototype._getViaCoordinates = function () { - var xVia = null; - var yVia = null; - var factor = this.options.smoothCurves.roundness; - var type = this.options.smoothCurves.type; + // at each touchstart-like event we want also want to trigger a TOUCH event... + if(eventType == EVENT_START) { + triggerChange = EVENT_TOUCH; + // ...the same for a touchend-like event + } else if(eventType == EVENT_END) { + triggerChange = EVENT_RELEASE; - var dx = Math.abs(this.from.x - this.to.x); - var dy = Math.abs(this.from.y - this.to.y); - if (type == 'discrete' || type == 'diagonalCross') { - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dy; - yVia = this.from.y - factor * dy; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dy; - yVia = this.from.y - factor * dy; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dy; - yVia = this.from.y + factor * dy; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dy; - yVia = this.from.y + factor * dy; - } - } - if (type == "discrete") { - xVia = dx < factor * dy ? this.from.x : xVia; - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dx; - yVia = this.from.y - factor * dx; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dx; - yVia = this.from.y - factor * dx; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dx; - yVia = this.from.y + factor * dx; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dx; - yVia = this.from.y + factor * dx; + // keep track of how many touches have been removed + changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); } - } - if (type == "discrete") { - yVia = dy < factor * dx ? this.from.y : yVia; - } - } - } - else if (type == "straightCross") { - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { // up - down - xVia = this.from.x; - if (this.from.y < this.to.y) { - yVia = this.to.y - (1-factor) * dy; - } - else { - yVia = this.to.y + (1-factor) * dy; - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { // left - right - if (this.from.x < this.to.x) { - xVia = this.to.x - (1-factor) * dx; - } - else { - xVia = this.to.x + (1-factor) * dx; - } - yVia = this.from.y; - } - } - else if (type == 'horizontal') { - if (this.from.x < this.to.x) { - xVia = this.to.x - (1-factor) * dx; - } - else { - xVia = this.to.x + (1-factor) * dx; - } - yVia = this.from.y; - } - else if (type == 'vertical') { - xVia = this.from.x; - if (this.from.y < this.to.y) { - yVia = this.to.y - (1-factor) * dy; - } - else { - yVia = this.to.y + (1-factor) * dy; - } - } - else { // continuous - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - // console.log(1) - xVia = this.from.x + factor * dy; - yVia = this.from.y - factor * dy; - xVia = this.to.x < xVia ? this.to.x : xVia; + + // after there are still touches on the screen, + // we just want to trigger a MOVE event. so change the START or END to a MOVE + // but only after detection has been started, the first time we actualy want a START + if(changedLength > 0 && this.started) { + triggerType = EVENT_MOVE; } - else if (this.from.x > this.to.x) { - // console.log(2) - xVia = this.from.x - factor * dy; - yVia = this.from.y - factor * dy; - xVia = this.to.x > xVia ? this.to.x :xVia; + + // detection has been started, we keep track of this, see above + this.started = true; + + // generate some event data, some basic information + var evData = this.collectEventData(element, triggerType, touchList, ev); + + // trigger the triggerType event before the change (TOUCH, RELEASE) events + // but the END event should be at last + if(eventType != EVENT_END) { + handler.call(Detection, evData); } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - // console.log(3) - xVia = this.from.x + factor * dy; - yVia = this.from.y + factor * dy; - xVia = this.to.x < xVia ? this.to.x : xVia; + + // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed + if(triggerChange) { + evData.changedLength = changedLength; + evData.eventType = triggerChange; + + handler.call(Detection, evData); + + evData.eventType = triggerType; + delete evData.changedLength; } - else if (this.from.x > this.to.x) { - // console.log(4, this.from.x, this.to.x) - xVia = this.from.x - factor * dy; - yVia = this.from.y + factor * dy; - xVia = this.to.x > xVia ? this.to.x : xVia; + + // trigger the END event + if(triggerType == EVENT_END) { + handler.call(Detection, evData); + + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + this.started = false; } - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - // console.log(5) - xVia = this.from.x + factor * dx; - yVia = this.from.y - factor * dx; - yVia = this.to.y > yVia ? this.to.y : yVia; + + return triggerType; + }, + + /** + * we have different events for each device/browser + * determine what we need and set them in the EVENT_TYPES constant + * the `onTouch` method is bind to these properties. + * @method determineEventTypes + * @return {Object} events + */ + determineEventTypes: function determineEventTypes() { + var types; + if(Hammer.HAS_POINTEREVENTS) { + if(window.PointerEvent) { + types = [ + 'pointerdown', + 'pointermove', + 'pointerup pointercancel lostpointercapture' + ]; + } else { + types = [ + 'MSPointerDown', + 'MSPointerMove', + 'MSPointerUp MSPointerCancel MSLostPointerCapture' + ]; + } + } else if(Hammer.NO_MOUSEEVENTS) { + types = [ + 'touchstart', + 'touchmove', + 'touchend touchcancel' + ]; + } else { + types = [ + 'touchstart mousedown', + 'touchmove mousemove', + 'touchend touchcancel mouseup' + ]; } - else if (this.from.x > this.to.x) { - // console.log(6) - xVia = this.from.x - factor * dx; - yVia = this.from.y - factor * dx; - yVia = this.to.y > yVia ? this.to.y : yVia; + + EVENT_TYPES[EVENT_START] = types[0]; + EVENT_TYPES[EVENT_MOVE] = types[1]; + EVENT_TYPES[EVENT_END] = types[2]; + return EVENT_TYPES; + }, + + /** + * create touchList depending on the event + * @method getTouchList + * @param {Object} ev + * @param {String} eventType + * @return {Array} touches + */ + getTouchList: function getTouchList(ev, eventType) { + // get the fake pointerEvent touchlist + if(Hammer.HAS_POINTEREVENTS) { + return PointerEvent.getTouchList(); } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - // console.log(7) - xVia = this.from.x + factor * dx; - yVia = this.from.y + factor * dx; - yVia = this.to.y < yVia ? this.to.y : yVia; + + // get the touchlist + if(ev.touches) { + if(eventType == EVENT_MOVE) { + return ev.touches; + } + + var identifiers = []; + var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); + var touchList = []; + + Utils.each(concat, function(touch) { + if(Utils.inArray(identifiers, touch.identifier) === false) { + touchList.push(touch); + } + identifiers.push(touch.identifier); + }); + + return touchList; } - else if (this.from.x > this.to.x) { - // console.log(8) - xVia = this.from.x - factor * dx; - yVia = this.from.y + factor * dx; - yVia = this.to.y < yVia ? this.to.y : yVia; + + // make fake touchList from mouse position + ev.identifier = 1; + return [ev]; + }, + + /** + * collect basic event data + * @method collectEventData + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Array} touches + * @param {Object} ev + * @return {Object} ev + */ + collectEventData: function collectEventData(element, eventType, touches, ev) { + // find out pointerType + var pointerType = POINTER_TOUCH; + if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { + pointerType = POINTER_MOUSE; + } else if(PointerEvent.matchType(POINTER_PEN, ev)) { + pointerType = POINTER_PEN; } - } - } - } + return { + center: Utils.getCenter(touches), + timeStamp: Date.now(), + target: ev.target, + touches: touches, + eventType: eventType, + pointerType: pointerType, + srcEvent: ev, - return {x:xVia, y:yVia}; - }; + /** + * prevent the browser default actions + * mostly used to disable scrolling of the browser + */ + preventDefault: function() { + var srcEvent = this.srcEvent; + srcEvent.preventManipulation && srcEvent.preventManipulation(); + srcEvent.preventDefault && srcEvent.preventDefault(); + }, - /** - * Draw a line between two nodes - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Edge.prototype._line = function (ctx) { - // draw a straight line - ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - if (this.options.smoothCurves.enabled == true) { - if (this.options.smoothCurves.dynamic == false) { - var via = this._getViaCoordinates(); - if (via.x == null) { - ctx.lineTo(this.to.x, this.to.y); - ctx.stroke(); - return null; - } - else { - // this.via.x = via.x; - // this.via.y = via.y; - ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); - ctx.stroke(); - return via; - } - } - else { - ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); - ctx.stroke(); - return this.via; + /** + * stop bubbling the event up to its parents + */ + stopPropagation: function() { + this.srcEvent.stopPropagation(); + }, + + /** + * immediately stop gesture detection + * might be useful after a swipe was detected + * @return {*} + */ + stopDetect: function() { + return Detection.stopDetect(); + } + }; } - } - else { - ctx.lineTo(this.to.x, this.to.y); - ctx.stroke(); - return null; - } }; - /** - * Draw a line from a node to itself, a circle - * @param {CanvasRenderingContext2D} ctx - * @param {Number} x - * @param {Number} y - * @param {Number} radius - * @private - */ - Edge.prototype._circle = function (ctx, x, y, radius) { - // draw a circle - ctx.beginPath(); - ctx.arc(x, y, radius, 0, 2 * Math.PI, false); - ctx.stroke(); - }; /** - * Draw label with white background and with the middle at (x, y) - * @param {CanvasRenderingContext2D} ctx - * @param {String} text - * @param {Number} x - * @param {Number} y - * @private + * @module hammer + * + * @class PointerEvent + * @static */ - Edge.prototype._label = function (ctx, text, x, y) { - if (text) { - ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + - this.options.fontSize + "px " + this.options.fontFace; - var yLine; + var PointerEvent = Hammer.PointerEvent = { + /** + * holds all pointers, by `identifier` + * @property pointers + * @type {Object} + */ + pointers: {}, - if (this.dirtyLabel == true) { - var lines = String(text).split('\n'); - var lineCount = lines.length; - var fontSize = (Number(this.options.fontSize) + 4); - yLine = y + (1 - lineCount) / 2 * fontSize; + /** + * get the pointers as an array + * @method getTouchList + * @return {Array} touchlist + */ + getTouchList: function getTouchList() { + var touchlist = []; + // we can use forEach since pointerEvents only is in IE10 + Utils.each(this.pointers, function(pointer) { + touchlist.push(pointer); + }); + return touchlist; + }, - var width = ctx.measureText(lines[0]).width; - for (var i = 1; i < lineCount; i++) { - var lineWidth = ctx.measureText(lines[i]).width; - width = lineWidth > width ? lineWidth : width; - } - var height = this.options.fontSize * lineCount; - var left = x - width / 2; - var top = y - height / 2; + /** + * update the position of a pointer + * @method updatePointer + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Object} pointerEvent + */ + updatePointer: function updatePointer(eventType, pointerEvent) { + if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { + delete this.pointers[pointerEvent.pointerId]; + } else { + pointerEvent.identifier = pointerEvent.pointerId; + this.pointers[pointerEvent.pointerId] = pointerEvent; + } + }, - // cache - this.labelDimensions = {top:top,left:left,width:width,height:height,yLine:yLine}; - } + /** + * check if ev matches pointertype + * @method matchType + * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` + * @param {PointerEvent} ev + */ + matchType: function matchType(pointerType, ev) { + if(!ev.pointerType) { + return false; + } + var pt = ev.pointerType, + types = {}; - if (this.options.fontFill !== undefined && this.options.fontFill !== null && this.options.fontFill !== "none") { - ctx.fillStyle = this.options.fontFill; - ctx.fillRect(this.labelDimensions.left, - this.labelDimensions.top, - this.labelDimensions.width, - this.labelDimensions.height); - } + types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); + types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); + types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); + return types[pointerType]; + }, - // draw text - ctx.fillStyle = this.options.fontColor || "black"; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - yLine = this.labelDimensions.yLine; - for (var i = 0; i < lineCount; i++) { - ctx.fillText(lines[i], x, yLine); - yLine += fontSize; + /** + * reset the stored pointers + * @method reset + */ + reset: function resetList() { + this.pointers = {}; } - } }; + /** - * Redraw a edge as a dashed line - * Draw this edge in the given canvas - * @author David Jordan - * @date 2012-08-08 - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private + * @module hammer + * + * @class Detection + * @static */ - Edge.prototype._drawDashLine = function(ctx) { - // set style - ctx.strokeStyle = this._getColor(); - ctx.lineWidth = this._getLineWidth(); + var Detection = Hammer.detection = { + // contains all registred Hammer.gestures in the correct order + gestures: [], - var via = null; - // only firefox and chrome support this method, else we use the legacy one. - if (ctx.mozDash !== undefined || ctx.setLineDash !== undefined) { - // configure the dash pattern - var pattern = [0]; - if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) { - pattern = [this.options.dash.length,this.options.dash.gap]; - } - else { - pattern = [5,5]; - } + // data of the current Hammer.gesture detection session + current: null, - // set dash settings for chrome or firefox - if (typeof ctx.setLineDash !== 'undefined') { //Chrome - ctx.setLineDash(pattern); - ctx.lineDashOffset = 0; + // the previous Hammer.gesture session data + // is a full clone of the previous gesture.current object + previous: null, - } else { //Firefox - ctx.mozDash = pattern; - ctx.mozDashOffset = 0; - } + // when this becomes true, no gestures are fired + stopped: false, - // draw the line - via = this._line(ctx); + /** + * start Hammer.gesture detection + * @method startDetect + * @param {Hammer.Instance} inst + * @param {Object} eventData + */ + startDetect: function startDetect(inst, eventData) { + // already busy with a Hammer.gesture detection on an element + if(this.current) { + return; + } - // restore the dash settings. - if (typeof ctx.setLineDash !== 'undefined') { //Chrome - ctx.setLineDash([0]); - ctx.lineDashOffset = 0; + this.stopped = false; - } else { //Firefox - ctx.mozDash = [0]; - ctx.mozDashOffset = 0; - } - } - else { // unsupporting smooth lines - // draw dashed line - ctx.beginPath(); - ctx.lineCap = 'round'; - if (this.options.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value - { - ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, - [this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]); - } - else if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value - { - ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, - [this.options.dash.length,this.options.dash.gap]); - } - else //If all else fails draw a line - { - ctx.moveTo(this.from.x, this.from.y); - ctx.lineTo(this.to.x, this.to.y); - } - ctx.stroke(); - } + // holds current session + this.current = { + inst: inst, // reference to HammerInstance we're working for + startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc + lastEvent: false, // last eventData + lastCalcEvent: false, // last eventData for calculations. + futureCalcEvent: false, // last eventData for calculations. + lastCalcData: {}, // last lastCalcData + name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc + }; + + this.detect(eventData); + }, + + /** + * Hammer.gesture detection + * @method detect + * @param {Object} eventData + * @return {any} + */ + detect: function detect(eventData) { + if(!this.current || this.stopped) { + return; + } + + // extend event data with calculations about scale, distance etc + eventData = this.extendEventData(eventData); + + // hammer instance and instance options + var inst = this.current.inst, + instOptions = inst.options; + + // call Hammer.gesture handlers + Utils.each(this.gestures, function triggerGesture(gesture) { + // only when the instance options have enabled this gesture + if(!this.stopped && inst.enabled && instOptions[gesture.name]) { + gesture.handler.call(gesture, eventData, inst); + } + }, this); + + // store as previous event event + if(this.current) { + this.current.lastEvent = eventData; + } + + if(eventData.eventType == EVENT_END) { + this.stopDetect(); + } + + return eventData; + }, + + /** + * clear the Hammer.gesture vars + * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected + * to stop other Hammer.gestures from being fired + * @method stopDetect + */ + stopDetect: function stopDetect() { + // clone current data to the store as the previous gesture + // used for the double tap gesture, since this is an other gesture detect session + this.previous = Utils.extend({}, this.current); + + // reset the current + this.current = null; + this.stopped = true; + }, + + /** + * calculate velocity, angle and direction + * @method getVelocityData + * @param {Object} ev + * @param {Object} center + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + */ + getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { + var cur = this.current, + recalc = false, + calcEv = cur.lastCalcEvent, + calcData = cur.lastCalcData; + + if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { + center = calcEv.center; + deltaTime = ev.timeStamp - calcEv.timeStamp; + deltaX = ev.center.clientX - calcEv.center.clientX; + deltaY = ev.center.clientY - calcEv.center.clientY; + recalc = true; + } + + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + cur.futureCalcEvent = ev; + } + + if(!cur.lastCalcEvent || recalc) { + calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); + calcData.angle = Utils.getAngle(center, ev.center); + calcData.direction = Utils.getDirection(center, ev.center); + + cur.lastCalcEvent = cur.futureCalcEvent || ev; + cur.futureCalcEvent = ev; + } + + ev.velocityX = calcData.velocity.x; + ev.velocityY = calcData.velocity.y; + ev.interimAngle = calcData.angle; + ev.interimDirection = calcData.direction; + }, + + /** + * extend eventData for Hammer.gestures + * @method extendEventData + * @param {Object} ev + * @return {Object} ev + */ + extendEventData: function extendEventData(ev) { + var cur = this.current, + startEv = cur.startEvent, + lastEv = cur.lastEvent || startEv; + + // update the start touchlist to calculate the scale/rotation + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + startEv.touches = []; + Utils.each(ev.touches, function(touch) { + startEv.touches.push({ + clientX: touch.clientX, + clientY: touch.clientY + }); + }); + } + + var deltaTime = ev.timeStamp - startEv.timeStamp, + deltaX = ev.center.clientX - startEv.center.clientX, + deltaY = ev.center.clientY - startEv.center.clientY; + + this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); + + Utils.extend(ev, { + startEvent: startEv, + + deltaTime: deltaTime, + deltaX: deltaX, + deltaY: deltaY, + + distance: Utils.getDistance(startEv.center, ev.center), + angle: Utils.getAngle(startEv.center, ev.center), + direction: Utils.getDirection(startEv.center, ev.center), + scale: Utils.getScale(startEv.touches, ev.touches), + rotation: Utils.getRotation(startEv.touches, ev.touches) + }); + + return ev; + }, - // draw label - if (this.label) { - var point; - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); + /** + * register new gesture + * @method register + * @param {Object} gesture object, see `gestures/` for documentation + * @return {Array} gestures + */ + register: function register(gesture) { + // add an enable gesture options if there is no given + var options = gesture.defaults || {}; + if(options[gesture.name] === undefined) { + options[gesture.name] = true; + } + + // extend Hammer default options with the Hammer.gesture options + Utils.extend(Hammer.defaults, options, true); + + // set its index + gesture.index = gesture.index || 1000; + + // add Hammer.gesture to the list + this.gestures.push(gesture); + + // sort the list by index + this.gestures.sort(function(a, b) { + if(a.index < b.index) { + return -1; + } + if(a.index > b.index) { + return 1; + } + return 0; + }); + + return this.gestures; } - this._label(ctx, this.label, point.x, point.y); - } }; - /** - * Get a point on a line - * @param {Number} percentage. Value between 0 (line start) and 1 (line end) - * @return {Object} point - * @private - */ - Edge.prototype._pointOnLine = function (percentage) { - return { - x: (1 - percentage) * this.from.x + percentage * this.to.x, - y: (1 - percentage) * this.from.y + percentage * this.to.y - } - }; /** - * Get a point on a circle - * @param {Number} x - * @param {Number} y - * @param {Number} radius - * @param {Number} percentage. Value between 0 (line start) and 1 (line end) - * @return {Object} point - * @private + * @module hammer */ - Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { - var angle = (percentage - 3/8) * 2 * Math.PI; - return { - x: x + radius * Math.cos(angle), - y: y - radius * Math.sin(angle) - } - }; /** - * Redraw a edge as a line with an arrow halfway the line - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private + * create new hammer instance + * all methods should return the instance itself, so it is chainable. + * + * @class Instance + * @constructor + * @param {HTMLElement} element + * @param {Object} [options={}] options are merged with `Hammer.defaults` + * @return {Hammer.Instance} */ - Edge.prototype._drawArrowCenter = function(ctx) { - var point; - // set style - ctx.strokeStyle = this._getColor(); - ctx.fillStyle = ctx.strokeStyle; - ctx.lineWidth = this._getLineWidth(); + Hammer.Instance = function(element, options) { + var self = this; - if (this.from != this.to) { - // draw line - var via = this._line(ctx); + // setup HammerJS window events and register all gestures + // this also sets up the default options + setup(); - var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - // draw an arrow halfway the line - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } + /** + * @property element + * @type {HTMLElement} + */ + this.element = element; - ctx.arrow(point.x, point.y, angle, length); - ctx.fill(); - ctx.stroke(); + /** + * @property enabled + * @type {Boolean} + * @protected + */ + this.enabled = true; - // draw label - if (this.label) { - this._label(ctx, this.label, point.x, point.y); - } - } - else { - // draw circle - var x, y; - var radius = 0.25 * Math.max(100,this.physics.springLength); - var node = this.from; - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width * 0.5; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - node.height * 0.5; - } - this._circle(ctx, x, y, radius); + /** + * options, merged with the defaults + * options with an _ are converted to camelCase + * @property options + * @type {Object} + */ + Utils.each(options, function(value, name) { + delete options[name]; + options[Utils.toCamelCase(name)] = value; + }); - // draw all arrows - var angle = 0.2 * Math.PI; - var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - point = this._pointOnCircle(x, y, radius, 0.5); - ctx.arrow(point.x, point.y, angle, length); - ctx.fill(); - ctx.stroke(); + this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); - // draw label - if (this.label) { - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); + // add some css to the element to prevent the browser from doing its native behavoir + if(this.options.behavior) { + Utils.toggleBehavior(this.element, this.options.behavior, true); } - } + + /** + * event start handler on the element to start the detection + * @property eventStartHandler + * @type {Object} + */ + this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { + if(self.enabled && ev.eventType == EVENT_START) { + Detection.startDetect(self, ev); + } else if(ev.eventType == EVENT_TOUCH) { + Detection.detect(ev); + } + }); + + /** + * keep a list of user event handlers which needs to be removed when calling 'dispose' + * @property eventHandlers + * @type {Array} + */ + this.eventHandlers = []; }; + Hammer.Instance.prototype = { + /** + * bind events to the instance + * @method on + * @chainable + * @param {String} gestures multiple gestures by splitting with a space + * @param {Function} handler + * @param {Object} handler.ev event object + */ + on: function onEvent(gestures, handler) { + var self = this; + Event.on(self.element, gestures, handler, function(type) { + self.eventHandlers.push({ gesture: type, handler: handler }); + }); + return self; + }, + /** + * unbind events to the instance + * @method off + * @chainable + * @param {String} gestures + * @param {Function} handler + */ + off: function offEvent(gestures, handler) { + var self = this; - /** - * Redraw a edge as a line with an arrow - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Edge.prototype._drawArrow = function(ctx) { - // set style - ctx.strokeStyle = this._getColor(); - ctx.fillStyle = ctx.strokeStyle; - ctx.lineWidth = this._getLineWidth(); + Event.off(self.element, gestures, handler, function(type) { + var index = Utils.inArray({ gesture: type, handler: handler }); + if(index !== false) { + self.eventHandlers.splice(index, 1); + } + }); + return self; + }, - var angle, length; - //draw a line - if (this.from != this.to) { - angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var dx = (this.to.x - this.from.x); - var dy = (this.to.y - this.from.y); - var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + /** + * trigger gesture event + * @method trigger + * @chainable + * @param {String} gesture + * @param {Object} [eventData] + */ + trigger: function triggerEvent(gesture, eventData) { + // optional + if(!eventData) { + eventData = {}; + } - var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); - var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; - var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; - var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; + // create DOM event + var event = Hammer.DOCUMENT.createEvent('Event'); + event.initEvent(gesture, true, true); + event.gesture = eventData; - var via; - if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true ) { - via = this.via; - } - else if (this.options.smoothCurves.enabled == true) { - via = this._getViaCoordinates(); - } + // trigger on the target if it is in the instance element, + // this is for event delegation tricks + var element = this.element; + if(Utils.hasParent(eventData.target, element)) { + element = eventData.target; + } - if (this.options.smoothCurves.enabled == true && via.x != null) { - angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); - dx = (this.to.x - via.x); - dy = (this.to.y - via.y); - edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - } - var toBorderDist = this.to.distanceToBorder(ctx, angle); - var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; + element.dispatchEvent(event); + return this; + }, - var xTo,yTo; - if (this.options.smoothCurves.enabled == true && via.x != null) { - xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; - } - else { - xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; - } + /** + * enable of disable hammer.js detection + * @method enable + * @chainable + * @param {Boolean} state + */ + enable: function enable(state) { + this.enabled = state; + return this; + }, - ctx.beginPath(); - ctx.moveTo(xFrom,yFrom); - if (this.options.smoothCurves.enabled == true && via.x != null) { - ctx.quadraticCurveTo(via.x,via.y,xTo, yTo); - } - else { - ctx.lineTo(xTo, yTo); - } - ctx.stroke(); + /** + * dispose this hammer instance + * @method dispose + * @return {Null} + */ + dispose: function dispose() { + var i, eh; - // draw arrow at the end of the line - length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - ctx.arrow(xTo, yTo, angle, length); - ctx.fill(); - ctx.stroke(); + // undo all changes made by stop_browser_behavior + Utils.toggleBehavior(this.element, this.options.behavior, false); - // draw label - if (this.label) { - var point; - if (this.options.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); - } - } - else { - // draw circle - var node = this.from; - var x, y, arrow; - var radius = 0.25 * Math.max(100,this.physics.springLength); - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width * 0.5; - y = node.y - radius; - arrow = { - x: x, - y: node.y, - angle: 0.9 * Math.PI - }; - } - else { - x = node.x + radius; - y = node.y - node.height * 0.5; - arrow = { - x: node.x, - y: y, - angle: 0.6 * Math.PI - }; - } - ctx.beginPath(); - // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center - ctx.arc(x, y, radius, 0, 2 * Math.PI, false); - ctx.stroke(); + // unbind all custom event handlers + for(i = -1; (eh = this.eventHandlers[++i]);) { + Utils.off(this.element, eh.gesture, eh.handler); + } - // draw all arrows - var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; - ctx.arrow(arrow.x, arrow.y, arrow.angle, length); - ctx.fill(); - ctx.stroke(); + this.eventHandlers = []; - // draw label - if (this.label) { - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); + // unbind the start event listener + Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); + + return null; } - } }; + /** + * @module gestures + */ + /** + * Move with x fingers (default 1) around on the page. + * Preventing the default browser behavior is a good way to improve feel and working. + * ```` + * hammertime.on("drag", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Drag + * @static + */ + /** + * @event drag + * @param {Object} ev + */ + /** + * @event dragstart + * @param {Object} ev + */ + /** + * @event dragend + * @param {Object} ev + */ + /** + * @event drapleft + * @param {Object} ev + */ + /** + * @event dragright + * @param {Object} ev + */ + /** + * @event dragup + * @param {Object} ev + */ + /** + * @event dragdown + * @param {Object} ev + */ /** - * Calculate the distance between a point (x3,y3) and a line segment from - * (x1,y1) to (x2,y2). - * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x3 - * @param {number} y3 - * @private + * @param {String} name */ - Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point - var returnValue = 0; - if (this.from != this.to) { - if (this.options.smoothCurves.enabled == true) { - var xVia, yVia; - if (this.options.smoothCurves.enabled == true && this.options.smoothCurves.dynamic == true) { - xVia = this.via.x; - yVia = this.via.y; - } - else { - var via = this._getViaCoordinates(); - xVia = via.x; - yVia = via.y; - } - var minDistance = 1e9; - var distance; - var i,t,x,y, lastX, lastY; - for (i = 0; i < 10; i++) { - t = 0.1*i; - x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; - y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; - if (i > 0) { - distance = this._getDistanceToLine(lastX,lastY,x,y, x3,y3); - minDistance = distance < minDistance ? distance : minDistance; + (function(name) { + var triggered = false; + + function dragGesture(ev, inst) { + var cur = Detection.current; + + // max touches + if(inst.options.dragMaxTouches > 0 && + ev.touches.length > inst.options.dragMaxTouches) { + return; } - lastX = x; lastY = y; - } - returnValue = minDistance; - } - else { - returnValue = this._getDistanceToLine(x1,y1,x2,y2,x3,y3); - } - } - else { - var x, y, dx, dy; - var radius = 0.25 * this.physics.springLength; - var node = this.from; - if (node.width > node.height) { - x = node.x + 0.5 * node.width; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - 0.5 * node.height; - } - dx = x - x3; - dy = y - y3; - returnValue = Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); - } - if (this.labelDimensions.left < x3 && - this.labelDimensions.left + this.labelDimensions.width > x3 && - this.labelDimensions.top < y3 && - this.labelDimensions.top + this.labelDimensions.height > y3) { - return 0; - } - else { - return returnValue; - } - }; + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; + + case EVENT_MOVE: + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.distance < inst.options.dragMinDistance && + cur.name != name) { + return; + } - Edge.prototype._getDistanceToLine = function(x1,y1,x2,y2,x3,y3) { - var px = x2-x1, - py = y2-y1, - something = px*px + py*py, - u = ((x3 - x1) * px + (y3 - y1) * py) / something; + var startCenter = cur.startEvent.center; - if (u > 1) { - u = 1; - } - else if (u < 0) { - u = 0; - } + // we are dragging! + if(cur.name != name) { + cur.name = name; + if(inst.options.dragDistanceCorrection && ev.distance > 0) { + // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. + // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. + // It might be useful to save the original start point somewhere + var factor = Math.abs(inst.options.dragMinDistance / ev.distance); + startCenter.pageX += ev.deltaX * factor; + startCenter.pageY += ev.deltaY * factor; + startCenter.clientX += ev.deltaX * factor; + startCenter.clientY += ev.deltaY * factor; - var x = x1 + u * px, - y = y1 + u * py, - dx = x - x3, - dy = y - y3; + // recalculate event data using new start point + ev = Detection.extendEventData(ev); + } + } - //# Note: If the actual distance does not matter, - //# if you only want to compare what this function - //# returns to other results of this function, you - //# can just return the squared distance instead - //# (i.e. remove the sqrt) to gain a little performance + // lock drag to axis? + if(cur.lastEvent.dragLockToAxis || + ( inst.options.dragLockToAxis && + inst.options.dragLockMinDistance <= ev.distance + )) { + ev.dragLockToAxis = true; + } - return Math.sqrt(dx*dx + dy*dy); - }; + // keep direction on the axis that the drag gesture started on + var lastDirection = cur.lastEvent.direction; + if(ev.dragLockToAxis && lastDirection !== ev.direction) { + if(Utils.isVertical(lastDirection)) { + ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; + } else { + ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + } - /** - * This allows the zoom level of the network to influence the rendering - * - * @param scale - */ - Edge.prototype.setScale = function(scale) { - this.networkScaleInv = 1.0/scale; - }; + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } + // trigger events + inst.trigger(name, ev); + inst.trigger(name + ev.direction, ev); - Edge.prototype.select = function() { - this.selected = true; - }; + var isVertical = Utils.isVertical(ev.direction); - Edge.prototype.unselect = function() { - this.selected = false; - }; + // block the browser events + if((inst.options.dragBlockVertical && isVertical) || + (inst.options.dragBlockHorizontal && !isVertical)) { + ev.preventDefault(); + } + break; - Edge.prototype.positionBezierNode = function() { - if (this.via !== null && this.from !== null && this.to !== null) { - this.via.x = 0.5 * (this.from.x + this.to.x); - this.via.y = 0.5 * (this.from.y + this.to.y); - } - }; + case EVENT_RELEASE: + if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; - /** - * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. - * @param ctx - */ - Edge.prototype._drawControlNodes = function(ctx) { - if (this.controlNodesEnabled == true) { - if (this.controlNodes.from === null && this.controlNodes.to === null) { - var nodeIdFrom = "edgeIdFrom:".concat(this.id); - var nodeIdTo = "edgeIdTo:".concat(this.id); - var constants = { - nodes:{group:'', radius:8}, - physics:{damping:0}, - clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} - }; - this.controlNodes.from = new Node( - {id:nodeIdFrom, - shape:'dot', - color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} - },{},{},constants); - this.controlNodes.to = new Node( - {id:nodeIdTo, - shape:'dot', - color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} - },{},{},constants); + case EVENT_END: + triggered = false; + break; + } } - if (this.controlNodes.from.selected == false && this.controlNodes.to.selected == false) { - this.controlNodes.positions = this.getControlNodePositions(ctx); - this.controlNodes.from.x = this.controlNodes.positions.from.x; - this.controlNodes.from.y = this.controlNodes.positions.from.y; - this.controlNodes.to.x = this.controlNodes.positions.to.x; - this.controlNodes.to.y = this.controlNodes.positions.to.y; - } + Hammer.gestures.Drag = { + name: name, + index: 50, + handler: dragGesture, + defaults: { + /** + * minimal movement that have to be made before the drag event gets triggered + * @property dragMinDistance + * @type {Number} + * @default 10 + */ + dragMinDistance: 10, - this.controlNodes.from.draw(ctx); - this.controlNodes.to.draw(ctx); - } - else { - this.controlNodes = {from:null, to:null, positions:{}}; - } - }; + /** + * Set dragDistanceCorrection to true to make the starting point of the drag + * be calculated from where the drag was triggered, not from where the touch started. + * Useful to avoid a jerk-starting drag, which can make fine-adjustments + * through dragging difficult, and be visually unappealing. + * @property dragDistanceCorrection + * @type {Boolean} + * @default true + */ + dragDistanceCorrection: true, + + /** + * set 0 for unlimited, but this can conflict with transform + * @property dragMaxTouches + * @type {Number} + * @default 1 + */ + dragMaxTouches: 1, + + /** + * prevent default browser behavior when dragging occurs + * be careful with it, it makes the element a blocking element + * when you are using the drag gesture, it is a good practice to set this true + * @property dragBlockHorizontal + * @type {Boolean} + * @default false + */ + dragBlockHorizontal: false, + + /** + * same as `dragBlockHorizontal`, but for vertical movement + * @property dragBlockVertical + * @type {Boolean} + * @default false + */ + dragBlockVertical: false, + + /** + * dragLockToAxis keeps the drag gesture on the axis that it started on, + * It disallows vertical directions if the initial direction was horizontal, and vice versa. + * @property dragLockToAxis + * @type {Boolean} + * @default false + */ + dragLockToAxis: false, + + /** + * drag lock only kicks in when distance > dragLockMinDistance + * This way, locking occurs only when the distance has become large enough to reliably determine the direction + * @property dragLockMinDistance + * @type {Number} + * @default 25 + */ + dragLockMinDistance: 25 + } + }; + })('drag'); /** - * Enable control nodes. - * @private + * @module gestures */ - Edge.prototype._enableControlNodes = function() { - this.controlNodesEnabled = true; - }; - /** - * disable control nodes - * @private + * trigger a simple gesture event, so you can do anything in your handler. + * only usable if you know what your doing... + * + * @class Gesture + * @static */ - Edge.prototype._disableControlNodes = function() { - this.controlNodesEnabled = false; - }; - /** - * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. - * @param x - * @param y - * @returns {null} - * @private + * @event gesture + * @param {Object} ev */ - Edge.prototype._getSelectedControlNode = function(x,y) { - var positions = this.controlNodes.positions; - var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); - var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); - - if (fromDistance < 15) { - this.connectedNode = this.from; - this.from = this.controlNodes.from; - return this.controlNodes.from; - } - else if (toDistance < 15) { - this.connectedNode = this.to; - this.to = this.controlNodes.to; - return this.controlNodes.to; - } - else { - return null; - } + Hammer.gestures.Gesture = { + name: 'gesture', + index: 1337, + handler: function releaseGesture(ev, inst) { + inst.trigger(this.name, ev); + } }; - /** - * this resets the control nodes to their original position. - * @private + * @module gestures */ - Edge.prototype._restoreControlNodes = function() { - if (this.controlNodes.from.selected == true) { - this.from = this.connectedNode; - this.connectedNode = null; - this.controlNodes.from.unselect(); - } - if (this.controlNodes.to.selected == true) { - this.to = this.connectedNode; - this.connectedNode = null; - this.controlNodes.to.unselect(); - } - }; - /** - * this calculates the position of the control nodes on the edges of the parent nodes. + * Touch stays at the same place for x time * - * @param ctx - * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} + * @class Hold + * @static + */ + /** + * @event hold + * @param {Object} ev */ - Edge.prototype.getControlNodePositions = function(ctx) { - var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var dx = (this.to.x - this.from.x); - var dy = (this.to.y - this.from.y); - var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); - var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; - var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; - var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - var via; - if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true) { - via = this.via; - } - else if (this.options.smoothCurves.enabled == true) { - via = this._getViaCoordinates(); - } + /** + * @param {String} name + */ + (function(name) { + var timer; - if (this.options.smoothCurves.enabled == true && via.x != null) { - angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); - dx = (this.to.x - via.x); - dy = (this.to.y - via.y); - edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - } - var toBorderDist = this.to.distanceToBorder(ctx, angle); - var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; + function holdGesture(ev, inst) { + var options = inst.options, + current = Detection.current; - var xTo,yTo; - if (this.options.smoothCurves.enabled == true && via.x != null) { - xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; - } - else { - xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; - } + switch(ev.eventType) { + case EVENT_START: + clearTimeout(timer); - return {from:{x:xFrom,y:yFrom},to:{x:xTo,y:yTo}}; - }; + // set the gesture so we can check in the timeout if it still is + current.name = name; - module.exports = Edge; + // set timer and if after the timeout it still is hold, + // we trigger the hold event + timer = setTimeout(function() { + if(current && current.name == name) { + inst.trigger(name, ev); + } + }, options.holdTimeout); + break; -/***/ }, -/* 58 */ -/***/ function(module, exports, __webpack_require__) { + case EVENT_MOVE: + if(ev.distance > options.holdThreshold) { + clearTimeout(timer); + } + break; + + case EVENT_RELEASE: + clearTimeout(timer); + break; + } + } + + Hammer.gestures.Hold = { + name: name, + index: 10, + defaults: { + /** + * @property holdTimeout + * @type {Number} + * @default 500 + */ + holdTimeout: 500, + + /** + * movement allowed while holding + * @property holdThreshold + * @type {Number} + * @default 2 + */ + holdThreshold: 2 + }, + handler: holdGesture + }; + })('hold'); /** - * Popup is a class to create a popup window with some text - * @param {Element} container The container object. - * @param {Number} [x] - * @param {Number} [y] - * @param {String} [text] - * @param {Object} [style] An object containing borderColor, - * backgroundColor, etc. + * @module gestures */ - function Popup(container, x, y, text, style) { - if (container) { - this.container = container; - } - else { - this.container = document.body; - } - - // x, y and text are optional, see if a style object was passed in their place - if (style === undefined) { - if (typeof x === "object") { - style = x; - x = undefined; - } else if (typeof text === "object") { - style = text; - text = undefined; - } else { - // for backwards compatibility, in case clients other than Network are creating Popup directly - style = { - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - color: { - border: '#666', - background: '#FFFFC6' + /** + * when a touch is being released from the page + * + * @class Release + * @static + */ + /** + * @event release + * @param {Object} ev + */ + Hammer.gestures.Release = { + name: 'release', + index: Infinity, + handler: function releaseGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + inst.trigger(this.name, ev); } - } } - } + }; + + /** + * @module gestures + */ + /** + * triggers swipe events when the end velocity is above the threshold + * for best usage, set `preventDefault` (on the drag gesture) to `true` + * ```` + * hammertime.on("dragleft swipeleft", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Swipe + * @static + */ + /** + * @event swipe + * @param {Object} ev + */ + /** + * @event swipeleft + * @param {Object} ev + */ + /** + * @event swiperight + * @param {Object} ev + */ + /** + * @event swipeup + * @param {Object} ev + */ + /** + * @event swipedown + * @param {Object} ev + */ + Hammer.gestures.Swipe = { + name: 'swipe', + index: 40, + defaults: { + /** + * @property swipeMinTouches + * @type {Number} + * @default 1 + */ + swipeMinTouches: 1, + + /** + * @property swipeMaxTouches + * @type {Number} + * @default 1 + */ + swipeMaxTouches: 1, + + /** + * horizontal swipe velocity + * @property swipeVelocityX + * @type {Number} + * @default 0.6 + */ + swipeVelocityX: 0.6, + + /** + * vertical swipe velocity + * @property swipeVelocityY + * @type {Number} + * @default 0.6 + */ + swipeVelocityY: 0.6 + }, - this.x = 0; - this.y = 0; - this.padding = 5; + handler: function swipeGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + var touches = ev.touches.length, + options = inst.options; - if (x !== undefined && y !== undefined ) { - this.setPosition(x, y); - } - if (text !== undefined) { - this.setText(text); - } + // max touches + if(touches < options.swipeMinTouches || + touches > options.swipeMaxTouches) { + return; + } - // create the frame - this.frame = document.createElement("div"); - var styleAttr = this.frame.style; - styleAttr.position = "absolute"; - styleAttr.visibility = "hidden"; - styleAttr.border = "1px solid " + style.color.border; - styleAttr.color = style.fontColor; - styleAttr.fontSize = style.fontSize + "px"; - styleAttr.fontFamily = style.fontFace; - styleAttr.padding = this.padding + "px"; - styleAttr.backgroundColor = style.color.background; - styleAttr.borderRadius = "3px"; - styleAttr.MozBorderRadius = "3px"; - styleAttr.WebkitBorderRadius = "3px"; - styleAttr.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; - styleAttr.whiteSpace = "nowrap"; - this.container.appendChild(this.frame); - } + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.velocityX > options.swipeVelocityX || + ev.velocityY > options.swipeVelocityY) { + // trigger swipe events + inst.trigger(this.name, ev); + inst.trigger(this.name + ev.direction, ev); + } + } + } + }; /** - * @param {number} x Horizontal position of the popup window - * @param {number} y Vertical position of the popup window + * @module gestures */ - Popup.prototype.setPosition = function(x, y) { - this.x = parseInt(x); - this.y = parseInt(y); - }; - /** - * Set the content for the popup window. This can be HTML code or text. - * @param {string | Element} content + * Single tap and a double tap on a place + * + * @class Tap + * @static + */ + /** + * @event tap + * @param {Object} ev + */ + /** + * @event doubletap + * @param {Object} ev */ - Popup.prototype.setText = function(content) { - if (content instanceof Element) { - this.frame.innerHTML = ''; - this.frame.appendChild(content); - } - else { - this.frame.innerHTML = content; // string containing text or HTML - } - }; /** - * Show the popup window - * @param {boolean} show Optional. Show or hide the window + * @param {String} name */ - Popup.prototype.show = function (show) { - if (show === undefined) { - show = true; - } + (function(name) { + var hasMoved = false; - if (show) { - var height = this.frame.clientHeight; - var width = this.frame.clientWidth; - var maxHeight = this.frame.parentNode.clientHeight; - var maxWidth = this.frame.parentNode.clientWidth; + function tapGesture(ev, inst) { + var options = inst.options, + current = Detection.current, + prev = Detection.previous, + sincePrev, + didDoubleTap; - var top = (this.y - height); - if (top + height + this.padding > maxHeight) { - top = maxHeight - height - this.padding; - } - if (top < this.padding) { - top = this.padding; - } + switch(ev.eventType) { + case EVENT_START: + hasMoved = false; + break; - var left = this.x; - if (left + width + this.padding > maxWidth) { - left = maxWidth - width - this.padding; - } - if (left < this.padding) { - left = this.padding; - } + case EVENT_MOVE: + hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); + break; - this.frame.style.left = left + "px"; - this.frame.style.top = top + "px"; - this.frame.style.visibility = "visible"; - } - else { - this.hide(); - } - }; + case EVENT_END: + if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { + // previous gesture, for the double tap since these are two different gesture detections + sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; + didDoubleTap = false; - /** - * Hide the popup window - */ - Popup.prototype.hide = function () { - this.frame.style.visibility = "hidden"; - }; + // check if double tap + if(prev && prev.name == name && + (sincePrev && sincePrev < options.doubleTapInterval) && + ev.distance < options.doubleTapDistance) { + inst.trigger('doubletap', ev); + didDoubleTap = true; + } - module.exports = Popup; + // do a single tap + if(!didDoubleTap || options.tapAlways) { + current.name = name; + inst.trigger(current.name, ev); + } + } + break; + } + } + Hammer.gestures.Tap = { + name: name, + index: 100, + handler: tapGesture, + defaults: { + /** + * max time of a tap, this is for the slow tappers + * @property tapMaxTime + * @type {Number} + * @default 250 + */ + tapMaxTime: 250, -/***/ }, -/* 59 */ -/***/ function(module, exports, __webpack_require__) { + /** + * max distance of movement of a tap, this is for the slow tappers + * @property tapMaxDistance + * @type {Number} + * @default 10 + */ + tapMaxDistance: 10, - var PhysicsMixin = __webpack_require__(60); - var ClusterMixin = __webpack_require__(64); - var SectorsMixin = __webpack_require__(65); - var SelectionMixin = __webpack_require__(66); - var ManipulationMixin = __webpack_require__(67); - var NavigationMixin = __webpack_require__(68); - var HierarchicalLayoutMixin = __webpack_require__(69); + /** + * always trigger the `tap` event, even while double-tapping + * @property tapAlways + * @type {Boolean} + * @default true + */ + tapAlways: true, - /** - * Load a mixin into the network object - * - * @param {Object} sourceVariable | this object has to contain functions. - * @private - */ - exports._loadMixin = function (sourceVariable) { - for (var mixinFunction in sourceVariable) { - if (sourceVariable.hasOwnProperty(mixinFunction)) { - this[mixinFunction] = sourceVariable[mixinFunction]; - } - } - }; + /** + * max distance between two taps + * @property doubleTapDistance + * @type {Number} + * @default 20 + */ + doubleTapDistance: 20, + /** + * max time between two taps + * @property doubleTapInterval + * @type {Number} + * @default 300 + */ + doubleTapInterval: 300 + } + }; + })('tap'); /** - * removes a mixin from the network object. + * @module gestures + */ + /** + * when a touch is being touched at the page * - * @param {Object} sourceVariable | this object has to contain functions. - * @private + * @class Touch + * @static */ - exports._clearMixin = function (sourceVariable) { - for (var mixinFunction in sourceVariable) { - if (sourceVariable.hasOwnProperty(mixinFunction)) { - this[mixinFunction] = undefined; + /** + * @event touch + * @param {Object} ev + */ + Hammer.gestures.Touch = { + name: 'touch', + index: -Infinity, + defaults: { + /** + * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, + * but it improves gestures like transforming and dragging. + * be careful with using this, it can be very annoying for users to be stuck on the page + * @property preventDefault + * @type {Boolean} + * @default false + */ + preventDefault: false, + + /** + * disable mouse events, so only touch (or pen!) input triggers events + * @property preventMouse + * @type {Boolean} + * @default false + */ + preventMouse: false + }, + handler: function touchGesture(ev, inst) { + if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { + ev.stopDetect(); + return; + } + + if(inst.options.preventDefault) { + ev.preventDefault(); + } + + if(ev.eventType == EVENT_TOUCH) { + inst.trigger('touch', ev); + } } - } }; - /** - * Mixin the physics system and initialize the parameters required. - * - * @private + * @module gestures */ - exports._loadPhysicsSystem = function () { - this._loadMixin(PhysicsMixin); - this._loadSelectedForceSolver(); - if (this.constants.configurePhysics == true) { - this._loadPhysicsConfiguration(); - } - }; - - /** - * Mixin the cluster system and initialize the parameters required. + * User want to scale or rotate with 2 fingers + * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the + * `preventDefault` option. * - * @private + * @class Transform + * @static */ - exports._loadClusterSystem = function () { - this.clusterSession = 0; - this.hubThreshold = 5; - this._loadMixin(ClusterMixin); - }; - - /** - * Mixin the sector system and initialize the parameters required - * - * @private + * @event transform + * @param {Object} ev + */ + /** + * @event transformstart + * @param {Object} ev + */ + /** + * @event transformend + * @param {Object} ev + */ + /** + * @event pinchin + * @param {Object} ev + */ + /** + * @event pinchout + * @param {Object} ev + */ + /** + * @event rotate + * @param {Object} ev */ - exports._loadSectorSystem = function () { - this.sectors = {}; - this.activeSector = ["default"]; - this.sectors["active"] = {}; - this.sectors["active"]["default"] = {"nodes": {}, - "edges": {}, - "nodeIndices": [], - "formationScale": 1.0, - "drawingNode": undefined }; - this.sectors["frozen"] = {}; - this.sectors["support"] = {"nodes": {}, - "edges": {}, - "nodeIndices": [], - "formationScale": 1.0, - "drawingNode": undefined }; - - this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields - - this._loadMixin(SectorsMixin); - }; - /** - * Mixin the selection system and initialize the parameters required - * - * @private + * @param {String} name */ - exports._loadSelectionSystem = function () { - this.selectionObj = {nodes: {}, edges: {}}; + (function(name) { + var triggered = false; - this._loadMixin(SelectionMixin); - }; + function transformGesture(ev, inst) { + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; + case EVENT_MOVE: + // at least multitouch + if(ev.touches.length < 2) { + return; + } - /** - * Mixin the navigationUI (User Interface) system and initialize the parameters required - * - * @private - */ - exports._loadManipulationSystem = function () { - // reset global variables -- these are used by the selection of nodes and edges. - this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false; + var scaleThreshold = Math.abs(1 - ev.scale); + var rotationThreshold = Math.abs(ev.rotation); - if (this.constants.dataManipulation.enabled == true) { - // load the manipulator HTML elements. All styling done in css. - if (this.manipulationDiv === undefined) { - this.manipulationDiv = document.createElement('div'); - this.manipulationDiv.className = 'network-manipulationDiv'; - if (this.editMode == true) { - this.manipulationDiv.style.display = "block"; - } - else { - this.manipulationDiv.style.display = "none"; - } - this.frame.appendChild(this.manipulationDiv); - } + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(scaleThreshold < inst.options.transformMinScale && + rotationThreshold < inst.options.transformMinRotation) { + return; + } - if (this.editModeDiv === undefined) { - this.editModeDiv = document.createElement('div'); - this.editModeDiv.className = 'network-manipulation-editMode'; - if (this.editMode == true) { - this.editModeDiv.style.display = "none"; - } - else { - this.editModeDiv.style.display = "block"; - } - this.frame.appendChild(this.editModeDiv); - } + // we are transforming! + Detection.current.name = name; - if (this.closeDiv === undefined) { - this.closeDiv = document.createElement('div'); - this.closeDiv.className = 'network-manipulation-closeDiv'; - this.closeDiv.style.display = this.manipulationDiv.style.display; - this.frame.appendChild(this.closeDiv); - } + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } - // load the manipulation functions - this._loadMixin(ManipulationMixin); + inst.trigger(name, ev); // basic transform event - // create the manipulator toolbar - this._createManipulatorBar(); - } - else { - if (this.manipulationDiv !== undefined) { - // removes all the bindings and overloads - this._createManipulatorBar(); + // trigger rotate event + if(rotationThreshold > inst.options.transformMinRotation) { + inst.trigger('rotate', ev); + } - // remove the manipulation divs - this.frame.removeChild(this.manipulationDiv); - this.frame.removeChild(this.editModeDiv); - this.frame.removeChild(this.closeDiv); + // trigger pinch event + if(scaleThreshold > inst.options.transformMinScale) { + inst.trigger('pinch', ev); + inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); + } + break; - this.manipulationDiv = undefined; - this.editModeDiv = undefined; - this.closeDiv = undefined; - // remove the mixin functions - this._clearMixin(ManipulationMixin); + case EVENT_RELEASE: + if(triggered && ev.changedLength < 2) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; + } } - } - }; + Hammer.gestures.Transform = { + name: name, + index: 45, + defaults: { + /** + * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 + * @property transformMinScale + * @type {Number} + * @default 0.01 + */ + transformMinScale: 0.01, - /** - * Mixin the navigation (User Interface) system and initialize the parameters required - * - * @private - */ - exports._loadNavigationControls = function () { - this._loadMixin(NavigationMixin); - // the clean function removes the button divs, this is done to remove the bindings. - this._cleanNavigation(); - if (this.constants.navigation.enabled == true) { - this._loadNavigationElements(); - } - }; + /** + * rotation in degrees + * @property transformMinRotation + * @type {Number} + * @default 1 + */ + transformMinRotation: 1 + }, + handler: transformGesture + }; + })('transform'); /** - * Mixin the hierarchical layout system. - * - * @private + * @module hammer */ - exports._loadHierarchySystem = function () { - this._loadMixin(HierarchicalLayoutMixin); - }; + // AMD export + if(true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return Hammer; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + // commonjs export + } else if(typeof module !== 'undefined' && module.exports) { + module.exports = Hammer; + // browser export + } else { + window.Hammer = Hammer; + } + + })(window); /***/ }, /* 60 */ /***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); - var RepulsionMixin = __webpack_require__(61); - var HierarchialRepulsionMixin = __webpack_require__(62); - var BarnesHutMixin = __webpack_require__(63); - /** - * Toggling barnes Hut calculation on and off. + * Creation of the ClusterMixin var. * - * @private + * This contains all the functions the Network object can use to employ clustering */ - exports._toggleBarnesHut = function () { - this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; - this._loadSelectedForceSolver(); - this.moving = true; - this.start(); - }; - /** - * This loads the node force solver based on the barnes hut or repulsion algorithm - * - * @private - */ - exports._loadSelectedForceSolver = function () { - // this overloads the this._calculateNodeForces - if (this.constants.physics.barnesHut.enabled == true) { - this._clearMixin(RepulsionMixin); - this._clearMixin(HierarchialRepulsionMixin); - - this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; - this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; - this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; - this.constants.physics.damping = this.constants.physics.barnesHut.damping; - - this._loadMixin(BarnesHutMixin); - } - else if (this.constants.physics.hierarchicalRepulsion.enabled == true) { - this._clearMixin(BarnesHutMixin); - this._clearMixin(RepulsionMixin); - - this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; - this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; - this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; - - this._loadMixin(HierarchialRepulsionMixin); - } - else { - this._clearMixin(BarnesHutMixin); - this._clearMixin(HierarchialRepulsionMixin); - this.barnesHutTree = undefined; + * This is only called in the constructor of the network object + * + */ + exports.startWithClustering = function() { + // cluster if the data set is big + this.clusterToFit(this.constants.clustering.initialMaxNodes, true); - this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.repulsion.springLength; - this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; - this.constants.physics.damping = this.constants.physics.repulsion.damping; + // updates the lables after clustering + this.updateLabels(); - this._loadMixin(RepulsionMixin); - } + // this is called here because if clusterin is disabled, the start and stabilize are called in + // the setData function. + if (this.stabilize) { + this._stabilize(); + } + this.start(); }; /** - * Before calculating the forces, we check if we need to cluster to keep up performance and we check - * if there is more than one node. If it is just one node, we dont calculate anything. + * This function clusters until the initialMaxNodes has been reached * - * @private - */ - exports._initializeForceCalculation = function () { - // stop calculation if there is only one node - if (this.nodeIndices.length == 1) { - this.nodes[this.nodeIndices[0]]._setForce(0, 0); - } - else { - // if there are too many nodes on screen, we cluster without repositioning - if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { - this.clusterToFit(this.constants.clustering.reduceToNodes, false); - } - - // we now start the force calculation - this._calculateForces(); - } - }; - - - /** - * Calculate the external forces acting on the nodes - * Forces are caused by: edges, repulsing forces between nodes, gravity - * @private + * @param {Number} maxNumberOfNodes + * @param {Boolean} reposition */ - exports._calculateForces = function () { - // Gravity is required to keep separated groups from floating off - // the forces are reset to zero in this loop by using _setForce instead - // of _addForce + exports.clusterToFit = function(maxNumberOfNodes, reposition) { + var numberOfNodes = this.nodeIndices.length; - this._calculateGravitationalForces(); - this._calculateNodeForces(); + var maxLevels = 50; + var level = 0; - if (this.constants.physics.springConstant > 0) { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._calculateSpringForcesWithSupport(); + // we first cluster the hubs, then we pull in the outliers, repeat + while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { + if (level % 3 == 0) { + this.forceAggregateHubs(true); + this.normalizeClusterLevels(); } else { - if (this.constants.physics.hierarchicalRepulsion.enabled == true) { - this._calculateHierarchicalSpringForces(); - } - else { - this._calculateSpringForces(); - } + this.increaseClusterLevel(); // this also includes a cluster normalization } + + numberOfNodes = this.nodeIndices.length; + level += 1; } - }; + // after the clustering we reposition the nodes to reduce the initial chaos + if (level > 0 && reposition == true) { + this.repositionNodes(); + } + this._updateCalculationNodes(); + }; /** - * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also - * handled in the calculateForces function. We then use a quadratic curve with the center node as control. - * This function joins the datanodes and invisible (called support) nodes into one object. - * We do this so we do not contaminate this.nodes with the support nodes. + * This function can be called to open up a specific cluster. It is only called by + * It will unpack the cluster back one level. * - * @private + * @param node | Node object: cluster to open. */ - exports._updateCalculationNodes = function () { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this.calculationNodes = {}; - this.calculationNodeIndices = []; + exports.openCluster = function(node) { + var isMovingBeforeClustering = this.moving; + if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && + !(this._sector() == "default" && this.nodeIndices.length == 1)) { + // this loads a new sector, loads the nodes and edges and nodeIndices of it. + this._addSector(node); + var level = 0; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.calculationNodes[nodeId] = this.nodes[nodeId]; - } - } - var supportNodes = this.sectors['support']['nodes']; - for (var supportNodeId in supportNodes) { - if (supportNodes.hasOwnProperty(supportNodeId)) { - if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { - this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; - } - else { - supportNodes[supportNodeId]._setForce(0, 0); - } - } + // we decluster until we reach a decent number of nodes + while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { + this.decreaseClusterLevel(); + level += 1; } - for (var idx in this.calculationNodes) { - if (this.calculationNodes.hasOwnProperty(idx)) { - this.calculationNodeIndices.push(idx); - } - } } else { - this.calculationNodes = this.nodes; - this.calculationNodeIndices = this.nodeIndices; - } - }; - - - /** - * this function applies the central gravity effect to keep groups from floating off - * - * @private - */ - exports._calculateGravitationalForces = function () { - var dx, dy, distance, node, i; - var nodes = this.calculationNodes; - var gravity = this.constants.physics.centralGravity; - var gravityForce = 0; + this._expandClusterNode(node,false,true); - for (i = 0; i < this.calculationNodeIndices.length; i++) { - node = nodes[this.calculationNodeIndices[i]]; - node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. - // gravity does not apply when we are in a pocket sector - if (this._sector() == "default" && gravity != 0) { - dx = -node.x; - dy = -node.y; - distance = Math.sqrt(dx * dx + dy * dy); + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this._updateCalculationNodes(); + this.updateLabels(); + } - gravityForce = (distance == 0) ? 0 : (gravity / distance); - node.fx = dx * gravityForce; - node.fy = dy * gravityForce; - } - else { - node.fx = 0; - node.fy = 0; - } + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); } }; - - /** - * this function calculates the effects of the springs in the case of unsmooth curves. - * - * @private + * This calls the updateClustes with default arguments */ - exports._calculateSpringForces = function () { - var edgeLength, edge, edgeId; - var dx, dy, fx, fy, springForce, distance; - var edges = this.edges; - - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - edgeLength = edge.physics.springLength; - // this implies that the edges between big clusters are longer - edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; - - dx = (edge.from.x - edge.to.x); - dy = (edge.from.y - edge.to.y); - distance = Math.sqrt(dx * dx + dy * dy); - - if (distance == 0) { - distance = 0.01; - } - - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - - fx = dx * springForce; - fy = dy * springForce; - - edge.from.fx += fx; - edge.from.fy += fy; - edge.to.fx -= fx; - edge.to.fy -= fy; - } - } - } + exports.updateClustersDefault = function() { + if (this.constants.clustering.enabled == true) { + this.updateClusters(0,false,false); } }; - - /** - * This function calculates the springforces on the nodes, accounting for the support nodes. - * - * @private + * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will + * be clustered with their connected node. This can be repeated as many times as needed. + * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. */ - exports._calculateSpringForcesWithSupport = function () { - var edgeLength, edge, edgeId, combinedClusterSize; - var edges = this.edges; - - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - if (edge.via != null) { - var node1 = edge.to; - var node2 = edge.via; - var node3 = edge.from; - - edgeLength = edge.physics.springLength; - - combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; - - // this implies that the edges between big clusters are longer - edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; - this._calculateSpringForce(node1, node2, 0.5 * edgeLength); - this._calculateSpringForce(node2, node3, 0.5 * edgeLength); - } - } - } - } - } + exports.increaseClusterLevel = function() { + this.updateClusters(-1,false,true); }; /** - * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. - * - * @param node1 - * @param node2 - * @param edgeLength - * @private + * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will + * be unpacked if they are a cluster. This can be repeated as many times as needed. + * This can be called externally (by a key-bind for instance) to look into clusters without zooming. */ - exports._calculateSpringForce = function (node1, node2, edgeLength) { - var dx, dy, fx, fy, springForce, distance; - - dx = (node1.x - node2.x); - dy = (node1.y - node2.y); - distance = Math.sqrt(dx * dx + dy * dy); - - if (distance == 0) { - distance = 0.01; - } - - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - - fx = dx * springForce; - fy = dy * springForce; - - node1.fx += fx; - node1.fy += fy; - node2.fx -= fx; - node2.fy -= fy; + exports.decreaseClusterLevel = function() { + this.updateClusters(1,false,true); }; /** - * Load the HTML for the physics config and bind it - * @private + * This is the main clustering function. It clusters and declusters on zoom or forced + * This function clusters on zoom, it can be called with a predefined zoom direction + * If out, check if we can form clusters, if in, check if we can open clusters. + * This function is only called from _zoom() + * + * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn + * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} doNotStart | if true do not call start + * */ - exports._loadPhysicsConfiguration = function () { - if (this.physicsConfiguration === undefined) { - this.backupConstants = {}; - util.deepExtend(this.backupConstants,this.constants); - - var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; - this.physicsConfiguration = document.createElement('div'); - this.physicsConfiguration.className = "PhysicsConfiguration"; - this.physicsConfiguration.innerHTML = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Options:
' - this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); - this.optionsDiv = document.createElement("div"); - this.optionsDiv.style.fontSize = "14px"; - this.optionsDiv.style.fontFamily = "verdana"; - this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); - - var rangeElement; - rangeElement = document.getElementById('graph_BH_gc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); - rangeElement = document.getElementById('graph_BH_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_BH_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_BH_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_BH_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); - - rangeElement = document.getElementById('graph_R_nd'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); - rangeElement = document.getElementById('graph_R_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_R_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_R_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_R_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); + exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; - rangeElement = document.getElementById('graph_H_nd'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); - rangeElement = document.getElementById('graph_H_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_H_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_H_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_H_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); - rangeElement = document.getElementById('graph_H_direction'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); - rangeElement = document.getElementById('graph_H_levsep'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); - rangeElement = document.getElementById('graph_H_nspac'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); + // on zoom out collapse the sector if the scale is at the level the sector was made + if (this.previousScale > this.scale && zoomDirection == 0) { + this._collapseSector(); + } - var radioButton1 = document.getElementById("graph_physicsMethod1"); - var radioButton2 = document.getElementById("graph_physicsMethod2"); - var radioButton3 = document.getElementById("graph_physicsMethod3"); - radioButton2.checked = true; - if (this.constants.physics.barnesHut.enabled) { - radioButton1.checked = true; + // check if we zoom in or out + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + // forming clusters when forced pulls outliers in. When not forced, the edge length of the + // outer nodes determines if it is being clustered + this._formClusters(force); + } + else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in + if (force == true) { + // _openClusters checks for each node if the formationScale of the cluster is smaller than + // the current scale and if so, declusters. When forced, all clusters are reduced by one step + this._openClusters(recursive,force); } - if (this.constants.hierarchicalLayout.enabled) { - radioButton3.checked = true; + else { + // if a cluster takes up a set percentage of the active window + this._openClustersBySize(); } + } + this._updateNodeIndexList(); + + // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs + if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { + this._aggregateHubs(force); + this._updateNodeIndexList(); + } + + // we now reduce chains. + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + this.handleChains(); + this._updateNodeIndexList(); + } - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - var graph_repositionNodes = document.getElementById("graph_repositionNodes"); - var graph_generateOptions = document.getElementById("graph_generateOptions"); + this.previousScale = this.scale; - graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); - graph_repositionNodes.onclick = graphRepositionNodes.bind(this); - graph_generateOptions.onclick = graphGenerateOptions.bind(this); - if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { - graph_toggleSmooth.style.background = "#A4FF56"; - } - else { - graph_toggleSmooth.style.background = "#FF8532"; + // rest of the update the index list, dynamic edges and labels + this._updateDynamicEdges(); + this.updateLabels(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place + this.clusterSession += 1; + // if clusters have been made, we normalize the cluster level + this.normalizeClusterLevels(); + } + + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); } + } + this._updateCalculationNodes(); + }; - switchConfigurations.apply(this); + /** + * This function handles the chains. It is called on every updateClusters(). + */ + exports.handleChains = function() { + // after clustering we check how many chains there are + var chainPercentage = this._getChainFraction(); + if (chainPercentage > this.constants.clustering.chainThreshold) { + this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) - radioButton1.onchange = switchConfigurations.bind(this); - radioButton2.onchange = switchConfigurations.bind(this); - radioButton3.onchange = switchConfigurations.bind(this); } }; /** - * This overwrites the this.constants. + * this functions starts clustering by hubs + * The minimum hub threshold is set globally * - * @param constantsVariableName - * @param value * @private */ - exports._overWriteGraphConstants = function (constantsVariableName, value) { - var nameArray = constantsVariableName.split("_"); - if (nameArray.length == 1) { - this.constants[nameArray[0]] = value; - } - else if (nameArray.length == 2) { - this.constants[nameArray[0]][nameArray[1]] = value; - } - else if (nameArray.length == 3) { - this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; - } + exports._aggregateHubs = function(force) { + this._getHubSize(); + this._formClustersByHub(force,false); }; /** - * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. + * This function is fired by keypress. It forces hubs to form. + * */ - function graphToggleSmoothCurves () { - this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} + exports.forceAggregateHubs = function(doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; - this._configureSmoothCurves(false); - } + this._aggregateHubs(true); - /** - * this function is used to scramble the nodes - * - */ - function graphRepositionNodes () { - for (var nodeId in this.calculationNodes) { - if (this.calculationNodes.hasOwnProperty(nodeId)) { - this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; - this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; - } - } - if (this.constants.hierarchicalLayout.enabled == true) { - this._setupHierarchicalLayout(); - showValueOfRange.call(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); - showValueOfRange.call(this, 'graph_H_cg', 1, "physics_centralGravity"); - showValueOfRange.call(this, 'graph_H_sc', 1, "physics_springConstant"); - showValueOfRange.call(this, 'graph_H_sl', 1, "physics_springLength"); - showValueOfRange.call(this, 'graph_H_damp', 1, "physics_damping"); + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this.updateLabels(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; } - else { - this.repositionNodes(); + + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } } - this.moving = true; - this.start(); - } + }; /** - * this is used to generate an options file from the playing with physics system. + * If a cluster takes up more than a set percentage of the screen, open the cluster + * + * @private */ - function graphGenerateOptions () { - var options = "No options are required, default values used."; - var optionsSpecific = []; - var radioButton1 = document.getElementById("graph_physicsMethod1"); - var radioButton2 = document.getElementById("graph_physicsMethod2"); - if (radioButton1.checked == true) { - if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options = "var options = {"; - options += "physics: {barnesHut: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " - } - } - options += '}}' - } - if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { - if (optionsSpecific.length == 0) {options = "var options = {";} - else {options += ", "} - options += "smoothCurves: " + this.constants.smoothCurves.enabled; - } - if (options != "No options are required, default values used.") { - options += '};' - } - } - else if (radioButton2.checked == true) { - options = "var options = {"; - options += "physics: {barnesHut: {enabled: false}"; - if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options += ", repulsion: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " - } - } - options += '}}' - } - if (optionsSpecific.length == 0) {options += "}"} - if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { - options += ", smoothCurves: " + this.constants.smoothCurves; - } - options += '};' - } - else { - options = "var options = {"; - if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options += "physics: {hierarchicalRepulsion: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", "; - } - } - options += '}},'; - } - options += 'hierarchicalLayout: {'; - optionsSpecific = []; - if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);} - if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);} - if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);} - if (optionsSpecific.length != 0) { - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " + exports._openClustersBySize = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.inView() == true) { + if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + this.openCluster(node); } } - options += '}' - } - else { - options += "enabled:true}"; } - options += '};' } + }; - this.optionsDiv.innerHTML = options; - } - /** - * this is used to switch between barnesHut, repulsion and hierarchical. + * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it + * has to be opened based on the current zoom level. * + * @private */ - function switchConfigurations () { - var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; - var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; - var tableId = "graph_" + radioButton + "_table"; - var table = document.getElementById(tableId); - table.style.display = "block"; - for (var i = 0; i < ids.length; i++) { - if (ids[i] != tableId) { - table = document.getElementById(ids[i]); - table.style.display = "none"; - } - } - this._restoreNodes(); - if (radioButton == "R") { - this.constants.hierarchicalLayout.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = false; - this.constants.physics.barnesHut.enabled = false; - } - else if (radioButton == "H") { - if (this.constants.hierarchicalLayout.enabled == false) { - this.constants.hierarchicalLayout.enabled = true; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this.constants.physics.barnesHut.enabled = false; - this.constants.smoothCurves.enabled = false; - this._setupHierarchicalLayout(); - } - } - else { - this.constants.hierarchicalLayout.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = false; - this.constants.physics.barnesHut.enabled = true; + exports._openClusters = function(recursive,force) { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + this._expandClusterNode(node,recursive,force); + this._updateCalculationNodes(); } - this._loadSelectedForceSolver(); - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} - this.moving = true; - this.start(); - } - + }; /** - * this generates the ranges depending on the iniital values. + * This function checks if a node has to be opened. This is done by checking the zoom level. + * If the node contains child nodes, this function is recursively called on the child nodes as well. + * This recursive behaviour is optional and can be set by the recursive argument. * - * @param id - * @param map - * @param constantsVariableName + * @param {Node} parentNode | to check for cluster and expand + * @param {Boolean} recursive | enabled or disable recursive calling + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released + * @private */ - function showValueOfRange (id,map,constantsVariableName) { - var valueId = id + "_value"; - var rangeValue = document.getElementById(id).value; + exports._expandClusterNode = function(parentNode, recursive, force, openAll) { + // first check if node is a cluster + if (parentNode.clusterSize > 1) { + // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 + if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { + openAll = true; + } + recursive = openAll ? true : recursive; - if (Array.isArray(map)) { - document.getElementById(valueId).value = map[parseInt(rangeValue)]; - this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]); - } - else { - document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue); - this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue)); - } + // if the last child has been added on a smaller scale than current scale decluster + if (parentNode.formationScale < this.scale || force == true) { + // we will check if any of the contained child nodes should be removed from the cluster + for (var containedNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { + var childNode = parentNode.containedNodes[containedNodeId]; - if (constantsVariableName == "hierarchicalLayout_direction" || - constantsVariableName == "hierarchicalLayout_levelSeparation" || - constantsVariableName == "hierarchicalLayout_nodeSpacing") { - this._setupHierarchicalLayout(); + // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that + // the largest cluster is the one that comes from outside + if (force == true) { + if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] + || openAll) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + else { + if (this._nodeInActiveArea(parentNode)) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + } + } + } } - this.moving = true; - this.start(); - } - - -/***/ }, -/* 61 */ -/***/ function(module, exports, __webpack_require__) { + }; /** - * Calculate the forces the nodes apply on each other based on a repulsion field. - * This field is linearly approximated. + * ONLY CALLED FROM _expandClusterNode + * + * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove + * the child node from the parent contained_node object and put it back into the global nodes object. + * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. * + * @param {Node} parentNode | the parent node + * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node + * @param {Boolean} recursive | This will also check if the child needs to be expanded. + * With force and recursive both true, the entire cluster is unpacked + * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent + * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released * @private */ - exports._calculateNodeForces = function () { - var dx, dy, angle, distance, fx, fy, combinedClusterSize, - repulsingForce, node1, node2, i, j; + exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { + var childNode = parentNode.containedNodes[containedNodeId]; - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; + // if child node has been added on smaller scale than current, kick out + if (childNode.formationScale < this.scale || force == true) { + // unselect all selected items + this._unselectAll(); - // approximation constants - var a_base = -2 / 3; - var b = 4 / 3; + // put the child node back in the global nodes object + this.nodes[containedNodeId] = childNode; - // repulsing forces between nodes - var nodeDistance = this.constants.physics.repulsion.nodeDistance; - var minimumDistance = nodeDistance; + // release the contained edges from this childNode back into the global edges + this._releaseContainedEdges(parentNode,childNode); - // we loop from i over all but the last entree in the array - // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length - 1; i++) { - node1 = nodes[nodeIndices[i]]; - for (j = i + 1; j < nodeIndices.length; j++) { - node2 = nodes[nodeIndices[j]]; - combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; + // reconnect rerouted edges to the childNode + this._connectEdgeBackToChild(parentNode,childNode); - dx = node2.x - node1.x; - dy = node2.y - node1.y; - distance = Math.sqrt(dx * dx + dy * dy); + // validate all edges in dynamicEdges + this._validateEdges(parentNode); - minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); - var a = a_base / minimumDistance; - if (distance < 2 * minimumDistance) { - if (distance < 0.5 * minimumDistance) { - repulsingForce = 1.0; - } - else { - repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) - } + // undo the changes from the clustering operation on the parent node + parentNode.options.mass -= childNode.options.mass; + parentNode.clusterSize -= childNode.clusterSize; + parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*(parentNode.clusterSize-1)); + parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; - // amplify the repulsion for clusters. - repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; - repulsingForce = repulsingForce / distance; + // place the child node near the parent, not at the exact same location to avoid chaos in the system + childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); + childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); - fx = dx * repulsingForce; - fy = dy * repulsingForce; + // remove node from the list + delete parentNode.containedNodes[containedNodeId]; - node1.fx -= fx; - node1.fy -= fy; - node2.fx += fx; - node2.fy += fy; + // check if there are other childs with this clusterSession in the parent. + var othersPresent = false; + for (var childNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { + if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { + othersPresent = true; + break; + } } } + // if there are no others, remove the cluster session from the list + if (othersPresent == false) { + parentNode.clusterSessions.pop(); + } + + this._repositionBezierNodes(childNode); + // this._repositionBezierNodes(parentNode); + + // remove the clusterSession from the child node + childNode.clusterSession = 0; + + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); + + // restart the simulation to reorganise all nodes + this.moving = true; } - }; + // check if a further expansion step is possible if recursivity is enabled + if (recursive == true) { + this._expandClusterNode(childNode,recursive,force,openAll); + } + }; -/***/ }, -/* 62 */ -/***/ function(module, exports, __webpack_require__) { /** - * Calculate the forces the nodes apply on eachother based on a repulsion field. - * This field is linearly approximated. + * position the bezier nodes at the center of the edges * + * @param node * @private */ - exports._calculateNodeForces = function () { - var dx, dy, distance, fx, fy, - repulsingForce, node1, node2, i, j; - - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; - - // repulsing forces between nodes - var nodeDistance = this.constants.physics.hierarchicalRepulsion.nodeDistance; - - // we loop from i over all but the last entree in the array - // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length - 1; i++) { - node1 = nodes[nodeIndices[i]]; - for (j = i + 1; j < nodeIndices.length; j++) { - node2 = nodes[nodeIndices[j]]; - - // nodes only affect nodes on their level - if (node1.level == node2.level) { - - dx = node2.x - node1.x; - dy = node2.y - node1.y; - distance = Math.sqrt(dx * dx + dy * dy); - + exports._repositionBezierNodes = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + node.dynamicEdges[i].positionBezierNode(); + } + }; - var steepness = 0.05; - if (distance < nodeDistance) { - repulsingForce = -Math.pow(steepness*distance,2) + Math.pow(steepness*nodeDistance,2); - } - else { - repulsingForce = 0; - } - // normalize force with - if (distance == 0) { - distance = 0.01; - } - else { - repulsingForce = repulsingForce / distance; - } - fx = dx * repulsingForce; - fy = dy * repulsingForce; - node1.fx -= fx; - node1.fy -= fy; - node2.fx += fx; - node2.fy += fy; - } - } + /** + * This function checks if any nodes at the end of their trees have edges below a threshold length + * This function is called only from updateClusters() + * forceLevelCollapse ignores the length of the edge and collapses one level + * This means that a node with only one edge will be clustered with its connected node + * + * @private + * @param {Boolean} force + */ + exports._formClusters = function(force) { + if (force == false) { + this._formClustersByZoom(); + } + else { + this._forceClustersByZoom(); } }; /** - * this function calculates the effects of the springs in the case of unsmooth curves. + * This function handles the clustering by zooming out, this is based on a minimum edge distance * * @private */ - exports._calculateHierarchicalSpringForces = function () { - var edgeLength, edge, edgeId; - var dx, dy, fx, fy, springForce, distance; - var edges = this.edges; - - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; - - - for (var i = 0; i < nodeIndices.length; i++) { - var node1 = nodes[nodeIndices[i]]; - node1.springFx = 0; - node1.springFy = 0; - } - + exports._formClustersByZoom = function() { + var dx,dy,length, + minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; + // check if any edges are shorter than minLength and start the clustering + // the clustering favours the node with the larger mass + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - edgeLength = edge.physics.springLength; - // this implies that the edges between big clusters are longer - edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; - - dx = (edge.from.x - edge.to.x); - dy = (edge.from.y - edge.to.y); - distance = Math.sqrt(dx * dx + dy * dy); + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); - if (distance == 0) { - distance = 0.01; - } - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + if (length < minLength) { + // first check which node is larger + var parentNode = edge.from; + var childNode = edge.to; + if (edge.to.options.mass > edge.from.options.mass) { + parentNode = edge.to; + childNode = edge.from; + } - fx = dx * springForce; - fy = dy * springForce; + if (childNode.dynamicEdgesLength == 1) { + this._addToCluster(parentNode,childNode,false); + } + else if (parentNode.dynamicEdgesLength == 1) { + this._addToCluster(childNode,parentNode,false); + } + } + } + } + } + } + }; + /** + * This function forces the network to cluster all nodes with only one connecting edge to their + * connected node. + * + * @private + */ + exports._forceClustersByZoom = function() { + for (var nodeId in this.nodes) { + // another node could have absorbed this child. + if (this.nodes.hasOwnProperty(nodeId)) { + var childNode = this.nodes[nodeId]; + // the edges can be swallowed by another decrease + if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { + var edge = childNode.dynamicEdges[0]; + var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; - if (edge.to.level != edge.from.level) { - edge.to.springFx -= fx; - edge.to.springFy -= fy; - edge.from.springFx += fx; - edge.from.springFy += fy; + // group to the largest node + if (childNode.id != parentNode.id) { + if (parentNode.options.mass > childNode.options.mass) { + this._addToCluster(parentNode,childNode,true); } else { - var factor = 0.5; - edge.to.fx -= factor*fx; - edge.to.fy -= factor*fy; - edge.from.fx += factor*fx; - edge.from.fy += factor*fy; + this._addToCluster(childNode,parentNode,true); } } } } } + }; - // normalize spring forces - var springForce = 1; - var springFx, springFy; - for (i = 0; i < nodeIndices.length; i++) { - var node = nodes[nodeIndices[i]]; - springFx = Math.min(springForce,Math.max(-springForce,node.springFx)); - springFy = Math.min(springForce,Math.max(-springForce,node.springFy)); - node.fx += springFx; - node.fy += springFy; - } + /** + * To keep the nodes of roughly equal size we normalize the cluster levels. + * This function clusters a node to its smallest connected neighbour. + * + * @param node + * @private + */ + exports._clusterToSmallestNeighbour = function(node) { + var smallestNeighbour = -1; + var smallestNeighbourNode = null; + for (var i = 0; i < node.dynamicEdges.length; i++) { + if (node.dynamicEdges[i] !== undefined) { + var neighbour = null; + if (node.dynamicEdges[i].fromId != node.id) { + neighbour = node.dynamicEdges[i].from; + } + else if (node.dynamicEdges[i].toId != node.id) { + neighbour = node.dynamicEdges[i].to; + } - // retain energy balance - var totalFx = 0; - var totalFy = 0; - for (i = 0; i < nodeIndices.length; i++) { - var node = nodes[nodeIndices[i]]; - totalFx += node.fx; - totalFy += node.fy; - } - var correctionFx = totalFx / nodeIndices.length; - var correctionFy = totalFy / nodeIndices.length; - for (i = 0; i < nodeIndices.length; i++) { - var node = nodes[nodeIndices[i]]; - node.fx -= correctionFx; - node.fy -= correctionFy; + if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { + smallestNeighbour = neighbour.clusterSessions.length; + smallestNeighbourNode = neighbour; + } + } } + if (neighbour != null && this.nodes[neighbour.id] !== undefined) { + this._addToCluster(neighbour, node, true); + } }; -/***/ }, -/* 63 */ -/***/ function(module, exports, __webpack_require__) { /** - * This function calculates the forces the nodes apply on eachother based on a gravitational model. - * The Barnes Hut method is used to speed up this N-body simulation. + * This function forms clusters from hubs, it loops over all nodes * + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges * @private */ - exports._calculateNodeForces = function() { - if (this.constants.physics.barnesHut.gravitationalConstant != 0) { - var node; - var nodes = this.calculationNodes; - var nodeIndices = this.calculationNodeIndices; - var nodeCount = nodeIndices.length; - - this._formBarnesHutTree(nodes,nodeIndices); - - var barnesHutTree = this.barnesHutTree; - - // place the nodes one by one recursively - for (var i = 0; i < nodeCount; i++) { - node = nodes[nodeIndices[i]]; - if (node.options.mass > 0) { - // starting with root is irrelevant, it never passes the BarnesHut condition - this._getForceContribution(barnesHutTree.root.children.NW,node); - this._getForceContribution(barnesHutTree.root.children.NE,node); - this._getForceContribution(barnesHutTree.root.children.SW,node); - this._getForceContribution(barnesHutTree.root.children.SE,node); - } + exports._formClustersByHub = function(force, onlyEqual) { + // we loop over all nodes in the list + for (var nodeId in this.nodes) { + // we check if it is still available since it can be used by the clustering in this loop + if (this.nodes.hasOwnProperty(nodeId)) { + this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); } } }; - /** - * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass. - * If a region contains a single node, we check if it is not itself, then we apply the force. + * This function forms a cluster from a specific preselected hub node * - * @param parentBranch - * @param node + * @param {Node} hubNode | the node we will cluster as a hub + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @param {Number} [absorptionSizeOffset] | * @private */ - exports._getForceContribution = function(parentBranch,node) { - // we get no force contribution from an empty region - if (parentBranch.childrenCount > 0) { - var dx,dy,distance; + exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { + if (absorptionSizeOffset === undefined) { + absorptionSizeOffset = 0; + } + // we decide if the node is a hub + if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || + (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { + // initialize variables + var dx,dy,length; + var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + var allowCluster = false; - // get the distance from the center of mass to the node. - dx = parentBranch.centerOfMass.x - node.x; - dy = parentBranch.centerOfMass.y - node.y; - distance = Math.sqrt(dx * dx + dy * dy); + // we create a list of edges because the dynamicEdges change over the course of this loop + var edgesIdarray = []; + var amountOfInitialEdges = hubNode.dynamicEdges.length; + for (var j = 0; j < amountOfInitialEdges; j++) { + edgesIdarray.push(hubNode.dynamicEdges[j].id); + } - // BarnesHut condition - // original condition : s/d < theta = passed === d/s > 1/theta = passed - // calcSize = 1/s --> d * 1/s > 1/theta = passed - if (distance * parentBranch.calcSize > this.constants.physics.barnesHut.theta) { - // duplicate code to reduce function calls to speed up program - if (distance == 0) { - distance = 0.1*Math.random(); - dx = distance; + // if the hub clustering is not forces, we check if one of the edges connected + // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold + if (force == false) { + allowCluster = false; + for (j = 0; j < amountOfInitialEdges; j++) { + var edge = this.edges[edgesIdarray[j]]; + if (edge !== undefined) { + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); + + if (length < minLength) { + allowCluster = true; + break; + } + } + } + } } - var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); - var fx = dx * gravityForce; - var fy = dy * gravityForce; - node.fx += fx; - node.fy += fy; } - else { - // Did not pass the condition, go into children if available - if (parentBranch.childrenCount == 4) { - this._getForceContribution(parentBranch.children.NW,node); - this._getForceContribution(parentBranch.children.NE,node); - this._getForceContribution(parentBranch.children.SW,node); - this._getForceContribution(parentBranch.children.SE,node); - } - else { // parentBranch must have only one node, if it was empty we wouldnt be here - if (parentBranch.children.data.id != node.id) { // if it is not self - // duplicate code to reduce function calls to speed up program - if (distance == 0) { - distance = 0.5*Math.random(); - dx = distance; + + // start the clustering if allowed + if ((!force && allowCluster) || force) { + // we loop over all edges INITIALLY connected to this hub + for (j = 0; j < amountOfInitialEdges; j++) { + edge = this.edges[edgesIdarray[j]]; + // the edge can be clustered by this function in a previous loop + if (edge !== undefined) { + var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; + // we do not want hubs to merge with other hubs nor do we want to cluster itself. + if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && + (childNode.id != hubNode.id)) { + this._addToCluster(hubNode,childNode,force); } - var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); - var fx = dx * gravityForce; - var fy = dy * gravityForce; - node.fx += fx; - node.fy += fy; } } } } }; + + /** - * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes. + * This function adds the child node to the parent node, creating a cluster if it is not already. * - * @param nodes - * @param nodeIndices + * @param {Node} parentNode | this is the node that will house the child node + * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node + * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse * @private */ - exports._formBarnesHutTree = function(nodes,nodeIndices) { - var node; - var nodeCount = nodeIndices.length; - - var minX = Number.MAX_VALUE, - minY = Number.MAX_VALUE, - maxX =-Number.MAX_VALUE, - maxY =-Number.MAX_VALUE; + exports._addToCluster = function(parentNode, childNode, force) { + // join child node in the parent node + parentNode.containedNodes[childNode.id] = childNode; - // get the range of the nodes - for (var i = 0; i < nodeCount; i++) { - var x = nodes[nodeIndices[i]].x; - var y = nodes[nodeIndices[i]].y; - if (nodes[nodeIndices[i]].options.mass > 0) { - if (x < minX) { minX = x; } - if (x > maxX) { maxX = x; } - if (y < minY) { minY = y; } - if (y > maxY) { maxY = y; } + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < childNode.dynamicEdges.length; i++) { + var edge = childNode.dynamicEdges[i]; + if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode + this._addToContainedEdges(parentNode,childNode,edge); + } + else { + this._connectEdgeToCluster(parentNode,childNode,edge); } } - // make the range a square - var sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y - if (sizeDiff > 0) {minY -= 0.5 * sizeDiff; maxY += 0.5 * sizeDiff;} // xSize > ySize - else {minX += 0.5 * sizeDiff; maxX -= 0.5 * sizeDiff;} // xSize < ySize + // a contained node has no dynamic edges. + childNode.dynamicEdges = []; + // remove circular edges from clusters + this._containCircularEdgesFromNode(parentNode,childNode); - var minimumTreeSize = 1e-5; - var rootSize = Math.max(minimumTreeSize,Math.abs(maxX - minX)); - var halfRootSize = 0.5 * rootSize; - var centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY); - // construct the barnesHutTree - var barnesHutTree = { - root:{ - centerOfMass: {x:0, y:0}, - mass:0, - range: { - minX: centerX-halfRootSize,maxX:centerX+halfRootSize, - minY: centerY-halfRootSize,maxY:centerY+halfRootSize - }, - size: rootSize, - calcSize: 1 / rootSize, - children: { data:null}, - maxWidth: 0, - level: 0, - childrenCount: 4 - } - }; - this._splitBranch(barnesHutTree.root); + // remove the childNode from the global nodes object + delete this.nodes[childNode.id]; - // place the nodes one by one recursively - for (i = 0; i < nodeCount; i++) { - node = nodes[nodeIndices[i]]; - if (node.options.mass > 0) { - this._placeInTree(barnesHutTree.root,node); - } - } + // update the properties of the child and parent + var massBefore = parentNode.options.mass; + childNode.clusterSession = this.clusterSession; + parentNode.options.mass += childNode.options.mass; + parentNode.clusterSize += childNode.clusterSize; + parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); - // make global - this.barnesHutTree = barnesHutTree - }; + // keep track of the clustersessions so we can open the cluster up as it has been formed. + if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { + parentNode.clusterSessions.push(this.clusterSession); + } + // forced clusters only open from screen size and double tap + if (force == true) { + // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); + parentNode.formationScale = 0; + } + else { + parentNode.formationScale = this.scale; // The latest child has been added on this scale + } - /** - * this updates the mass of a branch. this is increased by adding a node. - * - * @param parentBranch - * @param node - * @private - */ - exports._updateBranchMass = function(parentBranch, node) { - var totalMass = parentBranch.mass + node.options.mass; - var totalMassInv = 1/totalMass; + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); - parentBranch.centerOfMass.x = parentBranch.centerOfMass.x * parentBranch.mass + node.x * node.options.mass; - parentBranch.centerOfMass.x *= totalMassInv; + // set the pop-out scale for the childnode + parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; - parentBranch.centerOfMass.y = parentBranch.centerOfMass.y * parentBranch.mass + node.y * node.options.mass; - parentBranch.centerOfMass.y *= totalMassInv; + // nullify the movement velocity of the child, this is to avoid hectic behaviour + childNode.clearVelocity(); - parentBranch.mass = totalMass; - var biggestSize = Math.max(Math.max(node.height,node.radius),node.width); - parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth; + // the mass has altered, preservation of energy dictates the velocity to be updated + parentNode.updateVelocity(massBefore); + // restart the simulation to reorganise all nodes + this.moving = true; }; /** - * determine in which branch the node will be placed. - * - * @param parentBranch - * @param node - * @param skipMassUpdate + * This function will apply the changes made to the remainingEdges during the formation of the clusters. + * This is a seperate function to allow for level-wise collapsing of the node barnesHutTree. + * It has to be called if a level is collapsed. It is called by _formClusters(). * @private */ - exports._placeInTree = function(parentBranch,node,skipMassUpdate) { - if (skipMassUpdate != true || skipMassUpdate === undefined) { - // update the mass of the branch. - this._updateBranchMass(parentBranch,node); - } + exports._updateDynamicEdges = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + node.dynamicEdgesLength = node.dynamicEdges.length; - if (parentBranch.children.NW.range.maxX > node.x) { // in NW or SW - if (parentBranch.children.NW.range.maxY > node.y) { // in NW - this._placeInRegion(parentBranch,node,"NW"); - } - else { // in SW - this._placeInRegion(parentBranch,node,"SW"); - } - } - else { // in NE or SE - if (parentBranch.children.NW.range.maxY > node.y) { // in NE - this._placeInRegion(parentBranch,node,"NE"); - } - else { // in SE - this._placeInRegion(parentBranch,node,"SE"); + // this corrects for multiple edges pointing at the same other node + var correction = 0; + if (node.dynamicEdgesLength > 1) { + for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { + var edgeToId = node.dynamicEdges[j].toId; + var edgeFromId = node.dynamicEdges[j].fromId; + for (var k = j+1; k < node.dynamicEdgesLength; k++) { + if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || + (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { + correction += 1; + } + } + } } + node.dynamicEdgesLength -= correction; } }; /** - * actually place the node in a region (or branch) + * This adds an edge from the childNode to the contained edges of the parent node * - * @param parentBranch - * @param node - * @param region + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object * @private */ - exports._placeInRegion = function(parentBranch,node,region) { - switch (parentBranch.children[region].childrenCount) { - case 0: // place node here - parentBranch.children[region].children.data = node; - parentBranch.children[region].childrenCount = 1; - this._updateBranchMass(parentBranch.children[region],node); - break; - case 1: // convert into children - // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) - // we move one node a pixel and we do not put it in the tree. - if (parentBranch.children[region].children.data.x == node.x && - parentBranch.children[region].children.data.y == node.y) { - node.x += Math.random(); - node.y += Math.random(); - } - else { - this._splitBranch(parentBranch.children[region]); - this._placeInTree(parentBranch.children[region],node); - } - break; - case 4: // place in branch - this._placeInTree(parentBranch.children[region],node); + exports._addToContainedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { + parentNode.containedEdges[childNode.id] = [] + } + // add this edge to the list + parentNode.containedEdges[childNode.id].push(edge); + + // remove the edge from the global edges object + delete this.edges[edge.id]; + + // remove the edge from the parent object + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + if (parentNode.dynamicEdges[i].id == edge.id) { + parentNode.dynamicEdges.splice(i,1); break; + } + } + }; + + /** + * This function connects an edge that was connected to a child node to the parent node. + * It keeps track of which nodes it has been connected to with the originalId array. + * + * @param {Node} parentNode | Node object + * @param {Node} childNode | Node object + * @param {Edge} edge | Edge object + * @private + */ + exports._connectEdgeToCluster = function(parentNode, childNode, edge) { + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + else { + if (edge.toId == childNode.id) { // edge connected to other node on the "to" side + edge.originalToId.push(childNode.id); + edge.to = parentNode; + edge.toId = parentNode.id; + } + else { // edge connected to other node with the "from" side + + edge.originalFromId.push(childNode.id); + edge.from = parentNode; + edge.fromId = parentNode.id; + } + + this._addToReroutedEdges(parentNode,childNode,edge); } }; /** - * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch - * after the split is complete. + * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain + * these edges inside of the cluster. * - * @param parentBranch + * @param parentNode + * @param childNode * @private */ - exports._splitBranch = function(parentBranch) { - // if the branch is shaded with a node, replace the node in the new subset. - var containedNode = null; - if (parentBranch.childrenCount == 1) { - containedNode = parentBranch.children.data; - parentBranch.mass = 0; parentBranch.centerOfMass.x = 0; parentBranch.centerOfMass.y = 0; - } - parentBranch.childrenCount = 4; - parentBranch.children.data = null; - this._insertRegion(parentBranch,"NW"); - this._insertRegion(parentBranch,"NE"); - this._insertRegion(parentBranch,"SW"); - this._insertRegion(parentBranch,"SE"); - - if (containedNode != null) { - this._placeInTree(parentBranch,containedNode); + exports._containCircularEdgesFromNode = function(parentNode, childNode) { + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } } }; /** - * This function subdivides the region into four new segments. - * Specifically, this inserts a single new segment. - * It fills the children section of the parentBranch + * This adds an edge from the childNode to the rerouted edges of the parent node * - * @param parentBranch - * @param region - * @param parentRange + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object * @private */ - exports._insertRegion = function(parentBranch, region) { - var minX,maxX,minY,maxY; - var childSize = 0.5 * parentBranch.size; - switch (region) { - case "NW": - minX = parentBranch.range.minX; - maxX = parentBranch.range.minX + childSize; - minY = parentBranch.range.minY; - maxY = parentBranch.range.minY + childSize; - break; - case "NE": - minX = parentBranch.range.minX + childSize; - maxX = parentBranch.range.maxX; - minY = parentBranch.range.minY; - maxY = parentBranch.range.minY + childSize; - break; - case "SW": - minX = parentBranch.range.minX; - maxX = parentBranch.range.minX + childSize; - minY = parentBranch.range.minY + childSize; - maxY = parentBranch.range.maxY; - break; - case "SE": - minX = parentBranch.range.minX + childSize; - maxX = parentBranch.range.maxX; - minY = parentBranch.range.minY + childSize; - maxY = parentBranch.range.maxY; - break; + exports._addToReroutedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + // we store the edge in the rerouted edges so we can restore it when the cluster pops open + if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { + parentNode.reroutedEdges[childNode.id] = []; } + parentNode.reroutedEdges[childNode.id].push(edge); + // this edge becomes part of the dynamicEdges of the cluster node + parentNode.dynamicEdges.push(edge); + }; - parentBranch.children[region] = { - centerOfMass:{x:0,y:0}, - mass:0, - range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY}, - size: 0.5 * parentBranch.size, - calcSize: 2 * parentBranch.calcSize, - children: {data:null}, - maxWidth: 0, - level: parentBranch.level+1, - childrenCount: 0 - }; - }; /** - * This function is for debugging purposed, it draws the tree. + * This function connects an edge that was connected to a cluster node back to the child node. * - * @param ctx - * @param color + * @param parentNode | Node object + * @param childNode | Node object * @private */ - exports._drawTree = function(ctx,color) { - if (this.barnesHutTree !== undefined) { + exports._connectEdgeBackToChild = function(parentNode, childNode) { + if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { + for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { + var edge = parentNode.reroutedEdges[childNode.id][i]; + if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { + edge.originalFromId.pop(); + edge.fromId = childNode.id; + edge.from = childNode; + } + else { + edge.originalToId.pop(); + edge.toId = childNode.id; + edge.to = childNode; + } - ctx.lineWidth = 1; + // append this edge to the list of edges connecting to the childnode + childNode.dynamicEdges.push(edge); - this._drawBranch(this.barnesHutTree.root,ctx,color); + // remove the edge from the parent object + for (var j = 0; j < parentNode.dynamicEdges.length; j++) { + if (parentNode.dynamicEdges[j].id == edge.id) { + parentNode.dynamicEdges.splice(j,1); + break; + } + } + } + // remove the entry from the rerouted edges + delete parentNode.reroutedEdges[childNode.id]; } }; /** - * This function is for debugging purposes. It draws the branches recursively. + * When loops are clustered, an edge can be both in the rerouted array and the contained array. + * This function is called last to verify that all edges in dynamicEdges are in fact connected to the + * parentNode * - * @param branch - * @param ctx - * @param color + * @param parentNode | Node object * @private */ - exports._drawBranch = function(branch,ctx,color) { - if (color === undefined) { - color = "#FF0000"; + exports._validateEdges = function(parentNode) { + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { + parentNode.dynamicEdges.splice(i,1); + } } + }; - if (branch.childrenCount == 4) { - this._drawBranch(branch.children.NW,ctx); - this._drawBranch(branch.children.NE,ctx); - this._drawBranch(branch.children.SE,ctx); - this._drawBranch(branch.children.SW,ctx); - } - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(branch.range.minX,branch.range.minY); - ctx.lineTo(branch.range.maxX,branch.range.minY); - ctx.stroke(); - ctx.beginPath(); - ctx.moveTo(branch.range.maxX,branch.range.minY); - ctx.lineTo(branch.range.maxX,branch.range.maxY); - ctx.stroke(); + /** + * This function released the contained edges back into the global domain and puts them back into the + * dynamic edges of both parent and child. + * + * @param {Node} parentNode | + * @param {Node} childNode | + * @private + */ + exports._releaseContainedEdges = function(parentNode, childNode) { + for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { + var edge = parentNode.containedEdges[childNode.id][i]; - ctx.beginPath(); - ctx.moveTo(branch.range.maxX,branch.range.maxY); - ctx.lineTo(branch.range.minX,branch.range.maxY); - ctx.stroke(); + // put the edge back in the global edges object + this.edges[edge.id] = edge; - ctx.beginPath(); - ctx.moveTo(branch.range.minX,branch.range.maxY); - ctx.lineTo(branch.range.minX,branch.range.minY); - ctx.stroke(); + // put the edge back in the dynamic edges of the child and parent + childNode.dynamicEdges.push(edge); + parentNode.dynamicEdges.push(edge); + } + // remove the entry from the contained edges + delete parentNode.containedEdges[childNode.id]; - /* - if (branch.mass > 0) { - ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass); - ctx.stroke(); - } - */ }; -/***/ }, -/* 64 */ -/***/ function(module, exports, __webpack_require__) { - - /** - * Creation of the ClusterMixin var. - * - * This contains all the functions the Network object can use to employ clustering - */ - /** - * This is only called in the constructor of the network object - * - */ - exports.startWithClustering = function() { - // cluster if the data set is big - this.clusterToFit(this.constants.clustering.initialMaxNodes, true); - // updates the lables after clustering - this.updateLabels(); + // ------------------- UTILITY FUNCTIONS ---------------------------- // - // this is called here because if clusterin is disabled, the start and stabilize are called in - // the setData function. - if (this.stabilize) { - this._stabilize(); - } - this.start(); - }; /** - * This function clusters until the initialMaxNodes has been reached - * - * @param {Number} maxNumberOfNodes - * @param {Boolean} reposition + * This updates the node labels for all nodes (for debugging purposes) */ - exports.clusterToFit = function(maxNumberOfNodes, reposition) { - var numberOfNodes = this.nodeIndices.length; - - var maxLevels = 50; - var level = 0; - - // we first cluster the hubs, then we pull in the outliers, repeat - while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { - if (level % 3 == 0) { - this.forceAggregateHubs(true); - this.normalizeClusterLevels(); - } - else { - this.increaseClusterLevel(); // this also includes a cluster normalization + exports.updateLabels = function() { + var nodeId; + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.clusterSize > 1) { + node.label = "[".concat(String(node.clusterSize),"]"); + } } - - numberOfNodes = this.nodeIndices.length; - level += 1; } - // after the clustering we reposition the nodes to reduce the initial chaos - if (level > 0 && reposition == true) { - this.repositionNodes(); + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.clusterSize == 1) { + if (node.originalLabel !== undefined) { + node.label = node.originalLabel; + } + else { + node.label = String(node.id); + } + } + } } - this._updateCalculationNodes(); + + // /* Debug Override */ + // for (nodeId in this.nodes) { + // if (this.nodes.hasOwnProperty(nodeId)) { + // node = this.nodes[nodeId]; + // node.label = String(node.level); + // } + // } + }; + /** - * This function can be called to open up a specific cluster. It is only called by - * It will unpack the cluster back one level. - * - * @param node | Node object: cluster to open. + * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes + * if the rest of the nodes are already a few cluster levels in. + * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not + * clustered enough to the clusterToSmallestNeighbours function. */ - exports.openCluster = function(node) { - var isMovingBeforeClustering = this.moving; - if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && - !(this._sector() == "default" && this.nodeIndices.length == 1)) { - // this loads a new sector, loads the nodes and edges and nodeIndices of it. - this._addSector(node); - var level = 0; + exports.normalizeClusterLevels = function() { + var maxLevel = 0; + var minLevel = 1e9; + var clusterLevel = 0; + var nodeId; - // we decluster until we reach a decent number of nodes - while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { - this.decreaseClusterLevel(); - level += 1; + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + clusterLevel = this.nodes[nodeId].clusterSessions.length; + if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} + if (minLevel > clusterLevel) {minLevel = clusterLevel;} } - } - else { - this._expandClusterNode(node,false,true); - // update the index list, dynamic edges and labels + if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { + var amountOfNodes = this.nodeIndices.length; + var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].clusterSessions.length < targetLevel) { + this._clusterToSmallestNeighbour(this.nodes[nodeId]); + } + } + } this._updateNodeIndexList(); this._updateDynamicEdges(); - this._updateCalculationNodes(); - this.updateLabels(); - } - - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } } }; - /** - * This calls the updateClustes with default arguments - */ - exports.updateClustersDefault = function() { - if (this.constants.clustering.enabled == true) { - this.updateClusters(0,false,false); - } - }; - /** - * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will - * be clustered with their connected node. This can be repeated as many times as needed. - * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. + * This function determines if the cluster we want to decluster is in the active area + * this means around the zoom center + * + * @param {Node} node + * @returns {boolean} + * @private */ - exports.increaseClusterLevel = function() { - this.updateClusters(-1,false,true); + exports._nodeInActiveArea = function(node) { + return ( + Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale + && + Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale + ) }; /** - * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will - * be unpacked if they are a cluster. This can be repeated as many times as needed. - * This can be called externally (by a key-bind for instance) to look into clusters without zooming. + * This is an adaptation of the original repositioning function. This is called if the system is clustered initially + * It puts large clusters away from the center and randomizes the order. + * */ - exports.decreaseClusterLevel = function() { - this.updateClusters(1,false,true); + exports.repositionNodes = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + if ((node.xFixed == false || node.yFixed == false)) { + var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.options.mass); + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + this._repositionBezierNodes(node); + } + } }; /** - * This is the main clustering function. It clusters and declusters on zoom or forced - * This function clusters on zoom, it can be called with a predefined zoom direction - * If out, check if we can form clusters, if in, check if we can open clusters. - * This function is only called from _zoom() - * - * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn - * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters - * @param {Boolean} force | enabled or disable forcing - * @param {Boolean} doNotStart | if true do not call start + * We determine how many connections denote an important hub. + * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) * + * @private */ - exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { - var isMovingBeforeClustering = this.moving; - var amountOfNodes = this.nodeIndices.length; + exports._getHubSize = function() { + var average = 0; + var averageSquared = 0; + var hubCounter = 0; + var largestHub = 0; - // on zoom out collapse the sector if the scale is at the level the sector was made - if (this.previousScale > this.scale && zoomDirection == 0) { - this._collapseSector(); - } + for (var i = 0; i < this.nodeIndices.length; i++) { - // check if we zoom in or out - if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out - // forming clusters when forced pulls outliers in. When not forced, the edge length of the - // outer nodes determines if it is being clustered - this._formClusters(force); - } - else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in - if (force == true) { - // _openClusters checks for each node if the formationScale of the cluster is smaller than - // the current scale and if so, declusters. When forced, all clusters are reduced by one step - this._openClusters(recursive,force); - } - else { - // if a cluster takes up a set percentage of the active window - this._openClustersBySize(); + var node = this.nodes[this.nodeIndices[i]]; + if (node.dynamicEdgesLength > largestHub) { + largestHub = node.dynamicEdgesLength; } + average += node.dynamicEdgesLength; + averageSquared += Math.pow(node.dynamicEdgesLength,2); + hubCounter += 1; } - this._updateNodeIndexList(); + average = average / hubCounter; + averageSquared = averageSquared / hubCounter; - // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs - if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { - this._aggregateHubs(force); - this._updateNodeIndexList(); - } + var variance = averageSquared - Math.pow(average,2); - // we now reduce chains. - if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out - this.handleChains(); - this._updateNodeIndexList(); + var standardDeviation = Math.sqrt(variance); + + this.hubThreshold = Math.floor(average + 2*standardDeviation); + + // always have at least one to cluster + if (this.hubThreshold > largestHub) { + this.hubThreshold = largestHub; } - this.previousScale = this.scale; + // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); + // console.log("hubThreshold:",this.hubThreshold); + }; - // rest of the update the index list, dynamic edges and labels - this._updateDynamicEdges(); - this.updateLabels(); - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place - this.clusterSession += 1; - // if clusters have been made, we normalize the cluster level - this.normalizeClusterLevels(); + /** + * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce + * @private + */ + exports._reduceAmountOfChains = function(fraction) { + this.hubThreshold = 2; + var reduceAmount = Math.floor(this.nodeIndices.length * fraction); + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + if (reduceAmount > 0) { + this._formClusterFromHub(this.nodes[nodeId],true,true,1); + reduceAmount -= 1; + } + } + } } + }; - if (doNotStart == false || doNotStart === undefined) { - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); + /** + * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @private + */ + exports._getChainFraction = function() { + var chains = 0; + var total = 0; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + chains += 1; + } + total += 1; } } - - this._updateCalculationNodes(); + return chains/total; }; + +/***/ }, +/* 61 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Node = __webpack_require__(40); + /** - * This function handles the chains. It is called on every updateClusters(). + * Creation of the SectorMixin var. + * + * This contains all the functions the Network object can use to employ the sector system. + * The sector system is always used by Network, though the benefits only apply to the use of clustering. + * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. */ - exports.handleChains = function() { - // after clustering we check how many chains there are - var chainPercentage = this._getChainFraction(); - if (chainPercentage > this.constants.clustering.chainThreshold) { - this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) - - } - }; /** - * this functions starts clustering by hubs - * The minimum hub threshold is set globally + * This function is only called by the setData function of the Network object. + * This loads the global references into the active sector. This initializes the sector. * * @private */ - exports._aggregateHubs = function(force) { - this._getHubSize(); - this._formClustersByHub(force,false); + exports._putDataInSector = function() { + this.sectors["active"][this._sector()].nodes = this.nodes; + this.sectors["active"][this._sector()].edges = this.edges; + this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; }; /** - * This function is fired by keypress. It forces hubs to form. + * /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied (active) sector. If a type is defined, do the specific type * + * @param {String} sectorId + * @param {String} [sectorType] | "active" or "frozen" + * @private */ - exports.forceAggregateHubs = function(doNotStart) { - var isMovingBeforeClustering = this.moving; - var amountOfNodes = this.nodeIndices.length; - - this._aggregateHubs(true); - - // update the index list, dynamic edges and labels - this._updateNodeIndexList(); - this._updateDynamicEdges(); - this.updateLabels(); - - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length != amountOfNodes) { - this.clusterSession += 1; + exports._switchToSector = function(sectorId, sectorType) { + if (sectorType === undefined || sectorType == "active") { + this._switchToActiveSector(sectorId); } - - if (doNotStart == false || doNotStart === undefined) { - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); - } + else { + this._switchToFrozenSector(sectorId); } }; + /** - * If a cluster takes up more than a set percentage of the screen, open the cluster + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. * + * @param sectorId * @private */ - exports._openClustersBySize = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.inView() == true) { - if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || - (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { - this.openCluster(node); - } - } - } - } + exports._switchToActiveSector = function(sectorId) { + this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["active"][sectorId]["nodes"]; + this.edges = this.sectors["active"][sectorId]["edges"]; }; /** - * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it - * has to be opened based on the current zoom level. + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. * * @private */ - exports._openClusters = function(recursive,force) { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - this._expandClusterNode(node,recursive,force); - this._updateCalculationNodes(); - } + exports._switchToSupportSector = function() { + this.nodeIndices = this.sectors["support"]["nodeIndices"]; + this.nodes = this.sectors["support"]["nodes"]; + this.edges = this.sectors["support"]["edges"]; }; + /** - * This function checks if a node has to be opened. This is done by checking the zoom level. - * If the node contains child nodes, this function is recursively called on the child nodes as well. - * This recursive behaviour is optional and can be set by the recursive argument. + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied frozen sector. * - * @param {Node} parentNode | to check for cluster and expand - * @param {Boolean} recursive | enabled or disable recursive calling - * @param {Boolean} force | enabled or disable forcing - * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released + * @param sectorId * @private */ - exports._expandClusterNode = function(parentNode, recursive, force, openAll) { - // first check if node is a cluster - if (parentNode.clusterSize > 1) { - // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 - if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { - openAll = true; - } - recursive = openAll ? true : recursive; + exports._switchToFrozenSector = function(sectorId) { + this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["frozen"][sectorId]["nodes"]; + this.edges = this.sectors["frozen"][sectorId]["edges"]; + }; - // if the last child has been added on a smaller scale than current scale decluster - if (parentNode.formationScale < this.scale || force == true) { - // we will check if any of the contained child nodes should be removed from the cluster - for (var containedNodeId in parentNode.containedNodes) { - if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { - var childNode = parentNode.containedNodes[containedNodeId]; - // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that - // the largest cluster is the one that comes from outside - if (force == true) { - if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] - || openAll) { - this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); - } - } - else { - if (this._nodeInActiveArea(parentNode)) { - this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); - } - } - } - } - } - } + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the currently active sector. + * + * @private + */ + exports._loadLatestSector = function() { + this._switchToSector(this._sector()); }; + /** - * ONLY CALLED FROM _expandClusterNode - * - * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove - * the child node from the parent contained_node object and put it back into the global nodes object. - * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * This function returns the currently active sector Id * - * @param {Node} parentNode | the parent node - * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node - * @param {Boolean} recursive | This will also check if the child needs to be expanded. - * With force and recursive both true, the entire cluster is unpacked - * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent - * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released + * @returns {String} * @private */ - exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { - var childNode = parentNode.containedNodes[containedNodeId]; + exports._sector = function() { + return this.activeSector[this.activeSector.length-1]; + }; - // if child node has been added on smaller scale than current, kick out - if (childNode.formationScale < this.scale || force == true) { - // unselect all selected items - this._unselectAll(); - // put the child node back in the global nodes object - this.nodes[containedNodeId] = childNode; + /** + * This function returns the previously active sector Id + * + * @returns {String} + * @private + */ + exports._previousSector = function() { + if (this.activeSector.length > 1) { + return this.activeSector[this.activeSector.length-2]; + } + else { + throw new TypeError('there are not enough sectors in the this.activeSector array.'); + } + }; - // release the contained edges from this childNode back into the global edges - this._releaseContainedEdges(parentNode,childNode); - // reconnect rerouted edges to the childNode - this._connectEdgeBackToChild(parentNode,childNode); + /** + * We add the active sector at the end of the this.activeSector array + * This ensures it is the currently active sector returned by _sector() and it reaches the top + * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. + * + * @param newId + * @private + */ + exports._setActiveSector = function(newId) { + this.activeSector.push(newId); + }; - // validate all edges in dynamicEdges - this._validateEdges(parentNode); - // undo the changes from the clustering operation on the parent node - parentNode.options.mass -= childNode.options.mass; - parentNode.clusterSize -= childNode.clusterSize; - parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*(parentNode.clusterSize-1)); - parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; + /** + * We remove the currently active sector id from the active sector stack. This happens when + * we reactivate the previously active sector + * + * @private + */ + exports._forgetLastSector = function() { + this.activeSector.pop(); + }; - // place the child node near the parent, not at the exact same location to avoid chaos in the system - childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); - childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); - // remove node from the list - delete parentNode.containedNodes[containedNodeId]; + /** + * This function creates a new active sector with the supplied newId. This newId + * is the expanding node id. + * + * @param {String} newId | Id of the new active sector + * @private + */ + exports._createNewSector = function(newId) { + // create the new sector + this.sectors["active"][newId] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": this.scale, + "drawingNode": undefined}; - // check if there are other childs with this clusterSession in the parent. - var othersPresent = false; - for (var childNodeId in parentNode.containedNodes) { - if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { - if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { - othersPresent = true; - break; + // create the new sector render node. This gives visual feedback that you are in a new sector. + this.sectors["active"][newId]['drawingNode'] = new Node( + {id:newId, + color: { + background: "#eaefef", + border: "495c5e" } - } - } - // if there are no others, remove the cluster session from the list - if (othersPresent == false) { - parentNode.clusterSessions.pop(); - } - - this._repositionBezierNodes(childNode); - // this._repositionBezierNodes(parentNode); - - // remove the clusterSession from the child node - childNode.clusterSession = 0; - - // recalculate the size of the node on the next time the node is rendered - parentNode.clearSizeCache(); - - // restart the simulation to reorganise all nodes - this.moving = true; - } - - // check if a further expansion step is possible if recursivity is enabled - if (recursive == true) { - this._expandClusterNode(childNode,recursive,force,openAll); - } + },{},{},this.constants); + this.sectors["active"][newId]['drawingNode'].clusterSize = 2; }; /** - * position the bezier nodes at the center of the edges + * This function removes the currently active sector. This is called when we create a new + * active sector. * - * @param node + * @param {String} sectorId | Id of the active sector that will be removed * @private */ - exports._repositionBezierNodes = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - node.dynamicEdges[i].positionBezierNode(); - } + exports._deleteActiveSector = function(sectorId) { + delete this.sectors["active"][sectorId]; }; /** - * This function checks if any nodes at the end of their trees have edges below a threshold length - * This function is called only from updateClusters() - * forceLevelCollapse ignores the length of the edge and collapses one level - * This means that a node with only one edge will be clustered with its connected node + * This function removes the currently active sector. This is called when we reactivate + * the previously active sector. * + * @param {String} sectorId | Id of the active sector that will be removed * @private - * @param {Boolean} force */ - exports._formClusters = function(force) { - if (force == false) { - this._formClustersByZoom(); - } - else { - this._forceClustersByZoom(); - } + exports._deleteFrozenSector = function(sectorId) { + delete this.sectors["frozen"][sectorId]; }; /** - * This function handles the clustering by zooming out, this is based on a minimum edge distance + * Freezing an active sector means moving it from the "active" object to the "frozen" object. + * We copy the references, then delete the active entree. * + * @param sectorId * @private */ - exports._formClustersByZoom = function() { - var dx,dy,length, - minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - - // check if any edges are shorter than minLength and start the clustering - // the clustering favours the node with the larger mass - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - var edge = this.edges[edgeId]; - if (edge.connected) { - if (edge.toId != edge.fromId) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - length = Math.sqrt(dx * dx + dy * dy); - - - if (length < minLength) { - // first check which node is larger - var parentNode = edge.from; - var childNode = edge.to; - if (edge.to.options.mass > edge.from.options.mass) { - parentNode = edge.to; - childNode = edge.from; - } + exports._freezeSector = function(sectorId) { + // we move the set references from the active to the frozen stack. + this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; - if (childNode.dynamicEdgesLength == 1) { - this._addToCluster(parentNode,childNode,false); - } - else if (parentNode.dynamicEdgesLength == 1) { - this._addToCluster(childNode,parentNode,false); - } - } - } - } - } - } + // we have moved the sector data into the frozen set, we now remove it from the active set + this._deleteActiveSector(sectorId); }; + /** - * This function forces the network to cluster all nodes with only one connecting edge to their - * connected node. + * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" + * object to the "active" object. * + * @param sectorId * @private */ - exports._forceClustersByZoom = function() { - for (var nodeId in this.nodes) { - // another node could have absorbed this child. - if (this.nodes.hasOwnProperty(nodeId)) { - var childNode = this.nodes[nodeId]; - - // the edges can be swallowed by another decrease - if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { - var edge = childNode.dynamicEdges[0]; - var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; + exports._activateSector = function(sectorId) { + // we move the set references from the frozen to the active stack. + this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; - // group to the largest node - if (childNode.id != parentNode.id) { - if (parentNode.options.mass > childNode.options.mass) { - this._addToCluster(parentNode,childNode,true); - } - else { - this._addToCluster(childNode,parentNode,true); - } - } - } - } - } + // we have moved the sector data into the active set, we now remove it from the frozen stack + this._deleteFrozenSector(sectorId); }; /** - * To keep the nodes of roughly equal size we normalize the cluster levels. - * This function clusters a node to its smallest connected neighbour. + * This function merges the data from the currently active sector with a frozen sector. This is used + * in the process of reverting back to the previously active sector. + * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it + * upon the creation of a new active sector. * - * @param node + * @param sectorId * @private */ - exports._clusterToSmallestNeighbour = function(node) { - var smallestNeighbour = -1; - var smallestNeighbourNode = null; - for (var i = 0; i < node.dynamicEdges.length; i++) { - if (node.dynamicEdges[i] !== undefined) { - var neighbour = null; - if (node.dynamicEdges[i].fromId != node.id) { - neighbour = node.dynamicEdges[i].from; - } - else if (node.dynamicEdges[i].toId != node.id) { - neighbour = node.dynamicEdges[i].to; - } - + exports._mergeThisWithFrozen = function(sectorId) { + // copy all nodes + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; + } + } - if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { - smallestNeighbour = neighbour.clusterSessions.length; - smallestNeighbourNode = neighbour; - } + // copy all edges (if not fully clustered, else there are no edges) + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; } } - if (neighbour != null && this.nodes[neighbour.id] !== undefined) { - this._addToCluster(neighbour, node, true); + // merge the nodeIndices + for (var i = 0; i < this.nodeIndices.length; i++) { + this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); } }; /** - * This function forms clusters from hubs, it loops over all nodes + * This clusters the sector to one cluster. It was a single cluster before this process started so + * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. * - * @param {Boolean} force | Disregard zoom level - * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges * @private */ - exports._formClustersByHub = function(force, onlyEqual) { - // we loop over all nodes in the list - for (var nodeId in this.nodes) { - // we check if it is still available since it can be used by the clustering in this loop - if (this.nodes.hasOwnProperty(nodeId)) { - this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); - } - } + exports._collapseThisToSingleCluster = function() { + this.clusterToFit(1,false); }; + /** - * This function forms a cluster from a specific preselected hub node + * We create a new active sector from the node that we want to open. * - * @param {Node} hubNode | the node we will cluster as a hub - * @param {Boolean} force | Disregard zoom level - * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges - * @param {Number} [absorptionSizeOffset] | + * @param node * @private */ - exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { - if (absorptionSizeOffset === undefined) { - absorptionSizeOffset = 0; - } - // we decide if the node is a hub - if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || - (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { - // initialize variables - var dx,dy,length; - var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - var allowCluster = false; + exports._addSector = function(node) { + // this is the currently active sector + var sector = this._sector(); - // we create a list of edges because the dynamicEdges change over the course of this loop - var edgesIdarray = []; - var amountOfInitialEdges = hubNode.dynamicEdges.length; - for (var j = 0; j < amountOfInitialEdges; j++) { - edgesIdarray.push(hubNode.dynamicEdges[j].id); - } + // // this should allow me to select nodes from a frozen set. + // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { + // console.log("the node is part of the active sector"); + // } + // else { + // console.log("I dont know what the fuck happened!!"); + // } - // if the hub clustering is not forces, we check if one of the edges connected - // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold - if (force == false) { - allowCluster = false; - for (j = 0; j < amountOfInitialEdges; j++) { - var edge = this.edges[edgesIdarray[j]]; - if (edge !== undefined) { - if (edge.connected) { - if (edge.toId != edge.fromId) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - length = Math.sqrt(dx * dx + dy * dy); + // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. + delete this.nodes[node.id]; - if (length < minLength) { - allowCluster = true; - break; - } - } - } - } - } - } + var unqiueIdentifier = util.randomUUID(); + + // we fully freeze the currently active sector + this._freezeSector(sector); - // start the clustering if allowed - if ((!force && allowCluster) || force) { - // we loop over all edges INITIALLY connected to this hub - for (j = 0; j < amountOfInitialEdges; j++) { - edge = this.edges[edgesIdarray[j]]; - // the edge can be clustered by this function in a previous loop - if (edge !== undefined) { - var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; - // we do not want hubs to merge with other hubs nor do we want to cluster itself. - if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && - (childNode.id != hubNode.id)) { - this._addToCluster(hubNode,childNode,force); - } - } - } - } - } - }; + // we create a new active sector. This sector has the Id of the node to ensure uniqueness + this._createNewSector(unqiueIdentifier); + + // we add the active sector to the sectors array to be able to revert these steps later on + this._setActiveSector(unqiueIdentifier); + // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier + this._switchToSector(this._sector()); + + // finally we add the node we removed from our previous active sector to the new active sector + this.nodes[node.id] = node; + }; /** - * This function adds the child node to the parent node, creating a cluster if it is not already. + * We close the sector that is currently open and revert back to the one before. + * If the active sector is the "default" sector, nothing happens. * - * @param {Node} parentNode | this is the node that will house the child node - * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node - * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse * @private */ - exports._addToCluster = function(parentNode, childNode, force) { - // join child node in the parent node - parentNode.containedNodes[childNode.id] = childNode; - - // manage all the edges connected to the child and parent nodes - for (var i = 0; i < childNode.dynamicEdges.length; i++) { - var edge = childNode.dynamicEdges[i]; - if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode - this._addToContainedEdges(parentNode,childNode,edge); - } - else { - this._connectEdgeToCluster(parentNode,childNode,edge); - } - } - // a contained node has no dynamic edges. - childNode.dynamicEdges = []; - - // remove circular edges from clusters - this._containCircularEdgesFromNode(parentNode,childNode); - + exports._collapseSector = function() { + // the currently active sector + var sector = this._sector(); - // remove the childNode from the global nodes object - delete this.nodes[childNode.id]; + // we cannot collapse the default sector + if (sector != "default") { + if ((this.nodeIndices.length == 1) || + (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + var previousSector = this._previousSector(); - // update the properties of the child and parent - var massBefore = parentNode.options.mass; - childNode.clusterSession = this.clusterSession; - parentNode.options.mass += childNode.options.mass; - parentNode.clusterSize += childNode.clusterSize; - parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + // we collapse the sector back to a single cluster + this._collapseThisToSingleCluster(); - // keep track of the clustersessions so we can open the cluster up as it has been formed. - if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { - parentNode.clusterSessions.push(this.clusterSession); - } + // we move the remaining nodes, edges and nodeIndices to the previous sector. + // This previous sector is the one we will reactivate + this._mergeThisWithFrozen(previousSector); - // forced clusters only open from screen size and double tap - if (force == true) { - // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); - parentNode.formationScale = 0; - } - else { - parentNode.formationScale = this.scale; // The latest child has been added on this scale - } + // the previously active (frozen) sector now has all the data from the currently active sector. + // we can now delete the active sector. + this._deleteActiveSector(sector); - // recalculate the size of the node on the next time the node is rendered - parentNode.clearSizeCache(); + // we activate the previously active (and currently frozen) sector. + this._activateSector(previousSector); - // set the pop-out scale for the childnode - parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; + // we load the references from the newly active sector into the global references + this._switchToSector(previousSector); - // nullify the movement velocity of the child, this is to avoid hectic behaviour - childNode.clearVelocity(); + // we forget the previously active sector because we reverted to the one before + this._forgetLastSector(); - // the mass has altered, preservation of energy dictates the velocity to be updated - parentNode.updateVelocity(massBefore); + // finally, we update the node index list. + this._updateNodeIndexList(); - // restart the simulation to reorganise all nodes - this.moving = true; + // we refresh the list with calulation nodes and calculation node indices. + this._updateCalculationNodes(); + } + } }; /** - * This function will apply the changes made to the remainingEdges during the formation of the clusters. - * This is a seperate function to allow for level-wise collapsing of the node barnesHutTree. - * It has to be called if a level is collapsed. It is called by _formClusters(). + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._updateDynamicEdges = function() { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - node.dynamicEdgesLength = node.dynamicEdges.length; - - // this corrects for multiple edges pointing at the same other node - var correction = 0; - if (node.dynamicEdgesLength > 1) { - for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { - var edgeToId = node.dynamicEdges[j].toId; - var edgeFromId = node.dynamicEdges[j].fromId; - for (var k = j+1; k < node.dynamicEdgesLength; k++) { - if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || - (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { - correction += 1; - } + exports._doInAllActiveSectors = function(runFunction,argument) { + var returnValues = []; + if (argument === undefined) { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + returnValues.push( this[runFunction]() ); + } + } + } + else { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + returnValues.push( this[runFunction](args[0],args[1]) ); + } + else { + returnValues.push( this[runFunction](argument) ); } } } - node.dynamicEdgesLength -= correction; } + // we revert the global references back to our active sector + this._loadLatestSector(); + return returnValues; }; /** - * This adds an edge from the childNode to the contained edges of the parent node + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). * - * @param parentNode | Node object - * @param childNode | Node object - * @param edge | Edge object + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._addToContainedEdges = function(parentNode, childNode, edge) { - // create an array object if it does not yet exist for this childNode - if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { - parentNode.containedEdges[childNode.id] = [] + exports._doInSupportSector = function(runFunction,argument) { + var returnValues = false; + if (argument === undefined) { + this._switchToSupportSector(); + returnValues = this[runFunction](); } - // add this edge to the list - parentNode.containedEdges[childNode.id].push(edge); - - // remove the edge from the global edges object - delete this.edges[edge.id]; - - // remove the edge from the parent object - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - if (parentNode.dynamicEdges[i].id == edge.id) { - parentNode.dynamicEdges.splice(i,1); - break; + else { + this._switchToSupportSector(); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + returnValues = this[runFunction](args[0],args[1]); + } + else { + returnValues = this[runFunction](argument); } } + // we revert the global references back to our active sector + this._loadLatestSector(); + return returnValues; }; + /** - * This function connects an edge that was connected to a child node to the parent node. - * It keeps track of which nodes it has been connected to with the originalId array. + * This runs a function in all frozen sectors. This is used in the _redraw(). * - * @param {Node} parentNode | Node object - * @param {Node} childNode | Node object - * @param {Edge} edge | Edge object + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._connectEdgeToCluster = function(parentNode, childNode, edge) { - // handle circular edges - if (edge.toId == edge.fromId) { - this._addToContainedEdges(parentNode, childNode, edge); + exports._doInAllFrozenSectors = function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + this[runFunction](); + } + } } else { - if (edge.toId == childNode.id) { // edge connected to other node on the "to" side - edge.originalToId.push(childNode.id); - edge.to = parentNode; - edge.toId = parentNode.id; - } - else { // edge connected to other node with the "from" side - - edge.originalFromId.push(childNode.id); - edge.from = parentNode; - edge.fromId = parentNode.id; + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } + } } - - this._addToReroutedEdges(parentNode,childNode,edge); } + this._loadLatestSector(); }; /** - * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain - * these edges inside of the cluster. + * This runs a function in all sectors. This is used in the _redraw(). * - * @param parentNode - * @param childNode + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._containCircularEdgesFromNode = function(parentNode, childNode) { - // manage all the edges connected to the child and parent nodes - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - var edge = parentNode.dynamicEdges[i]; - // handle circular edges - if (edge.toId == edge.fromId) { - this._addToContainedEdges(parentNode, childNode, edge); + exports._doInAllSectors = function(runFunction,argument) { + var args = Array.prototype.splice.call(arguments, 1); + if (argument === undefined) { + this._doInAllActiveSectors(runFunction); + this._doInAllFrozenSectors(runFunction); + } + else { + if (args.length > 1) { + this._doInAllActiveSectors(runFunction,args[0],args[1]); + this._doInAllFrozenSectors(runFunction,args[0],args[1]); + } + else { + this._doInAllActiveSectors(runFunction,argument); + this._doInAllFrozenSectors(runFunction,argument); } } }; /** - * This adds an edge from the childNode to the rerouted edges of the parent node + * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the + * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. * - * @param parentNode | Node object - * @param childNode | Node object - * @param edge | Edge object * @private */ - exports._addToReroutedEdges = function(parentNode, childNode, edge) { - // create an array object if it does not yet exist for this childNode - // we store the edge in the rerouted edges so we can restore it when the cluster pops open - if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { - parentNode.reroutedEdges[childNode.id] = []; - } - parentNode.reroutedEdges[childNode.id].push(edge); - - // this edge becomes part of the dynamicEdges of the cluster node - parentNode.dynamicEdges.push(edge); - }; - + exports._clearNodeIndexList = function() { + var sector = this._sector(); + this.sectors["active"][sector]["nodeIndices"] = []; + this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + }; /** - * This function connects an edge that was connected to a cluster node back to the child node. + * Draw the encompassing sector node * - * @param parentNode | Node object - * @param childNode | Node object + * @param ctx + * @param sectorType * @private */ - exports._connectEdgeBackToChild = function(parentNode, childNode) { - if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { - for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { - var edge = parentNode.reroutedEdges[childNode.id][i]; - if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { - edge.originalFromId.pop(); - edge.fromId = childNode.id; - edge.from = childNode; - } - else { - edge.originalToId.pop(); - edge.toId = childNode.id; - edge.to = childNode; - } + exports._drawSectorNodes = function(ctx,sectorType) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var sector in this.sectors[sectorType]) { + if (this.sectors[sectorType].hasOwnProperty(sector)) { + if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { - // append this edge to the list of edges connecting to the childnode - childNode.dynamicEdges.push(edge); + this._switchToSector(sector,sectorType); - // remove the edge from the parent object - for (var j = 0; j < parentNode.dynamicEdges.length; j++) { - if (parentNode.dynamicEdges[j].id == edge.id) { - parentNode.dynamicEdges.splice(j,1); - break; + minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.resize(ctx); + if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} + if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} + if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} + if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} + } } + node = this.sectors[sectorType][sector]["drawingNode"]; + node.x = 0.5 * (maxX + minX); + node.y = 0.5 * (maxY + minY); + node.width = 2 * (node.x - minX); + node.height = 2 * (node.y - minY); + node.options.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); + node.setScale(this.scale); + node._drawCircle(ctx); } } - // remove the entry from the rerouted edges - delete parentNode.reroutedEdges[childNode.id]; } }; + exports._drawAllSectorNodes = function(ctx) { + this._drawSectorNodes(ctx,"frozen"); + this._drawSectorNodes(ctx,"active"); + this._loadLatestSector(); + }; + + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + var Node = __webpack_require__(40); /** - * When loops are clustered, an edge can be both in the rerouted array and the contained array. - * This function is called last to verify that all edges in dynamicEdges are in fact connected to the - * parentNode + * This function can be called from the _doInAllSectors function * - * @param parentNode | Node object + * @param object + * @param overlappingNodes * @private */ - exports._validateEdges = function(parentNode) { - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - var edge = parentNode.dynamicEdges[i]; - if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { - parentNode.dynamicEdges.splice(i,1); + exports._getNodesOverlappingWith = function(object, overlappingNodes) { + var nodes = this.nodes; + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + if (nodes[nodeId].isOverlappingWith(object)) { + overlappingNodes.push(nodeId); + } } } }; - /** - * This function released the contained edges back into the global domain and puts them back into the - * dynamic edges of both parent and child. - * - * @param {Node} parentNode | - * @param {Node} childNode | + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes * @private */ - exports._releaseContainedEdges = function(parentNode, childNode) { - for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { - var edge = parentNode.containedEdges[childNode.id][i]; + exports._getAllNodesOverlappingWith = function (object) { + var overlappingNodes = []; + this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); + return overlappingNodes; + }; - // put the edge back in the global edges object - this.edges[edge.id] = edge; - // put the edge back in the dynamic edges of the child and parent - childNode.dynamicEdges.push(edge); - parentNode.dynamicEdges.push(edge); - } - // remove the entry from the contained edges - delete parentNode.containedEdges[childNode.id]; + /** + * Return a position object in canvasspace from a single point in screenspace + * + * @param pointer + * @returns {{left: number, top: number, right: number, bottom: number}} + * @private + */ + exports._pointerToPositionObject = function(pointer) { + var x = this._XconvertDOMtoCanvas(pointer.x); + var y = this._YconvertDOMtoCanvas(pointer.y); + return { + left: x, + top: y, + right: x, + bottom: y + }; }; + /** + * Get the top node at the a specific point (like a click) + * + * @param {{x: Number, y: Number}} pointer + * @return {Node | null} node + * @private + */ + exports._getNodeAt = function (pointer) { + // we first check if this is an navigation controls element + var positionObject = this._pointerToPositionObject(pointer); + var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); - - // ------------------- UTILITY FUNCTIONS ---------------------------- // + // if there are overlapping nodes, select the last one, this is the + // one which is drawn on top of the others + if (overlappingNodes.length > 0) { + return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; + } + else { + return null; + } + }; /** - * This updates the node labels for all nodes (for debugging purposes) + * retrieve all edges overlapping with given object, selector is around center + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private */ - exports.updateLabels = function() { - var nodeId; - // update node labels - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.clusterSize > 1) { - node.label = "[".concat(String(node.clusterSize),"]"); + exports._getEdgesOverlappingWith = function (object, overlappingEdges) { + var edges = this.edges; + for (var edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + if (edges[edgeId].isOverlappingWith(object)) { + overlappingEdges.push(edgeId); } } } + }; - // update node labels - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.clusterSize == 1) { - if (node.originalLabel !== undefined) { - node.label = node.originalLabel; - } - else { - node.label = String(node.id); - } - } - } - } - // /* Debug Override */ - // for (nodeId in this.nodes) { - // if (this.nodes.hasOwnProperty(nodeId)) { - // node = this.nodes[nodeId]; - // node.label = String(node.level); - // } - // } + /** + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getAllEdgesOverlappingWith = function (object) { + var overlappingEdges = []; + this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); + return overlappingEdges; + }; + + /** + * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call + * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. + * + * @param pointer + * @returns {null} + * @private + */ + exports._getEdgeAt = function(pointer) { + var positionObject = this._pointerToPositionObject(pointer); + var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); + if (overlappingEdges.length > 0) { + return this.edges[overlappingEdges[overlappingEdges.length - 1]]; + } + else { + return null; + } }; /** - * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes - * if the rest of the nodes are already a few cluster levels in. - * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not - * clustered enough to the clusterToSmallestNeighbours function. + * Add object to the selection array. + * + * @param obj + * @private */ - exports.normalizeClusterLevels = function() { - var maxLevel = 0; - var minLevel = 1e9; - var clusterLevel = 0; - var nodeId; - - // we loop over all nodes in the list - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - clusterLevel = this.nodes[nodeId].clusterSessions.length; - if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} - if (minLevel > clusterLevel) {minLevel = clusterLevel;} - } + exports._addToSelection = function(obj) { + if (obj instanceof Node) { + this.selectionObj.nodes[obj.id] = obj; } - - if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { - var amountOfNodes = this.nodeIndices.length; - var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; - // we loop over all nodes in the list - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].clusterSessions.length < targetLevel) { - this._clusterToSmallestNeighbour(this.nodes[nodeId]); - } - } - } - this._updateNodeIndexList(); - this._updateDynamicEdges(); - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length != amountOfNodes) { - this.clusterSession += 1; - } + else { + this.selectionObj.edges[obj.id] = obj; } }; - - /** - * This function determines if the cluster we want to decluster is in the active area - * this means around the zoom center + * Add object to the selection array. * - * @param {Node} node - * @returns {boolean} + * @param obj * @private */ - exports._nodeInActiveArea = function(node) { - return ( - Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale - && - Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale - ) + exports._addToHover = function(obj) { + if (obj instanceof Node) { + this.hoverObj.nodes[obj.id] = obj; + } + else { + this.hoverObj.edges[obj.id] = obj; + } }; /** - * This is an adaptation of the original repositioning function. This is called if the system is clustered initially - * It puts large clusters away from the center and randomizes the order. + * Remove a single option from selection. * + * @param {Object} obj + * @private */ - exports.repositionNodes = function() { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - if ((node.xFixed == false || node.yFixed == false)) { - var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.options.mass); - var angle = 2 * Math.PI * Math.random(); - if (node.xFixed == false) {node.x = radius * Math.cos(angle);} - if (node.yFixed == false) {node.y = radius * Math.sin(angle);} - this._repositionBezierNodes(node); - } + exports._removeFromSelection = function(obj) { + if (obj instanceof Node) { + delete this.selectionObj.nodes[obj.id]; + } + else { + delete this.selectionObj.edges[obj.id]; } }; - /** - * We determine how many connections denote an important hub. - * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) + * Unselect all. The selectionObj is useful for this. * + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._getHubSize = function() { - var average = 0; - var averageSquared = 0; - var hubCounter = 0; - var largestHub = 0; - - for (var i = 0; i < this.nodeIndices.length; i++) { - - var node = this.nodes[this.nodeIndices[i]]; - if (node.dynamicEdgesLength > largestHub) { - largestHub = node.dynamicEdgesLength; + exports._unselectAll = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + this.selectionObj.nodes[nodeId].unselect(); + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + this.selectionObj.edges[edgeId].unselect(); } - average += node.dynamicEdgesLength; - averageSquared += Math.pow(node.dynamicEdgesLength,2); - hubCounter += 1; } - average = average / hubCounter; - averageSquared = averageSquared / hubCounter; - var variance = averageSquared - Math.pow(average,2); + this.selectionObj = {nodes:{},edges:{}}; - var standardDeviation = Math.sqrt(variance); + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; - this.hubThreshold = Math.floor(average + 2*standardDeviation); + /** + * Unselect all clusters. The selectionObj is useful for this. + * + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + exports._unselectClusters = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } - // always have at least one to cluster - if (this.hubThreshold > largestHub) { - this.hubThreshold = largestHub; + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + this.selectionObj.nodes[nodeId].unselect(); + this._removeFromSelection(this.selectionObj.nodes[nodeId]); + } + } } - // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); - // console.log("hubThreshold:",this.hubThreshold); + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } }; /** - * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods - * with this amount we can cluster specifically on these chains. + * return the number of selected nodes * - * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce + * @returns {number} * @private */ - exports._reduceAmountOfChains = function(fraction) { - this.hubThreshold = 2; - var reduceAmount = Math.floor(this.nodeIndices.length * fraction); - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { - if (reduceAmount > 0) { - this._formClusterFromHub(this.nodes[nodeId],true,true,1); - reduceAmount -= 1; - } - } + exports._getSelectedNodeCount = function() { + var count = 0; + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; } } + return count; }; /** - * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods - * with this amount we can cluster specifically on these chains. + * return the selected node * + * @returns {number} * @private */ - exports._getChainFraction = function() { - var chains = 0; - var total = 0; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { - chains += 1; - } - total += 1; + exports._getSelectedNode = function() { + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return this.selectionObj.nodes[nodeId]; } } - return chains/total; + return null; }; - -/***/ }, -/* 65 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Node = __webpack_require__(56); - /** - * Creation of the SectorMixin var. + * return the selected edge * - * This contains all the functions the Network object can use to employ the sector system. - * The sector system is always used by Network, though the benefits only apply to the use of clustering. - * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. + * @returns {number} + * @private */ + exports._getSelectedEdge = function() { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + return this.selectionObj.edges[edgeId]; + } + } + return null; + }; + /** - * This function is only called by the setData function of the Network object. - * This loads the global references into the active sector. This initializes the sector. + * return the number of selected edges * + * @returns {number} * @private */ - exports._putDataInSector = function() { - this.sectors["active"][this._sector()].nodes = this.nodes; - this.sectors["active"][this._sector()].edges = this.edges; - this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; + exports._getSelectedEdgeCount = function() { + var count = 0; + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; + } + } + return count; }; /** - * /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied (active) sector. If a type is defined, do the specific type + * return the number of selected objects. * - * @param {String} sectorId - * @param {String} [sectorType] | "active" or "frozen" + * @returns {number} * @private */ - exports._switchToSector = function(sectorId, sectorType) { - if (sectorType === undefined || sectorType == "active") { - this._switchToActiveSector(sectorId); + exports._getSelectedObjectCount = function() { + var count = 0; + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; + } } - else { - this._switchToFrozenSector(sectorId); + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; + } } + return count; }; - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied active sector. + * Check if anything is selected * - * @param sectorId + * @returns {boolean} * @private */ - exports._switchToActiveSector = function(sectorId) { - this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; - this.nodes = this.sectors["active"][sectorId]["nodes"]; - this.edges = this.sectors["active"][sectorId]["edges"]; + exports._selectionIsEmpty = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return false; + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + return false; + } + } + return true; }; /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied active sector. + * check if one of the selected nodes is a cluster. * + * @returns {boolean} * @private */ - exports._switchToSupportSector = function() { - this.nodeIndices = this.sectors["support"]["nodeIndices"]; - this.nodes = this.sectors["support"]["nodes"]; - this.edges = this.sectors["support"]["edges"]; + exports._clusterInSelection = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + return true; + } + } + } + return false; }; - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied frozen sector. + * select the edges connected to the node that is being selected * - * @param sectorId + * @param {Node} node * @private */ - exports._switchToFrozenSector = function(sectorId) { - this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; - this.nodes = this.sectors["frozen"][sectorId]["nodes"]; - this.edges = this.sectors["frozen"][sectorId]["edges"]; + exports._selectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.select(); + this._addToSelection(edge); + } }; - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the currently active sector. + * select the edges connected to the node that is being selected * + * @param {Node} node * @private */ - exports._loadLatestSector = function() { - this._switchToSector(this._sector()); + exports._hoverConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.hover = true; + this._addToHover(edge); + } }; /** - * This function returns the currently active sector Id + * unselect the edges connected to the node that is being selected * - * @returns {String} + * @param {Node} node * @private */ - exports._sector = function() { - return this.activeSector[this.activeSector.length-1]; + exports._unselectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.unselect(); + this._removeFromSelection(edge); + } }; + + /** - * This function returns the previously active sector Id + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection * - * @returns {String} + * @param {Node || Edge} object + * @param {Boolean} append + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._previousSector = function() { - if (this.activeSector.length > 1) { - return this.activeSector[this.activeSector.length-2]; + exports._selectObject = function(object, append, doNotTrigger, highlightEdges, overrideSelectable) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + if (highlightEdges === undefined) { + highlightEdges = true; + } + + if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { + this._unselectAll(true); + } + + // selectable allows the object to be selected. Override can be used if needed to bypass this. + if (object.selected == false && (this.constants.selectable == true || overrideSelectable)) { + object.select(); + this._addToSelection(object); + if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { + this._selectConnectedEdges(object); + } + } + // do not select the object if selectable is false, only add it to selection to allow drag to work + else if (object.selected == false) { + this._addToSelection(object); + doNotTrigger = true; } else { - throw new TypeError('there are not enough sectors in the this.activeSector array.'); + object.unselect(); + this._removeFromSelection(object); + } + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); } }; /** - * We add the active sector at the end of the this.activeSector array - * This ensures it is the currently active sector returned by _sector() and it reaches the top - * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection * - * @param newId + * @param {Node || Edge} object * @private */ - exports._setActiveSector = function(newId) { - this.activeSector.push(newId); + exports._blurObject = function(object) { + if (object.hover == true) { + object.hover = false; + this.emit("blurNode",{node:object.id}); + } }; - /** - * We remove the currently active sector id from the active sector stack. This happens when - * we reactivate the previously active sector + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection * + * @param {Node || Edge} object * @private */ - exports._forgetLastSector = function() { - this.activeSector.pop(); + exports._hoverObject = function(object) { + if (object.hover == false) { + object.hover = true; + this._addToHover(object); + if (object instanceof Node) { + this.emit("hoverNode",{node:object.id}); + } + } + if (object instanceof Node) { + this._hoverConnectedEdges(object); + } }; /** - * This function creates a new active sector with the supplied newId. This newId - * is the expanding node id. + * handles the selection part of the touch, only for navigation controls elements; + * Touch is triggered before tap, also before hold. Hold triggers after a while. + * This is the most responsive solution * - * @param {String} newId | Id of the new active sector + * @param {Object} pointer * @private */ - exports._createNewSector = function(newId) { - // create the new sector - this.sectors["active"][newId] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": this.scale, - "drawingNode": undefined}; + exports._handleTouch = function(pointer) { + }; - // create the new sector render node. This gives visual feedback that you are in a new sector. - this.sectors["active"][newId]['drawingNode'] = new Node( - {id:newId, - color: { - background: "#eaefef", - border: "495c5e" - } - },{},{},this.constants); - this.sectors["active"][newId]['drawingNode'].clusterSize = 2; + + /** + * handles the selection part of the tap; + * + * @param {Object} pointer + * @private + */ + exports._handleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node, false); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge, false); + } + else { + this._unselectAll(); + } + } + var properties = this.getSelection(); + properties['pointer'] = { + DOM: {x: pointer.x, y: pointer.y}, + canvas: {x: this._XconvertDOMtoCanvas(pointer.x), y: this._YconvertDOMtoCanvas(pointer.y)} + } + this.emit("click", properties); + this._redraw(); }; /** - * This function removes the currently active sector. This is called when we create a new - * active sector. + * handles the selection part of the double tap and opens a cluster if needed * - * @param {String} sectorId | Id of the active sector that will be removed + * @param {Object} pointer * @private */ - exports._deleteActiveSector = function(sectorId) { - delete this.sectors["active"][sectorId]; + exports._handleDoubleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null && node !== undefined) { + // we reset the areaCenter here so the opening of the node will occur + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; + this.openCluster(node); + } + var properties = this.getSelection(); + properties['pointer'] = { + DOM: {x: pointer.x, y: pointer.y}, + canvas: {x: this._XconvertDOMtoCanvas(pointer.x), y: this._YconvertDOMtoCanvas(pointer.y)} + } + this.emit("doubleClick", properties); }; /** - * This function removes the currently active sector. This is called when we reactivate - * the previously active sector. + * Handle the onHold selection part * - * @param {String} sectorId | Id of the active sector that will be removed + * @param pointer * @private */ - exports._deleteFrozenSector = function(sectorId) { - delete this.sectors["frozen"][sectorId]; + exports._handleOnHold = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node,true); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge,true); + } + } + this._redraw(); }; /** - * Freezing an active sector means moving it from the "active" object to the "frozen" object. - * We copy the references, then delete the active entree. + * handle the onRelease event. These functions are here for the navigation controls module + * and data manipulation module. * - * @param sectorId - * @private + * @private */ - exports._freezeSector = function(sectorId) { - // we move the set references from the active to the frozen stack. - this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; - - // we have moved the sector data into the frozen set, we now remove it from the active set - this._deleteActiveSector(sectorId); + exports._handleOnRelease = function(pointer) { + this._manipulationReleaseOverload(pointer); + this._navigationReleaseOverload(pointer); }; + exports._manipulationReleaseOverload = function (pointer) {}; + exports._navigationReleaseOverload = function (pointer) {}; /** - * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" - * object to the "active" object. * - * @param sectorId - * @private + * retrieve the currently selected objects + * @return {{nodes: Array., edges: Array.}} selection */ - exports._activateSector = function(sectorId) { - // we move the set references from the frozen to the active stack. - this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; - - // we have moved the sector data into the active set, we now remove it from the frozen stack - this._deleteFrozenSector(sectorId); + exports.getSelection = function() { + var nodeIds = this.getSelectedNodes(); + var edgeIds = this.getSelectedEdges(); + return {nodes:nodeIds, edges:edgeIds}; }; - /** - * This function merges the data from the currently active sector with a frozen sector. This is used - * in the process of reverting back to the previously active sector. - * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it - * upon the creation of a new active sector. * - * @param sectorId - * @private + * retrieve the currently selected nodes + * @return {String[]} selection An array with the ids of the + * selected nodes. */ - exports._mergeThisWithFrozen = function(sectorId) { - // copy all nodes - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; + exports.getSelectedNodes = function() { + var idArray = []; + if (this.constants.selectable == true) { + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + idArray.push(nodeId); + } } } + return idArray + }; - // copy all edges (if not fully clustered, else there are no edges) - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; + /** + * + * retrieve the currently selected edges + * @return {Array} selection An array with the ids of the + * selected nodes. + */ + exports.getSelectedEdges = function() { + var idArray = []; + if (this.constants.selectable == true) { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + idArray.push(edgeId); + } } } - - // merge the nodeIndices - for (var i = 0; i < this.nodeIndices.length; i++) { - this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); - } + return idArray; }; /** - * This clusters the sector to one cluster. It was a single cluster before this process started so - * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. - * - * @private + * select zero or more nodes DEPRICATED + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. */ - exports._collapseThisToSingleCluster = function() { - this.clusterToFit(1,false); + exports.setSelection = function() { + console.log("setSelection is deprecated. Please use selectNodes instead.") }; /** - * We create a new active sector from the node that we want to open. - * - * @param node - * @private + * select zero or more nodes with the option to highlight edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + * @param {boolean} [highlightEdges] */ - exports._addSector = function(node) { - // this is the currently active sector - var sector = this._sector(); - - // // this should allow me to select nodes from a frozen set. - // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { - // console.log("the node is part of the active sector"); - // } - // else { - // console.log("I dont know what the fuck happened!!"); - // } - - // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. - delete this.nodes[node.id]; - - var unqiueIdentifier = util.randomUUID(); - - // we fully freeze the currently active sector - this._freezeSector(sector); + exports.selectNodes = function(selection, highlightEdges) { + var i, iMax, id; - // we create a new active sector. This sector has the Id of the node to ensure uniqueness - this._createNewSector(unqiueIdentifier); + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - // we add the active sector to the sectors array to be able to revert these steps later on - this._setActiveSector(unqiueIdentifier); + // first unselect any selected node + this._unselectAll(true); - // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier - this._switchToSector(this._sector()); + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; - // finally we add the node we removed from our previous active sector to the new active sector - this.nodes[node.id] = node; + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); + } + this._selectObject(node,true,true,highlightEdges,true); + } + this.redraw(); }; /** - * We close the sector that is currently open and revert back to the one before. - * If the active sector is the "default" sector, nothing happens. - * - * @private + * select zero or more edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. */ - exports._collapseSector = function() { - // the currently active sector - var sector = this._sector(); - - // we cannot collapse the default sector - if (sector != "default") { - if ((this.nodeIndices.length == 1) || - (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || - (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { - var previousSector = this._previousSector(); - - // we collapse the sector back to a single cluster - this._collapseThisToSingleCluster(); - - // we move the remaining nodes, edges and nodeIndices to the previous sector. - // This previous sector is the one we will reactivate - this._mergeThisWithFrozen(previousSector); - - // the previously active (frozen) sector now has all the data from the currently active sector. - // we can now delete the active sector. - this._deleteActiveSector(sector); - - // we activate the previously active (and currently frozen) sector. - this._activateSector(previousSector); + exports.selectEdges = function(selection) { + var i, iMax, id; - // we load the references from the newly active sector into the global references - this._switchToSector(previousSector); + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - // we forget the previously active sector because we reverted to the one before - this._forgetLastSector(); + // first unselect any selected node + this._unselectAll(true); - // finally, we update the node index list. - this._updateNodeIndexList(); + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; - // we refresh the list with calulation nodes and calculation node indices. - this._updateCalculationNodes(); + var edge = this.edges[id]; + if (!edge) { + throw new RangeError('Edge with id "' + id + '" not found'); } + this._selectObject(edge,true,true,false,true); } + this.redraw(); }; - /** - * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). - * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we dont pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction + * Validate the selection: remove ids of nodes which no longer exist * @private */ - exports._doInAllActiveSectors = function(runFunction,argument) { - var returnValues = []; - if (argument === undefined) { - for (var sector in this.sectors["active"]) { - if (this.sectors["active"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToActiveSector(sector); - returnValues.push( this[runFunction]() ); + exports._updateSelection = function () { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (!this.nodes.hasOwnProperty(nodeId)) { + delete this.selectionObj.nodes[nodeId]; } } } - else { - for (var sector in this.sectors["active"]) { - if (this.sectors["active"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToActiveSector(sector); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - returnValues.push( this[runFunction](args[0],args[1]) ); - } - else { - returnValues.push( this[runFunction](argument) ); - } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + if (!this.edges.hasOwnProperty(edgeId)) { + delete this.selectionObj.edges[edgeId]; } } } - // we revert the global references back to our active sector - this._loadLatestSector(); - return returnValues; }; +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Node = __webpack_require__(40); + var Edge = __webpack_require__(37); + /** - * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * clears the toolbar div element of children * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we dont pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._doInSupportSector = function(runFunction,argument) { - var returnValues = false; - if (argument === undefined) { - this._switchToSupportSector(); - returnValues = this[runFunction](); + exports._clearManipulatorBar = function() { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); } - else { - this._switchToSupportSector(); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - returnValues = this[runFunction](args[0],args[1]); - } - else { - returnValues = this[runFunction](argument); + this.manipulationDOM = {}; + + this._manipulationReleaseOverload = function () {}; + delete this.sectors['support']['nodes']['targetNode']; + delete this.sectors['support']['nodes']['targetViaNode']; + this.controlNodesActive = false; + }; + + /** + * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore + * these functions to their original functionality, we saved them in this.cachedFunctions. + * This function restores these functions to their original function. + * + * @private + */ + exports._restoreOverloadedFunctions = function() { + for (var functionName in this.cachedFunctions) { + if (this.cachedFunctions.hasOwnProperty(functionName)) { + this[functionName] = this.cachedFunctions[functionName]; } } - // we revert the global references back to our active sector - this._loadLatestSector(); - return returnValues; }; - /** - * This runs a function in all frozen sectors. This is used in the _redraw(). + * Enable or disable edit-mode. * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we don't pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._doInAllFrozenSectors = function(runFunction,argument) { - if (argument === undefined) { - for (var sector in this.sectors["frozen"]) { - if (this.sectors["frozen"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToFrozenSector(sector); - this[runFunction](); - } - } + exports._toggleEditMode = function() { + this.editMode = !this.editMode; + var toolbar = this.manipulationDiv; + var closeDiv = this.closeDiv; + var editModeDiv = this.editModeDiv; + if (this.editMode == true) { + toolbar.style.display="block"; + closeDiv.style.display="block"; + editModeDiv.style.display="none"; + closeDiv.onclick = this._toggleEditMode.bind(this); } else { - for (var sector in this.sectors["frozen"]) { - if (this.sectors["frozen"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToFrozenSector(sector); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); - } - else { - this[runFunction](argument); - } - } - } + toolbar.style.display="none"; + closeDiv.style.display="none"; + editModeDiv.style.display="block"; + closeDiv.onclick = null; } - this._loadLatestSector(); + this._createManipulatorBar() }; - /** - * This runs a function in all sectors. This is used in the _redraw(). + * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we don't pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._doInAllSectors = function(runFunction,argument) { - var args = Array.prototype.splice.call(arguments, 1); - if (argument === undefined) { - this._doInAllActiveSectors(runFunction); - this._doInAllFrozenSectors(runFunction); + exports._createManipulatorBar = function() { + // remove bound functions + if (this.boundFunction) { + this.off('select', this.boundFunction); } - else { - if (args.length > 1) { - this._doInAllActiveSectors(runFunction,args[0],args[1]); - this._doInAllFrozenSectors(runFunction,args[0],args[1]); + + var locale = this.constants.locales[this.constants.locale]; + + if (this.edgeBeingEdited !== undefined) { + this.edgeBeingEdited._disableControlNodes(); + this.edgeBeingEdited = undefined; + this.selectedControlNode = null; + this.controlNodesActive = false; + } + + // restore overloaded functions + this._restoreOverloadedFunctions(); + + // resume calculation + this.freezeSimulation = false; + + // reset global variables + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; + this.manipulationDOM = {}; + + if (this.editMode == true) { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); } - else { - this._doInAllActiveSectors(runFunction,argument); - this._doInAllFrozenSectors(runFunction,argument); + + this.manipulationDOM['addNodeSpan'] = document.createElement('span'); + this.manipulationDOM['addNodeSpan'].className = 'network-manipulationUI add'; + this.manipulationDOM['addNodeLabelSpan'] = document.createElement('span'); + this.manipulationDOM['addNodeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['addNodeLabelSpan'].innerHTML = locale['addNode']; + this.manipulationDOM['addNodeSpan'].appendChild(this.manipulationDOM['addNodeLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['addEdgeSpan'] = document.createElement('span'); + this.manipulationDOM['addEdgeSpan'].className = 'network-manipulationUI connect'; + this.manipulationDOM['addEdgeLabelSpan'] = document.createElement('span'); + this.manipulationDOM['addEdgeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['addEdgeLabelSpan'].innerHTML = locale['addEdge']; + this.manipulationDOM['addEdgeSpan'].appendChild(this.manipulationDOM['addEdgeLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['addNodeSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['addEdgeSpan']); + + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + this.manipulationDOM['seperatorLineDiv2'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv2'].className = 'network-seperatorLine'; + + this.manipulationDOM['editNodeSpan'] = document.createElement('span'); + this.manipulationDOM['editNodeSpan'].className = 'network-manipulationUI edit'; + this.manipulationDOM['editNodeLabelSpan'] = document.createElement('span'); + this.manipulationDOM['editNodeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['editNodeLabelSpan'].innerHTML = locale['editNode']; + this.manipulationDOM['editNodeSpan'].appendChild(this.manipulationDOM['editNodeLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv2']); + this.manipulationDiv.appendChild(this.manipulationDOM['editNodeSpan']); + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + this.manipulationDOM['seperatorLineDiv3'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv3'].className = 'network-seperatorLine'; + + this.manipulationDOM['editEdgeSpan'] = document.createElement('span'); + this.manipulationDOM['editEdgeSpan'].className = 'network-manipulationUI edit'; + this.manipulationDOM['editEdgeLabelSpan'] = document.createElement('span'); + this.manipulationDOM['editEdgeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['editEdgeLabelSpan'].innerHTML = locale['editEdge']; + this.manipulationDOM['editEdgeSpan'].appendChild(this.manipulationDOM['editEdgeLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv3']); + this.manipulationDiv.appendChild(this.manipulationDOM['editEdgeSpan']); + } + if (this._selectionIsEmpty() == false) { + this.manipulationDOM['seperatorLineDiv4'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv4'].className = 'network-seperatorLine'; + + this.manipulationDOM['deleteSpan'] = document.createElement('span'); + this.manipulationDOM['deleteSpan'].className = 'network-manipulationUI delete'; + this.manipulationDOM['deleteLabelSpan'] = document.createElement('span'); + this.manipulationDOM['deleteLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['deleteLabelSpan'].innerHTML = locale['del']; + this.manipulationDOM['deleteSpan'].appendChild(this.manipulationDOM['deleteLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv4']); + this.manipulationDiv.appendChild(this.manipulationDOM['deleteSpan']); + } + + + // bind the icons + this.manipulationDOM['addNodeSpan'].onclick = this._createAddNodeToolbar.bind(this); + this.manipulationDOM['addEdgeSpan'].onclick = this._createAddEdgeToolbar.bind(this); + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + this.manipulationDOM['editNodeSpan'].onclick = this._editNode.bind(this); + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + this.manipulationDOM['editEdgeSpan'].onclick = this._createEditEdgeToolbar.bind(this); + } + if (this._selectionIsEmpty() == false) { + this.manipulationDOM['deleteSpan'].onclick = this._deleteSelected.bind(this); + } + this.closeDiv.onclick = this._toggleEditMode.bind(this); + + this.boundFunction = this._createManipulatorBar.bind(this); + this.on('select', this.boundFunction); + } + else { + while (this.editModeDiv.hasChildNodes()) { + this.editModeDiv.removeChild(this.editModeDiv.firstChild); } + + this.manipulationDOM['editModeSpan'] = document.createElement('span'); + this.manipulationDOM['editModeSpan'].className = 'network-manipulationUI edit editmode'; + this.manipulationDOM['editModeLabelSpan'] = document.createElement('span'); + this.manipulationDOM['editModeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['editModeLabelSpan'].innerHTML = locale['edit']; + this.manipulationDOM['editModeSpan'].appendChild(this.manipulationDOM['editModeLabelSpan']); + + this.editModeDiv.appendChild(this.manipulationDOM['editModeSpan']); + + this.manipulationDOM['editModeSpan'].onclick = this._toggleEditMode.bind(this); } }; - /** - * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the - * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. - * - * @private - */ - exports._clearNodeIndexList = function() { - var sector = this._sector(); - this.sectors["active"][sector]["nodeIndices"] = []; - this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + + /** + * Create the toolbar for adding Nodes + * + * @private + */ + exports._createAddNodeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + if (this.boundFunction) { + this.off('select', this.boundFunction); + } + + var locale = this.constants.locales[this.constants.locale]; + + this.manipulationDOM = {}; + this.manipulationDOM['backSpan'] = document.createElement('span'); + this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; + this.manipulationDOM['backLabelSpan'] = document.createElement('span'); + this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; + this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['descriptionSpan'] = document.createElement('span'); + this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; + this.manipulationDOM['descriptionLabelSpan'] = document.createElement('span'); + this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['addDescription']; + this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + + // bind the icon + this.manipulationDOM['backSpan'].onclick = this._createManipulatorBar.bind(this); + + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + this.boundFunction = this._addNode.bind(this); + this.on('select', this.boundFunction); }; /** - * Draw the encompassing sector node + * create the toolbar to connect nodes * - * @param ctx - * @param sectorType * @private */ - exports._drawSectorNodes = function(ctx,sectorType) { - var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; - for (var sector in this.sectors[sectorType]) { - if (this.sectors[sectorType].hasOwnProperty(sector)) { - if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { + exports._createAddEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this._unselectAll(true); + this.freezeSimulation = true; - this._switchToSector(sector,sectorType); + var locale = this.constants.locales[this.constants.locale]; - minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.resize(ctx); - if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} - if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} - if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} - if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} - } - } - node = this.sectors[sectorType][sector]["drawingNode"]; - node.x = 0.5 * (maxX + minX); - node.y = 0.5 * (maxY + minY); - node.width = 2 * (node.x - minX); - node.height = 2 * (node.y - minY); - node.options.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); - node.setScale(this.scale); - node._drawCircle(ctx); - } - } + if (this.boundFunction) { + this.off('select', this.boundFunction); } - }; - exports._drawAllSectorNodes = function(ctx) { - this._drawSectorNodes(ctx,"frozen"); - this._drawSectorNodes(ctx,"active"); - this._loadLatestSector(); - }; + this._unselectAll(); + this.forceAppendSelection = false; + this.blockConnectingEdgeSelection = true; + + this.manipulationDOM = {}; + this.manipulationDOM['backSpan'] = document.createElement('span'); + this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; + this.manipulationDOM['backLabelSpan'] = document.createElement('span'); + this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; + this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; -/***/ }, -/* 66 */ -/***/ function(module, exports, __webpack_require__) { + this.manipulationDOM['descriptionSpan'] = document.createElement('span'); + this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; + this.manipulationDOM['descriptionLabelSpan'] = document.createElement('span'); + this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['edgeDescription']; + this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + + // bind the icon + this.manipulationDOM['backSpan'].onclick = this._createManipulatorBar.bind(this); + + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + this.boundFunction = this._handleConnect.bind(this); + this.on('select', this.boundFunction); - var Node = __webpack_require__(56); + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_manipulationReleaseOverload"] = this._manipulationReleaseOverload; + this.cachedFunctions["_handleDragStart"] = this._handleDragStart; + this.cachedFunctions["_handleDragEnd"] = this._handleDragEnd; + this._handleTouch = this._handleConnect; + this._manipulationReleaseOverload = function () {}; + this._handleDragStart = function () {}; + this._handleDragEnd = this._finishConnect; + + // redraw to show the unselect + this._redraw(); + }; /** - * This function can be called from the _doInAllSectors function + * create the toolbar to edit edges * - * @param object - * @param overlappingNodes * @private */ - exports._getNodesOverlappingWith = function(object, overlappingNodes) { - var nodes = this.nodes; - for (var nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - if (nodes[nodeId].isOverlappingWith(object)) { - overlappingNodes.push(nodeId); - } - } + exports._createEditEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this.controlNodesActive = true; + + if (this.boundFunction) { + this.off('select', this.boundFunction); } - }; - /** - * retrieve all nodes overlapping with given object - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes - * @private - */ - exports._getAllNodesOverlappingWith = function (object) { - var overlappingNodes = []; - this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); - return overlappingNodes; + this.edgeBeingEdited = this._getSelectedEdge(); + this.edgeBeingEdited._enableControlNodes(); + + var locale = this.constants.locales[this.constants.locale]; + + this.manipulationDOM = {}; + this.manipulationDOM['backSpan'] = document.createElement('span'); + this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; + this.manipulationDOM['backLabelSpan'] = document.createElement('span'); + this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; + this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['descriptionSpan'] = document.createElement('span'); + this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; + this.manipulationDOM['descriptionLabelSpan'] = document.createElement('span'); + this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['editEdgeDescription']; + this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + + // bind the icon + this.manipulationDOM['backSpan'].onclick = this._createManipulatorBar.bind(this); + + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_manipulationReleaseOverload"] = this._manipulationReleaseOverload; + this.cachedFunctions["_handleTap"] = this._handleTap; + this.cachedFunctions["_handleDragStart"] = this._handleDragStart; + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleTouch = this._selectControlNode; + this._handleTap = function () {}; + this._handleOnDrag = this._controlNodeDrag; + this._handleDragStart = function () {} + this._manipulationReleaseOverload = this._releaseControlNode; + + // redraw to show the unselect + this._redraw(); }; /** - * Return a position object in canvasspace from a single point in screenspace + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. * - * @param pointer - * @returns {{left: number, top: number, right: number, bottom: number}} * @private */ - exports._pointerToPositionObject = function(pointer) { - var x = this._XconvertDOMtoCanvas(pointer.x); - var y = this._YconvertDOMtoCanvas(pointer.y); - - return { - left: x, - top: y, - right: x, - bottom: y - }; + exports._selectControlNode = function(pointer) { + this.edgeBeingEdited.controlNodes.from.unselect(); + this.edgeBeingEdited.controlNodes.to.unselect(); + this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); + if (this.selectedControlNode !== null) { + this.selectedControlNode.select(); + this.freezeSimulation = true; + } + this._redraw(); }; /** - * Get the top node at the a specific point (like a click) + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. * - * @param {{x: Number, y: Number}} pointer - * @return {Node | null} node * @private */ - exports._getNodeAt = function (pointer) { - // we first check if this is an navigation controls element - var positionObject = this._pointerToPositionObject(pointer); - var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); + exports._controlNodeDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { + this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); + this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); + } + this._redraw(); + }; - // if there are overlapping nodes, select the last one, this is the - // one which is drawn on top of the others - if (overlappingNodes.length > 0) { - return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; + exports._releaseControlNode = function(pointer) { + var newNode = this._getNodeAt(pointer); + if (newNode != null) { + if (this.edgeBeingEdited.controlNodes.from.selected == true) { + this._editEdge(newNode.id, this.edgeBeingEdited.to.id); + this.edgeBeingEdited.controlNodes.from.unselect(); + } + if (this.edgeBeingEdited.controlNodes.to.selected == true) { + this._editEdge(this.edgeBeingEdited.from.id, newNode.id); + this.edgeBeingEdited.controlNodes.to.unselect(); + } } else { - return null; + this.edgeBeingEdited._restoreControlNodes(); } + this.freezeSimulation = false; + this._redraw(); }; - /** - * retrieve all edges overlapping with given object, selector is around center - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * * @private */ - exports._getEdgesOverlappingWith = function (object, overlappingEdges) { - var edges = this.edges; - for (var edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - if (edges[edgeId].isOverlappingWith(object)) { - overlappingEdges.push(edgeId); + exports._handleConnect = function(pointer) { + if (this._getSelectedNodeCount() == 0) { + var node = this._getNodeAt(pointer); + + if (node != null) { + if (node.clusterSize > 1) { + alert(this.constants.locales[this.constants.locale]['createEdgeError']) + } + else { + this._selectObject(node,false); + var supportNodes = this.sectors['support']['nodes']; + + // create a node the temporary line can look at + supportNodes['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); + var targetNode = supportNodes['targetNode']; + targetNode.x = node.x; + targetNode.y = node.y; + + // create a temporary edge + this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:targetNode.id}, this, this.constants); + var connectionEdge = this.edges['connectionEdge']; + connectionEdge.from = node; + connectionEdge.connected = true; + connectionEdge.options.smoothCurves = {enabled: true, + dynamic: false, + type: "continuous", + roundness: 0.5 + }; + connectionEdge.selected = true; + connectionEdge.to = targetNode; + + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleOnDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + var connectionEdge = this.edges['connectionEdge']; + connectionEdge.to.x = this._XconvertDOMtoCanvas(pointer.x); + connectionEdge.to.y = this._YconvertDOMtoCanvas(pointer.y); + }; + + this.moving = true; + this.start(); } } } }; + exports._finishConnect = function(event) { + if (this._getSelectedNodeCount() == 1) { + var pointer = this._getPointer(event.gesture.center); + // restore the drag function + this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; + delete this.cachedFunctions["_handleOnDrag"]; - /** - * retrieve all nodes overlapping with given object - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes - * @private - */ - exports._getAllEdgesOverlappingWith = function (object) { - var overlappingEdges = []; - this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); - return overlappingEdges; + // remember the edge id + var connectFromId = this.edges['connectionEdge'].fromId; + + // remove the temporary nodes and edge + delete this.edges['connectionEdge']; + delete this.sectors['support']['nodes']['targetNode']; + delete this.sectors['support']['nodes']['targetViaNode']; + + var node = this._getNodeAt(pointer); + if (node != null) { + if (node.clusterSize > 1) { + alert(this.constants.locales[this.constants.locale]["createEdgeError"]) + } + else { + this._createEdge(connectFromId,node.id); + this._createManipulatorBar(); + } + } + this._unselectAll(); + } }; + /** - * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call - * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. - * - * @param pointer - * @returns {null} - * @private + * Adds a node on the specified location */ - exports._getEdgeAt = function(pointer) { - var positionObject = this._pointerToPositionObject(pointer); - var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); - - if (overlappingEdges.length > 0) { - return this.edges[overlappingEdges[overlappingEdges.length - 1]]; - } - else { - return null; + exports._addNode = function() { + if (this._selectionIsEmpty() && this.editMode == true) { + var positionObject = this._pointerToPositionObject(this.pointerPosition); + var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; + if (this.triggerFunctions.add) { + if (this.triggerFunctions.add.length == 2) { + var me = this; + this.triggerFunctions.add(defaultData, function(finalizedData) { + me.nodesData.add(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for add does not support two arguments (data,callback)'); + this._createManipulatorBar(); + this.moving = true; + this.start(); + } + } + else { + this.nodesData.add(defaultData); + this._createManipulatorBar(); + this.moving = true; + this.start(); + } } }; /** - * Add object to the selection array. + * connect two nodes with a new edge. * - * @param obj * @private */ - exports._addToSelection = function(obj) { - if (obj instanceof Node) { - this.selectionObj.nodes[obj.id] = obj; - } - else { - this.selectionObj.edges[obj.id] = obj; + exports._createEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.connect) { + if (this.triggerFunctions.connect.length == 2) { + var me = this; + this.triggerFunctions.connect(defaultData, function(finalizedData) { + me.edgesData.add(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for connect does not support two arguments (data,callback)'); + this.moving = true; + this.start(); + } + } + else { + this.edgesData.add(defaultData); + this.moving = true; + this.start(); + } } }; /** - * Add object to the selection array. + * connect two nodes with a new edge. * - * @param obj * @private */ - exports._addToHover = function(obj) { - if (obj instanceof Node) { - this.hoverObj.nodes[obj.id] = obj; - } - else { - this.hoverObj.edges[obj.id] = obj; + exports._editEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.editEdge) { + if (this.triggerFunctions.editEdge.length == 2) { + var me = this; + this.triggerFunctions.editEdge(defaultData, function(finalizedData) { + me.edgesData.update(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for edit does not support two arguments (data, callback)'); + this.moving = true; + this.start(); + } + } + else { + this.edgesData.update(defaultData); + this.moving = true; + this.start(); + } } }; - /** - * Remove a single option from selection. + * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. * - * @param {Object} obj * @private */ - exports._removeFromSelection = function(obj) { - if (obj instanceof Node) { - delete this.selectionObj.nodes[obj.id]; + exports._editNode = function() { + if (this.triggerFunctions.edit && this.editMode == true) { + var node = this._getSelectedNode(); + var data = {id:node.id, + label: node.label, + group: node.options.group, + shape: node.options.shape, + color: { + background:node.options.color.background, + border:node.options.color.border, + highlight: { + background:node.options.color.highlight.background, + border:node.options.color.highlight.border + } + }}; + if (this.triggerFunctions.edit.length == 2) { + var me = this; + this.triggerFunctions.edit(data, function (finalizedData) { + me.nodesData.update(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for edit does not support two arguments (data, callback)'); + } } else { - delete this.selectionObj.edges[obj.id]; + throw new Error('No edit function has been bound to this button'); } }; + + + /** - * Unselect all. The selectionObj is useful for this. + * delete everything in the selection * - * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._unselectAll = function(doNotTrigger) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - this.selectionObj.nodes[nodeId].unselect(); + exports._deleteSelected = function() { + if (!this._selectionIsEmpty() && this.editMode == true) { + if (!this._clusterInSelection()) { + var selectedNodes = this.getSelectedNodes(); + var selectedEdges = this.getSelectedEdges(); + if (this.triggerFunctions.del) { + var me = this; + var data = {nodes: selectedNodes, edges: selectedEdges}; + if (this.triggerFunctions.del.length = 2) { + this.triggerFunctions.del(data, function (finalizedData) { + me.edgesData.remove(finalizedData.edges); + me.nodesData.remove(finalizedData.nodes); + me._unselectAll(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for delete does not support two arguments (data, callback)') + } + } + else { + this.edgesData.remove(selectedEdges); + this.nodesData.remove(selectedNodes); + this._unselectAll(); + this.moving = true; + this.start(); + } } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - this.selectionObj.edges[edgeId].unselect(); + else { + alert(this.constants.locales[this.constants.locale]["deleteClusterError"]); } } + }; - this.selectionObj = {nodes:{},edges:{}}; - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); - } - }; +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { - /** - * Unselect all clusters. The selectionObj is useful for this. - * - * @param {Boolean} [doNotTrigger] | ignore trigger - * @private - */ - exports._unselectClusters = function(doNotTrigger) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } + var util = __webpack_require__(1); + var Hammer = __webpack_require__(45); - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (this.selectionObj.nodes[nodeId].clusterSize > 1) { - this.selectionObj.nodes[nodeId].unselect(); - this._removeFromSelection(this.selectionObj.nodes[nodeId]); - } + exports._cleanNavigation = function() { + // clean hammer bindings + if (this.navigationHammers.existing.length != 0) { + for (var i = 0; i < this.navigationHammers.existing.length; i++) { + this.navigationHammers.existing[i].dispose(); } + this.navigationHammers.existing = []; } - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); + this._navigationReleaseOverload = function () {}; + + // clean up previous navigation items + if (this.navigationDivs && this.navigationDivs['wrapper'] && this.navigationDivs['wrapper'].parentNode) { + this.navigationDivs['wrapper'].parentNode.removeChild(this.navigationDivs['wrapper']); } }; - /** - * return the number of selected nodes + * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation + * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent + * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. + * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. * - * @returns {number} * @private */ - exports._getSelectedNodeCount = function() { - var count = 0; - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - count += 1; - } + exports._loadNavigationElements = function() { + this._cleanNavigation(); + + this.navigationDivs = {}; + var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; + var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','_zoomExtent']; + + this.navigationDivs['wrapper'] = document.createElement('div'); + this.frame.appendChild(this.navigationDivs['wrapper']); + + for (var i = 0; i < navigationDivs.length; i++) { + this.navigationDivs[navigationDivs[i]] = document.createElement('div'); + this.navigationDivs[navigationDivs[i]].className = 'network-navigation ' + navigationDivs[i]; + this.navigationDivs['wrapper'].appendChild(this.navigationDivs[navigationDivs[i]]); + + var hammer = Hammer(this.navigationDivs[navigationDivs[i]], {prevent_default: true}); + hammer.on('touch', this[navigationDivActions[i]].bind(this)); + this.navigationHammers.new.push(hammer); } - return count; + + this._navigationReleaseOverload = this._stopMovement; + + this.navigationHammers.existing = this.navigationHammers.new; }; + /** - * return the selected node + * this stops all movement induced by the navigation buttons * - * @returns {number} * @private */ - exports._getSelectedNode = function() { - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - return this.selectionObj.nodes[nodeId]; - } - } - return null; + exports._zoomExtent = function(event) { + this.zoomExtent({duration:700}); + event.stopPropagation(); }; /** - * return the selected edge + * this stops all movement induced by the navigation buttons * - * @returns {number} * @private */ - exports._getSelectedEdge = function() { - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - return this.selectionObj.edges[edgeId]; - } - } - return null; + exports._stopMovement = function() { + this._xStopMoving(); + this._yStopMoving(); + this._stopZoom(); }; /** - * return the number of selected edges + * move the screen up + * By using the increments, instead of adding a fixed number to the translation, we keep fluent and + * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently + * To avoid this behaviour, we do the translation in the start loop. * - * @returns {number} * @private */ - exports._getSelectedEdgeCount = function() { - var count = 0; - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - count += 1; - } - } - return count; + exports._moveUp = function(event) { + this.yIncrement = this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; /** - * return the number of selected objects. - * - * @returns {number} + * move the screen down * @private */ - exports._getSelectedObjectCount = function() { - var count = 0; - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - count += 1; - } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - count += 1; - } - } - return count; + exports._moveDown = function(event) { + this.yIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; + /** - * Check if anything is selected - * - * @returns {boolean} + * move the screen left * @private */ - exports._selectionIsEmpty = function() { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - return false; - } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - return false; - } - } - return true; + exports._moveLeft = function(event) { + this.xIncrement = this.constants.keyboard.speed.x; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; /** - * check if one of the selected nodes is a cluster. - * - * @returns {boolean} + * move the screen right * @private */ - exports._clusterInSelection = function() { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (this.selectionObj.nodes[nodeId].clusterSize > 1) { - return true; - } - } - } - return false; + exports._moveRight = function(event) { + this.xIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; + /** - * select the edges connected to the node that is being selected - * - * @param {Node} node + * Zoom in, using the same method as the movement. * @private */ - exports._selectConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.select(); - this._addToSelection(edge); - } + exports._zoomIn = function(event) { + this.zoomIncrement = this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; + /** - * select the edges connected to the node that is being selected - * - * @param {Node} node + * Zoom out * @private */ - exports._hoverConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.hover = true; - this._addToHover(edge); - } + exports._zoomOut = function(event) { + this.zoomIncrement = -this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); }; /** - * unselect the edges connected to the node that is being selected - * - * @param {Node} node + * Stop zooming and unhighlight the zoom controls * @private */ - exports._unselectConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.unselect(); - this._removeFromSelection(edge); - } + exports._stopZoom = function(event) { + this.zoomIncrement = 0; + event && event.preventDefault(); }; - - /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection - * - * @param {Node || Edge} object - * @param {Boolean} append - * @param {Boolean} [doNotTrigger] | ignore trigger + * Stop moving in the Y direction and unHighlight the up and down * @private */ - exports._selectObject = function(object, append, doNotTrigger, highlightEdges, overrideSelectable) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } - if (highlightEdges === undefined) { - highlightEdges = true; - } - - if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { - this._unselectAll(true); - } - - // selectable allows the object to be selected. Override can be used if needed to bypass this. - if (object.selected == false && (this.constants.selectable == true || overrideSelectable)) { - object.select(); - this._addToSelection(object); - if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { - this._selectConnectedEdges(object); - } - } - // do not select the object if selectable is false, only add it to selection to allow drag to work - else if (object.selected == false) { - this._addToSelection(object); - doNotTrigger = true; - } - else { - object.unselect(); - this._removeFromSelection(object); - } - - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); - } + exports._yStopMoving = function(event) { + this.yIncrement = 0; + event && event.preventDefault(); }; /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection - * - * @param {Node || Edge} object + * Stop moving in the X direction and unHighlight left and right. * @private */ - exports._blurObject = function(object) { - if (object.hover == true) { - object.hover = false; - this.emit("blurNode",{node:object.id}); - } + exports._xStopMoving = function(event) { + this.xIncrement = 0; + event && event.preventDefault(); }; - /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection - * - * @param {Node || Edge} object - * @private - */ - exports._hoverObject = function(object) { - if (object.hover == false) { - object.hover = true; - this._addToHover(object); - if (object instanceof Node) { - this.emit("hoverNode",{node:object.id}); + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + exports._resetLevels = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.preassignedLevel == false) { + node.level = -1; + node.hierarchyEnumerated = false; + } } } - if (object instanceof Node) { - this._hoverConnectedEdges(object); - } }; - /** - * handles the selection part of the touch, only for navigation controls elements; - * Touch is triggered before tap, also before hold. Hold triggers after a while. - * This is the most responsive solution + * This is the main function to layout the nodes in a hierarchical way. + * It checks if the node details are supplied correctly * - * @param {Object} pointer * @private */ - exports._handleTouch = function(pointer) { - }; + exports._setupHierarchicalLayout = function() { + if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { + if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "DU") { + this.constants.hierarchicalLayout.levelSeparation *= -1; + } + else { + this.constants.hierarchicalLayout.levelSeparation = Math.abs(this.constants.hierarchicalLayout.levelSeparation); + } + + if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "LR") { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "vertical"; + } + } + else { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "horizontal"; + } + } + // get the size of the largest hubs and check if the user has defined a level for a node. + var hubsize = 0; + var node, nodeId; + var definedLevel = false; + var undefinedLevel = false; + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level != -1) { + definedLevel = true; + } + else { + undefinedLevel = true; + } + if (hubsize < node.edges.length) { + hubsize = node.edges.length; + } + } + } - /** - * handles the selection part of the tap; - * - * @param {Object} pointer - * @private - */ - exports._handleTap = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null) { - this._selectObject(node, false); - } - else { - var edge = this._getEdgeAt(pointer); - if (edge != null) { - this._selectObject(edge, false); + // if the user defined some levels but not all, alert and run without hierarchical layout + if (undefinedLevel == true && definedLevel == true) { + throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); + this.zoomExtent(undefined,true,this.constants.clustering.enabled); + if (!this.constants.clustering.enabled) { + this.start(); + } } else { - this._unselectAll(); + // setup the system to use hierarchical method. + this._changeConstants(); + + // define levels if undefined by the users. Based on hubsize + if (undefinedLevel == true) { + if (this.constants.hierarchicalLayout.layout == "hubsize") { + this._determineLevels(hubsize); + } + else { + this._determineLevelsDirected(); + } + + } + // check the distribution of the nodes per level. + var distribution = this._getDistribution(); + + // place the nodes on the canvas. This also stablilizes the system. + this._placeNodesByHierarchy(distribution); + + // start the simulation. + this.start(); } } - var properties = this.getSelection(); - properties['pointer'] = { - DOM: {x: pointer.x, y: pointer.y}, - canvas: {x: this._XconvertDOMtoCanvas(pointer.x), y: this._YconvertDOMtoCanvas(pointer.y)} - } - this.emit("click", properties); - this._redraw(); }; /** - * handles the selection part of the double tap and opens a cluster if needed + * This function places the nodes on the canvas based on the hierarchial distribution. * - * @param {Object} pointer + * @param {Object} distribution | obtained by the function this._getDistribution() * @private */ - exports._handleDoubleTap = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null && node !== undefined) { - // we reset the areaCenter here so the opening of the node will occur - this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), - "y" : this._YconvertDOMtoCanvas(pointer.y)}; - this.openCluster(node); - } - var properties = this.getSelection(); - properties['pointer'] = { - DOM: {x: pointer.x, y: pointer.y}, - canvas: {x: this._XconvertDOMtoCanvas(pointer.x), y: this._YconvertDOMtoCanvas(pointer.y)} + exports._placeNodesByHierarchy = function(distribution) { + var nodeId, node; + + // start placing all the level 0 nodes first. Then recursively position their branches. + for (var level in distribution) { + if (distribution.hasOwnProperty(level)) { + + for (nodeId in distribution[level].nodes) { + if (distribution[level].nodes.hasOwnProperty(nodeId)) { + node = distribution[level].nodes[nodeId]; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (node.xFixed) { + node.x = distribution[level].minPos; + node.xFixed = false; + + distribution[level].minPos += distribution[level].nodeSpacing; + } + } + else { + if (node.yFixed) { + node.y = distribution[level].minPos; + node.yFixed = false; + + distribution[level].minPos += distribution[level].nodeSpacing; + } + } + this._placeBranchNodes(node.edges,node.id,distribution,node.level); + } + } + } } - this.emit("doubleClick", properties); + + // stabilize the system after positioning. This function calls zoomExtent. + this._stabilize(); }; /** - * Handle the onHold selection part + * This function get the distribution of levels based on hubsize * - * @param pointer + * @returns {Object} * @private */ - exports._handleOnHold = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null) { - this._selectObject(node,true); + exports._getDistribution = function() { + var distribution = {}; + var nodeId, node, level; + + // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. + // the fix of X is removed after the x value has been set. + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.xFixed = true; + node.yFixed = true; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; + } + else { + node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; + } + if (distribution[node.level] === undefined) { + distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; + } + distribution[node.level].amount += 1; + distribution[node.level].nodes[nodeId] = node; + } } - else { - var edge = this._getEdgeAt(pointer); - if (edge != null) { - this._selectObject(edge,true); + + // determine the largest amount of nodes of all levels + var maxCount = 0; + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + if (maxCount < distribution[level].amount) { + maxCount = distribution[level].amount; + } } } - this._redraw(); - }; + // set the initial position and spacing of each nodes accordingly + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; + distribution[level].nodeSpacing /= (distribution[level].amount + 1); + distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + } + } - /** - * handle the onRelease event. These functions are here for the navigation controls module - * and data manipulation module. - * - * @private - */ - exports._handleOnRelease = function(pointer) { - this._manipulationReleaseOverload(pointer); - this._navigationReleaseOverload(pointer); + return distribution; }; - exports._manipulationReleaseOverload = function (pointer) {}; - exports._navigationReleaseOverload = function (pointer) {}; /** + * this function allocates nodes in levels based on the recursive branching from the largest hubs. * - * retrieve the currently selected objects - * @return {{nodes: Array., edges: Array.}} selection + * @param hubsize + * @private */ - exports.getSelection = function() { - var nodeIds = this.getSelectedNodes(); - var edgeIds = this.getSelectedEdges(); - return {nodes:nodeIds, edges:edgeIds}; - }; + exports._determineLevels = function(hubsize) { + var nodeId, node; - /** - * - * retrieve the currently selected nodes - * @return {String[]} selection An array with the ids of the - * selected nodes. - */ - exports.getSelectedNodes = function() { - var idArray = []; - if (this.constants.selectable == true) { - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - idArray.push(nodeId); + // determine hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.edges.length == hubsize) { + node.level = 0; } } } - return idArray - }; - /** - * - * retrieve the currently selected edges - * @return {Array} selection An array with the ids of the - * selected nodes. - */ - exports.getSelectedEdges = function() { - var idArray = []; - if (this.constants.selectable == true) { - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - idArray.push(edgeId); + // branch from hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level == 0) { + this._setLevel(1,node.edges,node.id); } } } - return idArray; }; - /** - * select zero or more nodes DEPRICATED - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. + * this function allocates nodes in levels based on the recursive branching from the largest hubs. + * + * @param hubsize + * @private */ - exports.setSelection = function() { - console.log("setSelection is deprecated. Please use selectNodes instead.") - }; - + exports._determineLevelsDirected = function() { + var nodeId, node; - /** - * select zero or more nodes with the option to highlight edges - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. - * @param {boolean} [highlightEdges] - */ - exports.selectNodes = function(selection, highlightEdges) { - var i, iMax, id; + // set first node to source + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.nodes[nodeId].level = 10000; + break; + } + } - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; + // branch from hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level == 10000) { + this._setLevelDirected(10000,node.edges,node.id); + } + } + } - // first unselect any selected node - this._unselectAll(true); - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + // branch from hubs + var minLevel = 10000; + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + minLevel = node.level < minLevel ? node.level : minLevel; + } + } - var node = this.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); + // branch from hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.level -= minLevel; } - this._selectObject(node,true,true,highlightEdges,true); } - this.redraw(); }; /** - * select zero or more edges - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. + * Since hierarchical layout does not support: + * - smooth curves (based on the physics), + * - clustering (based on dynamic node counts) + * + * We disable both features so there will be no problems. + * + * @private */ - exports.selectEdges = function(selection) { - var i, iMax, id; + exports._changeConstants = function() { + this.constants.clustering.enabled = false; + this.constants.physics.barnesHut.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this._loadSelectedForceSolver(); + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.dynamic = false; + } + this._configureSmoothCurves(); + }; - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; - // first unselect any selected node - this._unselectAll(true); + /** + * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes + * on a X position that ensures there will be no overlap. + * + * @param edges + * @param parentId + * @param distribution + * @param parentLevel + * @private + */ + exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + } + else { + childNode = edges[i].to; + } - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. + var nodeMoved = false; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (childNode.xFixed && childNode.level > parentLevel) { + childNode.xFixed = false; + childNode.x = distribution[childNode.level].minPos; + nodeMoved = true; + } + } + else { + if (childNode.yFixed && childNode.level > parentLevel) { + childNode.yFixed = false; + childNode.y = distribution[childNode.level].minPos; + nodeMoved = true; + } + } - var edge = this.edges[id]; - if (!edge) { - throw new RangeError('Edge with id "' + id + '" not found'); + if (nodeMoved == true) { + distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; + if (childNode.edges.length > 1) { + this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); + } } - this._selectObject(edge,true,true,false,true); } - this.redraw(); }; + /** - * Validate the selection: remove ids of nodes which no longer exist + * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. + * + * @param level + * @param edges + * @param parentId * @private */ - exports._updateSelection = function () { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (!this.nodes.hasOwnProperty(nodeId)) { - delete this.selectionObj.nodes[nodeId]; - } + exports._setLevel = function(level, edges, parentId) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - if (!this.edges.hasOwnProperty(edgeId)) { - delete this.selectionObj.edges[edgeId]; + else { + childNode = edges[i].to; + } + if (childNode.level == -1 || childNode.level > level) { + childNode.level = level; + if (childNode.edges.length > 1) { + this._setLevel(level+1, childNode.edges, childNode.id); } } } }; -/***/ }, -/* 67 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Node = __webpack_require__(56); - var Edge = __webpack_require__(57); - /** - * clears the toolbar div element of children + * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. * + * @param level + * @param edges + * @param parentId * @private */ - exports._clearManipulatorBar = function() { - while (this.manipulationDiv.hasChildNodes()) { - this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); + exports._setLevelDirected = function(level, edges, parentId) { + this.nodes[parentId].hierarchyEnumerated = true; + for (var i = 0; i < edges.length; i++) { + var childNode = null; + var direction = 1; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + direction = -1; + } + else { + childNode = edges[i].to; + } + if (childNode.level == -1) { + childNode.level = level + direction; + } } - this.manipulationDOM = {}; - this._manipulationReleaseOverload = function () {}; - delete this.sectors['support']['nodes']['targetNode']; - delete this.sectors['support']['nodes']['targetViaNode']; - this.controlNodesActive = false; + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) {childNode = edges[i].from;} + else {childNode = edges[i].to;} + if (childNode.edges.length > 1 && childNode.hierarchyEnumerated === false) { + this._setLevelDirected(childNode.level, childNode.edges, childNode.id); + } + } }; + /** - * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore - * these functions to their original functionality, we saved them in this.cachedFunctions. - * This function restores these functions to their original function. + * Unfix nodes * * @private */ - exports._restoreOverloadedFunctions = function() { - for (var functionName in this.cachedFunctions) { - if (this.cachedFunctions.hasOwnProperty(functionName)) { - this[functionName] = this.cachedFunctions[functionName]; + exports._restoreNodes = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.nodes[nodeId].xFixed = false; + this.nodes[nodeId].yFixed = false; } } }; + +/***/ }, +/* 66 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var RepulsionMixin = __webpack_require__(68); + var HierarchialRepulsionMixin = __webpack_require__(69); + var BarnesHutMixin = __webpack_require__(70); + /** - * Enable or disable edit-mode. + * Toggling barnes Hut calculation on and off. * * @private */ - exports._toggleEditMode = function() { - this.editMode = !this.editMode; - var toolbar = this.manipulationDiv; - var closeDiv = this.closeDiv; - var editModeDiv = this.editModeDiv; - if (this.editMode == true) { - toolbar.style.display="block"; - closeDiv.style.display="block"; - editModeDiv.style.display="none"; - closeDiv.onclick = this._toggleEditMode.bind(this); - } - else { - toolbar.style.display="none"; - closeDiv.style.display="none"; - editModeDiv.style.display="block"; - closeDiv.onclick = null; - } - this._createManipulatorBar() + exports._toggleBarnesHut = function () { + this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; + this._loadSelectedForceSolver(); + this.moving = true; + this.start(); }; + /** - * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. + * This loads the node force solver based on the barnes hut or repulsion algorithm * * @private */ - exports._createManipulatorBar = function() { - // remove bound functions - if (this.boundFunction) { - this.off('select', this.boundFunction); - } + exports._loadSelectedForceSolver = function () { + // this overloads the this._calculateNodeForces + if (this.constants.physics.barnesHut.enabled == true) { + this._clearMixin(RepulsionMixin); + this._clearMixin(HierarchialRepulsionMixin); - var locale = this.constants.locales[this.constants.locale]; + this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; + this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; + this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; + this.constants.physics.damping = this.constants.physics.barnesHut.damping; - if (this.edgeBeingEdited !== undefined) { - this.edgeBeingEdited._disableControlNodes(); - this.edgeBeingEdited = undefined; - this.selectedControlNode = null; - this.controlNodesActive = false; + this._loadMixin(BarnesHutMixin); } + else if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._clearMixin(BarnesHutMixin); + this._clearMixin(RepulsionMixin); - // restore overloaded functions - this._restoreOverloadedFunctions(); - - // resume calculation - this.freezeSimulation = false; - - // reset global variables - this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false; - this.manipulationDOM = {}; - - if (this.editMode == true) { - while (this.manipulationDiv.hasChildNodes()) { - this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); - } - - this.manipulationDOM['addNodeSpan'] = document.createElement('span'); - this.manipulationDOM['addNodeSpan'].className = 'network-manipulationUI add'; - this.manipulationDOM['addNodeLabelSpan'] = document.createElement('span'); - this.manipulationDOM['addNodeLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['addNodeLabelSpan'].innerHTML = locale['addNode']; - this.manipulationDOM['addNodeSpan'].appendChild(this.manipulationDOM['addNodeLabelSpan']); - - this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; - - this.manipulationDOM['addEdgeSpan'] = document.createElement('span'); - this.manipulationDOM['addEdgeSpan'].className = 'network-manipulationUI connect'; - this.manipulationDOM['addEdgeLabelSpan'] = document.createElement('span'); - this.manipulationDOM['addEdgeLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['addEdgeLabelSpan'].innerHTML = locale['addEdge']; - this.manipulationDOM['addEdgeSpan'].appendChild(this.manipulationDOM['addEdgeLabelSpan']); + this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; + this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; - this.manipulationDiv.appendChild(this.manipulationDOM['addNodeSpan']); - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); - this.manipulationDiv.appendChild(this.manipulationDOM['addEdgeSpan']); + this._loadMixin(HierarchialRepulsionMixin); + } + else { + this._clearMixin(BarnesHutMixin); + this._clearMixin(HierarchialRepulsionMixin); + this.barnesHutTree = undefined; - if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { - this.manipulationDOM['seperatorLineDiv2'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv2'].className = 'network-seperatorLine'; + this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.repulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; + this.constants.physics.damping = this.constants.physics.repulsion.damping; - this.manipulationDOM['editNodeSpan'] = document.createElement('span'); - this.manipulationDOM['editNodeSpan'].className = 'network-manipulationUI edit'; - this.manipulationDOM['editNodeLabelSpan'] = document.createElement('span'); - this.manipulationDOM['editNodeLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['editNodeLabelSpan'].innerHTML = locale['editNode']; - this.manipulationDOM['editNodeSpan'].appendChild(this.manipulationDOM['editNodeLabelSpan']); + this._loadMixin(RepulsionMixin); + } + }; - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv2']); - this.manipulationDiv.appendChild(this.manipulationDOM['editNodeSpan']); + /** + * Before calculating the forces, we check if we need to cluster to keep up performance and we check + * if there is more than one node. If it is just one node, we dont calculate anything. + * + * @private + */ + exports._initializeForceCalculation = function () { + // stop calculation if there is only one node + if (this.nodeIndices.length == 1) { + this.nodes[this.nodeIndices[0]]._setForce(0, 0); + } + else { + // if there are too many nodes on screen, we cluster without repositioning + if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { + this.clusterToFit(this.constants.clustering.reduceToNodes, false); } - else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { - this.manipulationDOM['seperatorLineDiv3'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv3'].className = 'network-seperatorLine'; - - this.manipulationDOM['editEdgeSpan'] = document.createElement('span'); - this.manipulationDOM['editEdgeSpan'].className = 'network-manipulationUI edit'; - this.manipulationDOM['editEdgeLabelSpan'] = document.createElement('span'); - this.manipulationDOM['editEdgeLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['editEdgeLabelSpan'].innerHTML = locale['editEdge']; - this.manipulationDOM['editEdgeSpan'].appendChild(this.manipulationDOM['editEdgeLabelSpan']); - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv3']); - this.manipulationDiv.appendChild(this.manipulationDOM['editEdgeSpan']); - } - if (this._selectionIsEmpty() == false) { - this.manipulationDOM['seperatorLineDiv4'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv4'].className = 'network-seperatorLine'; + // we now start the force calculation + this._calculateForces(); + } + }; - this.manipulationDOM['deleteSpan'] = document.createElement('span'); - this.manipulationDOM['deleteSpan'].className = 'network-manipulationUI delete'; - this.manipulationDOM['deleteLabelSpan'] = document.createElement('span'); - this.manipulationDOM['deleteLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['deleteLabelSpan'].innerHTML = locale['del']; - this.manipulationDOM['deleteSpan'].appendChild(this.manipulationDOM['deleteLabelSpan']); - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv4']); - this.manipulationDiv.appendChild(this.manipulationDOM['deleteSpan']); - } + /** + * Calculate the external forces acting on the nodes + * Forces are caused by: edges, repulsing forces between nodes, gravity + * @private + */ + exports._calculateForces = function () { + // Gravity is required to keep separated groups from floating off + // the forces are reset to zero in this loop by using _setForce instead + // of _addForce + this._calculateGravitationalForces(); + this._calculateNodeForces(); - // bind the icons - this.manipulationDOM['addNodeSpan'].onclick = this._createAddNodeToolbar.bind(this); - this.manipulationDOM['addEdgeSpan'].onclick = this._createAddEdgeToolbar.bind(this); - if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { - this.manipulationDOM['editNodeSpan'].onclick = this._editNode.bind(this); - } - else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { - this.manipulationDOM['editEdgeSpan'].onclick = this._createEditEdgeToolbar.bind(this); - } - if (this._selectionIsEmpty() == false) { - this.manipulationDOM['deleteSpan'].onclick = this._deleteSelected.bind(this); + if (this.constants.physics.springConstant > 0) { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._calculateSpringForcesWithSupport(); } - this.closeDiv.onclick = this._toggleEditMode.bind(this); - - this.boundFunction = this._createManipulatorBar.bind(this); - this.on('select', this.boundFunction); - } - else { - while (this.editModeDiv.hasChildNodes()) { - this.editModeDiv.removeChild(this.editModeDiv.firstChild); + else { + if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._calculateHierarchicalSpringForces(); + } + else { + this._calculateSpringForces(); + } } - - this.manipulationDOM['editModeSpan'] = document.createElement('span'); - this.manipulationDOM['editModeSpan'].className = 'network-manipulationUI edit editmode'; - this.manipulationDOM['editModeLabelSpan'] = document.createElement('span'); - this.manipulationDOM['editModeLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['editModeLabelSpan'].innerHTML = locale['edit']; - this.manipulationDOM['editModeSpan'].appendChild(this.manipulationDOM['editModeLabelSpan']); - - this.editModeDiv.appendChild(this.manipulationDOM['editModeSpan']); - - this.manipulationDOM['editModeSpan'].onclick = this._toggleEditMode.bind(this); } }; - /** - * Create the toolbar for adding Nodes + * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also + * handled in the calculateForces function. We then use a quadratic curve with the center node as control. + * This function joins the datanodes and invisible (called support) nodes into one object. + * We do this so we do not contaminate this.nodes with the support nodes. * * @private */ - exports._createAddNodeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - if (this.boundFunction) { - this.off('select', this.boundFunction); - } - - var locale = this.constants.locales[this.constants.locale]; - - this.manipulationDOM = {}; - this.manipulationDOM['backSpan'] = document.createElement('span'); - this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; - this.manipulationDOM['backLabelSpan'] = document.createElement('span'); - this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; - this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); - - this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; - - this.manipulationDOM['descriptionSpan'] = document.createElement('span'); - this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; - this.manipulationDOM['descriptionLabelSpan'] = document.createElement('span'); - this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['addDescription']; - this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); - - this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); - this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + exports._updateCalculationNodes = function () { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this.calculationNodes = {}; + this.calculationNodeIndices = []; - // bind the icon - this.manipulationDOM['backSpan'].onclick = this._createManipulatorBar.bind(this); + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId] = this.nodes[nodeId]; + } + } + var supportNodes = this.sectors['support']['nodes']; + for (var supportNodeId in supportNodes) { + if (supportNodes.hasOwnProperty(supportNodeId)) { + if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { + this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; + } + else { + supportNodes[supportNodeId]._setForce(0, 0); + } + } + } - // we use the boundFunction so we can reference it when we unbind it from the "select" event. - this.boundFunction = this._addNode.bind(this); - this.on('select', this.boundFunction); + for (var idx in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(idx)) { + this.calculationNodeIndices.push(idx); + } + } + } + else { + this.calculationNodes = this.nodes; + this.calculationNodeIndices = this.nodeIndices; + } }; /** - * create the toolbar to connect nodes + * this function applies the central gravity effect to keep groups from floating off * * @private */ - exports._createAddEdgeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - this._unselectAll(true); - this.freezeSimulation = true; + exports._calculateGravitationalForces = function () { + var dx, dy, distance, node, i; + var nodes = this.calculationNodes; + var gravity = this.constants.physics.centralGravity; + var gravityForce = 0; - var locale = this.constants.locales[this.constants.locale]; + for (i = 0; i < this.calculationNodeIndices.length; i++) { + node = nodes[this.calculationNodeIndices[i]]; + node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. + // gravity does not apply when we are in a pocket sector + if (this._sector() == "default" && gravity != 0) { + dx = -node.x; + dy = -node.y; + distance = Math.sqrt(dx * dx + dy * dy); - if (this.boundFunction) { - this.off('select', this.boundFunction); + gravityForce = (distance == 0) ? 0 : (gravity / distance); + node.fx = dx * gravityForce; + node.fy = dy * gravityForce; + } + else { + node.fx = 0; + node.fy = 0; + } } + }; - this._unselectAll(); - this.forceAppendSelection = false; - this.blockConnectingEdgeSelection = true; - - this.manipulationDOM = {}; - this.manipulationDOM['backSpan'] = document.createElement('span'); - this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; - this.manipulationDOM['backLabelSpan'] = document.createElement('span'); - this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; - this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); - - this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; - - this.manipulationDOM['descriptionSpan'] = document.createElement('span'); - this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; - this.manipulationDOM['descriptionLabelSpan'] = document.createElement('span'); - this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['edgeDescription']; - this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); - - this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); - this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); - - // bind the icon - this.manipulationDOM['backSpan'].onclick = this._createManipulatorBar.bind(this); - - // we use the boundFunction so we can reference it when we unbind it from the "select" event. - this.boundFunction = this._handleConnect.bind(this); - this.on('select', this.boundFunction); - // temporarily overload functions - this.cachedFunctions["_handleTouch"] = this._handleTouch; - this.cachedFunctions["_manipulationReleaseOverload"] = this._manipulationReleaseOverload; - this.cachedFunctions["_handleDragStart"] = this._handleDragStart; - this.cachedFunctions["_handleDragEnd"] = this._handleDragEnd; - this._handleTouch = this._handleConnect; - this._manipulationReleaseOverload = function () {}; - this._handleDragStart = function () {}; - this._handleDragEnd = this._finishConnect; - // redraw to show the unselect - this._redraw(); - }; /** - * create the toolbar to edit edges + * this function calculates the effects of the springs in the case of unsmooth curves. * * @private */ - exports._createEditEdgeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - this.controlNodesActive = true; - - if (this.boundFunction) { - this.off('select', this.boundFunction); - } - - this.edgeBeingEdited = this._getSelectedEdge(); - this.edgeBeingEdited._enableControlNodes(); + exports._calculateSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; - var locale = this.constants.locales[this.constants.locale]; + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; - this.manipulationDOM = {}; - this.manipulationDOM['backSpan'] = document.createElement('span'); - this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; - this.manipulationDOM['backLabelSpan'] = document.createElement('span'); - this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; - this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); - this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); - this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + if (distance == 0) { + distance = 0.01; + } - this.manipulationDOM['descriptionSpan'] = document.createElement('span'); - this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; - this.manipulationDOM['descriptionLabelSpan'] = document.createElement('span'); - this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; - this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['editEdgeDescription']; - this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); - this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); - this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + fx = dx * springForce; + fy = dy * springForce; - // bind the icon - this.manipulationDOM['backSpan'].onclick = this._createManipulatorBar.bind(this); + edge.from.fx += fx; + edge.from.fy += fy; + edge.to.fx -= fx; + edge.to.fy -= fy; + } + } + } + } + }; - // temporarily overload functions - this.cachedFunctions["_handleTouch"] = this._handleTouch; - this.cachedFunctions["_manipulationReleaseOverload"] = this._manipulationReleaseOverload; - this.cachedFunctions["_handleTap"] = this._handleTap; - this.cachedFunctions["_handleDragStart"] = this._handleDragStart; - this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; - this._handleTouch = this._selectControlNode; - this._handleTap = function () {}; - this._handleOnDrag = this._controlNodeDrag; - this._handleDragStart = function () {} - this._manipulationReleaseOverload = this._releaseControlNode; - // redraw to show the unselect - this._redraw(); - }; /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * This function calculates the springforces on the nodes, accounting for the support nodes. * * @private */ - exports._selectControlNode = function(pointer) { - this.edgeBeingEdited.controlNodes.from.unselect(); - this.edgeBeingEdited.controlNodes.to.unselect(); - this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); - if (this.selectedControlNode !== null) { - this.selectedControlNode.select(); - this.freezeSimulation = true; - } - this._redraw(); - }; + exports._calculateSpringForcesWithSupport = function () { + var edgeLength, edge, edgeId, combinedClusterSize; + var edges = this.edges; + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + if (edge.via != null) { + var node1 = edge.to; + var node2 = edge.via; + var node3 = edge.from; - /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. - * - * @private - */ - exports._controlNodeDrag = function(event) { - var pointer = this._getPointer(event.gesture.center); - if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { - this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); - this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); - } - this._redraw(); - }; + edgeLength = edge.physics.springLength; - exports._releaseControlNode = function(pointer) { - var newNode = this._getNodeAt(pointer); - if (newNode != null) { - if (this.edgeBeingEdited.controlNodes.from.selected == true) { - this._editEdge(newNode.id, this.edgeBeingEdited.to.id); - this.edgeBeingEdited.controlNodes.from.unselect(); - } - if (this.edgeBeingEdited.controlNodes.to.selected == true) { - this._editEdge(this.edgeBeingEdited.from.id, newNode.id); - this.edgeBeingEdited.controlNodes.to.unselect(); + combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; + + // this implies that the edges between big clusters are longer + edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; + this._calculateSpringForce(node1, node2, 0.5 * edgeLength); + this._calculateSpringForce(node2, node3, 0.5 * edgeLength); + } + } + } } } - else { - this.edgeBeingEdited._restoreControlNodes(); - } - this.freezeSimulation = false; - this._redraw(); }; + /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. * + * @param node1 + * @param node2 + * @param edgeLength * @private */ - exports._handleConnect = function(pointer) { - if (this._getSelectedNodeCount() == 0) { - var node = this._getNodeAt(pointer); + exports._calculateSpringForce = function (node1, node2, edgeLength) { + var dx, dy, fx, fy, springForce, distance; - if (node != null) { - if (node.clusterSize > 1) { - alert(this.constants.locales[this.constants.locale]['createEdgeError']) - } - else { - this._selectObject(node,false); - var supportNodes = this.sectors['support']['nodes']; + dx = (node1.x - node2.x); + dy = (node1.y - node2.y); + distance = Math.sqrt(dx * dx + dy * dy); - // create a node the temporary line can look at - supportNodes['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); - var targetNode = supportNodes['targetNode']; - targetNode.x = node.x; - targetNode.y = node.y; + if (distance == 0) { + distance = 0.01; + } - // create a temporary edge - this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:targetNode.id}, this, this.constants); - var connectionEdge = this.edges['connectionEdge']; - connectionEdge.from = node; - connectionEdge.connected = true; - connectionEdge.options.smoothCurves = {enabled: true, - dynamic: false, - type: "continuous", - roundness: 0.5 - }; - connectionEdge.selected = true; - connectionEdge.to = targetNode; + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; - this._handleOnDrag = function(event) { - var pointer = this._getPointer(event.gesture.center); - var connectionEdge = this.edges['connectionEdge']; - connectionEdge.to.x = this._XconvertDOMtoCanvas(pointer.x); - connectionEdge.to.y = this._YconvertDOMtoCanvas(pointer.y); - }; + fx = dx * springForce; + fy = dy * springForce; - this.moving = true; - this.start(); - } - } - } + node1.fx += fx; + node1.fy += fy; + node2.fx -= fx; + node2.fy -= fy; }; - exports._finishConnect = function(event) { - if (this._getSelectedNodeCount() == 1) { - var pointer = this._getPointer(event.gesture.center); - // restore the drag function - this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; - delete this.cachedFunctions["_handleOnDrag"]; - // remember the edge id - var connectFromId = this.edges['connectionEdge'].fromId; + /** + * Load the HTML for the physics config and bind it + * @private + */ + exports._loadPhysicsConfiguration = function () { + if (this.physicsConfiguration === undefined) { + this.backupConstants = {}; + util.deepExtend(this.backupConstants,this.constants); - // remove the temporary nodes and edge - delete this.edges['connectionEdge']; - delete this.sectors['support']['nodes']['targetNode']; - delete this.sectors['support']['nodes']['targetViaNode']; + var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; + this.physicsConfiguration = document.createElement('div'); + this.physicsConfiguration.className = "PhysicsConfiguration"; + this.physicsConfiguration.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Options:
' + this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); + this.optionsDiv = document.createElement("div"); + this.optionsDiv.style.fontSize = "14px"; + this.optionsDiv.style.fontFamily = "verdana"; + this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); - var node = this._getNodeAt(pointer); - if (node != null) { - if (node.clusterSize > 1) { - alert(this.constants.locales[this.constants.locale]["createEdgeError"]) - } - else { - this._createEdge(connectFromId,node.id); - this._createManipulatorBar(); - } + var rangeElement; + rangeElement = document.getElementById('graph_BH_gc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); + rangeElement = document.getElementById('graph_BH_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_BH_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_BH_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_BH_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); + + rangeElement = document.getElementById('graph_R_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); + rangeElement = document.getElementById('graph_R_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_R_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_R_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_R_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); + + rangeElement = document.getElementById('graph_H_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + rangeElement = document.getElementById('graph_H_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_H_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_H_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_H_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); + rangeElement = document.getElementById('graph_H_direction'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); + rangeElement = document.getElementById('graph_H_levsep'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); + rangeElement = document.getElementById('graph_H_nspac'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); + + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + var radioButton3 = document.getElementById("graph_physicsMethod3"); + radioButton2.checked = true; + if (this.constants.physics.barnesHut.enabled) { + radioButton1.checked = true; + } + if (this.constants.hierarchicalLayout.enabled) { + radioButton3.checked = true; } - this._unselectAll(); - } - }; + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + var graph_repositionNodes = document.getElementById("graph_repositionNodes"); + var graph_generateOptions = document.getElementById("graph_generateOptions"); - /** - * Adds a node on the specified location - */ - exports._addNode = function() { - if (this._selectionIsEmpty() && this.editMode == true) { - var positionObject = this._pointerToPositionObject(this.pointerPosition); - var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; - if (this.triggerFunctions.add) { - if (this.triggerFunctions.add.length == 2) { - var me = this; - this.triggerFunctions.add(defaultData, function(finalizedData) { - me.nodesData.add(finalizedData); - me._createManipulatorBar(); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for add does not support two arguments (data,callback)'); - this._createManipulatorBar(); - this.moving = true; - this.start(); - } + graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); + graph_repositionNodes.onclick = graphRepositionNodes.bind(this); + graph_generateOptions.onclick = graphGenerateOptions.bind(this); + if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { + graph_toggleSmooth.style.background = "#A4FF56"; } else { - this.nodesData.add(defaultData); - this._createManipulatorBar(); - this.moving = true; - this.start(); + graph_toggleSmooth.style.background = "#FF8532"; } + + + switchConfigurations.apply(this); + + radioButton1.onchange = switchConfigurations.bind(this); + radioButton2.onchange = switchConfigurations.bind(this); + radioButton3.onchange = switchConfigurations.bind(this); } }; - /** - * connect two nodes with a new edge. + * This overwrites the this.constants. * + * @param constantsVariableName + * @param value * @private */ - exports._createEdge = function(sourceNodeId,targetNodeId) { - if (this.editMode == true) { - var defaultData = {from:sourceNodeId, to:targetNodeId}; - if (this.triggerFunctions.connect) { - if (this.triggerFunctions.connect.length == 2) { - var me = this; - this.triggerFunctions.connect(defaultData, function(finalizedData) { - me.edgesData.add(finalizedData); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for connect does not support two arguments (data,callback)'); - this.moving = true; - this.start(); - } - } - else { - this.edgesData.add(defaultData); - this.moving = true; - this.start(); - } + exports._overWriteGraphConstants = function (constantsVariableName, value) { + var nameArray = constantsVariableName.split("_"); + if (nameArray.length == 1) { + this.constants[nameArray[0]] = value; + } + else if (nameArray.length == 2) { + this.constants[nameArray[0]][nameArray[1]] = value; + } + else if (nameArray.length == 3) { + this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; } }; + /** - * connect two nodes with a new edge. - * - * @private + * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. */ - exports._editEdge = function(sourceNodeId,targetNodeId) { - if (this.editMode == true) { - var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; - if (this.triggerFunctions.editEdge) { - if (this.triggerFunctions.editEdge.length == 2) { - var me = this; - this.triggerFunctions.editEdge(defaultData, function(finalizedData) { - me.edgesData.update(finalizedData); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for edit does not support two arguments (data, callback)'); - this.moving = true; - this.start(); - } - } - else { - this.edgesData.update(defaultData); - this.moving = true; - this.start(); - } - } - }; + function graphToggleSmoothCurves () { + this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + + this._configureSmoothCurves(false); + } /** - * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. + * this function is used to scramble the nodes * - * @private */ - exports._editNode = function() { - if (this.triggerFunctions.edit && this.editMode == true) { - var node = this._getSelectedNode(); - var data = {id:node.id, - label: node.label, - group: node.options.group, - shape: node.options.shape, - color: { - background:node.options.color.background, - border:node.options.color.border, - highlight: { - background:node.options.color.highlight.background, - border:node.options.color.highlight.border - } - }}; - if (this.triggerFunctions.edit.length == 2) { - var me = this; - this.triggerFunctions.edit(data, function (finalizedData) { - me.nodesData.update(finalizedData); - me._createManipulatorBar(); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for edit does not support two arguments (data, callback)'); + function graphRepositionNodes () { + for (var nodeId in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; + this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; } } + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + showValueOfRange.call(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + showValueOfRange.call(this, 'graph_H_cg', 1, "physics_centralGravity"); + showValueOfRange.call(this, 'graph_H_sc', 1, "physics_springConstant"); + showValueOfRange.call(this, 'graph_H_sl', 1, "physics_springLength"); + showValueOfRange.call(this, 'graph_H_damp', 1, "physics_damping"); + } else { - throw new Error('No edit function has been bound to this button'); + this.repositionNodes(); } - }; - - - + this.moving = true; + this.start(); + } /** - * delete everything in the selection - * - * @private + * this is used to generate an options file from the playing with physics system. */ - exports._deleteSelected = function() { - if (!this._selectionIsEmpty() && this.editMode == true) { - if (!this._clusterInSelection()) { - var selectedNodes = this.getSelectedNodes(); - var selectedEdges = this.getSelectedEdges(); - if (this.triggerFunctions.del) { - var me = this; - var data = {nodes: selectedNodes, edges: selectedEdges}; - if (this.triggerFunctions.del.length = 2) { - this.triggerFunctions.del(data, function (finalizedData) { - me.edgesData.remove(finalizedData.edges); - me.nodesData.remove(finalizedData.nodes); - me._unselectAll(); - me.moving = true; - me.start(); - }); - } - else { - throw new Error('The function for delete does not support two arguments (data, callback)') + function graphGenerateOptions () { + var options = "No options are required, default values used."; + var optionsSpecific = []; + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + if (radioButton1.checked == true) { + if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options = "var options = {"; + options += "physics: {barnesHut: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " } } - else { - this.edgesData.remove(selectedEdges); - this.nodesData.remove(selectedNodes); - this._unselectAll(); - this.moving = true; - this.start(); + options += '}}' + } + if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { + if (optionsSpecific.length == 0) {options = "var options = {";} + else {options += ", "} + options += "smoothCurves: " + this.constants.smoothCurves.enabled; + } + if (options != "No options are required, default values used.") { + options += '};' + } + } + else if (radioButton2.checked == true) { + options = "var options = {"; + options += "physics: {barnesHut: {enabled: false}"; + if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += ", repulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } } + options += '}}' } - else { - alert(this.constants.locales[this.constants.locale]["deleteClusterError"]); + if (optionsSpecific.length == 0) {options += "}"} + if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { + options += ", smoothCurves: " + this.constants.smoothCurves; } + options += '};' } - }; - - -/***/ }, -/* 68 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Hammer = __webpack_require__(19); - - exports._cleanNavigation = function() { - // clean hammer bindings - if (this.navigationHammers.existing.length != 0) { - for (var i = 0; i < this.navigationHammers.existing.length; i++) { - this.navigationHammers.existing[i].dispose(); + else { + options = "var options = {"; + if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += "physics: {hierarchicalRepulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", "; + } + } + options += '}},'; } - this.navigationHammers.existing = []; + options += 'hierarchicalLayout: {'; + optionsSpecific = []; + if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);} + if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);} + if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);} + if (optionsSpecific.length != 0) { + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}' + } + else { + options += "enabled:true}"; + } + options += '};' } - this._navigationReleaseOverload = function () {}; - // clean up previous navigation items - if (this.navigationDivs && this.navigationDivs['wrapper'] && this.navigationDivs['wrapper'].parentNode) { - this.navigationDivs['wrapper'].parentNode.removeChild(this.navigationDivs['wrapper']); - } - }; + this.optionsDiv.innerHTML = options; + } /** - * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation - * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent - * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. - * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. + * this is used to switch between barnesHut, repulsion and hierarchical. * - * @private */ - exports._loadNavigationElements = function() { - this._cleanNavigation(); - - this.navigationDivs = {}; - var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; - var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','_zoomExtent']; - - this.navigationDivs['wrapper'] = document.createElement('div'); - this.frame.appendChild(this.navigationDivs['wrapper']); - - for (var i = 0; i < navigationDivs.length; i++) { - this.navigationDivs[navigationDivs[i]] = document.createElement('div'); - this.navigationDivs[navigationDivs[i]].className = 'network-navigation ' + navigationDivs[i]; - this.navigationDivs['wrapper'].appendChild(this.navigationDivs[navigationDivs[i]]); - - var hammer = Hammer(this.navigationDivs[navigationDivs[i]], {prevent_default: true}); - hammer.on('touch', this[navigationDivActions[i]].bind(this)); - this.navigationHammers.new.push(hammer); + function switchConfigurations () { + var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; + var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; + var tableId = "graph_" + radioButton + "_table"; + var table = document.getElementById(tableId); + table.style.display = "block"; + for (var i = 0; i < ids.length; i++) { + if (ids[i] != tableId) { + table = document.getElementById(ids[i]); + table.style.display = "none"; + } } + this._restoreNodes(); + if (radioButton == "R") { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = false; + } + else if (radioButton == "H") { + if (this.constants.hierarchicalLayout.enabled == false) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + this.constants.smoothCurves.enabled = false; + this._setupHierarchicalLayout(); + } + } + else { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = true; + } + this._loadSelectedForceSolver(); + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + this.moving = true; + this.start(); + } - this._navigationReleaseOverload = this._stopMovement; - - this.navigationHammers.existing = this.navigationHammers.new; - }; - - - /** - * this stops all movement induced by the navigation buttons - * - * @private - */ - exports._zoomExtent = function(event) { - this.zoomExtent({duration:700}); - event.stopPropagation(); - }; /** - * this stops all movement induced by the navigation buttons + * this generates the ranges depending on the iniital values. * - * @private + * @param id + * @param map + * @param constantsVariableName */ - exports._stopMovement = function() { - this._xStopMoving(); - this._yStopMoving(); - this._stopZoom(); - }; + function showValueOfRange (id,map,constantsVariableName) { + var valueId = id + "_value"; + var rangeValue = document.getElementById(id).value; + if (Array.isArray(map)) { + document.getElementById(valueId).value = map[parseInt(rangeValue)]; + this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]); + } + else { + document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue); + this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue)); + } - /** - * move the screen up - * By using the increments, instead of adding a fixed number to the translation, we keep fluent and - * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently - * To avoid this behaviour, we do the translation in the start loop. - * - * @private - */ - exports._moveUp = function(event) { - this.yIncrement = this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; + if (constantsVariableName == "hierarchicalLayout_direction" || + constantsVariableName == "hierarchicalLayout_levelSeparation" || + constantsVariableName == "hierarchicalLayout_nodeSpacing") { + this._setupHierarchicalLayout(); + } + this.moving = true; + this.start(); + } - /** - * move the screen down - * @private - */ - exports._moveDown = function(event) { - this.yIncrement = -this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + function webpackContext(req) { + throw new Error("Cannot find module '" + req + "'."); + } + webpackContext.keys = function() { return []; }; + webpackContext.resolve = webpackContext; + module.exports = webpackContext; + webpackContext.id = 67; - /** - * move the screen left - * @private - */ - exports._moveLeft = function(event) { - this.xIncrement = this.constants.keyboard.speed.x; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { /** - * move the screen right + * Calculate the forces the nodes apply on each other based on a repulsion field. + * This field is linearly approximated. + * * @private */ - exports._moveRight = function(event) { - this.xIncrement = -this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; - + exports._calculateNodeForces = function () { + var dx, dy, angle, distance, fx, fy, combinedClusterSize, + repulsingForce, node1, node2, i, j; - /** - * Zoom in, using the same method as the movement. - * @private - */ - exports._zoomIn = function(event) { - this.zoomIncrement = this.constants.keyboard.speed.zoom; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + // approximation constants + var a_base = -2 / 3; + var b = 4 / 3; - /** - * Zoom out - * @private - */ - exports._zoomOut = function(event) { - this.zoomIncrement = -this.constants.keyboard.speed.zoom; - this.start(); // if there is no node movement, the calculation wont be done - event.preventDefault(); - }; + // repulsing forces between nodes + var nodeDistance = this.constants.physics.repulsion.nodeDistance; + var minimumDistance = nodeDistance; + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < nodeIndices.length - 1; i++) { + node1 = nodes[nodeIndices[i]]; + for (j = i + 1; j < nodeIndices.length; j++) { + node2 = nodes[nodeIndices[j]]; + combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; - /** - * Stop zooming and unhighlight the zoom controls - * @private - */ - exports._stopZoom = function(event) { - this.zoomIncrement = 0; - event && event.preventDefault(); - }; + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); + var a = a_base / minimumDistance; + if (distance < 2 * minimumDistance) { + if (distance < 0.5 * minimumDistance) { + repulsingForce = 1.0; + } + else { + repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) + } - /** - * Stop moving in the Y direction and unHighlight the up and down - * @private - */ - exports._yStopMoving = function(event) { - this.yIncrement = 0; - event && event.preventDefault(); - }; + // amplify the repulsion for clusters. + repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; + repulsingForce = repulsingForce / distance; + fx = dx * repulsingForce; + fy = dy * repulsingForce; - /** - * Stop moving in the X direction and unHighlight left and right. - * @private - */ - exports._xStopMoving = function(event) { - this.xIncrement = 0; - event && event.preventDefault(); + node1.fx -= fx; + node1.fy -= fy; + node2.fx += fx; + node2.fy += fy; + } + } + } }; @@ -33172,688 +33368,579 @@ return /******/ (function(modules) { // webpackBootstrap /* 69 */ /***/ function(module, exports, __webpack_require__) { - exports._resetLevels = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.preassignedLevel == false) { - node.level = -1; - node.hierarchyEnumerated = false; - } - } - } - }; - /** - * This is the main function to layout the nodes in a hierarchical way. - * It checks if the node details are supplied correctly + * Calculate the forces the nodes apply on eachother based on a repulsion field. + * This field is linearly approximated. * * @private */ - exports._setupHierarchicalLayout = function() { - if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { - if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "DU") { - this.constants.hierarchicalLayout.levelSeparation *= -1; - } - else { - this.constants.hierarchicalLayout.levelSeparation = Math.abs(this.constants.hierarchicalLayout.levelSeparation); - } + exports._calculateNodeForces = function () { + var dx, dy, distance, fx, fy, + repulsingForce, node1, node2, i, j; - if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "LR") { - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.type = "vertical"; - } - } - else { - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.type = "horizontal"; - } - } - // get the size of the largest hubs and check if the user has defined a level for a node. - var hubsize = 0; - var node, nodeId; - var definedLevel = false; - var undefinedLevel = false; + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level != -1) { - definedLevel = true; - } - else { - undefinedLevel = true; - } - if (hubsize < node.edges.length) { - hubsize = node.edges.length; - } - } - } + // repulsing forces between nodes + var nodeDistance = this.constants.physics.hierarchicalRepulsion.nodeDistance; - // if the user defined some levels but not all, alert and run without hierarchical layout - if (undefinedLevel == true && definedLevel == true) { - throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); - this.zoomExtent(undefined,true,this.constants.clustering.enabled); - if (!this.constants.clustering.enabled) { - this.start(); - } - } - else { - // setup the system to use hierarchical method. - this._changeConstants(); + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < nodeIndices.length - 1; i++) { + node1 = nodes[nodeIndices[i]]; + for (j = i + 1; j < nodeIndices.length; j++) { + node2 = nodes[nodeIndices[j]]; - // define levels if undefined by the users. Based on hubsize - if (undefinedLevel == true) { - if (this.constants.hierarchicalLayout.layout == "hubsize") { - this._determineLevels(hubsize); + // nodes only affect nodes on their level + if (node1.level == node2.level) { + + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + + + var steepness = 0.05; + if (distance < nodeDistance) { + repulsingForce = -Math.pow(steepness*distance,2) + Math.pow(steepness*nodeDistance,2); } else { - this._determineLevelsDirected(); + repulsingForce = 0; } + // normalize force with + if (distance == 0) { + distance = 0.01; + } + else { + repulsingForce = repulsingForce / distance; + } + fx = dx * repulsingForce; + fy = dy * repulsingForce; + node1.fx -= fx; + node1.fy -= fy; + node2.fx += fx; + node2.fy += fy; } - // check the distribution of the nodes per level. - var distribution = this._getDistribution(); - - // place the nodes on the canvas. This also stablilizes the system. - this._placeNodesByHierarchy(distribution); - - // start the simulation. - this.start(); } } }; /** - * This function places the nodes on the canvas based on the hierarchial distribution. + * this function calculates the effects of the springs in the case of unsmooth curves. * - * @param {Object} distribution | obtained by the function this._getDistribution() * @private */ - exports._placeNodesByHierarchy = function(distribution) { - var nodeId, node; + exports._calculateHierarchicalSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; - // start placing all the level 0 nodes first. Then recursively position their branches. - for (var level in distribution) { - if (distribution.hasOwnProperty(level)) { + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; - for (nodeId in distribution[level].nodes) { - if (distribution[level].nodes.hasOwnProperty(nodeId)) { - node = distribution[level].nodes[nodeId]; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - if (node.xFixed) { - node.x = distribution[level].minPos; - node.xFixed = false; - distribution[level].minPos += distribution[level].nodeSpacing; - } + for (var i = 0; i < nodeIndices.length; i++) { + var node1 = nodes[nodeIndices[i]]; + node1.springFx = 0; + node1.springFy = 0; + } + + + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; } - else { - if (node.yFixed) { - node.y = distribution[level].minPos; - node.yFixed = false; - distribution[level].minPos += distribution[level].nodeSpacing; - } + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + + fx = dx * springForce; + fy = dy * springForce; + + + + if (edge.to.level != edge.from.level) { + edge.to.springFx -= fx; + edge.to.springFy -= fy; + edge.from.springFx += fx; + edge.from.springFy += fy; + } + else { + var factor = 0.5; + edge.to.fx -= factor*fx; + edge.to.fy -= factor*fy; + edge.from.fx += factor*fx; + edge.from.fy += factor*fy; } - this._placeBranchNodes(node.edges,node.id,distribution,node.level); } } } } - // stabilize the system after positioning. This function calls zoomExtent. - this._stabilize(); + // normalize spring forces + var springForce = 1; + var springFx, springFy; + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + springFx = Math.min(springForce,Math.max(-springForce,node.springFx)); + springFy = Math.min(springForce,Math.max(-springForce,node.springFy)); + + node.fx += springFx; + node.fy += springFy; + } + + // retain energy balance + var totalFx = 0; + var totalFy = 0; + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + totalFx += node.fx; + totalFy += node.fy; + } + var correctionFx = totalFx / nodeIndices.length; + var correctionFy = totalFy / nodeIndices.length; + + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + node.fx -= correctionFx; + node.fy -= correctionFy; + } + }; +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { /** - * This function get the distribution of levels based on hubsize + * This function calculates the forces the nodes apply on eachother based on a gravitational model. + * The Barnes Hut method is used to speed up this N-body simulation. * - * @returns {Object} * @private */ - exports._getDistribution = function() { - var distribution = {}; - var nodeId, node, level; + exports._calculateNodeForces = function() { + if (this.constants.physics.barnesHut.gravitationalConstant != 0) { + var node; + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + var nodeCount = nodeIndices.length; - // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. - // the fix of X is removed after the x value has been set. - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.xFixed = true; - node.yFixed = true; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; - } - else { - node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; - } - if (distribution[node.level] === undefined) { - distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; - } - distribution[node.level].amount += 1; - distribution[node.level].nodes[nodeId] = node; - } - } + this._formBarnesHutTree(nodes,nodeIndices); - // determine the largest amount of nodes of all levels - var maxCount = 0; - for (level in distribution) { - if (distribution.hasOwnProperty(level)) { - if (maxCount < distribution[level].amount) { - maxCount = distribution[level].amount; - } - } - } + var barnesHutTree = this.barnesHutTree; - // set the initial position and spacing of each nodes accordingly - for (level in distribution) { - if (distribution.hasOwnProperty(level)) { - distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; - distribution[level].nodeSpacing /= (distribution[level].amount + 1); - distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + // place the nodes one by one recursively + for (var i = 0; i < nodeCount; i++) { + node = nodes[nodeIndices[i]]; + if (node.options.mass > 0) { + // starting with root is irrelevant, it never passes the BarnesHut condition + this._getForceContribution(barnesHutTree.root.children.NW,node); + this._getForceContribution(barnesHutTree.root.children.NE,node); + this._getForceContribution(barnesHutTree.root.children.SW,node); + this._getForceContribution(barnesHutTree.root.children.SE,node); + } } } - - return distribution; }; /** - * this function allocates nodes in levels based on the recursive branching from the largest hubs. + * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass. + * If a region contains a single node, we check if it is not itself, then we apply the force. * - * @param hubsize + * @param parentBranch + * @param node * @private */ - exports._determineLevels = function(hubsize) { - var nodeId, node; + exports._getForceContribution = function(parentBranch,node) { + // we get no force contribution from an empty region + if (parentBranch.childrenCount > 0) { + var dx,dy,distance; - // determine hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.edges.length == hubsize) { - node.level = 0; + // get the distance from the center of mass to the node. + dx = parentBranch.centerOfMass.x - node.x; + dy = parentBranch.centerOfMass.y - node.y; + distance = Math.sqrt(dx * dx + dy * dy); + + // BarnesHut condition + // original condition : s/d < theta = passed === d/s > 1/theta = passed + // calcSize = 1/s --> d * 1/s > 1/theta = passed + if (distance * parentBranch.calcSize > this.constants.physics.barnesHut.theta) { + // duplicate code to reduce function calls to speed up program + if (distance == 0) { + distance = 0.1*Math.random(); + dx = distance; } + var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); + var fx = dx * gravityForce; + var fy = dy * gravityForce; + node.fx += fx; + node.fy += fy; } - } - - // branch from hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level == 0) { - this._setLevel(1,node.edges,node.id); + else { + // Did not pass the condition, go into children if available + if (parentBranch.childrenCount == 4) { + this._getForceContribution(parentBranch.children.NW,node); + this._getForceContribution(parentBranch.children.NE,node); + this._getForceContribution(parentBranch.children.SW,node); + this._getForceContribution(parentBranch.children.SE,node); + } + else { // parentBranch must have only one node, if it was empty we wouldnt be here + if (parentBranch.children.data.id != node.id) { // if it is not self + // duplicate code to reduce function calls to speed up program + if (distance == 0) { + distance = 0.5*Math.random(); + dx = distance; + } + var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); + var fx = dx * gravityForce; + var fy = dy * gravityForce; + node.fx += fx; + node.fy += fy; + } } } } }; /** - * this function allocates nodes in levels based on the recursive branching from the largest hubs. + * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes. * - * @param hubsize + * @param nodes + * @param nodeIndices * @private */ - exports._determineLevelsDirected = function() { - var nodeId, node; + exports._formBarnesHutTree = function(nodes,nodeIndices) { + var node; + var nodeCount = nodeIndices.length; - // set first node to source - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.nodes[nodeId].level = 10000; - break; - } - } + var minX = Number.MAX_VALUE, + minY = Number.MAX_VALUE, + maxX =-Number.MAX_VALUE, + maxY =-Number.MAX_VALUE; - // branch from hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level == 10000) { - this._setLevelDirected(10000,node.edges,node.id); - } + // get the range of the nodes + for (var i = 0; i < nodeCount; i++) { + var x = nodes[nodeIndices[i]].x; + var y = nodes[nodeIndices[i]].y; + if (nodes[nodeIndices[i]].options.mass > 0) { + if (x < minX) { minX = x; } + if (x > maxX) { maxX = x; } + if (y < minY) { minY = y; } + if (y > maxY) { maxY = y; } } } + // make the range a square + var sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y + if (sizeDiff > 0) {minY -= 0.5 * sizeDiff; maxY += 0.5 * sizeDiff;} // xSize > ySize + else {minX += 0.5 * sizeDiff; maxX -= 0.5 * sizeDiff;} // xSize < ySize - // branch from hubs - var minLevel = 10000; - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - minLevel = node.level < minLevel ? node.level : minLevel; + var minimumTreeSize = 1e-5; + var rootSize = Math.max(minimumTreeSize,Math.abs(maxX - minX)); + var halfRootSize = 0.5 * rootSize; + var centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY); + + // construct the barnesHutTree + var barnesHutTree = { + root:{ + centerOfMass: {x:0, y:0}, + mass:0, + range: { + minX: centerX-halfRootSize,maxX:centerX+halfRootSize, + minY: centerY-halfRootSize,maxY:centerY+halfRootSize + }, + size: rootSize, + calcSize: 1 / rootSize, + children: { data:null}, + maxWidth: 0, + level: 0, + childrenCount: 4 } - } + }; + this._splitBranch(barnesHutTree.root); - // branch from hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.level -= minLevel; + // place the nodes one by one recursively + for (i = 0; i < nodeCount; i++) { + node = nodes[nodeIndices[i]]; + if (node.options.mass > 0) { + this._placeInTree(barnesHutTree.root,node); } } + + // make global + this.barnesHutTree = barnesHutTree }; /** - * Since hierarchical layout does not support: - * - smooth curves (based on the physics), - * - clustering (based on dynamic node counts) - * - * We disable both features so there will be no problems. + * this updates the mass of a branch. this is increased by adding a node. * + * @param parentBranch + * @param node * @private */ - exports._changeConstants = function() { - this.constants.clustering.enabled = false; - this.constants.physics.barnesHut.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this._loadSelectedForceSolver(); - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.dynamic = false; - } - this._configureSmoothCurves(); + exports._updateBranchMass = function(parentBranch, node) { + var totalMass = parentBranch.mass + node.options.mass; + var totalMassInv = 1/totalMass; + + parentBranch.centerOfMass.x = parentBranch.centerOfMass.x * parentBranch.mass + node.x * node.options.mass; + parentBranch.centerOfMass.x *= totalMassInv; + + parentBranch.centerOfMass.y = parentBranch.centerOfMass.y * parentBranch.mass + node.y * node.options.mass; + parentBranch.centerOfMass.y *= totalMassInv; + + parentBranch.mass = totalMass; + var biggestSize = Math.max(Math.max(node.height,node.radius),node.width); + parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth; + }; /** - * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes - * on a X position that ensures there will be no overlap. + * determine in which branch the node will be placed. * - * @param edges - * @param parentId - * @param distribution - * @param parentLevel + * @param parentBranch + * @param node + * @param skipMassUpdate * @private */ - exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) { - childNode = edges[i].from; - } - else { - childNode = edges[i].to; - } + exports._placeInTree = function(parentBranch,node,skipMassUpdate) { + if (skipMassUpdate != true || skipMassUpdate === undefined) { + // update the mass of the branch. + this._updateBranchMass(parentBranch,node); + } - // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. - var nodeMoved = false; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - if (childNode.xFixed && childNode.level > parentLevel) { - childNode.xFixed = false; - childNode.x = distribution[childNode.level].minPos; - nodeMoved = true; - } + if (parentBranch.children.NW.range.maxX > node.x) { // in NW or SW + if (parentBranch.children.NW.range.maxY > node.y) { // in NW + this._placeInRegion(parentBranch,node,"NW"); } - else { - if (childNode.yFixed && childNode.level > parentLevel) { - childNode.yFixed = false; - childNode.y = distribution[childNode.level].minPos; - nodeMoved = true; - } + else { // in SW + this._placeInRegion(parentBranch,node,"SW"); } - - if (nodeMoved == true) { - distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; - if (childNode.edges.length > 1) { - this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); - } + } + else { // in NE or SE + if (parentBranch.children.NW.range.maxY > node.y) { // in NE + this._placeInRegion(parentBranch,node,"NE"); + } + else { // in SE + this._placeInRegion(parentBranch,node,"SE"); } } }; /** - * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. + * actually place the node in a region (or branch) * - * @param level - * @param edges - * @param parentId + * @param parentBranch + * @param node + * @param region * @private */ - exports._setLevel = function(level, edges, parentId) { - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) { - childNode = edges[i].from; - } - else { - childNode = edges[i].to; - } - if (childNode.level == -1 || childNode.level > level) { - childNode.level = level; - if (childNode.edges.length > 1) { - this._setLevel(level+1, childNode.edges, childNode.id); + exports._placeInRegion = function(parentBranch,node,region) { + switch (parentBranch.children[region].childrenCount) { + case 0: // place node here + parentBranch.children[region].children.data = node; + parentBranch.children[region].childrenCount = 1; + this._updateBranchMass(parentBranch.children[region],node); + break; + case 1: // convert into children + // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) + // we move one node a pixel and we do not put it in the tree. + if (parentBranch.children[region].children.data.x == node.x && + parentBranch.children[region].children.data.y == node.y) { + node.x += Math.random(); + node.y += Math.random(); } - } + else { + this._splitBranch(parentBranch.children[region]); + this._placeInTree(parentBranch.children[region],node); + } + break; + case 4: // place in branch + this._placeInTree(parentBranch.children[region],node); + break; } }; /** - * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. + * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch + * after the split is complete. * - * @param level - * @param edges - * @param parentId + * @param parentBranch * @private */ - exports._setLevelDirected = function(level, edges, parentId) { - this.nodes[parentId].hierarchyEnumerated = true; - for (var i = 0; i < edges.length; i++) { - var childNode = null; - var direction = 1; - if (edges[i].toId == parentId) { - childNode = edges[i].from; - direction = -1; - } - else { - childNode = edges[i].to; - } - if (childNode.level == -1) { - childNode.level = level + direction; - } + exports._splitBranch = function(parentBranch) { + // if the branch is shaded with a node, replace the node in the new subset. + var containedNode = null; + if (parentBranch.childrenCount == 1) { + containedNode = parentBranch.children.data; + parentBranch.mass = 0; parentBranch.centerOfMass.x = 0; parentBranch.centerOfMass.y = 0; } + parentBranch.childrenCount = 4; + parentBranch.children.data = null; + this._insertRegion(parentBranch,"NW"); + this._insertRegion(parentBranch,"NE"); + this._insertRegion(parentBranch,"SW"); + this._insertRegion(parentBranch,"SE"); - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) {childNode = edges[i].from;} - else {childNode = edges[i].to;} - if (childNode.edges.length > 1 && childNode.hierarchyEnumerated === false) { - this._setLevelDirected(childNode.level, childNode.edges, childNode.id); - } + if (containedNode != null) { + this._placeInTree(parentBranch,containedNode); } }; /** - * Unfix nodes + * This function subdivides the region into four new segments. + * Specifically, this inserts a single new segment. + * It fills the children section of the parentBranch * + * @param parentBranch + * @param region + * @param parentRange * @private */ - exports._restoreNodes = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.nodes[nodeId].xFixed = false; - this.nodes[nodeId].yFixed = false; - } + exports._insertRegion = function(parentBranch, region) { + var minX,maxX,minY,maxY; + var childSize = 0.5 * parentBranch.size; + switch (region) { + case "NW": + minX = parentBranch.range.minX; + maxX = parentBranch.range.minX + childSize; + minY = parentBranch.range.minY; + maxY = parentBranch.range.minY + childSize; + break; + case "NE": + minX = parentBranch.range.minX + childSize; + maxX = parentBranch.range.maxX; + minY = parentBranch.range.minY; + maxY = parentBranch.range.minY + childSize; + break; + case "SW": + minX = parentBranch.range.minX; + maxX = parentBranch.range.minX + childSize; + minY = parentBranch.range.minY + childSize; + maxY = parentBranch.range.maxY; + break; + case "SE": + minX = parentBranch.range.minX + childSize; + maxX = parentBranch.range.maxX; + minY = parentBranch.range.minY + childSize; + maxY = parentBranch.range.maxY; + break; } - }; - - -/***/ }, -/* 70 */ -/***/ function(module, exports, __webpack_require__) { - // English - exports['en'] = { - edit: 'Edit', - del: 'Delete selected', - back: 'Back', - addNode: 'Add Node', - addEdge: 'Add Edge', - editNode: 'Edit Node', - editEdge: 'Edit Edge', - addDescription: 'Click in an empty space to place a new node.', - edgeDescription: 'Click on a node and drag the edge to another node to connect them.', - editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.', - createEdgeError: 'Cannot link edges to a cluster.', - deleteClusterError: 'Clusters cannot be deleted.' - }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; - // Dutch - exports['nl'] = { - edit: 'Wijzigen', - del: 'Selectie verwijderen', - back: 'Terug', - addNode: 'Node toevoegen', - addEdge: 'Link toevoegen', - editNode: 'Node wijzigen', - editEdge: 'Link wijzigen', - addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.', - edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.', - editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.', - createEdgeError: 'Kan geen link maken naar een cluster.', - deleteClusterError: 'Clusters kunnen niet worden verwijderd.' + parentBranch.children[region] = { + centerOfMass:{x:0,y:0}, + mass:0, + range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY}, + size: 0.5 * parentBranch.size, + calcSize: 2 * parentBranch.calcSize, + children: {data:null}, + maxWidth: 0, + level: parentBranch.level+1, + childrenCount: 0 + }; }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; - -/***/ }, -/* 71 */ -/***/ function(module, exports, __webpack_require__) { /** - * Canvas shapes used by Network + * This function is for debugging purposed, it draws the tree. + * + * @param ctx + * @param color + * @private */ - if (typeof CanvasRenderingContext2D !== 'undefined') { - - /** - * Draw a circle shape - */ - CanvasRenderingContext2D.prototype.circle = function(x, y, r) { - this.beginPath(); - this.arc(x, y, r, 0, 2*Math.PI, false); - }; - - /** - * Draw a square shape - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r size, width and height of the square - */ - CanvasRenderingContext2D.prototype.square = function(x, y, r) { - this.beginPath(); - this.rect(x - r, y - r, r * 2, r * 2); - }; - - /** - * Draw a triangle shape - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius, half the length of the sides of the triangle - */ - CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { - // http://en.wikipedia.org/wiki/Equilateral_triangle - this.beginPath(); - - var s = r * 2; - var s2 = s / 2; - var ir = Math.sqrt(3) / 6 * s; // radius of inner circle - var h = Math.sqrt(s * s - s2 * s2); // height - - this.moveTo(x, y - (h - ir)); - this.lineTo(x + s2, y + ir); - this.lineTo(x - s2, y + ir); - this.lineTo(x, y - (h - ir)); - this.closePath(); - }; - - /** - * Draw a triangle shape in downward orientation - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius - */ - CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { - // http://en.wikipedia.org/wiki/Equilateral_triangle - this.beginPath(); - - var s = r * 2; - var s2 = s / 2; - var ir = Math.sqrt(3) / 6 * s; // radius of inner circle - var h = Math.sqrt(s * s - s2 * s2); // height - - this.moveTo(x, y + (h - ir)); - this.lineTo(x + s2, y - ir); - this.lineTo(x - s2, y - ir); - this.lineTo(x, y + (h - ir)); - this.closePath(); - }; - - /** - * Draw a star shape, a star with 5 points - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius, half the length of the sides of the triangle - */ - CanvasRenderingContext2D.prototype.star = function(x, y, r) { - // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ - this.beginPath(); - - for (var n = 0; n < 10; n++) { - var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; - this.lineTo( - x + radius * Math.sin(n * 2 * Math.PI / 10), - y - radius * Math.cos(n * 2 * Math.PI / 10) - ); - } - - this.closePath(); - }; - - /** - * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas - */ - CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { - var r2d = Math.PI/180; - if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x - if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y - this.beginPath(); - this.moveTo(x+r,y); - this.lineTo(x+w-r,y); - this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); - this.lineTo(x+w,y+h-r); - this.arc(x+w-r,y+h-r,r,0,r2d*90,false); - this.lineTo(x+r,y+h); - this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); - this.lineTo(x,y+r); - this.arc(x+r,y+r,r,r2d*180,r2d*270,false); - }; - - /** - * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - */ - CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { - var kappa = .5522848, - ox = (w / 2) * kappa, // control point offset horizontal - oy = (h / 2) * kappa, // control point offset vertical - xe = x + w, // x-end - ye = y + h, // y-end - xm = x + w / 2, // x-middle - ym = y + h / 2; // y-middle - - this.beginPath(); - this.moveTo(x, ym); - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - }; - - - - /** - * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - */ - CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { - var f = 1/3; - var wEllipse = w; - var hEllipse = h * f; + exports._drawTree = function(ctx,color) { + if (this.barnesHutTree !== undefined) { - var kappa = .5522848, - ox = (wEllipse / 2) * kappa, // control point offset horizontal - oy = (hEllipse / 2) * kappa, // control point offset vertical - xe = x + wEllipse, // x-end - ye = y + hEllipse, // y-end - xm = x + wEllipse / 2, // x-middle - ym = y + hEllipse / 2, // y-middle - ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse - yeb = y + h; // y-end, bottom ellipse + ctx.lineWidth = 1; - this.beginPath(); - this.moveTo(xe, ym); + this._drawBranch(this.barnesHutTree.root,ctx,color); + } + }; - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + /** + * This function is for debugging purposes. It draws the branches recursively. + * + * @param branch + * @param ctx + * @param color + * @private + */ + exports._drawBranch = function(branch,ctx,color) { + if (color === undefined) { + color = "#FF0000"; + } - this.lineTo(xe, ymb); + if (branch.childrenCount == 4) { + this._drawBranch(branch.children.NW,ctx); + this._drawBranch(branch.children.NE,ctx); + this._drawBranch(branch.children.SE,ctx); + this._drawBranch(branch.children.SW,ctx); + } + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(branch.range.minX,branch.range.minY); + ctx.lineTo(branch.range.maxX,branch.range.minY); + ctx.stroke(); - this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); - this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); + ctx.beginPath(); + ctx.moveTo(branch.range.maxX,branch.range.minY); + ctx.lineTo(branch.range.maxX,branch.range.maxY); + ctx.stroke(); - this.lineTo(x, ym); - }; + ctx.beginPath(); + ctx.moveTo(branch.range.maxX,branch.range.maxY); + ctx.lineTo(branch.range.minX,branch.range.maxY); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(branch.range.minX,branch.range.maxY); + ctx.lineTo(branch.range.minX,branch.range.minY); + ctx.stroke(); - /** - * Draw an arrow point (no line) + /* + if (branch.mass > 0) { + ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass); + ctx.stroke(); + } */ - CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { - // tail - var xt = x - length * Math.cos(angle); - var yt = y - length * Math.sin(angle); - - // inner tail - // TODO: allow to customize different shapes - var xi = x - length * 0.9 * Math.cos(angle); - var yi = y - length * 0.9 * Math.sin(angle); - - // left - var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); - var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); - - // right - var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); - var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); + }; - this.beginPath(); - this.moveTo(x, y); - this.lineTo(xl, yl); - this.lineTo(xi, yi); - this.lineTo(xr, yr); - this.closePath(); - }; - /** - * Sets up the dashedLine functionality for drawing - * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas - * @author David Jordan - * @date 2012-08-08 - */ - CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ - if (!dashArray) dashArray=[10,5]; - if (dashLength==0) dashLength = 0.001; // Hack for Safari - var dashCount = dashArray.length; - this.moveTo(x, y); - var dx = (x2-x), dy = (y2-y); - var slope = dy/dx; - var distRemaining = Math.sqrt( dx*dx + dy*dy ); - var dashIndex=0, draw=true; - while (distRemaining>=0.1){ - var dashLength = dashArray[dashIndex++%dashCount]; - if (dashLength > distRemaining) dashLength = distRemaining; - var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); - if (dx<0) xStep = -xStep; - x += xStep; - y += slope*xStep; - this[draw ? 'lineTo' : 'moveTo'](x,y); - distRemaining -= dashLength; - draw = !draw; - } - }; +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { - // TODO: add diamond shape + module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + module.children = []; + module.webpackPolyfill = 1; + } + return module; } diff --git a/dist/vis.map b/dist/vis.map index 1cc04297..32699511 100644 --- a/dist/vis.map +++ b/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DateUtil","DataStep","Range","stack","TimeStep","components","items","Item","BackgroundItem","BoxItem","PointItem","RangeItem","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","BackgroundGroup","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","cssUtil","cssText","styles","style","trim","parts","keys","map","addCssText","currentStyles","newStyles","removeCssText","removeStyles","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearchCustom","orderedItems","searchFunction","field","field2","maxIterations","iteration","low","high","middle","item","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easeInOutQuad","start","end","duration","change","easingFunctions","linear","easeInQuad","easeOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","insertBefore","createElement","drawPoint","x","y","group","point","drawPoints","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","setOptions","prototype","queue","_queue","destroy","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","col","cols","getValue","update","updatedIds","updatedData","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","args","fn","context","entry","clearTimeout","setTimeout","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","passValueFn","xValueLabel","yValueLabel","zValueLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","mouseX","mouseY","tooltipTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","log","LN10","step1","pow","step2","step5","toPrecision","getStep","groups","forthArgument","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","hiddenDates","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","range","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setGroups","setItems","Core","newDataSet","initialLoad","dataRange","_getDataRange","setWindow","animate","fit","setSelection","focus","getSelection","itemData","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","visibility","convertHiddenOptions","repeat","dateItem","updateHiddenDates","centerContainer","totalRange","pixelTime","startDate","endDate","_d","runUntil","clone","day","dayOfYear","year","dayOffset","date","month","console","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","startToFront","endToFront","_applyRange","safeDates","printDates","dates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","current","newValue","switchedYear","switchedMonth","switchedDay","time","conversion","getHiddenDurationBetween","correctTimeForHidden","hiddenDuration","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","getHiddenDurationBefore","timeOffset","requiredDuration","previousPoint","snapAwayFromHidden","direction","correctionEnabled","minimumStep","containerHeight","customRange","alignZeros","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","decimals","slice","exp","cnt","isMajor","now","hours","minutes","seconds","milliseconds","deltaDifference","scaleOffset","moveable","zoomable","zoomMin","zoomMax","touch","animateTimer","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","dragging","initTime","done","initStart","initEnd","changed","anyChanged","_cancelAnimation","newStart","newEnd","getRange","totalHidden","previousDelta","allowDragging","gesture","deltaX","deltaY","diffRange","safeStart","safeEnd","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","hiddenDurationBefore","hiddenDurationAfter","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","subgroups","newTop","subgroup","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","getLabelMinor","format","getLabelMajor","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","currentTimeTimer","setCurrentTime","getCurrentTime","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","stopPropagation","svg","linegraphOptions","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","zeroCrossing","lineOffset","master","svgElements","iconsRemoved","amountOfGroups","lineContainer","scrollTop","addGroup","graphOptions","updateGroup","removeGroup","hide","show","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","_cleanupIcons","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","_redrawTitle","amountOfSteps","stepDifference","zeroStepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","textTitle","measureCharTitle","titleCharWidth","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","Line","Bar","Points","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","getYRange","groupData","draw","framework","subgroupIndex","subgroupOrderer","subgroupOrder","visibleItems","byStart","byEnd","checkRangedItems","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","_calculateHeight","offsetTop","offsetLeft","ii","repositionY","resetSubgroups","labelSet","setParent","orderSubgroups","_checkIfVisible","sortArray","sortField","removeFromDataSet","removeItem","startArray","endArray","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","repositionX","initialPos","breakCondition","isVisible","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","onMoving","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","UNGROUPED","BACKGROUND","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","_order","getGroups","_getType","_removeItem","groupOptions","oldGroupId","oldGroup","_constructByEndArray","itemFromTarget","selected","dragLeftItem","dragRightItem","initialX","itemProps","newProps","initial","groupFromTarget","_updateItemProps","_moveToGroup","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","_getItemRange","_item","itemSetFromTarget","side","iconSize","iconSpacing","textArea","scrollableHeight","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","autoSizeSVG","lastStart","_updateGraph","BarGraphFunctions","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","rangePerPixelInv","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","dataContainer","guess","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedDataLeft","barCombinedDataRight","getStackedBarYRange","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","ignore","_toggleAxisVisiblity","drawIcons","axisUsed","datapoints","xValue","yValue","extractedData","svgHeight","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","_updateContents","template","_updateTitle","removeAttribute","_updateDataAttributes","dataAttributes","attributes","setAttribute","_updateStyle","emptyContent","baseClassName","onTop","itemSubgroup","itemSetHeight","marginLeft","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fontColor","fontSize","fontFace","fontFill","level","highlightColor","borderWidthSelected","edges","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","layout","freezeForStabilization","smoothCurves","dynamic","roundness","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","pixelRatio","hoverObj","controlNodesActive","navigationHammers","existing","new","animationSpeed","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","startedStabilization","stabilized","draggingNodes","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","keycharm","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","animationOptions","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","animation","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_resetLevels","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","pinch","_onTap","_onDoubleTap","_onMouseMoveTitle","hammerFrame","_onRelease","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","nodeIds","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","releaseNode","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleDragEnd","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","emitEvent","oldWidth","oldHeight","oldNodesData","_updateSelection","angle","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","changedData","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","dynamicEdges","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","mainMovingStatus","supportMovingStatus","_doInAllActiveSectors","mainMoving","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","iterations","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","storePositions","dataArray","allowedToMoveX","allowedToMoveY","getPositions","focusOnNode","nodePosition","lockedOnNode","easingFunction","animateView","locked","_transitionRedraw","viewCenter","distanceFromCenter","_classicRedraw","_lockedRedraw","active","getScale","getCenterCoordinates","networkConstants","fromId","toId","widthSelected","labelDimensions","yLine","dirtyLabel","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","lineCount","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","brokenUrl","img","Image","onload","onerror","imagelist","grouplist","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","hierarchyEnumerated","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","brokenImage","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_redrawTimer","listeners","events","scrollTopMin","redrawCount","_initAutoResize","component","_stopAutoResize","what","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","MAX_REDRAWS","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","_catmullRom","_linear","dFill","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","Bargraph","barCombinedData","coreDistance","drawData","combinedData","intersections","barPoints","_getDataIntersections","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","accumulated","groupLabel","_getStackedBarYRange","xpos","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_bound","keydown","keyup","_keys","fromCharCode","code","down","handleEvent","up","keyCode","bound","bindAll","getKey","newBindings","global","dfl","hasOwnProp","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","printMsg","msg","suppressDeprecationWarnings","warn","deprecate","firstTime","deprecateSimple","deprecations","padToken","func","leftZeroFill","ordinalizeToken","period","localeData","ordinal","Locale","Moment","config","skipOverflow","checkOverflow","copyConfig","Duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","weeks","week","days","hour","minute","second","millisecond","_milliseconds","_days","_months","_locale","_bubble","val","_isAMomentObject","_i","_f","_l","_strict","_tzm","_isUTC","_offset","_pf","momentProperties","absRound","number","targetLength","forceSign","output","positiveMomentsDifference","base","res","isAfter","momentsDifference","makeAs","isBefore","createAdder","dur","tmp","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","DATE","_overflowDayOfYear","isValid","_isValid","getTime","normalizeLocale","chooseLocale","names","loadLocale","oldLocale","hasModule","model","zone","local","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","getUTCFullYear","makeDateFromStringAndFormat","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","posNegDuration","relativeTimeThresholds","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","dayOfMonth","unit","makeAccessor","keepTime","daysToYears","yearsToDays","makeDurationGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","dd","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","diffRes","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","defineLocale","_abbr","abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","keepLocalTime","_dateTzOffset","inputString","asFloat","daysAdjust","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","isSame","localAdjust","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","newLocaleData","getTimezoneOffset","isoWeeks","toJSON","withSuffix","toIsoString","asSeconds","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","returnValues","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","overrideSelectable","DOM","_manipulationReleaseOverload","_navigationReleaseOverload","getSelectedNodes","edgeIds","getSelectedEdges","idArray","selectNodes","RangeError","selectEdges","_clearManipulatorBar","manipulationDOM","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","_createAddNodeToolbar","_createAddEdgeToolbar","_editNode","_createEditEdgeToolbar","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","supportNodes","targetNode","connectionEdge","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","navigationDivs","navigationDivActions","_stopMovement","_zoomExtent","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","_determineLevelsDirected","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","_setLevelDirected","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","dynamicSmoothCurves","nameArray","webpackContext","req","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;CAyBA,SAA2CA,EAAMC,GAC1B,gBAAZC,UAA0C,gBAAXC,QACxCA,OAAOD,QAAUD,IACQ,kBAAXG,SAAyBA,OAAOC,IAC9CD,OAAOH,GACmB,gBAAZC,SACdA,QAAa,IAAID,IAEjBD,EAAU,IAAIC,KACbK,KAAM,WACT,MAAgB,UAAUC,GAKhB,QAASC,GAAoBC,GAG5B,GAAGC,EAAiBD,GACnB,MAAOC,GAAiBD,GAAUP,OAGnC,IAAIC,GAASO,EAAiBD,IAC7BP,WACAS,GAAIF,EACJG,QAAQ,EAUT,OANAL,GAAQE,GAAUI,KAAKV,EAAOD,QAASC,EAAQA,EAAOD,QAASM,GAG/DL,EAAOS,QAAS,EAGTT,EAAOD,QAvBf,GAAIQ,KAqCJ,OATAF,GAAoBM,EAAIP,EAGxBC,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,GAGjBR,EAAoB,KAK/B,SAASL,EAAQD,EAASM,GAG9BN,EAAQe,KAAOT,EAAoB,GACnCN,EAAQgB,QAAUV,EAAoB,GAGtCN,EAAQiB,QAAUX,EAAoB,GACtCN,EAAQkB,SAAWZ,EAAoB,GACvCN,EAAQmB,MAAQb,EAAoB,GAGpCN,EAAQoB,QAAUd,EAAoB,GACtCN,EAAQqB,SACNC,OAAQhB,EAAoB,GAC5BiB,OAAQjB,EAAoB,GAC5BkB,QAASlB,EAAoB,GAC7BmB,QAASnB,EAAoB,IAC7BoB,OAAQpB,EAAoB,IAC5BqB,WAAYrB,EAAoB,KAIlCN,EAAQ4B,SAAWtB,EAAoB,IACvCN,EAAQ6B,QAAUvB,EAAoB,IACtCN,EAAQ8B,UACNC,SAAUzB,EAAoB,IAC9B0B,SAAU1B,EAAoB,IAC9B2B,MAAO3B,EAAoB,IAC3B4B,MAAO5B,EAAoB,IAC3B6B,SAAU7B,EAAoB,IAE9B8B,YACEC,OACEC,KAAMhC,EAAoB,IAC1BiC,eAAgBjC,EAAoB,IACpCkC,QAASlC,EAAoB,IAC7BmC,UAAWnC,EAAoB,IAC/BoC,UAAWpC,EAAoB,KAGjCqC,UAAWrC,EAAoB,IAC/BsC,YAAatC,EAAoB,IACjCuC,WAAYvC,EAAoB,IAChCwC,SAAUxC,EAAoB,IAC9ByC,WAAYzC,EAAoB,IAChC0C,MAAO1C,EAAoB,IAC3B2C,gBAAiB3C,EAAoB,IACrC4C,QAAS5C,EAAoB,IAC7B6C,OAAQ7C,EAAoB,IAC5B8C,UAAW9C,EAAoB,IAC/B+C,SAAU/C,EAAoB,MAKlCN,EAAQsD,QAAUhD,EAAoB,IACtCN,EAAQuD,SACNC,KAAMlD,EAAoB,IAC1BmD,OAAQnD,EAAoB,IAC5BoD,OAAQpD,EAAoB,IAC5BqD,KAAMrD,EAAoB,IAC1BsD,MAAOtD,EAAoB,IAC3BuD,UAAWvD,EAAoB,IAC/BwD,YAAaxD,EAAoB,KAInCN,EAAQ+D,MAAQ,WACd,KAAM,IAAIC,OAAM,+EAIlBhE,EAAQiE,OAAS3D,EAAoB,IACrCN,EAAQkE,OAAS5D,EAAoB,KAKjC,SAASL,OAAQD,QAASM,qBAM9B,GAAI2D,QAAS3D,oBAAoB,GAOjCN,SAAQmE,SAAW,SAASC,GAC1B,MAAQA,aAAkBC,SAA2B,gBAAVD,IAQ7CpE,QAAQsE,SAAW,SAASF,GAC1B,MAAQA,aAAkBG,SAA2B,gBAAVH,IAQ7CpE,QAAQwE,OAAS,SAASJ,GACxB,GAAIA,YAAkBK,MACpB,OAAO,CAEJ,IAAIzE,QAAQsE,SAASF,GAAS,CAEjC,GAAIM,GAAQC,aAAaC,KAAKR,EAC9B,IAAIM,EACF,OAAO,CAEJ,KAAKG,MAAMJ,KAAKK,MAAMV,IACzB,OAAO,EAIX,OAAO,GAQTpE,QAAQ+E,YAAc,SAASX,GAC7B,MAA4B,mBAAb,SACVY,OAAoB,eACpBA,OAAOC,cAAuB,WAC9Bb,YAAkBY,QAAOC,cAAcC,WAQ9ClF,QAAQmF,WAAa,WACnB,GAAIC,GAAK,WACP,MAAOC,MAAKC,MACQ,MAAhBD,KAAKE,UACPC,SAAS,IAGb,OACIJ,KAAOA,IAAO,IACVA,IAAO,IACPA,IAAO,IACPA,IAAO,IACPA,IAAOA,IAAOA,KAWxBpF,QAAQyF,OAAS,SAAUC,GACzB,IAAK,GAAIC,GAAI,EAAGC,EAAMC,UAAUC,OAAYF,EAAJD,EAASA,IAAK,CACpD,GAAII,GAAQF,UAAUF,EACtB,KAAK,GAAIK,KAAQD,GACXA,EAAME,eAAeD,KACvBN,EAAEM,GAAQD,EAAMC,IAKtB,MAAON,IAWT1F,QAAQkG,gBAAkB,SAAUC,EAAOT,GACzC,IAAKU,MAAMC,QAAQF,GACjB,KAAM,IAAInC,OAAM,uDAGlB,KAAK,GAAI2B,GAAI,EAAGA,EAAIE,UAAUC,OAAQH,IAGpC,IAAK,GAFDI,GAAQF,UAAUF,GAEb7E,EAAI,EAAGA,EAAIqF,EAAML,OAAQhF,IAAK,CACrC,GAAIkF,GAAOG,EAAMrF,EACbiF,GAAME,eAAeD,KACvBN,EAAEM,GAAQD,EAAMC,IAItB,MAAON,IAWT1F,QAAQsG,oBAAsB,SAAUH,EAAOT,EAAGa,GAEhD,GAAIH,MAAMC,QAAQE,GAChB,KAAM,IAAIC,WAAU,yCAEtB,KAAK,GAAIb,GAAI,EAAGA,EAAIE,UAAUC,OAAQH,IAEpC,IAAK,GADDI,GAAQF,UAAUF,GACb7E,EAAI,EAAGA,EAAIqF,EAAML,OAAQhF,IAAK,CACrC,GAAIkF,GAAOG,EAAMrF,EACjB,IAAIiF,EAAME,eAAeD,GACvB,GAAIO,EAAEP,IAASO,EAAEP,GAAMS,cAAgBC,OACrBC,SAAZjB,EAAEM,KACJN,EAAEM,OAEAN,EAAEM,GAAMS,cAAgBC,OAC1B1G,QAAQ4G,WAAWlB,EAAEM,GAAOO,EAAEP,IAG9BN,EAAEM,GAAQO,EAAEP,OAET,CAAA,GAAII,MAAMC,QAAQE,EAAEP,IACzB,KAAM,IAAIQ,WAAU,yCAEpBd,GAAEM,GAAQO,EAAEP,IAMpB,MAAON,IAWT1F,QAAQ6G,uBAAyB,SAAUV,EAAOT,EAAGa,GAEnD,GAAIH,MAAMC,QAAQE,GAChB,KAAM,IAAIC,WAAU,yCAEtB,KAAK,GAAIR,KAAQO,GACf,GAAIA,EAAEN,eAAeD,IACQ,IAAvBG,EAAMW,QAAQd,GAChB,GAAIO,EAAEP,IAASO,EAAEP,GAAMS,cAAgBC,OACrBC,SAAZjB,EAAEM,KACJN,EAAEM,OAEAN,EAAEM,GAAMS,cAAgBC,OAC1B1G,QAAQ4G,WAAWlB,EAAEM,GAAOO,EAAEP,IAG9BN,EAAEM,GAAQO,EAAEP,OAET,CAAA,GAAII,MAAMC,QAAQE,EAAEP,IACzB,KAAM,IAAIQ,WAAU,yCAEpBd,GAAEM,GAAQO,EAAEP,GAKpB,MAAON,IAST1F,QAAQ4G,WAAa,SAASlB,EAAGa,GAE/B,GAAIH,MAAMC,QAAQE,GAChB,KAAM,IAAIC,WAAU,yCAGtB,KAAK,GAAIR,KAAQO,GACf,GAAIA,EAAEN,eAAeD,GACnB,GAAIO,EAAEP,IAASO,EAAEP,GAAMS,cAAgBC,OACrBC,SAAZjB,EAAEM,KACJN,EAAEM,OAEAN,EAAEM,GAAMS,cAAgBC,OAC1B1G,QAAQ4G,WAAWlB,EAAEM,GAAOO,EAAEP,IAG9BN,EAAEM,GAAQO,EAAEP,OAET,CAAA,GAAII,MAAMC,QAAQE,EAAEP,IACzB,KAAM,IAAIQ,WAAU,yCAEpBd,GAAEM,GAAQO,EAAEP,GAIlB,MAAON,IAUT1F,QAAQ+G,WAAa,SAAUrB,EAAGa,GAChC,GAAIb,EAAEI,QAAUS,EAAET,OAAQ,OAAO,CAEjC,KAAK,GAAIH,GAAI,EAAGC,EAAMF,EAAEI,OAAYF,EAAJD,EAASA,IACvC,GAAID,EAAEC,IAAMY,EAAEZ,GAAI,OAAO,CAG3B,QAAO,GAYT3F,QAAQgH,QAAU,SAAS5C,EAAQ6C,GACjC,GAAIvC,EAEJ,IAAeiC,SAAXvC,EACF,MAAOuC,OAET,IAAe,OAAXvC,EACF,MAAO,KAGT,KAAK6C,EACH,MAAO7C,EAET,IAAsB,gBAAT6C,MAAwBA,YAAgB1C,SACnD,KAAM,IAAIP,OAAM,wBAIlB,QAAQiD,GACN,IAAK,UACL,IAAK,UACH,MAAOC,SAAQ9C,EAEjB,KAAK,SACL,IAAK,SACH,MAAOC,QAAOD,EAAO+C,UAEvB,KAAK,SACL,IAAK,SACH,MAAO5C,QAAOH,EAEhB,KAAK,OACH,GAAIpE,QAAQmE,SAASC,GACnB,MAAO,IAAIK,MAAKL,EAElB,IAAIA,YAAkBK,MACpB,MAAO,IAAIA,MAAKL,EAAO+C,UAEpB,IAAIlD,OAAOmD,SAAShD,GACvB,MAAO,IAAIK,MAAKL,EAAO+C,UAEzB,IAAInH,QAAQsE,SAASF,GAEnB,MADAM,GAAQC,aAAaC,KAAKR,GACtBM,EAEK,GAAID,MAAKJ,OAAOK,EAAM,KAGtBT,OAAOG,GAAQiD,QAIxB,MAAM,IAAIrD,OACN,iCAAmChE,QAAQsH,QAAQlD,GAC/C,gBAGZ,KAAK,SACH,GAAIpE,QAAQmE,SAASC,GACnB,MAAOH,QAAOG,EAEhB,IAAIA,YAAkBK,MACpB,MAAOR,QAAOG,EAAO+C,UAElB,IAAIlD,OAAOmD,SAAShD,GACvB,MAAOH,QAAOG,EAEhB,IAAIpE,QAAQsE,SAASF,GAEnB,MADAM,GAAQC,aAAaC,KAAKR,GAGjBH,OAFLS,EAEYL,OAAOK,EAAM,IAGbN,EAIhB,MAAM,IAAIJ,OACN,iCAAmChE,QAAQsH,QAAQlD,GAC/C,gBAGZ,KAAK,UACH,GAAIpE,QAAQmE,SAASC,GACnB,MAAO,IAAIK,MAAKL,EAEb,IAAIA,YAAkBK,MACzB,MAAOL,GAAOmD,aAEX,IAAItD,OAAOmD,SAAShD,GACvB,MAAOA,GAAOiD,SAASE,aAEpB,IAAIvH,QAAQsE,SAASF,GAExB,MADAM,GAAQC,aAAaC,KAAKR,GACtBM,EAEK,GAAID,MAAKJ,OAAOK,EAAM,KAAK6C,cAG3B,GAAI9C,MAAKL,GAAQmD,aAI1B,MAAM,IAAIvD,OACN,iCAAmChE,QAAQsH,QAAQlD,GAC/C,mBAGZ,KAAK,UACH,GAAIpE,QAAQmE,SAASC,GACnB,MAAO,SAAWA,EAAS,IAExB,IAAIA,YAAkBK,MACzB,MAAO,SAAWL,EAAO+C,UAAY,IAElC,IAAInH,QAAQsE,SAASF,GAAS,CACjCM,EAAQC,aAAaC,KAAKR,EAC1B,IAAIoD,EAQJ,OALEA,GAFE9C,EAEM,GAAID,MAAKJ,OAAOK,EAAM,KAAKyC,UAG3B,GAAI1C,MAAKL,GAAQ+C,UAEpB,SAAWK,EAAQ,KAG1B,KAAM,IAAIxD,OACN,iCAAmChE,QAAQsH,QAAQlD,GAC/C,mBAGZ,SACE,KAAM,IAAIJ,OAAM,iBAAmBiD,EAAO,MAOhD,IAAItC,cAAe,qBAOnB3E,SAAQsH,QAAU,SAASlD,GACzB,GAAI6C,SAAc7C,EAElB,OAAY,UAAR6C,EACY,MAAV7C,EACK,OAELA,YAAkB8C,SACb,UAEL9C,YAAkBC,QACb,SAELD,YAAkBG,QACb,SAEL6B,MAAMC,QAAQjC,GACT,QAELA,YAAkBK,MACb,OAEF,SAEQ,UAARwC,EACA,SAEQ,WAARA,EACA,UAEQ,UAARA,EACA,SAGFA,GASTjH,QAAQyH,gBAAkB,SAASC,GACjC,MAAOA,GAAKC,wBAAwBC,KAAOC,OAAOC,aASpD9H,QAAQ+H,eAAiB,SAASL,GAChC,MAAOA,GAAKC,wBAAwBK,IAAMH,OAAOI,aAQnDjI,QAAQkI,aAAe,SAASR,EAAMS,GACpC,GAAIC,GAAUV,EAAKS,UAAUE,MAAM,IACD,KAA9BD,EAAQtB,QAAQqB,KAClBC,EAAQE,KAAKH,GACbT,EAAKS,UAAYC,EAAQG,KAAK,OASlCvI,QAAQwI,gBAAkB,SAASd,EAAMS,GACvC,GAAIC,GAAUV,EAAKS,UAAUE,MAAM,KAC/BI,EAAQL,EAAQtB,QAAQqB,EACf,KAATM,IACFL,EAAQM,OAAOD,EAAO,GACtBf,EAAKS,UAAYC,EAAQG,KAAK,OAalCvI,QAAQ2I,QAAU,SAASvE,EAAQwE,GACjC,GAAIjD,GACAC,CACJ,IAAIQ,MAAMC,QAAQjC,GAEhB,IAAKuB,EAAI,EAAGC,EAAMxB,EAAO0B,OAAYF,EAAJD,EAASA,IACxCiD,EAASxE,EAAOuB,GAAIA,EAAGvB,OAKzB,KAAKuB,IAAKvB,GACJA,EAAO6B,eAAeN,IACxBiD,EAASxE,EAAOuB,GAAIA,EAAGvB,IAY/BpE,QAAQ6I,QAAU,SAASzE,GACzB,GAAI0E,KAEJ,KAAK,GAAI9C,KAAQ5B,GACXA,EAAO6B,eAAeD,IAAO8C,EAAMR,KAAKlE,EAAO4B,GAGrD,OAAO8C,IAUT9I,QAAQ+I,eAAiB,SAAS3E,EAAQ4E,EAAKxB,GAC7C,MAAIpD,GAAO4E,KAASxB,GAClBpD,EAAO4E,GAAOxB,GACP,IAGA,GAYXxH,QAAQiJ,iBAAmB,SAASC,EAASC,EAAQC,EAAUC,GACzDH,EAAQD,kBACStC,SAAf0C,IACFA,GAAa,GAEA,eAAXF,GAA2BG,UAAUC,UAAUzC,QAAQ,YAAc,IACvEqC,EAAS,kBAGXD,EAAQD,iBAAiBE,EAAQC,EAAUC,IAE3CH,EAAQM,YAAY,KAAOL,EAAQC,IAWvCpJ,QAAQyJ,oBAAsB,SAASP,EAASC,EAAQC,EAAUC,GAC5DH,EAAQO,qBAES9C,SAAf0C,IACFA,GAAa,GAEA,eAAXF,GAA2BG,UAAUC,UAAUzC,QAAQ,YAAc,IACvEqC,EAAS,kBAGXD,EAAQO,oBAAoBN,EAAQC,EAAUC,IAG9CH,EAAQQ,YAAY,KAAOP,EAAQC,IAOvCpJ,QAAQ2J,eAAiB,SAAUC,GAC5BA,IACHA,EAAQ/B,OAAO+B,OAEbA,EAAMD,eACRC,EAAMD,iBAGNC,EAAMC,aAAc,GASxB7J,QAAQ8J,UAAY,SAASF,GAEtBA,IACHA,EAAQ/B,OAAO+B,MAGjB,IAAIG,EAcJ,OAZIH,GAAMG,OACRA,EAASH,EAAMG,OAERH,EAAMI,aACbD,EAASH,EAAMI,YAGMrD,QAAnBoD,EAAOE,UAA4C,GAAnBF,EAAOE,WAEzCF,EAASA,EAAOG,YAGXH,GAGT/J,QAAQmK,UAQRnK,QAAQmK,OAAOC,UAAY,SAAU5C,EAAO6C,GAK1C,MAJoB,kBAAT7C,KACTA,EAAQA,KAGG,MAATA,EACe,GAATA,EAGH6C,GAAgB,MASzBrK,QAAQmK,OAAOG,SAAW,SAAU9C,EAAO6C,GAKzC,MAJoB,kBAAT7C,KACTA,EAAQA,KAGG,MAATA,EACKnD,OAAOmD,IAAU6C,GAAgB,KAGnCA,GAAgB,MASzBrK,QAAQmK,OAAOI,SAAW,SAAU/C,EAAO6C,GAKzC,MAJoB,kBAAT7C,KACTA,EAAQA,KAGG,MAATA,EACKjD,OAAOiD,GAGT6C,GAAgB,MASzBrK,QAAQmK,OAAOK,OAAS,SAAUhD,EAAO6C,GAKvC,MAJoB,kBAAT7C,KACTA,EAAQA,KAGNxH,QAAQsE,SAASkD,GACZA,EAEAxH,QAAQmE,SAASqD,GACjBA,EAAQ,KAGR6C,GAAgB,MAU3BrK,QAAQmK,OAAOM,UAAY,SAAUjD,EAAO6C,GAK1C,MAJoB,kBAAT7C,KACTA,EAAQA,KAGHA,GAAS6C,GAAgB,MAKlCrK,QAAQ0K,QAAU,SAASC,KACzB,GAAIC,MAiBJ,OAdEA,OADS,KAAPD,IACM,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GACM,KAAPA,IACC,GAEAE,KAAKF,MAKjB3K,QAAQ8K,QAAU,SAASC,GACzB,GAAIH,EAiBJ,OAdEA,GADQ,IAAPG,EACO,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IACM,IAAPA,EACC,IAEA,GAAKA,GAWjB/K,QAAQgL,WAAa,SAASC,GAC5B,GAAIpK,EACJ,IAAIb,QAAQsE,SAAS2G,GAAQ,CAC3B,GAAIjL,QAAQkL,WAAWD,GAAQ,CAC7B,GAAIE,GAAMF,EAAMG,OAAO,GAAGA,OAAO,EAAEH,EAAMnF,OAAO,GAAGuC,MAAM,IACzD4C,GAAQjL,QAAQqL,SAASF,EAAI,GAAGA,EAAI,GAAGA,EAAI,IAE7C,GAAInL,QAAQsL,WAAWL,GAAQ,CAC7B,GAAIM,GAAMvL,QAAQwL,SAASP,GACvBQ,GAAmBC,EAAEH,EAAIG,EAAEC,EAAU,IAARJ,EAAII,EAASC,EAAEvG,KAAKwG,IAAI,EAAU,KAARN,EAAIK,IAC3DE,GAAmBJ,EAAEH,EAAIG,EAAEC,EAAEtG,KAAKwG,IAAI,EAAU,KAARN,EAAIK,GAAUA,EAAQ,GAANL,EAAIK,GAC5DG,EAAkB/L,QAAQgM,SAASF,EAAeJ,EAAGI,EAAeJ,EAAGI,EAAeF,GACtFK,EAAkBjM,QAAQgM,SAASP,EAAgBC,EAAED,EAAgBE,EAAEF,EAAgBG,EAE3F/K,IACEqL,WAAYjB,EACZkB,OAAOJ,EACPK,WACEF,WAAWD,EACXE,OAAOJ,GAETM,OACEH,WAAWD,EACXE,OAAOJ,QAKXlL,IACEqL,WAAWjB,EACXkB,OAAOlB,EACPmB,WACEF,WAAWjB,EACXkB,OAAOlB,GAEToB,OACEH,WAAWjB,EACXkB,OAAOlB,QAMbpK,MACAA,EAAEqL,WAAajB,EAAMiB,YAAc,QACnCrL,EAAEsL,OAASlB,EAAMkB,QAAUtL,EAAEqL,WAEzBlM,QAAQsE,SAAS2G,EAAMmB,WACzBvL,EAAEuL,WACAD,OAAQlB,EAAMmB,UACdF,WAAYjB,EAAMmB,YAIpBvL,EAAEuL,aACFvL,EAAEuL,UAAUF,WAAajB,EAAMmB,WAAanB,EAAMmB,UAAUF,YAAcrL,EAAEqL,WAC5ErL,EAAEuL,UAAUD,OAASlB,EAAMmB,WAAanB,EAAMmB,UAAUD,QAAUtL,EAAEsL,QAGlEnM,QAAQsE,SAAS2G,EAAMoB,OACzBxL,EAAEwL,OACAF,OAAQlB,EAAMoB,MACdH,WAAYjB,EAAMoB,QAIpBxL,EAAEwL,SACFxL,EAAEwL,MAAMH,WAAajB,EAAMoB,OAASpB,EAAMoB,MAAMH,YAAcrL,EAAEqL,WAChErL,EAAEwL,MAAMF,OAASlB,EAAMoB,OAASpB,EAAMoB,MAAMF,QAAUtL,EAAEsL,OAI5D,OAAOtL,IASTb,QAAQsM,SAAW,SAASC,GAC1BA,EAAMA,EAAIC,QAAQ,IAAI,IAAIC,aAE1B,IAAI/G,GAAI1F,QAAQ0K,QAAQ6B,EAAIG,UAAU,EAAG,IACrCnG,EAAIvG,QAAQ0K,QAAQ6B,EAAIG,UAAU,EAAG,IACrC7L,EAAIb,QAAQ0K,QAAQ6B,EAAIG,UAAU,EAAG,IACrCC,EAAI3M,QAAQ0K,QAAQ6B,EAAIG,UAAU,EAAG,IACrCE,EAAI5M,QAAQ0K,QAAQ6B,EAAIG,UAAU,EAAG,IACrCG,EAAI7M,QAAQ0K,QAAQ6B,EAAIG,UAAU,EAAG,IAErCI,EAAS,GAAJpH,EAAUa,EACfwG,EAAS,GAAJlM,EAAU8L,EACfpG,EAAS,GAAJqG,EAAUC,CAEnB,QAAQC,EAAEA,EAAEC,EAAEA,EAAExG,EAAEA,IAGpBvG,QAAQqL,SAAW,SAAS2B,EAAIC,EAAMC,GACpC,GAAIxH,GAAI1F,QAAQ8K,QAAQzF,KAAKC,MAAM0H,EAAM,KACrCzG,EAAIvG,QAAQ8K,QAAQkC,EAAM,IAC1BnM,EAAIb,QAAQ8K,QAAQzF,KAAKC,MAAM2H,EAAQ,KACvCN,EAAI3M,QAAQ8K,QAAQmC,EAAQ,IAC5BL,EAAI5M,QAAQ8K,QAAQzF,KAAKC,MAAM4H,EAAO,KACtCL,EAAI7M,QAAQ8K,QAAQoC,EAAO,IAE3BX,EAAM7G,EAAIa,EAAI1F,EAAI8L,EAAIC,EAAIC,CAC9B,OAAO,IAAMN,GAafvM,QAAQmN,SAAW,SAASH,EAAIC,EAAMC,GACpCF,GAAQ,IAAKC,GAAY,IAAKC,GAAU,GACxC,IAAIE,GAAS/H,KAAKwG,IAAImB,EAAI3H,KAAKwG,IAAIoB,EAAMC,IACrCG,EAAShI,KAAKiI,IAAIN,EAAI3H,KAAKiI,IAAIL,EAAMC,GAGzC,IAAIE,GAAUC,EACZ,OAAQ3B,EAAE,EAAEC,EAAE,EAAEC,EAAEwB,EAIpB,IAAIT,GAAKK,GAAKI,EAAUH,EAAMC,EAASA,GAAME,EAAUJ,EAAIC,EAAQC,EAAKF,EACpEtB,EAAKsB,GAAKI,EAAU,EAAMF,GAAME,EAAU,EAAI,EAC9CG,EAAM,IAAI7B,EAAIiB,GAAGU,EAASD,IAAS,IACnCI,GAAcH,EAASD,GAAQC,EAC/B7F,EAAQ6F,CACZ,QAAQ3B,EAAE6B,EAAI5B,EAAE6B,EAAW5B,EAAEpE,GAG/B,IAAIiG,UAEFpF,MAAO,SAAUqF,GACf,GAAIC,KAWJ,OATAD,GAAQrF,MAAM,KAAKM,QAAQ,SAAUiF,GACnC,GAAoB,IAAhBA,EAAMC,OAAc,CACtB,GAAIC,GAAQF,EAAMvF,MAAM,KACpBW,EAAM8E,EAAM,GAAGD,OACfrG,EAAQsG,EAAM,GAAGD,MACrBF,GAAO3E,GAAOxB,KAIXmG,GAITpF,KAAM,SAAUoF,GACd,MAAOjH,QAAOqH,KAAKJ,GACdK,IAAI,SAAUhF,GACb,MAAOA,GAAM,KAAO2E,EAAO3E,KAE5BT,KAAK,OASdvI,SAAQiO,WAAa,SAAU/E,EAASwE,GACtC,GAAIQ,GAAgBT,QAAQpF,MAAMa,EAAQ0E,MAAMF,SAC5CS,EAAYV,QAAQpF,MAAMqF,GAC1BC,EAAS3N,QAAQyF,OAAOyI,EAAeC,EAE3CjF,GAAQ0E,MAAMF,QAAUD,QAAQlF,KAAKoF,IAQvC3N,QAAQoO,cAAgB,SAAUlF,EAASwE,GACzC,GAAIC,GAASF,QAAQpF,MAAMa,EAAQ0E,MAAMF,SACrCW,EAAeZ,QAAQpF,MAAMqF,EAEjC,KAAK,GAAI1E,KAAOqF,GACVA,EAAapI,eAAe+C,UACvB2E,GAAO3E,EAIlBE,GAAQ0E,MAAMF,QAAUD,QAAQlF,KAAKoF,IAWvC3N,QAAQsO,SAAW,SAAS5C,EAAGC,EAAGC,GAChC,GAAIkB,GAAGC,EAAGxG,EAENZ,EAAIN,KAAKC,MAAU,EAAJoG,GACfmB,EAAQ,EAAJnB,EAAQ/F,EACZ7E,EAAI8K,GAAK,EAAID,GACb4C,EAAI3C,GAAK,EAAIiB,EAAIlB,GACjB6C,EAAI5C,GAAK,GAAK,EAAIiB,GAAKlB,EAE3B,QAAQhG,EAAI,GACV,IAAK,GAAGmH,EAAIlB,EAAGmB,EAAIyB,EAAGjI,EAAIzF,CAAG,MAC7B,KAAK,GAAGgM,EAAIyB,EAAGxB,EAAInB,EAAGrF,EAAIzF,CAAG,MAC7B,KAAK,GAAGgM,EAAIhM,EAAGiM,EAAInB,EAAGrF,EAAIiI,CAAG,MAC7B,KAAK,GAAG1B,EAAIhM,EAAGiM,EAAIwB,EAAGhI,EAAIqF,CAAG,MAC7B,KAAK,GAAGkB,EAAI0B,EAAGzB,EAAIjM,EAAGyF,EAAIqF,CAAG,MAC7B,KAAK,GAAGkB,EAAIlB,EAAGmB,EAAIjM,EAAGyF,EAAIgI,EAG5B,OAAQzB,EAAEzH,KAAKC,MAAU,IAAJwH,GAAUC,EAAE1H,KAAKC,MAAU,IAAJyH,GAAUxG,EAAElB,KAAKC,MAAU,IAAJiB,KAGrEvG,QAAQgM,SAAW,SAASN,EAAGC,EAAGC,GAChC,GAAIT,GAAMnL,QAAQsO,SAAS5C,EAAGC,EAAGC,EACjC,OAAO5L,SAAQqL,SAASF,EAAI2B,EAAG3B,EAAI4B,EAAG5B,EAAI5E,IAG5CvG,QAAQwL,SAAW,SAASe,GAC1B,GAAIpB,GAAMnL,QAAQsM,SAASC,EAC3B,OAAOvM,SAAQmN,SAAShC,EAAI2B,EAAG3B,EAAI4B,EAAG5B,EAAI5E,IAG5CvG,QAAQsL,WAAa,SAASiB,GAC5B,GAAIkC,GAAO,qCAAqCC,KAAKnC,EACrD,OAAOkC,IAGTzO,QAAQkL,WAAa,SAASC,GAC5BA,EAAMA,EAAIqB,QAAQ,IAAI,GACtB,IAAIiC,GAAO,wCAAwCC,KAAKvD,EACxD,OAAOsD,IAUTzO,QAAQ2O,sBAAwB,SAASC,EAAQC,GAC/C,GAA8B,gBAAnBA,GAA6B,CAEtC,IAAK,GADDC,GAAWpI,OAAOqI,OAAOF,GACpBlJ,EAAI,EAAGA,EAAIiJ,EAAO9I,OAAQH,IAC7BkJ,EAAgB5I,eAAe2I,EAAOjJ,KACC,gBAA9BkJ,GAAgBD,EAAOjJ,MAChCmJ,EAASF,EAAOjJ,IAAM3F,QAAQgP,aAAaH,EAAgBD,EAAOjJ,KAIxE,OAAOmJ,GAGP,MAAO,OAWX9O,QAAQgP,aAAe,SAASH,GAC9B,GAA8B,gBAAnBA,GAA6B,CACtC,GAAIC,GAAWpI,OAAOqI,OAAOF,EAC7B,KAAK,GAAIlJ,KAAKkJ,GACRA,EAAgB5I,eAAeN,IACA,gBAAtBkJ,GAAgBlJ,KACzBmJ,EAASnJ,GAAK3F,QAAQgP,aAAaH,EAAgBlJ,IAIzD,OAAOmJ,GAGP,MAAO,OAcX9O,QAAQiP,aAAe,SAAUC,EAAaC,EAAShF,GACrD,GAAwBxD,SAApBwI,EAAQhF,GACV,GAA8B,iBAAnBgF,GAAQhF,GACjB+E,EAAY/E,GAAQiF,QAAUD,EAAQhF,OAEnC,CACH+E,EAAY/E,GAAQiF,SAAU,CAC9B,KAAKpJ,OAAQmJ,GAAQhF,GACfgF,EAAQhF,GAAQlE,eAAeD,QACjCkJ,EAAY/E,GAAQnE,MAAQmJ,EAAQhF,GAAQnE,SAiBtDhG,QAAQiP,aAAe,SAAUC,EAAaC,EAAShF,GACrD,GAAwBxD,SAApBwI,EAAQhF,GACV,GAA8B,iBAAnBgF,GAAQhF,GACjB+E,EAAY/E,GAAQiF,QAAUD,EAAQhF,OAEnC,CACH+E,EAAY/E,GAAQiF,SAAU,CAC9B,KAAKpJ,OAAQmJ,GAAQhF,GACfgF,EAAQhF,GAAQlE,eAAeD,QACjCkJ,EAAY/E,GAAQnE,MAAQmJ,EAAQhF,GAAQnE,SAqBtDhG,QAAQqP,mBAAqB,SAASC,EAAcC,EAAgBC,EAAOC,GAMzE,IALA,GAAIC,GAAgB,IAChBC,EAAY,EACZC,EAAM,EACNC,EAAOP,EAAaxJ,OAAS,EAEnB+J,GAAPD,GAA2BF,EAAZC,GAA2B,CAC/C,GAAIG,GAASzK,KAAKC,OAAOsK,EAAMC,GAAQ,GAEnCE,EAAOT,EAAaQ,GACpBtI,EAAoBb,SAAX8I,EAAwBM,EAAKP,GAASO,EAAKP,GAAOC,GAE3DO,EAAeT,EAAe/H,EAClC,IAAoB,GAAhBwI,EACF,MAAOF,EAEgB,KAAhBE,EACPJ,EAAME,EAAS,EAGfD,EAAOC,EAAS,EAGlBH,IAGF,MAAO,IAeT3P,QAAQiQ,kBAAoB,SAASX,EAAcvF,EAAQyF,EAAOU,GAOhE,IANA,GAIIC,GAAW3I,EAAO4I,EAAWN,EAJ7BJ,EAAgB,IAChBC,EAAY,EACZC,EAAM,EACNC,EAAOP,EAAaxJ,OAAS,EAGnB+J,GAAPD,GAA2BF,EAAZC,GAA2B,CAO/C,GALAG,EAASzK,KAAKC,MAAM,IAAKuK,EAAKD,IAC9BO,EAAYb,EAAajK,KAAKiI,IAAI,EAAEwC,EAAS,IAAIN,GACjDhI,EAAY8H,EAAaQ,GAAQN,GACjCY,EAAYd,EAAajK,KAAKwG,IAAIyD,EAAaxJ,OAAO,EAAEgK,EAAS,IAAIN,GAEjEhI,GAASuC,EACX,MAAO+F,EAEJ,IAAgB/F,EAAZoG,GAAsB3I,EAAQuC,EACrC,MAAyB,UAAlBmG,EAA6B7K,KAAKiI,IAAI,EAAEwC,EAAS,GAAKA,CAE1D,IAAY/F,EAARvC,GAAkB4I,EAAYrG,EACrC,MAAyB,UAAlBmG,EAA6BJ,EAASzK,KAAKwG,IAAIyD,EAAaxJ,OAAO,EAAEgK,EAAS,EAGzE/F,GAARvC,EACFoI,EAAME,EAAS,EAGfD,EAAOC,EAAS,EAGpBH,IAIF,MAAO,IAYT3P,QAAQqQ,cAAgB,SAAU7B,EAAG8B,EAAOC,EAAKC,GAC/C,GAAIC,GAASF,EAAMD,CAEnB,OADA9B,IAAKgC,EAAS,EACN,EAAJhC,EAAciC,EAAO,EAAEjC,EAAEA,EAAI8B,GACjC9B,KACQiC,EAAO,GAAKjC,GAAGA,EAAE,GAAK,GAAK8B,IAUrCtQ,QAAQ0Q,iBAENC,OAAQ,SAAUnC,GAChB,MAAOA,IAGToC,WAAY,SAAUpC,GACpB,MAAOA,GAAIA,GAGbqC,YAAa,SAAUrC,GACrB,MAAOA,IAAK,EAAIA,IAGlB6B,cAAe,SAAU7B,GACvB,MAAW,GAAJA,EAAS,EAAIA,EAAIA,EAAI,IAAM,EAAI,EAAIA,GAAKA,GAGjDsC,YAAa,SAAUtC,GACrB,MAAOA,GAAIA,EAAIA,GAGjBuC,aAAc,SAAUvC,GACtB,QAAUA,EAAKA,EAAIA,EAAI,GAGzBwC,eAAgB,SAAUxC,GACxB,MAAW,GAAJA,EAAS,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,GAGxEyC,YAAa,SAAUzC,GACrB,MAAOA,GAAIA,EAAIA,EAAIA,GAGrB0C,aAAc,SAAU1C,GACtB,MAAO,MAAOA,EAAKA,EAAIA,EAAIA,GAG7B2C,eAAgB,SAAU3C,GACxB,MAAW,GAAJA,EAAS,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,IAAOA,EAAKA,EAAIA,EAAIA,GAG9D4C,YAAa,SAAU5C,GACrB,MAAOA,GAAIA,EAAIA,EAAIA,EAAIA,GAGzB6C,aAAc,SAAU7C,GACtB,MAAO,KAAOA,EAAKA,EAAIA,EAAIA,EAAIA,GAGjC8C,eAAgB,SAAU9C,GACxB,MAAW,GAAJA,EAAS,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAQA,EAAKA,EAAIA,EAAIA,EAAIA,KAMtE,SAASvO,EAAQD,GASrBA,EAAQuR,gBAAkB,SAASC,GAEjC,IAAK,GAAIC,KAAeD,GAClBA,EAAcvL,eAAewL,KAC/BD,EAAcC,GAAaC,UAAYF,EAAcC,GAAaE,KAClEH,EAAcC,GAAaE,UAYjC3R,EAAQ4R,gBAAkB,SAASJ,GAEjC,IAAK,GAAIC,KAAeD,GACtB,GAAIA,EAAcvL,eAAewL,IAC3BD,EAAcC,GAAaC,UAAW,CACxC,IAAK,GAAI/L,GAAI,EAAGA,EAAI6L,EAAcC,GAAaC,UAAU5L,OAAQH,IAC/D6L,EAAcC,GAAaC,UAAU/L,GAAGuE,WAAW2H,YAAYL,EAAcC,GAAaC,UAAU/L,GAEtG6L,GAAcC,GAAaC,eAgBnC1R,EAAQ8R,cAAgB,SAAUL,EAAaD,EAAeO,GAC5D,GAAI7I,EAqBJ,OAnBIsI,GAAcvL,eAAewL,GAE3BD,EAAcC,GAAaC,UAAU5L,OAAS,GAChDoD,EAAUsI,EAAcC,GAAaC,UAAU,GAC/CF,EAAcC,GAAaC,UAAUM,UAIrC9I,EAAU+I,SAASC,gBAAgB,6BAA8BT,GACjEM,EAAaI,YAAYjJ,KAK3BA,EAAU+I,SAASC,gBAAgB,6BAA8BT,GACjED,EAAcC,IAAgBE,QAAUD,cACxCK,EAAaI,YAAYjJ,IAE3BsI,EAAcC,GAAaE,KAAKrJ,KAAKY,GAC9BA,GAcTlJ,EAAQoS,cAAgB,SAAUX,EAAaD,EAAea,EAAcC,GAC1E,GAAIpJ,EA+BJ,OA7BIsI,GAAcvL,eAAewL,GAE3BD,EAAcC,GAAaC,UAAU5L,OAAS,GAChDoD,EAAUsI,EAAcC,GAAaC,UAAU,GAC/CF,EAAcC,GAAaC,UAAUM,UAIrC9I,EAAU+I,SAASM,cAAcd,GACZ9K,SAAjB2L,EACFD,EAAaC,aAAapJ,EAASoJ,GAGnCD,EAAaF,YAAYjJ,KAM7BA,EAAU+I,SAASM,cAAcd,GACjCD,EAAcC,IAAgBE,QAAUD,cACnB/K,SAAjB2L,EACFD,EAAaC,aAAapJ,EAASoJ,GAGnCD,EAAaF,YAAYjJ,IAG7BsI,EAAcC,GAAaE,KAAKrJ,KAAKY,GAC9BA,GAkBTlJ,EAAQwS,UAAY,SAASC,EAAGC,EAAGC,EAAOnB,EAAeO,GACvD,GAAIa,EAmBJ,OAlBsC,UAAlCD,EAAMxD,QAAQ0D,WAAWjF,OAC3BgF,EAAQ5S,EAAQ8R,cAAc,SAASN,EAAcO,GACrDa,EAAME,eAAe,KAAM,KAAML,GACjCG,EAAME,eAAe,KAAM,KAAMJ,GACjCE,EAAME,eAAe,KAAM,IAAK,GAAMH,EAAMxD,QAAQ0D,WAAWE,QAG/DH,EAAQ5S,EAAQ8R,cAAc,OAAON,EAAcO,GACnDa,EAAME,eAAe,KAAM,IAAKL,EAAI,GAAIE,EAAMxD,QAAQ0D,WAAWE,MACjEH,EAAME,eAAe,KAAM,IAAKJ,EAAI,GAAIC,EAAMxD,QAAQ0D,WAAWE,MACjEH,EAAME,eAAe,KAAM,QAASH,EAAMxD,QAAQ0D,WAAWE,MAC7DH,EAAME,eAAe,KAAM,SAAUH,EAAMxD,QAAQ0D,WAAWE,OAGzBpM,SAApCgM,EAAMxD,QAAQ0D,WAAWlF,QAC1BiF,EAAME,eAAe,KAAM,QAASH,EAAMA,MAAMxD,QAAQ0D,WAAWlF,QAErEiF,EAAME,eAAe,KAAM,QAASH,EAAMxK,UAAY,UAC/CyK,GAUT5S,EAAQgT,QAAU,SAAUP,EAAGC,EAAGO,EAAOC,EAAQ/K,EAAWqJ,EAAeO,GACzE,GAAc,GAAVmB,EAAa,CACF,EAATA,IACFA,GAAU,GACVR,GAAKQ,EAEP,IAAIC,GAAOnT,EAAQ8R,cAAc,OAAON,EAAeO,EACvDoB,GAAKL,eAAe,KAAM,IAAKL,EAAI,GAAMQ,GACzCE,EAAKL,eAAe,KAAM,IAAKJ,GAC/BS,EAAKL,eAAe,KAAM,QAASG,GACnCE,EAAKL,eAAe,KAAM,SAAUI,GACpCC,EAAKL,eAAe,KAAM,QAAS3K,MAMnC,SAASlI,EAAQD,EAASM,GAgD9B,QAASW,GAASmS,EAAMjE,GActB,IAZIiE,GAAShN,MAAMC,QAAQ+M,IAAUrS,EAAKgE,YAAYqO,KACpDjE,EAAUiE,EACVA,EAAO,MAGThT,KAAKiT,SAAWlE,MAChB/O,KAAKkT,SACLlT,KAAKmT,SAAWnT,KAAKiT,SAASG,SAAW,KACzCpT,KAAKqT,SAIDrT,KAAKiT,SAASpM,KAChB,IAAK,GAAIuI,KAASpP,MAAKiT,SAASpM,KAC9B,GAAI7G,KAAKiT,SAASpM,KAAKhB,eAAeuJ,GAAQ,CAC5C,GAAIhI,GAAQpH,KAAKiT,SAASpM,KAAKuI,EAE7BpP,MAAKqT,MAAMjE,GADA,QAAThI,GAA4B,WAATA,GAA+B,WAATA,EACvB,OAGAA,EAO5B,GAAIpH,KAAKiT,SAASrM,QAChB,KAAM,IAAIhD,OAAM,sDAGlB5D,MAAKsT,gBAGDN,GACFhT,KAAKuT,IAAIP,GAGXhT,KAAKwT,WAAWzE,GAtFlB,GAAIpO,GAAOT,EAAoB,GAC3Ba,EAAQb,EAAoB,EAiGhCW,GAAQ4S,UAAUD,WAAa,SAASzE,GAClCA,GAA6BxI,SAAlBwI,EAAQ2E,QACjB3E,EAAQ2E,SAAU,EAEhB1T,KAAK2T,SACP3T,KAAK2T,OAAOC,gBACL5T,MAAK2T,SAKT3T,KAAK2T,SACR3T,KAAK2T,OAAS5S,EAAMsE,OAAOrF,MACzBoM,SAAU,MAAO,SAAU,aAIF,gBAAlB2C,GAAQ2E,OACjB1T,KAAK2T,OAAOH,WAAWzE,EAAQ2E,UAevC7S,EAAQ4S,UAAUI,GAAK,SAASrK,EAAOhB,GACrC,GAAIsL,GAAc9T,KAAKsT,aAAa9J,EAC/BsK,KACHA,KACA9T,KAAKsT,aAAa9J,GAASsK,GAG7BA,EAAY5L,MACVM,SAAUA,KAKd3H,EAAQ4S,UAAUM,UAAYlT,EAAQ4S,UAAUI,GAOhDhT,EAAQ4S,UAAUO,IAAM,SAASxK,EAAOhB,GACtC,GAAIsL,GAAc9T,KAAKsT,aAAa9J,EAChCsK,KACF9T,KAAKsT,aAAa9J,GAASsK,EAAYG,OAAO,SAAUjL,GACtD,MAAQA,GAASR,UAAYA,MAMnC3H,EAAQ4S,UAAUS,YAAcrT,EAAQ4S,UAAUO,IASlDnT,EAAQ4S,UAAUU,SAAW,SAAU3K,EAAO4K,EAAQC,GACpD,GAAa,KAAT7K,EACF,KAAM,IAAI5F,OAAM,yBAGlB,IAAIkQ,KACAtK,KAASxJ,MAAKsT,eAChBQ,EAAcA,EAAYQ,OAAOtU,KAAKsT,aAAa9J,KAEjD,KAAOxJ,MAAKsT,eACdQ,EAAcA,EAAYQ,OAAOtU,KAAKsT,aAAa,MAGrD,KAAK,GAAI/N,GAAI,EAAGA,EAAIuO,EAAYpO,OAAQH,IAAK,CAC3C,GAAIgP,GAAaT,EAAYvO,EACzBgP,GAAW/L,UACb+L,EAAW/L,SAASgB,EAAO4K,EAAQC,GAAY,QAYrDxT,EAAQ4S,UAAUF,IAAM,SAAUP,EAAMqB,GACtC,GACIhU,GADAmU,KAEAC,EAAKzU,IAET,IAAIgG,MAAMC,QAAQ+M,GAEhB,IAAK,GAAIzN,GAAI,EAAGC,EAAMwN,EAAKtN,OAAYF,EAAJD,EAASA,IAC1ClF,EAAKoU,EAAGC,SAAS1B,EAAKzN,IACtBiP,EAAStM,KAAK7H,OAGb,IAAIM,EAAKgE,YAAYqO,GAGxB,IAAK,GADD2B,GAAU3U,KAAK4U,gBAAgB5B,GAC1B6B,EAAM,EAAGC,EAAO9B,EAAK+B,kBAAyBD,EAAND,EAAYA,IAAO,CAElE,IAAK,GADDlF,MACKqF,EAAM,EAAGC,EAAON,EAAQjP,OAAcuP,EAAND,EAAYA,IAAO,CAC1D,GAAI5F,GAAQuF,EAAQK,EACpBrF,GAAKP,GAAS4D,EAAKkC,SAASL,EAAKG,GAGnC3U,EAAKoU,EAAGC,SAAS/E,GACjB6E,EAAStM,KAAK7H,OAGb,CAAA,KAAI2S,YAAgB1M,SAMvB,KAAM,IAAI1C,OAAM,mBAJhBvD,GAAKoU,EAAGC,SAAS1B,GACjBwB,EAAStM,KAAK7H,GAUhB,MAJImU,GAAS9O,QACX1F,KAAKmU,SAAS,OAAQlS,MAAOuS,GAAWH,GAGnCG,GAST3T,EAAQ4S,UAAU0B,OAAS,SAAUnC,EAAMqB,GACzC,GAAIG,MACAY,KACAC,KACAZ,EAAKzU,KACLoT,EAAUqB,EAAGtB,SAEbmC,EAAc,SAAU3F,GAC1B,GAAItP,GAAKsP,EAAKyD,EACVqB,GAAGvB,MAAM7S,IAEXA,EAAKoU,EAAGc,YAAY5F,GACpByF,EAAWlN,KAAK7H,GAChBgV,EAAYnN,KAAKyH,KAIjBtP,EAAKoU,EAAGC,SAAS/E,GACjB6E,EAAStM,KAAK7H,IAIlB,IAAI2F,MAAMC,QAAQ+M,GAEhB,IAAK,GAAIzN,GAAI,EAAGC,EAAMwN,EAAKtN,OAAYF,EAAJD,EAASA,IAC1C+P,EAAYtC,EAAKzN,QAGhB,IAAI5E,EAAKgE,YAAYqO,GAGxB,IAAK,GADD2B,GAAU3U,KAAK4U,gBAAgB5B,GAC1B6B,EAAM,EAAGC,EAAO9B,EAAK+B,kBAAyBD,EAAND,EAAYA,IAAO,CAElE,IAAK,GADDlF,MACKqF,EAAM,EAAGC,EAAON,EAAQjP,OAAcuP,EAAND,EAAYA,IAAO,CAC1D,GAAI5F,GAAQuF,EAAQK,EACpBrF,GAAKP,GAAS4D,EAAKkC,SAASL,EAAKG,GAGnCM,EAAY3F,OAGX,CAAA,KAAIqD,YAAgB1M,SAKvB,KAAM,IAAI1C,OAAM,mBAHhB0R,GAAYtC,GAad,MAPIwB,GAAS9O,QACX1F,KAAKmU,SAAS,OAAQlS,MAAOuS,GAAWH,GAEtCe,EAAW1P,QACb1F,KAAKmU,SAAS,UAAWlS,MAAOmT,EAAYpC,KAAMqC,GAAchB,GAG3DG,EAASF,OAAOc,IAsCzBvU,EAAQ4S,UAAU+B,IAAM,WACtB,GAGInV,GAAIoV,EAAK1G,EAASiE,EAHlByB,EAAKzU,KAIL0V,EAAY/U,EAAKuG,QAAQzB,UAAU,GACtB,WAAbiQ,GAAsC,UAAbA,GAE3BrV,EAAKoF,UAAU,GACfsJ,EAAUtJ,UAAU,GACpBuN,EAAOvN,UAAU,IAEG,SAAbiQ,GAEPD,EAAMhQ,UAAU,GAChBsJ,EAAUtJ,UAAU,GACpBuN,EAAOvN,UAAU,KAIjBsJ,EAAUtJ,UAAU,GACpBuN,EAAOvN,UAAU,GAInB,IAAIkQ,EACJ,IAAI5G,GAAWA,EAAQ4G,WAAY,CACjC,GAAIC,IAAiB,YAAa,QAAS,SAG3C,IAFAD,EAA0D,IAA7CC,EAAclP,QAAQqI,EAAQ4G,YAAoB,QAAU5G,EAAQ4G,WAE7E3C,GAAS2C,GAAchV,EAAKuG,QAAQ8L,GACtC,KAAM,IAAIpP,OAAM,6BAA+BjD,EAAKuG,QAAQ8L,GAAQ,sDACVjE,EAAQlI,KAAO,IAE3E,IAAkB,aAAd8O,IAA8BhV,EAAKgE,YAAYqO,GACjD,KAAM,IAAIpP,OAAM,6EAKlB+R,GADO3C,GAC6B,aAAtBrS,EAAKuG,QAAQ8L,GAAwB,YAGtC,OAIf,IAEgBrD,GAAMkG,EAAQtQ,EAAGC,EAF7BqB,EAAOkI,GAAWA,EAAQlI,MAAQ7G,KAAKiT,SAASpM,KAChDoN,EAASlF,GAAWA,EAAQkF,OAC5BhS,IAGJ,IAAUsE,QAANlG,EAEFsP,EAAO8E,EAAGqB,SAASzV,EAAIwG,GACnBoN,IAAWA,EAAOtE,KACpBA,EAAO,UAGN,IAAWpJ,QAAPkP,EAEP,IAAKlQ,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IACrCoK,EAAO8E,EAAGqB,SAASL,EAAIlQ,GAAIsB,KACtBoN,GAAUA,EAAOtE,KACpB1N,EAAMiG,KAAKyH,OAMf,KAAKkG,IAAU7V,MAAKkT,MACdlT,KAAKkT,MAAMrN,eAAegQ,KAC5BlG,EAAO8E,EAAGqB,SAASD,EAAQhP,KACtBoN,GAAUA,EAAOtE,KACpB1N,EAAMiG,KAAKyH,GAYnB,IALIZ,GAAWA,EAAQgH,OAAexP,QAANlG,GAC9BL,KAAKgW,MAAM/T,EAAO8M,EAAQgH,OAIxBhH,GAAWA,EAAQP,OAAQ,CAC7B,GAAIA,GAASO,EAAQP,MACrB,IAAUjI,QAANlG,EACFsP,EAAO3P,KAAKiW,cAActG,EAAMnB,OAGhC,KAAKjJ,EAAI,EAAGC,EAAMvD,EAAMyD,OAAYF,EAAJD,EAASA,IACvCtD,EAAMsD,GAAKvF,KAAKiW,cAAchU,EAAMsD,GAAIiJ,GAM9C,GAAkB,aAAdmH,EAA2B,CAC7B,GAAIhB,GAAU3U,KAAK4U,gBAAgB5B,EACnC,IAAUzM,QAANlG,EAEFoU,EAAGyB,WAAWlD,EAAM2B,EAAShF,OAI7B,KAAKpK,EAAI,EAAGA,EAAItD,EAAMyD,OAAQH,IAC5BkP,EAAGyB,WAAWlD,EAAM2B,EAAS1S,EAAMsD,GAGvC,OAAOyN,GAEJ,GAAkB,UAAd2C,EAAwB,CAC/B,GAAIQ,KACJ,KAAK5Q,EAAI,EAAGA,EAAItD,EAAMyD,OAAQH,IAC5B4Q,EAAOlU,EAAMsD,GAAGlF,IAAM4B,EAAMsD,EAE9B,OAAO4Q,GAIP,GAAU5P,QAANlG,EAEF,MAAOsP,EAIP,IAAIqD,EAAM,CAER,IAAKzN,EAAI,EAAGC,EAAMvD,EAAMyD,OAAYF,EAAJD,EAASA,IACvCyN,EAAK9K,KAAKjG,EAAMsD,GAElB,OAAOyN,GAIP,MAAO/Q,IAcfpB,EAAQ4S,UAAU2C,OAAS,SAAUrH,GACnC,GAIIxJ,GACAC,EACAnF,EACAsP,EACA1N,EARA+Q,EAAOhT,KAAKkT,MACZe,EAASlF,GAAWA,EAAQkF,OAC5B8B,EAAQhH,GAAWA,EAAQgH,MAC3BlP,EAAOkI,GAAWA,EAAQlI,MAAQ7G,KAAKiT,SAASpM,KAMhD4O,IAEJ,IAAIxB,EAEF,GAAI8B,EAAO,CAET9T,IACA,KAAK5B,IAAM2S,GACLA,EAAKnN,eAAexF,KACtBsP,EAAO3P,KAAK8V,SAASzV,EAAIwG,GACrBoN,EAAOtE,IACT1N,EAAMiG,KAAKyH,GAOjB,KAFA3P,KAAKgW,MAAM/T,EAAO8T,GAEbxQ,EAAI,EAAGC,EAAMvD,EAAMyD,OAAYF,EAAJD,EAASA,IACvCkQ,EAAIlQ,GAAKtD,EAAMsD,GAAGvF,KAAKmT,cAKzB,KAAK9S,IAAM2S,GACLA,EAAKnN,eAAexF,KACtBsP,EAAO3P,KAAK8V,SAASzV,EAAIwG,GACrBoN,EAAOtE,IACT8F,EAAIvN,KAAKyH,EAAK3P,KAAKmT,gBAQ3B,IAAI4C,EAAO,CAET9T,IACA,KAAK5B,IAAM2S,GACLA,EAAKnN,eAAexF,IACtB4B,EAAMiG,KAAK8K,EAAK3S,GAMpB,KAFAL,KAAKgW,MAAM/T,EAAO8T,GAEbxQ,EAAI,EAAGC,EAAMvD,EAAMyD,OAAYF,EAAJD,EAASA,IACvCkQ,EAAIlQ,GAAKtD,EAAMsD,GAAGvF,KAAKmT,cAKzB,KAAK9S,IAAM2S,GACLA,EAAKnN,eAAexF,KACtBsP,EAAOqD,EAAK3S,GACZoV,EAAIvN,KAAKyH,EAAK3P,KAAKmT,WAM3B,OAAOsC,IAOT5U,EAAQ4S,UAAU4C,WAAa,WAC7B,MAAOrW,OAaTa,EAAQ4S,UAAUlL,QAAU,SAAUC,EAAUuG,GAC9C,GAGIY,GACAtP,EAJA4T,EAASlF,GAAWA,EAAQkF,OAC5BpN,EAAOkI,GAAWA,EAAQlI,MAAQ7G,KAAKiT,SAASpM,KAChDmM,EAAOhT,KAAKkT,KAIhB,IAAInE,GAAWA,EAAQgH,MAIrB,IAAK,GAFD9T,GAAQjC,KAAKwV,IAAIzG,GAEZxJ,EAAI,EAAGC,EAAMvD,EAAMyD,OAAYF,EAAJD,EAASA,IAC3CoK,EAAO1N,EAAMsD,GACblF,EAAKsP,EAAK3P,KAAKmT,UACf3K,EAASmH,EAAMtP,OAKjB,KAAKA,IAAM2S,GACLA,EAAKnN,eAAexF,KACtBsP,EAAO3P,KAAK8V,SAASzV,EAAIwG,KACpBoN,GAAUA,EAAOtE,KACpBnH,EAASmH,EAAMtP,KAkBzBQ,EAAQ4S,UAAU7F,IAAM,SAAUpF,EAAUuG,GAC1C,GAIIY,GAJAsE,EAASlF,GAAWA,EAAQkF,OAC5BpN,EAAOkI,GAAWA,EAAQlI,MAAQ7G,KAAKiT,SAASpM,KAChDyP,KACAtD,EAAOhT,KAAKkT,KAIhB,KAAK,GAAI7S,KAAM2S,GACTA,EAAKnN,eAAexF,KACtBsP,EAAO3P,KAAK8V,SAASzV,EAAIwG,KACpBoN,GAAUA,EAAOtE,KACpB2G,EAAYpO,KAAKM,EAASmH,EAAMtP,IAUtC,OAJI0O,IAAWA,EAAQgH,OACrB/V,KAAKgW,MAAMM,EAAavH,EAAQgH,OAG3BO,GAUTzV,EAAQ4S,UAAUwC,cAAgB,SAAUtG,EAAMnB,GAChD,GAAI+H,KAEJ,KAAK,GAAInH,KAASO,GACZA,EAAK9J,eAAeuJ,IAAoC,IAAzBZ,EAAO9H,QAAQ0I,KAChDmH,EAAanH,GAASO,EAAKP,GAI/B,OAAOmH,IAST1V,EAAQ4S,UAAUuC,MAAQ,SAAU/T,EAAO8T,GACzC,GAAIpV,EAAKuD,SAAS6R,GAAQ,CAExB,GAAIS,GAAOT,CACX9T,GAAMwU,KAAK,SAAUnR,EAAGa,GACtB,GAAIuQ,GAAKpR,EAAEkR,GACPG,EAAKxQ,EAAEqQ,EACX,OAAQE,GAAKC,EAAM,EAAWA,EAALD,EAAW,GAAK,QAGxC,CAAA,GAAqB,kBAAVX,GAOd,KAAM,IAAI3P,WAAU,uCALpBnE,GAAMwU,KAAKV,KAgBflV,EAAQ4S,UAAUmD,OAAS,SAAUvW,EAAIgU,GACvC,GACI9O,GAAGC,EAAKqR,EADRC,IAGJ,IAAI9Q,MAAMC,QAAQ5F,GAChB,IAAKkF,EAAI,EAAGC,EAAMnF,EAAGqF,OAAYF,EAAJD,EAASA,IACpCsR,EAAY7W,KAAK+W,QAAQ1W,EAAGkF,IACX,MAAbsR,GACFC,EAAW5O,KAAK2O,OAKpBA,GAAY7W,KAAK+W,QAAQ1W,GACR,MAAbwW,GACFC,EAAW5O,KAAK2O,EAQpB,OAJIC,GAAWpR,QACb1F,KAAKmU,SAAS,UAAWlS,MAAO6U,GAAazC,GAGxCyC,GASTjW,EAAQ4S,UAAUsD,QAAU,SAAU1W,GACpC,GAAIM,EAAKoD,SAAS1D,IAAOM,EAAKuD,SAAS7D,IACrC,GAAIL,KAAKkT,MAAM7S,GAEb,aADOL,MAAKkT,MAAM7S,GACXA,MAGN,IAAIA,YAAciG,QAAQ,CAC7B,GAAIuP,GAASxV,EAAGL,KAAKmT,SACrB,IAAI0C,GAAU7V,KAAKkT,MAAM2C,GAEvB,aADO7V,MAAKkT,MAAM2C,GACXA,EAGX,MAAO,OAQThV,EAAQ4S,UAAUuD,MAAQ,SAAU3C,GAClC,GAAIoB,GAAMnP,OAAOqH,KAAK3N,KAAKkT,MAM3B,OAJAlT,MAAKkT,SAELlT,KAAKmU,SAAS,UAAWlS,MAAOwT,GAAMpB,GAE/BoB,GAQT5U,EAAQ4S,UAAUvG,IAAM,SAAUkC,GAChC,GAAI4D,GAAOhT,KAAKkT,MACZhG,EAAM,KACN+J,EAAW,IAEf,KAAK,GAAI5W,KAAM2S,GACb,GAAIA,EAAKnN,eAAexF,GAAK,CAC3B,GAAIsP,GAAOqD,EAAK3S,GACZ6W,EAAYvH,EAAKP,EACJ,OAAb8H,KAAuBhK,GAAOgK,EAAYD,KAC5C/J,EAAMyC,EACNsH,EAAWC,GAKjB,MAAOhK,IAQTrM,EAAQ4S,UAAUhI,IAAM,SAAU2D,GAChC,GAAI4D,GAAOhT,KAAKkT,MACZzH,EAAM,KACN0L,EAAW,IAEf,KAAK,GAAI9W,KAAM2S,GACb,GAAIA,EAAKnN,eAAexF,GAAK,CAC3B,GAAIsP,GAAOqD,EAAK3S,GACZ6W,EAAYvH,EAAKP,EACJ,OAAb8H,KAAuBzL,GAAmB0L,EAAZD,KAChCzL,EAAMkE,EACNwH,EAAWD,GAKjB,MAAOzL,IAUT5K,EAAQ4S,UAAU2D,SAAW,SAAUhI,GACrC,GAII7J,GAJAyN,EAAOhT,KAAKkT,MACZmE,KACAC,EAAYtX,KAAKiT,SAASpM,MAAQ7G,KAAKiT,SAASpM,KAAKuI,IAAU,KAC/DmI,EAAQ,CAGZ,KAAK,GAAI3R,KAAQoN,GACf,GAAIA,EAAKnN,eAAeD,GAAO,CAC7B,GAAI+J,GAAOqD,EAAKpN,GACZwB,EAAQuI,EAAKP,GACboI,GAAS,CACb,KAAKjS,EAAI,EAAOgS,EAAJhS,EAAWA,IACrB,GAAI8R,EAAO9R,IAAM6B,EAAO,CACtBoQ,GAAS,CACT,OAGCA,GAAqBjR,SAAVa,IACdiQ,EAAOE,GAASnQ,EAChBmQ,KAKN,GAAID,EACF,IAAK/R,EAAI,EAAGA,EAAI8R,EAAO3R,OAAQH,IAC7B8R,EAAO9R,GAAK5E,EAAKiG,QAAQyQ,EAAO9R,GAAI+R,EAIxC,OAAOD,IASTxW,EAAQ4S,UAAUiB,SAAW,SAAU/E,GACrC,GAAItP,GAAKsP,EAAK3P,KAAKmT,SAEnB,IAAU5M,QAANlG,GAEF,GAAIL,KAAKkT,MAAM7S,GAEb,KAAM,IAAIuD,OAAM,iCAAmCvD,EAAK,uBAK1DA,GAAKM,EAAKoE,aACV4K,EAAK3P,KAAKmT,UAAY9S,CAGxB,IAAIkM,KACJ,KAAK,GAAI6C,KAASO,GAChB,GAAIA,EAAK9J,eAAeuJ,GAAQ,CAC9B,GAAIkI,GAAYtX,KAAKqT,MAAMjE,EAC3B7C,GAAE6C,GAASzO,EAAKiG,QAAQ+I,EAAKP,GAAQkI,GAKzC,MAFAtX,MAAKkT,MAAM7S,GAAMkM,EAEVlM,GAUTQ,EAAQ4S,UAAUqC,SAAW,SAAUzV,EAAIoX,GACzC,GAAIrI,GAAOhI,EAGPsQ,EAAM1X,KAAKkT,MAAM7S,EACrB,KAAKqX,EACH,MAAO,KAIT,IAAIC,KACJ,IAAIF,EACF,IAAKrI,IAASsI,GACRA,EAAI7R,eAAeuJ,KACrBhI,EAAQsQ,EAAItI,GACZuI,EAAUvI,GAASzO,EAAKiG,QAAQQ,EAAOqQ,EAAMrI,SAMjD,KAAKA,IAASsI,GACRA,EAAI7R,eAAeuJ,KACrBhI,EAAQsQ,EAAItI,GACZuI,EAAUvI,GAAShI,EAIzB,OAAOuQ,IAWT9W,EAAQ4S,UAAU8B,YAAc,SAAU5F,GACxC,GAAItP,GAAKsP,EAAK3P,KAAKmT,SACnB,IAAU5M,QAANlG,EACF,KAAM,IAAIuD,OAAM,6CAA+CgU,KAAKC,UAAUlI,GAAQ,IAExF,IAAIpD,GAAIvM,KAAKkT,MAAM7S,EACnB,KAAKkM,EAEH,KAAM,IAAI3I,OAAM,uCAAyCvD,EAAK,SAIhE,KAAK,GAAI+O,KAASO,GAChB,GAAIA,EAAK9J,eAAeuJ,GAAQ,CAC9B,GAAIkI,GAAYtX,KAAKqT,MAAMjE,EAC3B7C,GAAE6C,GAASzO,EAAKiG,QAAQ+I,EAAKP,GAAQkI,GAIzC,MAAOjX,IASTQ,EAAQ4S,UAAUmB,gBAAkB,SAAUkD,GAE5C,IAAK,GADDnD,MACKK,EAAM,EAAGC,EAAO6C,EAAUC,qBAA4B9C,EAAND,EAAYA,IACnEL,EAAQK,GAAO8C,EAAUE,YAAYhD,IAAQ8C,EAAUG,eAAejD,EAExE,OAAOL,IAUT9T,EAAQ4S,UAAUyC,WAAa,SAAU4B,EAAWnD,EAAShF,GAG3D,IAAK,GAFDkF,GAAMiD,EAAUI,SAEXlD,EAAM,EAAGC,EAAON,EAAQjP,OAAcuP,EAAND,EAAYA,IAAO,CAC1D,GAAI5F,GAAQuF,EAAQK,EACpB8C,GAAUK,SAAStD,EAAKG,EAAKrF,EAAKP,MAItCvP,EAAOD,QAAUiB,GAKb,SAAShB,EAAQD,EAASM,GAe9B,QAASY,GAAUkS,EAAMjE,GACvB/O,KAAKkT,MAAQ,KACblT,KAAKoY,QACLpY,KAAKiT,SAAWlE,MAChB/O,KAAKmT,SAAW,KAChBnT,KAAKsT,eAEL,IAAImB,GAAKzU,IACTA,MAAKgJ,SAAW,WACdyL,EAAG4D,SAASC,MAAM7D,EAAIhP,YAGxBzF,KAAKuY,QAAQvF,GAzBf,GAAIrS,GAAOT,EAAoB,GAC3BW,EAAUX,EAAoB,EAkClCY,GAAS2S,UAAU8E,QAAU,SAAUvF,GACrC,GAAIyC,GAAKlQ,EAAGC,CAEZ,IAAIxF,KAAKkT,MAAO,CAEVlT,KAAKkT,MAAMgB,aACblU,KAAKkT,MAAMgB,YAAY,IAAKlU,KAAKgJ,UAInCyM,IACA,KAAK,GAAIpV,KAAML,MAAKoY,KACdpY,KAAKoY,KAAKvS,eAAexF,IAC3BoV,EAAIvN,KAAK7H,EAGbL,MAAKoY,QACLpY,KAAKmU,SAAS,UAAWlS,MAAOwT,IAKlC,GAFAzV,KAAKkT,MAAQF,EAEThT,KAAKkT,MAAO,CAQd,IANAlT,KAAKmT,SAAWnT,KAAKiT,SAASG,SACzBpT,KAAKkT,OAASlT,KAAKkT,MAAMnE,SAAW/O,KAAKkT,MAAMnE,QAAQqE,SACxD,KAGJqC,EAAMzV,KAAKkT,MAAMkD,QAAQnC,OAAQjU,KAAKiT,UAAYjT,KAAKiT,SAASgB,SAC3D1O,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IACrClF,EAAKoV,EAAIlQ,GACTvF,KAAKoY,KAAK/X,IAAM,CAElBL,MAAKmU,SAAS,OAAQlS,MAAOwT,IAGzBzV,KAAKkT,MAAMW,IACb7T,KAAKkT,MAAMW,GAAG,IAAK7T,KAAKgJ,YAuC9BlI,EAAS2S,UAAU+B,IAAM,WACvB,GAGIC,GAAK1G,EAASiE,EAHdyB,EAAKzU,KAIL0V,EAAY/U,EAAKuG,QAAQzB,UAAU,GACtB,WAAbiQ,GAAsC,UAAbA,GAAsC,SAAbA,GAEpDD,EAAMhQ,UAAU,GAChBsJ,EAAUtJ,UAAU,GACpBuN,EAAOvN,UAAU,KAIjBsJ,EAAUtJ,UAAU,GACpBuN,EAAOvN,UAAU,GAInB,IAAI+S,GAAc7X,EAAK0E,UAAWrF,KAAKiT,SAAUlE,EAG7C/O,MAAKiT,SAASgB,QAAUlF,GAAWA,EAAQkF,SAC7CuE,EAAYvE,OAAS,SAAUtE,GAC7B,MAAO8E,GAAGxB,SAASgB,OAAOtE,IAASZ,EAAQkF,OAAOtE,IAKtD,IAAI8I,KAOJ,OANWlS,SAAPkP,GACFgD,EAAavQ,KAAKuN,GAEpBgD,EAAavQ,KAAKsQ,GAClBC,EAAavQ,KAAK8K,GAEXhT,KAAKkT,OAASlT,KAAKkT,MAAMsC,IAAI8C,MAAMtY,KAAKkT,MAAOuF,IAWxD3X,EAAS2S,UAAU2C,OAAS,SAAUrH,GACpC,GAAI0G,EAEJ,IAAIzV,KAAKkT,MAAO,CACd,GACIe,GADAyE,EAAgB1Y,KAAKiT,SAASgB,MAK9BA,GAFAlF,GAAWA,EAAQkF,OACjByE,EACO,SAAU/I,GACjB,MAAO+I,GAAc/I,IAASZ,EAAQkF,OAAOtE,IAItCZ,EAAQkF,OAIVyE,EAGXjD,EAAMzV,KAAKkT,MAAMkD,QACfnC,OAAQA,EACR8B,MAAOhH,GAAWA,EAAQgH,YAI5BN,KAGF,OAAOA,IAQT3U,EAAS2S,UAAU4C,WAAa,WAE9B,IADA,GAAIsC,GAAU3Y,KACP2Y,YAAmB7X,IACxB6X,EAAUA,EAAQzF,KAEpB,OAAOyF,IAAW,MAYpB7X,EAAS2S,UAAU4E,SAAW,SAAU7O,EAAO4K,EAAQC,GACrD,GAAI9O,GAAGC,EAAKnF,EAAIsP,EACZ8F,EAAMrB,GAAUA,EAAOnS,MACvB+Q,EAAOhT,KAAKkT,MACZ0F,KACAC,KACAC,IAEJ,IAAIrD,GAAOzC,EAAM,CACf,OAAQxJ,GACN,IAAK,MAEH,IAAKjE,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IACrClF,EAAKoV,EAAIlQ,GACToK,EAAO3P,KAAKwV,IAAInV,GACZsP,IACF3P,KAAKoY,KAAK/X,IAAM,EAChBuY,EAAM1Q,KAAK7H,GAIf,MAEF,KAAK,SAGH,IAAKkF,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IACrClF,EAAKoV,EAAIlQ,GACToK,EAAO3P,KAAKwV,IAAInV,GAEZsP,EACE3P,KAAKoY,KAAK/X,GACZwY,EAAQ3Q,KAAK7H,IAGbL,KAAKoY,KAAK/X,IAAM,EAChBuY,EAAM1Q,KAAK7H,IAITL,KAAKoY,KAAK/X,WACLL,MAAKoY,KAAK/X,GACjByY,EAAQ5Q,KAAK7H,GAQnB,MAEF,KAAK,SAEH,IAAKkF,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IACrClF,EAAKoV,EAAIlQ,GACLvF,KAAKoY,KAAK/X,WACLL,MAAKoY,KAAK/X,GACjByY,EAAQ5Q,KAAK7H,IAOjBuY,EAAMlT,QACR1F,KAAKmU,SAAS,OAAQlS,MAAO2W,GAAQvE,GAEnCwE,EAAQnT,QACV1F,KAAKmU,SAAS,UAAWlS,MAAO4W,GAAUxE,GAExCyE,EAAQpT,QACV1F,KAAKmU,SAAS,UAAWlS,MAAO6W,GAAUzE,KAMhDvT,EAAS2S,UAAUI,GAAKhT,EAAQ4S,UAAUI,GAC1C/S,EAAS2S,UAAUO,IAAMnT,EAAQ4S,UAAUO,IAC3ClT,EAAS2S,UAAUU,SAAWtT,EAAQ4S,UAAUU,SAGhDrT,EAAS2S,UAAUM,UAAYjT,EAAS2S,UAAUI,GAClD/S,EAAS2S,UAAUS,YAAcpT,EAAS2S,UAAUO,IAEpDnU,EAAOD,QAAUkB,GAIb,SAASjB,GAeb,QAASkB,GAAMgO,GAEb/O,KAAK+Y,MAAQ,KACb/Y,KAAKkN,IAAM8L,IAGXhZ,KAAK2T,UACL3T,KAAKiZ,SAAW,KAChBjZ,KAAKkZ,UAAY,KAEjBlZ,KAAKwT,WAAWzE,GAgBlBhO,EAAM0S,UAAUD,WAAa,SAAUzE,GACjCA,GAAoC,mBAAlBA,GAAQgK,QAC5B/Y,KAAK+Y,MAAQhK,EAAQgK,OAEnBhK,GAAkC,mBAAhBA,GAAQ7B,MAC5BlN,KAAKkN,IAAM6B,EAAQ7B,KAGrBlN,KAAKmZ,kBAsBPpY,EAAMsE,OAAS,SAAUrB,EAAQ+K,GAC/B,GAAI2E,GAAQ,GAAI3S,GAAMgO,EAEtB,IAAqBxI,SAAjBvC,EAAOoV,MACT,KAAM,IAAIxV,OAAM,6CAElBI,GAAOoV,MAAQ,WACb1F,EAAM0F,QAGR,IAAIC,KACF7C,KAAM,QACN8C,SAAU/S,QAGZ,IAAIwI,GAAWA,EAAQ3C,QACrB,IAAK,GAAI7G,GAAI,EAAGA,EAAIwJ,EAAQ3C,QAAQ1G,OAAQH,IAAK,CAC/C,GAAIiR,GAAOzH,EAAQ3C,QAAQ7G,EAC3B8T,GAAQnR,MACNsO,KAAMA,EACN8C,SAAUtV,EAAOwS,KAEnB9C,EAAMtH,QAAQpI,EAAQwS,GAS1B,MALA9C,GAAMwF,WACJlV,OAAQA,EACRqV,QAASA,GAGJ3F,GAOT3S,EAAM0S,UAAUG,QAAU,WAGxB,GAFA5T,KAAKoZ,QAEDpZ,KAAKkZ,UAAW,CAGlB,IAAK,GAFDlV,GAAShE,KAAKkZ,UAAUlV,OACxBqV,EAAUrZ,KAAKkZ,UAAUG,QACpB9T,EAAI,EAAGA,EAAI8T,EAAQ3T,OAAQH,IAAK,CACvC,GAAIgU,GAASF,EAAQ9T,EACjBgU,GAAOD,SACTtV,EAAOuV,EAAO/C,MAAQ+C,EAAOD,eAGtBtV,GAAOuV,EAAO/C,MAGzBxW,KAAKkZ,UAAY,OASrBnY,EAAM0S,UAAUrH,QAAU,SAASpI,EAAQuV,GACzC,GAAI9E,GAAKzU,KACLsZ,EAAWtV,EAAOuV,EACtB,KAAKD,EACH,KAAM,IAAI1V,OAAM,UAAY2V,EAAS,aAGvCvV,GAAOuV,GAAU,WAGf,IAAK,GADDC,MACKjU,EAAI,EAAGA,EAAIE,UAAUC,OAAQH,IACpCiU,EAAKjU,GAAKE,UAAUF,EAItBkP,GAAGf,OACD8F,KAAMA,EACNC,GAAIH,EACJI,QAAS1Z,SASfe,EAAM0S,UAAUC,MAAQ,SAASiG,GAE7B3Z,KAAK2T,OAAOzL,KADO,kBAAVyR,IACSF,GAAIE,GAGLA,GAGnB3Z,KAAKmZ,kBAOPpY,EAAM0S,UAAU0F,eAAiB,WAQ/B,GANInZ,KAAK2T,OAAOjO,OAAS1F,KAAKkN,KAC5BlN,KAAKoZ,QAIPQ,aAAa5Z,KAAKiZ,UACdjZ,KAAK0T,MAAMhO,OAAS,GAA2B,gBAAf1F,MAAK+Y,MAAoB,CAC3D,GAAItE,GAAKzU,IACTA,MAAKiZ,SAAWY,WAAW,WACzBpF,EAAG2E,SACFpZ,KAAK+Y,SAOZhY,EAAM0S,UAAU2F,MAAQ,WACtB,KAAOpZ,KAAK2T,OAAOjO,OAAS,GAAG,CAC7B,GAAIiU,GAAQ3Z,KAAK2T,OAAO/B,OACxB+H,GAAMF,GAAGnB,MAAMqB,EAAMD,SAAWC,EAAMF,GAAIE,EAAMH,YAIpD3Z,EAAOD,QAAUmB,GAKb,SAASlB,EAAQD,EAASM,GAwB9B,QAASc,GAAQ8Y,EAAW9G,EAAMjE,GAChC,KAAM/O,eAAgBgB,IACpB,KAAM,IAAI+Y,aAAY,mDAIxB/Z,MAAKga,iBAAmBF,EACxB9Z,KAAK6S,MAAQ,QACb7S,KAAK8S,OAAS,QACd9S,KAAKia,OAAS,GACdja,KAAKka,eAAiB,MACtBla,KAAKma,eAAiB,MAEtBna,KAAKoa,OAAS,IACdpa,KAAKqa,OAAS,IACdra,KAAKsa,OAAS,GAEd,IAAIC,GAAc,SAAS/O,GAAK,MAAOA,GACvCxL,MAAKwa,YAAcD,EACnBva,KAAKya,YAAcF,EACnBva,KAAK0a,YAAcH,EAEnBva,KAAK2a,YAAc,OACnB3a,KAAK4a,YAAc,QAEnB5a,KAAKwN,MAAQxM,EAAQ6Z,MAAMC,IAC3B9a,KAAK+a,iBAAkB,EACvB/a,KAAKgb,UAAW,EAChBhb,KAAKib,iBAAkB,EACvBjb,KAAKkb,YAAa,EAClBlb,KAAKmb,gBAAiB,EACtBnb,KAAKob,aAAc,EACnBpb,KAAKqb,cAAgB,GAErBrb,KAAKsb,kBAAoB,IACzBtb,KAAKub,kBAAmB,EAExBvb,KAAKwb,OAAS,GAAIta,GAClBlB,KAAKyb,IAAM,GAAIpa,GAAQ,EAAG,EAAG,IAE7BrB,KAAK8X,UAAY,KACjB9X,KAAK0b,WAAa,KAGlB1b,KAAK2b,KAAOpV,OACZvG,KAAK4b,KAAOrV,OACZvG,KAAK6b,KAAOtV,OACZvG,KAAK8b,SAAWvV,OAChBvG,KAAK+b,UAAYxV,OAEjBvG,KAAKgc,KAAO,EACZhc,KAAKic,MAAQ1V,OACbvG,KAAKkc,KAAO,EACZlc,KAAKmc,KAAO,EACZnc,KAAKoc,MAAQ7V,OACbvG,KAAKqc,KAAO,EACZrc,KAAKsc,KAAO,EACZtc,KAAKuc,MAAQhW,OACbvG,KAAKwc,KAAO,EACZxc,KAAKyc,SAAW,EAChBzc,KAAK0c,SAAW,EAChB1c,KAAK2c,UAAY,EACjB3c,KAAK4c,UAAY,EAIjB5c,KAAK6c,UAAY,UACjB7c,KAAK8c,UAAY,UACjB9c,KAAK+c,SAAW,UAChB/c,KAAKgd,eAAiB,UAGtBhd,KAAK2O,SAGL3O,KAAKwT,WAAWzE,GAGZiE,GACFhT,KAAKuY,QAAQvF,GArGjB,GAAIiK,GAAU/c,EAAoB,IAC9BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BS,EAAOT,EAAoB,GAC3BmB,EAAUnB,EAAoB,IAC9BkB,EAAUlB,EAAoB,GAC9BgB,EAAShB,EAAoB,GAC7BiB,EAASjB,EAAoB,GAC7BoB,EAASpB,EAAoB,IAC7BqB,EAAarB,EAAoB,GAiGrC+c,GAAQjc,EAAQyS,WAKhBzS,EAAQyS,UAAUyJ,UAAY,WAC5Bld,KAAKmd,MAAQ,GAAI9b,GAAQ,GAAKrB,KAAKkc,KAAOlc,KAAKgc,MAC7C,GAAKhc,KAAKqc,KAAOrc,KAAKmc,MACtB,GAAKnc,KAAKwc,KAAOxc,KAAKsc,OAGpBtc,KAAKib,kBACHjb,KAAKmd,MAAM9K,EAAIrS,KAAKmd,MAAM7K,EAE5BtS,KAAKmd,MAAM7K,EAAItS,KAAKmd,MAAM9K,EAI1BrS,KAAKmd,MAAM9K,EAAIrS,KAAKmd,MAAM7K,GAK9BtS,KAAKmd,MAAMC,GAAKpd,KAAKqb,cAIrBrb,KAAKmd,MAAM/V,MAAQ,GAAKpH,KAAK0c,SAAW1c,KAAKyc,SAG7C,IAAIY,IAAWrd,KAAKkc,KAAOlc,KAAKgc,MAAQ,EAAIhc,KAAKmd,MAAM9K,EACnDiL,GAAWtd,KAAKqc,KAAOrc,KAAKmc,MAAQ,EAAInc,KAAKmd,MAAM7K,EACnDiL,GAAWvd,KAAKwc,KAAOxc,KAAKsc,MAAQ,EAAItc,KAAKmd,MAAMC,CACvDpd,MAAKwb,OAAOgC,eAAeH,EAASC,EAASC,IAU/Cvc,EAAQyS,UAAUgK,eAAiB,SAASC,GAC1C,GAAIC,GAAc3d,KAAK4d,2BAA2BF,EAClD,OAAO1d,MAAK6d,4BAA4BF,IAW1C3c,EAAQyS,UAAUmK,2BAA6B,SAASF,GACtD,GAAII,GAAKJ,EAAQrL,EAAIrS,KAAKmd,MAAM9K,EAC9B0L,EAAKL,EAAQpL,EAAItS,KAAKmd,MAAM7K,EAC5B0L,EAAKN,EAAQN,EAAIpd,KAAKmd,MAAMC,EAE5Ba,EAAKje,KAAKwb,OAAO0C,oBAAoB7L,EACrC8L,EAAKne,KAAKwb,OAAO0C,oBAAoB5L,EACrC8L,EAAKpe,KAAKwb,OAAO0C,oBAAoBd,EAGrCiB,EAAQpZ,KAAKqZ,IAAIte,KAAKwb,OAAO+C,oBAAoBlM,GACjDmM,EAAQvZ,KAAKwZ,IAAIze,KAAKwb,OAAO+C,oBAAoBlM,GACjDqM,EAAQzZ,KAAKqZ,IAAIte,KAAKwb,OAAO+C,oBAAoBjM,GACjDqM,EAAQ1Z,KAAKwZ,IAAIze,KAAKwb,OAAO+C,oBAAoBjM,GACjDsM,EAAQ3Z,KAAKqZ,IAAIte,KAAKwb,OAAO+C,oBAAoBnB,GACjDyB,EAAQ5Z,KAAKwZ,IAAIze,KAAKwb,OAAO+C,oBAAoBnB,GAGjD0B,EAAKH,GAASC,GAASb,EAAKI,GAAMU,GAASf,EAAKG,IAAOS,GAASV,EAAKI,GACrEW,EAAKV,GAASM,GAASX,EAAKI,GAAMM,GAASE,GAASb,EAAKI,GAAMU,GAASf,EAAKG,KAAQO,GAASK,GAASd,EAAKI,GAAMS,GAASd,EAAGG,IAC9He,EAAKR,GAASG,GAASX,EAAKI,GAAMM,GAASE,GAASb,EAAKI,GAAMU,GAASf,EAAKG,KAAQI,GAASQ,GAASd,EAAKI,GAAMS,GAASd,EAAGG,GAEhI,OAAO,IAAI5c,GAAQyd,EAAIC,EAAIC,IAU7Bhe,EAAQyS,UAAUoK,4BAA8B,SAASF,GACvD,GAQIsB,GACAC,EATAC,EAAKnf,KAAKyb,IAAIpJ,EAChB+M,EAAKpf,KAAKyb,IAAInJ,EACd+M,EAAKrf,KAAKyb,IAAI2B,EACd0B,EAAKnB,EAAYtL,EACjB0M,EAAKpB,EAAYrL,EACjB0M,EAAKrB,EAAYP,CAgBnB,OAXIpd,MAAK+a,iBACPkE,GAAMH,EAAKK,IAAOE,EAAKL,GACvBE,GAAMH,EAAKK,IAAOC,EAAKL,KAGvBC,EAAKH,IAAOO,EAAKrf,KAAKwb,OAAO8D,gBAC7BJ,EAAKH,IAAOM,EAAKrf,KAAKwb,OAAO8D,iBAKxB,GAAIle,GACTpB,KAAKuf,QAAUN,EAAKjf,KAAKwf,MAAMC,OAAOC,YACtC1f,KAAK2f,QAAUT,EAAKlf,KAAKwf,MAAMC,OAAOC,cAO1C1e,EAAQyS,UAAUmM,oBAAsB,SAASC,GAC/C,GAAIC,GAAO,QACPC,EAAS,OACTC,EAAc,CAElB,IAAgC,gBAAtB,GACRF,EAAOD,EACPE,EAAS,OACTC,EAAc,MAEX,IAAgC,gBAAtB,GACgBzZ,SAAzBsZ,EAAgBC,OAAuBA,EAAOD,EAAgBC,MACnCvZ,SAA3BsZ,EAAgBE,SAAyBA,EAASF,EAAgBE,QAClCxZ,SAAhCsZ,EAAgBG,cAA2BA,EAAcH,EAAgBG,iBAE1E,IAAyBzZ,SAApBsZ,EAIR,KAAM,qCAGR7f,MAAKwf,MAAMhS,MAAMqS,gBAAkBC,EACnC9f,KAAKwf,MAAMhS,MAAMyS,YAAcF,EAC/B/f,KAAKwf,MAAMhS,MAAM0S,YAAcF,EAAc,KAC7ChgB,KAAKwf,MAAMhS,MAAM2S,YAAc,SAKjCnf,EAAQ6Z,OACNuF,IAAK,EACLC,SAAU,EACVC,QAAS,EACTxF,IAAM,EACNyF,QAAU,EACVC,SAAU,EACVC,QAAS,EACTC,KAAO,EACPC,KAAM,EACNC,QAAU,GASZ5f,EAAQyS,UAAUoN,gBAAkB,SAASC,GAC3C,OAAQA,GACN,IAAK,MAAW,MAAO9f,GAAQ6Z,MAAMC,GACrC,KAAK,WAAa,MAAO9Z,GAAQ6Z,MAAM0F,OACvC,KAAK,YAAe,MAAOvf,GAAQ6Z,MAAM2F,QACzC,KAAK,WAAa,MAAOxf,GAAQ6Z,MAAM4F,OACvC,KAAK,OAAW,MAAOzf,GAAQ6Z,MAAM8F,IACrC,KAAK,OAAW,MAAO3f,GAAQ6Z,MAAM6F,IACrC,KAAK,UAAa,MAAO1f,GAAQ6Z,MAAM+F,OACvC,KAAK,MAAW,MAAO5f,GAAQ6Z,MAAMuF,GACrC,KAAK,YAAe,MAAOpf,GAAQ6Z,MAAMwF,QACzC,KAAK,WAAa,MAAOrf,GAAQ6Z,MAAMyF,QAGzC,MAAO,IAQTtf,EAAQyS,UAAUsN,wBAA0B,SAAS/N,GACnD,GAAIhT,KAAKwN,QAAUxM,EAAQ6Z,MAAMC,KAC/B9a,KAAKwN,QAAUxM,EAAQ6Z,MAAM0F,SAC7BvgB,KAAKwN,QAAUxM,EAAQ6Z,MAAM8F,MAC7B3gB,KAAKwN,QAAUxM,EAAQ6Z,MAAM6F,MAC7B1gB,KAAKwN,QAAUxM,EAAQ6Z,MAAM+F,SAC7B5gB,KAAKwN,QAAUxM,EAAQ6Z,MAAMuF,IAE7BpgB,KAAK2b,KAAO,EACZ3b,KAAK4b,KAAO,EACZ5b,KAAK6b,KAAO,EACZ7b,KAAK8b,SAAWvV,OAEZyM,EAAK+E,qBAAuB,IAC9B/X,KAAK+b,UAAY,OAGhB,CAAA,GAAI/b,KAAKwN,QAAUxM,EAAQ6Z,MAAM2F,UACpCxgB,KAAKwN,QAAUxM,EAAQ6Z,MAAM4F,SAC7BzgB,KAAKwN,QAAUxM,EAAQ6Z,MAAMwF,UAC7BrgB,KAAKwN,QAAUxM,EAAQ6Z,MAAMyF,QAY7B,KAAM,kBAAoBtgB,KAAKwN,MAAQ,GAVvCxN,MAAK2b,KAAO,EACZ3b,KAAK4b,KAAO,EACZ5b,KAAK6b,KAAO,EACZ7b,KAAK8b,SAAW,EAEZ9I,EAAK+E,qBAAuB,IAC9B/X,KAAK+b,UAAY,KAQvB/a,EAAQyS,UAAUsB,gBAAkB,SAAS/B,GAC3C,MAAOA,GAAKtN,QAId1E,EAAQyS,UAAUsE,mBAAqB,SAAS/E,GAC9C,GAAIgO,GAAU,CACd,KAAK,GAAIC,KAAUjO,GAAK,GAClBA,EAAK,GAAGnN,eAAeob,IACzBD,GAGJ,OAAOA,IAIThgB,EAAQyS,UAAUyN,kBAAoB,SAASlO,EAAMiO,GAEnD,IAAK,GADDE,MACK5b,EAAI,EAAGA,EAAIyN,EAAKtN,OAAQH,IACgB,IAA3C4b,EAAeza,QAAQsM,EAAKzN,GAAG0b,KACjCE,EAAejZ,KAAK8K,EAAKzN,GAAG0b,GAGhC,OAAOE,IAITngB,EAAQyS,UAAU2N,eAAiB,SAASpO,EAAKiO,GAE/C,IAAK,GADDI,IAAU5V,IAAIuH,EAAK,GAAGiO,GAAQ/T,IAAI8F,EAAK,GAAGiO,IACrC1b,EAAI,EAAGA,EAAIyN,EAAKtN,OAAQH,IAC3B8b,EAAO5V,IAAMuH,EAAKzN,GAAG0b,KAAWI,EAAO5V,IAAMuH,EAAKzN,GAAG0b,IACrDI,EAAOnU,IAAM8F,EAAKzN,GAAG0b,KAAWI,EAAOnU,IAAM8F,EAAKzN,GAAG0b,GAE3D,OAAOI,IASTrgB,EAAQyS,UAAU6N,gBAAkB,SAAUC,GAC5C,GAAI9M,GAAKzU,IAOT,IAJIA,KAAK2Y,SACP3Y,KAAK2Y,QAAQ3E,IAAI,IAAKhU,KAAKwhB,WAGbjb,SAAZgb,EAAJ,CAGIvb,MAAMC,QAAQsb,KAChBA,EAAU,GAAI1gB,GAAQ0gB,GAGxB,IAAIvO,EACJ,MAAIuO,YAAmB1gB,IAAW0gB,YAAmBzgB,IAInD,KAAM,IAAI8C,OAAM,uCAGlB;GANEoP,EAAOuO,EAAQ/L,MAME,GAAfxC,EAAKtN,OAAT,CAGA1F,KAAK2Y,QAAU4I,EACfvhB,KAAK8X,UAAY9E,EAGjBhT,KAAKwhB,UAAY,WACf/M,EAAG8D,QAAQ9D,EAAGkE,UAEhB3Y,KAAK2Y,QAAQ9E,GAAG,IAAK7T,KAAKwhB,WAS1BxhB,KAAK2b,KAAO,IACZ3b,KAAK4b,KAAO,IACZ5b,KAAK6b,KAAO,IACZ7b,KAAK8b,SAAW,QAChB9b,KAAK+b,UAAY,SAKb/I,EAAK,GAAGnN,eAAe,WACDU,SAApBvG,KAAKyhB,aACPzhB,KAAKyhB,WAAa,GAAItgB,GAAOogB,EAASvhB,KAAK+b,UAAW/b,MACtDA,KAAKyhB,WAAWC,kBAAkB,WAAYjN,EAAGkN,WAKrD,IAAIC,GAAW5hB,KAAKwN,OAASxM,EAAQ6Z,MAAMuF,KACzCpgB,KAAKwN,OAASxM,EAAQ6Z,MAAMwF,UAC5BrgB,KAAKwN,OAASxM,EAAQ6Z,MAAMyF,OAG9B,IAAIsB,EAAU,CACZ,GAA8Brb,SAA1BvG,KAAK6hB,iBACP7hB,KAAK2c,UAAY3c,KAAK6hB,qBAEnB,CACH,GAAIC,GAAQ9hB,KAAKkhB,kBAAkBlO,EAAKhT,KAAK2b,KAC7C3b,MAAK2c,UAAamF,EAAM,GAAKA,EAAM,IAAO,EAG5C,GAA8Bvb,SAA1BvG,KAAK+hB,iBACP/hB,KAAK4c,UAAY5c,KAAK+hB,qBAEnB,CACH,GAAIC,GAAQhiB,KAAKkhB,kBAAkBlO,EAAKhT,KAAK4b,KAC7C5b,MAAK4c,UAAaoF,EAAM,GAAKA,EAAM,IAAO,GAK9C,GAAIC,GAASjiB,KAAKohB,eAAepO,EAAKhT,KAAK2b,KACvCiG,KACFK,EAAOxW,KAAOzL,KAAK2c,UAAY,EAC/BsF,EAAO/U,KAAOlN,KAAK2c,UAAY,GAEjC3c,KAAKgc,KAA6BzV,SAArBvG,KAAKkiB,YAA6BliB,KAAKkiB,YAAcD,EAAOxW,IACzEzL,KAAKkc,KAA6B3V,SAArBvG,KAAKmiB,YAA6BniB,KAAKmiB,YAAcF,EAAO/U,IACrElN,KAAKkc,MAAQlc,KAAKgc,OAAMhc,KAAKkc,KAAOlc,KAAKgc,KAAO,GACpDhc,KAAKic,MAA+B1V,SAAtBvG,KAAKoiB,aAA8BpiB,KAAKoiB,cAAgBpiB,KAAKkc,KAAKlc,KAAKgc,MAAM,CAE3F,IAAIqG,GAASriB,KAAKohB,eAAepO,EAAKhT,KAAK4b,KACvCgG,KACFS,EAAO5W,KAAOzL,KAAK4c,UAAY,EAC/ByF,EAAOnV,KAAOlN,KAAK4c,UAAY,GAEjC5c,KAAKmc,KAA6B5V,SAArBvG,KAAKsiB,YAA6BtiB,KAAKsiB,YAAcD,EAAO5W,IACzEzL,KAAKqc,KAA6B9V,SAArBvG,KAAKuiB,YAA6BviB,KAAKuiB,YAAcF,EAAOnV,IACrElN,KAAKqc,MAAQrc,KAAKmc,OAAMnc,KAAKqc,KAAOrc,KAAKmc,KAAO,GACpDnc,KAAKoc,MAA+B7V,SAAtBvG,KAAKwiB,aAA8BxiB,KAAKwiB,cAAgBxiB,KAAKqc,KAAKrc,KAAKmc,MAAM,CAE3F,IAAIsG,GAASziB,KAAKohB,eAAepO,EAAKhT,KAAK6b,KAM3C,IALA7b,KAAKsc,KAA6B/V,SAArBvG,KAAK0iB,YAA6B1iB,KAAK0iB,YAAcD,EAAOhX,IACzEzL,KAAKwc,KAA6BjW,SAArBvG,KAAK2iB,YAA6B3iB,KAAK2iB,YAAcF,EAAOvV,IACrElN,KAAKwc,MAAQxc,KAAKsc,OAAMtc,KAAKwc,KAAOxc,KAAKsc,KAAO,GACpDtc,KAAKuc,MAA+BhW,SAAtBvG,KAAK4iB,aAA8B5iB,KAAK4iB,cAAgB5iB,KAAKwc,KAAKxc,KAAKsc,MAAM,EAErE/V,SAAlBvG,KAAK8b,SAAwB,CAC/B,GAAI+G,GAAa7iB,KAAKohB,eAAepO,EAAKhT,KAAK8b,SAC/C9b,MAAKyc,SAAqClW,SAAzBvG,KAAK8iB,gBAAiC9iB,KAAK8iB,gBAAkBD,EAAWpX,IACzFzL,KAAK0c,SAAqCnW,SAAzBvG,KAAK+iB,gBAAiC/iB,KAAK+iB,gBAAkBF,EAAW3V,IACrFlN,KAAK0c,UAAY1c,KAAKyc,WAAUzc,KAAK0c,SAAW1c,KAAKyc,SAAW,GAItEzc,KAAKkd,eAUPlc,EAAQyS,UAAUuP,eAAiB,SAAUhQ,GA0BzC,QAASiQ,GAAW3d,EAAGa,GACrB,MAAOb,GAAIa,EAzBf,GAAIkM,GAAGC,EAAG/M,EAAG6X,EAAG8F,EAAK1Q,EAEjBkJ,IAEJ,IAAI1b,KAAKwN,QAAUxM,EAAQ6Z,MAAM6F,MAC/B1gB,KAAKwN,QAAUxM,EAAQ6Z,MAAM+F,QAAS,CAKtC,GAAIkB,MACAE,IACJ,KAAKzc,EAAI,EAAGA,EAAIvF,KAAK+U,gBAAgB/B,GAAOzN,IAC1C8M,EAAIW,EAAKzN,GAAGvF,KAAK2b,OAAS,EAC1BrJ,EAAIU,EAAKzN,GAAGvF,KAAK4b,OAAS,EAED,KAArBkG,EAAMpb,QAAQ2L,IAChByP,EAAM5Z,KAAKmK,GAEY,KAArB2P,EAAMtb,QAAQ4L,IAChB0P,EAAM9Z,KAAKoK,EAOfwP,GAAMrL,KAAKwM,GACXjB,EAAMvL,KAAKwM,EAGX,IAAIE,KACJ,KAAK5d,EAAI,EAAGA,EAAIyN,EAAKtN,OAAQH,IAAK,CAChC8M,EAAIW,EAAKzN,GAAGvF,KAAK2b,OAAS,EAC1BrJ,EAAIU,EAAKzN,GAAGvF,KAAK4b,OAAS,EAC1BwB,EAAIpK,EAAKzN,GAAGvF,KAAK6b,OAAS,CAE1B,IAAIuH,GAAStB,EAAMpb,QAAQ2L,GACvBgR,EAASrB,EAAMtb,QAAQ4L,EAEA/L,UAAvB4c,EAAWC,KACbD,EAAWC,MAGb,IAAI1F,GAAU,GAAIrc,EAClBqc,GAAQrL,EAAIA,EACZqL,EAAQpL,EAAIA,EACZoL,EAAQN,EAAIA,EAEZ8F,KACAA,EAAI1Q,MAAQkL,EACZwF,EAAII,MAAQ/c,OACZ2c,EAAIK,OAAShd,OACb2c,EAAIM,OAAS,GAAIniB,GAAQgR,EAAGC,EAAGtS,KAAKsc,MAEpC6G,EAAWC,GAAQC,GAAUH,EAE7BxH,EAAWxT,KAAKgb,GAIlB,IAAK7Q,EAAI,EAAGA,EAAI8Q,EAAWzd,OAAQ2M,IACjC,IAAKC,EAAI,EAAGA,EAAI6Q,EAAW9Q,GAAG3M,OAAQ4M,IAChC6Q,EAAW9Q,GAAGC,KAChB6Q,EAAW9Q,GAAGC,GAAGmR,WAAcpR,EAAI8Q,EAAWzd,OAAO,EAAKyd,EAAW9Q,EAAE,GAAGC,GAAK/L,OAC/E4c,EAAW9Q,GAAGC,GAAGoR,SAAcpR,EAAI6Q,EAAW9Q,GAAG3M,OAAO,EAAKyd,EAAW9Q,GAAGC,EAAE,GAAK/L,OAClF4c,EAAW9Q,GAAGC,GAAGqR,WACdtR,EAAI8Q,EAAWzd,OAAO,GAAK4M,EAAI6Q,EAAW9Q,GAAG3M,OAAO,EACnDyd,EAAW9Q,EAAE,GAAGC,EAAE,GAClB/L,YAOV,KAAKhB,EAAI,EAAGA,EAAIyN,EAAKtN,OAAQH,IAC3BiN,EAAQ,GAAInR,GACZmR,EAAMH,EAAIW,EAAKzN,GAAGvF,KAAK2b,OAAS,EAChCnJ,EAAMF,EAAIU,EAAKzN,GAAGvF,KAAK4b,OAAS,EAChCpJ,EAAM4K,EAAIpK,EAAKzN,GAAGvF,KAAK6b,OAAS,EAEVtV,SAAlBvG,KAAK8b,WACPtJ,EAAMpL,MAAQ4L,EAAKzN,GAAGvF,KAAK8b,WAAa,GAG1CoH,KACAA,EAAI1Q,MAAQA,EACZ0Q,EAAIM,OAAS,GAAIniB,GAAQmR,EAAMH,EAAGG,EAAMF,EAAGtS,KAAKsc,MAChD4G,EAAII,MAAQ/c,OACZ2c,EAAIK,OAAShd,OAEbmV,EAAWxT,KAAKgb,EAIpB,OAAOxH,IAST1a,EAAQyS,UAAU9E,OAAS,WAEzB,KAAO3O,KAAKga,iBAAiB4J,iBAC3B5jB,KAAKga,iBAAiBvI,YAAYzR,KAAKga,iBAAiB6J,WAG1D7jB,MAAKwf,MAAQ3N,SAASM,cAAc,OACpCnS,KAAKwf,MAAMhS,MAAMsW,SAAW,WAC5B9jB,KAAKwf,MAAMhS,MAAMuW,SAAW,SAG5B/jB,KAAKwf,MAAMC,OAAS5N,SAASM,cAAe,UAC5CnS,KAAKwf,MAAMC,OAAOjS,MAAMsW,SAAW,WACnC9jB,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAMC,OAGhC,IAAIuE,GAAWnS,SAASM,cAAe,MACvC6R,GAASxW,MAAM3C,MAAQ,MACvBmZ,EAASxW,MAAMyW,WAAc,OAC7BD,EAASxW,MAAM0W,QAAW,OAC1BF,EAASG,UAAa,mDACtBnkB,KAAKwf,MAAMC,OAAO1N,YAAYiS,GAGhChkB,KAAKwf,MAAMvL,OAASpC,SAASM,cAAe,OAC5CnS,KAAKwf,MAAMvL,OAAOzG,MAAMsW,SAAW,WACnC9jB,KAAKwf,MAAMvL,OAAOzG,MAAMgW,OAAS,MACjCxjB,KAAKwf,MAAMvL,OAAOzG,MAAMhG,KAAO,MAC/BxH,KAAKwf,MAAMvL,OAAOzG,MAAMqF,MAAQ,OAChC7S,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAMvL,OAGlC,IAAIQ,GAAKzU,KACLokB,EAAc,SAAU5a,GAAQiL,EAAG4P,aAAa7a,IAChD8a,EAAe,SAAU9a,GAAQiL,EAAG8P,cAAc/a,IAClDgb,EAAe,SAAUhb,GAAQiL,EAAGgQ,SAASjb,IAC7Ckb,EAAY,SAAUlb,GAAQiL,EAAGkQ,WAAWnb,GAGhD7I,GAAKkI,iBAAiB7I,KAAKwf,MAAMC,OAAQ,UAAWmF,WACpDjkB,EAAKkI,iBAAiB7I,KAAKwf,MAAMC,OAAQ,YAAa2E,GACtDzjB,EAAKkI,iBAAiB7I,KAAKwf,MAAMC,OAAQ,aAAc6E,GACvD3jB,EAAKkI,iBAAiB7I,KAAKwf,MAAMC,OAAQ,aAAc+E,GACvD7jB,EAAKkI,iBAAiB7I,KAAKwf,MAAMC,OAAQ,YAAaiF,GAGtD1kB,KAAKga,iBAAiBjI,YAAY/R,KAAKwf,QAWzCxe,EAAQyS,UAAUoR,QAAU,SAAShS,EAAOC,GAC1C9S,KAAKwf,MAAMhS,MAAMqF,MAAQA,EACzB7S,KAAKwf,MAAMhS,MAAMsF,OAASA,EAE1B9S,KAAK8kB,iBAMP9jB,EAAQyS,UAAUqR,cAAgB,WAChC9kB,KAAKwf,MAAMC,OAAOjS,MAAMqF,MAAQ,OAChC7S,KAAKwf,MAAMC,OAAOjS,MAAMsF,OAAS,OAEjC9S,KAAKwf,MAAMC,OAAO5M,MAAQ7S,KAAKwf,MAAMC,OAAOC,YAC5C1f,KAAKwf,MAAMC,OAAO3M,OAAS9S,KAAKwf,MAAMC,OAAOsF,aAG7C/kB,KAAKwf,MAAMvL,OAAOzG,MAAMqF,MAAS7S,KAAKwf,MAAMC,OAAOC,YAAc,GAAU,MAM7E1e,EAAQyS,UAAUuR,eAAiB,WACjC,IAAKhlB,KAAKwf,MAAMvL,SAAWjU,KAAKwf,MAAMvL,OAAOgR,OAC3C,KAAM,wBAERjlB,MAAKwf,MAAMvL,OAAOgR,OAAOC,QAO3BlkB,EAAQyS,UAAU0R,cAAgB,WAC3BnlB,KAAKwf,MAAMvL,QAAWjU,KAAKwf,MAAMvL,OAAOgR,QAE7CjlB,KAAKwf,MAAMvL,OAAOgR,OAAOG,QAU3BpkB,EAAQyS,UAAU4R,cAAgB,WAG9BrlB,KAAKuf,QAD0D,MAA7Dvf,KAAKka,eAAeoL,OAAOtlB,KAAKka,eAAexU,OAAO,GAEtD6f,WAAWvlB,KAAKka,gBAAkB,IAChCla,KAAKwf,MAAMC,OAAOC,YAGP6F,WAAWvlB,KAAKka,gBAK/Bla,KAAK2f,QAD0D,MAA7D3f,KAAKma,eAAemL,OAAOtlB,KAAKma,eAAezU,OAAO,GAEtD6f,WAAWvlB,KAAKma,gBAAkB,KAC/Bna,KAAKwf,MAAMC,OAAOsF,aAAe/kB,KAAKwf,MAAMvL,OAAO8Q,cAGzCQ,WAAWvlB,KAAKma,iBAoBnCnZ,EAAQyS,UAAU+R,kBAAoB,SAASC,GACjClf,SAARkf,IAImBlf,SAAnBkf,EAAIC,YAA6Cnf,SAAjBkf,EAAIE,UACtC3lB,KAAKwb,OAAOoK,eAAeH,EAAIC,WAAYD,EAAIE,UAG5Bpf,SAAjBkf,EAAII,UACN7lB,KAAKwb,OAAOsK,aAAaL,EAAII,UAG/B7lB,KAAK2hB,WASP3gB,EAAQyS,UAAUsS,kBAAoB,WACpC,GAAIN,GAAMzlB,KAAKwb,OAAOwK,gBAEtB,OADAP,GAAII,SAAW7lB,KAAKwb,OAAO8D,eACpBmG,GAMTzkB,EAAQyS,UAAUwS,UAAY,SAASjT,GAErChT,KAAKshB,gBAAgBtO,EAAMhT,KAAKwN,OAK9BxN,KAAK0b,WAFH1b,KAAKyhB,WAEWzhB,KAAKyhB,WAAWuB,iBAIhBhjB,KAAKgjB,eAAehjB,KAAK8X,WAI7C9X,KAAKkmB,iBAOPllB,EAAQyS,UAAU8E,QAAU,SAAUvF,GACpChT,KAAKimB,UAAUjT,GACfhT,KAAK2hB,SAGD3hB,KAAKmmB,oBAAsBnmB,KAAKyhB,YAClCzhB,KAAKglB,kBAQThkB,EAAQyS,UAAUD,WAAa,SAAUzE,GACvC,GAAIqX,GAAiB7f,MAIrB,IAFAvG,KAAKmlB,gBAEW5e,SAAZwI,EAAuB,CAkBzB,GAhBsBxI,SAAlBwI,EAAQ8D,QAA2B7S,KAAK6S,MAAQ9D,EAAQ8D,OACrCtM,SAAnBwI,EAAQ+D,SAA2B9S,KAAK8S,OAAS/D,EAAQ+D,QAErCvM,SAApBwI,EAAQsO,UAA2Brd,KAAKka,eAAiBnL,EAAQsO,SAC7C9W,SAApBwI,EAAQuO,UAA2Btd,KAAKma,eAAiBpL,EAAQuO,SAEzC/W,SAAxBwI,EAAQ4L,cAA+B3a,KAAK2a,YAAc5L,EAAQ4L,aAC1CpU,SAAxBwI,EAAQ6L,cAA+B5a,KAAK4a,YAAc7L,EAAQ6L,aAC/CrU,SAAnBwI,EAAQqL,SAA0Bpa,KAAKoa,OAASrL,EAAQqL,QACrC7T,SAAnBwI,EAAQsL,SAA0Bra,KAAKqa,OAAStL,EAAQsL,QACrC9T,SAAnBwI,EAAQuL,SAA0Bta,KAAKsa,OAASvL,EAAQuL,QAEhC/T,SAAxBwI,EAAQyL,cAA+Bxa,KAAKwa,YAAczL,EAAQyL,aAC1CjU,SAAxBwI,EAAQ0L,cAA+Bza,KAAKya,YAAc1L,EAAQ0L,aAC1ClU,SAAxBwI,EAAQ2L,cAA+B1a,KAAK0a,YAAc3L,EAAQ2L,aAEhDnU,SAAlBwI,EAAQvB,MAAqB,CAC/B,GAAI6Y,GAAcrmB,KAAK6gB,gBAAgB9R,EAAQvB,MAC3B,MAAhB6Y,IACFrmB,KAAKwN,MAAQ6Y,GAGQ9f,SAArBwI,EAAQiM,WAA6Bhb,KAAKgb,SAAWjM,EAAQiM,UACjCzU,SAA5BwI,EAAQgM,kBAAiC/a,KAAK+a,gBAAkBhM,EAAQgM,iBACjDxU,SAAvBwI,EAAQmM,aAA6Blb,KAAKkb,WAAanM,EAAQmM,YAC3C3U,SAApBwI,EAAQuX,UAA6BtmB,KAAKob,YAAcrM,EAAQuX,SAC9B/f,SAAlCwI,EAAQwX,wBAAqCvmB,KAAKumB,sBAAwBxX,EAAQwX,uBACtDhgB,SAA5BwI,EAAQkM,kBAAiCjb,KAAKib,gBAAkBlM,EAAQkM,iBAC9C1U,SAA1BwI,EAAQsM,gBAA+Brb,KAAKqb,cAAgBtM,EAAQsM,eAEtC9U,SAA9BwI,EAAQuM,oBAAiCtb,KAAKsb,kBAAoBvM,EAAQuM,mBAC7C/U,SAA7BwI,EAAQwM,mBAAiCvb,KAAKub,iBAAmBxM,EAAQwM,kBAC1ChV,SAA/BwI,EAAQoX,qBAAiCnmB,KAAKmmB,mBAAqBpX,EAAQoX,oBAErD5f,SAAtBwI,EAAQ4N,YAAyB3c,KAAK6hB,iBAAmB9S,EAAQ4N,WAC3CpW,SAAtBwI,EAAQ6N,YAAyB5c,KAAK+hB,iBAAmBhT,EAAQ6N,WAEhDrW,SAAjBwI,EAAQiN,OAAoBhc,KAAKkiB,YAAcnT,EAAQiN,MACrCzV,SAAlBwI,EAAQkN,QAAqBjc,KAAKoiB,aAAerT,EAAQkN,OACxC1V,SAAjBwI,EAAQmN,OAAoBlc,KAAKmiB,YAAcpT,EAAQmN,MACtC3V,SAAjBwI,EAAQoN,OAAoBnc,KAAKsiB,YAAcvT,EAAQoN,MACrC5V,SAAlBwI,EAAQqN,QAAqBpc,KAAKwiB,aAAezT,EAAQqN,OACxC7V,SAAjBwI,EAAQsN,OAAoBrc,KAAKuiB,YAAcxT,EAAQsN,MACtC9V,SAAjBwI,EAAQuN,OAAoBtc,KAAK0iB,YAAc3T,EAAQuN,MACrC/V,SAAlBwI,EAAQwN,QAAqBvc,KAAK4iB,aAAe7T,EAAQwN,OACxChW,SAAjBwI,EAAQyN,OAAoBxc,KAAK2iB,YAAc5T,EAAQyN,MAClCjW,SAArBwI,EAAQ0N,WAAwBzc,KAAK8iB,gBAAkB/T,EAAQ0N,UAC1ClW,SAArBwI,EAAQ2N,WAAwB1c,KAAK+iB,gBAAkBhU,EAAQ2N,UAEpCnW,SAA3BwI,EAAQqX,iBAA8BA,EAAiBrX,EAAQqX,gBAE5C7f,SAAnB6f,GACFpmB,KAAKwb,OAAOoK,eAAeQ,EAAeV,WAAYU,EAAeT,UACrE3lB,KAAKwb,OAAOsK,aAAaM,EAAeP,YAGxC7lB,KAAKwb,OAAOoK,eAAe,EAAK,IAChC5lB,KAAKwb,OAAOsK,aAAa,MAI7B9lB,KAAK4f,oBAAoB7Q,GAAWA,EAAQ8Q,iBAE5C7f,KAAK6kB,QAAQ7kB,KAAK6S,MAAO7S,KAAK8S,QAG1B9S,KAAK8X,WACP9X,KAAKuY,QAAQvY,KAAK8X,WAIhB9X,KAAKmmB,oBAAsBnmB,KAAKyhB,YAClCzhB,KAAKglB,kBAOThkB,EAAQyS,UAAUkO,OAAS,WACzB,GAAwBpb,SAApBvG,KAAK0b,WACP,KAAM,mCAGR1b,MAAK8kB,gBACL9kB,KAAKqlB,gBACLrlB,KAAKwmB,gBACLxmB,KAAKymB,eACLzmB,KAAK0mB,cAED1mB,KAAKwN,QAAUxM,EAAQ6Z,MAAM6F,MAC/B1gB,KAAKwN,QAAUxM,EAAQ6Z,MAAM+F,QAC7B5gB,KAAK2mB,kBAEE3mB,KAAKwN,QAAUxM,EAAQ6Z,MAAM8F,KACpC3gB,KAAK4mB,kBAEE5mB,KAAKwN,QAAUxM,EAAQ6Z,MAAMuF,KACpCpgB,KAAKwN,QAAUxM,EAAQ6Z,MAAMwF,UAC7BrgB,KAAKwN,QAAUxM,EAAQ6Z,MAAMyF,QAC7BtgB,KAAK6mB,iBAIL7mB,KAAK8mB,iBAGP9mB,KAAK+mB,cACL/mB,KAAKgnB,iBAMPhmB,EAAQyS,UAAUgT,aAAe,WAC/B,GAAIhH,GAASzf,KAAKwf,MAAMC,OACpBwH,EAAMxH,EAAOyH,WAAW,KAE5BD,GAAIE,UAAU,EAAG,EAAG1H,EAAO5M,MAAO4M,EAAO3M,SAO3C9R,EAAQyS,UAAUuT,cAAgB,WAChC,GAAI1U,EAEJ,IAAItS,KAAKwN,QAAUxM,EAAQ6Z,MAAM2F,UAC/BxgB,KAAKwN,QAAUxM,EAAQ6Z,MAAM4F,QAAS,CAEtC,GAEI2G,GAAUC,EAFVC,EAAmC,IAAzBtnB,KAAKwf,MAAME,WAGrB1f,MAAKwN,QAAUxM,EAAQ6Z,MAAM4F,SAC/B2G,EAAWE,EAAU,EACrBD,EAAWC,EAAU,EAAc,EAAVA,IAGzBF,EAAW,GACXC,EAAW,GAGb,IAAIvU,GAAS7N,KAAKiI,IAA8B,IAA1BlN,KAAKwf,MAAMuF,aAAqB,KAClDnd,EAAM5H,KAAKia,OACXsN,EAAQvnB,KAAKwf,MAAME,YAAc1f,KAAKia,OACtCzS,EAAO+f,EAAQF,EACf7D,EAAS5b,EAAMkL,EAGrB,GAAI2M,GAASzf,KAAKwf,MAAMC,OACpBwH,EAAMxH,EAAOyH,WAAW,KAI5B,IAHAD,EAAIO,UAAY,EAChBP,EAAIQ,KAAO,aAEPznB,KAAKwN,QAAUxM,EAAQ6Z,MAAM2F,SAAU,CAEzC,GAAIkH,GAAO,EACPC,EAAO7U,CACX,KAAKR,EAAIoV,EAAUC,EAAJrV,EAAUA,IAAK,CAC5B,GAAI7F,IAAK6F,EAAIoV,IAASC,EAAOD,GAGzBva,EAAU,IAAJV,EACN5B,EAAQ7K,KAAK4nB,SAASza,EAAK,EAAG,EAElC8Z,GAAIY,YAAchd,EAClBoc,EAAIa,YACJb,EAAIc,OAAOvgB,EAAMI,EAAM0K,GACvB2U,EAAIe,OAAOT,EAAO3f,EAAM0K,GACxB2U,EAAIlH,SAGNkH,EAAIY,YAAe7nB,KAAK6c,UACxBoK,EAAIgB,WAAWzgB,EAAMI,EAAKyf,EAAUvU,GAiBtC,GAdI9S,KAAKwN,QAAUxM,EAAQ6Z,MAAM4F,UAE/BwG,EAAIY,YAAe7nB,KAAK6c,UACxBoK,EAAIiB,UAAaloB,KAAK+c,SACtBkK,EAAIa,YACJb,EAAIc,OAAOvgB,EAAMI,GACjBqf,EAAIe,OAAOT,EAAO3f,GAClBqf,EAAIe,OAAOT,EAAQF,EAAWD,EAAU5D,GACxCyD,EAAIe,OAAOxgB,EAAMgc,GACjByD,EAAIkB,YACJlB,EAAInH,OACJmH,EAAIlH,UAGF/f,KAAKwN,QAAUxM,EAAQ6Z,MAAM2F,UAC/BxgB,KAAKwN,QAAUxM,EAAQ6Z,MAAM4F,QAAS,CAEtC,GAAI2H,GAAc,EACdC,EAAO,GAAI9mB,GAAWvB,KAAKyc,SAAUzc,KAAK0c,UAAW1c,KAAK0c,SAAS1c,KAAKyc,UAAU,GAAG,EAKzF,KAJA4L,EAAKnY,QACDmY,EAAKC,aAAetoB,KAAKyc,UAC3B4L,EAAKE,QAECF,EAAKlY,OACXmC,EAAIkR,GAAU6E,EAAKC,aAAetoB,KAAKyc,WAAazc,KAAK0c,SAAW1c,KAAKyc,UAAY3J,EAErFmU,EAAIa,YACJb,EAAIc,OAAOvgB,EAAO4gB,EAAa9V,GAC/B2U,EAAIe,OAAOxgB,EAAM8K,GACjB2U,EAAIlH,SAEJkH,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,SACnBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAASL,EAAKC,aAAc9gB,EAAO,EAAI4gB,EAAa9V,GAExD+V,EAAKE,MAGPtB,GAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,KACnB,IAAIE,GAAQ3oB,KAAK4a,WACjBqM,GAAIyB,SAASC,EAAOpB,EAAO/D,EAASxjB,KAAKia,UAO7CjZ,EAAQyS,UAAUyS,cAAgB,WAGhC,GAFAlmB,KAAKwf,MAAMvL,OAAOkQ,UAAY,GAE1BnkB,KAAKyhB,WAAY,CACnB,GAAI1S,IACF6Z,QAAW5oB,KAAKumB,uBAEdtB,EAAS,GAAI3jB,GAAOtB,KAAKwf,MAAMvL,OAAQlF,EAC3C/O,MAAKwf,MAAMvL,OAAOgR,OAASA,EAG3BjlB,KAAKwf,MAAMvL,OAAOzG,MAAM0W,QAAU,OAGlCe,EAAO4D,UAAU7oB,KAAKyhB,WAAWpK,QACjC4N,EAAO6D,gBAAgB9oB,KAAKsb,kBAG5B,IAAI7G,GAAKzU,KACL+oB,EAAW,WACb,GAAI1gB,GAAQ4c,EAAO+D,UAEnBvU,GAAGgN,WAAWwH,YAAY5gB,GAC1BoM,EAAGiH,WAAajH,EAAGgN,WAAWuB,iBAE9BvO,EAAGkN,SAELsD,GAAOiE,oBAAoBH,OAG3B/oB,MAAKwf,MAAMvL,OAAOgR,OAAS1e,QAO/BvF,EAAQyS,UAAU+S,cAAgB,WACEjgB,SAA7BvG,KAAKwf,MAAMvL,OAAOgR,QACrBjlB,KAAKwf,MAAMvL,OAAOgR,OAAOtD,UAQ7B3gB,EAAQyS,UAAUsT,YAAc,WAC9B,GAAI/mB,KAAKyhB,WAAY,CACnB,GAAIhC,GAASzf,KAAKwf,MAAMC,OACpBwH,EAAMxH,EAAOyH,WAAW,KAE5BD,GAAIQ,KAAO,aACXR,EAAIkC,UAAY,OAChBlC,EAAIiB,UAAY,OAChBjB,EAAIuB,UAAY,OAChBvB,EAAIwB,aAAe,KAEnB,IAAIpW,GAAIrS,KAAKia,OACT3H,EAAItS,KAAKia,MACbgN,GAAIyB,SAAS1oB,KAAKyhB,WAAW2H,WAAa,KAAOppB,KAAKyhB,WAAW4H,mBAAoBhX,EAAGC,KAQ5FtR,EAAQyS,UAAUiT,YAAc,WAC9B,GAEE4C,GAAMC,EAAIlB,EAAMmB,EAChBC,EAAMC,EAAOC,EAAOC,EACpBC,EAAQC,EAASC,EACjBC,EAAQC,EALNxK,EAASzf,KAAKwf,MAAMC,OACtBwH,EAAMxH,EAAOyH,WAAW,KAQ1BD,GAAIQ,KAAO,GAAKznB,KAAKwb,OAAO8D,eAAiB,UAG7C,IAAI4K,GAAW,KAAQlqB,KAAKmd,MAAM9K,EAC9B8X,EAAW,KAAQnqB,KAAKmd,MAAM7K,EAC9B8X,EAAa,EAAIpqB,KAAKwb,OAAO8D,eAC7B+K,EAAWrqB,KAAKwb,OAAOwK,iBAAiBN,UAU5C,KAPAuB,EAAIO,UAAY,EAChBgC,EAAoCjjB,SAAtBvG,KAAKoiB,aACnBiG,EAAO,GAAI9mB,GAAWvB,KAAKgc,KAAMhc,KAAKkc,KAAMlc,KAAKic,MAAOuN,GACxDnB,EAAKnY,QACDmY,EAAKC,aAAetoB,KAAKgc,MAC3BqM,EAAKE,QAECF,EAAKlY,OAAO,CAClB,GAAIkC,GAAIgW,EAAKC,YAETtoB,MAAKgb,UACPsO,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGrS,KAAKmc,KAAMnc,KAAKsc,OAC1DiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGrS,KAAKqc,KAAMrc,KAAKsc,OACxD2K,EAAIY,YAAc7nB,KAAK8c,UACvBmK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,WAGJuJ,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGrS,KAAKmc,KAAMnc,KAAKsc,OAC1DiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGrS,KAAKmc,KAAK+N,EAAUlqB,KAAKsc,OACjE2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,SAEJuJ,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGrS,KAAKqc,KAAMrc,KAAKsc,OAC1DiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGrS,KAAKqc,KAAK6N,EAAUlqB,KAAKsc,OACjE2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,UAGN4J,EAAS1kB,KAAKwZ,IAAI4L,GAAY,EAAKrqB,KAAKmc,KAAOnc,KAAKqc,KACpDoN,EAAOzpB,KAAKyd,eAAe,GAAIpc,GAAQgR,EAAGsX,EAAO3pB,KAAKsc,OAClDrX,KAAKwZ,IAAe,EAAX4L,GAAgB,GAC3BpD,EAAIuB,UAAY,SAChBvB,EAAIwB,aAAe,MACnBgB,EAAKnX,GAAK8X,GAEHnlB,KAAKqZ,IAAe,EAAX+L,GAAgB,GAChCpD,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,WAGnBxB,EAAIuB,UAAY,OAChBvB,EAAIwB,aAAe,UAErBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAAS,KAAO1oB,KAAKwa,YAAY6N,EAAKC,cAAgB,KAAMmB,EAAKpX,EAAGoX,EAAKnX,GAE7E+V,EAAKE,OAWP,IAPAtB,EAAIO,UAAY,EAChBgC,EAAoCjjB,SAAtBvG,KAAKwiB,aACnB6F,EAAO,GAAI9mB,GAAWvB,KAAKmc,KAAMnc,KAAKqc,KAAMrc,KAAKoc,MAAOoN,GACxDnB,EAAKnY,QACDmY,EAAKC,aAAetoB,KAAKmc,MAC3BkM,EAAKE,QAECF,EAAKlY,OACPnQ,KAAKgb,UACPsO,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAMqM,EAAKC,aAActoB,KAAKsc,OAC1EiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAMmM,EAAKC,aAActoB,KAAKsc,OACxE2K,EAAIY,YAAc7nB,KAAK8c,UACvBmK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,WAGJuJ,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAMqM,EAAKC,aAActoB,KAAKsc,OAC1EiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAKmO,EAAU9B,EAAKC,aAActoB,KAAKsc,OACjF2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,SAEJuJ,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAMmM,EAAKC,aAActoB,KAAKsc,OAC1EiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAKiO,EAAU9B,EAAKC,aAActoB,KAAKsc,OACjF2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,UAGN2J,EAASzkB,KAAKqZ,IAAI+L,GAAa,EAAKrqB,KAAKgc,KAAOhc,KAAKkc,KACrDuN,EAAOzpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOrB,EAAKC,aAActoB,KAAKsc,OAClErX,KAAKwZ,IAAe,EAAX4L,GAAgB,GAC3BpD,EAAIuB,UAAY,SAChBvB,EAAIwB,aAAe,MACnBgB,EAAKnX,GAAK8X,GAEHnlB,KAAKqZ,IAAe,EAAX+L,GAAgB,GAChCpD,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,WAGnBxB,EAAIuB,UAAY,OAChBvB,EAAIwB,aAAe,UAErBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAAS,KAAO1oB,KAAKya,YAAY4N,EAAKC,cAAgB,KAAMmB,EAAKpX,EAAGoX,EAAKnX,GAE7E+V,EAAKE,MAaP,KATAtB,EAAIO,UAAY,EAChBgC,EAAoCjjB,SAAtBvG,KAAK4iB,aACnByF,EAAO,GAAI9mB,GAAWvB,KAAKsc,KAAMtc,KAAKwc,KAAMxc,KAAKuc,MAAOiN,GACxDnB,EAAKnY,QACDmY,EAAKC,aAAetoB,KAAKsc,MAC3B+L,EAAKE,OAEPmB,EAASzkB,KAAKwZ,IAAI4L,GAAa,EAAKrqB,KAAKgc,KAAOhc,KAAKkc,KACrDyN,EAAS1kB,KAAKqZ,IAAI+L,GAAa,EAAKrqB,KAAKmc,KAAOnc,KAAKqc,MAC7CgM,EAAKlY,OAEXmZ,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOC,EAAOtB,EAAKC,eAC1DrB,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOsB,EAAKjX,EAAI+X,EAAYd,EAAKhX,GACrC2U,EAAIlH,SAEJkH,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,SACnBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAAS1oB,KAAK0a,YAAY2N,EAAKC,cAAgB,IAAKgB,EAAKjX,EAAI,EAAGiX,EAAKhX,GAEzE+V,EAAKE,MAEPtB,GAAIO,UAAY,EAChB8B,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOC,EAAO3pB,KAAKsc,OAC1DiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOC,EAAO3pB,KAAKwc,OACxDyK,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,SAGJkH,EAAIO,UAAY,EAEhBwC,EAAShqB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAMhc,KAAKmc,KAAMnc,KAAKsc,OACpE2N,EAASjqB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAMlc,KAAKmc,KAAMnc,KAAKsc,OACpE2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOiC,EAAO3X,EAAG2X,EAAO1X,GAC5B2U,EAAIe,OAAOiC,EAAO5X,EAAG4X,EAAO3X,GAC5B2U,EAAIlH,SAEJiK,EAAShqB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAMhc,KAAKqc,KAAMrc,KAAKsc,OACpE2N,EAASjqB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAMlc,KAAKqc,KAAMrc,KAAKsc,OACpE2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOiC,EAAO3X,EAAG2X,EAAO1X,GAC5B2U,EAAIe,OAAOiC,EAAO5X,EAAG4X,EAAO3X,GAC5B2U,EAAIlH,SAGJkH,EAAIO,UAAY,EAEhB8B,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAMhc,KAAKmc,KAAMnc,KAAKsc,OAClEiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKgc,KAAMhc,KAAKqc,KAAMrc,KAAKsc,OAChE2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,SAEJuJ,EAAOtpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAMlc,KAAKmc,KAAMnc,KAAKsc,OAClEiN,EAAKvpB,KAAKyd,eAAe,GAAIpc,GAAQrB,KAAKkc,KAAMlc,KAAKqc,KAAMrc,KAAKsc,OAChE2K,EAAIY,YAAc7nB,KAAK6c,UACvBoK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOuB,EAAGlX,EAAGkX,EAAGjX,GACpB2U,EAAIlH,QAGJ,IAAI3F,GAASpa,KAAKoa,MACdA,GAAO1U,OAAS,IAClBqkB,EAAU,GAAM/pB,KAAKmd,MAAM7K,EAC3BoX,GAAS1pB,KAAKgc,KAAOhc,KAAKkc,MAAQ,EAClCyN,EAAS1kB,KAAKwZ,IAAI4L,GAAY,EAAKrqB,KAAKmc,KAAO4N,EAAS/pB,KAAKqc,KAAO0N,EACpEN,EAAOzpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOC,EAAO3pB,KAAKsc,OACtDrX,KAAKwZ,IAAe,EAAX4L,GAAgB,GAC3BpD,EAAIuB,UAAY,SAChBvB,EAAIwB,aAAe,OAEZxjB,KAAKqZ,IAAe,EAAX+L,GAAgB,GAChCpD,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,WAGnBxB,EAAIuB,UAAY,OAChBvB,EAAIwB,aAAe,UAErBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAAStO,EAAQqP,EAAKpX,EAAGoX,EAAKnX,GAIpC,IAAI+H,GAASra,KAAKqa,MACdA,GAAO3U,OAAS,IAClBokB,EAAU,GAAM9pB,KAAKmd,MAAM9K,EAC3BqX,EAASzkB,KAAKqZ,IAAI+L,GAAa,EAAKrqB,KAAKgc,KAAO8N,EAAU9pB,KAAKkc,KAAO4N,EACtEH,GAAS3pB,KAAKmc,KAAOnc,KAAKqc,MAAQ,EAClCoN,EAAOzpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOC,EAAO3pB,KAAKsc,OACtDrX,KAAKwZ,IAAe,EAAX4L,GAAgB,GAC3BpD,EAAIuB,UAAY,SAChBvB,EAAIwB,aAAe,OAEZxjB,KAAKqZ,IAAe,EAAX+L,GAAgB,GAChCpD,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,WAGnBxB,EAAIuB,UAAY,OAChBvB,EAAIwB,aAAe,UAErBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAASrO,EAAQoP,EAAKpX,EAAGoX,EAAKnX,GAIpC,IAAIgI,GAASta,KAAKsa,MACdA,GAAO5U,OAAS,IAClBmkB,EAAS,GACTH,EAASzkB,KAAKwZ,IAAI4L,GAAa,EAAKrqB,KAAKgc,KAAOhc,KAAKkc,KACrDyN,EAAS1kB,KAAKqZ,IAAI+L,GAAa,EAAKrqB,KAAKmc,KAAOnc,KAAKqc,KACrDuN,GAAS5pB,KAAKsc,KAAOtc,KAAKwc,MAAQ,EAClCiN,EAAOzpB,KAAKyd,eAAe,GAAIpc,GAAQqoB,EAAOC,EAAOC,IACrD3C,EAAIuB,UAAY,QAChBvB,EAAIwB,aAAe,SACnBxB,EAAIiB,UAAYloB,KAAK6c,UACrBoK,EAAIyB,SAASpO,EAAQmP,EAAKpX,EAAIwX,EAAQJ,EAAKnX,KAU/CtR,EAAQyS,UAAUmU,SAAW,SAAS0C,EAAGC,EAAGC,GAC1C,GAAIC,GAAGC,EAAGC,EAAGC,EAAGC,EAAIC,CAMpB,QAJAF,EAAIJ,EAAID,EACRM,EAAK5lB,KAAKC,MAAMolB,EAAE,IAClBQ,EAAIF,GAAK,EAAI3lB,KAAK8lB,IAAMT,EAAE,GAAM,EAAK,IAE7BO,GACN,IAAK,GAAGJ,EAAIG,EAAGF,EAAII,EAAGH,EAAI,CAAG,MAC7B,KAAK,GAAGF,EAAIK,EAAGJ,EAAIE,EAAGD,EAAI,CAAG,MAC7B,KAAK,GAAGF,EAAI,EAAGC,EAAIE,EAAGD,EAAIG,CAAG,MAC7B,KAAK,GAAGL,EAAI,EAAGC,EAAII,EAAGH,EAAIC,CAAG,MAC7B,KAAK,GAAGH,EAAIK,EAAGJ,EAAI,EAAGC,EAAIC,CAAG,MAC7B,KAAK,GAAGH,EAAIG,EAAGF,EAAI,EAAGC,EAAIG,CAAG,MAE7B,SAASL,EAAI,EAAGC,EAAI,EAAGC,EAAI,EAG7B,MAAO,OAASK,SAAW,IAAFP,GAAS,IAAMO,SAAW,IAAFN,GAAS,IAAMM,SAAW,IAAFL,GAAS,KAQpF3pB,EAAQyS,UAAUkT,gBAAkB,WAClC,GAEEnU,GAAO+U,EAAO3f,EAAKqjB,EACnB1lB,EACA2lB,EAAgBhD,EAAWL,EAAaL,EACxClc,EAAGC,EAAGC,EAAG2f,EALP1L,EAASzf,KAAKwf,MAAMC,OACtBwH,EAAMxH,EAAOyH,WAAW,KAO1B,MAAwB3gB,SAApBvG,KAAK0b,YAA4B1b,KAAK0b,WAAWhW,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C,GAAI+d,GAAQtjB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGiN,OAC3D+Q,EAASvjB,KAAK6d,4BAA4ByF,EAE9CtjB,MAAK0b,WAAWnW,GAAG+d,MAAQA,EAC3BtjB,KAAK0b,WAAWnW,GAAGge,OAASA,CAG5B,IAAI6H,GAAcprB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGie,OACrExjB,MAAK0b,WAAWnW,GAAG8lB,KAAOrrB,KAAK+a,gBAAkBqQ,EAAY1lB,UAAY0lB,EAAYhO,EAIvF,GAAIkO,GAAY,SAAUhmB,EAAGa,GAC3B,MAAOA,GAAEklB,KAAO/lB,EAAE+lB,KAIpB,IAFArrB,KAAK0b,WAAWjF,KAAK6U,GAEjBtrB,KAAKwN,QAAUxM,EAAQ6Z,MAAM+F,SAC/B,IAAKrb,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAMtC,GALAiN,EAAQxS,KAAK0b,WAAWnW,GACxBgiB,EAAQvnB,KAAK0b,WAAWnW,GAAGke,WAC3B7b,EAAQ5H,KAAK0b,WAAWnW,GAAGme,SAC3BuH,EAAQjrB,KAAK0b,WAAWnW,GAAGoe,WAEbpd,SAAViM,GAAiCjM,SAAVghB,GAA+BhhB,SAARqB,GAA+BrB,SAAV0kB,EAAqB,CAE1F,GAAIjrB,KAAKmb,gBAAkBnb,KAAKkb,WAAY,CAK1C,GAAIqQ,GAAQlqB,EAAQmqB,SAASP,EAAM3H,MAAO9Q,EAAM8Q,OAC5CmI,EAAQpqB,EAAQmqB,SAAS5jB,EAAI0b,MAAOiE,EAAMjE,OAC1CoI,EAAerqB,EAAQsqB,aAAaJ,EAAOE,GAC3CjmB,EAAMkmB,EAAahmB,QAGvBwlB,GAAkBQ,EAAatO,EAAI,MAGnC8N,IAAiB,CAGfA,IAEFC,GAAQ3Y,EAAMA,MAAM4K,EAAImK,EAAM/U,MAAM4K,EAAIxV,EAAI4K,MAAM4K,EAAI6N,EAAMzY,MAAM4K,GAAK,EACvE9R,EAAoE,KAA/D,GAAK6f,EAAOnrB,KAAKsc,MAAQtc,KAAKmd,MAAMC,EAAKpd,KAAKqb,eACnD9P,EAAI,EAEAvL,KAAKkb,YACP1P,EAAIvG,KAAKwG,IAAI,EAAKigB,EAAarZ,EAAI7M,EAAO,EAAG,GAC7C0iB,EAAYloB,KAAK4nB,SAAStc,EAAGC,EAAGC,GAChCqc,EAAcK,IAGd1c,EAAI,EACJ0c,EAAYloB,KAAK4nB,SAAStc,EAAGC,EAAGC,GAChCqc,EAAc7nB,KAAK6c,aAIrBqL,EAAY,OACZL,EAAc7nB,KAAK6c,WAErB2K,EAAY,GAEZP,EAAIO,UAAYA,EAChBP,EAAIiB,UAAYA,EAChBjB,EAAIY,YAAcA,EAClBZ,EAAIa,YACJb,EAAIc,OAAOvV,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,GACxC2U,EAAIe,OAAOT,EAAMhE,OAAOlR,EAAGkV,EAAMhE,OAAOjR,GACxC2U,EAAIe,OAAOiD,EAAM1H,OAAOlR,EAAG4Y,EAAM1H,OAAOjR,GACxC2U,EAAIe,OAAOpgB,EAAI2b,OAAOlR,EAAGzK,EAAI2b,OAAOjR,GACpC2U,EAAIkB,YACJlB,EAAInH,OACJmH,EAAIlH,cAKR,KAAKxa,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IACtCiN,EAAQxS,KAAK0b,WAAWnW,GACxBgiB,EAAQvnB,KAAK0b,WAAWnW,GAAGke,WAC3B7b,EAAQ5H,KAAK0b,WAAWnW,GAAGme,SAEbnd,SAAViM,IAEAgV,EADExnB,KAAK+a,gBACK,GAAKvI,EAAM8Q,MAAMlG,EAGjB,IAAMpd,KAAKyb,IAAI2B,EAAIpd,KAAKwb,OAAO8D,iBAIjC/Y,SAAViM,GAAiCjM,SAAVghB,IAEzB4D,GAAQ3Y,EAAMA,MAAM4K,EAAImK,EAAM/U,MAAM4K,GAAK,EACzC9R,EAAoE,KAA/D,GAAK6f,EAAOnrB,KAAKsc,MAAQtc,KAAKmd,MAAMC,EAAKpd,KAAKqb,eAEnD4L,EAAIO,UAAYA,EAChBP,EAAIY,YAAc7nB,KAAK4nB,SAAStc,EAAG,EAAG,GACtC2b,EAAIa,YACJb,EAAIc,OAAOvV,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,GACxC2U,EAAIe,OAAOT,EAAMhE,OAAOlR,EAAGkV,EAAMhE,OAAOjR,GACxC2U,EAAIlH,UAGQxZ,SAAViM,GAA+BjM,SAARqB,IAEzBujB,GAAQ3Y,EAAMA,MAAM4K,EAAIxV,EAAI4K,MAAM4K,GAAK,EACvC9R,EAAoE,KAA/D,GAAK6f,EAAOnrB,KAAKsc,MAAQtc,KAAKmd,MAAMC,EAAKpd,KAAKqb,eAEnD4L,EAAIO,UAAYA,EAChBP,EAAIY,YAAc7nB,KAAK4nB,SAAStc,EAAG,EAAG,GACtC2b,EAAIa,YACJb,EAAIc,OAAOvV,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,GACxC2U,EAAIe,OAAOpgB,EAAI2b,OAAOlR,EAAGzK,EAAI2b,OAAOjR,GACpC2U,EAAIlH,YAWZ/e,EAAQyS,UAAUqT,eAAiB,WACjC,GAEIvhB,GAFAka,EAASzf,KAAKwf,MAAMC,OACpBwH,EAAMxH,EAAOyH,WAAW,KAG5B,MAAwB3gB,SAApBvG,KAAK0b,YAA4B1b,KAAK0b,WAAWhW,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C,GAAI+d,GAAQtjB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGiN,OAC3D+Q,EAASvjB,KAAK6d,4BAA4ByF,EAC9CtjB,MAAK0b,WAAWnW,GAAG+d,MAAQA,EAC3BtjB,KAAK0b,WAAWnW,GAAGge,OAASA,CAG5B,IAAI6H,GAAcprB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGie,OACrExjB,MAAK0b,WAAWnW,GAAG8lB,KAAOrrB,KAAK+a,gBAAkBqQ,EAAY1lB,UAAY0lB,EAAYhO,EAIvF,GAAIkO,GAAY,SAAUhmB,EAAGa,GAC3B,MAAOA,GAAEklB,KAAO/lB,EAAE+lB,KAEpBrrB,MAAK0b,WAAWjF,KAAK6U,EAGrB,IAAIhE,GAAmC,IAAzBtnB,KAAKwf,MAAME,WACzB,KAAKna,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C,GAAIiN,GAAQxS,KAAK0b,WAAWnW,EAE5B,IAAIvF,KAAKwN,QAAUxM,EAAQ6Z,MAAM0F,QAAS,CAGxC,GAAI+I,GAAOtpB,KAAKyd,eAAejL,EAAMgR,OACrCyD,GAAIO,UAAY,EAChBP,EAAIY,YAAc7nB,KAAK8c,UACvBmK,EAAIa,YACJb,EAAIc,OAAOuB,EAAKjX,EAAGiX,EAAKhX,GACxB2U,EAAIe,OAAOxV,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,GACxC2U,EAAIlH,SAIN,GAAIpN,EAEFA,GADE3S,KAAKwN,QAAUxM,EAAQ6Z,MAAM4F,QACxB6G,EAAQ,EAAI,EAAEA,GAAW9U,EAAMA,MAAMpL,MAAQpH,KAAKyc,WAAazc,KAAK0c,SAAW1c,KAAKyc,UAGpF6K,CAGT,IAAIsE,EAEFA,GADE5rB,KAAK+a,gBACEpI,GAAQH,EAAM8Q,MAAMlG,EAGpBzK,IAAS3S,KAAKyb,IAAI2B,EAAIpd,KAAKwb,OAAO8D,gBAEhC,EAATsM,IACFA,EAAS,EAGX,IAAIze,GAAKtC,EAAOoV,CACZjgB,MAAKwN,QAAUxM,EAAQ6Z,MAAM2F,UAE/BrT,EAAqE,KAA9D,GAAKqF,EAAMA,MAAMpL,MAAQpH,KAAKyc,UAAYzc,KAAKmd,MAAM/V,OAC5DyD,EAAQ7K,KAAK4nB,SAASza,EAAK,EAAG,GAC9B8S,EAAcjgB,KAAK4nB,SAASza,EAAK,EAAG,KAE7BnN,KAAKwN,QAAUxM,EAAQ6Z,MAAM4F,SACpC5V,EAAQ7K,KAAK+c,SACbkD,EAAcjgB,KAAKgd,iBAInB7P,EAA+E,KAAxE,GAAKqF,EAAMA,MAAM4K,EAAIpd,KAAKsc,MAAQtc,KAAKmd,MAAMC,EAAKpd,KAAKqb,eAC9DxQ,EAAQ7K,KAAK4nB,SAASza,EAAK,EAAG,GAC9B8S,EAAcjgB,KAAK4nB,SAASza,EAAK,EAAG,KAItC8Z,EAAIO,UAAY,EAChBP,EAAIY,YAAc5H,EAClBgH,EAAIiB,UAAYrd,EAChBoc,EAAIa,YACJb,EAAI4E,IAAIrZ,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,EAAGsZ,EAAQ,EAAW,EAAR3mB,KAAK6mB,IAAM,GAC9D7E,EAAInH,OACJmH,EAAIlH,YAQR/e,EAAQyS,UAAUoT,eAAiB,WACjC,GAEIthB,GAAGwmB,EAAGC,EAASC,EAFfxM,EAASzf,KAAKwf,MAAMC,OACpBwH,EAAMxH,EAAOyH,WAAW,KAG5B,MAAwB3gB,SAApBvG,KAAK0b,YAA4B1b,KAAK0b,WAAWhW,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C,GAAI+d,GAAQtjB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGiN,OAC3D+Q,EAASvjB,KAAK6d,4BAA4ByF,EAC9CtjB,MAAK0b,WAAWnW,GAAG+d,MAAQA,EAC3BtjB,KAAK0b,WAAWnW,GAAGge,OAASA,CAG5B,IAAI6H,GAAcprB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGie,OACrExjB,MAAK0b,WAAWnW,GAAG8lB,KAAOrrB,KAAK+a,gBAAkBqQ,EAAY1lB,UAAY0lB,EAAYhO,EAIvF,GAAIkO,GAAY,SAAUhmB,EAAGa,GAC3B,MAAOA,GAAEklB,KAAO/lB,EAAE+lB,KAEpBrrB,MAAK0b,WAAWjF,KAAK6U,EAGrB,IAAIY,GAASlsB,KAAK2c,UAAY,EAC1BwP,EAASnsB,KAAK4c,UAAY,CAC9B,KAAKrX,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C,GAGI4H,GAAKtC,EAAOoV,EAHZzN,EAAQxS,KAAK0b,WAAWnW,EAIxBvF,MAAKwN,QAAUxM,EAAQ6Z,MAAMwF,UAE/BlT,EAAqE,KAA9D,GAAKqF,EAAMA,MAAMpL,MAAQpH,KAAKyc,UAAYzc,KAAKmd,MAAM/V,OAC5DyD,EAAQ7K,KAAK4nB,SAASza,EAAK,EAAG,GAC9B8S,EAAcjgB,KAAK4nB,SAASza,EAAK,EAAG,KAE7BnN,KAAKwN,QAAUxM,EAAQ6Z,MAAMyF,SACpCzV,EAAQ7K,KAAK+c,SACbkD,EAAcjgB,KAAKgd,iBAInB7P,EAA+E,KAAxE,GAAKqF,EAAMA,MAAM4K,EAAIpd,KAAKsc,MAAQtc,KAAKmd,MAAMC,EAAKpd,KAAKqb,eAC9DxQ,EAAQ7K,KAAK4nB,SAASza,EAAK,EAAG,GAC9B8S,EAAcjgB,KAAK4nB,SAASza,EAAK,EAAG,KAIlCnN,KAAKwN,QAAUxM,EAAQ6Z,MAAMyF,UAC/B4L,EAAUlsB,KAAK2c,UAAY,IAAOnK,EAAMA,MAAMpL,MAAQpH,KAAKyc,WAAazc,KAAK0c,SAAW1c,KAAKyc,UAAY,GAAM,IAC/G0P,EAAUnsB,KAAK4c,UAAY,IAAOpK,EAAMA,MAAMpL,MAAQpH,KAAKyc,WAAazc,KAAK0c,SAAW1c,KAAKyc,UAAY,GAAM,IAIjH,IAAIhI,GAAKzU,KACL0d,EAAUlL,EAAMA,MAChB5K,IACD4K,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQzO,EAAQN,KACnE5K,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQzO,EAAQN,KACnE5K,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQzO,EAAQN,KACnE5K,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQzO,EAAQN,KAElEoG,IACDhR,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQnsB,KAAKsc,QAChE9J,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQnsB,KAAKsc,QAChE9J,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQnsB,KAAKsc,QAChE9J,MAAO,GAAInR,GAAQqc,EAAQrL,EAAI6Z,EAAQxO,EAAQpL,EAAI6Z,EAAQnsB,KAAKsc,OAInE1U,GAAIW,QAAQ,SAAU2a,GACpBA,EAAIK,OAAS9O,EAAGgJ,eAAeyF,EAAI1Q,SAErCgR,EAAOjb,QAAQ,SAAU2a,GACvBA,EAAIK,OAAS9O,EAAGgJ,eAAeyF,EAAI1Q,QAIrC,IAAI4Z,KACDH,QAASrkB,EAAKykB,OAAQhrB,EAAQirB,IAAI9I,EAAO,GAAGhR,MAAOgR,EAAO,GAAGhR,SAC7DyZ,SAAUrkB,EAAI,GAAIA,EAAI,GAAI4b,EAAO,GAAIA,EAAO,IAAK6I,OAAQhrB,EAAQirB,IAAI9I,EAAO,GAAGhR,MAAOgR,EAAO,GAAGhR,SAChGyZ,SAAUrkB,EAAI,GAAIA,EAAI,GAAI4b,EAAO,GAAIA,EAAO,IAAK6I,OAAQhrB,EAAQirB,IAAI9I,EAAO,GAAGhR,MAAOgR,EAAO,GAAGhR,SAChGyZ,SAAUrkB,EAAI,GAAIA,EAAI,GAAI4b,EAAO,GAAIA,EAAO,IAAK6I,OAAQhrB,EAAQirB,IAAI9I,EAAO,GAAGhR,MAAOgR,EAAO,GAAGhR,SAChGyZ,SAAUrkB,EAAI,GAAIA,EAAI,GAAI4b,EAAO,GAAIA,EAAO,IAAK6I,OAAQhrB,EAAQirB,IAAI9I,EAAO,GAAGhR,MAAOgR,EAAO,GAAGhR,QAKnG,KAHAA,EAAM4Z,SAAWA,EAGZL,EAAI,EAAGA,EAAIK,EAAS1mB,OAAQqmB,IAAK,CACpCC,EAAUI,EAASL,EACnB,IAAIQ,GAAcvsB,KAAK4d,2BAA2BoO,EAAQK,OAC1DL,GAAQX,KAAOrrB,KAAK+a,gBAAkBwR,EAAY7mB,UAAY6mB,EAAYnP,EAwB5E,IAjBAgP,EAAS3V,KAAK,SAAUnR,EAAGa,GACzB,GAAIqmB,GAAOrmB,EAAEklB,KAAO/lB,EAAE+lB,IACtB,OAAImB,GAAaA,EAGblnB,EAAE2mB,UAAYrkB,EAAY,EAC1BzB,EAAE8lB,UAAYrkB,EAAY,GAGvB,IAITqf,EAAIO,UAAY,EAChBP,EAAIY,YAAc5H,EAClBgH,EAAIiB,UAAYrd,EAEXkhB,EAAI,EAAGA,EAAIK,EAAS1mB,OAAQqmB,IAC/BC,EAAUI,EAASL,GACnBE,EAAUD,EAAQC,QAClBhF,EAAIa,YACJb,EAAIc,OAAOkE,EAAQ,GAAG1I,OAAOlR,EAAG4Z,EAAQ,GAAG1I,OAAOjR,GAClD2U,EAAIe,OAAOiE,EAAQ,GAAG1I,OAAOlR,EAAG4Z,EAAQ,GAAG1I,OAAOjR,GAClD2U,EAAIe,OAAOiE,EAAQ,GAAG1I,OAAOlR,EAAG4Z,EAAQ,GAAG1I,OAAOjR,GAClD2U,EAAIe,OAAOiE,EAAQ,GAAG1I,OAAOlR,EAAG4Z,EAAQ,GAAG1I,OAAOjR,GAClD2U,EAAIe,OAAOiE,EAAQ,GAAG1I,OAAOlR,EAAG4Z,EAAQ,GAAG1I,OAAOjR,GAClD2U,EAAInH,OACJmH,EAAIlH,YAUV/e,EAAQyS,UAAUmT,gBAAkB,WAClC,GAEEpU,GAAOjN,EAFLka,EAASzf,KAAKwf,MAAMC,OACtBwH,EAAMxH,EAAOyH,WAAW,KAG1B,MAAwB3gB,SAApBvG,KAAK0b,YAA4B1b,KAAK0b,WAAWhW,QAAU,GAA/D,CAIA,IAAKH,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C,GAAI+d,GAAQtjB,KAAK4d,2BAA2B5d,KAAK0b,WAAWnW,GAAGiN,OAC3D+Q,EAASvjB,KAAK6d,4BAA4ByF,EAE9CtjB,MAAK0b,WAAWnW,GAAG+d,MAAQA,EAC3BtjB,KAAK0b,WAAWnW,GAAGge,OAASA,EAc9B,IAVIvjB,KAAK0b,WAAWhW,OAAS,IAC3B8M,EAAQxS,KAAK0b,WAAW,GAExBuL,EAAIO,UAAY,EAChBP,EAAIY,YAAc,OAClBZ,EAAIa,YACJb,EAAIc,OAAOvV,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,IAIrC/M,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IACtCiN,EAAQxS,KAAK0b,WAAWnW,GACxB0hB,EAAIe,OAAOxV,EAAM+Q,OAAOlR,EAAGG,EAAM+Q,OAAOjR,EAItCtS,MAAK0b,WAAWhW,OAAS,GAC3BuhB,EAAIlH,WASR/e,EAAQyS,UAAU4Q,aAAe,SAAS7a,GAWxC,GAVAA,EAAQA,GAAS/B,OAAO+B,MAIpBxJ,KAAKysB,gBACPzsB,KAAK0sB,WAAWljB,GAIlBxJ,KAAKysB,eAAiBjjB,EAAMmjB,MAAyB,IAAhBnjB,EAAMmjB,MAAiC,IAAjBnjB,EAAMojB,OAC5D5sB,KAAKysB,gBAAmBzsB,KAAK6sB,UAAlC,CAGA7sB,KAAK8sB,YAAcC,UAAUvjB,GAC7BxJ,KAAKgtB,YAAcC,UAAUzjB,GAE7BxJ,KAAKktB,WAAa,GAAI7oB,MAAKrE,KAAKkQ,OAChClQ,KAAKmtB,SAAW,GAAI9oB,MAAKrE,KAAKmQ,KAC9BnQ,KAAKotB,iBAAmBptB,KAAKwb,OAAOwK,iBAEpChmB,KAAKwf,MAAMhS,MAAM6f,OAAS,MAK1B,IAAI5Y,GAAKzU,IACTA,MAAKstB,YAAc,SAAU9jB,GAAQiL,EAAG8Y,aAAa/jB,IACrDxJ,KAAKwtB,UAAc,SAAUhkB,GAAQiL,EAAGiY,WAAWljB,IACnD7I,EAAKkI,iBAAiBgJ,SAAU,YAAa4C,EAAG6Y,aAChD3sB,EAAKkI,iBAAiBgJ,SAAU,UAAW4C,EAAG+Y,WAC9C7sB,EAAK4I,eAAeC,KAStBxI,EAAQyS,UAAU8Z,aAAe,SAAU/jB,GACzCA,EAAQA,GAAS/B,OAAO+B,KAGxB,IAAIikB,GAAQlI,WAAWwH,UAAUvjB,IAAUxJ,KAAK8sB,YAC5CY,EAAQnI,WAAW0H,UAAUzjB,IAAUxJ,KAAKgtB,YAE5CW,EAAgB3tB,KAAKotB,iBAAiB1H,WAAa+H,EAAQ,IAC3DG,EAAc5tB,KAAKotB,iBAAiBzH,SAAW+H,EAAQ,IAEvDG,EAAY,EACZC,EAAY7oB,KAAKqZ,IAAIuP,EAAY,IAAM,EAAI5oB,KAAK6mB,GAIhD7mB,MAAK8lB,IAAI9lB,KAAKqZ,IAAIqP,IAAkBG,IACtCH,EAAgB1oB,KAAK8oB,MAAOJ,EAAgB1oB,KAAK6mB,IAAO7mB,KAAK6mB,GAAK,MAEhE7mB,KAAK8lB,IAAI9lB,KAAKwZ,IAAIkP,IAAkBG,IACtCH,GAAiB1oB,KAAK8oB,MAAOJ,EAAe1oB,KAAK6mB,GAAK,IAAQ,IAAO7mB,KAAK6mB,GAAK,MAI7E7mB,KAAK8lB,IAAI9lB,KAAKqZ,IAAIsP,IAAgBE,IACpCF,EAAc3oB,KAAK8oB,MAAOH,EAAc3oB,KAAK6mB,IAAO7mB,KAAK6mB,IAEvD7mB,KAAK8lB,IAAI9lB,KAAKwZ,IAAImP,IAAgBE,IACpCF,GAAe3oB,KAAK8oB,MAAOH,EAAa3oB,KAAK6mB,GAAK,IAAQ,IAAO7mB,KAAK6mB,IAGxE9rB,KAAKwb,OAAOoK,eAAe+H,EAAeC,GAC1C5tB,KAAK2hB,QAGL,IAAIqM,GAAahuB,KAAK+lB,mBACtB/lB,MAAKiuB,KAAK,uBAAwBD,GAElCrtB,EAAK4I,eAAeC,IAStBxI,EAAQyS,UAAUiZ,WAAa,SAAUljB,GACvCxJ,KAAKwf,MAAMhS,MAAM6f,OAAS,OAC1BrtB,KAAKysB,gBAAiB,EAGtB9rB,EAAK0I,oBAAoBwI,SAAU,YAAa7R,KAAKstB,aACrD3sB,EAAK0I,oBAAoBwI,SAAU,UAAa7R,KAAKwtB,WACrD7sB,EAAK4I,eAAeC,IAOtBxI,EAAQyS,UAAUkR,WAAa,SAAUnb,GACvC,GAAIuP,GAAQ,IACRmV,EAASnB,UAAUvjB,GAAS7I,EAAK0G,gBAAgBrH,KAAKwf,OACtD2O,EAASlB,UAAUzjB,GAAS7I,EAAKgH,eAAe3H,KAAKwf,MAEzD,IAAKxf,KAAKob,YAAV,CASA,GALIpb,KAAKouB,gBACPxU,aAAa5Z,KAAKouB,gBAIhBpuB,KAAKysB,eAEP,WADAzsB,MAAKquB,cAIP,IAAIruB,KAAKsmB,SAAWtmB,KAAKsmB,QAAQgI,UAAW,CAE1C,GAAIA,GAAYtuB,KAAKuuB,iBAAiBL,EAAQC,EAC1CG,KAActuB,KAAKsmB,QAAQgI,YAEzBA,EACFtuB,KAAKwuB,aAAaF,GAGlBtuB,KAAKquB,oBAIN,CAEH,GAAI5Z,GAAKzU,IACTA,MAAKouB,eAAiBvU,WAAW,WAC/BpF,EAAG2Z,eAAiB,IAGpB,IAAIE,GAAY7Z,EAAG8Z,iBAAiBL,EAAQC,EACxCG,IACF7Z,EAAG+Z,aAAaF,IAEjBvV,MAOP/X,EAAQyS,UAAU8Q,cAAgB,SAAS/a,GACzCxJ,KAAK6sB,WAAY,CAEjB,IAAIpY,GAAKzU,IACTA,MAAKyuB,YAAc,SAAUjlB,GAAQiL,EAAGia,aAAallB,IACrDxJ,KAAK2uB,WAAc,SAAUnlB,GAAQiL,EAAGma,YAAYplB,IACpD7I,EAAKkI,iBAAiBgJ,SAAU,YAAa4C,EAAGga,aAChD9tB,EAAKkI,iBAAiBgJ,SAAU,WAAY4C,EAAGka,YAE/C3uB,KAAKqkB,aAAa7a,IAMpBxI,EAAQyS,UAAUib,aAAe,SAASllB,GACxCxJ,KAAKutB,aAAa/jB,IAMpBxI,EAAQyS,UAAUmb,YAAc,SAASplB,GACvCxJ,KAAK6sB,WAAY,EAEjBlsB,EAAK0I,oBAAoBwI,SAAU,YAAa7R,KAAKyuB,aACrD9tB,EAAK0I,oBAAoBwI,SAAU,WAAc7R,KAAK2uB,YAEtD3uB,KAAK0sB,WAAWljB,IASlBxI,EAAQyS,UAAUgR,SAAW,SAASjb,GAC/BA,IACHA,EAAQ/B,OAAO+B,MAGjB,IAAIqlB,GAAQ,CAYZ,IAXIrlB,EAAMslB,WACRD,EAAQrlB,EAAMslB,WAAW,IAChBtlB,EAAMulB,SAGfF,GAASrlB,EAAMulB,OAAO,GAMpBF,EAAO,CACT,GAAIG,GAAYhvB,KAAKwb,OAAO8D,eACxB2P,EAAYD,GAAa,EAAIH,EAAQ,GAEzC7uB,MAAKwb,OAAOsK,aAAamJ,GACzBjvB,KAAK2hB,SAEL3hB,KAAKquB,eAIP,GAAIL,GAAahuB,KAAK+lB,mBACtB/lB,MAAKiuB,KAAK,uBAAwBD,GAKlCrtB,EAAK4I,eAAeC,IAUtBxI,EAAQyS,UAAUyb,gBAAkB,SAAU1c,EAAO2c,GAKnD,QAASC,GAAM/c,GACb,MAAOA,GAAI,EAAI,EAAQ,EAAJA,EAAQ,GAAK,EALlC,GAAI/M,GAAI6pB,EAAS,GACfhpB,EAAIgpB,EAAS,GACb1uB,EAAI0uB,EAAS,GAMXE,EAAKD,GAAMjpB,EAAEkM,EAAI/M,EAAE+M,IAAMG,EAAMF,EAAIhN,EAAEgN,IAAMnM,EAAEmM,EAAIhN,EAAEgN,IAAME,EAAMH,EAAI/M,EAAE+M,IACrEid,EAAKF,GAAM3uB,EAAE4R,EAAIlM,EAAEkM,IAAMG,EAAMF,EAAInM,EAAEmM,IAAM7R,EAAE6R,EAAInM,EAAEmM,IAAME,EAAMH,EAAIlM,EAAEkM,IACrEkd,EAAKH,GAAM9pB,EAAE+M,EAAI5R,EAAE4R,IAAMG,EAAMF,EAAI7R,EAAE6R,IAAMhN,EAAEgN,EAAI7R,EAAE6R,IAAME,EAAMH,EAAI5R,EAAE4R,GAGzE,SAAc,GAANgd,GAAiB,GAANC,GAAWD,GAAMC,GAC3B,GAANA,GAAiB,GAANC,GAAWD,GAAMC,GACtB,GAANF,GAAiB,GAANE,GAAWF,GAAME,IAUjCvuB,EAAQyS,UAAU8a,iBAAmB,SAAUlc,EAAGC,GAChD,GAAI/M,GACFiqB,EAAU,IACVlB,EAAY,KACZmB,EAAmB,KACnBC,EAAc,KACdrD,EAAS,GAAIjrB,GAAQiR,EAAGC,EAE1B,IAAItS,KAAKwN,QAAUxM,EAAQ6Z,MAAMuF,KAC/BpgB,KAAKwN,QAAUxM,EAAQ6Z,MAAMwF,UAC7BrgB,KAAKwN,QAAUxM,EAAQ6Z,MAAMyF,QAE7B,IAAK/a,EAAIvF,KAAK0b,WAAWhW,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAChD+oB,EAAYtuB,KAAK0b,WAAWnW,EAC5B,IAAI6mB,GAAYkC,EAAUlC,QAC1B,IAAIA,EACF,IAAK,GAAI7gB,GAAI6gB,EAAS1mB,OAAS,EAAG6F,GAAK,EAAGA,IAAK,CAE7C,GAAIygB,GAAUI,EAAS7gB,GACnB0gB,EAAUD,EAAQC,QAClB0D,GAAa1D,EAAQ,GAAG1I,OAAQ0I,EAAQ,GAAG1I,OAAQ0I,EAAQ,GAAG1I,QAC9DqM,GAAa3D,EAAQ,GAAG1I,OAAQ0I,EAAQ,GAAG1I,OAAQ0I,EAAQ,GAAG1I,OAClE,IAAIvjB,KAAKkvB,gBAAgB7C,EAAQsD,IAC/B3vB,KAAKkvB,gBAAgB7C,EAAQuD,GAE7B,MAAOtB,QAQf,KAAK/oB,EAAI,EAAGA,EAAIvF,KAAK0b,WAAWhW,OAAQH,IAAK,CAC3C+oB,EAAYtuB,KAAK0b,WAAWnW,EAC5B,IAAIiN,GAAQ8b,EAAU/K,MACtB,IAAI/Q,EAAO,CACT,GAAIqd,GAAQ5qB,KAAK8lB,IAAI1Y,EAAIG,EAAMH,GAC3Byd,EAAQ7qB,KAAK8lB,IAAIzY,EAAIE,EAAMF,GAC3B+Y,EAAQpmB,KAAK8qB,KAAKF,EAAQA,EAAQC,EAAQA,IAEzB,OAAhBJ,GAA+BA,EAAPrE,IAA8BmE,EAAPnE,IAClDqE,EAAcrE,EACdoE,EAAmBnB,IAO3B,MAAOmB,IAQTzuB,EAAQyS,UAAU+a,aAAe,SAAUF,GACzC,GAAI0B,GAASC,EAAMC,CAEdlwB,MAAKsmB,SAiCR0J,EAAUhwB,KAAKsmB,QAAQ6J,IAAIH,QAC3BC,EAAQjwB,KAAKsmB,QAAQ6J,IAAIF,KACzBC,EAAQlwB,KAAKsmB,QAAQ6J,IAAID,MAlCzBF,EAAUne,SAASM,cAAc,OACjC6d,EAAQxiB,MAAMsW,SAAW,WACzBkM,EAAQxiB,MAAM0W,QAAU,OACxB8L,EAAQxiB,MAAMzB,OAAS,oBACvBikB,EAAQxiB,MAAM3C,MAAQ,UACtBmlB,EAAQxiB,MAAM1B,WAAa,wBAC3BkkB,EAAQxiB,MAAM4iB,aAAe,MAC7BJ,EAAQxiB,MAAM6iB,UAAY,qCAE1BJ,EAAOpe,SAASM,cAAc,OAC9B8d,EAAKziB,MAAMsW,SAAW,WACtBmM,EAAKziB,MAAMsF,OAAS,OACpBmd,EAAKziB,MAAMqF,MAAQ,IACnBod,EAAKziB,MAAM8iB,WAAa,oBAExBJ,EAAMre,SAASM,cAAc,OAC7B+d,EAAI1iB,MAAMsW,SAAW,WACrBoM,EAAI1iB,MAAMsF,OAAS,IACnBod,EAAI1iB,MAAMqF,MAAQ,IAClBqd,EAAI1iB,MAAMzB,OAAS,oBACnBmkB,EAAI1iB,MAAM4iB,aAAe,MAEzBpwB,KAAKsmB,SACHgI,UAAW,KACX6B,KACEH,QAASA,EACTC,KAAMA,EACNC,IAAKA,KAUXlwB,KAAKquB,eAELruB,KAAKsmB,QAAQgI,UAAYA,EAEvB0B,EAAQ7L,UADsB,kBAArBnkB,MAAKob,YACMpb,KAAKob,YAAYkT,EAAU9b,OAG3B,6BACM8b,EAAU9b,MAAMH,EAAI,gCACpBic,EAAU9b,MAAMF,EAAI,gCACpBgc,EAAU9b,MAAM4K,EAAI,qBAIhD4S,EAAQxiB,MAAMhG,KAAQ,IACtBwoB,EAAQxiB,MAAM5F,IAAQ,IACtB5H,KAAKwf,MAAMzN,YAAYie,GACvBhwB,KAAKwf,MAAMzN,YAAYke,GACvBjwB,KAAKwf,MAAMzN,YAAYme,EAGvB,IAAIK,GAAgBP,EAAQQ,YACxBC,EAAkBT,EAAQU,aAC1BC,EAAgBV,EAAKS,aACrBE,EAAcV,EAAIM,YAClBK,EAAgBX,EAAIQ,aAEpBlpB,EAAO8mB,EAAU/K,OAAOlR,EAAIke,EAAe,CAC/C/oB,GAAOvC,KAAKwG,IAAIxG,KAAKiI,IAAI1F,EAAM,IAAKxH,KAAKwf,MAAME,YAAc,GAAK6Q,GAElEN,EAAKziB,MAAMhG,KAAS8mB,EAAU/K,OAAOlR,EAAI,KACzC4d,EAAKziB,MAAM5F,IAAU0mB,EAAU/K,OAAOjR,EAAIqe,EAAc,KACxDX,EAAQxiB,MAAMhG,KAAQA,EAAO,KAC7BwoB,EAAQxiB,MAAM5F,IAAS0mB,EAAU/K,OAAOjR,EAAIqe,EAAaF,EAAiB,KAC1EP,EAAI1iB,MAAMhG,KAAW8mB,EAAU/K,OAAOlR,EAAIue,EAAW,EAAK,KAC1DV,EAAI1iB,MAAM5F,IAAW0mB,EAAU/K,OAAOjR,EAAIue,EAAY,EAAK,MAO7D7vB,EAAQyS,UAAU4a,aAAe,WAC/B,GAAIruB,KAAKsmB,QAAS,CAChBtmB,KAAKsmB,QAAQgI,UAAY,IAEzB,KAAK,GAAI1oB,KAAQ5F,MAAKsmB,QAAQ6J,IAC5B,GAAInwB,KAAKsmB,QAAQ6J,IAAItqB,eAAeD,GAAO,CACzC,GAAI0B,GAAOtH,KAAKsmB,QAAQ6J,IAAIvqB,EACxB0B,IAAQA,EAAKwC,YACfxC,EAAKwC,WAAW2H,YAAYnK,MAetCylB,UAAY,SAASvjB,GACnB,MAAI,WAAaA,GAAcA,EAAMsnB,QAC9BtnB,EAAMunB,cAAc,IAAMvnB,EAAMunB,cAAc,GAAGD,SAAW,GAQrE7D,UAAY,SAASzjB,GACnB,MAAI,WAAaA,GAAcA,EAAMwnB,QAC9BxnB,EAAMunB,cAAc,IAAMvnB,EAAMunB,cAAc,GAAGC,SAAW,GAGrEnxB,EAAOD,QAAUoB,GAKb,SAASnB,EAAQD,EAASM,GAE9B,GAAImB,GAAUnB,EAAoB,GAYlCgB,QAAS,WACPlB,KAAKixB,YAAc,GAAI5vB,GACvBrB,KAAKkxB,eACLlxB,KAAKkxB,YAAYxL,WAAa,EAC9B1lB,KAAKkxB,YAAYvL,SAAW,EAC5B3lB,KAAKmxB,UAAY,IAEjBnxB,KAAKoxB,eAAiB,GAAI/vB,GAC1BrB,KAAKqxB,eAAkB,GAAIhwB,GAAQ,GAAI4D,KAAK6mB,GAAI,EAAG,GAEnD9rB,KAAKsxB,8BASPpwB,OAAOuS,UAAU+J,eAAiB,SAASnL,EAAGC,EAAG8K,GAC/Cpd,KAAKixB,YAAY5e,EAAIA,EACrBrS,KAAKixB,YAAY3e,EAAIA,EACrBtS,KAAKixB,YAAY7T,EAAIA,EAErBpd,KAAKsxB,8BAWPpwB,OAAOuS,UAAUmS,eAAiB,SAASF,EAAYC,GAClCpf,SAAfmf,IACF1lB,KAAKkxB,YAAYxL,WAAaA,GAGfnf,SAAbof,IACF3lB,KAAKkxB,YAAYvL,SAAWA,EACxB3lB,KAAKkxB,YAAYvL,SAAW,IAAG3lB,KAAKkxB,YAAYvL,SAAW,GAC3D3lB,KAAKkxB,YAAYvL,SAAW,GAAI1gB,KAAK6mB,KAAI9rB,KAAKkxB,YAAYvL,SAAW,GAAI1gB,KAAK6mB,MAGjEvlB,SAAfmf,GAAyCnf,SAAbof,IAC9B3lB,KAAKsxB,8BAQTpwB,OAAOuS,UAAUuS,eAAiB,WAChC,GAAIuL,KAIJ,OAHAA,GAAI7L,WAAa1lB,KAAKkxB,YAAYxL,WAClC6L,EAAI5L,SAAW3lB,KAAKkxB,YAAYvL,SAEzB4L,GAOTrwB,OAAOuS,UAAUqS,aAAe,SAASpgB,GACxBa,SAAXb,IAGJ1F,KAAKmxB,UAAYzrB,EAKb1F,KAAKmxB,UAAY,MAAMnxB,KAAKmxB,UAAY,KACxCnxB,KAAKmxB,UAAY,IAAKnxB,KAAKmxB,UAAY,GAE3CnxB,KAAKsxB,+BAOPpwB,OAAOuS,UAAU6L,aAAe,WAC9B,MAAOtf,MAAKmxB,WAOdjwB,OAAOuS,UAAUyK,kBAAoB,WACnC,MAAOle,MAAKoxB,gBAOdlwB,OAAOuS,UAAU8K,kBAAoB,WACnC,MAAOve,MAAKqxB,gBAOdnwB,OAAOuS,UAAU6d,2BAA6B,WAE5CtxB,KAAKoxB,eAAe/e,EAAIrS,KAAKixB,YAAY5e,EAAIrS,KAAKmxB,UAAYlsB,KAAKqZ,IAAIte,KAAKkxB,YAAYxL,YAAczgB,KAAKwZ,IAAIze,KAAKkxB,YAAYvL,UAChI3lB,KAAKoxB,eAAe9e,EAAItS,KAAKixB,YAAY3e,EAAItS,KAAKmxB,UAAYlsB,KAAKwZ,IAAIze,KAAKkxB,YAAYxL,YAAczgB,KAAKwZ,IAAIze,KAAKkxB,YAAYvL,UAChI3lB,KAAKoxB,eAAehU,EAAIpd,KAAKixB,YAAY7T,EAAIpd,KAAKmxB,UAAYlsB,KAAKqZ,IAAIte,KAAKkxB,YAAYvL,UAGxF3lB,KAAKqxB,eAAehf,EAAIpN,KAAK6mB,GAAG,EAAI9rB,KAAKkxB,YAAYvL,SACrD3lB,KAAKqxB,eAAe/e,EAAI,EACxBtS,KAAKqxB,eAAejU,GAAKpd,KAAKkxB,YAAYxL,YAG5C7lB,EAAOD,QAAUsB,QAIb,SAASrB,EAAQD,EAASM,GAW9B,QAASiB,GAAQ6R,EAAMiO,EAAQuQ,GAC7BxxB,KAAKgT,KAAOA,EACZhT,KAAKihB,OAASA,EACdjhB,KAAKwxB,MAAQA,EAEbxxB,KAAKqI,MAAQ9B,OACbvG,KAAKoH,MAAQb,OAGbvG,KAAKqX,OAASma,EAAMtQ,kBAAkBlO,EAAKwC,MAAOxV,KAAKihB,QAGvDjhB,KAAKqX,OAAOZ,KAAK,SAAUnR,EAAGa,GAC5B,MAAOb,GAAIa,EAAI,EAAQA,EAAJb,EAAQ,GAAK,IAG9BtF,KAAKqX,OAAO3R,OAAS,GACvB1F,KAAKipB,YAAY,GAInBjpB,KAAK0b,cAEL1b,KAAKM,QAAS,EACdN,KAAKyxB,eAAiBlrB,OAElBirB,EAAMjW,kBACRvb,KAAKM,QAAS,EACdN,KAAK0xB,oBAGL1xB,KAAKM,QAAS,EAxClB,GAAIQ,GAAWZ,EAAoB,EAiDnCiB,GAAOsS,UAAUke,SAAW,WAC1B,MAAO3xB,MAAKM,QAQda,EAAOsS,UAAUme,kBAAoB,WAInC,IAHA,GAAIpsB,GAAMxF,KAAKqX,OAAO3R,OAElBH,EAAI,EACDvF,KAAK0b,WAAWnW,IACrBA,GAGF,OAAON,MAAK8oB,MAAMxoB,EAAIC,EAAM,MAQ9BrE,EAAOsS,UAAU2V,SAAW,WAC1B,MAAOppB,MAAKwxB,MAAM7W,aAQpBxZ,EAAOsS,UAAUoe,UAAY,WAC3B,MAAO7xB,MAAKihB;EAOd9f,EAAOsS,UAAU4V,iBAAmB,WAClC,MAAmB9iB,UAAfvG,KAAKqI,MACA9B,OAEFvG,KAAKqX,OAAOrX,KAAKqI,QAO1BlH,EAAOsS,UAAUqe,UAAY,WAC3B,MAAO9xB,MAAKqX,QAQdlW,EAAOsS,UAAUyB,SAAW,SAAS7M,GACnC,GAAIA,GAASrI,KAAKqX,OAAO3R,OACvB,KAAM,2BAER,OAAO1F,MAAKqX,OAAOhP,IASrBlH,EAAOsS,UAAUuP,eAAiB,SAAS3a,GAIzC,GAHc9B,SAAV8B,IACFA,EAAQrI,KAAKqI,OAED9B,SAAV8B,EACF,QAEF,IAAIqT,EACJ,IAAI1b,KAAK0b,WAAWrT,GAClBqT,EAAa1b,KAAK0b,WAAWrT,OAE1B,CACH,GAAIoE,KACJA,GAAEwU,OAASjhB,KAAKihB,OAChBxU,EAAErF,MAAQpH,KAAKqX,OAAOhP,EAEtB,IAAI0pB,GAAW,GAAIjxB,GAASd,KAAKgT,MAAMiB,OAAQ,SAAUtE,GAAO,MAAQA,GAAKlD,EAAEwU,SAAWxU,EAAErF,SAAWoO,KACvGkG,GAAa1b,KAAKwxB,MAAMxO,eAAe+O,GAEvC/xB,KAAK0b,WAAWrT,GAASqT,EAG3B,MAAOA,IAQTva,EAAOsS,UAAUiO,kBAAoB,SAASlZ,GAC5CxI,KAAKyxB,eAAiBjpB,GASxBrH,EAAOsS,UAAUwV,YAAc,SAAS5gB,GACtC,GAAIA,GAASrI,KAAKqX,OAAO3R,OACvB,KAAM,2BAER1F,MAAKqI,MAAQA,EACbrI,KAAKoH,MAAQpH,KAAKqX,OAAOhP,IAO3BlH,EAAOsS,UAAUie,iBAAmB,SAASrpB,GAC7B9B,SAAV8B,IACFA,EAAQ,EAEV,IAAImX,GAAQxf,KAAKwxB,MAAMhS,KAEvB,IAAInX,EAAQrI,KAAKqX,OAAO3R,OAAQ,CAC9B,CAAqB1F,KAAKgjB,eAAe3a,GAIlB9B,SAAnBiZ,EAAMwS,WACRxS,EAAMwS,SAAWngB,SAASM,cAAc,OACxCqN,EAAMwS,SAASxkB,MAAMsW,SAAW,WAChCtE,EAAMwS,SAASxkB,MAAM3C,MAAQ,OAC7B2U,EAAMzN,YAAYyN,EAAMwS,UAE1B,IAAIA,GAAWhyB,KAAK4xB,mBACpBpS,GAAMwS,SAAS7N,UAAY,wBAA0B6N,EAAW,IAEhExS,EAAMwS,SAASxkB,MAAMgW,OAAS,OAC9BhE,EAAMwS,SAASxkB,MAAMhG,KAAO,MAE5B,IAAIiN,GAAKzU,IACT6Z,YAAW,WAAYpF,EAAGid,iBAAiBrpB,EAAM,IAAM,IACvDrI,KAAKM,QAAS,MAGdN,MAAKM,QAAS,EAGSiG,SAAnBiZ,EAAMwS,WACRxS,EAAM/N,YAAY+N,EAAMwS,UACxBxS,EAAMwS,SAAWzrB,QAGfvG,KAAKyxB,gBACPzxB,KAAKyxB,kBAIX5xB,EAAOD,QAAUuB,GAKb,SAAStB,GAObuB,QAAU,SAAUiR,EAAGC,GACrBtS,KAAKqS,EAAU9L,SAAN8L,EAAkBA,EAAI,EAC/BrS,KAAKsS,EAAU/L,SAAN+L,EAAkBA,EAAI,GAGjCzS,EAAOD,QAAUwB,SAKb,SAASvB,GAQb,QAASwB,GAAQgR,EAAGC,EAAG8K,GACrBpd,KAAKqS,EAAU9L,SAAN8L,EAAkBA,EAAI,EAC/BrS,KAAKsS,EAAU/L,SAAN+L,EAAkBA,EAAI,EAC/BtS,KAAKod,EAAU7W,SAAN6W,EAAkBA,EAAI,EASjC/b,EAAQmqB,SAAW,SAASlmB,EAAGa,GAC7B,GAAI8rB,GAAM,GAAI5wB,EAId,OAHA4wB,GAAI5f,EAAI/M,EAAE+M,EAAIlM,EAAEkM,EAChB4f,EAAI3f,EAAIhN,EAAEgN,EAAInM,EAAEmM,EAChB2f,EAAI7U,EAAI9X,EAAE8X,EAAIjX,EAAEiX,EACT6U,GAST5wB,EAAQkS,IAAM,SAASjO,EAAGa,GACxB,GAAI+rB,GAAM,GAAI7wB,EAId,OAHA6wB,GAAI7f,EAAI/M,EAAE+M,EAAIlM,EAAEkM,EAChB6f,EAAI5f,EAAIhN,EAAEgN,EAAInM,EAAEmM,EAChB4f,EAAI9U,EAAI9X,EAAE8X,EAAIjX,EAAEiX,EACT8U,GAST7wB,EAAQirB,IAAM,SAAShnB,EAAGa,GACxB,MAAO,IAAI9E,IACFiE,EAAE+M,EAAIlM,EAAEkM,GAAK,GACb/M,EAAEgN,EAAInM,EAAEmM,GAAK,GACbhN,EAAE8X,EAAIjX,EAAEiX,GAAK,IAWxB/b,EAAQsqB,aAAe,SAASrmB,EAAGa,GACjC,GAAIulB,GAAe,GAAIrqB,EAMvB,OAJAqqB,GAAarZ,EAAI/M,EAAEgN,EAAInM,EAAEiX,EAAI9X,EAAE8X,EAAIjX,EAAEmM,EACrCoZ,EAAapZ,EAAIhN,EAAE8X,EAAIjX,EAAEkM,EAAI/M,EAAE+M,EAAIlM,EAAEiX,EACrCsO,EAAatO,EAAI9X,EAAE+M,EAAIlM,EAAEmM,EAAIhN,EAAEgN,EAAInM,EAAEkM,EAE9BqZ,GAQTrqB,EAAQoS,UAAU/N,OAAS,WACzB,MAAOT,MAAK8qB,KACJ/vB,KAAKqS,EAAIrS,KAAKqS,EACdrS,KAAKsS,EAAItS,KAAKsS,EACdtS,KAAKod,EAAIpd,KAAKod,IAIxBvd,EAAOD,QAAUyB,GAKb,SAASxB,EAAQD,EAASM,GAa9B,QAASoB,GAAOwY,EAAW/K,GACzB,GAAkBxI,SAAduT,EACF,KAAM,qCAKR,IAHA9Z,KAAK8Z,UAAYA,EACjB9Z,KAAK4oB,QAAW7Z,GAA8BxI,QAAnBwI,EAAQ6Z,QAAwB7Z,EAAQ6Z,SAAU,EAEzE5oB,KAAK4oB,QAAS,CAChB5oB,KAAKwf,MAAQ3N,SAASM,cAAc,OAEpCnS,KAAKwf,MAAMhS,MAAMqF,MAAQ,OACzB7S,KAAKwf,MAAMhS,MAAMsW,SAAW,WAC5B9jB,KAAK8Z,UAAU/H,YAAY/R,KAAKwf,OAEhCxf,KAAKwf,MAAM2S,KAAOtgB,SAASM,cAAc,SACzCnS,KAAKwf,MAAM2S,KAAKtrB,KAAO,SACvB7G,KAAKwf,MAAM2S,KAAK/qB,MAAQ,OACxBpH,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAM2S,MAElCnyB,KAAKwf,MAAM0F,KAAOrT,SAASM,cAAc,SACzCnS,KAAKwf,MAAM0F,KAAKre,KAAO,SACvB7G,KAAKwf,MAAM0F,KAAK9d,MAAQ,OACxBpH,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAM0F,MAElCllB,KAAKwf,MAAM+I,KAAO1W,SAASM,cAAc,SACzCnS,KAAKwf,MAAM+I,KAAK1hB,KAAO,SACvB7G,KAAKwf,MAAM+I,KAAKnhB,MAAQ,OACxBpH,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAM+I,MAElCvoB,KAAKwf,MAAM4S,IAAMvgB,SAASM,cAAc,SACxCnS,KAAKwf,MAAM4S,IAAIvrB,KAAO,SACtB7G,KAAKwf,MAAM4S,IAAI5kB,MAAMsW,SAAW,WAChC9jB,KAAKwf,MAAM4S,IAAI5kB,MAAMzB,OAAS,gBAC9B/L,KAAKwf,MAAM4S,IAAI5kB,MAAMqF,MAAQ,QAC7B7S,KAAKwf,MAAM4S,IAAI5kB,MAAMsF,OAAS,MAC9B9S,KAAKwf,MAAM4S,IAAI5kB,MAAM4iB,aAAe,MACpCpwB,KAAKwf,MAAM4S,IAAI5kB,MAAM6kB,gBAAkB,MACvCryB,KAAKwf,MAAM4S,IAAI5kB,MAAMzB,OAAS,oBAC9B/L,KAAKwf,MAAM4S,IAAI5kB,MAAMqS,gBAAkB,UACvC7f,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAM4S,KAElCpyB,KAAKwf,MAAM8S,MAAQzgB,SAASM,cAAc,SAC1CnS,KAAKwf,MAAM8S,MAAMzrB,KAAO,SACxB7G,KAAKwf,MAAM8S,MAAM9kB,MAAMyM,OAAS,MAChCja,KAAKwf,MAAM8S,MAAMlrB,MAAQ,IACzBpH,KAAKwf,MAAM8S,MAAM9kB,MAAMsW,SAAW,WAClC9jB,KAAKwf,MAAM8S,MAAM9kB,MAAMhG,KAAO,SAC9BxH,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAM8S,MAGlC,IAAI7d,GAAKzU,IACTA,MAAKwf,MAAM8S,MAAMlO,YAAc,SAAU5a,GAAQiL,EAAG4P,aAAa7a,IACjExJ,KAAKwf,MAAM2S,KAAKI,QAAU,SAAU/oB,GAAQiL,EAAG0d,KAAK3oB,IACpDxJ,KAAKwf,MAAM0F,KAAKqN,QAAU,SAAU/oB,GAAQiL,EAAG+d,WAAWhpB,IAC1DxJ,KAAKwf,MAAM+I,KAAKgK,QAAU,SAAU/oB,GAAQiL,EAAG8T,KAAK/e,IAGtDxJ,KAAKyyB,iBAAmBlsB,OAExBvG,KAAKqX,UACLrX,KAAKqI,MAAQ9B,OAEbvG,KAAK0yB,YAAcnsB,OACnBvG,KAAK2yB,aAAe,IACpB3yB,KAAK4yB,UAAW,EA3ElB,GAAIjyB,GAAOT,EAAoB,EAiF/BoB,GAAOmS,UAAU0e,KAAO,WACtB,GAAI9pB,GAAQrI,KAAKgpB,UACb3gB,GAAQ,IACVA,IACArI,KAAK6yB,SAASxqB,KAOlB/G,EAAOmS,UAAU8U,KAAO,WACtB,GAAIlgB,GAAQrI,KAAKgpB,UACb3gB,GAAQrI,KAAKqX,OAAO3R,OAAS,IAC/B2C,IACArI,KAAK6yB,SAASxqB,KAOlB/G,EAAOmS,UAAUqf,SAAW,WAC1B,GAAI5iB,GAAQ,GAAI7L,MAEZgE,EAAQrI,KAAKgpB,UACb3gB,GAAQrI,KAAKqX,OAAO3R,OAAS,GAC/B2C,IACArI,KAAK6yB,SAASxqB,IAEPrI,KAAK4yB,WAEZvqB,EAAQ,EACRrI,KAAK6yB,SAASxqB,GAGhB,IAAI8H,GAAM,GAAI9L,MACVmoB,EAAQrc,EAAMD,EAId6iB,EAAW9tB,KAAKiI,IAAIlN,KAAK2yB,aAAenG,EAAM,GAG9C/X,EAAKzU,IACTA,MAAK0yB,YAAc7Y,WAAW,WAAYpF,EAAGqe,YAAcC,IAM7DzxB,EAAOmS,UAAU+e,WAAa,WACHjsB,SAArBvG,KAAK0yB,YACP1yB,KAAKklB,OAELllB,KAAKolB,QAOT9jB,EAAOmS,UAAUyR,KAAO,WAElBllB,KAAK0yB,cAET1yB,KAAK8yB,WAED9yB,KAAKwf,QACPxf,KAAKwf,MAAM0F,KAAK9d,MAAQ,UAO5B9F,EAAOmS,UAAU2R,KAAO,WACtB4N,cAAchzB,KAAK0yB,aACnB1yB,KAAK0yB,YAAcnsB,OAEfvG,KAAKwf,QACPxf,KAAKwf,MAAM0F,KAAK9d,MAAQ,SAQ5B9F,EAAOmS,UAAUyV,oBAAsB,SAAS1gB,GAC9CxI,KAAKyyB,iBAAmBjqB,GAO1BlH,EAAOmS,UAAUqV,gBAAkB,SAASiK,GAC1C/yB,KAAK2yB,aAAeI,GAOtBzxB,EAAOmS,UAAUwf,gBAAkB,WACjC,MAAOjzB,MAAK2yB,cASdrxB,EAAOmS,UAAUyf,YAAc,SAASC,GACtCnzB,KAAK4yB,SAAWO,GAOlB7xB,EAAOmS,UAAU2f,SAAW,WACI7sB,SAA1BvG,KAAKyyB,kBACPzyB,KAAKyyB,oBAOTnxB,EAAOmS,UAAUkO,OAAS,WACxB,GAAI3hB,KAAKwf,MAAO,CAEdxf,KAAKwf,MAAM4S,IAAI5kB,MAAM5F,IAAO5H,KAAKwf,MAAMuF,aAAa,EAChD/kB,KAAKwf,MAAM4S,IAAI1B,aAAa,EAAK,KACrC1wB,KAAKwf,MAAM4S,IAAI5kB,MAAMqF,MAAS7S,KAAKwf,MAAME,YACrC1f,KAAKwf,MAAM2S,KAAKzS,YAChB1f,KAAKwf,MAAM0F,KAAKxF,YAChB1f,KAAKwf,MAAM+I,KAAK7I,YAAc,GAAO,IAGzC,IAAIlY,GAAOxH,KAAKqzB,YAAYrzB,KAAKqI,MACjCrI,MAAKwf,MAAM8S,MAAM9kB,MAAMhG,KAAO,EAAS,OAS3ClG,EAAOmS,UAAUoV,UAAY,SAASxR,GACpCrX,KAAKqX,OAASA,EAEVrX,KAAKqX,OAAO3R,OAAS,EACvB1F,KAAK6yB,SAAS,GAEd7yB,KAAKqI,MAAQ9B,QAOjBjF,EAAOmS,UAAUof,SAAW,SAASxqB,GACnC,KAAIA,EAAQrI,KAAKqX,OAAO3R,QAOtB,KAAM,2BANN1F,MAAKqI,MAAQA,EAEbrI,KAAK2hB,SACL3hB,KAAKozB,YAWT9xB,EAAOmS,UAAUuV,SAAW,WAC1B,MAAOhpB,MAAKqI,OAQd/G,EAAOmS,UAAU+B,IAAM,WACrB,MAAOxV,MAAKqX,OAAOrX,KAAKqI,QAI1B/G,EAAOmS,UAAU4Q,aAAe,SAAS7a,GAEvC,GAAIijB,GAAiBjjB,EAAMmjB,MAAyB,IAAhBnjB,EAAMmjB,MAAiC,IAAjBnjB,EAAMojB,MAChE,IAAKH,EAAL,CAEAzsB,KAAKszB,aAAe9pB,EAAMsnB,QAC1B9wB,KAAKuzB,YAAchO,WAAWvlB,KAAKwf,MAAM8S,MAAM9kB,MAAMhG,MAErDxH,KAAKwf,MAAMhS,MAAM6f,OAAS,MAK1B,IAAI5Y,GAAKzU,IACTA,MAAKstB,YAAc,SAAU9jB,GAAQiL,EAAG8Y,aAAa/jB,IACrDxJ,KAAKwtB,UAAc,SAAUhkB,GAAQiL,EAAGiY,WAAWljB,IACnD7I,EAAKkI,iBAAiBgJ,SAAU,YAAa7R,KAAKstB,aAClD3sB,EAAKkI,iBAAiBgJ,SAAU,UAAa7R,KAAKwtB,WAClD7sB,EAAK4I,eAAeC,KAItBlI,EAAOmS,UAAU+f,YAAc,SAAUhsB,GACvC,GAAIqL,GAAQ0S,WAAWvlB,KAAKwf,MAAM4S,IAAI5kB,MAAMqF,OACxC7S,KAAKwf,MAAM8S,MAAM5S,YAAc,GAC/BrN,EAAI7K,EAAO,EAEXa,EAAQpD,KAAK8oB,MAAM1b,EAAIQ,GAAS7S,KAAKqX,OAAO3R,OAAO,GAIvD,OAHY,GAAR2C,IAAWA,EAAQ,GACnBA,EAAQrI,KAAKqX,OAAO3R,OAAO,IAAG2C,EAAQrI,KAAKqX,OAAO3R,OAAO,GAEtD2C,GAGT/G,EAAOmS,UAAU4f,YAAc,SAAUhrB,GACvC,GAAIwK,GAAQ0S,WAAWvlB,KAAKwf,MAAM4S,IAAI5kB,MAAMqF,OACxC7S,KAAKwf,MAAM8S,MAAM5S,YAAc,GAE/BrN,EAAIhK,GAASrI,KAAKqX,OAAO3R,OAAO,GAAKmN,EACrCrL,EAAO6K,EAAI,CAEf,OAAO7K,IAKTlG,EAAOmS,UAAU8Z,aAAe,SAAU/jB,GACxC,GAAIgjB,GAAOhjB,EAAMsnB,QAAU9wB,KAAKszB,aAC5BjhB,EAAIrS,KAAKuzB,YAAc/G,EAEvBnkB,EAAQrI,KAAKwzB,YAAYnhB,EAE7BrS,MAAK6yB,SAASxqB,GAEd1H,EAAK4I,kBAIPjI,EAAOmS,UAAUiZ,WAAa,WAC5B1sB,KAAKwf,MAAMhS,MAAM6f,OAAS,OAG1B1sB,EAAK0I,oBAAoBwI,SAAU,YAAa7R,KAAKstB,aACrD3sB,EAAK0I,oBAAoBwI,SAAU,UAAW7R,KAAKwtB,WAEnD7sB,EAAK4I,kBAGP1J,EAAOD,QAAU0B,GAKb,SAASzB,GA2Bb,QAAS0B,GAAW2O,EAAOC,EAAKkY,EAAMmB,GAEpCxpB,KAAKyzB,OAAS,EACdzzB,KAAK0zB,KAAO,EACZ1zB,KAAK2zB,MAAQ,EACb3zB,KAAKwpB,YAAa,EAClBxpB,KAAK4zB,UAAY,EAEjB5zB,KAAK6zB,SAAW,EAChB7zB,KAAK8zB,SAAS5jB,EAAOC,EAAKkY,EAAMmB,GAYlCjoB,EAAWkS,UAAUqgB,SAAW,SAAS5jB,EAAOC,EAAKkY,EAAMmB,GACzDxpB,KAAKyzB,OAASvjB,EAAQA,EAAQ,EAC9BlQ,KAAK0zB,KAAOvjB,EAAMA,EAAM,EAExBnQ,KAAK+zB,QAAQ1L,EAAMmB,IASrBjoB,EAAWkS,UAAUsgB,QAAU,SAAS1L,EAAMmB,GAC/BjjB,SAAT8hB,GAA8B,GAARA,IAGP9hB,SAAfijB,IACFxpB,KAAKwpB,WAAaA,GAGlBxpB,KAAK2zB,MADH3zB,KAAKwpB,cAAe,EACTjoB,EAAWyyB,oBAAoB3L,GAE/BA,IAUjB9mB,EAAWyyB,oBAAsB,SAAU3L,GACzC,GAAI4L,GAAQ,SAAU5hB,GAAI,MAAOpN,MAAKivB,IAAI7hB,GAAKpN,KAAKkvB,MAGhDC,EAAQnvB,KAAKovB,IAAI,GAAIpvB,KAAK8oB,MAAMkG,EAAM5L,KACtCiM,EAAQ,EAAIrvB,KAAKovB,IAAI,GAAIpvB,KAAK8oB,MAAMkG,EAAM5L,EAAO,KACjDkM,EAAQ,EAAItvB,KAAKovB,IAAI,GAAIpvB,KAAK8oB,MAAMkG,EAAM5L,EAAO,KAGjDmB,EAAa4K,CASjB,OARInvB,MAAK8lB,IAAIuJ,EAAQjM,IAASpjB,KAAK8lB,IAAIvB,EAAanB,KAAOmB,EAAa8K,GACpErvB,KAAK8lB,IAAIwJ,EAAQlM,IAASpjB,KAAK8lB,IAAIvB,EAAanB,KAAOmB,EAAa+K,GAGtD,GAAd/K,IACFA,EAAa,GAGRA,GAOTjoB,EAAWkS,UAAU6U,WAAa,WAChC,MAAO/C,YAAWvlB,KAAK6zB,SAASW,YAAYx0B,KAAK4zB,aAOnDryB,EAAWkS,UAAUghB,QAAU,WAC7B,MAAOz0B,MAAK2zB,OAOdpyB,EAAWkS,UAAUvD,MAAQ,WAC3BlQ,KAAK6zB,SAAW7zB,KAAKyzB,OAASzzB,KAAKyzB,OAASzzB,KAAK2zB,OAMnDpyB,EAAWkS,UAAU8U,KAAO,WAC1BvoB,KAAK6zB,UAAY7zB,KAAK2zB,OAOxBpyB,EAAWkS,UAAUtD,IAAM,WACzB,MAAQnQ,MAAK6zB,SAAW7zB,KAAK0zB,MAG/B7zB,EAAOD,QAAU2B,GAKb,SAAS1B,EAAQD,EAASM,GAuB9B,QAASsB,GAAUsY,EAAW7X,EAAOyyB,EAAQ3lB,GAC3C,KAAM/O,eAAgBwB,IACpB,KAAM,IAAIuY,aAAY,mDAIxB,MAAM/T,MAAMC,QAAQyuB,IAAWA,YAAkB7zB,KAAY6zB,YAAkBpuB,QAAQ,CACrF,GAAIquB,GAAgB5lB,CACpBA,GAAU2lB,EACVA,EAASC,EAGX,GAAIlgB,GAAKzU,IACTA,MAAK40B,gBACH1kB,MAAO,KACPC,IAAO,KAEP0kB,YAAY,EAEZC,YAAa,SACbjiB,MAAO,KACPC,OAAQ,KACRiiB,UAAW,KACXC,UAAW,MAEbh1B,KAAK+O,QAAUpO,EAAK6F,cAAexG,KAAK40B,gBAGxC50B,KAAKi1B,QAAQnb,GAGb9Z,KAAKgC,cAELhC,KAAKk1B,MACH/E,IAAKnwB,KAAKmwB,IACVgF,SAAUn1B,KAAK+F,MACfqvB,SACEvhB,GAAI7T,KAAK6T,GAAGwhB,KAAKr1B,MACjBgU,IAAKhU,KAAKgU,IAAIqhB,KAAKr1B,MACnBiuB,KAAMjuB,KAAKiuB,KAAKoH,KAAKr1B,OAEvBs1B,eACA30B,MACE40B,KAAM,KACNC,SAAU/gB,EAAGghB,UAAUJ,KAAK5gB,GAC5BihB,eAAgBjhB,EAAGkhB,gBAAgBN,KAAK5gB,GACxCmhB,OAAQnhB,EAAGohB,QAAQR,KAAK5gB,GACxBqhB,aAAerhB,EAAGshB,cAAcV,KAAK5gB,KAKzCzU,KAAKg2B,MAAQ,GAAIn0B,GAAM7B,KAAKk1B,MAC5Bl1B,KAAKgC,WAAWkG,KAAKlI,KAAKg2B,OAC1Bh2B,KAAKk1B,KAAKc,MAAQh2B,KAAKg2B,MAGvBh2B,KAAKi2B,SAAW,GAAIhzB,GAASjD,KAAKk1B,MAClCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKi2B,UAC1Bj2B,KAAKk1B,KAAKv0B,KAAK40B,KAAOv1B,KAAKi2B,SAASV,KAAKF,KAAKr1B,KAAKi2B,UAGnDj2B,KAAKk2B,YAAc,GAAI1zB,GAAYxC,KAAKk1B,MACxCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKk2B,aAI1Bl2B,KAAKm2B,WAAa,GAAI1zB,GAAWzC,KAAKk1B,MACtCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKm2B,YAG1Bn2B,KAAKo2B,QAAU,GAAItzB,GAAQ9C,KAAKk1B,MAChCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKo2B,SAE1Bp2B,KAAKq2B,UAAY,KACjBr2B,KAAKs2B,WAAa,KAGdvnB,GACF/O,KAAKwT,WAAWzE,GAId2lB,GACF10B,KAAKu2B,UAAU7B,GAIbzyB,EACFjC,KAAKw2B,SAASv0B,GAGdjC,KAAK2hB,SAjHT,GAEIhhB,IAFUT,EAAoB,IACrBA,EAAoB,IACtBA,EAAoB,IAC3BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/B2B,EAAQ3B,EAAoB,IAC5Bu2B,EAAOv2B,EAAoB,IAC3B+C,EAAW/C,EAAoB,IAC/BsC,EAActC,EAAoB,IAClCuC,EAAavC,EAAoB,IACjC4C,EAAU5C,EAAoB,GA4GlCsB,GAASiS,UAAY,GAAIgjB,GAMzBj1B,EAASiS,UAAU+iB,SAAW,SAASv0B,GACrC,GAGIy0B,GAHAC,EAAiC,MAAlB32B,KAAKq2B,SAwBxB,IAhBEK,EAJGz0B,EAGIA,YAAiBpB,IAAWoB,YAAiBnB,GACvCmB,EAIA,GAAIpB,GAAQoB,GACvB4E,MACEqJ,MAAO,OACPC,IAAK,UAVI,KAgBfnQ,KAAKq2B,UAAYK,EACjB12B,KAAKo2B,SAAWp2B,KAAKo2B,QAAQI,SAASE,GAElCC,EACF,GAA0BpwB,QAAtBvG,KAAK+O,QAAQmB,OAA0C3J,QAApBvG,KAAK+O,QAAQoB,IAAkB,CACpE,GAA0B5J,QAAtBvG,KAAK+O,QAAQmB,OAA0C3J,QAApBvG,KAAK+O,QAAQoB,IAClD,GAAIymB,GAAY52B,KAAK62B,eAGvB,IAAI3mB,GAA8B3J,QAAtBvG,KAAK+O,QAAQmB,MAAqBlQ,KAAK+O,QAAQmB,MAAQ0mB,EAAU1mB,MACzEC,EAA4B5J,QAApBvG,KAAK+O,QAAQoB,IAAqBnQ,KAAK+O,QAAQoB,IAAQymB,EAAUzmB,GAE7EnQ,MAAK82B,UAAU5mB,EAAOC,GAAM4mB,SAAS,QAGrC/2B,MAAKg3B,KAAKD,SAAS,KASzBv1B,EAASiS,UAAU8iB,UAAY,SAAS7B,GAEtC,GAAIgC,EAKFA,GAJGhC,EAGIA,YAAkB7zB,IAAW6zB,YAAkB5zB,GACzC4zB,EAIA,GAAI7zB,GAAQ6zB,GAPZ,KAUf10B,KAAKs2B,WAAaI,EAClB12B,KAAKo2B,QAAQG,UAAUG,IAmBzBl1B,EAASiS,UAAUwjB,aAAe,SAASxhB,EAAK1G,GAC9C/O,KAAKo2B,SAAWp2B,KAAKo2B,QAAQa,aAAaxhB,GAEtC1G,GAAWA,EAAQmoB,OACrBl3B,KAAKk3B,MAAMzhB,EAAK1G,IAQpBvN,EAASiS,UAAU0jB,aAAe,WAChC,MAAOn3B,MAAKo2B,SAAWp2B,KAAKo2B,QAAQe,oBAetC31B,EAASiS,UAAUyjB,MAAQ,SAAS72B,EAAI0O,GACtC,GAAK/O,KAAKq2B,WAAmB9vB,QAANlG,EAAvB,CAEA,GAAIoV,GAAMzP,MAAMC,QAAQ5F,GAAMA,GAAMA,GAGhCg2B,EAAYr2B,KAAKq2B,UAAUhgB,aAAab,IAAIC,GAC9C5O,MACEqJ,MAAO,OACPC,IAAK,UAKLD,EAAQ,KACRC,EAAM,IAcV,IAbAkmB,EAAU9tB,QAAQ,SAAU6uB,GAC1B,GAAI7rB,GAAI6rB,EAASlnB,MAAMnJ,UACnByF,EAAI,OAAS4qB,GAAWA,EAASjnB,IAAIpJ,UAAYqwB,EAASlnB,MAAMnJ,WAEtD,OAAVmJ,GAAsBA,EAAJ3E,KACpB2E,EAAQ3E,IAGE,OAAR4E,GAAgB3D,EAAI2D,KACtBA,EAAM3D,KAII,OAAV0D,GAA0B,OAARC,EAAc,CAElC,GAAIT,IAAUQ,EAAQC,GAAO,EACzB4iB,EAAW9tB,KAAKiI,IAAKlN,KAAKg2B,MAAM7lB,IAAMnQ,KAAKg2B,MAAM9lB,MAAwB,KAAfC,EAAMD,IAEhE6mB,EAAWhoB,GAA+BxI,SAApBwI,EAAQgoB,QAAyBhoB,EAAQgoB,SAAU,CAC7E/2B,MAAKg2B,MAAMlC,SAASpkB,EAASqjB,EAAW,EAAGrjB,EAASqjB,EAAW,EAAGgE,MAUtEv1B,EAASiS,UAAU4jB,aAAe,WAEhC,GAAIC,GAAUt3B,KAAKq2B,UAAUhgB,aAC3B5K,EAAM,KACNyB,EAAM,IAER,IAAIoqB,EAAS,CAEX,GAAIC,GAAUD,EAAQ7rB,IAAI,QAC1BA,GAAM8rB,EAAU52B,EAAKiG,QAAQ2wB,EAAQrnB,MAAO,QAAQnJ,UAAY,IAKhE,IAAIywB,GAAeF,EAAQpqB,IAAI,QAC3BsqB,KACFtqB,EAAMvM,EAAKiG,QAAQ4wB,EAAatnB,MAAO,QAAQnJ,UAEjD,IAAI0wB,GAAaH,EAAQpqB,IAAI,MACzBuqB,KAEAvqB,EADS,MAAPA,EACIvM,EAAKiG,QAAQ6wB,EAAWtnB,IAAK,QAAQpJ,UAGrC9B,KAAKiI,IAAIA,EAAKvM,EAAKiG,QAAQ6wB,EAAWtnB,IAAK,QAAQpJ,YAK/D,OACE0E,IAAa,MAAPA,EAAe,GAAIpH,MAAKoH,GAAO,KACrCyB,IAAa,MAAPA,EAAe,GAAI7I,MAAK6I,GAAO,OAKzCrN,EAAOD,QAAU4B,GAKb,SAAS3B,EAAQD,EAASM,GAsB9B,QAASuB,GAASqY,EAAW7X,EAAOyyB,EAAQ3lB,GAE1C,KAAM/I,MAAMC,QAAQyuB,IAAWA,YAAkB7zB,KAAY6zB,YAAkBpuB,QAAQ,CACrF,GAAIquB,GAAgB5lB,CACpBA,GAAU2lB,EACVA,EAASC,EAGX,GAAIlgB,GAAKzU,IACTA,MAAK40B,gBACH1kB,MAAO,KACPC,IAAO,KAEP0kB,YAAY,EAEZC,YAAa,SACbjiB,MAAO,KACPC,OAAQ,KACRiiB,UAAW,KACXC,UAAW,MAEbh1B,KAAK+O,QAAUpO,EAAK6F,cAAexG,KAAK40B,gBAGxC50B,KAAKi1B,QAAQnb,GAGb9Z,KAAKgC,cAELhC,KAAKk1B,MACH/E,IAAKnwB,KAAKmwB,IACVgF,SAAUn1B,KAAK+F,MACfqvB,SACEvhB,GAAI7T,KAAK6T,GAAGwhB,KAAKr1B,MACjBgU,IAAKhU,KAAKgU,IAAIqhB,KAAKr1B,MACnBiuB,KAAMjuB,KAAKiuB,KAAKoH,KAAKr1B,OAEvBs1B,eACA30B,MACE40B,KAAM,KACNC,SAAU/gB,EAAGghB,UAAUJ,KAAK5gB,GAC5BihB,eAAgBjhB,EAAGkhB,gBAAgBN,KAAK5gB,GACxCmhB,OAAQnhB,EAAGohB,QAAQR,KAAK5gB,GACxBqhB,aAAerhB,EAAGshB,cAAcV,KAAK5gB,KAKzCzU,KAAKg2B,MAAQ,GAAIn0B,GAAM7B,KAAKk1B,MAC5Bl1B,KAAKgC,WAAWkG,KAAKlI,KAAKg2B,OAC1Bh2B,KAAKk1B,KAAKc,MAAQh2B,KAAKg2B,MAGvBh2B,KAAKi2B,SAAW,GAAIhzB,GAASjD,KAAKk1B,MAClCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKi2B,UAC1Bj2B,KAAKk1B,KAAKv0B,KAAK40B,KAAOv1B,KAAKi2B,SAASV,KAAKF,KAAKr1B,KAAKi2B,UAGnDj2B,KAAKk2B,YAAc,GAAI1zB,GAAYxC,KAAKk1B,MACxCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKk2B,aAI1Bl2B,KAAKm2B,WAAa,GAAI1zB,GAAWzC,KAAKk1B,MACtCl1B,KAAKgC,WAAWkG,KAAKlI,KAAKm2B,YAG1Bn2B,KAAK03B,UAAY,GAAI10B,GAAUhD,KAAKk1B,MACpCl1B,KAAKgC,WAAWkG,KAAKlI,KAAK03B,WAE1B13B,KAAKq2B,UAAY,KACjBr2B,KAAKs2B,WAAa,KAGdvnB,GACF/O,KAAKwT,WAAWzE,GAId2lB,GACF10B,KAAKu2B,UAAU7B,GAIbzyB,EACFjC,KAAKw2B,SAASv0B,GAGdjC,KAAK2hB,SA5GT,GAEIhhB,IAFUT,EAAoB,IACrBA,EAAoB,IACtBA,EAAoB,IAC3BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/B2B,EAAQ3B,EAAoB,IAC5Bu2B,EAAOv2B,EAAoB,IAC3B+C,EAAW/C,EAAoB,IAC/BsC,EAActC,EAAoB,IAClCuC,EAAavC,EAAoB,IACjC8C,EAAY9C,EAAoB,GAuGpCuB,GAAQgS,UAAY,GAAIgjB,GAMxBh1B,EAAQgS,UAAU+iB,SAAW,SAASv0B,GACpC,GAGIy0B,GAHAC,EAAiC,MAAlB32B,KAAKq2B,SAwBxB,IAhBEK,EAJGz0B,EAGIA,YAAiBpB,IAAWoB,YAAiBnB,GACvCmB,EAIA,GAAIpB,GAAQoB,GACvB4E,MACEqJ,MAAO,OACPC,IAAK,UAVI,KAgBfnQ,KAAKq2B,UAAYK,EACjB12B,KAAK03B,WAAa13B,KAAK03B,UAAUlB,SAASE,GAEtCC,EACF,GAA0BpwB,QAAtBvG,KAAK+O,QAAQmB,OAA0C3J,QAApBvG,KAAK+O,QAAQoB,IAAkB,CACpE,GAAID,GAA8B3J,QAAtBvG,KAAK+O,QAAQmB,MAAqBlQ,KAAK+O,QAAQmB,MAAQ,KAC/DC,EAA4B5J,QAApBvG,KAAK+O,QAAQoB,IAAqBnQ,KAAK+O,QAAQoB,IAAM,IAEjEnQ,MAAK82B,UAAU5mB,EAAOC,GAAM4mB,SAAS,QAGrC/2B,MAAKg3B,KAAKD,SAAS,KASzBt1B,EAAQgS,UAAU8iB,UAAY,SAAS7B,GAErC,GAAIgC,EAKFA,GAJGhC,EAGIA,YAAkB7zB,IAAW6zB,YAAkB5zB,GACzC4zB,EAIA,GAAI7zB,GAAQ6zB,GAPZ,KAUf10B,KAAKs2B,WAAaI,EAClB12B,KAAK03B,UAAUnB,UAAUG,IAS3Bj1B,EAAQgS,UAAUkkB,UAAY,SAASC,EAAS/kB,EAAOC,GAGrD,MAFevM,UAAXsM,IAAuBA,EAAS,IACrBtM,SAAXuM,IAAuBA,EAAS,IACGvM,SAAnCvG,KAAK03B,UAAUhD,OAAOkD,GACjB53B,KAAK03B,UAAUhD,OAAOkD,GAASD,UAAU9kB,EAAMC,GAG/C,qBAAwB8kB,GASnCn2B,EAAQgS,UAAUokB,eAAiB,SAASD,GAC1C,MAAuCrxB,UAAnCvG,KAAK03B,UAAUhD,OAAOkD,GAChB53B,KAAK03B,UAAUhD,OAAOkD,GAAShP,UAAkEriB,SAAtDvG,KAAK03B,UAAU3oB,QAAQ2lB,OAAOoD,WAAWF,IAA+E,GAArD53B,KAAK03B,UAAU3oB,QAAQ2lB,OAAOoD,WAAWF,KAGxJ,GAWXn2B,EAAQgS,UAAU4jB,aAAe,WAC/B,GAAI5rB,GAAM,KACNyB,EAAM,IAGV,KAAK,GAAI0qB,KAAW53B,MAAK03B,UAAUhD,OACjC,GAAI10B,KAAK03B,UAAUhD,OAAO7uB,eAAe+xB,IACO,GAA1C53B,KAAK03B,UAAUhD,OAAOkD,GAAShP,QACjC,IAAK,GAAIrjB,GAAI,EAAGA,EAAIvF,KAAK03B,UAAUhD,OAAOkD,GAASvB,UAAU3wB,OAAQH,IAAK,CACxE,GAAIoK,GAAO3P,KAAK03B,UAAUhD,OAAOkD,GAASvB,UAAU9wB,GAChD6B,EAAQzG,EAAKiG,QAAQ+I,EAAK0C,EAAG,QAAQtL,SACzC0E,GAAa,MAAPA,EAAcrE,EAAQqE,EAAMrE,EAAQA,EAAQqE,EAClDyB,EAAa,MAAPA,EAAc9F,EAAcA,EAAN8F,EAAc9F,EAAQ8F,EAM1D,OACEzB,IAAa,MAAPA,EAAe,GAAIpH,MAAKoH,GAAO,KACrCyB,IAAa,MAAPA,EAAe,GAAI7I,MAAK6I,GAAO,OAMzCrN,EAAOD,QAAU6B,GAKb,SAAS5B,EAAQD,EAASM,GAK9B,GAAI2D,GAAS3D,EAAoB,GAQjCN,GAAQm4B,qBAAuB,SAAS7C,EAAMI,GAE5C,GADAJ,EAAKI,eACDA,GACgC,GAA9BtvB,MAAMC,QAAQqvB,GAAsB,CACtC,IAAK,GAAI/vB,GAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IACtC,GAA8BgB,SAA1B+uB,EAAY/vB,GAAGyyB,OAAsB,CACvC,GAAIC,KACJA,GAAS/nB,MAAQrM,EAAOyxB,EAAY/vB,GAAG2K,OAAOjJ,SAASF,UACvDkxB,EAAS9nB,IAAMtM,EAAOyxB,EAAY/vB,GAAG4K,KAAKlJ,SAASF,UACnDmuB,EAAKI,YAAYptB,KAAK+vB,GAG1B/C,EAAKI,YAAY7e,KAAK,SAAUnR,EAAGa,GACjC,MAAOb,GAAE4K,MAAQ/J,EAAE+J,UAY3BtQ,EAAQs4B,kBAAoB,SAAUhD,EAAMI,GAC1C,GAAIA,GAAuD/uB,SAAxC2uB,EAAKC,SAASgD,gBAAgBtlB,MAAqB,CACpEjT,EAAQm4B,qBAAqB7C,EAAMI,EAQnC,KAAK,GANDplB,GAAQrM,EAAOqxB,EAAKc,MAAM9lB,OAC1BC,EAAMtM,EAAOqxB,EAAKc,MAAM7lB,KAExBioB,EAAclD,EAAKc,MAAM7lB,IAAM+kB,EAAKc,MAAM9lB,MAC1CmoB,EAAYD,EAAalD,EAAKC,SAASgD,gBAAgBtlB,MAElDtN,EAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IACtC,GAA8BgB,SAA1B+uB,EAAY/vB,GAAGyyB,OAAsB,CACvC,GAAIM,GAAYz0B,EAAOyxB,EAAY/vB,GAAG2K,OAClCqoB,EAAU10B,EAAOyxB,EAAY/vB,GAAG4K,IAEpC,IAAoB,gBAAhBmoB,EAAUE,GACZ,KAAM,IAAI50B,OAAM,qCAAuC0xB,EAAY/vB,GAAG2K,MAExE,IAAkB,gBAAdqoB,EAAQC,GACV,KAAM,IAAI50B,OAAM,mCAAqC0xB,EAAY/vB,GAAG4K,IAGtE,IAAIC,GAAWmoB,EAAUD,CACzB,IAAIloB,GAAY,EAAIioB,EAAW,CAE7B,GAAIxO,GAAS,EACT4O,EAAWtoB,EAAIuoB,OACnB,QAAQpD,EAAY/vB,GAAGyyB,QACrB,IAAK,QACCM,EAAUK,OAASJ,EAAQI,QAC7B9O,EAAS,GAEXyO,EAAUM,UAAU1oB,EAAM0oB,aAC1BN,EAAUO,KAAK3oB,EAAM2oB,QACrBP,EAAU9M,SAAS,EAAE,QAErB+M,EAAQK,UAAU1oB,EAAM0oB,aACxBL,EAAQM,KAAK3oB,EAAM2oB,QACnBN,EAAQ/M,SAAS,EAAI3B,EAAO,QAE5B4O,EAASllB,IAAI,EAAG,QAChB,MACF,KAAK,SACH,GAAIulB,GAAYP,EAAQ/L,KAAK8L,EAAU,QACnCK,EAAML,EAAUK,KAGpBL,GAAUS,KAAK7oB,EAAM6oB,QACrBT,EAAUU,MAAM9oB,EAAM8oB,SACtBV,EAAUO,KAAK3oB,EAAM2oB,QACrBN,EAAUD,EAAUI,QAGpBJ,EAAUK,IAAIA,GACdJ,EAAQI,IAAIA,GACZJ,EAAQhlB,IAAIulB,EAAU,QAEtBR,EAAU9M,SAAS,EAAE,SACrB+M,EAAQ/M,SAAS,EAAE,SAEnBiN,EAASllB,IAAI,EAAG,QAChB,MACF,KAAK,UACC+kB,EAAUU,SAAWT,EAAQS,UAC/BnP,EAAS,GAEXyO,EAAUU,MAAM9oB,EAAM8oB,SACtBV,EAAUO,KAAK3oB,EAAM2oB,QACrBP,EAAU9M,SAAS,EAAE,UAErB+M,EAAQS,MAAM9oB,EAAM8oB,SACpBT,EAAQM,KAAK3oB,EAAM2oB,QACnBN,EAAQ/M,SAAS,EAAE,UACnB+M,EAAQhlB,IAAIsW,EAAO,UAEnB4O,EAASllB,IAAI,EAAG,SAChB,MACF,KAAK,SACC+kB,EAAUO,QAAUN,EAAQM,SAC9BhP,EAAS,GAEXyO,EAAUO,KAAK3oB,EAAM2oB,QACrBP,EAAU9M,SAAS,EAAE,SACrB+M,EAAQM,KAAK3oB,EAAM2oB,QACnBN,EAAQ/M,SAAS,EAAE,SACnB+M,EAAQhlB,IAAIsW,EAAO,SAEnB4O,EAASllB,IAAI,EAAG,QAChB,MACF,SAEE,WADA0lB,SAAQ/E,IAAI,2EAA4EoB,EAAY/vB,GAAGyyB,QAG3G,KAAmBS,EAAZH,GAEL,OADApD,EAAKI,YAAYptB,MAAMgI,MAAOooB,EAAUvxB,UAAWoJ,IAAKooB,EAAQxxB,YACxDuuB,EAAY/vB,GAAGyyB,QACrB,IAAK,QACHM,EAAU/kB,IAAI,EAAG,QACjBglB,EAAQhlB,IAAI,EAAG,OACf,MACF,KAAK,SACH+kB,EAAU/kB,IAAI,EAAG,SACjBglB,EAAQhlB,IAAI,EAAG,QACf,MACF,KAAK,UACH+kB,EAAU/kB,IAAI,EAAG,UACjBglB,EAAQhlB,IAAI,EAAG,SACf,MACF,KAAK,SACH+kB,EAAU/kB,IAAI,EAAG,KACjBglB,EAAQhlB,IAAI,EAAG,IACf,MACF,SAEE,WADA0lB,SAAQ/E,IAAI,2EAA4EoB,EAAY/vB,GAAGyyB,QAI7G9C,EAAKI,YAAYptB,MAAMgI,MAAOooB,EAAUvxB,UAAWoJ,IAAKooB,EAAQxxB,aAKtEnH,EAAQs5B,iBAAiBhE,EAEzB,IAAIiE,GAAcv5B,EAAQw5B,SAASlE,EAAKc,MAAM9lB,MAAOglB,EAAKI,aACtD+D,EAAYz5B,EAAQw5B,SAASlE,EAAKc,MAAM7lB,IAAI+kB,EAAKI,aACjDgE,EAAapE,EAAKc,MAAM9lB,MACxBqpB,EAAWrE,EAAKc,MAAM7lB,GACA,IAAtBgpB,EAAYK,SAAiBF,EAAwC,GAA3BpE,EAAKc,MAAMyD,aAAuBN,EAAYb,UAAY,EAAIa,EAAYZ,QAAU,GAC1G,GAApBc,EAAUG,SAAmBD,EAAsC,GAAzBrE,EAAKc,MAAM0D,WAAuBL,EAAUf,UAAY,EAAMe,EAAUd,QAAU,IACtG,GAAtBY,EAAYK,QAAsC,GAApBH,EAAUG,SAC1CtE,EAAKc,MAAM2D,YAAYL,EAAYC,KAYzC35B,EAAQs5B,iBAAmB,SAAShE,GAGlC,IAAK,GAFDI,GAAcJ,EAAKI,YACnBsE,KACKr0B,EAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IACtC,IAAK,GAAIwmB,GAAI,EAAGA,EAAIuJ,EAAY5vB,OAAQqmB,IAClCxmB,GAAKwmB,GAA8B,GAAzBuJ,EAAYvJ,GAAGnV,QAA2C,GAAzB0e,EAAY/vB,GAAGqR,SAExD0e,EAAYvJ,GAAG7b,OAASolB,EAAY/vB,GAAG2K,OAASolB,EAAYvJ,GAAG5b,KAAOmlB,EAAY/vB,GAAG4K,IACvFmlB,EAAYvJ,GAAGnV,QAAS,EAGjB0e,EAAYvJ,GAAG7b,OAASolB,EAAY/vB,GAAG2K,OAASolB,EAAYvJ,GAAG7b,OAASolB,EAAY/vB,GAAG4K,KAC9FmlB,EAAY/vB,GAAG4K,IAAMmlB,EAAYvJ,GAAG5b,IACpCmlB,EAAYvJ,GAAGnV,QAAS,GAGjB0e,EAAYvJ,GAAG5b,KAAOmlB,EAAY/vB,GAAG2K,OAASolB,EAAYvJ,GAAG5b,KAAOmlB,EAAY/vB,GAAG4K,MAC1FmlB,EAAY/vB,GAAG2K,MAAQolB,EAAYvJ,GAAG7b,MACtColB,EAAYvJ,GAAGnV,QAAS,GAMhC,KAAK,GAAIrR,GAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IAClC+vB,EAAY/vB,GAAGqR,UAAW,GAC5BgjB,EAAU1xB,KAAKotB,EAAY/vB,GAI/B2vB,GAAKI,YAAcsE,EACnB1E,EAAKI,YAAY7e,KAAK,SAAUnR,EAAGa,GACjC,MAAOb,GAAE4K,MAAQ/J,EAAE+J,SAIvBtQ,EAAQi6B,WAAa,SAASC,GAC5B,IAAK,GAAIv0B,GAAG,EAAGA,EAAIu0B,EAAMp0B,OAAQH,IAC/B0zB,QAAQ/E,IAAI3uB,EAAG,GAAIlB,MAAKy1B,EAAMv0B,GAAG2K,OAAO,GAAI7L,MAAKy1B,EAAMv0B,GAAG4K,KAAM2pB,EAAMv0B,GAAG2K,MAAO4pB,EAAMv0B,GAAG4K,IAAK2pB,EAAMv0B,GAAGqR,SAS3GhX,EAAQm6B,oBAAsB,SAASC,EAAUC,GAG/C,IAAK,GAFDC,IAAe,EACfC,EAAeH,EAASI,QAAQrzB,UAC3BxB,EAAI,EAAGA,EAAIy0B,EAAS1E,YAAY5vB,OAAQH,IAAK,CACpD,GAAI+yB,GAAY0B,EAAS1E,YAAY/vB,GAAG2K,MACpCqoB,EAAUyB,EAAS1E,YAAY/vB,GAAG4K,GACtC,IAAIgqB,GAAgB7B,GAA4BC,EAAf4B,EAAwB,CACvDD,GAAe,CACf,QAIJ,GAAoB,GAAhBA,GAAwBC,EAAeH,EAAStG,KAAK3sB,WAAaozB,GAAgBF,EAAc,CAClG,GAAIlqB,GAAYlM,EAAOo2B,GACnBI,EAAWx2B,EAAO00B,EAElBxoB,GAAU8oB,QAAUwB,EAASxB,OAASmB,EAASM,cAAe,EACzDvqB,EAAUipB,SAAWqB,EAASrB,QAAUgB,EAASO,eAAgB,EACjExqB,EAAU6oB,aAAeyB,EAASzB,cAAcoB,EAASQ,aAAc,GAEhFR,EAASI,QAAUC,EAASpzB,WAmChCrH,EAAQ41B,SAAW,SAASiB,EAAMgE,EAAM5nB,GACtC,GAAoC,GAAhC4jB,EAAKvB,KAAKI,YAAY5vB,OAAa,CACrC,GAAIg1B,GAAajE,EAAKT,MAAM0E,WAAW7nB,EACvC,QAAQ4nB,EAAK1zB,UAAY2zB,EAAW7Q,QAAU6Q,EAAWvd,MAGzD,GAAIqc,GAAS55B,EAAQw5B,SAASqB,EAAMhE,EAAKvB,KAAKI,YACzB,IAAjBkE,EAAOA,SACTiB,EAAOjB,EAAOlB,UAGhB,IAAIloB,GAAWxQ,EAAQ+6B,yBAAyBlE,EAAKvB,KAAKI,YAAamB,EAAKT,MAAM9lB,MAAOumB,EAAKT,MAAM7lB,IACpGsqB,GAAO76B,EAAQg7B,qBAAqBnE,EAAKvB,KAAKI,YAAamB,EAAKT,MAAOyE,EAEvE,IAAIC,GAAajE,EAAKT,MAAM0E,WAAW7nB,EAAOzC,EAC9C,QAAQqqB,EAAK1zB,UAAY2zB,EAAW7Q,QAAU6Q,EAAWvd,OAa7Dvd,EAAQg2B,OAAS,SAASa,EAAMpkB,EAAGQ,GACjC,GAAoC,GAAhC4jB,EAAKvB,KAAKI,YAAY5vB,OAAa,CACrC,GAAIg1B,GAAajE,EAAKT,MAAM0E,WAAW7nB,EACvC,OAAO,IAAIxO,MAAKgO,EAAIqoB,EAAWvd,MAAQud,EAAW7Q,QAGlD,GAAIgR,GAAiBj7B,EAAQ+6B,yBAAyBlE,EAAKvB,KAAKI,YAAamB,EAAKT,MAAM9lB,MAAOumB,EAAKT,MAAM7lB,KACtG2qB,EAAgBrE,EAAKT,MAAM7lB,IAAMsmB,EAAKT,MAAM9lB,MAAQ2qB,EACpDE,EAAkBD,EAAgBzoB,EAAIQ,EACtCmoB,EAA4Bp7B,EAAQq7B,6BAA6BxE,EAAKvB,KAAKI,YAAamB,EAAKT,MAAO+E,GAEpGG,EAAU,GAAI72B,MAAK22B,EAA4BD,EAAkBtE,EAAKT,MAAM9lB,MAChF,OAAOgrB,IAYXt7B,EAAQ+6B,yBAA2B,SAASrF,EAAaplB,EAAOC,GAE9D,IAAK,GADDC,GAAW,EACN7K,EAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IAAK,CAC3C,GAAI+yB,GAAYhD,EAAY/vB,GAAG2K,MAC3BqoB,EAAUjD,EAAY/vB,GAAG4K,GAEzBmoB,IAAapoB,GAAmBC,EAAVooB,IACxBnoB,GAAYmoB,EAAUD,GAG1B,MAAOloB,IAWTxQ,EAAQg7B,qBAAuB,SAAStF,EAAaU,EAAOyE,GAG1D,MAFAA,GAAO52B,EAAO42B,GAAMxzB,SAASF,UAC7B0zB,GAAQ76B,EAAQu7B,wBAAwB7F,EAAYU,EAAMyE,IAI5D76B,EAAQu7B,wBAA0B,SAAS7F,EAAaU,EAAOyE,GAC7D,GAAIW,GAAa,CACjBX,GAAO52B,EAAO42B,GAAMxzB,SAASF,SAE7B,KAAK,GAAIxB,GAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IAAK,CAC3C,GAAI+yB,GAAYhD,EAAY/vB,GAAG2K,MAC3BqoB,EAAUjD,EAAY/vB,GAAG4K,GAEzBmoB,IAAatC,EAAM9lB,OAASqoB,EAAUvC,EAAM7lB,KAC1CsqB,GAAQlC,IACV6C,GAAe7C,EAAUD,GAI/B,MAAO8C,IAWTx7B,EAAQq7B,6BAA+B,SAAS3F,EAAaU,EAAOqF,GAKlE,IAAK,GAJDR,GAAiB,EACjBzqB,EAAW,EACXkrB,EAAgBtF,EAAM9lB,MAEjB3K,EAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IAAK,CAC3C,GAAI+yB,GAAYhD,EAAY/vB,GAAG2K,MAC3BqoB,EAAUjD,EAAY/vB,GAAG4K,GAE7B,IAAImoB,GAAatC,EAAM9lB,OAASqoB,EAAUvC,EAAM7lB,IAAK,CAGnD,GAFAC,GAAYkoB,EAAYgD,EACxBA,EAAgB/C,EACZnoB,GAAYirB,EACd,KAGAR,IAAkBtC,EAAUD,GAKlC,MAAOuC,IAaTj7B,EAAQ27B,mBAAqB,SAASjG,EAAamF,EAAMe,EAAWC,GAClE,GAAIrC,GAAWx5B,EAAQw5B,SAASqB,EAAMnF,EACtC,OAAuB,IAAnB8D,EAASI,OACK,EAAZgC,EACuB,GAArBC,EACKrC,EAASd,WAAac,EAASb,QAAUkC,GAAQ,EAGjDrB,EAASd,UAAY,EAIL,GAArBmD,EACKrC,EAASb,SAAWkC,EAAOrB,EAASd,WAAa,EAGjDc,EAASb,QAAU,EAKvBkC,GAaX76B,EAAQw5B,SAAW,SAASqB,EAAMnF,GAChC,IAAK,GAAI/vB,GAAI,EAAGA,EAAI+vB,EAAY5vB,OAAQH,IAAK,CAC3C,GAAI+yB,GAAYhD,EAAY/vB,GAAG2K,MAC3BqoB,EAAUjD,EAAY/vB,GAAG4K,GAE7B,IAAIsqB,GAAQnC,GAAoBC,EAAPkC,EACvB,OAAQjB,QAAQ,EAAMlB,UAAWA,EAAWC,QAASA,GAIzD,OAAQiB,QAAQ,EAAOlB,UAAWA,EAAWC,QAASA,KAKpD,SAAS14B,GA4Bb,QAAS+B,GAASsO,EAAOC,EAAKurB,EAAaC,EAAiBC,EAAaC,GAEvE77B,KAAKo6B,QAAU,EAEfp6B,KAAK87B,WAAY,EACjB97B,KAAK+7B,UAAY,EACjB/7B,KAAKqoB,KAAO,EACZroB,KAAKmd,MAAQ,EAEbnd,KAAKg8B,YACLh8B,KAAKi8B,UACLj8B,KAAKk8B,UAAY,EAEjBl8B,KAAKm8B,YAAc,EAAO,EAAM,EAAI,IACpCn8B,KAAKo8B,YAAc,IAAO,GAAM,EAAI,GAEpCp8B,KAAK67B,WAAaA,EAElB77B,KAAK8zB,SAAS5jB,EAAOC,EAAKurB,EAAaC,EAAiBC,GAe1Dh6B,EAAS6R,UAAUqgB,SAAW,SAAS5jB,EAAOC,EAAKurB,EAAaC,EAAiBC,GAC/E57B,KAAKyzB,OAA6BltB,SAApBq1B,EAAYnwB,IAAoByE,EAAQ0rB,EAAYnwB,IAClEzL,KAAK0zB,KAA2BntB,SAApBq1B,EAAY1uB,IAAoBiD,EAAMyrB,EAAY1uB,IAE1DlN,KAAKyzB,QAAUzzB,KAAK0zB,OACtB1zB,KAAKyzB,QAAU,IACfzzB,KAAK0zB,MAAQ,GAGO,GAAlB1zB,KAAK87B,WACP97B,KAAKq8B,eAAeX,EAAaC,GAGnC37B,KAAKs8B,SAASV,IAOhBh6B,EAAS6R,UAAU4oB,eAAiB,SAASX,EAAaC,GAExD,GAAIhpB,GAAO3S,KAAK0zB,KAAO1zB,KAAKyzB,OACxB8I,EAAkB,IAAP5pB,EACX6pB,EAAmBd,GAAea,EAAWZ,GAC7Cc,EAAmBx3B,KAAK8oB,MAAM9oB,KAAKivB,IAAIqI,GAAUt3B,KAAKkvB,MAEtDuI,EAAe,GACfC,EAAkB13B,KAAKovB,IAAI,GAAGoI,GAE9BvsB,EAAQ,CACW,GAAnBusB,IACFvsB,EAAQusB,EAIV,KAAK,GADDG,IAAgB,EACXr3B,EAAI2K,EAAOjL,KAAK8lB,IAAIxlB,IAAMN,KAAK8lB,IAAI0R,GAAmBl3B,IAAK,CAClEo3B,EAAkB13B,KAAKovB,IAAI,GAAG9uB,EAC9B,KAAK,GAAIwmB,GAAI,EAAGA,EAAI/rB,KAAKo8B,WAAW12B,OAAQqmB,IAAK,CAC/C,GAAI8Q,GAAWF,EAAkB38B,KAAKo8B,WAAWrQ,EACjD,IAAI8Q,GAAYL,EAAkB,CAChCI,GAAgB,EAChBF,EAAe3Q,CACf,QAGJ,GAAqB,GAAjB6Q,EACF,MAGJ58B,KAAK+7B,UAAYW,EACjB18B,KAAKmd,MAAQwf,EACb38B,KAAKqoB,KAAOsU,EAAkB38B,KAAKo8B,WAAWM,IAShD96B,EAAS6R,UAAU6oB,SAAW,SAASV,GACjBr1B,SAAhBq1B,IACFA,KAGF,IAAIkB,GAAgCv2B,SAApBq1B,EAAYnwB,IAAoBzL,KAAKyzB,OAAuB,EAAbzzB,KAAKmd,MAAYnd,KAAKo8B,WAAWp8B,KAAK+7B,WAAcH,EAAYnwB,IAC3HsxB,EAA8Bx2B,SAApBq1B,EAAY1uB,IAAoBlN,KAAK0zB,KAAQ1zB,KAAKmd,MAAQnd,KAAKo8B,WAAWp8B,KAAK+7B,WAAcH,EAAY1uB,GAEvHlN,MAAKi8B,UAAgC11B,SAApBq1B,EAAY1uB,IAAoBlN,KAAKg9B,aAAaD,GAAWnB,EAAY1uB,IAC1FlN,KAAKg8B,YAAkCz1B,SAApBq1B,EAAYnwB,IAAoBzL,KAAKg9B,aAAaF,GAAalB,EAAYnwB,IAGvE,GAAnBzL,KAAK67B,aAAuB77B,KAAKi8B,UAAYj8B,KAAKg8B,aAAeh8B,KAAKqoB,MAAQ,IAChFroB,KAAKi8B,WAAaj8B,KAAKi8B,UAAYj8B,KAAKqoB,MAG1CroB,KAAKk8B,UAAYl8B,KAAKg9B,aAAaD,GAAWA,EAAU/8B,KAAKg9B,aAAaF,GAAaA,EACvF98B,KAAKi9B,YAAcj9B,KAAKi8B,UAAYj8B,KAAKg8B,YAGzCh8B,KAAKo6B,QAAUp6B,KAAKi8B,WAGtBr6B,EAAS6R,UAAUupB,aAAe,SAAS51B,GACzC,GAAI81B,GAAU91B,EAASA,GAASpH,KAAKmd,MAAQnd,KAAKo8B,WAAWp8B,KAAK+7B,WAClE,OAAI30B,IAASpH,KAAKmd,MAAQnd,KAAKo8B,WAAWp8B,KAAK+7B,YAAc,GAAO/7B,KAAKmd,MAAQnd,KAAKo8B,WAAWp8B,KAAK+7B,WAC7FmB,EAAWl9B,KAAKmd,MAAQnd,KAAKo8B,WAAWp8B,KAAK+7B,WAG7CmB,GASXt7B,EAAS6R,UAAU0pB,QAAU,WAC3B,MAAQn9B,MAAKo6B,SAAWp6B,KAAKg8B,aAM/Bp6B,EAAS6R,UAAU8U,KAAO,WACxB,GAAI4J,GAAOnyB,KAAKo6B,OAChBp6B,MAAKo6B,SAAWp6B,KAAKqoB,KAGjBroB,KAAKo6B,SAAWjI,IAClBnyB,KAAKo6B,QAAUp6B,KAAK0zB,OAOxB9xB,EAAS6R,UAAU2pB,SAAW,WAC5Bp9B,KAAKo6B,SAAWp6B,KAAKqoB,KACrBroB,KAAKi8B,WAAaj8B,KAAKqoB,KACvBroB,KAAKi9B,YAAcj9B,KAAKi8B,UAAYj8B,KAAKg8B,aAS3Cp6B,EAAS6R,UAAU6U,WAAa,SAAS+U,GACvC,GAAI7I,GAAc,GAAKvwB,OAAOjE,KAAKo6B,SAAS5F,YAAY,EAExD,IAAgBjuB,SAAb82B,GAA2B54B,MAAMR,OAAOo5B,KAqCzC,GAAgC,IAA5B7I,EAAY9tB,QAAQ,MAA0C,IAA5B8tB,EAAY9tB,QAAQ,KAExD,IAAK,GAAInB,GAAIivB,EAAY9uB,OAAS,EAAGH,EAAI,EAAGA,IAAK,CAC/C,GAAsB,KAAlBivB,EAAYjvB,GAGX,CAAA,GAAsB,KAAlBivB,EAAYjvB,IAA+B,KAAlBivB,EAAYjvB,GAAW,CACvDivB,EAAcA,EAAY8I,MAAM,EAAG/3B,EACnC,OAGA,MAPAivB,EAAcA,EAAY8I,MAAM,EAAG/3B,QAzCY,CAErD,GAAIg4B,GAAM,GACNl1B,EAAQmsB,EAAY9tB,QAAQ,IAoBhC,IAnBY,IAAT2B,IAEDk1B,EAAM/I,EAAY8I,MAAMj1B,GAExBmsB,EAAcA,EAAY8I,MAAM,EAAGj1B,IAErCA,EAAQpD,KAAKiI,IAAIsnB,EAAY9tB,QAAQ,KAAM8tB,EAAY9tB,QAAQ,MAClD,KAAV2B,GAEe,IAAbg1B,IACD7I,GAAe,KAGjBnsB,EAAQmsB,EAAY9uB,OAAS23B,GAEV,IAAbA,IAENh1B,GAASg1B,EAAW,GAEnBh1B,EAAQmsB,EAAY9uB,OAErB,IAAI,GAAI83B,GAAMn1B,EAAQmsB,EAAY9uB,OAAQ83B,EAAM,EAAGA,IACjDhJ,GAAe,QAKjBA,GAAcA,EAAY8I,MAAM,EAAGj1B,EAGrCmsB,IAAe+I,EAoBjB,MAAO/I,IAWT5yB,EAAS6R,UAAU8hB,KAAO,aAS1B3zB,EAAS6R,UAAUgqB,QAAU,WAC3B,MAAQz9B,MAAKo6B,SAAWp6B,KAAKmd,MAAQnd,KAAKm8B,WAAWn8B,KAAK+7B,aAAe,GAG3El8B,EAAOD,QAAUgC,GAKb,SAAS/B,EAAQD,EAASM,GAgB9B,QAAS2B,GAAMqzB,EAAMnmB,GACnB,GAAI2uB,GAAM75B,IAAS85B,MAAM,GAAGC,QAAQ,GAAGC,QAAQ,GAAGC,aAAa,EAC/D99B,MAAKkQ,MAAQwtB,EAAIhF,QAAQnlB,IAAI,GAAI,QAAQxM,UACzC/G,KAAKmQ,IAAMutB,EAAIhF,QAAQnlB,IAAI,EAAG,QAAQxM,UAEtC/G,KAAKk1B,KAAOA,EACZl1B,KAAK+9B,gBAAkB,EACvB/9B,KAAKg+B,YAAc,EACnBh+B,KAAKy5B,cAAe,EACpBz5B,KAAK05B,YAAa,EAGlB15B,KAAK40B,gBACH1kB,MAAO,KACPC,IAAK,KACLqrB,UAAW,aACXyC,UAAU,EACVC,UAAU,EACVzyB,IAAK,KACLyB,IAAK,KACLixB,QAAS,GACTC,QAAS,UAEXp+B,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBAEpC50B,KAAK+F,OACHs4B,UAEFr+B,KAAKs+B,aAAe,KAGpBt+B,KAAKk1B,KAAKE,QAAQvhB,GAAG,YAAa7T,KAAKu+B,aAAalJ,KAAKr1B,OACzDA,KAAKk1B,KAAKE,QAAQvhB,GAAG,OAAa7T,KAAKw+B,QAAQnJ,KAAKr1B,OACpDA,KAAKk1B,KAAKE,QAAQvhB,GAAG,UAAa7T,KAAKy+B,WAAWpJ,KAAKr1B,OAGvDA,KAAKk1B,KAAKE,QAAQvhB,GAAG,OAAQ7T,KAAK0+B,QAAQrJ,KAAKr1B,OAG/CA,KAAKk1B,KAAKE,QAAQvhB,GAAG,aAAmB7T,KAAK2+B,cAActJ,KAAKr1B,OAChEA,KAAKk1B,KAAKE,QAAQvhB,GAAG,iBAAmB7T,KAAK2+B,cAActJ,KAAKr1B,OAGhEA,KAAKk1B,KAAKE,QAAQvhB,GAAG,QAAS7T,KAAK4+B,SAASvJ,KAAKr1B,OACjDA,KAAKk1B,KAAKE,QAAQvhB,GAAG,QAAS7T,KAAK6+B,SAASxJ,KAAKr1B,OAEjDA,KAAKwT,WAAWzE,GAsClB,QAAS+vB,GAAmBtD,GAC1B,GAAiB,cAAbA,GAA0C,YAAbA,EAC/B,KAAM,IAAIp1B,WAAU,sBAAwBo1B,EAAY,yCA0e5D,QAASuD,GAAYV,EAAOv1B,GAC1B,OACEuJ,EAAGgsB,EAAMW,MAAQr+B,EAAK0G,gBAAgByB,GACtCwJ,EAAG+rB,EAAMY,MAAQt+B,EAAKgH,eAAemB,IAjlBzC,GAAInI,GAAOT,EAAoB,GAC3Bg/B,EAAah/B,EAAoB,IACjC2D,EAAS3D,EAAoB,IAC7BqC,EAAYrC,EAAoB,IAChCyB,EAAWzB,EAAoB,GA2DnC2B,GAAM4R,UAAY,GAAIlR,GAkBtBV,EAAM4R,UAAUD,WAAa,SAAUzE,GACrC,GAAIA,EAAS,CAEX,GAAIP,IAAU,YAAa,MAAO,MAAO,UAAW,UAAW,WAAY,WAAY,WAAY,cACnG7N,GAAKmF,gBAAgB0I,EAAQxO,KAAK+O,QAASA,IAEvC,SAAWA,IAAW,OAASA,KAEjC/O,KAAK8zB,SAAS/kB,EAAQmB,MAAOnB,EAAQoB,OA2B3CtO,EAAM4R,UAAUqgB,SAAW,SAAS5jB,EAAOC,EAAK4mB,GAa5C,QAASxO,KACP,IAAK9T,EAAG1O,MAAMs4B,MAAMc,SAAU,CAC5B,GAAIzB,IAAM,GAAIr5B,OAAO0C,UACjB0zB,EAAOiD,EAAM0B,EACbC,EAAO5E,EAAOrqB,EACd7E,EAAK8zB,GAAmB,OAAX5L,EAAmBA,EAAS9yB,EAAKsP,cAAcwqB,EAAM6E,EAAW7L,EAAQrjB,GACrF5D,EAAK6yB,GAAiB,OAAT3L,EAAmBA,EAAS/yB,EAAKsP,cAAcwqB,EAAM8E,EAAS7L,EAAMtjB,EAErFovB,GAAU/qB,EAAGklB,YAAYpuB,EAAGiB,GAC5B7K,EAASu2B,kBAAkBzjB,EAAGygB,KAAMzgB,EAAG1F,QAAQumB,aAC/CmK,EAAaA,GAAcD,EACvBA,GACF/qB,EAAGygB,KAAKE,QAAQnH,KAAK,eAAgB/d,MAAO,GAAI7L,MAAKoQ,EAAGvE,OAAQC,IAAK,GAAI9L,MAAKoQ,EAAGtE,OAG/EkvB,EACEI,GACFhrB,EAAGygB,KAAKE,QAAQnH,KAAK,gBAAiB/d,MAAO,GAAI7L,MAAKoQ,EAAGvE,OAAQC,IAAK,GAAI9L,MAAKoQ,EAAGtE,OAMpFsE,EAAG6pB,aAAezkB,WAAW0O,EAAM,KAnC3C,GAAIkL,GAAkBltB,QAAT2J,EAAqBvP,EAAKiG,QAAQsJ,EAAO,QAAQnJ,UAAY,KACtE2sB,EAAgBntB,QAAP4J,EAAqBxP,EAAKiG,QAAQuJ,EAAK,QAAQpJ,UAAc,IAG1E,IAFA/G,KAAK0/B,mBAED3I,EAAS,CACX,GAAItiB,GAAKzU,KACLs/B,EAAYt/B,KAAKkQ,MACjBqvB,EAAUv/B,KAAKmQ,IACfC,EAA8B,gBAAZ2mB,GAAuBA,EAAU,IACnDqI,GAAW,GAAI/6B,OAAO0C,UACtB04B,GAAa,CA8BjB,OAAOlX,KAGP,GAAIiX,GAAUx/B,KAAK25B,YAAYlG,EAAQC,EAEvC,IADA/xB,EAASu2B,kBAAkBl4B,KAAKk1B,KAAMl1B,KAAK+O,QAAQumB,aAC/CkK,EAAS,CACX,GAAIprB,IAAUlE,MAAO,GAAI7L,MAAKrE,KAAKkQ,OAAQC,IAAK,GAAI9L,MAAKrE,KAAKmQ,KAC9DnQ,MAAKk1B,KAAKE,QAAQnH,KAAK,cAAe7Z,GACtCpU,KAAKk1B,KAAKE,QAAQnH,KAAK,eAAgB7Z,KAS7CvS,EAAM4R,UAAUisB,iBAAmB,WAC7B1/B,KAAKs+B,eACP1kB,aAAa5Z,KAAKs+B,cAClBt+B,KAAKs+B,aAAe,OAaxBz8B,EAAM4R,UAAUkmB,YAAc,SAASzpB,EAAOC,GAC5C,GAIIqc,GAJAmT,EAAqB,MAATzvB,EAAiBvP,EAAKiG,QAAQsJ,EAAO,QAAQnJ,UAAY/G,KAAKkQ,MAC1E0vB,EAAmB,MAAPzvB,EAAiBxP,EAAKiG,QAAQuJ,EAAK,QAAQpJ,UAAc/G,KAAKmQ,IAC1EjD,EAA2B,MAApBlN,KAAK+O,QAAQ7B,IAAevM,EAAKiG,QAAQ5G,KAAK+O,QAAQ7B,IAAK,QAAQnG,UAAY,KACtF0E,EAA2B,MAApBzL,KAAK+O,QAAQtD,IAAe9K,EAAKiG,QAAQ5G,KAAK+O,QAAQtD,IAAK,QAAQ1E,UAAY,IAI1F,IAAItC,MAAMk7B,IAA0B,OAAbA,EACrB,KAAM,IAAI/7B,OAAM,kBAAoBsM,EAAQ,IAE9C,IAAIzL,MAAMm7B,IAAsB,OAAXA,EACnB,KAAM,IAAIh8B,OAAM,gBAAkBuM,EAAM,IAyC1C,IArCawvB,EAATC,IACFA,EAASD,GAIC,OAARl0B,GACaA,EAAXk0B,IACFnT,EAAQ/gB,EAAMk0B,EACdA,GAAYnT,EACZoT,GAAUpT,EAGC,MAAPtf,GACE0yB,EAAS1yB,IACX0yB,EAAS1yB,IAOL,OAARA,GACE0yB,EAAS1yB,IACXsf,EAAQoT,EAAS1yB,EACjByyB,GAAYnT,EACZoT,GAAUpT,EAGC,MAAP/gB,GACaA,EAAXk0B,IACFA,EAAWl0B,IAOU,OAAzBzL,KAAK+O,QAAQovB,QAAkB,CACjC,GAAIA,GAAU5Y,WAAWvlB,KAAK+O,QAAQovB,QACxB,GAAVA,IACFA,EAAU,GAEcA,EAArByB,EAASD,IACP3/B,KAAKmQ,IAAMnQ,KAAKkQ,QAAWiuB,GAE9BwB,EAAW3/B,KAAKkQ,MAChB0vB,EAAS5/B,KAAKmQ,MAIdqc,EAAQ2R,GAAWyB,EAASD,GAC5BA,GAAYnT,EAAO,EACnBoT,GAAUpT,EAAO,IAMvB,GAA6B,OAAzBxsB,KAAK+O,QAAQqvB,QAAkB,CACjC,GAAIA,GAAU7Y,WAAWvlB,KAAK+O,QAAQqvB,QACxB,GAAVA,IACFA,EAAU,GAEPwB,EAASD,EAAYvB,IACnBp+B,KAAKmQ,IAAMnQ,KAAKkQ,QAAWkuB,GAE9BuB,EAAW3/B,KAAKkQ,MAChB0vB,EAAS5/B,KAAKmQ,MAIdqc,EAASoT,EAASD,EAAYvB,EAC9BuB,GAAYnT,EAAO,EACnBoT,GAAUpT,EAAO,IAKvB,GAAIgT,GAAWx/B,KAAKkQ,OAASyvB,GAAY3/B,KAAKmQ,KAAOyvB,CAUrD,OAPOD,IAAY3/B,KAAKkQ,OAASyvB,GAAc3/B,KAAKmQ,KAASyvB,GAAY5/B,KAAKkQ,OAAS0vB,GAAY5/B,KAAKmQ,KACjGnQ,KAAKkQ,OAASyvB,GAAY3/B,KAAKkQ,OAAS0vB,GAAc5/B,KAAKmQ,KAAOwvB,GAAc3/B,KAAKmQ,KAAOyvB,GACjG5/B,KAAKk1B,KAAKE,QAAQnH,KAAK,oBAGzBjuB,KAAKkQ,MAAQyvB,EACb3/B,KAAKmQ,IAAMyvB,EACJJ,GAOT39B,EAAM4R,UAAUosB,SAAW,WACzB,OACE3vB,MAAOlQ,KAAKkQ,MACZC,IAAKnQ,KAAKmQ,MAUdtO,EAAM4R,UAAUinB,WAAa,SAAU7nB,EAAOitB,GAC5C,MAAOj+B,GAAM64B,WAAW16B,KAAKkQ,MAAOlQ,KAAKmQ,IAAK0C,EAAOitB,IAWvDj+B,EAAM64B,WAAa,SAAUxqB,EAAOC,EAAK0C,EAAOitB,GAI9C,MAHoBv5B,UAAhBu5B,IACFA,EAAc,GAEH,GAATjtB,GAAe1C,EAAMD,GAAS,GAE9B2Z,OAAQ3Z,EACRiN,MAAOtK,GAAS1C,EAAMD,EAAQ4vB,KAK9BjW,OAAQ,EACR1M,MAAO,IAUbtb,EAAM4R,UAAU8qB,aAAe,WAC7Bv+B,KAAK+9B,gBAAkB,EACvB/9B,KAAK+/B,cAAgB,EAEhB//B,KAAK+O,QAAQkvB,UAIbj+B,KAAK+F,MAAMs4B,MAAM2B,gBAEtBhgC,KAAK+F,MAAMs4B,MAAMnuB,MAAQlQ,KAAKkQ,MAC9BlQ,KAAK+F,MAAMs4B,MAAMluB,IAAMnQ,KAAKmQ,IAC5BnQ,KAAK+F,MAAMs4B,MAAMc,UAAW,EAExBn/B,KAAKk1B,KAAK/E,IAAIzwB,OAChBM,KAAKk1B,KAAK/E,IAAIzwB,KAAK8N,MAAM6f,OAAS,UAStCxrB,EAAM4R,UAAU+qB,QAAU,SAAUh1B,GAElC,GAAKxJ,KAAK+O,QAAQkvB,UAGbj+B,KAAK+F,MAAMs4B,MAAM2B,cAAtB,CAEA,GAAIxE,GAAYx7B,KAAK+O,QAAQysB,SAC7BsD,GAAkBtD,EAElB,IAAI3M,GAAsB,cAAb2M,EAA6BhyB,EAAMy2B,QAAQC,OAAS12B,EAAMy2B,QAAQE,MAC/EtR,IAAS7uB,KAAK+9B,eACd,IAAIhL,GAAY/yB,KAAK+F,MAAMs4B,MAAMluB,IAAMnQ,KAAK+F,MAAMs4B,MAAMnuB,MAGpDE,EAAWzO,EAASg5B,yBAAyB36B,KAAKk1B,KAAKI,YAAat1B,KAAKkQ,MAAOlQ,KAAKmQ,IACzF4iB,IAAY3iB,CAEZ,IAAIyC,GAAsB,cAAb2oB,EAA6Bx7B,KAAKk1B,KAAKC,SAAS9I,OAAOxZ,MAAQ7S,KAAKk1B,KAAKC,SAAS9I,OAAOvZ,OAClGstB,GAAavR,EAAQhc,EAAQkgB,EAC7B4M,EAAW3/B,KAAK+F,MAAMs4B,MAAMnuB,MAAQkwB,EACpCR,EAAS5/B,KAAK+F,MAAMs4B,MAAMluB,IAAMiwB,EAIhCC,EAAY1+B,EAAS45B,mBAAmBv7B,KAAKk1B,KAAKI,YAAaqK,EAAU3/B,KAAK+/B,cAAclR,GAAO,GACnGyR,EAAU3+B,EAAS45B,mBAAmBv7B,KAAKk1B,KAAKI,YAAasK,EAAQ5/B,KAAK+/B,cAAclR,GAAO,EACnG,IAAIwR,GAAaV,GAAYW,GAAWV,EAKtC,MAJA5/B,MAAK+9B,iBAAmBlP,EACxB7uB,KAAK+F,MAAMs4B,MAAMnuB,MAAQmwB,EACzBrgC,KAAK+F,MAAMs4B,MAAMluB,IAAMmwB,MACvBtgC,MAAKw+B,QAAQh1B,EAIfxJ,MAAK+/B,cAAgBlR,EACrB7uB,KAAK25B,YAAYgG,EAAUC,GAG3B5/B,KAAKk1B,KAAKE,QAAQnH,KAAK,eACrB/d,MAAO,GAAI7L,MAAKrE,KAAKkQ,OACrBC,IAAO,GAAI9L,MAAKrE,KAAKmQ,SASzBtO,EAAM4R,UAAUgrB,WAAa,WAEtBz+B,KAAK+O,QAAQkvB,UAIbj+B,KAAK+F,MAAMs4B,MAAM2B,gBAEtBhgC,KAAK+F,MAAMs4B,MAAMc,UAAW,EACxBn/B,KAAKk1B,KAAK/E,IAAIzwB,OAChBM,KAAKk1B,KAAK/E,IAAIzwB,KAAK8N,MAAM6f,OAAS,QAIpCrtB,KAAKk1B,KAAKE,QAAQnH,KAAK,gBACrB/d,MAAO,GAAI7L,MAAKrE,KAAKkQ,OACrBC,IAAO,GAAI9L,MAAKrE,KAAKmQ,SAUzBtO,EAAM4R,UAAUkrB,cAAgB,SAASn1B,GAEvC,GAAMxJ,KAAK+O,QAAQmvB,UAAYl+B,KAAK+O,QAAQkvB,SAA5C,CAGA,GAAIpP,GAAQ,CAYZ,IAXIrlB,EAAMslB,WACRD,EAAQrlB,EAAMslB,WAAa,IAClBtlB,EAAMulB,SAGfF,GAASrlB,EAAMulB,OAAS,GAMtBF,EAAO,CAKT,GAAI1R,EAEFA,GADU,EAAR0R,EACM,EAAKA,EAAQ,EAGb,GAAK,EAAKA,EAAQ,EAI5B,IAAIoR,GAAUf,EAAWqB,YAAYvgC,KAAMwJ,GACvCg3B,EAAUzB,EAAWkB,EAAQ5T,OAAQrsB,KAAKk1B,KAAK/E,IAAI9D,QACnDoU,EAAczgC,KAAK0gC,eAAeF,EAEtCxgC,MAAK2gC,KAAKxjB,EAAOsjB,EAAa5R,GAKhCrlB,EAAMD,mBAOR1H,EAAM4R,UAAUmrB,SAAW,WACzB5+B,KAAK+F,MAAMs4B,MAAMnuB,MAAQlQ,KAAKkQ,MAC9BlQ,KAAK+F,MAAMs4B,MAAMluB,IAAMnQ,KAAKmQ,IAC5BnQ,KAAK+F,MAAMs4B,MAAM2B,eAAgB,EACjChgC,KAAK+F,MAAMs4B,MAAMhS,OAAS,KAC1BrsB,KAAKg+B,YAAc,EACnBh+B,KAAK+9B,gBAAkB,GAOzBl8B,EAAM4R,UAAUirB,QAAU,WACxB1+B,KAAK+F,MAAMs4B,MAAM2B,eAAgB,GAQnCn+B,EAAM4R,UAAUorB,SAAW,SAAUr1B,GAEnC,GAAMxJ,KAAK+O,QAAQmvB,UAAYl+B,KAAK+O,QAAQkvB,WAE5Cj+B,KAAK+F,MAAMs4B,MAAM2B,eAAgB,EAE7Bx2B,EAAMy2B,QAAQW,QAAQl7B,OAAS,GAAG,CAC/B1F,KAAK+F,MAAMs4B,MAAMhS,SACpBrsB,KAAK+F,MAAMs4B,MAAMhS,OAAS0S,EAAWv1B,EAAMy2B,QAAQ5T,OAAQrsB,KAAKk1B,KAAK/E,IAAI9D,QAG3E,IAAIlP,GAAQ,GAAK3T,EAAMy2B,QAAQ9iB,MAAQnd,KAAKg+B,aACxC3R,EAASrsB,KAAK0gC,eAAe1gC,KAAK+F,MAAMs4B,MAAMhS,QAE9CwO,EAAiBl5B,EAASg5B,yBAAyB36B,KAAKk1B,KAAKI,YAAat1B,KAAKkQ,MAAOlQ,KAAKmQ,KAC3F0wB,EAAuBl/B,EAASw5B,wBAAwBn7B,KAAKk1B,KAAKI,YAAat1B,KAAMqsB,GACrFyU,EAAsBjG,EAAiBgG,EAGvClB,EAAYtT,EAAOwU,GAAyB7gC,KAAKkQ,OAASmc,EAAOwU,IAAyB1jB,EAC1FyiB,EAAYvT,EAAOyU,GAAwB9gC,KAAKmQ,KAAOkc,EAAOyU,IAAwB3jB,CAG1Fnd,MAAKy5B,aAAe,EAAItc,EAAQ,GAAI,GAAQ,EAC5Cnd,KAAK05B,WAAevc,EAAQ,EAAI,GAAI,GAAQ,CAE5C,IAAIkjB,GAAY1+B,EAAS45B,mBAAmBv7B,KAAKk1B,KAAKI,YAAaqK,EAAU,EAAIxiB,GAAO,GACpFmjB,EAAU3+B,EAAS45B,mBAAmBv7B,KAAKk1B,KAAKI,YAAasK,EAAQziB,EAAQ,GAAG,IAChFkjB,GAAaV,GAAYW,GAAWV,KACtC5/B,KAAK+F,MAAMs4B,MAAMnuB,MAAQmwB,EACzBrgC,KAAK+F,MAAMs4B,MAAMluB,IAAMmwB,EACvBtgC,KAAKg+B,YAAc,EAAIx0B,EAAMy2B,QAAQ9iB,MACrCwiB,EAAWU,EACXT,EAASU,GAGXtgC,KAAK8zB,SAAS6L,EAAUC,GAExB5/B,KAAKy5B,cAAe,EACpBz5B,KAAK05B,YAAa,IAUtB73B,EAAM4R,UAAUitB,eAAiB,SAAUF,GACzC,GAAI9F,GACAc,EAAYx7B,KAAK+O,QAAQysB,SAI7B,IAFAsD,EAAkBtD,GAED,cAAbA,EACF,MAAOx7B,MAAKk1B,KAAKv0B,KAAKi1B,OAAO4K,EAAQnuB,GAAGtL,SAGxC,IAAI+L,GAAS9S,KAAKk1B,KAAKC,SAAS9I,OAAOvZ,MAEvC,OADA4nB,GAAa16B,KAAK06B,WAAW5nB,GACtB0tB,EAAQluB,EAAIooB,EAAWvd,MAAQud,EAAW7Q,QA4BrDhoB,EAAM4R,UAAUktB,KAAO,SAASxjB,EAAOkP,EAAQwC,GAE/B,MAAVxC,IACFA,GAAUrsB,KAAKkQ,MAAQlQ,KAAKmQ,KAAO,EAGrC,IAAI0qB,GAAiBl5B,EAASg5B,yBAAyB36B,KAAKk1B,KAAKI,YAAat1B,KAAKkQ,MAAOlQ,KAAKmQ,KAC3F0wB,EAAuBl/B,EAASw5B,wBAAwBn7B,KAAKk1B,KAAKI,YAAat1B,KAAMqsB,GACrFyU,EAAsBjG,EAAiBgG,EAGvClB,EAAYtT,EAAOwU,GAAyB7gC,KAAKkQ,OAASmc,EAAOwU,IAAyB1jB,EAC1FyiB,EAAYvT,EAAOyU,GAAwB9gC,KAAKmQ,KAAOkc,EAAOyU,IAAwB3jB,CAG1Fnd,MAAKy5B,aAAe5K,EAAQ,GAAI,GAAQ,EACxC7uB,KAAK05B,YAAc7K,EAAS,GAAI,GAAQ,CACxC,IAAIwR,GAAY1+B,EAAS45B,mBAAmBv7B,KAAKk1B,KAAKI,YAAaqK,EAAU9Q,GAAO,GAChFyR,EAAU3+B,EAAS45B,mBAAmBv7B,KAAKk1B,KAAKI,YAAasK,GAAS/Q,GAAO,IAC7EwR,GAAaV,GAAYW,GAAWV,KACtCD,EAAWU,EACXT,EAASU,GAGXtgC,KAAK8zB,SAAS6L,EAAUC,GAExB5/B,KAAKy5B,cAAe,EACpBz5B,KAAK05B,YAAa,GAWpB73B,EAAM4R,UAAUstB,KAAO,SAASlS,GAE9B,GAAIrC,GAAQxsB,KAAKmQ,IAAMnQ,KAAKkQ,MAGxByvB,EAAW3/B,KAAKkQ,MAAQsc,EAAOqC,EAC/B+Q,EAAS5/B,KAAKmQ,IAAMqc,EAAOqC,CAI/B7uB,MAAKkQ,MAAQyvB,EACb3/B,KAAKmQ,IAAMyvB,GAOb/9B,EAAM4R,UAAUsU,OAAS,SAASA,GAChC,GAAIsE,IAAUrsB,KAAKkQ,MAAQlQ,KAAKmQ,KAAO,EAEnCqc,EAAOH,EAAStE,EAGhB4X,EAAW3/B,KAAKkQ,MAAQsc,EACxBoT,EAAS5/B,KAAKmQ,IAAMqc,CAExBxsB,MAAK8zB,SAAS6L,EAAUC,IAG1B//B,EAAOD,QAAUiC,GAKb,SAAShC,EAAQD,GAGrB,GAAIohC,GAAU,IAMdphC,GAAQqhC,aAAe,SAASh/B,GAC9BA,EAAMwU,KAAK,SAAUnR,EAAGa,GACtB,MAAOb,GAAE0N,KAAK9C,MAAQ/J,EAAE6M,KAAK9C,SASjCtQ,EAAQshC,WAAa,SAASj/B,GAC5BA,EAAMwU,KAAK,SAAUnR,EAAGa,GACtB,GAAIg7B,GAAS,OAAS77B,GAAE0N,KAAQ1N,EAAE0N,KAAK7C,IAAM7K,EAAE0N,KAAK9C,MAChDkxB,EAAS,OAASj7B,GAAE6M,KAAQ7M,EAAE6M,KAAK7C,IAAMhK,EAAE6M,KAAK9C,KAEpD,OAAOixB,GAAQC,KAenBxhC,EAAQkC,MAAQ,SAASG,EAAOgY,EAAQonB,GACtC,GAAI97B,GAAG+7B,CAEP,IAAID,EAEF,IAAK97B,EAAI,EAAG+7B,EAAOr/B,EAAMyD,OAAY47B,EAAJ/7B,EAAUA,IACzCtD,EAAMsD,GAAGqC,IAAM,IAKnB,KAAKrC,EAAI,EAAG+7B,EAAOr/B,EAAMyD,OAAY47B,EAAJ/7B,EAAUA,IAAK,CAC9C,GAAIoK,GAAO1N,EAAMsD,EACjB,IAAIoK,EAAK7N,OAAsB,OAAb6N,EAAK/H,IAAc,CAEnC+H,EAAK/H,IAAMqS,EAAOsnB,IAElB,GAAG,CAID,IAAK,GADDC,GAAgB,KACXzV,EAAI,EAAG0V,EAAKx/B,EAAMyD,OAAY+7B,EAAJ1V,EAAQA,IAAK,CAC9C,GAAIpmB,GAAQ1D,EAAM8pB,EAClB,IAAkB,OAAdpmB,EAAMiC,KAAgBjC,IAAUgK,GAAQhK,EAAM7D,OAASlC,EAAQ8hC,UAAU/xB,EAAMhK,EAAOsU,EAAOtK,MAAO,CACtG6xB,EAAgB77B,CAChB,QAIiB,MAAjB67B,IAEF7xB,EAAK/H,IAAM45B,EAAc55B,IAAM45B,EAAc1uB,OAASmH,EAAOtK,KAAKgW,gBAE7D6b,MAaf5hC,EAAQ+hC,QAAU,SAAS1/B,EAAOgY,EAAQ2nB,GACxC,GAAIr8B,GAAG+7B,EAAMO,CAGb,KAAKt8B,EAAI,EAAG+7B,EAAOr/B,EAAMyD,OAAY47B,EAAJ/7B,EAAUA,IACzC,GAA+BgB,SAA3BtE,EAAMsD,GAAGyN,KAAK8uB,SAAwB,CACxCD,EAAS5nB,EAAOsnB,IAChB,KAAK,GAAIO,KAAYF,GACfA,EAAU/7B,eAAei8B,IACQ,GAA/BF,EAAUE,GAAUlZ,SAAmBgZ,EAAUE,GAAUz5B,MAAQu5B,EAAU3/B,EAAMsD,GAAGyN,KAAK8uB,UAAUz5B,QACvGw5B,GAAUD,EAAUE,GAAUhvB,OAASmH,EAAOtK,KAAKgW,SAIzD1jB,GAAMsD,GAAGqC,IAAMi6B,MAGf5/B,GAAMsD,GAAGqC,IAAMqS,EAAOsnB,MAe5B3hC,EAAQ8hC,UAAY,SAASp8B,EAAGa,EAAG8T,GACjC,MAAS3U,GAAEkC,KAAOyS,EAAOyL,WAAasb,EAAkB76B,EAAEqB,KAAOrB,EAAE0M,OAC9DvN,EAAEkC,KAAOlC,EAAEuN,MAAQoH,EAAOyL,WAAasb,EAAW76B,EAAEqB,MACpDlC,EAAEsC,IAAMqS,EAAO0L,SAAWqb,EAAyB76B,EAAEyB,IAAMzB,EAAE2M,QAC7DxN,EAAEsC,IAAMtC,EAAEwN,OAASmH,EAAO0L,SAAWqb,EAAa76B,EAAEyB,MAMvD,SAAS/H,EAAQD,EAASM,GA+B9B,QAAS6B,GAASmO,EAAOC,EAAKurB,EAAapG,GAEzCt1B,KAAKo6B,QAAU,GAAI/1B,MACnBrE,KAAKyzB,OAAS,GAAIpvB,MAClBrE,KAAK0zB,KAAO,GAAIrvB,MAEhBrE,KAAK87B,WAAa,EAClB97B,KAAKmd,MAAQpb,EAASggC,MAAMC,IAC5BhiC,KAAKqoB,KAAO,EAGZroB,KAAK8zB,SAAS5jB,EAAOC,EAAKurB,GAG1B17B,KAAKw6B,aAAc,EACnBx6B,KAAKu6B,eAAgB,EACrBv6B,KAAKs6B,cAAe,EACpBt6B,KAAKs1B,YAAcA,EACC/uB,SAAhB+uB,IACFt1B,KAAKs1B,gBAhDT,GAAIzxB,GAAS3D,EAAoB,IAC7ByB,EAAWzB,EAAoB,GAoDnC6B,GAASggC,OACPE,YAAa,EACbC,OAAQ,EACRC,OAAQ,EACRC,KAAM,EACNJ,IAAK,EACLK,QAAS,EACTC,MAAO,EACPC,KAAM,GAcRxgC,EAAS0R,UAAUqgB,SAAW,SAAS5jB,EAAOC,EAAKurB,GACjD,KAAMxrB,YAAiB7L,OAAW8L,YAAe9L,OAC/C,KAAO,+CAGTrE,MAAKyzB,OAAmBltB,QAAT2J,EAAsB,GAAI7L,MAAK6L,EAAMnJ,WAAa,GAAI1C,MACrErE,KAAK0zB,KAAentB,QAAP4J,EAAoB,GAAI9L,MAAK8L,EAAIpJ,WAAa,GAAI1C,MAE3DrE,KAAK87B,WACP97B,KAAKq8B,eAAeX,IAOxB35B,EAAS0R,UAAU+uB,MAAQ,WACzBxiC,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAKyzB,OAAO1sB,WACpC/G,KAAKg9B,gBAOPj7B,EAAS0R,UAAUupB,aAAe,WAIhC,OAAQh9B,KAAKmd,OACX,IAAKpb,GAASggC,MAAMQ,KAClBviC,KAAKo6B,QAAQqI,YAAYziC,KAAKqoB,KAAOpjB,KAAKC,MAAMlF,KAAKo6B,QAAQsI,cAAgB1iC,KAAKqoB,OAClFroB,KAAKo6B,QAAQuI,SAAS,EACxB,KAAK5gC,GAASggC,MAAMO,MAActiC,KAAKo6B,QAAQwI,QAAQ,EACvD,KAAK7gC,GAASggC,MAAMC,IACpB,IAAKjgC,GAASggC,MAAMM,QAAcriC,KAAKo6B,QAAQyI,SAAS,EACxD,KAAK9gC,GAASggC,MAAMK,KAAcpiC,KAAKo6B,QAAQ0I,WAAW,EAC1D,KAAK/gC,GAASggC,MAAMI,OAAcniC,KAAKo6B,QAAQ2I,WAAW,EAC1D,KAAKhhC,GAASggC,MAAMG,OAAcliC,KAAKo6B,QAAQ4I,gBAAgB,GAIjE,GAAiB,GAAbhjC,KAAKqoB,KAEP,OAAQroB,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAAcjiC,KAAKo6B,QAAQ4I,gBAAgBhjC,KAAKo6B,QAAQ6I,kBAAoBjjC,KAAKo6B,QAAQ6I,kBAAoBjjC,KAAKqoB,KAAQ,MAC9I,KAAKtmB,GAASggC,MAAMG,OAAcliC,KAAKo6B,QAAQ2I,WAAW/iC,KAAKo6B,QAAQ8I,aAAeljC,KAAKo6B,QAAQ8I,aAAeljC,KAAKqoB,KAAO,MAC9H,KAAKtmB,GAASggC,MAAMI,OAAcniC,KAAKo6B,QAAQ0I,WAAW9iC,KAAKo6B,QAAQ+I,aAAenjC,KAAKo6B,QAAQ+I,aAAenjC,KAAKqoB,KAAO;KAC9H,KAAKtmB,GAASggC,MAAMK,KAAcpiC,KAAKo6B,QAAQyI,SAAS7iC,KAAKo6B,QAAQgJ,WAAapjC,KAAKo6B,QAAQgJ,WAAapjC,KAAKqoB,KAAO,MACxH,KAAKtmB,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IAAchiC,KAAKo6B,QAAQwI,QAAS5iC,KAAKo6B,QAAQiJ,UAAU,GAAMrjC,KAAKo6B,QAAQiJ,UAAU,GAAKrjC,KAAKqoB,KAAO,EAAI,MACjI,KAAKtmB,GAASggC,MAAMO,MAActiC,KAAKo6B,QAAQuI,SAAS3iC,KAAKo6B,QAAQkJ,WAAatjC,KAAKo6B,QAAQkJ,WAAatjC,KAAKqoB,KAAQ,MACzH,KAAKtmB,GAASggC,MAAMQ,KAAcviC,KAAKo6B,QAAQqI,YAAYziC,KAAKo6B,QAAQsI,cAAgB1iC,KAAKo6B,QAAQsI,cAAgB1iC,KAAKqoB,QAUhItmB,EAAS0R,UAAU0pB,QAAU,WAC3B,MAAQn9B,MAAKo6B,QAAQrzB,WAAa/G,KAAK0zB,KAAK3sB,WAM9ChF,EAAS0R,UAAU8U,KAAO,WACxB,GAAI4J,GAAOnyB,KAAKo6B,QAAQrzB,SAIxB,IAAI/G,KAAKo6B,QAAQkJ,WAAa,EAC5B,OAAQtjC,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAElBjiC,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAKo6B,QAAQrzB,UAAY/G,KAAKqoB,KAAO,MAC/D,KAAKtmB,GAASggC,MAAMG,OAAcliC,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAKo6B,QAAQrzB,UAAwB,IAAZ/G,KAAKqoB,KAAc,MACtG,KAAKtmB,GAASggC,MAAMI,OAAcniC,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAKo6B,QAAQrzB,UAAwB,IAAZ/G,KAAKqoB,KAAc,GAAK,MAC3G,KAAKtmB,GAASggC,MAAMK,KAClBpiC,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAKo6B,QAAQrzB,UAAwB,IAAZ/G,KAAKqoB,KAAc,GAAK,GAEzE,IAAI/c,GAAItL,KAAKo6B,QAAQgJ,UACrBpjC,MAAKo6B,QAAQyI,SAASv3B,EAAKA,EAAItL,KAAKqoB,KACpC,MACF,KAAKtmB,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IAAchiC,KAAKo6B,QAAQwI,QAAQ5iC,KAAKo6B,QAAQiJ,UAAYrjC,KAAKqoB,KAAO,MAC5F,KAAKtmB,GAASggC,MAAMO,MAActiC,KAAKo6B,QAAQuI,SAAS3iC,KAAKo6B,QAAQkJ,WAAatjC,KAAKqoB,KAAO,MAC9F,KAAKtmB,GAASggC,MAAMQ,KAAcviC,KAAKo6B,QAAQqI,YAAYziC,KAAKo6B,QAAQsI,cAAgB1iC,KAAKqoB,UAK/F,QAAQroB,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAAcjiC,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAKo6B,QAAQrzB,UAAY/G,KAAKqoB,KAAO,MAC/F,KAAKtmB,GAASggC,MAAMG,OAAcliC,KAAKo6B,QAAQ2I,WAAW/iC,KAAKo6B,QAAQ8I,aAAeljC,KAAKqoB,KAAO,MAClG,KAAKtmB,GAASggC,MAAMI,OAAcniC,KAAKo6B,QAAQ0I,WAAW9iC,KAAKo6B,QAAQ+I,aAAenjC,KAAKqoB,KAAO,MAClG,KAAKtmB,GAASggC,MAAMK,KAAcpiC,KAAKo6B,QAAQyI,SAAS7iC,KAAKo6B,QAAQgJ,WAAapjC,KAAKqoB,KAAO,MAC9F,KAAKtmB,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IAAchiC,KAAKo6B,QAAQwI,QAAQ5iC,KAAKo6B,QAAQiJ,UAAYrjC,KAAKqoB,KAAO,MAC5F,KAAKtmB,GAASggC,MAAMO,MAActiC,KAAKo6B,QAAQuI,SAAS3iC,KAAKo6B,QAAQkJ,WAAatjC,KAAKqoB,KAAO,MAC9F,KAAKtmB,GAASggC,MAAMQ,KAAcviC,KAAKo6B,QAAQqI,YAAYziC,KAAKo6B,QAAQsI,cAAgB1iC,KAAKqoB,MAKjG,GAAiB,GAAbroB,KAAKqoB,KAEP,OAAQroB,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAAiBjiC,KAAKo6B,QAAQ6I,kBAAoBjjC,KAAKqoB,MAAMroB,KAAKo6B,QAAQ4I,gBAAgB,EAAK,MACnH,KAAKjhC,GAASggC,MAAMG,OAAiBliC,KAAKo6B,QAAQ8I,aAAeljC,KAAKqoB,MAAMroB,KAAKo6B,QAAQ2I,WAAW,EAAK,MACzG,KAAKhhC,GAASggC,MAAMI,OAAiBniC,KAAKo6B,QAAQ+I,aAAenjC,KAAKqoB,MAAMroB,KAAKo6B,QAAQ0I,WAAW,EAAK,MACzG,KAAK/gC,GAASggC,MAAMK,KAAiBpiC,KAAKo6B,QAAQgJ,WAAapjC,KAAKqoB,MAAMroB,KAAKo6B,QAAQyI,SAAS,EAAK,MACrG,KAAK9gC,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IAAiBhiC,KAAKo6B,QAAQiJ,UAAYrjC,KAAKqoB,KAAK,GAAGroB,KAAKo6B,QAAQwI,QAAQ,EAAI,MACpG,KAAK7gC,GAASggC,MAAMO,MAAiBtiC,KAAKo6B,QAAQkJ,WAAatjC,KAAKqoB,MAAMroB,KAAKo6B,QAAQuI,SAAS,EAAK,MACrG,KAAK5gC,GAASggC,MAAMQ,MAMpBviC,KAAKo6B,QAAQrzB,WAAaorB,IAC5BnyB,KAAKo6B,QAAU,GAAI/1B,MAAKrE,KAAK0zB,KAAK3sB,YAGpCpF,EAASo4B,oBAAoB/5B,KAAMmyB,IAQrCpwB,EAAS0R,UAAU6U,WAAa,WAC9B,MAAOtoB,MAAKo6B,SAgBdr4B,EAAS0R,UAAU8vB,SAAW,SAASC,EAAUC,GAC/CzjC,KAAKmd,MAAQqmB,EAETC,EAAU,IACZzjC,KAAKqoB,KAAOob,GAGdzjC,KAAK87B,WAAY,GAOnB/5B,EAAS0R,UAAUiwB,aAAe,SAAUC,GAC1C3jC,KAAK87B,UAAY6H,GAQnB5hC,EAAS0R,UAAU4oB,eAAiB,SAASX,GAC3C,GAAmBn1B,QAAfm1B,EAAJ,CAMA,GAAIkI,GAAiB,QACjBC,EAAiB,OACjBC,EAAiB,MACjBC,EAAiB,KACjBC,EAAiB,IACjBC,EAAiB,IACjBC,EAAiB,CAGR,KAATN,EAAgBlI,IAAqB17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,KACjF,IAATub,EAAelI,IAAsB17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,KACjF,IAATub,EAAelI,IAAsB17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,KACjF,GAATub,EAAclI,IAAuB17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,IACjF,GAATub,EAAclI,IAAuB17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,IACjF,EAATub,EAAalI,IAAwB17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,GAC1Fub,EAAWlI,IAA0B17B,KAAKmd,MAAQpb,EAASggC,MAAMQ,KAAaviC,KAAKqoB,KAAO,GAChF,EAAVwb,EAAcnI,IAAuB17B,KAAKmd,MAAQpb,EAASggC,MAAMO,MAAatiC,KAAKqoB,KAAO,GAC1Fwb,EAAYnI,IAAyB17B,KAAKmd,MAAQpb,EAASggC,MAAMO,MAAatiC,KAAKqoB,KAAO,GAClF,EAARyb,EAAYpI,IAAyB17B,KAAKmd,MAAQpb,EAASggC,MAAMC,IAAahiC,KAAKqoB,KAAO,GAClF,EAARyb,EAAYpI,IAAyB17B,KAAKmd,MAAQpb,EAASggC,MAAMC,IAAahiC,KAAKqoB,KAAO,GAC1Fyb,EAAUpI,IAA2B17B,KAAKmd,MAAQpb,EAASggC,MAAMC,IAAahiC,KAAKqoB,KAAO,GAC1Fyb,EAAQ,EAAIpI,IAAyB17B,KAAKmd,MAAQpb,EAASggC,MAAMM,QAAariC,KAAKqoB,KAAO,GACjF,EAAT0b,EAAarI,IAAwB17B,KAAKmd,MAAQpb,EAASggC,MAAMK,KAAapiC,KAAKqoB,KAAO,GAC1F0b,EAAWrI,IAA0B17B,KAAKmd,MAAQpb,EAASggC,MAAMK,KAAapiC,KAAKqoB,KAAO,GAC/E,GAAX2b,EAAgBtI,IAAqB17B,KAAKmd,MAAQpb,EAASggC,MAAMI,OAAaniC,KAAKqoB,KAAO,IAC/E,GAAX2b,EAAgBtI,IAAqB17B,KAAKmd,MAAQpb,EAASggC,MAAMI,OAAaniC,KAAKqoB,KAAO,IAC/E,EAAX2b,EAAetI,IAAsB17B,KAAKmd,MAAQpb,EAASggC,MAAMI,OAAaniC,KAAKqoB,KAAO,GAC1F2b,EAAatI,IAAwB17B,KAAKmd,MAAQpb,EAASggC,MAAMI,OAAaniC,KAAKqoB,KAAO,GAC/E,GAAX4b,EAAgBvI,IAAqB17B,KAAKmd,MAAQpb,EAASggC,MAAMG,OAAaliC,KAAKqoB,KAAO,IAC/E,GAAX4b,EAAgBvI,IAAqB17B,KAAKmd,MAAQpb,EAASggC,MAAMG,OAAaliC,KAAKqoB,KAAO,IAC/E,EAAX4b,EAAevI,IAAsB17B,KAAKmd,MAAQpb,EAASggC,MAAMG,OAAaliC,KAAKqoB,KAAO,GAC1F4b,EAAavI,IAAwB17B,KAAKmd,MAAQpb,EAASggC,MAAMG,OAAaliC,KAAKqoB,KAAO,GAC1E,IAAhB6b,EAAsBxI,IAAe17B,KAAKmd,MAAQpb,EAASggC,MAAME,YAAajiC,KAAKqoB,KAAO,KAC1E,IAAhB6b,EAAsBxI,IAAe17B,KAAKmd,MAAQpb,EAASggC,MAAME,YAAajiC,KAAKqoB,KAAO,KAC1E,GAAhB6b,EAAqBxI,IAAgB17B,KAAKmd,MAAQpb,EAASggC,MAAME,YAAajiC,KAAKqoB,KAAO,IAC1E,GAAhB6b,EAAqBxI,IAAgB17B,KAAKmd,MAAQpb,EAASggC,MAAME,YAAajiC,KAAKqoB,KAAO,IAC1E,EAAhB6b,EAAoBxI,IAAiB17B,KAAKmd,MAAQpb,EAASggC,MAAME,YAAajiC,KAAKqoB,KAAO,GAC1F6b,EAAkBxI,IAAmB17B,KAAKmd,MAAQpb,EAASggC,MAAME,YAAajiC,KAAKqoB,KAAO,KAShGtmB,EAAS0R,UAAU8hB,KAAO,SAASwD,GACjC,GAAIL,GAAQ,GAAIr0B,MAAK00B,EAAKhyB,UAE1B,IAAI/G,KAAKmd,OAASpb,EAASggC,MAAMQ,KAAM,CACrC,GAAI1J,GAAOH,EAAMgK,cAAgBz9B,KAAK8oB,MAAM2K,EAAM4K,WAAa,GAC/D5K,GAAM+J,YAAYx9B,KAAK8oB,MAAM8K,EAAO74B,KAAKqoB,MAAQroB,KAAKqoB,MACtDqQ,EAAMiK,SAAS,GACfjK,EAAMkK,QAAQ,GACdlK,EAAMmK,SAAS,GACfnK,EAAMoK,WAAW,GACjBpK,EAAMqK,WAAW,GACjBrK,EAAMsK,gBAAgB,OAEnB,IAAIhjC,KAAKmd,OAASpb,EAASggC,MAAMO,MAChC5J,EAAM2K,UAAY,IACpB3K,EAAMkK,QAAQ,GACdlK,EAAMiK,SAASjK,EAAM4K,WAAa,IAIlC5K,EAAMkK,QAAQ,GAGhBlK,EAAMmK,SAAS,GACfnK,EAAMoK,WAAW,GACjBpK,EAAMqK,WAAW,GACjBrK,EAAMsK,gBAAgB,OAEnB,IAAIhjC,KAAKmd,OAASpb,EAASggC,MAAMC,IAAK,CAEzC,OAAQhiC,KAAKqoB,MACX,IAAK,GACL,IAAK,GACHqQ,EAAMmK,SAA6C,GAApC59B,KAAK8oB,MAAM2K,EAAM0K,WAAa,IAAW,MAC1D,SACE1K,EAAMmK,SAA6C,GAApC59B,KAAK8oB,MAAM2K,EAAM0K,WAAa,KAEjD1K,EAAMoK,WAAW,GACjBpK,EAAMqK,WAAW,GACjBrK,EAAMsK,gBAAgB,OAEnB,IAAIhjC,KAAKmd,OAASpb,EAASggC,MAAMM,QAAS,CAE7C,OAAQriC,KAAKqoB,MACX,IAAK,GACL,IAAK,GACHqQ,EAAMmK,SAA6C,GAApC59B,KAAK8oB,MAAM2K,EAAM0K,WAAa,IAAW,MAC1D,SACE1K,EAAMmK,SAA4C,EAAnC59B,KAAK8oB,MAAM2K,EAAM0K,WAAa,IAEjD1K,EAAMoK,WAAW,GACjBpK,EAAMqK,WAAW,GACjBrK,EAAMsK,gBAAgB,OAEnB,IAAIhjC,KAAKmd,OAASpb,EAASggC,MAAMK,KAAM,CAC1C,OAAQpiC,KAAKqoB,MACX,IAAK,GACHqQ,EAAMoK,WAAiD,GAAtC79B,KAAK8oB,MAAM2K,EAAMyK,aAAe,IAAW,MAC9D,SACEzK,EAAMoK,WAAiD,GAAtC79B,KAAK8oB,MAAM2K,EAAMyK,aAAe,KAErDzK,EAAMqK,WAAW,GACjBrK,EAAMsK,gBAAgB,OACjB,IAAIhjC,KAAKmd,OAASpb,EAASggC,MAAMI,OAAQ,CAE9C,OAAQniC,KAAKqoB,MACX,IAAK,IACL,IAAK,IACHqQ,EAAMoK,WAAgD,EAArC79B,KAAK8oB,MAAM2K,EAAMyK,aAAe,IACjDzK,EAAMqK,WAAW,EACjB,MACF,KAAK,GACHrK,EAAMqK,WAAiD,GAAtC99B,KAAK8oB,MAAM2K,EAAMwK,aAAe,IAAW,MAC9D,SACExK,EAAMqK,WAAiD,GAAtC99B,KAAK8oB,MAAM2K,EAAMwK,aAAe,KAErDxK,EAAMsK,gBAAgB,OAEnB,IAAIhjC,KAAKmd,OAASpb,EAASggC,MAAMG,OAEpC,OAAQliC,KAAKqoB,MACX,IAAK,IACL,IAAK,IACHqQ,EAAMqK,WAAgD,EAArC99B,KAAK8oB,MAAM2K,EAAMwK,aAAe,IACjDxK,EAAMsK,gBAAgB,EACtB,MACF,KAAK,GACHtK,EAAMsK,gBAA6D,IAA7C/9B,KAAK8oB,MAAM2K,EAAMuK,kBAAoB,KAAe,MAC5E,SACEvK,EAAMsK,gBAA4D,IAA5C/9B,KAAK8oB,MAAM2K,EAAMuK,kBAAoB,UAG5D,IAAIjjC,KAAKmd,OAASpb,EAASggC,MAAME,YAAa,CACjD,GAAI5Z,GAAOroB,KAAKqoB,KAAO,EAAIroB,KAAKqoB,KAAO,EAAI,CAC3CqQ,GAAMsK,gBAAgB/9B,KAAK8oB,MAAM2K,EAAMuK,kBAAoB5a,GAAQA,GAGrE,MAAOqQ,IAQT32B,EAAS0R,UAAUgqB,QAAU,WAC3B,GAAyB,GAArBz9B,KAAKs6B,aAEP,OADAt6B,KAAKs6B,cAAe,EACZt6B,KAAKmd,OACX,IAAKpb,GAASggC,MAAMQ,KACpB,IAAKxgC,GAASggC,MAAMO,MACpB,IAAKvgC,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IACpB,IAAKjgC,GAASggC,MAAMK,KACpB,IAAKrgC,GAASggC,MAAMI,OACpB,IAAKpgC,GAASggC,MAAMG,OACpB,IAAKngC,GAASggC,MAAME,YAClB,OAAO,CACT,SACE,OAAO,MAGR,IAA0B,GAAtBjiC,KAAKu6B,cAEZ,OADAv6B,KAAKu6B,eAAgB,EACbv6B,KAAKmd,OACX,IAAKpb,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IACpB,IAAKjgC,GAASggC,MAAMK,KACpB,IAAKrgC,GAASggC,MAAMI,OACpB,IAAKpgC,GAASggC,MAAMG,OACpB,IAAKngC,GAASggC,MAAME,YAClB,OAAO,CACT,SACE,OAAO,MAGR,IAAwB,GAApBjiC,KAAKw6B,YAEZ,OADAx6B,KAAKw6B,aAAc,EACXx6B,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YACpB,IAAKlgC,GAASggC,MAAMG,OACpB,IAAKngC,GAASggC,MAAMI,OACpB,IAAKpgC,GAASggC,MAAMK,KAClB,OAAO,CACT,SACE,OAAO,EAIb,OAAQpiC,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAClB,MAA0C,IAAlCjiC,KAAKo6B,QAAQ6I,iBACvB,KAAKlhC,GAASggC,MAAMG,OAClB,MAAqC,IAA7BliC,KAAKo6B,QAAQ8I,YACvB,KAAKnhC,GAASggC,MAAMI,OAClB,MAAmC,IAA3BniC,KAAKo6B,QAAQgJ,YAAkD,GAA7BpjC,KAAKo6B,QAAQ+I,YACzD,KAAKphC,GAASggC,MAAMK,KAClB,MAAmC,IAA3BpiC,KAAKo6B,QAAQgJ,UACvB,KAAKrhC,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IAClB,MAAkC,IAA1BhiC,KAAKo6B,QAAQiJ,SACvB,KAAKthC,GAASggC,MAAMO,MAClB,MAAmC,IAA3BtiC,KAAKo6B,QAAQkJ,UACvB,KAAKvhC,GAASggC,MAAMQ,KAClB,OAAO,CACT,SACE,OAAO,IAWbxgC,EAAS0R,UAAU0wB,cAAgB,SAASpL,GAK1C,OAJYxyB,QAARwyB,IACFA,EAAO/4B,KAAKo6B,SAGNp6B,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAAc,MAAOp+B,GAAOk1B,GAAMqL,OAAO,MAC7D,KAAKriC,GAASggC,MAAMG,OAAc,MAAOr+B,GAAOk1B,GAAMqL,OAAO,IAC7D,KAAKriC,GAASggC,MAAMI,OAAc,MAAOt+B,GAAOk1B,GAAMqL,OAAO,QAC7D,KAAKriC,GAASggC,MAAMK,KAAc,MAAOv+B,GAAOk1B,GAAMqL,OAAO,QAC7D,KAAKriC,GAASggC,MAAMM,QAAc,MAAOx+B,GAAOk1B,GAAMqL,OAAO,QAC7D,KAAKriC,GAASggC,MAAMC,IAAc,MAAOn+B,GAAOk1B,GAAMqL,OAAO,IAC7D,KAAKriC,GAASggC,MAAMO,MAAc,MAAOz+B,GAAOk1B,GAAMqL,OAAO,MAC7D,KAAKriC,GAASggC,MAAMQ,KAAc,MAAO1+B,GAAOk1B,GAAMqL,OAAO,OAC7D,SAAkC,MAAO,KAW7CriC,EAAS0R,UAAU4wB,cAAgB,SAAStL,GAM1C,OALYxyB,QAARwyB,IACFA,EAAO/4B,KAAKo6B,SAINp6B,KAAKmd,OACX,IAAKpb,GAASggC,MAAME,YAAY,MAAOp+B,GAAOk1B,GAAMqL,OAAO,WAC3D,KAAKriC,GAASggC,MAAMG,OAAY,MAAOr+B,GAAOk1B,GAAMqL,OAAO,eAC3D,KAAKriC,GAASggC,MAAMI,OACpB,IAAKpgC,GAASggC,MAAMK,KAAY,MAAOv+B,GAAOk1B,GAAMqL,OAAO,aAC3D,KAAKriC,GAASggC,MAAMM,QACpB,IAAKtgC,GAASggC,MAAMC,IAAY,MAAOn+B,GAAOk1B,GAAMqL,OAAO,YAC3D,KAAKriC,GAASggC,MAAMO,MAAY,MAAOz+B,GAAOk1B,GAAMqL,OAAO,OAC3D,KAAKriC,GAASggC,MAAMQ,KAAY,MAAO,EACvC,SAAgC,MAAO,KAI3C1iC,EAAOD,QAAUmC,GAKb,SAASlC,GAOb,QAAS0C,KACPvC,KAAK+O,QAAU,KACf/O,KAAK+F,MAAQ,KAQfxD,EAAUkR,UAAUD,WAAa,SAASzE,GACpCA,GACFpO,KAAK0E,OAAOrF,KAAK+O,QAASA,IAQ9BxM,EAAUkR,UAAUkO,OAAS,WAE3B,OAAO,GAMTpf,EAAUkR,UAAUG,QAAU,aAU9BrR,EAAUkR,UAAU6wB,WAAa,WAC/B,GAAIC,GAAWvkC,KAAK+F,MAAMy+B,iBAAmBxkC,KAAK+F,MAAM8M,OACpD7S,KAAK+F,MAAM0+B,kBAAoBzkC,KAAK+F,MAAM+M,MAK9C,OAHA9S,MAAK+F,MAAMy+B,eAAiBxkC,KAAK+F,MAAM8M,MACvC7S,KAAK+F,MAAM0+B,gBAAkBzkC,KAAK+F,MAAM+M,OAEjCyxB,GAGT1kC,EAAOD,QAAU2C,GAKb,SAAS1C,EAAQD,EAASM,GAe9B,QAASsC,GAAa0yB,EAAMnmB,GAC1B/O,KAAKk1B,KAAOA,EAGZl1B,KAAK40B,gBACH8P,iBAAiB,EAEjBC,QAASA,EACTC,OAAQ,MAEV5kC,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBACpC50B,KAAK6pB,OAAS,EAEd7pB,KAAKi1B,UAELj1B,KAAKwT,WAAWzE,GA5BlB,GAAIpO,GAAOT,EAAoB,GAC3BqC,EAAYrC,EAAoB,IAChC2D,EAAS3D,EAAoB,IAC7BykC,EAAUzkC,EAAoB,GA4BlCsC,GAAYiR,UAAY,GAAIlR,GAM5BC,EAAYiR,UAAUwhB,QAAU,WAC9B,GAAI7C,GAAMvgB,SAASM,cAAc,MACjCigB,GAAIrqB,UAAY,cAChBqqB,EAAI5kB,MAAMsW,SAAW,WACrBsO,EAAI5kB,MAAM5F,IAAM,MAChBwqB,EAAI5kB,MAAMsF,OAAS,OAEnB9S,KAAKoyB,IAAMA,GAMb5vB,EAAYiR,UAAUG,QAAU,WAC9B5T,KAAK+O,QAAQ21B,iBAAkB,EAC/B1kC,KAAK2hB,SAEL3hB,KAAKk1B,KAAO,MAQd1yB,EAAYiR,UAAUD,WAAa,SAASzE,GACtCA,GAEFpO,EAAKmF,iBAAiB,kBAAmB,SAAU,WAAY9F,KAAK+O,QAASA,IAQjFvM,EAAYiR,UAAUkO,OAAS,WAC7B,GAAI3hB,KAAK+O,QAAQ21B,gBAAiB,CAChC,GAAIG,GAAS7kC,KAAKk1B,KAAK/E,IAAI2U,kBACvB9kC,MAAKoyB,IAAItoB,YAAc+6B,IAErB7kC,KAAKoyB,IAAItoB,YACX9J,KAAKoyB,IAAItoB,WAAW2H,YAAYzR,KAAKoyB,KAEvCyS,EAAO9yB,YAAY/R,KAAKoyB,KAExBpyB,KAAKkQ,QAGP,IAAIwtB,GAAM,GAAIr5B,OAAK,GAAIA,OAAO0C,UAAY/G,KAAK6pB,QAC3CxX,EAAIrS,KAAKk1B,KAAKv0B,KAAK60B,SAASkI,GAE5BkH,EAAS5kC,KAAK+O,QAAQ41B,QAAQ3kC,KAAK+O,QAAQ61B,QAC3CG,EAAQH,EAAOxK,QAAU,IAAMwK,EAAOnK,KAAO,KAAO52B,EAAO65B,GAAK0G,OAAO,8BAC3EW,GAAQA,EAAMzf,OAAO,GAAGjZ,cAAgB04B,EAAMz4B,UAAU,GAExDtM,KAAKoyB,IAAI5kB,MAAMhG,KAAO6K,EAAI,KAC1BrS,KAAKoyB,IAAI2S,MAAQA,MAIb/kC,MAAKoyB,IAAItoB,YACX9J,KAAKoyB,IAAItoB,WAAW2H,YAAYzR,KAAKoyB,KAEvCpyB,KAAKolB,MAGP,QAAO,GAMT5iB,EAAYiR,UAAUvD,MAAQ,WAG5B,QAASiF,KACPV,EAAG2Q,MAGH,IAAIjI,GAAQ1I,EAAGygB,KAAKc,MAAM0E,WAAWjmB,EAAGygB,KAAKC,SAAS9I,OAAOxZ,OAAOsK,MAChE4V,EAAW,EAAI5V,EAAQ,EACZ,IAAX4V,IAAiBA,EAAW,IAC5BA,EAAW,MAAMA,EAAW,KAEhCte,EAAGkN,SAGHlN,EAAGuwB,iBAAmBnrB,WAAW1E,EAAQ4d,GAd3C,GAAIte,GAAKzU,IAiBTmV,MAMF3S,EAAYiR,UAAU2R,KAAO,WACG7e,SAA1BvG,KAAKglC,mBACPprB,aAAa5Z,KAAKglC,wBACXhlC,MAAKglC,mBAUhBxiC,EAAYiR,UAAUwxB,eAAiB,SAASxK,GAC9C,GAAIrsB,GAAIzN,EAAKiG,QAAQ6zB,EAAM,QAAQ1zB,UAC/B22B,GAAM,GAAIr5B,OAAO0C,SACrB/G,MAAK6pB,OAASzb,EAAIsvB,EAClB19B,KAAK2hB,UAOPnf,EAAYiR,UAAUyxB,eAAiB,WACrC,MAAO,IAAI7gC,OAAK,GAAIA,OAAO0C,UAAY/G,KAAK6pB,SAG9ChqB,EAAOD,QAAU4C,GAKb,SAAS3C,EAAQD,EAASM,GAiB9B,QAASuC,GAAYyyB,EAAMnmB,GACzB/O,KAAKk1B,KAAOA,EAGZl1B,KAAK40B,gBACHuQ,gBAAgB,EAChBR,QAASA,EACTC,OAAQ,MAEV5kC,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBAEpC50B,KAAKm2B,WAAa,GAAI9xB,MACtBrE,KAAKolC,eAGLplC,KAAKi1B,UAELj1B,KAAKwT,WAAWzE,GAhClB,GAAIs2B,GAASnlC,EAAoB,IAC7BS,EAAOT,EAAoB,GAC3BqC,EAAYrC,EAAoB,IAChC2D,EAAS3D,EAAoB,IAC7BykC,EAAUzkC,EAAoB,GA+BlCuC,GAAWgR,UAAY,GAAIlR,GAO3BE,EAAWgR,UAAUD,WAAa,SAASzE,GACrCA,GAEFpO,EAAKmF,iBAAiB,iBAAkB,SAAU,WAAY9F,KAAK+O,QAASA,IAQhFtM,EAAWgR,UAAUwhB,QAAU,WAC7B,GAAI7C,GAAMvgB,SAASM,cAAc,MACjCigB,GAAIrqB,UAAY,aAChBqqB,EAAI5kB,MAAMsW,SAAW,WACrBsO,EAAI5kB,MAAM5F,IAAM,MAChBwqB,EAAI5kB,MAAMsF,OAAS,OACnB9S,KAAKoyB,IAAMA,CAEX,IAAIkT,GAAOzzB,SAASM,cAAc,MAClCmzB,GAAK93B,MAAMsW,SAAW,WACtBwhB,EAAK93B,MAAM5F,IAAM,MACjB09B,EAAK93B,MAAMhG,KAAO,QAClB89B,EAAK93B,MAAMsF,OAAS,OACpBwyB,EAAK93B,MAAMqF,MAAQ,OACnBuf,EAAIrgB,YAAYuzB,GAGhBtlC,KAAK8D,OAASuhC,EAAOjT,GACnBmT,iBAAiB,IAEnBvlC,KAAK8D,OAAO+P,GAAG,YAAa7T,KAAKu+B,aAAalJ,KAAKr1B,OACnDA,KAAK8D,OAAO+P,GAAG,OAAa7T,KAAKw+B,QAAQnJ,KAAKr1B,OAC9CA,KAAK8D,OAAO+P,GAAG,UAAa7T,KAAKy+B,WAAWpJ,KAAKr1B,QAMnDyC,EAAWgR,UAAUG,QAAU,WAC7B5T,KAAK+O,QAAQo2B,gBAAiB,EAC9BnlC,KAAK2hB,SAEL3hB,KAAK8D,OAAO6/B,QAAO,GACnB3jC,KAAK8D,OAAS,KAEd9D,KAAKk1B,KAAO,MAOdzyB,EAAWgR,UAAUkO,OAAS,WAC5B,GAAI3hB,KAAK+O,QAAQo2B,eAAgB,CAC/B,GAAIN,GAAS7kC,KAAKk1B,KAAK/E,IAAI2U,kBACvB9kC,MAAKoyB,IAAItoB,YAAc+6B,IAErB7kC,KAAKoyB,IAAItoB,YACX9J,KAAKoyB,IAAItoB,WAAW2H,YAAYzR,KAAKoyB,KAEvCyS,EAAO9yB,YAAY/R,KAAKoyB,KAG1B,IAAI/f,GAAIrS,KAAKk1B,KAAKv0B,KAAK60B,SAASx1B,KAAKm2B,YAEjCyO,EAAS5kC,KAAK+O,QAAQ41B,QAAQ3kC,KAAK+O,QAAQ61B,QAC3CG,EAAQH,EAAOnK,KAAO,KAAO52B,EAAO7D,KAAKm2B,YAAYiO,OAAO,8BAChEW,GAAQA,EAAMzf,OAAO,GAAGjZ,cAAgB04B,EAAMz4B,UAAU,GAExDtM,KAAKoyB,IAAI5kB,MAAMhG,KAAO6K,EAAI,KAC1BrS,KAAKoyB,IAAI2S,MAAQA,MAIb/kC,MAAKoyB,IAAItoB,YACX9J,KAAKoyB,IAAItoB,WAAW2H,YAAYzR,KAAKoyB,IAIzC,QAAO,GAOT3vB,EAAWgR,UAAU+xB,cAAgB,SAAS/K,GAC5Cz6B,KAAKm2B,WAAax1B,EAAKiG,QAAQ6zB,EAAM,QACrCz6B,KAAK2hB,UAOPlf,EAAWgR,UAAUgyB,cAAgB,WACnC,MAAO,IAAIphC,MAAKrE,KAAKm2B,WAAWpvB,YAQlCtE,EAAWgR,UAAU8qB,aAAe,SAAS/0B,GAC3CxJ,KAAKolC,YAAYjG,UAAW,EAC5Bn/B,KAAKolC,YAAYjP,WAAan2B,KAAKm2B,WAEnC3sB,EAAMk8B,kBACNl8B,EAAMD,kBAQR9G,EAAWgR,UAAU+qB,QAAU,SAAUh1B,GACvC,GAAKxJ,KAAKolC,YAAYjG,SAAtB,CAEA,GAAIe,GAAS12B,EAAMy2B,QAAQC,OACvB7tB,EAAIrS,KAAKk1B,KAAKv0B,KAAK60B,SAASx1B,KAAKolC,YAAYjP,YAAc+J,EAC3DzF,EAAOz6B,KAAKk1B,KAAKv0B,KAAKi1B,OAAOvjB,EAEjCrS,MAAKwlC,cAAc/K,GAGnBz6B,KAAKk1B,KAAKE,QAAQnH,KAAK,cACrBwM,KAAM,GAAIp2B,MAAKrE,KAAKm2B,WAAWpvB,aAGjCyC,EAAMk8B,kBACNl8B,EAAMD,mBAQR9G,EAAWgR,UAAUgrB,WAAa,SAAUj1B,GACrCxJ,KAAKolC,YAAYjG,WAGtBn/B,KAAKk1B,KAAKE,QAAQnH,KAAK,eACrBwM,KAAM,GAAIp2B,MAAKrE,KAAKm2B,WAAWpvB,aAGjCyC,EAAMk8B,kBACNl8B,EAAMD,mBAGR1J,EAAOD,QAAU6C,GAKb,SAAS5C,EAAQD,EAASM,GAe9B,QAASwC,GAAUwyB,EAAMnmB,EAAS42B,EAAKC,GACrC5lC,KAAKK,GAAKM,EAAKoE,aACf/E,KAAKk1B,KAAOA,EAEZl1B,KAAK40B,gBACHE,YAAa,OACb+Q,iBAAiB,EACjBC,iBAAiB,EACjBC,OAAO,EACPC,iBAAkB,EAClBC,iBAAkB,EAClBC,aAAc,GACdC,aAAc,EACdC,UAAW,GACXvzB,MAAO,OACP+V,SAAS,EACTiT,YAAY,EACZD,aACEp0B,MAAOiE,IAAIlF,OAAW2G,IAAI3G,QAC1BghB,OAAQ9b,IAAIlF,OAAW2G,IAAI3G,SAE7Bw+B,OACEv9B,MAAOiiB,KAAKljB,QACZghB,OAAQkC,KAAKljB,SAEf69B,QACE58B,MAAO61B,SAAU92B,QACjBghB,OAAQ8V,SAAU92B,UAItBvG,KAAK4lC,iBAAmBA,EACxB5lC,KAAKqmC,aAAeV,EACpB3lC,KAAK+F,SACL/F,KAAKsmC,aACHC,SACAC,UACAzB,UAGF/kC,KAAKmwB,OAELnwB,KAAKg2B,OAAS9lB,MAAM,EAAGC,IAAI,GAE3BnQ,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBACpC50B,KAAKymC,iBAAmB,EAExBzmC,KAAKwT,WAAWzE,GAChB/O,KAAK6S,MAAQ5O,QAAQ,GAAKjE,KAAK+O,QAAQ8D,OAAOzG,QAAQ,KAAK,KAC3DpM,KAAK0mC,SAAW1mC,KAAK6S,MACrB7S,KAAK8S,OAAS9S,KAAKqmC,aAAa3V,aAEhC1wB,KAAK2mC,WAAa,GAClB3mC,KAAK4mC,iBAAmB,GACxB5mC,KAAK6mC,aAAe,GAEpB7mC,KAAK8mC,WAAa,EAClB9mC,KAAK+mC,QAAS,EACd/mC,KAAKgnC,eACLhnC,KAAKinC,cAAe,EAGpBjnC,KAAK00B,UACL10B,KAAKknC,eAAiB,EAGtBlnC,KAAKi1B,SAEL,IAAIxgB,GAAKzU,IACTA,MAAKk1B,KAAKE,QAAQvhB,GAAG,eAAgB,WACnCY,EAAG0b,IAAIgX,cAAc35B,MAAM5F,IAAM6M,EAAGygB,KAAKC,SAASiS,UAAY,OAnFlE,GAAIzmC,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9BqC,EAAYrC,EAAoB,IAChC0B,EAAW1B,EAAoB,GAoFnCwC,GAAS+Q,UAAY,GAAIlR,GAIzBG,EAAS+Q,UAAU4zB,SAAW,SAAS1e,EAAO2e,GACvCtnC,KAAK00B,OAAO7uB,eAAe8iB,KAC9B3oB,KAAK00B,OAAO/L,GAAS2e,GAEvBtnC,KAAKknC,gBAAkB,GAGzBxkC,EAAS+Q,UAAU8zB,YAAc,SAAS5e,EAAO2e,GAC/CtnC,KAAK00B,OAAO/L,GAAS2e,GAGvB5kC,EAAS+Q,UAAU+zB,YAAc,SAAS7e,GACpC3oB,KAAK00B,OAAO7uB,eAAe8iB,WACtB3oB,MAAK00B,OAAO/L,GACnB3oB,KAAKknC,gBAAkB,IAK3BxkC,EAAS+Q,UAAUD,WAAa,SAAUzE,GACxC,GAAIA,EAAS,CACX,GAAI4S,IAAS,CACT3hB,MAAK+O,QAAQ+lB,aAAe/lB,EAAQ+lB,aAAuCvuB,SAAxBwI,EAAQ+lB,cAC7DnT,GAAS,EAEX,IAAInT,IACF,cACA,kBACA,kBACA,QACA,mBACA,mBACA,eACA,eACA,YACA,QACA,UACA,cACA,QACA,SACA,aAEF7N,GAAKmF,gBAAgB0I,EAAQxO,KAAK+O,QAASA,GAE3C/O,KAAK0mC,SAAWziC,QAAQ,GAAKjE,KAAK+O,QAAQ8D,OAAOzG,QAAQ,KAAK,KAEhD,GAAVuV,GAAkB3hB,KAAKmwB,IAAI3Q,QAC7Bxf,KAAKynC,OACLznC,KAAK0nC,UASXhlC,EAAS+Q,UAAUwhB,QAAU,WAC3Bj1B,KAAKmwB,IAAI3Q,MAAQ3N,SAASM,cAAc,OACxCnS,KAAKmwB,IAAI3Q,MAAMhS,MAAMqF,MAAQ7S,KAAK+O,QAAQ8D,MAC1C7S,KAAKmwB,IAAI3Q,MAAMhS,MAAMsF,OAAS9S,KAAK8S,OAEnC9S,KAAKmwB,IAAIgX,cAAgBt1B,SAASM,cAAc,OAChDnS,KAAKmwB,IAAIgX,cAAc35B,MAAMqF,MAAQ,OACrC7S,KAAKmwB,IAAIgX,cAAc35B,MAAMsF,OAAS9S,KAAK8S,OAC3C9S,KAAKmwB,IAAIgX,cAAc35B,MAAMsW,SAAW,WAGxC9jB,KAAK2lC,IAAM9zB,SAASC,gBAAgB,6BAA6B,OACjE9R,KAAK2lC,IAAIn4B,MAAMsW,SAAW,WAC1B9jB,KAAK2lC,IAAIn4B,MAAM5F,IAAM,MACrB5H,KAAK2lC,IAAIn4B,MAAMsF,OAAS,OACxB9S,KAAK2lC,IAAIn4B,MAAMqF,MAAQ,OACvB7S,KAAK2lC,IAAIn4B,MAAMm6B,QAAU,QACzB3nC,KAAKmwB,IAAI3Q,MAAMzN,YAAY/R,KAAK2lC,MAGlCjjC,EAAS+Q,UAAUm0B,kBAAoB,WACrChnC,EAAQuQ,gBAAgBnR,KAAKgnC,YAE7B,IAAI30B,GACA+zB,EAAYpmC,KAAK+O,QAAQq3B,UACzByB,EAAa,GACbC,EAAa,EACbx1B,EAAIw1B,EAAa,GAAMD,CAGzBx1B,GAD8B,QAA5BrS,KAAK+O,QAAQ+lB,YACXgT,EAGA9nC,KAAK6S,MAAQuzB,EAAY0B,CAG/B,KAAK,GAAIlQ,KAAW53B,MAAK00B,OACnB10B,KAAK00B,OAAO7uB,eAAe+xB,KACO,GAAhC53B,KAAK00B,OAAOkD,GAAShP,SAAkEriB,SAA9CvG,KAAK4lC,iBAAiB9N,WAAWF,IAAuE,GAA7C53B,KAAK4lC,iBAAiB9N,WAAWF,KACvI53B,KAAK00B,OAAOkD,GAASmQ,SAAS11B,EAAGC,EAAGtS,KAAKgnC,YAAahnC,KAAK2lC,IAAKS,EAAWyB,GAC3Ev1B,GAAKu1B,EAAaC,GAKxBlnC,GAAQ4Q,gBAAgBxR,KAAKgnC,aAC7BhnC,KAAKinC,cAAe,GAGtBvkC,EAAS+Q,UAAUu0B,cAAgB,WACR,GAArBhoC,KAAKinC,eACPrmC,EAAQuQ,gBAAgBnR,KAAKgnC,aAC7BpmC,EAAQ4Q,gBAAgBxR,KAAKgnC,aAC7BhnC,KAAKinC,cAAe,IAOxBvkC,EAAS+Q,UAAUi0B,KAAO,WACnB1nC,KAAKmwB,IAAI3Q,MAAM1V,aACc,QAA5B9J,KAAK+O,QAAQ+lB,YACf90B,KAAKk1B,KAAK/E,IAAI3oB,KAAKuK,YAAY/R,KAAKmwB,IAAI3Q,OAGxCxf,KAAKk1B,KAAK/E,IAAI5I,MAAMxV,YAAY/R,KAAKmwB,IAAI3Q,QAIxCxf,KAAKmwB,IAAIgX,cAAcr9B,YAC1B9J,KAAKk1B,KAAK/E,IAAI8X,qBAAqBl2B,YAAY/R,KAAKmwB,IAAIgX,gBAO5DzkC,EAAS+Q,UAAUg0B,KAAO,WACpBznC,KAAKmwB,IAAI3Q,MAAM1V,YACjB9J,KAAKmwB,IAAI3Q,MAAM1V,WAAW2H,YAAYzR,KAAKmwB,IAAI3Q,OAG7Cxf,KAAKmwB,IAAIgX,cAAcr9B,YACzB9J,KAAKmwB,IAAIgX,cAAcr9B,WAAW2H,YAAYzR,KAAKmwB,IAAIgX,gBAU3DzkC,EAAS+Q,UAAUqgB,SAAW,SAAU5jB,EAAOC,GAC1B,GAAfnQ,KAAK+mC,QAA8C,GAA3B/mC,KAAK+O,QAAQ8sB,YAA2C,IAArB77B,KAAK6mC,cAC9D32B,EAAQ,IACVA,EAAQ,GAGZlQ,KAAKg2B,MAAM9lB,MAAQA,EACnBlQ,KAAKg2B,MAAM7lB,IAAMA,GAOnBzN,EAAS+Q,UAAUkO,OAAS,WAC1B,GAAIumB,IAAe,EACfC,EAAe,CAGnBnoC,MAAKmwB,IAAIgX,cAAc35B,MAAM5F,IAAM5H,KAAKk1B,KAAKC,SAASiS,UAAY,IAElE,KAAK,GAAIxP,KAAW53B,MAAK00B,OACnB10B,KAAK00B,OAAO7uB,eAAe+xB,KACO,GAAhC53B,KAAK00B,OAAOkD,GAAShP,SAAkEriB,SAA9CvG,KAAK4lC,iBAAiB9N,WAAWF,IAAuE,GAA7C53B,KAAK4lC,iBAAiB9N,WAAWF,IACvIuQ,IAIN,IAA2B,GAAvBnoC,KAAKknC,gBAAuC,GAAhBiB,EAC9BnoC,KAAKynC,WAEF,CACHznC,KAAK0nC,OACL1nC,KAAK8S,OAAS7O,OAAOjE,KAAKqmC,aAAa74B,MAAMsF,OAAO1G,QAAQ,KAAK,KAGjEpM,KAAKmwB,IAAIgX,cAAc35B,MAAMsF,OAAS9S,KAAK8S,OAAS,KACpD9S,KAAK6S,MAAgC,GAAxB7S,KAAK+O,QAAQ6Z,QAAkB3kB,QAAQ,GAAKjE,KAAK+O,QAAQ8D,OAAOzG,QAAQ,KAAK,KAAO,CAEjG,IAAIrG,GAAQ/F,KAAK+F,MACbyZ,EAAQxf,KAAKmwB,IAAI3Q,KAGrBA,GAAMzX,UAAY,WAGlB/H,KAAKooC,oBAEL,IAAItT,GAAc90B,KAAK+O,QAAQ+lB,YAC3B+Q,EAAkB7lC,KAAK+O,QAAQ82B,gBAC/BC,EAAkB9lC,KAAK+O,QAAQ+2B,eAGnC//B,GAAMsiC,iBAAmBxC,EAAkB9/B,EAAMuiC,gBAAkB,EACnEviC,EAAMwiC,iBAAmBzC,EAAkB//B,EAAMyiC,gBAAkB,EAEnEziC,EAAM0iC,eAAiBzoC,KAAKk1B,KAAK/E,IAAI8X,qBAAqBzX,YAAcxwB,KAAK8mC,WAAa9mC,KAAK6S,MAAQ,EAAI7S,KAAK+O,QAAQk3B,iBACxHlgC,EAAM2iC,gBAAkB,EACxB3iC,EAAM4iC,eAAiB3oC,KAAKk1B,KAAK/E,IAAI8X,qBAAqBzX,YAAcxwB,KAAK8mC,WAAa9mC,KAAK6S,MAAQ,EAAI7S,KAAK+O,QAAQi3B,iBACxHjgC,EAAM6iC,gBAAkB,EAGL,QAAf9T,GACFtV,EAAMhS,MAAM5F,IAAM,IAClB4X,EAAMhS,MAAMhG,KAAO,IACnBgY,EAAMhS,MAAMgW,OAAS,GACrBhE,EAAMhS,MAAMqF,MAAQ7S,KAAK6S,MAAQ,KACjC2M,EAAMhS,MAAMsF,OAAS9S,KAAK8S,OAAS,OAGnC0M,EAAMhS,MAAM5F,IAAM,GAClB4X,EAAMhS,MAAMgW,OAAS,IACrBhE,EAAMhS,MAAMhG,KAAO,IACnBgY,EAAMhS,MAAMqF,MAAQ7S,KAAK6S,MAAQ,KACjC2M,EAAMhS,MAAMsF,OAAS9S,KAAK8S,OAAS,MAErCo1B,EAAeloC,KAAK6oC,gBAEM,GAAtB7oC,KAAK+O,QAAQg3B,MACf/lC,KAAK4nC,oBAGL5nC,KAAKgoC,gBAGPhoC,KAAK8oC,aAAahU,GAEpB,MAAOoT,IAOTxlC,EAAS+Q,UAAUo1B,cAAgB,WACjCjoC,EAAQuQ,gBAAgBnR,KAAKsmC,YAAYC,OACzC3lC,EAAQuQ,gBAAgBnR,KAAKsmC,YAAYE,OAEzC,IAAI1R,GAAc90B,KAAK+O,QAAqB,YAGxC2sB,EAAc17B,KAAK+mC,OAAS/mC,KAAK+F,MAAMyiC,iBAAmB,GAAKxoC,KAAK4mC,iBAEpEve,EAAO,GAAIzmB,GACb5B,KAAKg2B,MAAM9lB,MACXlQ,KAAKg2B,MAAM7lB,IACXurB,EACA17B,KAAKmwB,IAAI3Q,MAAMkR,aACf1wB,KAAK+O,QAAQ6sB,YAAY57B,KAAK+O,QAAQ+lB,aACvB,GAAf90B,KAAK+mC,QAAmB/mC,KAAK+O,QAAQ8sB,WAGvC77B,MAAKqoB,KAAOA,CAGZ,IAAIse,IAAc3mC,KAAKmwB,IAAI3Q,MAAMkR,aAAgBrI,EAAK6T,WAAal8B,KAAKmwB,IAAI3Q,MAAMkR,aAAerI,EAAK4U,gBAAoB5U,EAAK4U,YAAc5U,EAAK6T,WAAa7T,EAAKA,KAEpKroB,MAAK2mC,WAAaA,CAElB,IAAIoC,GAAgB/oC,KAAK8S,OAAS6zB,EAC9BqC,EAAiB,CAGrB,IAAmB,GAAfhpC,KAAK+mC,OAAiB,CACxBJ,EAAa3mC,KAAK4mC,iBAClBoC,EAAiB/jC,KAAK8oB,MAAO/tB,KAAKmwB,IAAI3Q,MAAMkR,aAAeiW,EAAcoC,EACzE,KAAK,GAAIxjC,GAAI,EAAO,GAAMyjC,EAAVzjC,EAA0BA,IACxC8iB,EAAK+U,UAIP,IAFA2L,EAAgB/oC,KAAK8S,OAAS6zB,EAEL,IAArB3mC,KAAK6mC,cAAiD,GAA3B7mC,KAAK+O,QAAQ8sB,WAAoB,CAC9D,GAAIoN,GAAsB5gB,EAAK4T,UAAY5T,EAAKA,KAAQroB,KAAK6mC,YAC7D,IAAIoC,EAAqB,EACvB,IAAK,GAAI1jC,GAAI,EAAO0jC,EAAJ1jC,EAAwBA,IAAM8iB,EAAKE,WAEhD,IAAyB,EAArB0gB,EACP,IAAK,GAAI1jC,GAAI,GAAQ0jC,EAAL1jC,EAAyBA,IAAM8iB,EAAK+U,gBAKxD2L,IAAiB,GAInB/oC,MAAKkpC,YAAc7gB,EAAK4T,SACxB,IAMIoB,GANA8L,EAAiB,EAGjBj8B,EAAM,CAI8B3G,UAArCvG,KAAK+O,QAAQq1B,OAAOtP,KACrBuI,EAAWr9B,KAAK+O,QAAQq1B,OAAOtP,GAAauI,UAG9Cr9B,KAAKopC,aAAe,CAEpB,KADA,GAAI92B,GAAI,EACDpF,EAAMjI,KAAK8oB,MAAMgb,IAAgB,CACtC1gB,EAAKE,OACLjW,EAAIrN,KAAK8oB,MAAM7gB,EAAMy5B,GACrBwC,EAAiBj8B,EAAMy5B,CACvB,IAAIlJ,GAAUpV,EAAKoV,WAEfz9B,KAAK+O,QAAyB,iBAAgB,GAAX0uB,GAAmC,GAAfz9B,KAAK+mC,QAAsD,GAAnC/mC,KAAK+O,QAAyB,kBAC/G/O,KAAKqpC,aAAa/2B,EAAI,EAAG+V,EAAKC,WAAW+U,GAAWvI,EAAa,cAAe90B,KAAK+F,MAAMuiC,iBAGzF7K,GAAWz9B,KAAK+O,QAAyB,iBAAoB,GAAf/O,KAAK+mC,QAChB,GAAnC/mC,KAAK+O,QAAyB,iBAA6B,GAAf/O,KAAK+mC,QAA8B,GAAXtJ,GAClEnrB,GAAK,GACPtS,KAAKqpC,aAAa/2B,EAAI,EAAG+V,EAAKC,WAAW+U,GAAWvI,EAAa,cAAe90B,KAAK+F,MAAMyiC,iBAE7FxoC,KAAKspC,YAAYh3B,EAAGwiB,EAAa,wBAAyB90B,KAAK+O,QAAQi3B,iBAAkBhmC,KAAK+F,MAAM4iC,iBAGpG3oC,KAAKspC,YAAYh3B,EAAGwiB,EAAa,wBAAyB90B,KAAK+O,QAAQk3B,iBAAkBjmC,KAAK+F,MAAM0iC,gBAGnF,GAAfzoC,KAAK+mC,QAAkC,GAAhB1e,EAAK+R,UAC9Bp6B,KAAK6mC,aAAe35B,GAGtBA,IAIAlN,KAAKymC,iBADY,GAAfzmC,KAAK+mC,OACiBz0B,GAAKtS,KAAKkpC,YAAc7gB,EAAK+R,SAG7Bp6B,KAAKmwB,IAAI3Q,MAAMkR,aAAerI,EAAK4U,WAI7D,IAAIsM,GAAa,CACuBhjC,UAApCvG,KAAK+O,QAAQg2B,MAAMjQ,IAAuEvuB,SAAzCvG,KAAK+O,QAAQg2B,MAAMjQ,GAAarL,OACnF8f,EAAavpC,KAAK+F,MAAMyjC,gBAE1B,IAAI3f,GAA+B,GAAtB7pB,KAAK+O,QAAQg3B,MAAgB9gC,KAAKiI,IAAIlN,KAAK+O,QAAQq3B,UAAWmD,GAAcvpC,KAAK+O,QAAQm3B,aAAe,GAAKqD,EAAavpC,KAAK+O,QAAQm3B,aAAe,EAGnK,OAAIlmC,MAAKopC,aAAgBppC,KAAK6S,MAAQgX,GAAmC,GAAxB7pB,KAAK+O,QAAQ6Z,SAC5D5oB,KAAK6S,MAAQ7S,KAAKopC,aAAevf,EACjC7pB,KAAK+O,QAAQ8D,MAAQ7S,KAAK6S,MAAQ,KAClCjS,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYC,OACzC3lC,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYE,QACzCxmC,KAAK2hB,UACE,GAGA3hB,KAAKopC,aAAgBppC,KAAK6S,MAAQgX,GAAmC,GAAxB7pB,KAAK+O,QAAQ6Z,SAAmB5oB,KAAK6S,MAAQ7S,KAAK0mC,UACtG1mC,KAAK6S,MAAQ5N,KAAKiI,IAAIlN,KAAK0mC,SAAS1mC,KAAKopC,aAAevf,GACxD7pB,KAAK+O,QAAQ8D,MAAQ7S,KAAK6S,MAAQ,KAClCjS,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYC,OACzC3lC,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYE,QACzCxmC,KAAK2hB,UACE,IAGP/gB,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYC,OACzC3lC,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYE,SAClC,IAIX9jC,EAAS+Q,UAAUg2B,aAAe,SAAUriC,GAC1C,GAAIsiC,GAAgB1pC,KAAKkpC,YAAc9hC,EACnCuiC,EAAiBD,EAAgB1pC,KAAKymC,gBAC1C,OAAOkD,IAYTjnC,EAAS+Q,UAAU41B,aAAe,SAAU/2B,EAAGmX,EAAMqL,EAAa/sB,EAAW6hC,GAE3E,GAAIjhB,GAAQ/nB,EAAQoR,cAAc,MAAMhS,KAAKsmC,YAAYE,OAAQxmC,KAAKmwB,IAAI3Q,MAC1EmJ,GAAM5gB,UAAYA,EAClB4gB,EAAMxE,UAAYsF,EACC,QAAfqL,GACFnM,EAAMnb,MAAMhG,KAAO,IAAMxH,KAAK+O,QAAQm3B,aAAe,KACrDvd,EAAMnb,MAAMgb,UAAY,UAGxBG,EAAMnb,MAAM+Z,MAAQ,IAAMvnB,KAAK+O,QAAQm3B,aAAe,KACtDvd,EAAMnb,MAAMgb,UAAY,QAG1BG,EAAMnb,MAAM5F,IAAM0K,EAAI,GAAMs3B,EAAkB5pC,KAAK+O,QAAQo3B,aAAe,KAE1E1c,GAAQ,EAER,IAAIogB,GAAe5kC,KAAKiI,IAAIlN,KAAK+F,MAAM+jC,eAAe9pC,KAAK+F,MAAMgkC,eAC7D/pC,MAAKopC,aAAe3f,EAAK/jB,OAASmkC,IACpC7pC,KAAKopC,aAAe3f,EAAK/jB,OAASmkC,IAYtCnnC,EAAS+Q,UAAU61B,YAAc,SAAUh3B,EAAGwiB,EAAa/sB,EAAW8hB,EAAQhX,GAC5E,GAAmB,GAAf7S,KAAK+mC,OAAgB,CACvB,GAAI9W,GAAOrvB,EAAQoR,cAAc,MAAMhS,KAAKsmC,YAAYC,MAAOvmC,KAAKmwB,IAAIgX,cACxElX,GAAKloB,UAAYA,EACjBkoB,EAAK9L,UAAY,GAEE,QAAf2Q,EACF7E,EAAKziB,MAAMhG,KAAQxH,KAAK6S,MAAQgX,EAAU,KAG1CoG,EAAKziB,MAAM+Z,MAASvnB,KAAK6S,MAAQgX,EAAU,KAG7CoG,EAAKziB,MAAMqF,MAAQA,EAAQ,KAC3Bod,EAAKziB,MAAM5F,IAAM0K,EAAI,OASzB5P,EAAS+Q,UAAUq1B,aAAe,SAAUhU,GAI1C,GAHAl0B,EAAQuQ,gBAAgBnR,KAAKsmC,YAAYvB,OAGDx+B,SAApCvG,KAAK+O,QAAQg2B,MAAMjQ,IAAuEvuB,SAAzCvG,KAAK+O,QAAQg2B,MAAMjQ,GAAarL,KAAoB,CACvG,GAAIsb,GAAQnkC,EAAQoR,cAAc,MAAOhS,KAAKsmC,YAAYvB,MAAO/kC,KAAKmwB,IAAI3Q,MAC1EulB,GAAMh9B,UAAY,eAAiB+sB,EACnCiQ,EAAM5gB,UAAYnkB,KAAK+O,QAAQg2B,MAAMjQ,GAAarL,KAGJljB,SAA1CvG,KAAK+O,QAAQg2B,MAAMjQ,GAAatnB,OAClC7M,EAAKkN,WAAWk3B,EAAO/kC,KAAK+O,QAAQg2B,MAAMjQ,GAAatnB,OAGtC,QAAfsnB,EACFiQ,EAAMv3B,MAAMhG,KAAOxH,KAAK+F,MAAMyjC,gBAAkB,KAGhDzE,EAAMv3B,MAAM+Z,MAAQvnB,KAAK+F,MAAMyjC,gBAAkB,KAGnDzE,EAAMv3B,MAAMqF,MAAQ7S,KAAK8S,OAAS,KAIpClS,EAAQ4Q,gBAAgBxR,KAAKsmC,YAAYvB,QAW3CriC,EAAS+Q,UAAU20B,mBAAqB,WAEtC,KAAM,mBAAqBpoC,MAAK+F,OAAQ,CACtC,GAAIikC,GAAYn4B,SAASo4B,eAAe,KACpCC,EAAmBr4B,SAASM,cAAc,MAC9C+3B,GAAiBniC,UAAY,sBAC7BmiC,EAAiBn4B,YAAYi4B,GAC7BhqC,KAAKmwB,IAAI3Q,MAAMzN,YAAYm4B,GAE3BlqC,KAAK+F,MAAMuiC,gBAAkB4B,EAAiBnlB,aAC9C/kB,KAAK+F,MAAMgkC,eAAiBG,EAAiBxqB,YAE7C1f,KAAKmwB,IAAI3Q,MAAM/N,YAAYy4B,GAG7B,KAAM,mBAAqBlqC,MAAK+F,OAAQ,CACtC,GAAIokC,GAAYt4B,SAASo4B,eAAe,KACpCG,EAAmBv4B,SAASM,cAAc,MAC9Ci4B,GAAiBriC,UAAY,sBAC7BqiC,EAAiBr4B,YAAYo4B,GAC7BnqC,KAAKmwB,IAAI3Q,MAAMzN,YAAYq4B,GAE3BpqC,KAAK+F,MAAMyiC,gBAAkB4B,EAAiBrlB,aAC9C/kB,KAAK+F,MAAM+jC,eAAiBM,EAAiB1qB,YAE7C1f,KAAKmwB,IAAI3Q,MAAM/N,YAAY24B,GAG7B,KAAM,mBAAqBpqC,MAAK+F,OAAQ,CACtC,GAAIskC,GAAYx4B,SAASo4B,eAAe,KACpCK,EAAmBz4B,SAASM,cAAc,MAC9Cm4B,GAAiBviC,UAAY,sBAC7BuiC,EAAiBv4B,YAAYs4B,GAC7BrqC,KAAKmwB,IAAI3Q,MAAMzN,YAAYu4B,GAE3BtqC,KAAK+F,MAAMyjC,gBAAkBc,EAAiBvlB,aAC9C/kB,KAAK+F,MAAMwkC,eAAiBD,EAAiB5qB,YAE7C1f,KAAKmwB,IAAI3Q,MAAM/N,YAAY64B,KAU/B5nC,EAAS+Q,UAAU8hB,KAAO,SAASwD,GACjC,MAAO/4B,MAAKqoB,KAAKkN,KAAKwD,IAGxBl5B,EAAOD,QAAU8C,GAKb,SAAS7C,EAAQD,EAASM,GAkB9B,QAASyC,GAAY4P,EAAOqlB,EAAS7oB,EAASy7B,GAC5CxqC,KAAKK,GAAKu3B,CACV,IAAIppB,IAAU,WAAW,QAAQ,OAAO,mBAAmB,WAAW,aAAa,SAAS,aAC5FxO,MAAK+O,QAAUpO,EAAK4N,sBAAsBC,EAAOO,GACjD/O,KAAKyqC,kBAAwClkC,SAApBgM,EAAMxK,UAC/B/H,KAAKwqC,yBAA2BA,EAChCxqC,KAAK0qC,aAAe,EACpB1qC,KAAKmV,OAAO5C,GACkB,GAA1BvS,KAAKyqC,oBACPzqC,KAAKwqC,yBAAyB,IAAM,GAEtCxqC,KAAKq2B,aACLr2B,KAAK4oB,QAA4BriB,SAAlBgM,EAAMqW,SAAwB,EAAOrW,EAAMqW,QA5B5D,GAAIjoB,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9ByqC,EAAOzqC,EAAoB,IAC3B0qC,EAAM1qC,EAAoB,IAC1B2qC,EAAS3qC,EAAoB,GAgCjCyC,GAAW8Q,UAAU+iB,SAAW,SAASv0B,GAC1B,MAATA,GACFjC,KAAKq2B,UAAYp0B,EACQ,GAArBjC,KAAK+O,QAAQ0H,MACfzW,KAAKq2B,UAAU5f,KAAK,SAAUnR,EAAEa,GAAI,MAAOb,GAAE+M,EAAIlM,EAAEkM,KAIrDrS,KAAKq2B,cAST1zB,EAAW8Q,UAAUq3B,gBAAkB,SAASrlB,GAC9CzlB,KAAK0qC,aAAejlB,GAQtB9iB,EAAW8Q,UAAUD,WAAa,SAASzE,GACzC,GAAgBxI,SAAZwI,EAAuB,CACzB,GAAIP,IAAU,WAAW,QAAQ,OAAO,mBAAmB,WAC3D7N,GAAKuF,oBAAoBsI,EAAQxO,KAAK+O,QAASA,GAE/CpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,cACxCpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,cACxCpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,UAEpCA,EAAQg8B,YACuB,gBAAtBh8B,GAAQg8B,YACbh8B,EAAQg8B,WAAWC,kBACqB,WAAtCj8B,EAAQg8B,WAAWC,gBACrBhrC,KAAK+O,QAAQg8B,WAAWE,MAAQ,EAEa,WAAtCl8B,EAAQg8B,WAAWC,gBAC1BhrC,KAAK+O,QAAQg8B,WAAWE,MAAQ,GAGhCjrC,KAAK+O,QAAQg8B,WAAWC,gBAAkB,cAC1ChrC,KAAK+O,QAAQg8B,WAAWE,MAAQ,KAOhB,QAAtBjrC,KAAK+O,QAAQvB,MACfxN,KAAK6G,KAAO,GAAI8jC,GAAK3qC,KAAKK,GAAIL,KAAK+O,SAEN,OAAtB/O,KAAK+O,QAAQvB,MACpBxN,KAAK6G,KAAO,GAAI+jC,GAAI5qC,KAAKK,GAAIL,KAAK+O,SAEL,UAAtB/O,KAAK+O,QAAQvB,QACpBxN,KAAK6G,KAAO,GAAIgkC,GAAO7qC,KAAKK,GAAIL,KAAK+O,WASzCpM,EAAW8Q,UAAU0B,OAAS,SAAS5C,GACrCvS,KAAKuS,MAAQA,EACbvS,KAAKgwB,QAAUzd,EAAMyd,SAAW,QAChChwB,KAAK+H,UAAYwK,EAAMxK,WAAa/H,KAAK+H,WAAa,aAAe/H,KAAKwqC,yBAAyB,GAAK,GACxGxqC,KAAK4oB,QAA4BriB,SAAlBgM,EAAMqW,SAAwB,EAAOrW,EAAMqW,QAC1D5oB,KAAKwN,MAAQ+E,EAAM/E,MACnBxN,KAAKwT,WAAWjB,EAAMxD,UAcxBpM,EAAW8Q,UAAUs0B,SAAW,SAAS11B,EAAGC,EAAGlB,EAAe85B,EAAc9E,EAAWyB,GACrF,GACIsD,GAAMC,EADNC,EAA0B,GAAbxD,EAGbyD,EAAU1qC,EAAQ8Q,cAAc,OAAQN,EAAe85B,EAO3D,IANAI,EAAQ54B,eAAe,KAAM,IAAKL,GAClCi5B,EAAQ54B,eAAe,KAAM,IAAKJ,EAAI+4B,GACtCC,EAAQ54B,eAAe,KAAM,QAAS0zB,GACtCkF,EAAQ54B,eAAe,KAAM,SAAU,EAAE24B,GACzCC,EAAQ54B,eAAe,KAAM,QAAS,WAEZ,QAAtB1S,KAAK+O,QAAQvB,MACf29B,EAAOvqC,EAAQ8Q,cAAc,OAAQN,EAAe85B,GACpDC,EAAKz4B,eAAe,KAAM,QAAS1S,KAAK+H,WACtBxB,SAAfvG,KAAKwN,OACN29B,EAAKz4B,eAAe,KAAM,QAAS1S,KAAKwN,OAG1C29B,EAAKz4B,eAAe,KAAM,IAAK,IAAML,EAAI,IAAIC,EAAE,MAAQD,EAAI+zB,GAAa,IAAI9zB,GACzC,GAA/BtS,KAAK+O,QAAQw8B,OAAOv8B,UACtBo8B,EAAWxqC,EAAQ8Q,cAAc,OAAQN,EAAe85B,GACjB,OAAnClrC,KAAK+O,QAAQw8B,OAAOzW,YACtBsW,EAAS14B,eAAe,KAAM,IAAK,IAAIL,EAAE,MAAQC,EAAI+4B,GACnD,IAAIh5B,EAAE,IAAIC,EAAE,MAAOD,EAAI+zB,GAAa,IAAI9zB,EAAE,MAAOD,EAAI+zB,GAAa,KAAO9zB,EAAI+4B,IAG/ED,EAAS14B,eAAe,KAAM,IAAK,IAAIL,EAAE,IAAIC,EAAE,KACzCD,EAAE,KAAOC,EAAI+4B,GAAc,MACzBh5B,EAAI+zB,GAAa,KAAO9zB,EAAI+4B,GAClC,KAAMh5B,EAAI+zB,GAAa,IAAI9zB,GAE/B84B,EAAS14B,eAAe,KAAM,QAAS1S,KAAK+H,UAAY,cAGnB,GAAnC/H,KAAK+O,QAAQ0D,WAAWzD,SAC1BpO,EAAQwR,UAAUC,EAAI,GAAM+zB,EAAU9zB,EAAGtS,KAAMoR,EAAe85B,OAG7D,CACH,GAAIM,GAAWvmC,KAAK8oB,MAAM,GAAMqY,GAC5BqF,EAAaxmC,KAAK8oB,MAAM,GAAM8Z,GAC9B6D,EAAazmC,KAAK8oB,MAAM,IAAO8Z,GAE/Bhe,EAAS5kB,KAAK8oB,OAAOqY,EAAa,EAAIoF,GAAW,EAErD5qC,GAAQgS,QAAQP,EAAI,GAAIm5B,EAAW3hB,EAAYvX,EAAI+4B,EAAaI,EAAa,EAAGD,EAAUC,EAAYzrC,KAAK+H,UAAY,OAAQqJ,EAAe85B,GAC9ItqC,EAAQgS,QAAQP,EAAI,IAAIm5B,EAAW3hB,EAAS,EAAGvX,EAAI+4B,EAAaK,EAAa,EAAGF,EAAUE,EAAY1rC,KAAK+H,UAAY,OAAQqJ,EAAe85B,KAYlJvoC,EAAW8Q,UAAUkkB,UAAY,SAASyO,EAAWyB,GACnD,GAAIlC,GAAM9zB,SAASC,gBAAgB,6BAA6B,MAEhE,OADA9R,MAAK+nC,SAAS,EAAE,GAAIF,KAAclC,EAAIS,EAAUyB,IACxC8D,KAAMhG,EAAKhd,MAAO3oB,KAAKgwB,QAAS8E,YAAY90B,KAAK+O,QAAQ68B,mBAGnEjpC,EAAW8Q,UAAUo4B,UAAY,SAASC,GACxC,MAAO9rC,MAAK6G,KAAKglC,UAAUC,IAG7BnpC,EAAW8Q,UAAUs4B,KAAO,SAASzU,EAAS/kB,EAAOy5B,GACnDhsC,KAAK6G,KAAKklC,KAAKzU,EAAS/kB,EAAOy5B,IAIjCnsC,EAAOD,QAAU+C,GAKb,SAAS9C,EAAQD,EAASM,GAY9B,QAAS0C,GAAOg1B,EAAS5kB,EAAMojB,GAC7Bp2B,KAAK43B,QAAUA,EACf53B,KAAK4hC,aACL5hC,KAAKisC,cAAgB,EACrBjsC,KAAKksC,gBAAkBl5B,GAAQA,EAAKm5B,cACpCnsC,KAAKo2B,QAAUA,EAEfp2B,KAAKmwB,OACLnwB,KAAK+F,OACH4iB,OACE9V,MAAO,EACPC,OAAQ,IAGZ9S,KAAK+H,UAAY,KAEjB/H,KAAKiC,SACLjC,KAAKosC,gBACLpsC,KAAKkP,cACHm9B,WACAC,UAEFtsC,KAAKusC,kBAAmB,CACxB,IAAI93B,GAAKzU,IACTA,MAAKo2B,QAAQlB,KAAKE,QAAQvhB,GAAG,mBAAoB,WAC/CY,EAAG83B,kBAAmB,IAGxBvsC,KAAKi1B,UAELj1B,KAAKuY,QAAQvF,GAxCf,CAAA,GAAIrS,GAAOT,EAAoB,GAC3B4B,EAAQ5B,EAAoB,GAChBA,GAAoB,IA6CpC0C,EAAM6Q,UAAUwhB,QAAU,WACxB,GAAItM,GAAQ9W,SAASM,cAAc,MACnCwW,GAAM5gB,UAAY,SAClB/H,KAAKmwB,IAAIxH,MAAQA,CAEjB,IAAI6jB,GAAQ36B,SAASM,cAAc,MACnCq6B,GAAMzkC,UAAY,QAClB4gB,EAAM5W,YAAYy6B,GAClBxsC,KAAKmwB,IAAIqc,MAAQA,CAEjB,IAAIC,GAAa56B,SAASM,cAAc,MACxCs6B,GAAW1kC,UAAY,QACvB0kC,EAAW,kBAAoBzsC,KAC/BA,KAAKmwB,IAAIsc,WAAaA,EAEtBzsC,KAAKmwB,IAAIrkB,WAAa+F,SAASM,cAAc,OAC7CnS,KAAKmwB,IAAIrkB,WAAW/D,UAAY,QAEhC/H,KAAKmwB,IAAIoR,KAAO1vB,SAASM,cAAc,OACvCnS,KAAKmwB,IAAIoR,KAAKx5B,UAAY,QAK1B/H,KAAKmwB,IAAIuc,OAAS76B,SAASM,cAAc,OACzCnS,KAAKmwB,IAAIuc,OAAOl/B,MAAMsqB,WAAa,SACnC93B,KAAKmwB,IAAIuc,OAAOvoB,UAAY,IAC5BnkB,KAAKmwB,IAAIrkB,WAAWiG,YAAY/R,KAAKmwB,IAAIuc,SAO3C9pC,EAAM6Q,UAAU8E,QAAU,SAASvF,GAEjC,GAAIgd,GAAUhd,GAAQA,EAAKgd,OACvBA,aAAmB2c,SACrB3sC,KAAKmwB,IAAIqc,MAAMz6B,YAAYie,GAG3BhwB,KAAKmwB,IAAIqc,MAAMroB,UADI5d,SAAZypB,GAAqC,OAAZA,EACLA,EAGAhwB,KAAK43B,SAAW,GAI7C53B,KAAKmwB,IAAIxH,MAAMoc,MAAQ/xB,GAAQA,EAAK+xB,OAAS,GAExC/kC,KAAKmwB,IAAIqc,MAAM3oB,WAIlBljB,EAAKyH,gBAAgBpI,KAAKmwB,IAAIqc,MAAO,UAHrC7rC,EAAKmH,aAAa9H,KAAKmwB,IAAIqc,MAAO,SAOpC,IAAIzkC,GAAYiL,GAAQA,EAAKjL,WAAa,IACtCA,IAAa/H,KAAK+H,YAChB/H,KAAK+H,YACPpH,EAAKyH,gBAAgBpI,KAAKmwB,IAAIxH,MAAO3oB,KAAK+H,WAC1CpH,EAAKyH,gBAAgBpI,KAAKmwB,IAAIsc,WAAYzsC,KAAK+H,WAC/CpH,EAAKyH,gBAAgBpI,KAAKmwB,IAAIrkB,WAAY9L,KAAK+H,WAC/CpH,EAAKyH,gBAAgBpI,KAAKmwB,IAAIoR,KAAMvhC,KAAK+H,YAE3CpH,EAAKmH,aAAa9H,KAAKmwB,IAAIxH,MAAO5gB,GAClCpH,EAAKmH,aAAa9H,KAAKmwB,IAAIsc,WAAY1kC,GACvCpH,EAAKmH,aAAa9H,KAAKmwB,IAAIrkB,WAAY/D,GACvCpH,EAAKmH,aAAa9H,KAAKmwB,IAAIoR,KAAMx5B,GACjC/H,KAAK+H,UAAYA,GAIf/H,KAAKwN,QACP7M,EAAKqN,cAAchO,KAAKmwB,IAAIxH,MAAO3oB,KAAKwN,OACxCxN,KAAKwN,MAAQ,MAEXwF,GAAQA,EAAKxF,QACf7M,EAAKkN,WAAW7N,KAAKmwB,IAAIxH,MAAO3V,EAAKxF,OACrCxN,KAAKwN,MAAQwF,EAAKxF,QAQtB5K,EAAM6Q,UAAUm5B,cAAgB,WAC9B,MAAO5sC,MAAK+F,MAAM4iB,MAAM9V,OAW1BjQ,EAAM6Q,UAAUkO,OAAS,SAASqU,EAAO/b,EAAQ4yB,GAC/C,GAAItI,IAAU,CAEdvkC,MAAKosC,aAAepsC,KAAK8sC,oBAAoB9sC,KAAKkP,aAAclP,KAAKosC,aAAcpW,EAInF,IAAI+W,GAAe/sC,KAAKmwB,IAAIuc,OAAO3nB,YAC/BgoB,IAAgB/sC,KAAKgtC,mBACvBhtC,KAAKgtC,iBAAmBD,EAExBpsC,EAAK4H,QAAQvI,KAAKiC,MAAO,SAAU0N,GACjCA,EAAKs9B,OAAQ,EACTt9B,EAAKu9B,WAAWv9B,EAAKgS,WAG3BkrB,GAAU,GAIR7sC,KAAKo2B,QAAQrnB,QAAQjN,MACvBA,EAAMA,MAAM9B,KAAKosC,aAAcnyB,EAAQ4yB,GAGvC/qC,EAAM6/B,QAAQ3hC,KAAKosC,aAAcnyB,EAAQja,KAAK4hC,UAIhD,IAAI9uB,GAAS9S,KAAKmtC,iBAAiBlzB,GAG/BwyB,EAAazsC,KAAKmwB,IAAIsc,UAC1BzsC,MAAK4H,IAAM6kC,EAAWW,UACtBptC,KAAKwH,KAAOilC,EAAWY,WACvBrtC,KAAK6S,MAAQ45B,EAAWjc,YACxB+T,EAAU5jC,EAAKgI,eAAe3I,KAAM,SAAU8S,IAAWyxB,EAGzDA,EAAU5jC,EAAKgI,eAAe3I,KAAK+F,MAAM4iB,MAAO,QAAS3oB,KAAKmwB,IAAIqc,MAAM9sB,cAAgB6kB,EACxFA,EAAU5jC,EAAKgI,eAAe3I,KAAK+F,MAAM4iB,MAAO,SAAU3oB,KAAKmwB,IAAIqc,MAAMznB,eAAiBwf,EAG1FvkC,KAAKmwB,IAAIrkB,WAAW0B,MAAMsF,OAAUA,EAAS,KAC7C9S,KAAKmwB,IAAIsc,WAAWj/B,MAAMsF,OAAUA,EAAS,KAC7C9S,KAAKmwB,IAAIxH,MAAMnb,MAAMsF,OAASA,EAAS,IAGvC,KAAK,GAAIvN,GAAI,EAAG+nC,EAAKttC,KAAKosC,aAAa1mC,OAAY4nC,EAAJ/nC,EAAQA,IAAK,CAC1D,GAAIoK,GAAO3P,KAAKosC,aAAa7mC,EAC7BoK,GAAK49B,YAAYtzB,GAGnB,MAAOsqB,IAST3hC,EAAM6Q,UAAU05B,iBAAmB,SAAUlzB,GAE3C,GAAInH,GACAs5B,EAAepsC,KAAKosC,YAGxBpsC,MAAKwtC,gBACL,IAAI/4B,GAAKzU,IACT,IAAIosC,EAAa1mC,OAAQ,CACvB,GAAI+F,GAAM2gC,EAAa,GAAGxkC,IACtBsF,EAAMk/B,EAAa,GAAGxkC,IAAMwkC,EAAa,GAAGt5B,MAahD,IAZAnS,EAAK4H,QAAQ6jC,EAAc,SAAUz8B,GACnClE,EAAMxG,KAAKwG,IAAIA,EAAKkE,EAAK/H,KACzBsF,EAAMjI,KAAKiI,IAAIA,EAAMyC,EAAK/H,IAAM+H,EAAKmD,QACVvM,SAAvBoJ,EAAKqD,KAAK8uB,WACZrtB,EAAGmtB,UAAUjyB,EAAKqD,KAAK8uB,UAAUhvB,OAAS7N,KAAKiI,IAAIuH,EAAGmtB,UAAUjyB,EAAKqD,KAAK8uB,UAAUhvB,OAAOnD,EAAKmD,QAChG2B,EAAGmtB,UAAUjyB,EAAKqD,KAAK8uB,UAAUlZ,SAAU,KAO3Cnd,EAAMwO,EAAOsnB,KAAM,CAErB,GAAI1X,GAASpe,EAAMwO,EAAOsnB,IAC1Br0B,IAAO2c,EACPlpB,EAAK4H,QAAQ6jC,EAAc,SAAUz8B,GACnCA,EAAK/H,KAAOiiB,IAGhB/W,EAAS5F,EAAM+M,EAAOtK,KAAKgW,SAAW,MAGtC7S,GAASmH,EAAOsnB,KAAOtnB,EAAOtK,KAAKgW,QAIrC,OAFA7S,GAAS7N,KAAKiI,IAAI4F,EAAQ9S,KAAK+F,MAAM4iB,MAAM7V,SAQ7ClQ,EAAM6Q,UAAUi0B,KAAO,WAChB1nC,KAAKmwB,IAAIxH,MAAM7e,YAClB9J,KAAKo2B,QAAQjG,IAAIsd,SAAS17B,YAAY/R,KAAKmwB,IAAIxH,OAG5C3oB,KAAKmwB,IAAIsc,WAAW3iC,YACvB9J,KAAKo2B,QAAQjG,IAAIsc,WAAW16B,YAAY/R,KAAKmwB,IAAIsc,YAG9CzsC,KAAKmwB,IAAIrkB,WAAWhC,YACvB9J,KAAKo2B,QAAQjG,IAAIrkB,WAAWiG,YAAY/R,KAAKmwB,IAAIrkB,YAG9C9L,KAAKmwB,IAAIoR,KAAKz3B,YACjB9J,KAAKo2B,QAAQjG,IAAIoR,KAAKxvB,YAAY/R,KAAKmwB,IAAIoR,OAO/C3+B,EAAM6Q,UAAUg0B,KAAO,WACrB,GAAI9e,GAAQ3oB,KAAKmwB,IAAIxH,KACjBA,GAAM7e,YACR6e,EAAM7e,WAAW2H,YAAYkX,EAG/B,IAAI8jB,GAAazsC,KAAKmwB,IAAIsc,UACtBA,GAAW3iC,YACb2iC,EAAW3iC,WAAW2H,YAAYg7B,EAGpC,IAAI3gC,GAAa9L,KAAKmwB,IAAIrkB,UACtBA,GAAWhC,YACbgC,EAAWhC,WAAW2H,YAAY3F,EAGpC,IAAIy1B,GAAOvhC,KAAKmwB,IAAIoR,IAChBA,GAAKz3B,YACPy3B,EAAKz3B,WAAW2H,YAAY8vB,IAQhC3+B,EAAM6Q,UAAUF,IAAM,SAAS5D,GAc7B,GAbA3P,KAAKiC,MAAM0N,EAAKtP,IAAMsP,EACtBA,EAAK+9B,UAAU1tC,MAGYuG,SAAvBoJ,EAAKqD,KAAK8uB,WAC+Bv7B,SAAvCvG,KAAK4hC,UAAUjyB,EAAKqD,KAAK8uB,YAC3B9hC,KAAK4hC,UAAUjyB,EAAKqD,KAAK8uB,WAAahvB,OAAO,EAAG8V,SAAS,EAAOvgB,MAAMrI,KAAKisC,cAAehqC,UAC1FjC,KAAKisC,iBAEPjsC,KAAK4hC,UAAUjyB,EAAKqD,KAAK8uB,UAAU7/B,MAAMiG,KAAKyH,IAEhD3P,KAAK2tC,iBAEkC,IAAnC3tC,KAAKosC,aAAa1lC,QAAQiJ,GAAa,CACzC,GAAIqmB,GAAQh2B,KAAKo2B,QAAQlB,KAAKc,KAC9Bh2B,MAAK4tC,gBAAgBj+B,EAAM3P,KAAKosC,aAAcpW,KAIlDpzB,EAAM6Q,UAAUk6B,eAAiB,WAC/B,GAA6BpnC,SAAzBvG,KAAKksC,gBAA+B,CACtC,GAAI2B,KACJ,IAAmC,gBAAxB7tC,MAAKksC,gBAA6B,CAC3C,IAAK,GAAIpK,KAAY9hC,MAAK4hC,UACxBiM,EAAU3lC,MAAM45B,SAAUA,EAAUgM,UAAW9tC,KAAK4hC,UAAUE,GAAU7/B,MAAM,GAAG+Q,KAAKhT,KAAKksC,kBAE7F2B,GAAUp3B,KAAK,SAAUnR,EAAGa,GAC1B,MAAOb,GAAEwoC,UAAY3nC,EAAE2nC,gBAGtB,IAAmC,kBAAxB9tC,MAAKksC,gBAA+B,CAClD,IAAK,GAAIpK,KAAY9hC,MAAK4hC,UACxBiM,EAAU3lC,KAAKlI,KAAK4hC,UAAUE,GAAU7/B,MAAM,GAAG+Q,KAEnD66B,GAAUp3B,KAAKzW,KAAKksC,iBAGtB,GAAI2B,EAAUnoC,OAAS,EACrB,IAAK,GAAIH,GAAI,EAAGA,EAAIsoC,EAAUnoC,OAAQH,IACpCvF,KAAK4hC,UAAUiM,EAAUtoC,GAAGu8B,UAAUz5B,MAAQ9C,IAMtD3C,EAAM6Q,UAAU+5B,eAAiB,WAC/B,IAAK,GAAI1L,KAAY9hC,MAAK4hC,UACpB5hC,KAAK4hC,UAAU/7B,eAAei8B,KAChC9hC,KAAK4hC,UAAUE,GAAUlZ,SAAU,IASzChmB,EAAM6Q,UAAUmD,OAAS,SAASjH,SACzB3P,MAAKiC,MAAM0N,EAAKtP,IACvBsP,EAAK+9B,UAAU,KAGf,IAAIrlC,GAAQrI,KAAKosC,aAAa1lC,QAAQiJ,EACzB,KAATtH,GAAarI,KAAKosC,aAAa9jC,OAAOD,EAAO,IAUnDzF,EAAM6Q,UAAUs6B,kBAAoB,SAASp+B,GAC3C3P,KAAKo2B,QAAQ4X,WAAWr+B,EAAKtP,KAO/BuC,EAAM6Q,UAAUsC,MAAQ,WAKtB,IAAK,GAJDrN,GAAQ/H,EAAK8H,QAAQzI,KAAKiC,OAC1BgsC,KACAC,KAEK3oC,EAAI,EAAGA,EAAImD,EAAMhD,OAAQH,IACNgB,SAAtBmC,EAAMnD,GAAGyN,KAAK7C,KAChB+9B,EAAShmC,KAAKQ,EAAMnD,IAEtB0oC,EAAW/lC,KAAKQ,EAAMnD,GAExBvF;KAAKkP,cACHm9B,QAAS4B,EACT3B,MAAO4B,GAGTpsC,EAAMm/B,aAAajhC,KAAKkP,aAAam9B,SACrCvqC,EAAMo/B,WAAWlhC,KAAKkP,aAAao9B,QAYrC1pC,EAAM6Q,UAAUq5B,oBAAsB,SAAS59B,EAAci/B,EAAiBnY,GAC5E,GAKIrmB,GAAMpK,EALN6mC,KACAgC,KACArb,GAAYiD,EAAM7lB,IAAM6lB,EAAM9lB,OAAS,EACvCm+B,EAAarY,EAAM9lB,MAAQ6iB,EAC3Bub,EAAatY,EAAM7lB,IAAM4iB,EAIzB5jB,EAAiB,SAAU/H,GAC7B,MAAiBinC,GAARjnC,EAA6B,GACpBknC,GAATlnC,EAA8B,EACA,EAMzC,IAAI+mC,EAAgBzoC,OAAS,EAC3B,IAAKH,EAAI,EAAGA,EAAI4oC,EAAgBzoC,OAAQH,IACtCvF,KAAKuuC,6BAA6BJ,EAAgB5oC,GAAI6mC,EAAcgC,EAAoBpY,EAK5F,IAAIwY,GAAoB7tC,EAAKsO,mBAAmBC,EAAam9B,QAASl9B,EAAgB,OAAO,QAS7F,IANAnP,KAAKyuC,cAAcD,EAAmBt/B,EAAam9B,QAASD,EAAcgC,EAAoB,SAAUz+B,GACtG,MAAQA,GAAKqD,KAAK9C,MAAQm+B,GAAc1+B,EAAKqD,KAAK9C,MAAQo+B,IAK/B,GAAzBtuC,KAAKusC,iBAEP,IADAvsC,KAAKusC,kBAAmB,EACnBhnC,EAAI,EAAGA,EAAI2J,EAAao9B,MAAM5mC,OAAQH,IACzCvF,KAAKuuC,6BAA6Br/B,EAAao9B,MAAM/mC,GAAI6mC,EAAcgC,EAAoBpY,OAG1F,CAEH,GAAI0Y,GAAkB/tC,EAAKsO,mBAAmBC,EAAao9B,MAAOn9B,EAAgB,OAAO,MAGzFnP,MAAKyuC,cAAcC,EAAiBx/B,EAAao9B,MAAOF,EAAcgC,EAAoB,SAAUz+B,GAClG,MAAQA,GAAKqD,KAAK7C,IAAMk+B,GAAc1+B,EAAKqD,KAAK7C,IAAMm+B,IAM1D,IAAK/oC,EAAI,EAAGA,EAAI6mC,EAAa1mC,OAAQH,IACnCoK,EAAOy8B,EAAa7mC,GACfoK,EAAKu9B,WAAWv9B,EAAK+3B,OAE1B/3B,EAAKg/B,aAgBP,OAAOvC,IAGTxpC,EAAM6Q,UAAUg7B,cAAgB,SAAUG,EAAY3sC,EAAOmqC,EAAcgC,EAAoBS,GAC7F,GAAIl/B,GACApK,CAEJ,IAAkB,IAAdqpC,EAAkB,CACpB,IAAKrpC,EAAIqpC,EAAYrpC,GAAK,IACxBoK,EAAO1N,EAAMsD,IACTspC,EAAel/B,IAFQpK,IAMWgB,SAAhC6nC,EAAmBz+B,EAAKtP,MAC1B+tC,EAAmBz+B,EAAKtP,KAAM,EAC9B+rC,EAAalkC,KAAKyH,GAKxB,KAAKpK,EAAIqpC,EAAa,EAAGrpC,EAAItD,EAAMyD,SACjCiK,EAAO1N,EAAMsD,IACTspC,EAAel/B,IAFsBpK,IAMHgB,SAAhC6nC,EAAmBz+B,EAAKtP,MAC1B+tC,EAAmBz+B,EAAKtP,KAAM,EAC9B+rC,EAAalkC,KAAKyH,MAmB5B/M,EAAM6Q,UAAUm6B,gBAAkB,SAASj+B,EAAMy8B,EAAcpW,GACvDrmB,EAAKm/B,UAAU9Y,IACZrmB,EAAKu9B,WAAWv9B,EAAK+3B,OAE1B/3B,EAAKg/B,cACLvC,EAAalkC,KAAKyH,IAGdA,EAAKu9B,WAAWv9B,EAAK83B,QAgB/B7kC,EAAM6Q,UAAU86B,6BAA+B,SAAS5+B,EAAMy8B,EAAcgC,EAAoBpY,GAC1FrmB,EAAKm/B,UAAU9Y,GACmBzvB,SAAhC6nC,EAAmBz+B,EAAKtP,MAC1B+tC,EAAmBz+B,EAAKtP,KAAM,EAC9B+rC,EAAalkC,KAAKyH,IAIhBA,EAAKu9B,WAAWv9B,EAAK83B,QAM7B5nC,EAAOD,QAAUgD,GAKb,SAAS/C,EAAQD,EAASM,GAW9B,QAAS2C,GAAiB+0B,EAAS5kB,EAAMojB,GACvCxzB,EAAMrC,KAAKP,KAAM43B,EAAS5kB,EAAMojB,GAEhCp2B,KAAK6S,MAAQ,EACb7S,KAAK8S,OAAS,EACd9S,KAAK4H,IAAM,EACX5H,KAAKwH,KAAO,EAfd,GACI5E,IADO1C,EAAoB,GACnBA,EAAoB,IAiBhC2C,GAAgB4Q,UAAYnN,OAAOqI,OAAO/L,EAAM6Q,WAShD5Q,EAAgB4Q,UAAUkO,OAAS,SAASqU,EAAO/b,GACjD,GAAIsqB,IAAU,CAEdvkC,MAAKosC,aAAepsC,KAAK8sC,oBAAoB9sC,KAAKkP,aAAclP,KAAKosC,aAAcpW,GAGnFh2B,KAAK6S,MAAQ7S,KAAKmwB,IAAIrkB,WAAW0kB,YAGjCxwB,KAAKmwB,IAAIrkB,WAAW0B,MAAMsF,OAAU,GAGpC,KAAK,GAAIvN,GAAI,EAAG+nC,EAAKttC,KAAKosC,aAAa1mC,OAAY4nC,EAAJ/nC,EAAQA,IAAK,CAC1D,GAAIoK,GAAO3P,KAAKosC,aAAa7mC,EAC7BoK,GAAK49B,YAAYtzB,GAGnB,MAAOsqB,IAMT1hC,EAAgB4Q,UAAUi0B,KAAO,WAC1B1nC,KAAKmwB,IAAIrkB,WAAWhC,YACvB9J,KAAKo2B,QAAQjG,IAAIrkB,WAAWiG,YAAY/R,KAAKmwB,IAAIrkB,aAIrDjM,EAAOD,QAAUiD,GAKb,SAAShD,EAAQD,EAASM,GA2B9B,QAAS4C,GAAQoyB,EAAMnmB,GACrB/O,KAAKk1B,KAAOA,EAEZl1B,KAAK40B,gBACH/tB,KAAM,KACNiuB,YAAa,SACbia,MAAO,OACPjtC,OAAO,EACPktC,WAAY,KAEZC,YAAY,EACZC,UACEC,YAAY,EACZ5H,aAAa,EACbh0B,KAAK,EACLqD,QAAQ,GAGVw4B,MAAO,SAAUz/B,EAAMnH,GACrBA,EAASmH,IAEX0/B,SAAU,SAAU1/B,EAAMnH,GACxBA,EAASmH,IAEX2/B,OAAQ,SAAU3/B,EAAMnH,GACtBA,EAASmH,IAEX4/B,SAAU,SAAU5/B,EAAMnH,GACxBA,EAASmH,IAEX6/B,SAAU,SAAU7/B,EAAMnH,GACxBA,EAASmH,IAGXsK,QACEtK,MACE+V,WAAY,GACZC,SAAU,IAEZ4b,KAAM,IAERrd,QAAS,GAIXlkB,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBAGpC50B,KAAKyvC,aACH5oC,MAAOqJ,MAAO,OAAQC,IAAK,SAG7BnQ,KAAK06B,YACHlF,SAAUN,EAAKv0B,KAAK60B,SACpBI,OAAQV,EAAKv0B,KAAKi1B,QAEpB51B,KAAKmwB,OACLnwB,KAAK+F,SACL/F,KAAK8D,OAAS,IAEd,IAAI2Q,GAAKzU,IACTA,MAAKq2B,UAAY,KACjBr2B,KAAKs2B,WAAa,KAGlBt2B,KAAK0vC,eACHn8B,IAAO,SAAU/J,EAAO4K,GACtBK,EAAGk7B,OAAOv7B,EAAOnS,QAEnBkT,OAAU,SAAU3L,EAAO4K,GACzBK,EAAGm7B,UAAUx7B,EAAOnS,QAEtB2U,OAAU,SAAUpN,EAAO4K,GACzBK,EAAGo7B,UAAUz7B,EAAOnS,SAKxBjC,KAAK8vC,gBACHv8B,IAAO,SAAU/J,EAAO4K,GACtBK,EAAGs7B,aAAa37B,EAAOnS,QAEzBkT,OAAU,SAAU3L,EAAO4K,GACzBK,EAAGu7B,gBAAgB57B,EAAOnS,QAE5B2U,OAAU,SAAUpN,EAAO4K,GACzBK,EAAGw7B,gBAAgB77B,EAAOnS,SAI9BjC,KAAKiC,SACLjC,KAAK00B,UACL10B,KAAKkwC,YAELlwC,KAAKmwC,aACLnwC,KAAKowC,YAAa,EAElBpwC,KAAKqwC,eAGLrwC,KAAKi1B,UAELj1B,KAAKwT,WAAWzE,GA/HlB,GAAIs2B,GAASnlC,EAAoB,IAC7BS,EAAOT,EAAoB,GAC3BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BqC,EAAYrC,EAAoB,IAChC0C,EAAQ1C,EAAoB,IAC5B2C,EAAkB3C,EAAoB,IACtCkC,EAAUlC,EAAoB,IAC9BmC,EAAYnC,EAAoB,IAChCoC,EAAYpC,EAAoB,IAChCiC,EAAiBjC,EAAoB,IAGrCowC,EAAY,gBACZC,EAAa,gBAoHjBztC,GAAQ2Q,UAAY,GAAIlR,GAGxBO,EAAQ2U,OACN3L,WAAY3J,EACZquC,IAAKpuC,EACL4zB,MAAO1zB,EACPkQ,MAAOnQ,GAMTS,EAAQ2Q,UAAUwhB,QAAU,WAC1B,GAAIzV,GAAQ3N,SAASM,cAAc,MACnCqN,GAAMzX,UAAY,UAClByX,EAAM,oBAAsBxf,KAC5BA,KAAKmwB,IAAI3Q,MAAQA,CAGjB,IAAI1T,GAAa+F,SAASM,cAAc,MACxCrG,GAAW/D,UAAY,aACvByX,EAAMzN,YAAYjG,GAClB9L,KAAKmwB,IAAIrkB,WAAaA,CAGtB,IAAI2gC,GAAa56B,SAASM,cAAc,MACxCs6B,GAAW1kC,UAAY,aACvByX,EAAMzN,YAAY06B,GAClBzsC,KAAKmwB,IAAIsc,WAAaA,CAGtB,IAAIlL,GAAO1vB,SAASM,cAAc,MAClCovB,GAAKx5B,UAAY,OACjB/H,KAAKmwB,IAAIoR,KAAOA,CAGhB,IAAIkM,GAAW57B,SAASM,cAAc,MACtCs7B,GAAS1lC,UAAY,WACrB/H,KAAKmwB,IAAIsd,SAAWA,EAGpBztC,KAAKywC,kBAGL,IAAIC,GAAkB,GAAI7tC,GAAgB0tC,EAAY,KAAMvwC,KAC5D0wC,GAAgBhJ,OAChB1nC,KAAK00B,OAAO6b,GAAcG,EAM1B1wC,KAAK8D,OAASuhC,EAAOrlC,KAAKk1B,KAAK/E,IAAIgI,iBACjCoN,iBAAiB,IAInBvlC,KAAK8D,OAAO+P,GAAG,QAAa7T,KAAK4+B,SAASvJ,KAAKr1B,OAC/CA,KAAK8D,OAAO+P,GAAG,YAAa7T,KAAKu+B,aAAalJ,KAAKr1B,OACnDA,KAAK8D,OAAO+P,GAAG,OAAa7T,KAAKw+B,QAAQnJ,KAAKr1B,OAC9CA,KAAK8D,OAAO+P,GAAG,UAAa7T,KAAKy+B,WAAWpJ,KAAKr1B,OAGjDA,KAAK8D,OAAO+P,GAAG,MAAQ7T,KAAK2wC,cAActb,KAAKr1B,OAG/CA,KAAK8D,OAAO+P,GAAG,OAAQ7T,KAAK4wC,mBAAmBvb,KAAKr1B,OAGpDA,KAAK8D,OAAO+P,GAAG,YAAa7T,KAAK6wC,WAAWxb,KAAKr1B,OAGjDA,KAAK0nC,QAmEP5kC,EAAQ2Q,UAAUD,WAAa,SAASzE,GACtC,GAAIA,EAAS,CAEX,GAAIP,IAAU,OAAQ,QAAS,cAAe,UAAW,QAAS,aAAc,aAAc,iBAAkB,WAAW,OAC3H7N,GAAKmF,gBAAgB0I,EAAQxO,KAAK+O,QAASA,GAEvC,UAAYA,KACgB,gBAAnBA,GAAQkL,QACjBja,KAAK+O,QAAQkL,OAAOsnB,KAAOxyB,EAAQkL,OACnCja,KAAK+O,QAAQkL,OAAOtK,KAAK+V,WAAa3W,EAAQkL,OAC9Cja,KAAK+O,QAAQkL,OAAOtK,KAAKgW,SAAW5W,EAAQkL,QAEX,gBAAnBlL,GAAQkL,SACtBtZ,EAAKmF,iBAAiB,QAAS9F,KAAK+O,QAAQkL,OAAQlL,EAAQkL,QACxD,QAAUlL,GAAQkL,SACe,gBAAxBlL,GAAQkL,OAAOtK,MACxB3P,KAAK+O,QAAQkL,OAAOtK,KAAK+V,WAAa3W,EAAQkL,OAAOtK,KACrD3P,KAAK+O,QAAQkL,OAAOtK,KAAKgW,SAAW5W,EAAQkL,OAAOtK,MAEb,gBAAxBZ,GAAQkL,OAAOtK,MAC7BhP,EAAKmF,iBAAiB,aAAc,YAAa9F,KAAK+O,QAAQkL,OAAOtK,KAAMZ,EAAQkL,OAAOtK,SAM9F,YAAcZ,KACgB,iBAArBA,GAAQmgC,UACjBlvC,KAAK+O,QAAQmgC,SAASC,WAAcpgC,EAAQmgC,SAC5ClvC,KAAK+O,QAAQmgC,SAAS3H,YAAcx4B,EAAQmgC,SAC5ClvC,KAAK+O,QAAQmgC,SAAS37B,IAAcxE,EAAQmgC,SAC5ClvC,KAAK+O,QAAQmgC,SAASt4B,OAAc7H,EAAQmgC,UAET,gBAArBngC,GAAQmgC,UACtBvuC,EAAKmF,iBAAiB,aAAc,cAAe,MAAO,UAAW9F,KAAK+O,QAAQmgC,SAAUngC,EAAQmgC,UAKxG,IAAI4B,GAAc,SAAWt6B,GAC3B,GAAIiD,GAAK1K,EAAQyH,EACjB,IAAIiD,EAAI,CACN,KAAMA,YAAcs3B,WAClB,KAAM,IAAIntC,OAAM,UAAY4S,EAAO,uBAAyBA,EAAO,mBAErExW,MAAK+O,QAAQyH,GAAQiD,IAEtB4b,KAAKr1B,OACP,QAAS,WAAY,WAAY,SAAU,YAAYuI,QAAQuoC,GAGhE9wC,KAAKgxC,cAOTluC,EAAQ2Q,UAAUu9B,UAAY,WAC5BhxC,KAAKkwC,YACLlwC,KAAKowC,YAAa,GAMpBttC,EAAQ2Q,UAAUG,QAAU,WAC1B5T,KAAKynC,OACLznC,KAAKw2B,SAAS,MACdx2B,KAAKu2B,UAAU,MAEfv2B,KAAK8D,OAAS,KAEd9D,KAAKk1B,KAAO,KACZl1B,KAAK06B,WAAa,MAMpB53B,EAAQ2Q,UAAUg0B,KAAO,WAEnBznC,KAAKmwB,IAAI3Q,MAAM1V,YACjB9J,KAAKmwB,IAAI3Q,MAAM1V,WAAW2H,YAAYzR,KAAKmwB,IAAI3Q,OAI7Cxf,KAAKmwB,IAAIoR,KAAKz3B,YAChB9J,KAAKmwB,IAAIoR,KAAKz3B,WAAW2H,YAAYzR,KAAKmwB,IAAIoR,MAI5CvhC,KAAKmwB,IAAIsd,SAAS3jC,YACpB9J,KAAKmwB,IAAIsd,SAAS3jC,WAAW2H,YAAYzR,KAAKmwB,IAAIsd,WAQtD3qC,EAAQ2Q,UAAUi0B,KAAO,WAElB1nC,KAAKmwB,IAAI3Q,MAAM1V,YAClB9J,KAAKk1B,KAAK/E,IAAI9D,OAAOta,YAAY/R,KAAKmwB,IAAI3Q,OAIvCxf,KAAKmwB,IAAIoR,KAAKz3B,YACjB9J,KAAKk1B,KAAK/E,IAAI2U,mBAAmB/yB,YAAY/R,KAAKmwB,IAAIoR,MAInDvhC,KAAKmwB,IAAIsd,SAAS3jC,YACrB9J,KAAKk1B,KAAK/E,IAAI3oB,KAAKuK,YAAY/R,KAAKmwB,IAAIsd,WAW5C3qC,EAAQ2Q,UAAUwjB,aAAe,SAASxhB,GACxC,GAAIlQ,GAAG+nC,EAAIjtC,EAAIsP,CAMf,KAJWpJ,QAAPkP,IAAkBA,MACjBzP,MAAMC,QAAQwP,KAAMA,GAAOA,IAG3BlQ,EAAI,EAAG+nC,EAAKttC,KAAKmwC,UAAUzqC,OAAY4nC,EAAJ/nC,EAAQA,IAC9ClF,EAAKL,KAAKmwC,UAAU5qC,GACpBoK,EAAO3P,KAAKiC,MAAM5B,GACdsP,GAAMA,EAAKshC,UAKjB,KADAjxC,KAAKmwC,aACA5qC,EAAI,EAAG+nC,EAAK73B,EAAI/P,OAAY4nC,EAAJ/nC,EAAQA,IACnClF,EAAKoV,EAAIlQ,GACToK,EAAO3P,KAAKiC,MAAM5B,GACdsP,IACF3P,KAAKmwC,UAAUjoC,KAAK7H,GACpBsP,EAAKuhC,WASXpuC,EAAQ2Q,UAAU0jB,aAAe,WAC/B,MAAOn3B,MAAKmwC,UAAU77B,YAOxBxR,EAAQ2Q,UAAU09B,gBAAkB,WAClC,GAAInb,GAAQh2B,KAAKk1B,KAAKc,MAAM6J,WACxBr4B,EAAQxH,KAAKk1B,KAAKv0B,KAAK60B,SAASQ,EAAM9lB,OACtCqX,EAAQvnB,KAAKk1B,KAAKv0B,KAAK60B,SAASQ,EAAM7lB,KAEtCsF,IACJ,KAAK,GAAImiB,KAAW53B,MAAK00B,OACvB,GAAI10B,KAAK00B,OAAO7uB,eAAe+xB,GAM7B,IAAK,GALDrlB,GAAQvS,KAAK00B,OAAOkD,GACpBwZ,EAAkB7+B,EAAM65B,aAInB7mC,EAAI,EAAGA,EAAI6rC,EAAgB1rC,OAAQH,IAAK,CAC/C,GAAIoK,GAAOyhC,EAAgB7rC,EAEtBoK,GAAKnI,KAAO+f,GAAW5X,EAAKnI,KAAOmI,EAAKkD,MAAQrL,GACnDiO,EAAIvN,KAAKyH,EAAKtP,IAMtB,MAAOoV,IAQT3S,EAAQ2Q,UAAU49B,UAAY,SAAShxC,GAErC,IAAK,GADD8vC,GAAYnwC,KAAKmwC,UACZ5qC,EAAI,EAAG+nC,EAAK6C,EAAUzqC,OAAY4nC,EAAJ/nC,EAAQA,IAC7C,GAAI4qC,EAAU5qC,IAAMlF,EAAI,CACtB8vC,EAAU7nC,OAAO/C,EAAG,EACpB,SASNzC,EAAQ2Q,UAAUkO,OAAS,WACzB,GAAI1H,GAASja,KAAK+O,QAAQkL,OACtB+b,EAAQh2B,KAAKk1B,KAAKc,MAClB5rB,EAASzJ,EAAKoJ,OAAOK,OACrB2E,EAAU/O,KAAK+O,QACf+lB,EAAc/lB,EAAQ+lB,YACtByP,GAAU,EACV/kB,EAAQxf,KAAKmwB,IAAI3Q,MACjB0vB,EAAWngC,EAAQmgC,SAASC,YAAcpgC,EAAQmgC,SAAS3H,WAG/DvnC,MAAK+F,MAAM6B,IAAM5H,KAAKk1B,KAAKC,SAASvtB,IAAIkL,OAAS9S,KAAKk1B,KAAKC,SAASppB,OAAOnE,IAC3E5H,KAAK+F,MAAMyB,KAAOxH,KAAKk1B,KAAKC,SAAS3tB,KAAKqL,MAAQ7S,KAAKk1B,KAAKC,SAASppB,OAAOvE,KAG5EgY,EAAMzX,UAAY,WAAamnC,EAAW,YAAc,IAGxD3K,EAAUvkC,KAAKsxC,gBAAkB/M,CAIjC,IAAIgN,GAAkBvb,EAAM7lB,IAAM6lB,EAAM9lB,MACpCshC,EAAUD,GAAmBvxC,KAAKyxC,qBAAyBzxC,KAAK+F,MAAM8M,OAAS7S,KAAK+F,MAAM2rC,SAC1FF,KAAQxxC,KAAKowC,YAAa,GAC9BpwC,KAAKyxC,oBAAsBF,EAC3BvxC,KAAK+F,MAAM2rC,UAAY1xC,KAAK+F,MAAM8M,KAElC,IAAIg6B,GAAU7sC,KAAKowC,WACfuB,EAAa3xC,KAAK4xC,cAClBC,GACFliC,KAAMsK,EAAOtK,KACb4xB,KAAMtnB,EAAOsnB,MAEXuQ,GACFniC,KAAMsK,EAAOtK,KACb4xB,KAAMtnB,EAAOtK,KAAKgW,SAAW,GAE3B7S,EAAS,EACTkiB,EAAY/a,EAAOsnB,KAAOtnB,EAAOtK,KAAKgW,QA+B1C,OA5BA3lB,MAAK00B,OAAO6b,GAAY5uB,OAAOqU,EAAO8b,EAAgBjF,GAGtDlsC,EAAK4H,QAAQvI,KAAK00B,OAAQ,SAAUniB,GAClC,GAAIw/B,GAAex/B,GAASo/B,EAAcE,EAAcC,EACpDE,EAAez/B,EAAMoP,OAAOqU,EAAO+b,EAAalF,EACpDtI,GAAUyN,GAAgBzN,EAC1BzxB,GAAUP,EAAMO,SAElBA,EAAS7N,KAAKiI,IAAI4F,EAAQkiB,GAC1Bh1B,KAAKowC,YAAa,EAGlB5wB,EAAMhS,MAAMsF,OAAU1I,EAAO0I,GAG7B9S,KAAK+F,MAAM8M,MAAQ2M,EAAMgR,YACzBxwB,KAAK+F,MAAM+M,OAASA,EAGpB9S,KAAKmwB,IAAIoR,KAAK/zB,MAAM5F,IAAMwC,EAAuB,OAAf0qB,EAC7B90B,KAAKk1B,KAAKC,SAASvtB,IAAIkL,OAAS9S,KAAKk1B,KAAKC,SAASppB,OAAOnE,IAC1D5H,KAAKk1B,KAAKC,SAASvtB,IAAIkL,OAAS9S,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,QACxE9S,KAAKmwB,IAAIoR,KAAK/zB,MAAMhG,KAAO,IAG3B+8B,EAAUvkC,KAAKskC,cAAgBC,GAUjCzhC,EAAQ2Q,UAAUm+B,YAAc,WAC9B,GAAIK,GAA+C,OAA5BjyC,KAAK+O,QAAQ+lB,YAAwB,EAAK90B,KAAKkwC,SAASxqC,OAAS,EACpFwsC,EAAelyC,KAAKkwC,SAAS+B,GAC7BN,EAAa3xC,KAAK00B,OAAOwd,IAAiBlyC,KAAK00B,OAAO4b,EAE1D,OAAOqB,IAAc,MAQvB7uC,EAAQ2Q,UAAUg9B,iBAAmB,WACnC,CAAA,GAEI9gC,GAAMkG,EAFNs8B,EAAYnyC,KAAK00B,OAAO4b,EACXtwC,MAAK00B,OAAO6b,GAG7B,GAAIvwC,KAAKs2B,YAEP,GAAI6b,EAAW,CACbA,EAAU1K,aACHznC,MAAK00B,OAAO4b,EAEnB,KAAKz6B,IAAU7V,MAAKiC,MAClB,GAAIjC,KAAKiC,MAAM4D,eAAegQ,GAAS,CACrClG,EAAO3P,KAAKiC,MAAM4T,GAClBlG,EAAKk1B,QAAUl1B,EAAKk1B,OAAOjuB,OAAOjH,EAClC,IAAIioB,GAAU53B,KAAKoyC,YAAYziC,EAAKqD,MAChCT,EAAQvS,KAAK00B,OAAOkD,EACxBrlB,IAASA,EAAMgB,IAAI5D,IAASA,EAAK83B,aAOvC,KAAK0K,EAAW,CACd,GAAI9xC,GAAK,KACL2S,EAAO,IACXm/B,GAAY,GAAIvvC,GAAMvC,EAAI2S,EAAMhT,MAChCA,KAAK00B,OAAO4b,GAAa6B,CAEzB,KAAKt8B,IAAU7V,MAAKiC,MACdjC,KAAKiC,MAAM4D,eAAegQ,KAC5BlG,EAAO3P,KAAKiC,MAAM4T,GAClBs8B,EAAU5+B,IAAI5D,GAIlBwiC,GAAUzK,SAShB5kC,EAAQ2Q,UAAU4+B,YAAc,WAC9B,MAAOryC,MAAKmwB,IAAIsd,UAOlB3qC,EAAQ2Q,UAAU+iB,SAAW,SAASv0B,GACpC,GACIwT,GADAhB,EAAKzU,KAELsyC,EAAetyC,KAAKq2B,SAGxB,IAAKp0B,EAGA,CAAA,KAAIA,YAAiBpB,IAAWoB,YAAiBnB,IAIpD,KAAM,IAAIsF,WAAU,kDAHpBpG,MAAKq2B,UAAYp0B,MAHjBjC,MAAKq2B,UAAY,IAoBnB,IAXIic,IAEF3xC,EAAK4H,QAAQvI,KAAK0vC,cAAe,SAAUlnC,EAAUgB,GACnD8oC,EAAat+B,IAAIxK,EAAOhB,KAI1BiN,EAAM68B,EAAal8B,SACnBpW,KAAK6vC,UAAUp6B,IAGbzV,KAAKq2B,UAAW,CAElB,GAAIh2B,GAAKL,KAAKK,EACdM,GAAK4H,QAAQvI,KAAK0vC,cAAe,SAAUlnC,EAAUgB,GACnDiL,EAAG4hB,UAAUxiB,GAAGrK,EAAOhB,EAAUnI,KAInCoV,EAAMzV,KAAKq2B,UAAUjgB,SACrBpW,KAAK2vC,OAAOl6B,GAGZzV,KAAKywC,qBAQT3tC,EAAQ2Q,UAAU8+B,SAAW,WAC3B,MAAOvyC,MAAKq2B,WAOdvzB,EAAQ2Q,UAAU8iB,UAAY,SAAS7B,GACrC,GACIjf,GADAhB,EAAKzU,IAgBT,IAZIA,KAAKs2B,aACP31B,EAAK4H,QAAQvI,KAAK8vC,eAAgB,SAAUtnC,EAAUgB,GACpDiL,EAAG6hB,WAAWpiB,YAAY1K,EAAOhB,KAInCiN,EAAMzV,KAAKs2B,WAAWlgB,SACtBpW,KAAKs2B,WAAa,KAClBt2B,KAAKiwC,gBAAgBx6B,IAIlBif,EAGA,CAAA,KAAIA,YAAkB7zB,IAAW6zB,YAAkB5zB,IAItD,KAAM,IAAIsF,WAAU,kDAHpBpG,MAAKs2B,WAAa5B,MAHlB10B,MAAKs2B,WAAa,IASpB,IAAIt2B,KAAKs2B,WAAY,CAEnB,GAAIj2B,GAAKL,KAAKK,EACdM,GAAK4H,QAAQvI,KAAK8vC,eAAgB,SAAUtnC,EAAUgB,GACpDiL,EAAG6hB,WAAWziB,GAAGrK,EAAOhB,EAAUnI,KAIpCoV,EAAMzV,KAAKs2B,WAAWlgB,SACtBpW,KAAK+vC,aAAat6B,GAIpBzV,KAAKywC,mBAGLzwC,KAAKwyC,SAELxyC,KAAKk1B,KAAKE,QAAQnH,KAAK,UAAWva,OAAO,KAO3C5Q,EAAQ2Q,UAAUg/B,UAAY,WAC5B,MAAOzyC,MAAKs2B,YAOdxzB,EAAQ2Q,UAAUu6B,WAAa,SAAS3tC,GACtC,GAAIsP,GAAO3P,KAAKq2B,UAAU7gB,IAAInV,GAC1Bi3B,EAAUt3B,KAAKq2B,UAAUhgB,YAEzB1G,IAEF3P,KAAK+O,QAAQwgC,SAAS5/B,EAAM,SAAUA,GAChCA,GAGF2nB,EAAQ1gB,OAAOvW,MAYvByC,EAAQ2Q,UAAUi/B,SAAW,SAAUtb,GACrC,MAAOA,GAASvwB,MAAQ7G,KAAK+O,QAAQlI,OAASuwB,EAASjnB,IAAM,QAAU,QAUzErN,EAAQ2Q,UAAU2+B,YAAc,SAAUhb,GACxC,GAAIvwB,GAAO7G,KAAK0yC,SAAStb,EACzB,OAAY,cAARvwB,GAA0CN,QAAlB6wB,EAAS7kB,MAC7Bg+B,EAGCvwC,KAAKs2B,WAAac,EAAS7kB,MAAQ+9B,GAS9CxtC,EAAQ2Q,UAAUm8B,UAAY,SAASn6B,GACrC,GAAIhB,GAAKzU,IAETyV,GAAIlN,QAAQ,SAAUlI,GACpB,GAAI+2B,GAAW3iB,EAAG4hB,UAAU7gB,IAAInV,EAAIoU,EAAGg7B,aACnC9/B,EAAO8E,EAAGxS,MAAM5B,GAChBwG,EAAO4N,EAAGi+B,SAAStb,GAEnB/wB,EAAcvD,EAAQ2U,MAAM5Q,EAchC,IAZI8I,IAEGtJ,GAAiBsJ,YAAgBtJ,GAMpCoO,EAAGc,YAAY5F,EAAMynB,IAJrB3iB,EAAGk+B,YAAYhjC,GACfA,EAAO,QAONA,EAAM,CAET,IAAItJ,EAKC,KAEG,IAAID,WAFK,iBAARS,EAEa,4HAIA,sBAAwBA,EAAO,IAVnD8I,GAAO,GAAItJ,GAAY+wB,EAAU3iB,EAAGimB,WAAYjmB,EAAG1F,SACnDY,EAAKtP,GAAKA,EACVoU,EAAGC,SAAS/E,MAalB3P,KAAKwyC,SACLxyC,KAAKowC,YAAa,EAClBpwC,KAAKk1B,KAAKE,QAAQnH,KAAK,UAAWva,OAAO,KAQ3C5Q,EAAQ2Q,UAAUk8B,OAAS7sC,EAAQ2Q,UAAUm8B,UAO7C9sC,EAAQ2Q,UAAUo8B,UAAY,SAASp6B,GACrC,GAAI8B,GAAQ,EACR9C,EAAKzU,IACTyV,GAAIlN,QAAQ,SAAUlI,GACpB,GAAIsP,GAAO8E,EAAGxS,MAAM5B,EAChBsP,KACF4H,IACA9C,EAAGk+B,YAAYhjC,MAIf4H,IAEFvX,KAAKwyC,SACLxyC,KAAKowC,YAAa,EAClBpwC,KAAKk1B,KAAKE,QAAQnH,KAAK,UAAWva,OAAO,MAQ7C5Q,EAAQ2Q,UAAU++B,OAAS,WAGzB7xC,EAAK4H,QAAQvI,KAAK00B,OAAQ,SAAUniB,GAClCA,EAAMwD,WASVjT,EAAQ2Q,UAAUu8B,gBAAkB,SAASv6B,GAC3CzV,KAAK+vC,aAAat6B,IAQpB3S,EAAQ2Q,UAAUs8B,aAAe,SAASt6B,GACxC,GAAIhB,GAAKzU,IAETyV,GAAIlN,QAAQ,SAAUlI,GACpB,GAAIyrC,GAAYr3B,EAAG6hB,WAAW9gB,IAAInV,GAC9BkS,EAAQkC,EAAGigB,OAAOr0B,EAEtB,IAAKkS,EA6BHA,EAAMgG,QAAQuzB,OA7BJ,CAEV,GAAIzrC,GAAMiwC,GAAajwC,GAAMkwC,EAC3B,KAAM,IAAI3sC,OAAM,qBAAuBvD,EAAK,qBAG9C,IAAIuyC,GAAetsC,OAAOqI,OAAO8F,EAAG1F,QACpCpO,GAAK0E,OAAOutC,GACV9/B,OAAQ,OAGVP,EAAQ,GAAI3P,GAAMvC,EAAIyrC,EAAWr3B,GACjCA,EAAGigB,OAAOr0B,GAAMkS,CAGhB,KAAK,GAAIsD,KAAUpB,GAAGxS,MACpB,GAAIwS,EAAGxS,MAAM4D,eAAegQ,GAAS,CACnC,GAAIlG,GAAO8E,EAAGxS,MAAM4T,EAChBlG,GAAKqD,KAAKT,OAASlS,GACrBkS,EAAMgB,IAAI5D,GAKhB4C,EAAMwD,QACNxD,EAAMm1B,UAQV1nC,KAAKk1B,KAAKE,QAAQnH,KAAK,UAAWva,OAAO,KAQ3C5Q,EAAQ2Q,UAAUw8B,gBAAkB,SAASx6B,GAC3C,GAAIif,GAAS10B,KAAK00B,MAClBjf,GAAIlN,QAAQ,SAAUlI,GACpB,GAAIkS,GAAQmiB,EAAOr0B,EAEfkS,KACFA,EAAMk1B,aACC/S,GAAOr0B,MAIlBL,KAAKgxC,YAELhxC,KAAKk1B,KAAKE,QAAQnH,KAAK,UAAWva,OAAO,KAQ3C5Q,EAAQ2Q,UAAU69B,aAAe,WAC/B,GAAItxC,KAAKs2B,WAAY,CAEnB,GAAI4Z,GAAWlwC,KAAKs2B,WAAWlgB,QAC7BL,MAAO/V,KAAK+O,QAAQigC,aAGlBxP,GAAW7+B,EAAKgG,WAAWupC,EAAUlwC,KAAKkwC,SAC9C,IAAI1Q,EAAS,CAEX,GAAI9K,GAAS10B,KAAK00B,MAClBwb,GAAS3nC,QAAQ,SAAUqvB,GACzBlD,EAAOkD,GAAS6P,SAIlByI,EAAS3nC,QAAQ,SAAUqvB,GACzBlD,EAAOkD,GAAS8P,SAGlB1nC,KAAKkwC,SAAWA,EAGlB,MAAO1Q,GAGP,OAAO,GASX18B,EAAQ2Q,UAAUiB,SAAW,SAAS/E,GACpC3P,KAAKiC,MAAM0N,EAAKtP,IAAMsP,CAGtB,IAAIioB,GAAU53B,KAAKoyC,YAAYziC,EAAKqD,MAChCT,EAAQvS,KAAK00B,OAAOkD,EACpBrlB,IAAOA,EAAMgB,IAAI5D,IASvB7M,EAAQ2Q,UAAU8B,YAAc,SAAS5F,EAAMynB,GAC7C,GAAIyb,GAAaljC,EAAKqD,KAAKT,KAM3B,IAHA5C,EAAK4I,QAAQ6e,GAGTyb,GAAcljC,EAAKqD,KAAKT,MAAO,CACjC,GAAIugC,GAAW9yC,KAAK00B,OAAOme,EACvBC,IAAUA,EAASl8B,OAAOjH,EAE9B,IAAIioB,GAAU53B,KAAKoyC,YAAYziC,EAAKqD,MAChCT,EAAQvS,KAAK00B,OAAOkD,EACpBrlB,IAAOA,EAAMgB,IAAI5D,KAUzB7M,EAAQ2Q,UAAUk/B,YAAc,SAAShjC,GAEvCA,EAAK83B,aAGEznC,MAAKiC,MAAM0N,EAAKtP,GAGvB,IAAIgI,GAAQrI,KAAKmwC,UAAUzpC,QAAQiJ,EAAKtP,GAC3B,KAATgI,GAAarI,KAAKmwC,UAAU7nC,OAAOD,EAAO,GAG9CsH,EAAKk1B,QAAUl1B,EAAKk1B,OAAOjuB,OAAOjH,IASpC7M,EAAQ2Q,UAAUs/B,qBAAuB,SAASrqC,GAGhD,IAAK,GAFDwlC,MAEK3oC,EAAI,EAAGA,EAAImD,EAAMhD,OAAQH,IAC5BmD,EAAMnD,YAAcjD,IACtB4rC,EAAShmC,KAAKQ,EAAMnD,GAGxB,OAAO2oC,IAYTprC,EAAQ2Q,UAAUmrB,SAAW,SAAUp1B,GAErCxJ,KAAKqwC,YAAY1gC,KAAO7M,EAAQkwC,eAAexpC,IAQjD1G,EAAQ2Q,UAAU8qB,aAAe,SAAU/0B,GACzC,GAAKxJ,KAAK+O,QAAQmgC,SAASC,YAAenvC,KAAK+O,QAAQmgC,SAAS3H,YAAhE,CAIA,GAEIxhC,GAFA4J,EAAO3P,KAAKqwC,YAAY1gC,MAAQ,KAChC8E,EAAKzU,IAGT,IAAI2P,GAAQA,EAAKsjC,SAAU,CACzB,GAAIC,GAAe1pC,EAAMG,OAAOupC,aAC5BC,EAAgB3pC,EAAMG,OAAOwpC,aAE7BD,IACFntC,GACE4J,KAAMujC,EACNE,SAAU5pC,EAAMy2B,QAAQ5T,OAAOyE,SAG7Brc,EAAG1F,QAAQmgC,SAASC,aACtBppC,EAAMmK,MAAQP,EAAKqD,KAAK9C,MAAMnJ,WAE5B0N,EAAG1F,QAAQmgC,SAAS3H,aAClB,SAAW53B,GAAKqD,OAAMjN,EAAMwM,MAAQ5C,EAAKqD,KAAKT,OAGpDvS,KAAKqwC,YAAYgD,WAAattC,IAEvBotC,GACPptC,GACE4J,KAAMwjC,EACNC,SAAU5pC,EAAMy2B,QAAQ5T,OAAOyE,SAG7Brc,EAAG1F,QAAQmgC,SAASC,aACtBppC,EAAMoK,IAAMR,EAAKqD,KAAK7C,IAAIpJ,WAExB0N,EAAG1F,QAAQmgC,SAAS3H,aAClB,SAAW53B,GAAKqD,OAAMjN,EAAMwM,MAAQ5C,EAAKqD,KAAKT,OAGpDvS,KAAKqwC,YAAYgD,WAAattC,IAG9B/F,KAAKqwC,YAAYgD,UAAYrzC,KAAKm3B,eAAevpB,IAAI,SAAUvN,GAC7D,GAAIsP,GAAO8E,EAAGxS,MAAM5B,GAChB0F,GACF4J,KAAMA,EACNyjC,SAAU5pC,EAAMy2B,QAAQ5T,OAAOyE,QAWjC,OARIrc,GAAG1F,QAAQmgC,SAASC,aAClB,SAAWx/B,GAAKqD,OAAMjN,EAAMmK,MAAQP,EAAKqD,KAAK9C,MAAMnJ,WACpD,OAAS4I,GAAKqD,OAAQjN,EAAMoK,IAAMR,EAAKqD,KAAK7C,IAAIpJ,YAElD0N,EAAG1F,QAAQmgC,SAAS3H,aAClB,SAAW53B,GAAKqD,OAAMjN,EAAMwM,MAAQ5C,EAAKqD,KAAKT,OAG7CxM,IAIXyD,EAAMk8B,qBASV5iC,EAAQ2Q,UAAU+qB,QAAU,SAAUh1B,GACpC,GAAIxJ,KAAKqwC,YAAYgD,UAAW,CAC9B,GAAI5+B,GAAKzU,KACLu1B,EAAOv1B,KAAKk1B,KAAKv0B,KAAK40B,MAAQ,KAC9BzL,EAAU9pB,KAAKk1B,KAAK/E,IAAIzwB,KAAK2tC,WAAartC,KAAKk1B,KAAKC,SAAS3tB,KAAKqL,KAGtE7S,MAAKqwC,YAAYgD,UAAU9qC,QAAQ,SAAUxC,GAC3C,GAAIutC,MACAlZ,EAAU3lB,EAAGygB,KAAKv0B,KAAKi1B,OAAOpsB,EAAMy2B,QAAQ5T,OAAOyE,QAAUhH,GAC7DypB,EAAU9+B,EAAGygB,KAAKv0B,KAAKi1B,OAAO7vB,EAAMqtC,SAAWtpB,GAC/CD,EAASuQ,EAAUmZ,CAEvB,IAAI,SAAWxtC,GAAO,CACpB,GAAImK,GAAQ,GAAI7L,MAAK0B,EAAMmK,MAAQ2Z,EACnCypB,GAASpjC,MAAQqlB,EAAOA,EAAKrlB,GAASA,EAGxC,GAAI,OAASnK,GAAO,CAClB,GAAIoK,GAAM,GAAI9L,MAAK0B,EAAMoK,IAAM0Z,EAC/BypB,GAASnjC,IAAMolB,EAAOA,EAAKplB,GAAOA,EAGpC,GAAI,SAAWpK,GAAO,CAEpB,GAAIwM,GAAQzP,EAAQ0wC,gBAAgBhqC,EACpC8pC,GAAS/gC,MAAQA,GAASA,EAAMqlB,QAIlC,GAAIR,GAAWz2B,EAAK0E,UAAWU,EAAM4J,KAAKqD,KAAMsgC,EAChD7+B,GAAG1F,QAAQygC,SAASpY,EAAU,SAAUA,GAClCA,GACF3iB,EAAGg/B,iBAAiB1tC,EAAM4J,KAAMynB,OAKtCp3B,KAAKowC,YAAa,EAClBpwC,KAAKk1B,KAAKE,QAAQnH,KAAK,UAEvBzkB,EAAMk8B,oBAUV5iC,EAAQ2Q,UAAUggC,iBAAmB,SAAS9jC,EAAM5J,GAE9C,SAAWA,KAAO4J,EAAKqD,KAAK9C,MAAQnK,EAAMmK,OAC1C,OAASnK,KAAS4J,EAAKqD,KAAK7C,IAAQpK,EAAMoK,KAC1C,SAAWpK,IAAS4J,EAAKqD,KAAKT,OAASxM,EAAMwM,OAC/CvS,KAAK0zC,aAAa/jC,EAAM5J,EAAMwM,QAUlCzP,EAAQ2Q,UAAUigC,aAAe,SAAS/jC,EAAMioB,GAC9C,GAAIrlB,GAAQvS,KAAK00B,OAAOkD,EACxB,IAAIrlB,GAASA,EAAMqlB,SAAWjoB,EAAKqD,KAAKT,MAAO,CAC7C,GAAIugC,GAAWnjC,EAAKk1B,MACpBiO,GAASl8B,OAAOjH,GAChBmjC,EAAS/8B,QACTxD,EAAMgB,IAAI5D,GACV4C,EAAMwD,QAENpG,EAAKqD,KAAKT,MAAQA,EAAMqlB,UAS5B90B,EAAQ2Q,UAAUgrB,WAAa,SAAUj1B,GACvC,GAAIxJ,KAAKqwC,YAAYgD,UAAW,CAE9B,GAAIM,MACAl/B,EAAKzU,KACLs3B,EAAUt3B,KAAKq2B,UAAUhgB,aAEzBg9B,EAAYrzC,KAAKqwC,YAAYgD,SACjCrzC,MAAKqwC,YAAYgD,UAAY,KAC7BA,EAAU9qC,QAAQ,SAAUxC,GAC1B,GAAI1F,GAAK0F,EAAM4J,KAAKtP,GAChB+2B,EAAW3iB,EAAG4hB,UAAU7gB,IAAInV,EAAIoU,EAAGg7B,aAEnCjQ,GAAU,CACV,UAAWz5B,GAAM4J,KAAKqD,OACxBwsB,EAAWz5B,EAAMmK,OAASnK,EAAM4J,KAAKqD,KAAK9C,MAAMnJ,UAChDqwB,EAASlnB,MAAQvP,EAAKiG,QAAQb,EAAM4J,KAAKqD,KAAK9C,MACtConB,EAAQrkB,SAASpM,MAAQywB,EAAQrkB,SAASpM,KAAKqJ,OAAS,SAE9D,OAASnK,GAAM4J,KAAKqD,OACtBwsB,EAAUA,GAAaz5B,EAAMoK,KAAOpK,EAAM4J,KAAKqD,KAAK7C,IAAIpJ,UACxDqwB,EAASjnB,IAAMxP,EAAKiG,QAAQb,EAAM4J,KAAKqD,KAAK7C,IACpCmnB,EAAQrkB,SAASpM,MAAQywB,EAAQrkB,SAASpM,KAAKsJ,KAAO,SAE5D,SAAWpK,GAAM4J,KAAKqD,OACxBwsB,EAAUA,GAAaz5B,EAAMwM,OAASxM,EAAM4J,KAAKqD,KAAKT,MACtD6kB,EAAS7kB,MAAQxM,EAAM4J,KAAKqD,KAAKT,OAI/BitB,GACF/qB,EAAG1F,QAAQugC,OAAOlY,EAAU,SAAUA,GAChCA,GAEFA,EAASE,EAAQnkB,UAAY9S,EAC7BszC,EAAQzrC,KAAKkvB,KAIb3iB,EAAGg/B,iBAAiB1tC,EAAM4J,KAAM5J,GAEhC0O,EAAG27B,YAAa,EAChB37B,EAAGygB,KAAKE,QAAQnH,KAAK,eAOzB0lB,EAAQjuC,QACV4xB,EAAQniB,OAAOw+B,GAGjBnqC,EAAMk8B,oBASV5iC,EAAQ2Q,UAAUk9B,cAAgB,SAAUnnC,GAC1C,GAAKxJ,KAAK+O,QAAQkgC,WAAlB,CAEA,GAAI2E,GAAWpqC,EAAMy2B,QAAQ4T,UAAYrqC,EAAMy2B,QAAQ4T,SAASD,QAC5DE,EAAWtqC,EAAMy2B,QAAQ4T,UAAYrqC,EAAMy2B,QAAQ4T,SAASC,QAChE,IAAIF,GAAWE,EAEb,WADA9zC,MAAK4wC,mBAAmBpnC,EAI1B,IAAIuqC,GAAe/zC,KAAKm3B,eAEpBxnB,EAAO7M,EAAQkwC,eAAexpC,GAC9B2mC,EAAYxgC,GAAQA,EAAKtP,MAC7BL,MAAKi3B,aAAakZ,EAElB,IAAI6D,GAAeh0C,KAAKm3B,gBAIpB6c,EAAatuC,OAAS,GAAKquC,EAAaruC,OAAS,IACnD1F,KAAKk1B,KAAKE,QAAQnH,KAAK,UACrBhsB,MAAO+xC,MAUblxC,EAAQ2Q,UAAUo9B,WAAa,SAAUrnC,GACvC,GAAKxJ,KAAK+O,QAAQkgC,YACbjvC,KAAK+O,QAAQmgC,SAAS37B,IAA3B,CAEA,GAAIkB,GAAKzU,KACLu1B,EAAOv1B,KAAKk1B,KAAKv0B,KAAK40B,MAAQ,KAC9B5lB,EAAO7M,EAAQkwC,eAAexpC,EAElC,IAAImG,EAAM,CAIR,GAAIynB,GAAW3iB,EAAG4hB,UAAU7gB,IAAI7F,EAAKtP,GACrCL,MAAK+O,QAAQsgC,SAASjY,EAAU,SAAUA,GACpCA,GACF3iB,EAAG4hB,UAAUhgB,aAAalB,OAAOiiB,SAIlC,CAEH,GAAI6c,GAAOtzC,EAAK0G,gBAAgBrH,KAAKmwB,IAAI3Q,OACrCnN,EAAI7I,EAAMy2B,QAAQ5T,OAAO2S,MAAQiV,EACjC/jC,EAAQlQ,KAAKk1B,KAAKv0B,KAAKi1B,OAAOvjB,GAC9B6hC,GACFhkC,MAAOqlB,EAAOA,EAAKrlB,GAASA,EAC5B8f,QAAS,WAIX,IAA0B,UAAtBhwB,KAAK+O,QAAQlI,KAAkB,CACjC,GAAIsJ,GAAMnQ,KAAKk1B,KAAKv0B,KAAKi1B,OAAOvjB,EAAIrS,KAAK+F,MAAM8M,MAAQ,EACvDqhC,GAAQ/jC,IAAMolB,EAAOA,EAAKplB,GAAOA,EAGnC+jC,EAAQl0C,KAAKq2B,UAAUljB,UAAYxS,EAAKoE,YAExC,IAAIwN,GAAQzP,EAAQ0wC,gBAAgBhqC,EAChC+I,KACF2hC,EAAQ3hC,MAAQA,EAAMqlB,SAIxB53B,KAAK+O,QAAQqgC,MAAM8E,EAAS,SAAUvkC,GAChCA,GACF8E,EAAG4hB,UAAUhgB,aAAa9C,IAAI5D,QAYtC7M,EAAQ2Q,UAAUm9B,mBAAqB,SAAUpnC,GAC/C,GAAKxJ,KAAK+O,QAAQkgC,WAAlB,CAEA,GAAIkB,GACAxgC,EAAO7M,EAAQkwC,eAAexpC,EAElC,IAAImG,EAAM,CAERwgC,EAAYnwC,KAAKm3B,cAEjB,IAAI2c,GAAWtqC,EAAMy2B,QAAQW,QAAQ,IAAMp3B,EAAMy2B,QAAQW,QAAQ,GAAGkT,WAAY,CAChF,IAAIA,EAAU,CAIZ3D,EAAUjoC,KAAKyH,EAAKtP,GACpB,IAAI21B,GAAQlzB,EAAQqxC,cAAcn0C,KAAKq2B,UAAU7gB,IAAI26B,EAAWnwC,KAAKyvC,aAGrEU,KACA,KAAK,GAAI9vC,KAAML,MAAKiC,MAClB,GAAIjC,KAAKiC,MAAM4D,eAAexF,GAAK,CACjC,GAAI+zC,GAAQp0C,KAAKiC,MAAM5B,GACnB6P,EAAQkkC,EAAMphC,KAAK9C,MACnBC,EAA0B5J,SAAnB6tC,EAAMphC,KAAK7C,IAAqBikC,EAAMphC,KAAK7C,IAAMD,CAExDA,IAAS8lB,EAAMvqB,KAAO0E,GAAO6lB,EAAM9oB,KACrCijC,EAAUjoC,KAAKksC,EAAM/zC,SAKxB,CAEH,GAAIgI,GAAQ8nC,EAAUzpC,QAAQiJ,EAAKtP,GACtB,KAATgI,EAEF8nC,EAAUjoC,KAAKyH,EAAKtP,IAIpB8vC,EAAU7nC,OAAOD,EAAO,GAI5BrI,KAAKi3B,aAAakZ,GAElBnwC,KAAKk1B,KAAKE,QAAQnH,KAAK,UACrBhsB,MAAOjC,KAAKm3B,oBAWlBr0B,EAAQqxC,cAAgB,SAAS9d,GAC/B,GAAInpB,GAAM,KACNzB,EAAM,IAmBV,OAjBA4qB,GAAU9tB,QAAQ,SAAUyK,IACf,MAAPvH,GAAeuH,EAAK9C,MAAQzE,KAC9BA,EAAMuH,EAAK9C,OAGG3J,QAAZyM,EAAK7C,KACI,MAAPjD,GAAe8F,EAAK7C,IAAMjD,KAC5BA,EAAM8F,EAAK7C,MAIF,MAAPjD,GAAe8F,EAAK9C,MAAQhD,KAC9BA,EAAM8F,EAAK9C,UAMfzE,IAAKA,EACLyB,IAAKA,IAUTpK,EAAQkwC,eAAiB,SAASxpC,GAEhC,IADA,GAAIG,GAASH,EAAMG,OACZA,GAAQ,CACb,GAAIA,EAAO9D,eAAe,iBACxB,MAAO8D,GAAO,gBAEhBA,GAASA,EAAOG,WAGlB,MAAO,OASThH,EAAQ0wC,gBAAkB,SAAShqC,GAEjC,IADA,GAAIG,GAASH,EAAMG,OACZA,GAAQ,CACb,GAAIA,EAAO9D,eAAe,kBACxB,MAAO8D,GAAO,iBAEhBA,GAASA,EAAOG,WAGlB,MAAO,OASThH,EAAQuxC,kBAAoB,SAAS7qC,GAEnC,IADA,GAAIG,GAASH,EAAMG,OACZA,GAAQ,CACb,GAAIA,EAAO9D,eAAe,oBACxB,MAAO8D,GAAO,mBAEhBA,GAASA,EAAOG,WAGlB,MAAO,OAGTjK,EAAOD,QAAUkD,GAKb,SAASjD,EAAQD,EAASM,GAS9B,QAAS6C,GAAOmyB,EAAMnmB,EAASulC,EAAM1O,GACnC5lC,KAAKk1B,KAAOA,EACZl1B,KAAK40B,gBACH5lB,SAAS,EACT+2B,OAAO,EACPwO,SAAU,GACVC,YAAa,EACbhtC,MACEohB,SAAS,EACT9E,SAAU,YAEZyD,OACEqB,SAAS,EACT9E,SAAU,aAGd9jB,KAAKs0C,KAAOA,EACZt0C,KAAK+O,QAAUpO,EAAK0E,UAAUrF,KAAK40B,gBACnC50B,KAAK4lC,iBAAmBA,EAExB5lC,KAAKgnC,eACLhnC,KAAKmwB,OACLnwB,KAAK00B,UACL10B,KAAKknC,eAAiB,EACtBlnC,KAAKi1B,UAELj1B,KAAKwT,WAAWzE,GAjClB,GAAIpO,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9BqC,EAAYrC,EAAoB,GAkCpC6C,GAAO0Q,UAAY,GAAIlR,GAEvBQ,EAAO0Q,UAAUuD,MAAQ,WACvBhX,KAAK00B,UACL10B,KAAKknC,eAAiB,GAGxBnkC,EAAO0Q,UAAU4zB,SAAW,SAAS1e,EAAO2e,GAErCtnC,KAAK00B,OAAO7uB,eAAe8iB,KAC9B3oB,KAAK00B,OAAO/L,GAAS2e,GAEvBtnC,KAAKknC,gBAAkB,GAGzBnkC,EAAO0Q,UAAU8zB,YAAc,SAAS5e,EAAO2e,GAC7CtnC,KAAK00B,OAAO/L,GAAS2e,GAGvBvkC,EAAO0Q,UAAU+zB,YAAc,SAAS7e,GAClC3oB,KAAK00B,OAAO7uB,eAAe8iB,WACtB3oB,MAAK00B,OAAO/L,GACnB3oB,KAAKknC,gBAAkB,IAI3BnkC,EAAO0Q,UAAUwhB,QAAU,WACzBj1B,KAAKmwB,IAAI3Q,MAAQ3N,SAASM,cAAc,OACxCnS,KAAKmwB,IAAI3Q,MAAMzX,UAAY,SAC3B/H,KAAKmwB,IAAI3Q,MAAMhS,MAAMsW,SAAW,WAChC9jB,KAAKmwB,IAAI3Q,MAAMhS,MAAM5F,IAAM,OAC3B5H,KAAKmwB,IAAI3Q,MAAMhS,MAAMm6B,QAAU,QAE/B3nC,KAAKmwB,IAAIskB,SAAW5iC,SAASM,cAAc,OAC3CnS,KAAKmwB,IAAIskB,SAAS1sC,UAAY,aAC9B/H,KAAKmwB,IAAIskB,SAASjnC,MAAMsW,SAAW,WACnC9jB,KAAKmwB,IAAIskB,SAASjnC,MAAM5F,IAAM,MAE9B5H,KAAK2lC,IAAM9zB,SAASC,gBAAgB,6BAA6B,OACjE9R,KAAK2lC,IAAIn4B,MAAMsW,SAAW,WAC1B9jB,KAAK2lC,IAAIn4B,MAAM5F,IAAM,MACrB5H,KAAK2lC,IAAIn4B,MAAMqF,MAAQ7S,KAAK+O,QAAQwlC,SAAW,EAAI,KACnDv0C,KAAK2lC,IAAIn4B,MAAMsF,OAAS,OAExB9S,KAAKmwB,IAAI3Q,MAAMzN,YAAY/R,KAAK2lC,KAChC3lC,KAAKmwB,IAAI3Q,MAAMzN,YAAY/R,KAAKmwB,IAAIskB,WAMtC1xC,EAAO0Q,UAAUg0B,KAAO,WAElBznC,KAAKmwB,IAAI3Q,MAAM1V,YACjB9J,KAAKmwB,IAAI3Q,MAAM1V,WAAW2H,YAAYzR,KAAKmwB,IAAI3Q,QAQnDzc,EAAO0Q,UAAUi0B,KAAO,WAEjB1nC,KAAKmwB,IAAI3Q,MAAM1V,YAClB9J,KAAKk1B,KAAK/E,IAAI9D,OAAOta,YAAY/R,KAAKmwB,IAAI3Q,QAI9Czc,EAAO0Q,UAAUD,WAAa,SAASzE,GACrC,GAAIP,IAAU,UAAU,cAAc,QAAQ,OAAO,QACrD7N,GAAKuF,oBAAoBsI,EAAQxO,KAAK+O,QAASA,IAGjDhM,EAAO0Q,UAAUkO,OAAS,WACxB,GAAIwmB,GAAe,CACnB,KAAK,GAAIvQ,KAAW53B,MAAK00B,OACnB10B,KAAK00B,OAAO7uB,eAAe+xB,KACO,GAAhC53B,KAAK00B,OAAOkD,GAAShP,SAAkEriB,SAA9CvG,KAAK4lC,iBAAiB9N,WAAWF,IAAuE,GAA7C53B,KAAK4lC,iBAAiB9N,WAAWF,IACvIuQ,IAKN,IAAuC,GAAnCnoC,KAAK+O,QAAQ/O,KAAKs0C,MAAM1rB,SAA2C,GAAvB5oB,KAAKknC,gBAA+C,GAAxBlnC,KAAK+O,QAAQC,SAAoC,GAAhBm5B,EAC3GnoC,KAAKynC,WAEF,CAqBH,GApBAznC,KAAK0nC,OACmC,YAApC1nC,KAAK+O,QAAQ/O,KAAKs0C,MAAMxwB,UAA8D,eAApC9jB,KAAK+O,QAAQ/O,KAAKs0C,MAAMxwB,UAC5E9jB,KAAKmwB,IAAI3Q,MAAMhS,MAAMhG,KAAO,MAC5BxH,KAAKmwB,IAAI3Q,MAAMhS,MAAMgb,UAAY,OACjCxoB,KAAKmwB,IAAIskB,SAASjnC,MAAMgb,UAAY,OACpCxoB,KAAKmwB,IAAIskB,SAASjnC,MAAMhG,KAAQxH,KAAK+O,QAAQwlC,SAAW,GAAM,KAC9Dv0C,KAAKmwB,IAAIskB,SAASjnC,MAAM+Z,MAAQ,GAChCvnB,KAAK2lC,IAAIn4B,MAAMhG,KAAO,MACtBxH,KAAK2lC,IAAIn4B,MAAM+Z,MAAQ,KAGvBvnB,KAAKmwB,IAAI3Q,MAAMhS,MAAM+Z,MAAQ,MAC7BvnB,KAAKmwB,IAAI3Q,MAAMhS,MAAMgb,UAAY,QACjCxoB,KAAKmwB,IAAIskB,SAASjnC,MAAMgb,UAAY,QACpCxoB,KAAKmwB,IAAIskB,SAASjnC,MAAM+Z,MAASvnB,KAAK+O,QAAQwlC,SAAW,GAAM,KAC/Dv0C,KAAKmwB,IAAIskB,SAASjnC,MAAMhG,KAAO,GAC/BxH,KAAK2lC,IAAIn4B,MAAM+Z,MAAQ,MACvBvnB,KAAK2lC,IAAIn4B,MAAMhG,KAAO,IAGgB,YAApCxH,KAAK+O,QAAQ/O,KAAKs0C,MAAMxwB,UAA8D,aAApC9jB,KAAK+O,QAAQ/O,KAAKs0C,MAAMxwB,SAC5E9jB,KAAKmwB,IAAI3Q,MAAMhS,MAAM5F,IAAM,EAAI3D,OAAOjE,KAAKk1B,KAAK/E,IAAI9D,OAAO7e,MAAM5F,IAAIwE,QAAQ,KAAK,KAAO,KACzFpM,KAAKmwB,IAAI3Q,MAAMhS,MAAMgW,OAAS,OAE3B,CACH,GAAIkxB,GAAmB10C,KAAKk1B,KAAKC,SAAS9I,OAAOvZ,OAAS9S,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,MAC7F9S,MAAKmwB,IAAI3Q,MAAMhS,MAAMgW,OAAS,EAAIkxB,EAAmBzwC,OAAOjE,KAAKk1B,KAAK/E,IAAI9D,OAAO7e,MAAM5F,IAAIwE,QAAQ,KAAK,KAAO,KAC/GpM,KAAKmwB,IAAI3Q,MAAMhS,MAAM5F,IAAM,GAGH,GAAtB5H,KAAK+O,QAAQg3B,OACf/lC,KAAKmwB,IAAI3Q,MAAMhS,MAAMqF,MAAQ7S,KAAKmwB,IAAIskB,SAASjkB,YAAc,GAAK,KAClExwB,KAAKmwB,IAAIskB,SAASjnC,MAAM+Z,MAAQ,GAChCvnB,KAAKmwB,IAAIskB,SAASjnC,MAAMhG,KAAO,GAC/BxH,KAAK2lC,IAAIn4B,MAAMqF,MAAQ,QAGvB7S,KAAKmwB,IAAI3Q,MAAMhS,MAAMqF,MAAQ7S,KAAK+O,QAAQwlC,SAAW,GAAKv0C,KAAKmwB,IAAIskB,SAASjkB,YAAc,GAAK,KAC/FxwB,KAAK20C,kBAGP,IAAI3kB,GAAU,EACd,KAAK,GAAI4H,KAAW53B,MAAK00B,OACnB10B,KAAK00B,OAAO7uB,eAAe+xB,KACO,GAAhC53B,KAAK00B,OAAOkD,GAAShP,SAAkEriB,SAA9CvG,KAAK4lC,iBAAiB9N,WAAWF,IAAuE,GAA7C53B,KAAK4lC,iBAAiB9N,WAAWF,KACvI5H,GAAWhwB,KAAK00B,OAAOkD,GAAS5H,QAAU,UAIhDhwB,MAAKmwB,IAAIskB,SAAStwB,UAAY6L,EAC9BhwB,KAAKmwB,IAAIskB,SAASjnC,MAAMmjB,WAAe,IAAO3wB,KAAK+O,QAAQwlC,SAAYv0C,KAAK+O,QAAQylC,YAAe,OAIvGzxC,EAAO0Q,UAAUkhC,gBAAkB,WACjC,GAAI30C,KAAKmwB,IAAI3Q,MAAM1V,WAAY,CAC7BlJ,EAAQuQ,gBAAgBnR,KAAKgnC,YAC7B,IAAI9iB,GAAUzc,OAAOmtC,iBAAiB50C,KAAKmwB,IAAI3Q,OAAOq1B,WAClD/M,EAAa7jC,OAAOigB,EAAQ9X,QAAQ,KAAK,KACzCiG,EAAIy1B,EACJ1B,EAAYpmC,KAAK+O,QAAQwlC,SACzB1M,EAAa,IAAO7nC,KAAK+O,QAAQwlC,SACjCjiC,EAAIw1B,EAAa,GAAMD,EAAa,CAExC7nC,MAAK2lC,IAAIn4B,MAAMqF,MAAQuzB,EAAY,EAAI0B,EAAa,IAEpD,KAAK,GAAIlQ,KAAW53B,MAAK00B,OACnB10B,KAAK00B,OAAO7uB,eAAe+xB,KACO,GAAhC53B,KAAK00B,OAAOkD,GAAShP,SAAkEriB,SAA9CvG,KAAK4lC,iBAAiB9N,WAAWF,IAAuE,GAA7C53B,KAAK4lC,iBAAiB9N,WAAWF,KACvI53B,KAAK00B,OAAOkD,GAASmQ,SAAS11B,EAAGC,EAAGtS,KAAKgnC,YAAahnC,KAAK2lC,IAAKS,EAAWyB,GAC3Ev1B,GAAKu1B,EAAa7nC,KAAK+O,QAAQylC,aAKrC5zC,GAAQ4Q,gBAAgBxR,KAAKgnC,eAIjCnnC,EAAOD,QAAUmD,GAKb,SAASlD,EAAQD,EAASM,GAqB9B,QAAS8C,GAAUkyB,EAAMnmB,GACvB/O,KAAKK,GAAKM,EAAKoE,aACf/E,KAAKk1B,KAAOA,EAEZl1B,KAAK40B,gBACHgX,iBAAkB,OAClBkJ,aAAc,UACdr+B,MAAM,EACNs+B,UAAU,EACVC,YAAa,QACbzJ,QACEv8B,SAAS,EACT8lB,YAAa,UAEftnB,MAAO,OACPynC,UACEpiC,MAAO,GACPqiC,cAAe,UACfnG,MAAO,UAEThE,YACE/7B,SAAS,EACTg8B,gBAAiB,cACjBC,MAAO,IAETx4B,YACEzD,SAAS,EACT2D,KAAM,EACNnF,MAAO,UAET2nC,UACEtP,iBAAiB,EACjBC,iBAAiB,EACjBC,OAAO,EACPlzB,MAAO,OACP+V,SAAS,EACTiT,YAAY,EACZD,aACEp0B,MAAOiE,IAAIlF,OAAW2G,IAAI3G,QAC1BghB,OAAQ9b,IAAIlF,OAAW2G,IAAI3G,UAkB/B6uC,QACEpmC,SAAS,EACT+2B,OAAO,EACPv+B,MACEohB,SAAS,EACT9E,SAAU,YAEZyD,OACEqB,SAAS,EACT9E,SAAU,cAGd4Q,QACEoD,gBAKJ93B,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBACpC50B,KAAKmwB,OACLnwB,KAAK+F,SACL/F,KAAK8D,OAAS,KACd9D,KAAK00B,UACL10B,KAAKq1C,oBAAqB,EAC1Br1C,KAAKs1C,aAAc,CAEnB,IAAI7gC,GAAKzU,IACTA,MAAKq2B,UAAY,KACjBr2B,KAAKs2B,WAAa,KAGlBt2B,KAAK0vC,eACHn8B,IAAO,SAAU/J,EAAO4K,GACtBK,EAAGk7B,OAAOv7B,EAAOnS,QAEnBkT,OAAU,SAAU3L,EAAO4K,GACzBK,EAAGm7B,UAAUx7B,EAAOnS,QAEtB2U,OAAU,SAAUpN,EAAO4K,GACzBK,EAAGo7B,UAAUz7B,EAAOnS,SAKxBjC,KAAK8vC,gBACHv8B,IAAO,SAAU/J,EAAO4K,GACtBK,EAAGs7B,aAAa37B,EAAOnS,QAEzBkT,OAAU,SAAU3L,EAAO4K,GACzBK,EAAGu7B,gBAAgB57B,EAAOnS,QAE5B2U,OAAU,SAAUpN,EAAO4K,GACzBK,EAAGw7B,gBAAgB77B,EAAOnS,SAI9BjC,KAAKiC,SACLjC,KAAKmwC,aACLnwC,KAAKu1C,UAAYv1C,KAAKk1B,KAAKc,MAAM9lB,MACjClQ,KAAKqwC,eAELrwC,KAAKgnC,eACLhnC,KAAKwT,WAAWzE,GAChB/O,KAAKwqC,0BAA4B,GAEjCxqC,KAAKk1B,KAAKE,QAAQvhB,GAAG,eAAgB,WACnCY,EAAG8gC,UAAY9gC,EAAGygB,KAAKc,MAAM9lB,MAC7BuE,EAAGkxB,IAAIn4B,MAAMhG,KAAO7G,EAAKoJ,OAAOK,QAAQqK,EAAG5B,OAC3C4B,EAAG+gC,aAAal9B,MAAM7D,KAIxBzU,KAAKi1B,UACLj1B,KAAKgsC,WAAarG,IAAK3lC,KAAK2lC,IAAKqB,YAAahnC,KAAKgnC,YAAaj4B,QAAS/O,KAAK+O,QAAS2lB,OAAQ10B,KAAK00B,QACpG10B,KAAKk1B,KAAKE,QAAQnH,KAAK,UAtJzB,GAAIttB,GAAOT,EAAoB,GAC3BU,EAAUV,EAAoB,GAC9BW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BqC,EAAYrC,EAAoB,IAChCwC,EAAWxC,EAAoB,IAC/ByC,EAAazC,EAAoB,IACjC6C,EAAS7C,EAAoB,IAC7Bu1C,EAAoBv1C,EAAoB,IAExCowC,EAAY,eAgJhBttC,GAAUyQ,UAAY,GAAIlR,GAK1BS,EAAUyQ,UAAUwhB,QAAU,WAC5B,GAAIzV,GAAQ3N,SAASM,cAAc,MACnCqN,GAAMzX,UAAY,YAClB/H,KAAKmwB,IAAI3Q,MAAQA,EAGjBxf,KAAK2lC,IAAM9zB,SAASC,gBAAgB,6BAA6B,OACjE9R,KAAK2lC,IAAIn4B,MAAMsW,SAAW,WAC1B9jB,KAAK2lC,IAAIn4B,MAAMsF,QAAU,GAAK9S,KAAK+O,QAAQimC,aAAa5oC,QAAQ,KAAK,IAAM,KAC3EpM,KAAK2lC,IAAIn4B,MAAMm6B,QAAU,QACzBnoB,EAAMzN,YAAY/R,KAAK2lC,KAGvB3lC,KAAK+O,QAAQomC,SAASrgB,YAAc,OACpC90B,KAAK01C,UAAY,GAAIhzC,GAAS1C,KAAKk1B,KAAMl1B,KAAK+O,QAAQomC,SAAUn1C,KAAK2lC,IAAK3lC,KAAK+O,QAAQ2lB,QAEvF10B,KAAK+O,QAAQomC,SAASrgB,YAAc,QACpC90B,KAAK21C,WAAa,GAAIjzC,GAAS1C,KAAKk1B,KAAMl1B,KAAK+O,QAAQomC,SAAUn1C,KAAK2lC,IAAK3lC,KAAK+O,QAAQ2lB,cACjF10B,MAAK+O,QAAQomC,SAASrgB,YAG7B90B,KAAK41C,WAAa,GAAI7yC,GAAO/C,KAAKk1B,KAAMl1B,KAAK+O,QAAQqmC,OAAQ,OAAQp1C,KAAK+O,QAAQ2lB,QAClF10B,KAAK61C,YAAc,GAAI9yC,GAAO/C,KAAKk1B,KAAMl1B,KAAK+O,QAAQqmC,OAAQ,QAASp1C,KAAK+O,QAAQ2lB,QAEpF10B,KAAK0nC,QAOP1kC,EAAUyQ,UAAUD,WAAa,SAASzE,GACxC,GAAIA,EAAS,CACX,GAAIP,IAAU,WAAW,eAAe,cAAc,mBAAmB,QAAQ,WAAW,WAAW,OAAO,SAClFjI,UAAxBwI,EAAQimC,aAAgDzuC,SAAnBwI,EAAQ+D,QAAsEvM,SAA9CvG,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,OAC1G9S,KAAKs1C,aAAc,EAEkC/uC,SAA9CvG,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,QAAgDvM,SAAxBwI,EAAQimC,aACtEhqB,UAAUjc,EAAQimC,YAAc,IAAI5oC,QAAQ,KAAK,KAAOpM,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,SAC7F9S,KAAKs1C,aAAc,GAGvB30C,EAAKuF,oBAAoBsI,EAAQxO,KAAK+O,QAASA,GAC/CpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,cACxCpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,cACxCpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,UACxCpO,EAAKkO,aAAa7O,KAAK+O,QAASA,EAAQ,UAEpCA,EAAQg8B,YACuB,gBAAtBh8B,GAAQg8B,YACbh8B,EAAQg8B,WAAWC,kBACqB,WAAtCj8B,EAAQg8B,WAAWC,gBACrBhrC,KAAK+O,QAAQg8B,WAAWE,MAAQ,EAEa,WAAtCl8B,EAAQg8B,WAAWC,gBAC1BhrC,KAAK+O,QAAQg8B,WAAWE,MAAQ,GAGhCjrC,KAAK+O,QAAQg8B,WAAWC,gBAAkB,cAC1ChrC,KAAK+O,QAAQg8B,WAAWE,MAAQ,KAMpCjrC,KAAK01C,WACkBnvC,SAArBwI,EAAQomC,WACVn1C,KAAK01C,UAAUliC,WAAWxT,KAAK+O,QAAQomC,UACvCn1C,KAAK21C,WAAWniC,WAAWxT,KAAK+O,QAAQomC,WAIxCn1C,KAAK41C,YACgBrvC,SAAnBwI,EAAQqmC,SACVp1C,KAAK41C,WAAWpiC,WAAWxT,KAAK+O,QAAQqmC,QACxCp1C,KAAK61C,YAAYriC,WAAWxT,KAAK+O,QAAQqmC,SAIzCp1C,KAAK00B,OAAO7uB,eAAeyqC,IAC7BtwC,KAAK00B,OAAO4b,GAAW98B,WAAWzE,GAGlC/O,KAAKmwB,IAAI3Q,OACXxf,KAAKw1C,gBAOTxyC,EAAUyQ,UAAUg0B,KAAO,WAErBznC,KAAKmwB,IAAI3Q,MAAM1V,YACjB9J,KAAKmwB,IAAI3Q,MAAM1V,WAAW2H,YAAYzR,KAAKmwB,IAAI3Q,QASnDxc,EAAUyQ,UAAUi0B,KAAO,WAEpB1nC,KAAKmwB,IAAI3Q,MAAM1V,YAClB9J,KAAKk1B,KAAK/E,IAAI9D,OAAOta,YAAY/R,KAAKmwB,IAAI3Q,QAS9Cxc,EAAUyQ,UAAU+iB,SAAW,SAASv0B,GACtC,GACEwT,GADEhB,EAAKzU,KAEPsyC,EAAetyC,KAAKq2B,SAGtB,IAAKp0B,EAGA,CAAA,KAAIA,YAAiBpB,IAAWoB,YAAiBnB,IAIpD,KAAM,IAAIsF,WAAU,kDAHpBpG,MAAKq2B,UAAYp0B,MAHjBjC,MAAKq2B,UAAY,IAoBnB,IAXIic,IAEF3xC,EAAK4H,QAAQvI,KAAK0vC,cAAe,SAAUlnC,EAAUgB,GACnD8oC,EAAat+B,IAAIxK,EAAOhB,KAI1BiN,EAAM68B,EAAal8B,SACnBpW,KAAK6vC,UAAUp6B,IAGbzV,KAAKq2B,UAAW,CAElB,GAAIh2B,GAAKL,KAAKK,EACdM,GAAK4H,QAAQvI,KAAK0vC,cAAe,SAAUlnC,EAAUgB,GACnDiL,EAAG4hB,UAAUxiB,GAAGrK,EAAOhB,EAAUnI,KAInCoV,EAAMzV,KAAKq2B,UAAUjgB,SACrBpW,KAAK2vC,OAAOl6B,GAEdzV,KAAKywC,mBACLzwC,KAAKw1C,eACLx1C,KAAK2hB,UAQP3e,EAAUyQ,UAAU8iB,UAAY,SAAS7B,GACvC,GACIjf,GADAhB,EAAKzU,IAgBT,IAZIA,KAAKs2B,aACP31B,EAAK4H,QAAQvI,KAAK8vC,eAAgB,SAAUtnC,EAAUgB,GACpDiL,EAAG6hB,WAAWpiB,YAAY1K,EAAOhB,KAInCiN,EAAMzV,KAAKs2B,WAAWlgB,SACtBpW,KAAKs2B,WAAa,KAClBt2B,KAAKiwC,gBAAgBx6B,IAIlBif,EAGA,CAAA,KAAIA,YAAkB7zB,IAAW6zB,YAAkB5zB,IAItD,KAAM,IAAIsF,WAAU,kDAHpBpG,MAAKs2B,WAAa5B,MAHlB10B,MAAKs2B,WAAa,IASpB,IAAIt2B,KAAKs2B,WAAY,CAEnB,GAAIj2B,GAAKL,KAAKK,EACdM,GAAK4H,QAAQvI,KAAK8vC,eAAgB,SAAUtnC,EAAUgB,GACpDiL,EAAG6hB,WAAWziB,GAAGrK,EAAOhB,EAAUnI,KAIpCoV,EAAMzV,KAAKs2B,WAAWlgB,SACtBpW,KAAK+vC,aAAat6B,GAEpBzV,KAAK4vC,aASP5sC,EAAUyQ,UAAUm8B,UAAY,WAC9B5vC,KAAKywC,mBACLzwC,KAAK81C,sBACL91C,KAAKw1C,eACLx1C,KAAK2hB,UAEP3e,EAAUyQ,UAAUk8B,OAAkB,SAAUl6B,GAAMzV,KAAK4vC,UAAUn6B,IACrEzS,EAAUyQ,UAAUo8B,UAAkB,SAAUp6B,GAAMzV,KAAK4vC,UAAUn6B,IACrEzS,EAAUyQ,UAAUu8B,gBAAmB,SAAUE,GAC/C,IAAK,GAAI3qC,GAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAAK,CACxC,GAAIgN,GAAQvS,KAAKs2B,WAAW9gB,IAAI06B,EAAS3qC,GACzCvF,MAAK+1C,aAAaxjC,EAAO29B,EAAS3qC,IAGpCvF,KAAKw1C,eACLx1C,KAAK2hB,UAEP3e,EAAUyQ,UAAUs8B,aAAe,SAAUG,GAAWlwC,KAAKgwC,gBAAgBE,IAQ7EltC,EAAUyQ,UAAUw8B,gBAAkB,SAAUC,GAC9C,IAAK,GAAI3qC,GAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAC/BvF,KAAK00B,OAAO7uB,eAAeqqC,EAAS3qC,MACmB,SAArDvF,KAAK00B,OAAOwb,EAAS3qC,IAAIwJ,QAAQ68B,kBACnC5rC,KAAK21C,WAAWnO,YAAY0I,EAAS3qC,IACrCvF,KAAK61C,YAAYrO,YAAY0I,EAAS3qC,IACtCvF,KAAK61C,YAAYl0B,WAGjB3hB,KAAK01C,UAAUlO,YAAY0I,EAAS3qC,IACpCvF,KAAK41C,WAAWpO,YAAY0I,EAAS3qC,IACrCvF,KAAK41C,WAAWj0B,gBAEX3hB,MAAK00B,OAAOwb,EAAS3qC,IAGhCvF,MAAKywC,mBACLzwC,KAAKw1C,eACLx1C,KAAK2hB,UAWP3e,EAAUyQ,UAAUsiC,aAAe,SAAUxjC,EAAOqlB,GAC7C53B,KAAK00B,OAAO7uB,eAAe+xB,IAY9B53B,KAAK00B,OAAOkD,GAASziB,OAAO5C,GACyB,SAAjDvS,KAAK00B,OAAOkD,GAAS7oB,QAAQ68B,kBAC/B5rC,KAAK21C,WAAWpO,YAAY3P,EAAS53B,KAAK00B,OAAOkD,IACjD53B,KAAK61C,YAAYtO,YAAY3P,EAAS53B,KAAK00B,OAAOkD,MAGlD53B,KAAK01C,UAAUnO,YAAY3P,EAAS53B,KAAK00B,OAAOkD,IAChD53B,KAAK41C,WAAWrO,YAAY3P,EAAS53B,KAAK00B,OAAOkD,OAlBnD53B,KAAK00B,OAAOkD,GAAW,GAAIj1B,GAAW4P,EAAOqlB,EAAS53B,KAAK+O,QAAS/O,KAAKwqC,0BACpB,SAAjDxqC,KAAK00B,OAAOkD,GAAS7oB,QAAQ68B,kBAC/B5rC,KAAK21C,WAAWtO,SAASzP,EAAS53B,KAAK00B,OAAOkD,IAC9C53B,KAAK61C,YAAYxO,SAASzP,EAAS53B,KAAK00B,OAAOkD,MAG/C53B,KAAK01C,UAAUrO,SAASzP,EAAS53B,KAAK00B,OAAOkD,IAC7C53B,KAAK41C,WAAWvO,SAASzP,EAAS53B,KAAK00B,OAAOkD,MAclD53B,KAAK41C,WAAWj0B,SAChB3hB,KAAK61C,YAAYl0B,UASnB3e,EAAUyQ,UAAUqiC,oBAAsB,WACxC,GAAsB,MAAlB91C,KAAKq2B,UAAmB,CAC1B,GACIuB,GADAoe,IAEJ,KAAKpe,IAAW53B,MAAK00B,OACf10B,KAAK00B,OAAO7uB,eAAe+xB,KAC7Boe,EAAcpe,MAGlB,KAAK,GAAI/hB,KAAU7V,MAAKq2B,UAAUnjB,MAChC,GAAIlT,KAAKq2B,UAAUnjB,MAAMrN,eAAegQ,GAAS,CAC/C,GAAIlG,GAAO3P,KAAKq2B,UAAUnjB,MAAM2C,EAChC,IAAkCtP,SAA9ByvC,EAAcrmC,EAAK4C,OACrB,KAAM,IAAI3O,OAAM,4IAElB+L,GAAK0C,EAAI1R,EAAKiG,QAAQ+I,EAAK0C,EAAE,QAC7B2jC,EAAcrmC,EAAK4C,OAAOrK,KAAKyH,GAGnC,IAAKioB,IAAW53B,MAAK00B,OACf10B,KAAK00B,OAAO7uB,eAAe+xB,IAC7B53B,KAAK00B,OAAOkD,GAASpB,SAASwf,EAAcpe,MAYpD50B,EAAUyQ,UAAUg9B,iBAAmB,WACrC,GAAIzwC,KAAKq2B,WAA+B,MAAlBr2B,KAAKq2B,UAAmB,CAC5C,GAAI4f,GAAmB,CACvB,KAAK,GAAIpgC,KAAU7V,MAAKq2B,UAAUnjB,MAChC,GAAIlT,KAAKq2B,UAAUnjB,MAAMrN,eAAegQ,GAAS,CAC/C,GAAIlG,GAAO3P,KAAKq2B,UAAUnjB,MAAM2C,EACpBtP,SAARoJ,IACEA,EAAK9J,eAAe,SACHU,SAAfoJ,EAAK4C,QACP5C,EAAK4C,MAAQ+9B,GAIf3gC,EAAK4C,MAAQ+9B,EAEf2F,EAAmBtmC,EAAK4C,OAAS+9B,EAAY2F,EAAmB,EAAIA,GAK1E,GAAwB,GAApBA,QACKj2C,MAAK00B,OAAO4b,GACnBtwC,KAAK41C,WAAWpO,YAAY8I,GAC5BtwC,KAAK61C,YAAYrO,YAAY8I,GAC7BtwC,KAAK01C,UAAUlO,YAAY8I,GAC3BtwC,KAAK21C,WAAWnO,YAAY8I,OAEzB,CACH,GAAI/9B,IAASlS,GAAIiwC,EAAWtgB,QAAShwB,KAAK+O,QAAQ+lC,aAClD90C,MAAK+1C,aAAaxjC,EAAO+9B,eAIpBtwC,MAAK00B,OAAO4b,GACnBtwC,KAAK41C,WAAWpO,YAAY8I,GAC5BtwC,KAAK61C,YAAYrO,YAAY8I,GAC7BtwC,KAAK01C,UAAUlO,YAAY8I,GAC3BtwC,KAAK21C,WAAWnO,YAAY8I,EAG9BtwC,MAAK41C,WAAWj0B,SAChB3hB,KAAK61C,YAAYl0B,UAQnB3e,EAAUyQ,UAAUkO,OAAS,WAC3B,GAAI4iB,IAAU,CAEdvkC,MAAK2lC,IAAIn4B,MAAMsF,QAAU,GAAK9S,KAAK+O,QAAQimC,aAAa5oC,QAAQ,KAAK,IAAM,MACpD7F,SAAnBvG,KAAK0xC,WAA2B1xC,KAAK6S,OAAS7S,KAAK0xC,WAAa1xC,KAAK6S,SACvE0xB,GAAU,GAGZA,EAAUvkC,KAAKskC,cAAgBC,CAE/B,IAAIgN,GAAkBvxC,KAAKk1B,KAAKc,MAAM7lB,IAAMnQ,KAAKk1B,KAAKc,MAAM9lB,MACxDshC,EAAUD,GAAmBvxC,KAAKyxC,qBAAyBzxC,KAAK6S,OAAS7S,KAAK0xC,SAclF,IAbA1xC,KAAKyxC,oBAAsBF,EAC3BvxC,KAAK0xC,UAAY1xC,KAAK6S,MAGtB7S,KAAK6S,MAAQ7S,KAAKmwB,IAAI3Q,MAAMgR,YAIb,GAAX+T,IACFvkC,KAAK2lC,IAAIn4B,MAAMqF,MAAQlS,EAAKoJ,OAAOK,OAAO,EAAEpK,KAAK6S,OACjD7S,KAAK2lC,IAAIn4B,MAAMhG,KAAO7G,EAAKoJ,OAAOK,QAAQpK,KAAK6S,QAGnC,GAAV2+B,GAA6C,GAA3BxxC,KAAKq1C,mBACzBr1C,KAAKw1C,mBAIL,IAAsB,GAAlBx1C,KAAKu1C,UAAgB,CACvB,GAAI1rB,GAAS7pB,KAAKk1B,KAAKc,MAAM9lB,MAAQlQ,KAAKu1C,UACtCvf,EAAQh2B,KAAKk1B,KAAKc,MAAM7lB,IAAMnQ,KAAKk1B,KAAKc,MAAM9lB,KAClD,IAAkB,GAAdlQ,KAAK6S,MAAY,CACnB,GAAIqjC,GAAmBl2C,KAAK6S,MAAMmjB,EAC9BlM,EAAUD,EAASqsB,CACvBl2C,MAAK2lC,IAAIn4B,MAAMhG,MAASxH,KAAK6S,MAAQiX,EAAW,MAStD,MAHA9pB,MAAK41C,WAAWj0B,SAChB3hB,KAAK61C,YAAYl0B,SAEV4iB,GAQTvhC,EAAUyQ,UAAU+hC,aAAe,WAGjC,GADA50C,EAAQuQ,gBAAgBnR,KAAKgnC,aACX,GAAdhnC,KAAK6S,OAAgC,MAAlB7S,KAAKq2B,UAAmB,CAC7C,GAAI9jB,GAAOhN,EACP4wC,KACAC,KACAC,KACAnO,GAAe,CAGK,IAApBloC,KAAKs1C,aACHt1C,KAAK+O,QAAQimC,aAAeh1C,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,OAAS,OAC1E9S,KAAK+O,QAAQimC,YAAch1C,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,OAAS,KACvE9S,KAAK2lC,IAAIn4B,MAAMsF,OAAS9S,KAAKk1B,KAAKC,SAASgD,gBAAgBrlB,OAAS,KAKxE,IAAIo9B,KACJ,KAAK,GAAItY,KAAW53B,MAAK00B,OACnB10B,KAAK00B,OAAO7uB,eAAe+xB,KAC7BrlB,EAAQvS,KAAK00B,OAAOkD,GACC,GAAjBrlB,EAAMqW,SAAgEriB,SAA5CvG,KAAK+O,QAAQ2lB,OAAOoD,WAAWF,IAAqE,GAA3C53B,KAAK+O,QAAQ2lB,OAAOoD,WAAWF,IACpHsY,EAAShoC,KAAK0vB,GAIpB;GAAIsY,EAASxqC,OAAS,EAAG,CAEvB,GAAI4wC,GAAUt2C,KAAKk1B,KAAKv0B,KAAKm1B,cAAe91B,KAAKk1B,KAAKC,SAASz1B,KAAKmT,OAChE0jC,EAAUv2C,KAAKk1B,KAAKv0B,KAAKm1B,aAAa,EAAI91B,KAAKk1B,KAAKC,SAASz1B,KAAKmT,OAClEyjB,IAQJ,KANAt2B,KAAKw2C,iBAAiBtG,EAAU5Z,EAAYggB,EAASC,GAGrDv2C,KAAKy2C,eAAevG,EAAU5Z,GAGzB/wB,EAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAC/B4wC,EAAsBjG,EAAS3qC,IAAMvF,KAAK02C,qBAAqBpgB,EAAW4Z,EAAS3qC,IASrF,IALAvF,KAAK22C,YAAYzG,EAAUiG,EAAuBE,GAIlDnO,EAAeloC,KAAK42C,aAAa1G,EAAUmG,GACvB,GAAhBnO,EAIF,MAHAtnC,GAAQ4Q,gBAAgBxR,KAAKgnC,aAC7BhnC,KAAKq1C,oBAAqB,MAC1Br1C,MAAKk1B,KAAKE,QAAQnH,KAAK,SAMzB,KAHAjuB,KAAKq1C,oBAAqB,EAGrB9vC,EAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAC/BgN,EAAQvS,KAAK00B,OAAOwb,EAAS3qC,IAC7B6wC,EAAmBlG,EAAS3qC,IAAMvF,KAAK62C,qBAAqBvgB,EAAW4Z,EAAS3qC,IAAKgN,EAKvF,KAAKhN,EAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAC/BgN,EAAQvS,KAAK00B,OAAOwb,EAAS3qC,IACF,OAAvBgN,EAAMxD,QAAQvB,OAChB+E,EAAMw5B,KAAKqK,EAAmBlG,EAAS3qC,IAAKgN,EAAOvS,KAAKgsC,UAG5DyJ,GAAkB1J,KAAKmE,EAAUkG,EAAoBp2C,KAAKgsC,YAK9DprC,EAAQ4Q,gBAAgBxR,KAAKgnC,cAiB/BhkC,EAAUyQ,UAAU+iC,iBAAmB,SAAUtG,EAAU5Z,EAAYggB,EAASC,GAC9E,GAAIhkC,GAAOhN,EAAGwmB,EAAGpc,CACjB,IAAIugC,EAASxqC,OAAS,EACpB,IAAKH,EAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAAK,CACpCgN,EAAQvS,KAAK00B,OAAOwb,EAAS3qC,IAC7B+wB,EAAW4Z,EAAS3qC,MACpB,IAAIuxC,GAAgBxgB,EAAW4Z,EAAS3qC,GAExC,IAA0B,GAAtBgN,EAAMxD,QAAQ0H,KAAc,CAC9B,GAAIsgC,GAAQ9xC,KAAKiI,IAAI,EAAGvM,EAAKkP,kBAAkB0C,EAAM8jB,UAAWigB,EAAS,IAAK,UAC9E,KAAKvqB,EAAIgrB,EAAOhrB,EAAIxZ,EAAM8jB,UAAU3wB,OAAQqmB,IAE1C,GADApc,EAAO4C,EAAM8jB,UAAUtK,GACVxlB,SAAToJ,EAAoB,CACtB,GAAIA,EAAK0C,EAAIkkC,EAAS,CACpBO,EAAc5uC,KAAKyH,EACnB,OAGAmnC,EAAc5uC,KAAKyH,QAMzB,KAAKoc,EAAI,EAAGA,EAAIxZ,EAAM8jB,UAAU3wB,OAAQqmB,IACtCpc,EAAO4C,EAAM8jB,UAAUtK,GACVxlB,SAAToJ,GACEA,EAAK0C,EAAIikC,GAAW3mC,EAAK0C,EAAIkkC,GAC/BO,EAAc5uC,KAAKyH,KAgBjC3M,EAAUyQ,UAAUgjC,eAAiB,SAAUvG,EAAU5Z,GACvD,GAAI/jB,EACJ,IAAI29B,EAASxqC,OAAS,EACpB,IAAK,GAAIH,GAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAEnC,GADAgN,EAAQvS,KAAK00B,OAAOwb,EAAS3qC,IACC,GAA1BgN,EAAMxD,QAAQgmC,SAAkB,CAClC,GAAI+B,GAAgBxgB,EAAW4Z,EAAS3qC,GACxC,IAAIuxC,EAAcpxC,OAAS,EAAG,CAC5B,GAAIsxC,GAAY,EACZC,EAAiBH,EAAcpxC,OAI/BwxC,EAAYl3C,KAAKk1B,KAAKv0B,KAAK+0B,eAAeohB,EAAcA,EAAcpxC,OAAS,GAAG2M,GAAKrS,KAAKk1B,KAAKv0B,KAAK+0B,eAAeohB,EAAc,GAAGzkC,GACtI8kC,EAAiBF,EAAiBC,CACtCF,GAAY/xC,KAAKwG,IAAIxG,KAAKmyC,KAAK,GAAMH,GAAiBhyC,KAAKiI,IAAI,EAAGjI,KAAK8oB,MAAMopB,IAG7E,KAAK,GADDE,MACKtrB,EAAI,EAAOkrB,EAAJlrB,EAAoBA,GAAKirB,EACvCK,EAAYnvC,KAAK4uC,EAAc/qB,GAGjCuK,GAAW4Z,EAAS3qC,IAAM8xC,KAgBpCr0C,EAAUyQ,UAAUkjC,YAAc,SAAUzG,EAAU5Z,EAAY+f,GAChE,GAAIvK,GAAWv5B,EAAOhN,EAGlBwJ,EAFAuoC,KACAC,IAEJ,IAAIrH,EAASxqC,OAAS,EAAG,CACvB,IAAKH,EAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAC/BumC,EAAYxV,EAAW4Z,EAAS3qC,IAChCwJ,EAAU/O,KAAK00B,OAAOwb,EAAS3qC,IAAIwJ,QAC/B+8B,EAAUpmC,OAAS,IACrB6M,EAAQvS,KAAK00B,OAAOwb,EAAS3qC,IAES,SAAlCwJ,EAAQkmC,SAASC,eAA6C,OAAjBnmC,EAAQvB,MACvB,QAA5BuB,EAAQ68B,iBAA6B0L,EAAuBA,EAAoBhjC,OAAO/B,EAAMs5B,UAAUC,IAClEyL,EAAuBA,EAAqBjjC,OAAO/B,EAAMs5B,UAAUC,IAG5GuK,EAAYnG,EAAS3qC,IAAMgN,EAAMs5B,UAAUC,EAAUoE,EAAS3qC,IAMpEkwC,GAAkB+B,oBAAoBF,EAAsBjB,EAAanG,EAAU,iBAAmB,QACtGuF,EAAkB+B,oBAAoBD,EAAsBlB,EAAanG,EAAU,kBAAmB,WAW1GltC,EAAUyQ,UAAUmjC,aAAe,SAAU1G,EAAUmG,GACrD,GAGoEoB,GAAQC,EAHxExP,GAAe,EACfyP,GAAgB,EAChBC,GAAiB,EACjBC,EAAU,IAAKC,EAAW,IAAKC,EAAU,KAAMC,EAAW,IAE9D,IAAI9H,EAASxqC,OAAS,EAAG,CACvB,IAAK,GAAIH,GAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAC/B8wC,EAAYxwC,eAAeqqC,EAAS3qC,KAClC8wC,EAAYnG,EAAS3qC,IAAI0yC,UAAW,IACtCR,EAASpB,EAAYnG,EAAS3qC,IAAIkG,IAClCisC,EAASrB,EAAYnG,EAAS3qC,IAAI2H,IAEe,QAA7CmpC,EAAYnG,EAAS3qC,IAAIqmC,kBAC3B+L,GAAgB,EAChBE,EAAUA,EAAUJ,EAASA,EAASI,EACtCE,EAAoBL,EAAVK,EAAmBL,EAASK,IAGtCH,GAAiB,EACjBE,EAAWA,EAAWL,EAASA,EAASK,EACxCE,EAAsBN,EAAXM,EAAoBN,EAASM,GAM3B,IAAjBL,GACF33C,KAAK01C,UAAU5hB,SAAS+jB,EAASE,GAEb,GAAlBH,GACF53C,KAAK21C,WAAW7hB,SAASgkB,EAAUE,GAuCvC,MAnCA9P,GAAeloC,KAAKk4C,qBAAqBP,EAAgB33C,KAAK01C,YAAexN,EAC7EA,EAAeloC,KAAKk4C,qBAAqBN,EAAgB53C,KAAK21C,aAAezN,EAEvD,GAAlB0P,GAA2C,GAAjBD,GAC5B33C,KAAK01C,UAAUyC,WAAY,EAC3Bn4C,KAAK21C,WAAWwC,WAAY,IAG5Bn4C,KAAK01C,UAAUyC,WAAY,EAC3Bn4C,KAAK21C,WAAWwC,WAAY,GAG9Bn4C,KAAK21C,WAAW5O,QAAU4Q,EAEI,GAA1B33C,KAAK21C,WAAW5O,QACW/mC,KAAK01C,UAAU5O,WAAtB,GAAlB8Q,EAAqD53C,KAAK21C,WAAW9iC,MAChB,EAEzDq1B,EAAeloC,KAAK01C,UAAU/zB,UAAYumB,EAC1CloC,KAAK21C,WAAW/O,iBAAmB5mC,KAAK01C,UAAU/O,WAClD3mC,KAAK21C,WAAW9O,aAAe7mC,KAAK01C,UAAU7O,aAC9CqB,EAAeloC,KAAK21C,WAAWh0B,UAAYumB,GAG3CA,EAAeloC,KAAK21C,WAAWh0B,UAAYumB,EAIH,IAAtCgI,EAASxpC,QAAQ,mBACnBwpC,EAAS5nC,OAAO4nC,EAASxpC,QAAQ,kBAAkB,GAEV,IAAvCwpC,EAASxpC,QAAQ,oBACnBwpC,EAAS5nC,OAAO4nC,EAASxpC,QAAQ,mBAAmB,GAG/CwhC,GAYTllC,EAAUyQ,UAAUykC,qBAAuB,SAAUE,EAAU7W,GAC7D,GAAI/B,IAAU,CAad,OAZgB,IAAZ4Y,EACE7W,EAAKpR,IAAI3Q,MAAM1V,aACjBy3B,EAAKkG,OACLjI,GAAU,GAIP+B,EAAKpR,IAAI3Q,MAAM1V,aAClBy3B,EAAKmG,OACLlI,GAAU,GAGPA,GAaTx8B,EAAUyQ,UAAUijC,qBAAuB,SAAU2B,GAKnD,IAAK,GAHDC,GAAQC,EADRC,KAEAhjB,EAAWx1B,KAAKk1B,KAAKv0B,KAAK60B,SAErBjwB,EAAI,EAAGA,EAAI8yC,EAAW3yC,OAAQH,IACrC+yC,EAAS9iB,EAAS6iB,EAAW9yC,GAAG8M,GAAKrS,KAAK6S,MAC1C0lC,EAASF,EAAW9yC,GAAG+M,EACvBkmC,EAActwC,MAAMmK,EAAGimC,EAAQhmC,EAAGimC,GAGpC,OAAOC,IAcTx1C,EAAUyQ,UAAUojC,qBAAuB,SAAUwB,EAAY9lC,GAC/D,GACI+lC,GAAQC,EADRC,KAEAhjB,EAAWx1B,KAAKk1B,KAAKv0B,KAAK60B,SAC1B+L,EAAOvhC,KAAK01C,UACZ+C,EAAYx0C,OAAOjE,KAAK2lC,IAAIn4B,MAAMsF,OAAO1G,QAAQ,KAAK,IACpB,UAAlCmG,EAAMxD,QAAQ68B,mBAChBrK,EAAOvhC,KAAK21C,WAGd,KAAK,GAAIpwC,GAAI,EAAGA,EAAI8yC,EAAW3yC,OAAQH,IACrC+yC,EAAS9iB,EAAS6iB,EAAW9yC,GAAG8M,GAAKrS,KAAK6S,MAC1C0lC,EAAStzC,KAAK8oB,MAAMwT,EAAKkI,aAAa4O,EAAW9yC,GAAG+M,IACpDkmC,EAActwC,MAAMmK,EAAGimC,EAAQhmC,EAAGimC,GAKpC,OAFAhmC,GAAMu4B,gBAAgB7lC,KAAKwG,IAAIgtC,EAAWlX,EAAKkI,aAAa,KAErD+O,GAIT34C,EAAOD,QAAUoD,GAKb,SAASnD,EAAQD,EAASM,GAgB9B,QAAS+C,GAAUiyB,EAAMnmB,GACvB/O,KAAKmwB,KACHsc,WAAY,KACZiM,cACAC,cACAC,cACAC,cACAvnC,WACEonC,cACAC,cACAC,cACAC,gBAGJ74C,KAAK+F,OACHiwB,OACE9lB,MAAO,EACPC,IAAK,EACLurB,YAAa,GAEfod,QAAS,GAGX94C,KAAK40B,gBACHE,YAAa,SAEb+Q,iBAAiB,EACjBC,iBAAiB,GAEnB9lC,KAAK+O,QAAUpO,EAAK0E,UAAWrF,KAAK40B,gBAEpC50B,KAAKk1B,KAAOA,EAGZl1B,KAAKi1B,UAELj1B,KAAKwT,WAAWzE,GAlDlB,GAAIpO,GAAOT,EAAoB,GAC3BqC,EAAYrC,EAAoB,IAChC6B,EAAW7B,EAAoB,IAC/ByB,EAAWzB,EAAoB,IAC/B2D,EAAS3D,EAAoB,GAiDjC+C,GAASwQ,UAAY,GAAIlR,GAUzBU,EAASwQ,UAAUD,WAAa,SAASzE,GACnCA,IAEFpO,EAAKmF,iBAAiB,cAAe,kBAAmB,kBAAkB,eAAgB9F,KAAK+O,QAASA,GAIpG,UAAYA,KACe,kBAAlBlL,GAAO+gC,OAEhB/gC,EAAO+gC,OAAO71B,EAAQ61B,QAGtB/gC,EAAOk1C,KAAKhqC,EAAQ61B,WAS5B3hC,EAASwQ,UAAUwhB,QAAU,WAC3Bj1B,KAAKmwB,IAAIsc,WAAa56B,SAASM,cAAc,OAC7CnS,KAAKmwB,IAAIrkB,WAAa+F,SAASM,cAAc,OAE7CnS,KAAKmwB,IAAIsc,WAAW1kC,UAAY,sBAChC/H,KAAKmwB,IAAIrkB,WAAW/D,UAAY,uBAMlC9E,EAASwQ,UAAUG,QAAU,WAEvB5T,KAAKmwB,IAAIsc,WAAW3iC,YACtB9J,KAAKmwB,IAAIsc,WAAW3iC,WAAW2H,YAAYzR,KAAKmwB,IAAIsc,YAElDzsC,KAAKmwB,IAAIrkB,WAAWhC,YACtB9J,KAAKmwB,IAAIrkB,WAAWhC,WAAW2H,YAAYzR,KAAKmwB,IAAIrkB,YAGtD9L,KAAKk1B,KAAO,MAOdjyB,EAASwQ,UAAUkO,OAAS,WAC1B,GAAI5S,GAAU/O,KAAK+O,QACfhJ,EAAQ/F,KAAK+F,MACb0mC,EAAazsC,KAAKmwB,IAAIsc,WACtB3gC,EAAa9L,KAAKmwB,IAAIrkB,WAGtB+4B,EAAiC,OAAvB91B,EAAQ+lB,YAAwB90B,KAAKk1B,KAAK/E,IAAIvoB,IAAM5H,KAAKk1B,KAAK/E,IAAI3M,OAC5Ew1B,EAAiBvM,EAAW3iC,aAAe+6B,CAG/C7kC,MAAKooC,oBAGL,IACIvC,IADc7lC,KAAK+O,QAAQ+lB,YACT90B,KAAK+O,QAAQ82B,iBAC/BC,EAAkB9lC,KAAK+O,QAAQ+2B,eAGnC//B,GAAMsiC,iBAAmBxC,EAAkB9/B,EAAMuiC,gBAAkB,EACnEviC,EAAMwiC,iBAAmBzC,EAAkB//B,EAAMyiC,gBAAkB,EACnEziC,EAAM+M,OAAS/M,EAAMsiC,iBAAmBtiC,EAAMwiC,iBAC9CxiC,EAAM8M,MAAQ45B,EAAWjc,YAEzBzqB,EAAM2iC,gBAAkB1oC,KAAKk1B,KAAKC,SAASz1B,KAAKoT,OAAS/M,EAAMwiC,kBACnC,OAAvBx5B,EAAQ+lB,YAAuB90B,KAAKk1B,KAAKC,SAAS3R,OAAO1Q,OAAS9S,KAAKk1B,KAAKC,SAASvtB,IAAIkL,QAC9F/M,EAAM0iC,eAAiB,EACvB1iC,EAAM6iC,gBAAkB7iC,EAAM2iC,gBAAkB3iC,EAAMwiC,iBACtDxiC,EAAM4iC,eAAiB,CAGvB,IAAIsQ,GAAwBxM,EAAWyM,YACnCC,EAAwBrtC,EAAWotC,WAsBvC,OArBAzM,GAAW3iC,YAAc2iC,EAAW3iC,WAAW2H,YAAYg7B,GAC3D3gC,EAAWhC,YAAcgC,EAAWhC,WAAW2H,YAAY3F,GAE3D2gC,EAAWj/B,MAAMsF,OAAS9S,KAAK+F,MAAM+M,OAAS,KAE9C9S,KAAKo5C,iBAGDH,EACFpU,EAAO3yB,aAAau6B,EAAYwM,GAGhCpU,EAAO9yB,YAAY06B,GAEjB0M,EACFn5C,KAAKk1B,KAAK/E,IAAI2U,mBAAmB5yB,aAAapG,EAAYqtC,GAG1Dn5C,KAAKk1B,KAAK/E,IAAI2U,mBAAmB/yB,YAAYjG,GAGxC9L,KAAKskC,cAAgB0U,GAO9B/1C,EAASwQ,UAAU2lC,eAAiB,WAClC,GAAItkB,GAAc90B,KAAK+O,QAAQ+lB,YAG3B5kB,EAAQvP,EAAKiG,QAAQ5G,KAAKk1B,KAAKc,MAAM9lB,MAAO,UAC5CC,EAAMxP,EAAKiG,QAAQ5G,KAAKk1B,KAAKc,MAAM7lB,IAAK,UACxCkpC,EAAgBr5C,KAAKk1B,KAAKv0B,KAAKi1B,OAA2C,GAAnC51B,KAAK+F,MAAMgkC,gBAAkB,KAAShjC,UAC7E20B,EAAc2d,EAAgB13C,EAASw5B,wBAAwBn7B,KAAKk1B,KAAKI,YAAat1B,KAAKk1B,KAAKc,MAAOqjB,EAC3G3d,IAAe17B,KAAKk1B,KAAKv0B,KAAKi1B,OAAO,GAAG7uB,SAGxC,IAAIshB,GAAO,GAAItmB,GAAS,GAAIsC,MAAK6L,GAAQ,GAAI7L,MAAK8L,GAAMurB,EAAa17B,KAAKk1B,KAAKI,YAC/Et1B,MAAKqoB,KAAOA,CAKZ,IAAI8H,GAAMnwB,KAAKmwB,GACfA,GAAI7e,UAAUonC,WAAavoB,EAAIuoB,WAC/BvoB,EAAI7e,UAAUqnC,WAAaxoB,EAAIwoB,WAC/BxoB,EAAI7e,UAAUsnC,WAAazoB,EAAIyoB,WAC/BzoB,EAAI7e,UAAUunC,WAAa1oB,EAAI0oB,WAC/B1oB,EAAIuoB,cACJvoB,EAAIwoB,cACJxoB,EAAIyoB,cACJzoB,EAAI0oB,cAEJxwB,EAAKma,OAGL,KAFA,GAAI8W,GAAmB/yC,OACnB2G,EAAM,EACHmb,EAAK8U,WAAmB,IAANjwB,GAAY,CACnCA,GACA,IAAIqsC,GAAMlxB,EAAKC,aACXjW,EAAIrS,KAAKk1B,KAAKv0B,KAAK60B,SAAS+jB,GAC5B9b,EAAUpV,EAAKoV,SAKfz9B,MAAK+O,QAAQ82B,iBACf7lC,KAAKw5C,kBAAkBnnC,EAAGgW,EAAK8b,gBAAiBrP,GAG9C2I,GAAWz9B,KAAK+O,QAAQ+2B,iBACtBzzB,EAAI,IACkB9L,QAApB+yC,IACFA,EAAmBjnC,GAErBrS,KAAKy5C,kBAAkBpnC,EAAGgW,EAAKgc,gBAAiBvP,IAElD90B,KAAK05C,kBAAkBrnC,EAAGyiB,IAG1B90B,KAAK25C,kBAAkBtnC,EAAGyiB,GAG5BzM,EAAKE,OAIP,GAAIvoB,KAAK+O,QAAQ+2B,gBAAiB,CAChC,GAAI8T,GAAW55C,KAAKk1B,KAAKv0B,KAAKi1B,OAAO,GACjCikB,EAAWxxB,EAAKgc,cAAcuV,GAC9BE,EAAYD,EAASn0C,QAAU1F,KAAK+F,MAAM+jC,gBAAkB,IAAM,IAE9CvjC,QAApB+yC,GAA6CA,EAAZQ,IACnC95C,KAAKy5C,kBAAkB,EAAGI,EAAU/kB,GAKxCn0B,EAAK4H,QAAQvI,KAAKmwB,IAAI7e,UAAW,SAAUyoC,GACzC,KAAOA,EAAIr0C,QAAQ,CACjB,GAAI4B,GAAOyyC,EAAIC,KACX1yC,IAAQA,EAAKwC,YACfxC,EAAKwC,WAAW2H,YAAYnK,OAapCrE,EAASwQ,UAAU+lC,kBAAoB,SAAUnnC,EAAGoX,EAAMqL,GAExD,GAAInM,GAAQ3oB,KAAKmwB,IAAI7e,UAAUunC,WAAWjnC,OAE1C,KAAK+W,EAAO,CAEV,GAAIqH,GAAUne,SAASo4B,eAAe,GACtCthB,GAAQ9W,SAASM,cAAc,OAC/BwW,EAAM5W,YAAYie,GAClBrH,EAAM5gB,UAAY,aAClB/H,KAAKmwB,IAAIsc,WAAW16B,YAAY4W,GAElC3oB,KAAKmwB,IAAI0oB,WAAW3wC,KAAKygB,GAEzBA,EAAMsxB,WAAW,GAAGC,UAAYzwB,EAEhCd,EAAMnb,MAAM5F,IAAsB,OAAfktB,EAAyB90B,KAAK+F,MAAMwiC,iBAAmB,KAAQ,IAClF5f,EAAMnb,MAAMhG,KAAO6K,EAAI,MAWzBpP,EAASwQ,UAAUgmC,kBAAoB,SAAUpnC,EAAGoX,EAAMqL,GAExD,GAAInM,GAAQ3oB,KAAKmwB,IAAI7e,UAAUqnC,WAAW/mC,OAE1C,KAAK+W,EAAO,CAEV,GAAIqH,GAAUne,SAASo4B,eAAexgB,EACtCd,GAAQ9W,SAASM,cAAc,OAC/BwW,EAAM5gB,UAAY,aAClB4gB,EAAM5W,YAAYie,GAClBhwB,KAAKmwB,IAAIsc,WAAW16B,YAAY4W,GAElC3oB,KAAKmwB,IAAIwoB,WAAWzwC,KAAKygB,GAEzBA,EAAMsxB,WAAW,GAAGC,UAAYzwB,EAGhCd,EAAMnb,MAAM5F,IAAsB,OAAfktB,EAAwB,IAAO90B,KAAK+F,MAAMsiC,iBAAoB,KACjF1f,EAAMnb,MAAMhG,KAAO6K,EAAI,MASzBpP,EAASwQ,UAAUkmC,kBAAoB,SAAUtnC,EAAGyiB,GAElD,GAAI7E,GAAOjwB,KAAKmwB,IAAI7e,UAAUsnC,WAAWhnC,OAEpCqe,KAEHA,EAAOpe,SAASM,cAAc,OAC9B8d,EAAKloB,UAAY,sBACjB/H,KAAKmwB,IAAIrkB,WAAWiG,YAAYke,IAElCjwB,KAAKmwB,IAAIyoB,WAAW1wC,KAAK+nB,EAEzB,IAAIlqB,GAAQ/F,KAAK+F,KAEfkqB,GAAKziB,MAAM5F,IADM,OAAfktB,EACe/uB,EAAMwiC,iBAAmB,KAGzBvoC,KAAKk1B,KAAKC,SAASvtB,IAAIkL,OAAS,KAEnDmd,EAAKziB,MAAMsF,OAAS/M,EAAM2iC,gBAAkB,KAC5CzY,EAAKziB,MAAMhG,KAAQ6K,EAAItM,EAAM0iC,eAAiB,EAAK,MASrDxlC,EAASwQ,UAAUimC,kBAAoB,SAAUrnC,EAAGyiB,GAElD,GAAI7E,GAAOjwB,KAAKmwB,IAAI7e,UAAUonC,WAAW9mC,OAEpCqe,KAEHA,EAAOpe,SAASM,cAAc,OAC9B8d,EAAKloB,UAAY,sBACjB/H,KAAKmwB,IAAIrkB,WAAWiG,YAAYke,IAElCjwB,KAAKmwB,IAAIuoB,WAAWxwC,KAAK+nB,EAEzB,IAAIlqB,GAAQ/F,KAAK+F,KAEfkqB,GAAKziB,MAAM5F,IADM,OAAfktB,EACe,IAGA90B,KAAKk1B,KAAKC,SAASvtB,IAAIkL,OAAS,KAEnDmd,EAAKziB,MAAMhG,KAAQ6K,EAAItM,EAAM4iC,eAAiB,EAAK,KACnD1Y,EAAKziB,MAAMsF,OAAS/M,EAAM6iC,gBAAkB,MAQ9C3lC,EAASwQ,UAAU20B,mBAAqB,WAKjCpoC,KAAKmwB,IAAI+Z,mBACZlqC,KAAKmwB,IAAI+Z,iBAAmBr4B,SAASM,cAAc,OACnDnS,KAAKmwB,IAAI+Z,iBAAiBniC,UAAY,qBACtC/H,KAAKmwB,IAAI+Z,iBAAiB18B,MAAMsW,SAAW,WAE3C9jB,KAAKmwB,IAAI+Z,iBAAiBn4B,YAAYF,SAASo4B,eAAe,MAC9DjqC,KAAKmwB,IAAIsc,WAAW16B,YAAY/R,KAAKmwB,IAAI+Z,mBAE3ClqC,KAAK+F,MAAMuiC,gBAAkBtoC,KAAKmwB,IAAI+Z,iBAAiBnlB,aACvD/kB,KAAK+F,MAAMgkC,eAAiB/pC,KAAKmwB,IAAI+Z,iBAAiBxqB,YAGjD1f,KAAKmwB,IAAIia,mBACZpqC,KAAKmwB,IAAIia,iBAAmBv4B,SAASM,cAAc,OACnDnS,KAAKmwB,IAAIia,iBAAiBriC,UAAY,qBACtC/H,KAAKmwB,IAAIia,iBAAiB58B,MAAMsW,SAAW,WAE3C9jB,KAAKmwB,IAAIia,iBAAiBr4B,YAAYF,SAASo4B,eAAe,MAC9DjqC,KAAKmwB,IAAIsc,WAAW16B,YAAY/R,KAAKmwB,IAAIia,mBAE3CpqC,KAAK+F,MAAMyiC,gBAAkBxoC,KAAKmwB,IAAIia,iBAAiBrlB,aACvD/kB,KAAK+F,MAAM+jC,eAAiB9pC,KAAKmwB,IAAIia,iBAAiB1qB,aASxDzc,EAASwQ,UAAU8hB,KAAO,SAASwD,GACjC,MAAO/4B,MAAKqoB,KAAKkN,KAAKwD,IAGxBl5B,EAAOD,QAAUqD,GAKb,SAASpD,EAAQD,EAASM,GAc9B,QAASgC,GAAM8Q,EAAM0nB,EAAY3rB,GAC/B/O,KAAKK,GAAK,KACVL,KAAK6kC,OAAS,KACd7kC,KAAKgT,KAAOA,EACZhT,KAAKmwB,IAAM,KACXnwB,KAAK06B,WAAaA,MAClB16B,KAAK+O,QAAUA,MAEf/O,KAAKizC,UAAW,EAChBjzC,KAAKktC,WAAY,EACjBltC,KAAKitC,OAAQ,EAEbjtC,KAAK4H,IAAM,KACX5H,KAAKwH,KAAO,KACZxH,KAAK6S,MAAQ,KACb7S,KAAK8S,OAAS,KA3BhB,GAAIuyB,GAASnlC,EAAoB,IAC7BS,EAAOT,EAAoB,EA6B/BgC,GAAKuR,UAAU3R,OAAQ,EAKvBI,EAAKuR,UAAUy9B,OAAS,WACtBlxC,KAAKizC,UAAW,EAChBjzC,KAAKitC,OAAQ,EACTjtC,KAAKktC,WAAWltC,KAAK2hB,UAM3Bzf,EAAKuR,UAAUw9B,SAAW,WACxBjxC,KAAKizC,UAAW,EAChBjzC,KAAKitC,OAAQ,EACTjtC,KAAKktC,WAAWltC,KAAK2hB,UAQ3Bzf,EAAKuR,UAAU8E,QAAU,SAASvF,GAChChT,KAAKgT,KAAOA,EACZhT,KAAKitC,OAAQ,EACTjtC,KAAKktC,WAAWltC,KAAK2hB,UAO3Bzf,EAAKuR,UAAUi6B,UAAY,SAAS7I,GAC9B7kC,KAAKktC,WACPltC,KAAKynC,OACLznC,KAAK6kC,OAASA,EACV7kC,KAAK6kC,QACP7kC,KAAK0nC,QAIP1nC,KAAK6kC,OAASA,GASlB3iC,EAAKuR,UAAUq7B,UAAY,WAEzB,OAAO,GAOT5sC,EAAKuR,UAAUi0B,KAAO,WACpB,OAAO,GAOTxlC,EAAKuR,UAAUg0B,KAAO,WACpB,OAAO,GAMTvlC,EAAKuR,UAAUkO,OAAS,aAOxBzf,EAAKuR,UAAUk7B,YAAc,aAO7BzsC,EAAKuR,UAAU85B,YAAc,aAS7BrrC,EAAKuR,UAAU0mC,qBAAuB,SAAUC,GAC9C,GAAIp6C,KAAKizC,UAAYjzC,KAAK+O,QAAQmgC,SAASt4B,SAAW5W,KAAKmwB,IAAIkqB,aAAc,CAE3E,GAAI5lC,GAAKzU,KAELq6C,EAAexoC,SAASM,cAAc,MAC1CkoC,GAAatyC,UAAY,SACzBsyC,EAAatV,MAAQ,mBAErBM,EAAOgV,GACL9wC,gBAAgB,IACfsK,GAAG,MAAO,SAAUrK,GACrBiL,EAAGowB,OAAOkJ,kBAAkBt5B,GAC5BjL,EAAMk8B,oBAGR0U,EAAOroC,YAAYsoC,GACnBr6C,KAAKmwB,IAAIkqB,aAAeA,OAEhBr6C,KAAKizC,UAAYjzC,KAAKmwB,IAAIkqB,eAE9Br6C,KAAKmwB,IAAIkqB,aAAavwC,YACxB9J,KAAKmwB,IAAIkqB,aAAavwC,WAAW2H,YAAYzR,KAAKmwB,IAAIkqB,cAExDr6C,KAAKmwB,IAAIkqB,aAAe,OAS5Bn4C,EAAKuR,UAAU6mC,gBAAkB,SAAUxxC,GACzC,GAAIknB,EACJ,IAAIhwB,KAAK+O,QAAQwrC,SAAU,CACzB,GAAInjB,GAAWp3B,KAAK6kC,OAAOzO,QAAQC,UAAU7gB,IAAIxV,KAAKK,GACtD2vB,GAAUhwB,KAAK+O,QAAQwrC,SAASnjB,OAGhCpH,GAAUhwB,KAAKgT,KAAKgd,OAGtB,IAAGA,IAAYhwB,KAAKgwB,QAAS,CAE3B,GAAIA,YAAmB2c,SACrB7jC,EAAQqb,UAAY,GACpBrb,EAAQiJ,YAAYie,OAEjB,IAAezpB,QAAXypB,EACPlnB,EAAQqb,UAAY6L,MAGpB,IAAwB,cAAlBhwB,KAAKgT,KAAKnM,MAA8CN,SAAtBvG,KAAKgT,KAAKgd,QAChD,KAAM,IAAIpsB,OAAM,sCAAwC5D,KAAKK,GAIjEL,MAAKgwB,QAAUA,IASnB9tB,EAAKuR,UAAU+mC,aAAe,SAAU1xC,GACf,MAAnB9I,KAAKgT,KAAK+xB,MACZj8B,EAAQi8B,MAAQ/kC,KAAKgT,KAAK+xB,OAAS,GAGnCj8B,EAAQ2xC,gBAAgB,UAS3Bv4C,EAAKuR,UAAUinC,sBAAwB,SAAS5xC,GAC/C,GAAI9I,KAAK+O,QAAQ4rC,gBAAkB36C,KAAK+O,QAAQ4rC,eAAej1C,OAAS,EAAG,CACzE,GAAIk1C,KAEJ,IAAI50C,MAAMC,QAAQjG,KAAK+O,QAAQ4rC,gBAC7BC,EAAa56C,KAAK+O,QAAQ4rC,mBAEvB,CAAA,GAAmC,OAA/B36C,KAAK+O,QAAQ4rC,eAIpB,MAHAC,GAAat0C,OAAOqH,KAAK3N,KAAKgT,MAMhC,IAAK,GAAIzN,GAAI,EAAGA,EAAIq1C,EAAWl1C,OAAQH,IAAK,CAC1C,GAAIiR,GAAOokC,EAAWr1C,GAClB6B,EAAQpH,KAAKgT,KAAKwD,EAET,OAATpP,EACF0B,EAAQ+xC,aAAa,QAAUrkC,EAAMpP,GAGrC0B,EAAQ2xC,gBAAgB,QAAUjkC,MAW1CtU,EAAKuR,UAAUqnC,aAAe,SAAShyC,GAEjC9I,KAAKwN,QACP7M,EAAKqN,cAAclF,EAAS9I,KAAKwN,OACjCxN,KAAKwN,MAAQ,MAIXxN,KAAKgT,KAAKxF,QACZ7M,EAAKkN,WAAW/E,EAAS9I,KAAKgT,KAAKxF,OACnCxN,KAAKwN,MAAQxN,KAAKgT,KAAKxF,QAI3B3N,EAAOD,QAAUsC,GAKb,SAASrC,EAAQD,EAASM,GAkB9B,QAASiC,GAAgB6Q,EAAM0nB,EAAY3rB,GASzC,GARA/O,KAAK+F,OACHiqB,SACEnd,MAAO,IAGX7S,KAAK+jB,UAAW,EAGZ/Q,EAAM,CACR,GAAkBzM,QAAdyM,EAAK9C,MACP,KAAM,IAAItM,OAAM,oCAAsCoP,EAAK3S,GAE7D,IAAgBkG,QAAZyM,EAAK7C,IACP,KAAM,IAAIvM,OAAM,kCAAoCoP,EAAK3S,IAI7D6B,EAAK3B,KAAKP,KAAMgT,EAAM0nB,EAAY3rB,GAElC/O,KAAK+6C,cAAe,EApCtB,GACI74C,IADShC,EAAoB,IACtBA,EAAoB,KAC3B2C,EAAkB3C,EAAoB,IACtCoC,EAAYpC,EAAoB,GAoCpCiC,GAAesR,UAAY,GAAIvR,GAAM,KAAM,KAAM,MAEjDC,EAAesR,UAAUunC,cAAgB,kBACzC74C,EAAesR,UAAU3R,OAAQ,EAOjCK,EAAesR,UAAUq7B,UAAY,SAAS9Y,GAE5C,MAAQh2B,MAAKgT,KAAK9C,MAAQ8lB,EAAM7lB,KAASnQ,KAAKgT,KAAK7C,IAAM6lB,EAAM9lB,OAMjE/N,EAAesR,UAAUkO,OAAS,WAChC,GAAIwO,GAAMnwB,KAAKmwB,GAuBf,IAtBKA,IAEHnwB,KAAKmwB,OACLA,EAAMnwB,KAAKmwB,IAGXA,EAAIqgB,IAAM3+B,SAASM,cAAc,OAIjCge,EAAIH,QAAUne,SAASM,cAAc,OACrCge,EAAIH,QAAQjoB,UAAY,UACxBooB,EAAIqgB,IAAIz+B,YAAYoe,EAAIH,SAMxBhwB,KAAKitC,OAAQ,IAIVjtC,KAAK6kC,OACR,KAAM,IAAIjhC,OAAM,yCAElB,KAAKusB,EAAIqgB,IAAI1mC,WAAY,CACvB,GAAIgC,GAAa9L,KAAK6kC,OAAO1U,IAAIrkB,UACjC,KAAKA,EACH,KAAM,IAAIlI,OAAM,iEAElBkI,GAAWiG,YAAYoe,EAAIqgB,KAQ7B,GANAxwC,KAAKktC,WAAY,EAMbltC,KAAKitC,MAAO,CACdjtC,KAAKs6C,gBAAgBt6C,KAAKmwB,IAAIH,SAC9BhwB,KAAKw6C,aAAax6C,KAAKmwB,IAAIH,SAC3BhwB,KAAK06C,sBAAsB16C,KAAKmwB,IAAIH,SACpChwB,KAAK86C,aAAa96C,KAAKmwB,IAAIqgB,IAG3B,IAAIzoC,IAAa/H,KAAKgT,KAAKjL,UAAa,IAAM/H,KAAKgT,KAAKjL,UAAa,KAChE/H,KAAKizC,SAAW,YAAc,GACnC9iB,GAAIqgB,IAAIzoC,UAAY/H,KAAKg7C,cAAgBjzC,EAGzC/H,KAAK+jB,SAA6D,WAAlDtc,OAAOmtC,iBAAiBzkB,EAAIH,SAASjM,SAGrD/jB,KAAK+F,MAAMiqB,QAAQnd,MAAQ7S,KAAKmwB,IAAIH,QAAQQ,YAC5CxwB,KAAK8S,OAAS,EAEd9S,KAAKitC,OAAQ,IAQjB9qC,EAAesR,UAAUi0B,KAAOplC,EAAUmR,UAAUi0B,KAMpDvlC,EAAesR,UAAUg0B,KAAOnlC,EAAUmR,UAAUg0B,KAMpDtlC,EAAesR,UAAUk7B,YAAcrsC,EAAUmR,UAAUk7B,YAM3DxsC,EAAesR,UAAU85B,YAAc,SAAStzB,GAC9C,GAAIghC,GAAqC,QAA7Bj7C,KAAK+O,QAAQ+lB,WACzB90B,MAAKmwB,IAAIH,QAAQxiB,MAAM5F,IAAMqzC,EAAQ,GAAK,IAC1Cj7C,KAAKmwB,IAAIH,QAAQxiB,MAAMgW,OAASy3B,EAAQ,IAAM,EAC9C,IAAInoC,EAGJ,IAA2BvM,SAAvBvG,KAAKgT,KAAK8uB,SAAwB,CACpC,GAAIoZ,GAAel7C,KAAKgT,KAAK8uB,SACzBF,EAAY5hC,KAAK6kC,OAAOjD,UACxBqK,EAAgBrK,EAAUsZ,GAAc7yC,KAE5C,IAAa,GAAT4yC,EAAe,CAEjBnoC,EAAS9S,KAAK6kC,OAAOjD,UAAUsZ,GAAcpoC,OAASmH,EAAOtK,KAAKgW,SAClE7S,GAA2B,GAAjBm5B,EAAqBhyB,EAAOsnB,KAAO,GAAItnB,EAAOtK,KAAKgW,SAAW,CACxE,IAAIkc,GAAS7hC,KAAK6kC,OAAOj9B,GACzB,KAAK,GAAIk6B,KAAYF,GACfA,EAAU/7B,eAAei8B,IACQ,GAA/BF,EAAUE,GAAUlZ,SAAmBgZ,EAAUE,GAAUz5B,MAAQ4jC,IACrEpK,GAAUD,EAAUE,GAAUhvB,OAASmH,EAAOtK,KAAKgW,SAMzDkc,IAA2B,GAAjBoK,EAAqBhyB,EAAOsnB,KAAO,GAAMtnB,EAAOtK,KAAKgW,SAAW,EAC1E3lB,KAAKmwB,IAAIqgB,IAAIhjC,MAAM5F,IAAMi6B,EAAS,KAClC7hC,KAAKmwB,IAAIqgB,IAAIhjC,MAAMgW,OAAS,OAGzB,CACH,GAAIqe,GAAS7hC,KAAK6kC,OAAOj9B,GACzB,KAAK,GAAIk6B,KAAYF,GACfA,EAAU/7B,eAAei8B,IACQ,GAA/BF,EAAUE,GAAUlZ,SAAmBgZ,EAAUE,GAAUz5B,MAAQ4jC,IACrEpK,GAAUD,EAAUE,GAAUhvB,OAASmH,EAAOtK,KAAKgW,SAIzD7S,GAAS9S,KAAK6kC,OAAOjD,UAAUsZ,GAAcpoC,OAASmH,EAAOtK,KAAKgW,SAClE3lB,KAAKmwB,IAAIqgB,IAAIhjC,MAAM5F,IAAMi6B,EAAS,KAClC7hC,KAAKmwB,IAAIqgB,IAAIhjC,MAAMgW,OAAS,QAM1BxjB,MAAK6kC,iBAAkBhiC,IAEzBiQ,EAAS7N,KAAKiI,IAAIlN,KAAK6kC,OAAO/xB,OAC1B9S,KAAK6kC,OAAOzO,QAAQlB,KAAKC,SAAS9I,OAAOvZ,OACzC9S,KAAK6kC,OAAOzO,QAAQlB,KAAKC,SAASgD,gBAAgBrlB,QACtD9S,KAAKmwB,IAAIqgB,IAAIhjC,MAAM5F,IAAMqzC,EAAQ,IAAM,GACvCj7C,KAAKmwB,IAAIqgB,IAAIhjC,MAAMgW,OAASy3B,EAAQ,GAAK,MAGzCnoC,EAAS9S,KAAK6kC,OAAO/xB,OAErB9S,KAAKmwB,IAAIqgB,IAAIhjC,MAAM5F,IAAM5H,KAAK6kC,OAAOj9B,IAAM,KAC3C5H,KAAKmwB,IAAIqgB,IAAIhjC,MAAMgW,OAAS,GAGhCxjB,MAAKmwB,IAAIqgB,IAAIhjC,MAAMsF,OAASA,EAAS,MAGvCjT,EAAOD,QAAUuC,GAKb,SAAStC,EAAQD,EAASM,GAe9B,QAASkC,GAAS4Q,EAAM0nB,EAAY3rB,GAalC,GAZA/O,KAAK+F,OACHmqB,KACErd,MAAO,EACPC,OAAQ,GAEVmd,MACEpd,MAAO,EACPC,OAAQ,IAKRE,GACgBzM,QAAdyM,EAAK9C,MACP,KAAM,IAAItM,OAAM,oCAAsCoP,EAI1D9Q,GAAK3B,KAAKP,KAAMgT,EAAM0nB,EAAY3rB,GAhCpC,CAAA,GAAI7M,GAAOhC,EAAoB,GACpBA,GAAoB,GAkC/BkC,EAAQqR,UAAY,GAAIvR,GAAM,KAAM,KAAM,MAO1CE,EAAQqR,UAAUq7B,UAAY,SAAS9Y,GAGrC,GAAIjD,IAAYiD,EAAM7lB,IAAM6lB,EAAM9lB,OAAS,CAC3C,OAAQlQ,MAAKgT,KAAK9C,MAAQ8lB,EAAM9lB,MAAQ6iB,GAAc/yB,KAAKgT,KAAK9C,MAAQ8lB,EAAM7lB,IAAM4iB,GAMtF3wB,EAAQqR,UAAUkO,OAAS,WACzB,GAAIwO,GAAMnwB,KAAKmwB,GA6Bf,IA5BKA,IAEHnwB,KAAKmwB,OACLA,EAAMnwB,KAAKmwB,IAGXA,EAAIqgB,IAAM3+B,SAASM,cAAc,OAGjCge,EAAIH,QAAUne,SAASM,cAAc,OACrCge,EAAIH,QAAQjoB,UAAY,UACxBooB,EAAIqgB,IAAIz+B,YAAYoe,EAAIH,SAGxBG,EAAIF,KAAOpe,SAASM,cAAc,OAClCge,EAAIF,KAAKloB,UAAY,OAGrBooB,EAAID,IAAMre,SAASM,cAAc,OACjCge,EAAID,IAAInoB,UAAY,MAGpBooB,EAAIqgB,IAAI,iBAAmBxwC,KAE3BA,KAAKitC,OAAQ,IAIVjtC,KAAK6kC,OACR,KAAM,IAAIjhC,OAAM,yCAElB,KAAKusB,EAAIqgB,IAAI1mC,WAAY,CACvB,GAAI2iC,GAAazsC,KAAK6kC,OAAO1U,IAAIsc,UACjC,KAAKA,EAAY,KAAM,IAAI7oC,OAAM,iEACjC6oC,GAAW16B,YAAYoe,EAAIqgB,KAE7B,IAAKrgB,EAAIF,KAAKnmB,WAAY,CACxB,GAAIgC,GAAa9L,KAAK6kC,OAAO1U,IAAIrkB,UACjC,KAAKA,EAAY,KAAM,IAAIlI,OAAM,iEACjCkI,GAAWiG,YAAYoe,EAAIF,MAE7B,IAAKE,EAAID,IAAIpmB,WAAY,CACvB,GAAIy3B,GAAOvhC,KAAK6kC,OAAO1U,IAAIoR,IAC3B,KAAKz1B,EAAY,KAAM,IAAIlI,OAAM,2DACjC29B,GAAKxvB,YAAYoe,EAAID,KAQvB,GANAlwB,KAAKktC,WAAY,EAMbltC,KAAKitC,MAAO,CACdjtC,KAAKs6C,gBAAgBt6C,KAAKmwB,IAAIH,SAC9BhwB,KAAKw6C,aAAax6C,KAAKmwB,IAAIqgB,KAC3BxwC,KAAK06C,sBAAsB16C,KAAKmwB,IAAIqgB,KACpCxwC,KAAK86C,aAAa96C,KAAKmwB,IAAIqgB,IAG3B,IAAIzoC,IAAa/H,KAAKgT,KAAKjL,UAAW,IAAM/H,KAAKgT,KAAKjL,UAAY,KAC7D/H,KAAKizC,SAAW,YAAc,GACnC9iB,GAAIqgB,IAAIzoC,UAAY,WAAaA,EACjCooB,EAAIF,KAAKloB,UAAY,YAAcA,EACnCooB,EAAID,IAAInoB,UAAa,WAAaA,EAGlC/H,KAAK+F,MAAMmqB,IAAIpd,OAASqd,EAAID,IAAIQ,aAChC1wB,KAAK+F,MAAMmqB,IAAIrd,MAAQsd,EAAID,IAAIM,YAC/BxwB,KAAK+F,MAAMkqB,KAAKpd,MAAQsd,EAAIF,KAAKO,YACjCxwB,KAAK6S,MAAQsd,EAAIqgB,IAAIhgB,YACrBxwB,KAAK8S,OAASqd,EAAIqgB,IAAI9f,aAEtB1wB,KAAKitC,OAAQ,EAGfjtC,KAAKm6C,qBAAqBhqB,EAAIqgB,MAOhCpuC,EAAQqR,UAAUi0B,KAAO,WAClB1nC,KAAKktC,WACRltC,KAAK2hB,UAOTvf,EAAQqR,UAAUg0B,KAAO,WACvB,GAAIznC,KAAKktC,UAAW,CAClB,GAAI/c,GAAMnwB,KAAKmwB,GAEXA,GAAIqgB,IAAI1mC,YAAcqmB,EAAIqgB,IAAI1mC,WAAW2H,YAAY0e,EAAIqgB,KACzDrgB,EAAIF,KAAKnmB,YAAaqmB,EAAIF,KAAKnmB,WAAW2H,YAAY0e,EAAIF,MAC1DE,EAAID,IAAIpmB,YAAcqmB,EAAID,IAAIpmB,WAAW2H,YAAY0e,EAAID,KAE7DlwB,KAAK4H,IAAM,KACX5H,KAAKwH,KAAO,KAEZxH,KAAKktC,WAAY,IAQrB9qC,EAAQqR,UAAUk7B,YAAc,WAC9B,GAAIz+B,GAAQlQ,KAAK06B,WAAWlF,SAASx1B,KAAKgT,KAAK9C,OAC3C6+B,EAAQ/uC,KAAK+O,QAAQggC,MAErByB,EAAMxwC,KAAKmwB,IAAIqgB,IACfvgB,EAAOjwB,KAAKmwB,IAAIF,KAChBC,EAAMlwB,KAAKmwB,IAAID,GAIjBlwB,MAAKwH,KADM,SAATunC,EACU7+B,EAAQlQ,KAAK6S,MAET,QAATk8B,EACK7+B,EAIAA,EAAQlQ,KAAK6S,MAAQ,EAInC29B,EAAIhjC,MAAMhG,KAAOxH,KAAKwH,KAAO,KAG7ByoB,EAAKziB,MAAMhG,KAAQ0I,EAAQlQ,KAAK+F,MAAMkqB,KAAKpd,MAAQ,EAAK,KAGxDqd,EAAI1iB,MAAMhG,KAAQ0I,EAAQlQ,KAAK+F,MAAMmqB,IAAIrd,MAAQ,EAAK,MAOxDzQ,EAAQqR,UAAU85B,YAAc,WAC9B,GAAIzY,GAAc90B,KAAK+O,QAAQ+lB,YAC3B0b,EAAMxwC,KAAKmwB,IAAIqgB,IACfvgB,EAAOjwB,KAAKmwB,IAAIF,KAChBC,EAAMlwB,KAAKmwB,IAAID,GAEnB,IAAmB,OAAf4E,EACF0b,EAAIhjC,MAAM5F,KAAW5H,KAAK4H,KAAO,GAAK,KAEtCqoB,EAAKziB,MAAM5F,IAAS,IACpBqoB,EAAKziB,MAAMsF,OAAU9S,KAAK6kC,OAAOj9B,IAAM5H,KAAK4H,IAAM,EAAK,KACvDqoB,EAAKziB,MAAMgW,OAAS,OAEjB,CACH,GAAI23B,GAAgBn7C,KAAK6kC,OAAOzO,QAAQrwB,MAAM+M,OAC1C6d,EAAawqB,EAAgBn7C,KAAK6kC,OAAOj9B,IAAM5H,KAAK6kC,OAAO/xB,OAAS9S,KAAK4H,GAE7E4oC,GAAIhjC,MAAM5F,KAAW5H,KAAK6kC,OAAO/xB,OAAS9S,KAAK4H,IAAM5H,KAAK8S,QAAU,GAAK,KACzEmd,EAAKziB,MAAM5F,IAAUuzC,EAAgBxqB,EAAc,KACnDV,EAAKziB,MAAMgW,OAAS,IAGtB0M,EAAI1iB,MAAM5F,KAAQ5H,KAAK+F,MAAMmqB,IAAIpd,OAAS,EAAK,MAGjDjT,EAAOD,QAAUwC,GAKb,SAASvC,EAAQD,EAASM,GAc9B,QAASmC,GAAW2Q,EAAM0nB,EAAY3rB,GAcpC,GAbA/O,KAAK+F,OACHmqB,KACEtoB,IAAK,EACLiL,MAAO,EACPC,OAAQ,GAEVkd,SACEld,OAAQ,EACRsoC,WAAY,IAKZpoC,GACgBzM,QAAdyM,EAAK9C,MACP,KAAM,IAAItM,OAAM,oCAAsCoP,EAI1D9Q,GAAK3B,KAAKP,KAAMgT,EAAM0nB,EAAY3rB,GAhCpC,GAAI7M,GAAOhC,EAAoB,GAmC/BmC,GAAUoR,UAAY,GAAIvR,GAAM,KAAM,KAAM,MAO5CG,EAAUoR,UAAUq7B,UAAY,SAAS9Y,GAGvC,GAAIjD,IAAYiD,EAAM7lB,IAAM6lB,EAAM9lB,OAAS,CAC3C,OAAQlQ,MAAKgT,KAAK9C,MAAQ8lB,EAAM9lB,MAAQ6iB,GAAc/yB,KAAKgT,KAAK9C,MAAQ8lB,EAAM7lB,IAAM4iB,GAMtF1wB,EAAUoR,UAAUkO,OAAS,WAC3B,GAAIwO,GAAMnwB,KAAKmwB,GA0Bf,IAzBKA,IAEHnwB,KAAKmwB,OACLA,EAAMnwB,KAAKmwB,IAGXA,EAAI3d,MAAQX,SAASM,cAAc,OAInCge,EAAIH,QAAUne,SAASM,cAAc,OACrCge,EAAIH,QAAQjoB,UAAY,UACxBooB,EAAI3d,MAAMT,YAAYoe,EAAIH,SAG1BG,EAAID,IAAMre,SAASM,cAAc,OACjCge,EAAI3d,MAAMT,YAAYoe,EAAID,KAG1BC,EAAI3d,MAAM,iBAAmBxS,KAE7BA,KAAKitC,OAAQ,IAIVjtC,KAAK6kC,OACR,KAAM,IAAIjhC,OAAM,yCAElB,KAAKusB,EAAI3d,MAAM1I,WAAY,CACzB,GAAI2iC,GAAazsC,KAAK6kC,OAAO1U,IAAIsc,UACjC,KAAKA,EACH,KAAM,IAAI7oC,OAAM,iEAElB6oC,GAAW16B,YAAYoe,EAAI3d,OAQ7B,GANAxS,KAAKktC,WAAY,EAMbltC,KAAKitC,MAAO,CACdjtC,KAAKs6C,gBAAgBt6C,KAAKmwB,IAAIH,SAC9BhwB,KAAKw6C,aAAax6C,KAAKmwB,IAAI3d,OAC3BxS,KAAK06C,sBAAsB16C,KAAKmwB,IAAI3d,OACpCxS,KAAK86C,aAAa96C,KAAKmwB,IAAI3d,MAG3B,IAAIzK,IAAa/H,KAAKgT,KAAKjL,UAAW,IAAM/H,KAAKgT,KAAKjL,UAAY,KAC7D/H,KAAKizC,SAAW,YAAc,GACnC9iB,GAAI3d,MAAMzK,UAAa,aAAeA,EACtCooB,EAAID,IAAInoB,UAAa,WAAaA,EAGlC/H,KAAK6S,MAAQsd,EAAI3d,MAAMge,YACvBxwB,KAAK8S,OAASqd,EAAI3d,MAAMke,aACxB1wB,KAAK+F,MAAMmqB,IAAIrd,MAAQsd,EAAID,IAAIM,YAC/BxwB,KAAK+F,MAAMmqB,IAAIpd,OAASqd,EAAID,IAAIQ,aAChC1wB,KAAK+F,MAAMiqB,QAAQld,OAASqd,EAAIH,QAAQU,aAGxCP,EAAIH,QAAQxiB,MAAM4tC,WAAa,EAAIp7C,KAAK+F,MAAMmqB,IAAIrd,MAAQ,KAG1Dsd,EAAID,IAAI1iB,MAAM5F,KAAQ5H,KAAK8S,OAAS9S,KAAK+F,MAAMmqB,IAAIpd,QAAU,EAAK,KAClEqd,EAAID,IAAI1iB,MAAMhG,KAAQxH,KAAK+F,MAAMmqB,IAAIrd,MAAQ,EAAK,KAElD7S,KAAKitC,OAAQ,EAGfjtC,KAAKm6C,qBAAqBhqB,EAAI3d,QAOhCnQ,EAAUoR,UAAUi0B,KAAO,WACpB1nC,KAAKktC,WACRltC,KAAK2hB,UAOTtf,EAAUoR,UAAUg0B,KAAO,WACrBznC,KAAKktC,YACHltC,KAAKmwB,IAAI3d,MAAM1I,YACjB9J,KAAKmwB,IAAI3d,MAAM1I,WAAW2H,YAAYzR,KAAKmwB,IAAI3d,OAGjDxS,KAAK4H,IAAM,KACX5H,KAAKwH,KAAO,KAEZxH,KAAKktC,WAAY,IAQrB7qC,EAAUoR,UAAUk7B,YAAc,WAChC,GAAIz+B,GAAQlQ,KAAK06B,WAAWlF,SAASx1B,KAAKgT,KAAK9C,MAE/ClQ,MAAKwH,KAAO0I,EAAQlQ,KAAK+F,MAAMmqB,IAAIrd,MAGnC7S,KAAKmwB,IAAI3d,MAAMhF,MAAMhG,KAAOxH,KAAKwH,KAAO,MAO1CnF,EAAUoR,UAAU85B,YAAc,WAChC,GAAIzY,GAAc90B,KAAK+O,QAAQ+lB,YAC3BtiB,EAAQxS,KAAKmwB,IAAI3d,KAGnBA,GAAMhF,MAAM5F,IADK,OAAfktB,EACgB90B,KAAK4H,IAAM,KAGV5H,KAAK6kC,OAAO/xB,OAAS9S,KAAK4H,IAAM5H,KAAK8S,OAAU,MAItEjT,EAAOD,QAAUyC,GAKb,SAASxC,EAAQD,EAASM,GAe9B,QAASoC,GAAW0Q,EAAM0nB,EAAY3rB,GASpC,GARA/O,KAAK+F,OACHiqB,SACEnd,MAAO,IAGX7S,KAAK+jB,UAAW,EAGZ/Q,EAAM,CACR,GAAkBzM,QAAdyM,EAAK9C,MACP,KAAM,IAAItM,OAAM,oCAAsCoP,EAAK3S,GAE7D,IAAgBkG,QAAZyM,EAAK7C,IACP,KAAM,IAAIvM,OAAM,kCAAoCoP,EAAK3S,IAI7D6B,EAAK3B,KAAKP,KAAMgT,EAAM0nB,EAAY3rB,GA/BpC,GAAIs2B,GAASnlC,EAAoB,IAC7BgC,EAAOhC,EAAoB,GAiC/BoC,GAAUmR,UAAY,GAAIvR,GAAM,KAAM,KAAM,MAE5CI,EAAUmR,UAAUunC,cAAgB,aAOpC14C,EAAUmR,UAAUq7B,UAAY,SAAS9Y,GAEvC,MAAQh2B,MAAKgT,KAAK9C,MAAQ8lB,EAAM7lB,KAASnQ,KAAKgT,KAAK7C,IAAM6lB,EAAM9lB,OAMjE5N,EAAUmR,UAAUkO,OAAS,WAC3B,GAAIwO,GAAMnwB,KAAKmwB,GAsBf,IArBKA,IAEHnwB,KAAKmwB,OACLA,EAAMnwB,KAAKmwB,IAGXA,EAAIqgB,IAAM3+B,SAASM,cAAc,OAIjCge,EAAIH,QAAUne,SAASM,cAAc,OACrCge,EAAIH,QAAQjoB,UAAY,UACxBooB,EAAIqgB,IAAIz+B,YAAYoe,EAAIH,SAGxBG,EAAIqgB,IAAI,iBAAmBxwC,KAE3BA,KAAKitC,OAAQ,IAIVjtC,KAAK6kC,OACR,KAAM,IAAIjhC,OAAM,yCAElB,KAAKusB,EAAIqgB,IAAI1mC,WAAY,CACvB,GAAI2iC,GAAazsC,KAAK6kC,OAAO1U,IAAIsc,UACjC,KAAKA,EACH,KAAM,IAAI7oC,OAAM,iEAElB6oC,GAAW16B,YAAYoe,EAAIqgB,KAQ7B,GANAxwC,KAAKktC,WAAY,EAMbltC,KAAKitC,MAAO,CACdjtC,KAAKs6C,gBAAgBt6C,KAAKmwB,IAAIH,SAC9BhwB,KAAKw6C,aAAax6C,KAAKmwB,IAAIqgB,KAC3BxwC,KAAK06C,sBAAsB16C,KAAKmwB,IAAIqgB,KACpCxwC,KAAK86C,aAAa96C,KAAKmwB,IAAIqgB,IAG3B,IAAIzoC,IAAa/H,KAAKgT,KAAKjL,UAAa,IAAM/H,KAAKgT,KAAKjL,UAAa,KAChE/H,KAAKizC,SAAW,YAAc,GACnC9iB,GAAIqgB,IAAIzoC,UAAY/H,KAAKg7C,cAAgBjzC,EAGzC/H,KAAK+jB,SAA6D,WAAlDtc,OAAOmtC,iBAAiBzkB,EAAIH,SAASjM,SAGrD/jB,KAAK+F,MAAMiqB,QAAQnd,MAAQ7S,KAAKmwB,IAAIH,QAAQQ,YAC5CxwB,KAAK8S,OAAS9S,KAAKmwB,IAAIqgB,IAAI9f,aAE3B1wB,KAAKitC,OAAQ,EAGfjtC,KAAKm6C,qBAAqBhqB,EAAIqgB,KAC9BxwC,KAAKq7C,mBACLr7C,KAAKs7C,qBAOPh5C,EAAUmR,UAAUi0B,KAAO,WACpB1nC,KAAKktC,WACRltC,KAAK2hB,UAQTrf,EAAUmR,UAAUg0B,KAAO,WACzB,GAAIznC,KAAKktC,UAAW,CAClB,GAAIsD,GAAMxwC,KAAKmwB,IAAIqgB,GAEfA,GAAI1mC,YACN0mC,EAAI1mC,WAAW2H,YAAY++B,GAG7BxwC,KAAK4H,IAAM,KACX5H,KAAKwH,KAAO,KAEZxH,KAAKktC,WAAY,IAQrB5qC,EAAUmR,UAAUk7B,YAAc,WAChC,GAGI4M,GACAhrB,EAJAirB,EAAcx7C,KAAK6kC,OAAOhyB,MAC1B3C,EAAQlQ,KAAK06B,WAAWlF,SAASx1B,KAAKgT,KAAK9C,OAC3CC,EAAMnQ,KAAK06B,WAAWlF,SAASx1B,KAAKgT,KAAK7C,MAKhCqrC,EAATtrC,IACFA,GAASsrC,GAEPrrC,EAAM,EAAIqrC,IACZrrC,EAAM,EAAIqrC,EAEZ,IAAIC,GAAWx2C,KAAKiI,IAAIiD,EAAMD,EAAO,EAoBrC,QAlBIlQ,KAAK+jB,UACP/jB,KAAKwH,KAAO0I,EACZlQ,KAAK6S,MAAQ4oC,EAAWz7C,KAAK+F,MAAMiqB,QAAQnd,MAC3C0d,EAAevwB,KAAK+F,MAAMiqB,QAAQnd,QAOlC7S,KAAKwH,KAAO0I,EACZlQ,KAAK6S,MAAQ4oC,EACblrB,EAAetrB,KAAKwG,IAAI0E,EAAMD,EAAOlQ,KAAK+F,MAAMiqB,QAAQnd,QAG1D7S,KAAKmwB,IAAIqgB,IAAIhjC,MAAMhG,KAAOxH,KAAKwH,KAAO,KACtCxH,KAAKmwB,IAAIqgB,IAAIhjC,MAAMqF,MAAQ4oC,EAAW,KAE9Bz7C,KAAK+O,QAAQggC,OACnB,IAAK,OACH/uC,KAAKmwB,IAAIH,QAAQxiB,MAAMhG,KAAO,GAC9B,MAEF,KAAK,QACHxH,KAAKmwB,IAAIH,QAAQxiB,MAAMhG,KAAOvC,KAAKiI,IAAKuuC,EAAWlrB,EAAe,EAAIvwB,KAAK+O,QAAQmV,QAAU,GAAK,IAClG,MAEF,KAAK,SACHlkB,KAAKmwB,IAAIH,QAAQxiB,MAAMhG,KAAOvC,KAAKiI,KAAKuuC,EAAWlrB,EAAe,EAAIvwB,KAAK+O,QAAQmV,SAAW,EAAG,GAAK,IACtG,MAEF,SAGIq3B,EAFEv7C,KAAK+jB,SAEO9e,KAAKiI,KAAKgD,EAAO,GAInB,EAARA,EACYjL,KAAKwG,KAAKyE,EACnBC,EAAMD,EAAQlQ,KAAK+F,MAAMiqB,QAAQnd,MAAQ,EAAI7S,KAAK+O,QAAQmV,SAIjD,EAGlBlkB,KAAKmwB,IAAIH,QAAQxiB,MAAMhG,KAAO+zC,EAAc,OAQlDj5C,EAAUmR,UAAU85B,YAAc,WAChC,GAAIzY,GAAc90B,KAAK+O,QAAQ+lB,YAC3B0b,EAAMxwC,KAAKmwB,IAAIqgB,GAGjBA,GAAIhjC,MAAM5F,IADO,OAAfktB,EACc90B,KAAK4H,IAAM,KAGV5H,KAAK6kC,OAAO/xB,OAAS9S,KAAK4H,IAAM5H,KAAK8S,OAAU,MAQpExQ,EAAUmR,UAAU4nC,iBAAmB,WACrC,GAAIr7C,KAAKizC,UAAYjzC,KAAK+O,QAAQmgC,SAASC,aAAenvC,KAAKmwB,IAAIurB,SAAU,CAE3E,GAAIA,GAAW7pC,SAASM,cAAc,MACtCupC,GAAS3zC,UAAY,YACrB2zC,EAASxI,aAAelzC,KAGxBqlC,EAAOqW,GACLnyC,gBAAgB,IACfsK,GAAG,OAAQ,cAId7T,KAAKmwB,IAAIqgB,IAAIz+B,YAAY2pC,GACzB17C,KAAKmwB,IAAIurB,SAAWA,OAEZ17C,KAAKizC,UAAYjzC,KAAKmwB,IAAIurB,WAE9B17C,KAAKmwB,IAAIurB,SAAS5xC,YACpB9J,KAAKmwB,IAAIurB,SAAS5xC,WAAW2H,YAAYzR,KAAKmwB,IAAIurB,UAEpD17C,KAAKmwB,IAAIurB,SAAW,OAQxBp5C,EAAUmR,UAAU6nC,kBAAoB,WACtC,GAAIt7C,KAAKizC,UAAYjzC,KAAK+O,QAAQmgC,SAASC,aAAenvC,KAAKmwB,IAAIwrB,UAAW,CAE5E,GAAIA,GAAY9pC,SAASM,cAAc,MACvCwpC,GAAU5zC,UAAY,aACtB4zC,EAAUxI,cAAgBnzC,KAG1BqlC,EAAOsW,GACLpyC,gBAAgB,IACfsK,GAAG,OAAQ,cAId7T,KAAKmwB,IAAIqgB,IAAIz+B,YAAY4pC,GACzB37C,KAAKmwB,IAAIwrB,UAAYA,OAEb37C,KAAKizC,UAAYjzC,KAAKmwB,IAAIwrB,YAE9B37C,KAAKmwB,IAAIwrB,UAAU7xC,YACrB9J,KAAKmwB,IAAIwrB,UAAU7xC,WAAW2H,YAAYzR,KAAKmwB,IAAIwrB,WAErD37C,KAAKmwB,IAAIwrB,UAAY,OAIzB97C,EAAOD,QAAU0C,GAKb,SAASzC,EAAQD,EAASM,GAkC9B,QAASgD,GAAS4W,EAAW9G,EAAMjE,GACjC,KAAM/O,eAAgBkD,IACpB,KAAM,IAAI6W,aAAY,mDAGxB/Z,MAAK47C,0BAGL57C,KAAKga,iBAAmBF,EAGxB9Z,KAAK67C,kBAAoB,GACzB77C,KAAK87C,eAAiB,IAAO97C,KAAK67C,kBAClC77C,KAAK+7C,WAAa,GAAM/7C,KAAK87C,eAC7B97C,KAAKg8C,yBAA2B,EAChCh8C,KAAKi8C,wBAA0B,GAE/Bj8C,KAAKk8C,cAAe,EAEpBl8C,KAAKm8C,kBAAoB5oC,IAAI,KAAK6oC,KAAK,KAAKC,SAAS,KAAKC,QAAQ,KAAKC,IAAI,MAG3Ev8C,KAAK40B,gBACH4nB,OACEC,KAAM,EACNC,UAAW,GACXC,UAAW,GACX/wB,OAAQ,GACRgxB,MAAO,UACPC,MAAOt2C,OACP6gB,SAAU,GACVC,SAAU,GACVy1B,UAAW,QACXC,SAAU,GACVC,SAAU,UACVC,SAAU12C,OACV22C,MAAO,GACPryC,OACIkB,OAAQ,UACRD,WAAY,UACdE,WACED,OAAQ,UACRD,WAAY,WAEdG,OACEF,OAAQ,UACRD,WAAY,YAGhBmU,YAAa,UACbJ,gBAAiB,UACjBs9B,eAAgB,UAChB5qC,MAAOhM,OACP2Z,YAAa,EACbk9B,oBAAqB72C,QAEvB82C,OACEj2B,SAAU,EACVC,SAAU,GACVxU,MAAO,EACPyqC,yBAA0B,EAC1BC,WAAY,IACZ/vC,MAAO,OACP3C,OACEA,MAAM,UACNmB,UAAU,UACVC,MAAO,WAET6wC,UAAW,UACXC,SAAU,GACVC,SAAU,QACVC,SAAU,QACVO,iBAAkB,EAClBC,MACE/3C,OAAQ,GACRg4C,IAAK,EACLC,UAAWp3C,QAEbq3C,aAAc,QAEhBC,kBAAiB,EACjBC,SACEC,WACE/uC,SAAS,EACTgvC,MAAO,EAAI,GACXC,sBAAuB,KACvBC,eAAgB,GAChBC,aAAc,GACdC,eAAgB,IAChBC,QAAS,KAEXC,WACEJ,eAAgB,EAChBC,aAAc,IACdC,eAAgB,IAChBG,aAAc,IACdF,QAAS,KAEXG,uBACExvC,SAAS,EACTkvC,eAAgB,EAChBC,aAAc,IACdC,eAAgB,IAChBG,aAAc,IACdF,QAAS,KAEXA,QAAS,KACTH,eAAgB,KAChBC,aAAc,KACdC,eAAgB,MAElBK,YACEzvC,SAAS,EACT0vC,gBAAiB,IACjBC,iBAAiB,IACjBC,cAAc,IACdC,eAAgB,GAChBC,qBAAsB,GACtBC,gBAAiB,IACjBC,oBAAqB,GACrBC,mBAAoB,EACpBC,YAAa,IACbC,mBAAoB,GACpBC,sBAAuB,GACvBC,WAAY,GACZC,aAAczsC,MAAQ,EACRC,OAAQ,EACR8Y,OAAQ,GACtB2zB,sBAAuB,IACvBC,kBAAmB,GACnBC,uBAAwB,GAE1BC,YACE1wC,SAAS,GAEX2wC,UACE3wC,SAAS,EACT4wC,OAAQvtC,EAAG,GAAIC,EAAG,GAAIquB,KAAM,MAE9Bkf,kBACE7wC,SAAS,EACT8wC,kBAAkB,GAEpBC,oBACE/wC,SAAQ,EACRgxC,gBAAiB,IACjBC,YAAa,IACbzkB,UAAW,KACX0kB,OAAQ,WAEVC,wBAAwB,EACxBC,cACEpxC,SAAS,EACTqxC,SAAS,EACTx5C,KAAM,aACNy5C,UAAW,IAEbC,YAAc,GACdC,YAAc,GACdC,WAAW,EACXC,wBAAyB,IACzB9b,OAAQ,KACRD,QAASA,EACTre,SACEvN,MAAO,IACP+jC,UAAW,QACXC,SAAU,GACVC,SAAU,UACVnyC,OACEkB,OAAQ,OACRD,WAAY,YAGhB60C,aAAa,EACbC,WAAW,EACX1iB,UAAU,EACVjyB,OAAO,EACP40C,iBAAiB,EACjBC,iBAAiB,EACjBjuC,MAAQ,OACRC,OAAS,OACTm8B,YAAY,GAEdjvC,KAAK+gD,UAAYpgD,EAAK0E,UAAWrF,KAAK40B,gBACtC50B,KAAKghD,WAAa,EAGlBhhD,KAAKihD,UAAYzE,SAASa,UAC1Br9C,KAAKkhD,oBAAqB,EAC1BlhD,KAAKmhD,mBAAqBC,YAAaC,UAGvCrhD,KAAKshD,eAAiB,EAAEthD,KAAK67C,kBAC7B77C,KAAKuhD,wBAA0B,iBAC/BvhD,KAAKwhD,WAAa,EAClBxhD,KAAKyhD,YAAc,EACnBzhD,KAAK0hD,YAAc,EACnB1hD,KAAK2hD,kBAAoB,EACzB3hD,KAAK4hD,kBAAoB,EACzB5hD,KAAK6hD,eAAiB,KACtB7hD,KAAK8hD,mBAAqB,IAG1B,IAAI3+C,GAAUnD,IACdA,MAAK00B,OAAS,GAAIrxB,GAClBrD,KAAK+hD,OAAS,GAAIz+C,GAClBtD,KAAK+hD,OAAOC,kBAAkB,WAC5B7+C,EAAQ8+C,YAIVjiD,KAAKkiD,WAAa,EAClBliD,KAAKmiD,WAAa,EAClBniD,KAAKoiD,cAAgB,EAIrBpiD,KAAKqiD,qBAELriD,KAAKi1B,UAELj1B,KAAKsiD,oBAELtiD,KAAKuiD,qBAELviD,KAAKwiD,uBAELxiD,KAAKyiD,uBAILziD,KAAK0iD,gBAAgB1iD,KAAKwf,MAAME,YAAc,EAAG1f,KAAKwf,MAAMuF,aAAe,GAC3E/kB,KAAKkd,UAAU,GACfld,KAAKwT,WAAWzE,GAGhB/O,KAAK2iD,kBAAmB,EACxB3iD,KAAK4iD,mBACL5iD,KAAK6iD,sBAAuB,EAC5B7iD,KAAK8iD,YAAa,EAClB9iD,KAAK0gD,wBAA0B,KAC/B1gD,KAAK+iD,eAAgB,EAGrB/iD,KAAKgjD,oBACLhjD,KAAKijD,0BACLjjD,KAAKkjD,eACLljD,KAAKw8C,SACLx8C,KAAKq9C,SAGLr9C,KAAKmjD,eAAqB9wC,EAAK,EAAEC,EAAK,GACtCtS,KAAKojD,mBAAqB/wC,EAAK,EAAEC,EAAK,GACtCtS,KAAKqjD,iBAAmBhxC,EAAK,EAAEC,EAAK,GACpCtS,KAAKsjD,cACLtjD,KAAKmd,MAAQ,EACbnd,KAAKujD,cAAgBvjD,KAAKmd,MAG1Bnd,KAAKwjD,UAAY,KACjBxjD,KAAKyjD,UAAY,KAGjBzjD,KAAK0jD,gBACHnwC,IAAO,SAAU/J,EAAO4K,GACtBjR,EAAQwgD,UAAUvvC,EAAOnS,OACzBkB,EAAQ+M,SAEViF,OAAU,SAAU3L,EAAO4K,GACzBjR,EAAQygD,aAAaxvC,EAAOnS,MAAOmS,EAAOpB,MAC1C7P,EAAQ+M,SAEV0G,OAAU,SAAUpN,EAAO4K,GACzBjR,EAAQ0gD,aAAazvC,EAAOnS,OAC5BkB,EAAQ+M,UAGZlQ,KAAK8jD,gBACHvwC,IAAO,SAAU/J,EAAO4K,GACtBjR,EAAQ4gD,UAAU3vC,EAAOnS,OACzBkB,EAAQ+M,SAEViF,OAAU,SAAU3L,EAAO4K,GACzBjR,EAAQ6gD,aAAa5vC,EAAOnS,OAC5BkB,EAAQ+M,SAEV0G,OAAU,SAAUpN,EAAO4K,GACzBjR,EAAQ8gD,aAAa7vC,EAAOnS,OAC5BkB,EAAQ+M,UAKZlQ,KAAKkkD,QAAS,EACdlkD,KAAKmkD,MAAQ59C,OAGbvG,KAAKuY,QAAQvF,EAAKhT,KAAK+gD,UAAUtC,WAAWzvC,SAAWhP,KAAK+gD,UAAUhB,mBAAmB/wC,SAGzFhP,KAAKk8C,cAAe,EAC6B,GAA7Cl8C,KAAK+gD,UAAUhB,mBAAmB/wC,QACpChP,KAAKokD,2BAI2B,GAA5BpkD,KAAK+gD,UAAUN,WACjBzgD,KAAKqkD,WAAW99C,QAAW,EAAKvG,KAAK+gD,UAAUtC,WAAWzvC,SAK1DhP,KAAK+gD,UAAUtC,WAAWzvC,SAC5BhP,KAAKskD,sBAzVT,GAAIrnC,GAAU/c,EAAoB,IAC9BmlC,EAASnlC,EAAoB,IAC7BqkD,EAAWrkD,EAAoB,IAC/BS,EAAOT,EAAoB,GAC3Bg/B,EAAah/B,EAAoB,IACjCW,EAAUX,EAAoB,GAC9BY,EAAWZ,EAAoB,GAC/BuD,EAAYvD,EAAoB,IAChCwD,EAAcxD,EAAoB,IAClCmD,EAASnD,EAAoB,IAC7BoD,EAASpD,EAAoB,IAC7BqD,EAAOrD,EAAoB,IAC3BkD,EAAOlD,EAAoB,IAC3BsD,EAAQtD,EAAoB,IAC5BskD,EAActkD,EAAoB,IAClCukD,EAAYvkD,EAAoB,IAChCykC,EAAUzkC,EAAoB,GAGlCA,GAAoB,IA2UpB+c,EAAQ/Z,EAAQuQ,WAShBvQ,EAAQuQ,UAAUixC,eAAiB,WAIjC,IAAK,GAHDC,GAAU9yC,SAAS+yC,qBAAsB,UAGpCr/C,EAAI,EAAGA,EAAIo/C,EAAQj/C,OAAQH,IAAK,CACvC,GAAIs/C,GAAMF,EAAQp/C,GAAGs/C,IACjBvgD,EAAQugD,GAAO,qBAAqBrgD,KAAKqgD,EAC7C,IAAIvgD,EAEF,MAAOugD,GAAIv4C,UAAU,EAAGu4C,EAAIn/C,OAASpB,EAAM,GAAGoB,QAIlD,MAAO,OAQTxC,EAAQuQ,UAAUqxC,UAAY,WAC5B,GAAsDC,GAAlDC,EAAO,IAAKC,EAAO,KAAMC,EAAO,IAAKC,EAAO,IAChD,KAAK,GAAIC,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GACdF,EAAQH,EAAM,IAAIG,EAAOH,EAAK1yC,GAC9B8yC,EAAQJ,EAAM,IAAII,EAAOJ,EAAK1yC,GAC9B2yC,EAAQD,EAAM,IAAIC,EAAOD,EAAKzyC,GAC9B2yC,EAAQF,EAAM,IAAIE,EAAOF,EAAKzyC,GAMtC,OAHY,MAAR4yC,GAAuB,MAARC,GAAwB,KAARH,GAAuB,MAARC,IAChDD,EAAO,EAAGC,EAAO,EAAGC,EAAO,EAAGC,EAAO,IAE/BD,KAAMA,EAAMC,KAAMA,EAAMH,KAAMA,EAAMC,KAAMA,IASpD/hD,EAAQuQ,UAAU4xC,YAAc,SAASrvB,GACvC,OAAQ3jB,EAAI,IAAO2jB,EAAMmvB,KAAOnvB,EAAMkvB,MAC9B5yC,EAAI,IAAO0jB,EAAMivB,KAAOjvB,EAAMgvB,QAUxC9hD,EAAQuQ,UAAU4wC,WAAa,SAASiB,EAAkBC,EAAaC,GACjDj/C,SAAhBg/C,IACFA,GAAc,GAEKh/C,SAAjBi/C,IACFA,GAAe,GAEQj/C,SAArB++C,IACFA,GAAmB,EAGrB,IACIG,GADAzvB,EAAQh2B,KAAK8kD,WAGjB,IAAmB,GAAfS,EAAqB,CACvB,GAAIG,GAAgB1lD,KAAKkjD,YAAYx9C,MAIjC+/C,GAH+B,GAA/BzlD,KAAK+gD,UAAUX,aACwB,GAArCpgD,KAAK+gD,UAAUtC,WAAWzvC,SAC5B02C,GAAiB1lD,KAAK+gD,UAAUtC,WAAWC,gBAC/B,UAAYgH,EAAgB,WAAa,SAGzC,QAAUA,EAAgB,QAAU,SAIT,GAArC1lD,KAAK+gD,UAAUtC,WAAWzvC,SAC1B02C,GAAiB1lD,KAAK+gD,UAAUtC,WAAWC,gBACjC,YAAcgH,EAAgB,YAAc,cAG5C,YAAcA,EAAgB,aAAe,SAK7D,IAAIC,GAAS1gD,KAAKwG,IAAIzL,KAAKwf,MAAMC,OAAOC,YAAc,IAAK1f,KAAKwf,MAAMC,OAAOsF,aAAe,IAC5F0gC,IAAaE,MAEV,CACH,GAAIzO,GAAgD,IAApCjyC,KAAK8lB,IAAIiL,EAAMmvB,KAAOnvB,EAAMkvB,MACxCU,EAAgD,IAApC3gD,KAAK8lB,IAAIiL,EAAMivB,KAAOjvB,EAAMgvB,MAExCa,EAAa7lD,KAAKwf,MAAMC,OAAOC,YAAew3B,EAC9C4O,EAAa9lD,KAAKwf,MAAMC,OAAOsF,aAAe6gC,CAElDH,GAA2BK,GAAdD,EAA4BA,EAAaC,EAGpDL,EAAY,IACdA,EAAY,EAId,IAAIp5B,GAASrsB,KAAKqlD,YAAYrvB,EAC9B,IAAoB,GAAhBwvB,EAAuB,CACzB,GAAIz2C,IAAW+U,SAAUuI,EAAQlP,MAAOsoC,EAAWM,UAAWT,EAC9DtlD,MAAK+nB,OAAOhZ,GACZ/O,KAAKkkD,QAAS,EACdlkD,KAAKkQ,YAGLmc,GAAOha,GAAKozC,EACZp5B,EAAO/Z,GAAKmzC,EACZp5B,EAAOha,GAAK,GAAMrS,KAAKwf,MAAMC,OAAOC,YACpC2M,EAAO/Z,GAAK,GAAMtS,KAAKwf,MAAMC,OAAOsF,aACpC/kB,KAAKkd,UAAUuoC,GACfzlD,KAAK0iD,iBAAiBr2B,EAAOha,GAAGga,EAAO/Z,IAS3CpP,EAAQuQ,UAAUuyC,qBAAuB,WACvChmD,KAAKimD,qBACL,KAAK,GAAIC,KAAOlmD,MAAKw8C,MACfx8C,KAAKw8C,MAAM32C,eAAeqgD,IAC5BlmD,KAAKkjD,YAAYh7C,KAAKg+C,IAiB5BhjD,EAAQuQ,UAAU8E,QAAU,SAASvF,EAAMwyC,GAOzC,GANqBj/C,SAAjBi/C,IACFA,GAAe,GAGjBxlD,KAAKk8C,cAAe,EAEhBlpC,GAAQA,EAAKkd,MAAQld,EAAKwpC,OAASxpC,EAAKqqC,OAC1C,KAAM,IAAItjC,aAAY,iGAOxB,IAFA/Z,KAAKwT,WAAWR,GAAQA,EAAKjE,SAEzBiE,GAAQA,EAAKkd,KAEf,GAAGld,GAAQA,EAAKkd,IAAK,CACnB,GAAIi2B,GAAU1iD,EAAU2iD,WAAWpzC,EAAKkd,IAExC,YADAlwB,MAAKuY,QAAQ4tC,QAIZ,IAAInzC,GAAQA,EAAKqzC,OAEpB,GAAGrzC,GAAQA,EAAKqzC,MAAO,CACrB,GAAIC,GAAY5iD,EAAY6iD,WAAWvzC,EAAKqzC,MAE5C,YADArmD,MAAKuY,QAAQ+tC,QAKftmD,MAAKwmD,UAAUxzC,GAAQA,EAAKwpC,OAC5Bx8C,KAAKymD,UAAUzzC,GAAQA,EAAKqqC,MAE9Br9C,MAAK0mD,mBACe,GAAhBlB,IAC+C,GAA7CxlD,KAAK+gD,UAAUhB,mBAAmB/wC,SACpChP,KAAK2mD,eACL3mD,KAAKokD,4BAIDpkD,KAAK+gD,UAAUN,WACjBzgD,KAAK4mD,aAGT5mD,KAAKkQ,SAEPlQ,KAAKk8C,cAAe,GAOtBh5C,EAAQuQ,UAAUD,WAAa,SAAUzE,GACvC,GAAIA,EAAS,CACX,GAAInJ,GAEA4I,GAAU,QAAQ,QAAQ,eAAe,qBAAqB,aAAa,aAC7E,WAAW,mBAAmB,QAAQ,SAAS,aAAa,YAAY,WAAW,aAOrF,IAJA7N,EAAK8F,uBAAuB+H,EAAOxO,KAAK+gD,UAAWhyC,GACnDpO,EAAK8F,wBAAwB,SAASzG,KAAK+gD,UAAUvE,MAAOztC,EAAQytC,OACpE77C,EAAK8F,wBAAwB,QAAQ,UAAUzG,KAAK+gD,UAAU1D,MAAOtuC,EAAQsuC,OAEzEtuC,EAAQ+uC,UACVn9C,EAAKkO,aAAa7O,KAAK+gD,UAAUjD,QAAS/uC,EAAQ+uC,QAAQ,aAC1Dn9C,EAAKkO,aAAa7O,KAAK+gD,UAAUjD,QAAS/uC,EAAQ+uC,QAAQ,aAEtD/uC,EAAQ+uC,QAAQU,uBAAuB,CACzCx+C,KAAK+gD,UAAUhB,mBAAmB/wC,SAAU,EAC5ChP,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,SAAU,EACvDhP,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SAAU,CAC3C,KAAKpJ,IAAQmJ,GAAQ+uC,QAAQU,sBACvBzvC,EAAQ+uC,QAAQU,sBAAsB34C,eAAeD,KACvD5F,KAAK+gD,UAAUjD,QAAQU,sBAAsB54C,GAAQmJ,EAAQ+uC,QAAQU,sBAAsB54C;CAiDnG,GA3CImJ,EAAQqgC,QAAQpvC,KAAKm8C,iBAAiB5oC,IAAMxE,EAAQqgC,OACpDrgC,EAAQ83C,SAAS7mD,KAAKm8C,iBAAiBC,KAAOrtC,EAAQ83C,QACtD93C,EAAQ+3C,aAAa9mD,KAAKm8C,iBAAiBE,SAAWttC,EAAQ+3C,YAC9D/3C,EAAQg4C,YAAY/mD,KAAKm8C,iBAAiBG,QAAUvtC,EAAQg4C,WAC5Dh4C,EAAQi4C,WAAWhnD,KAAKm8C,iBAAiBI,IAAMxtC,EAAQi4C,UAE3DrmD,EAAKkO,aAAa7O,KAAK+gD,UAAWhyC,EAAQ,gBAC1CpO,EAAKkO,aAAa7O,KAAK+gD,UAAWhyC,EAAQ,sBAC1CpO,EAAKkO,aAAa7O,KAAK+gD,UAAWhyC,EAAQ,cAC1CpO,EAAKkO,aAAa7O,KAAK+gD,UAAWhyC,EAAQ,cAC1CpO,EAAKkO,aAAa7O,KAAK+gD,UAAWhyC,EAAQ,YAC1CpO,EAAKkO,aAAa7O,KAAK+gD,UAAWhyC,EAAQ,oBAGtCA,EAAQ8wC,mBACV7/C,KAAKinD,SAAWjnD,KAAK+gD,UAAUlB,iBAAiBC,kBAK9C/wC,EAAQsuC,QACkB92C,SAAxBwI,EAAQsuC,MAAMxyC,QACZlK,EAAKuD,SAAS6K,EAAQsuC,MAAMxyC,QAC9B7K,KAAK+gD,UAAU1D,MAAMxyC,SACrB7K,KAAK+gD,UAAU1D,MAAMxyC,MAAMA,MAAQkE,EAAQsuC,MAAMxyC,MACjD7K,KAAK+gD,UAAU1D,MAAMxyC,MAAMmB,UAAY+C,EAAQsuC,MAAMxyC,MACrD7K,KAAK+gD,UAAU1D,MAAMxyC,MAAMoB,MAAQ8C,EAAQsuC,MAAMxyC,QAGftE,SAA9BwI,EAAQsuC,MAAMxyC,MAAMA,QAA0B7K,KAAK+gD,UAAU1D,MAAMxyC,MAAMA,MAAQkE,EAAQsuC,MAAMxyC,MAAMA,OACnEtE,SAAlCwI,EAAQsuC,MAAMxyC,MAAMmB,YAA0BhM,KAAK+gD,UAAU1D,MAAMxyC,MAAMmB,UAAY+C,EAAQsuC,MAAMxyC,MAAMmB,WAC3EzF,SAA9BwI,EAAQsuC,MAAMxyC,MAAMoB,QAA0BjM,KAAK+gD,UAAU1D,MAAMxyC,MAAMoB,MAAQ8C,EAAQsuC,MAAMxyC,MAAMoB,SAIxG8C,EAAQsuC,MAAMP,WACWv2C,SAAxBwI,EAAQsuC,MAAMxyC,QACZlK,EAAKuD,SAAS6K,EAAQsuC,MAAMxyC,OAAmB7K,KAAK+gD,UAAU1D,MAAMP,UAAY/tC,EAAQsuC,MAAMxyC,MAC3DtE,SAA9BwI,EAAQsuC,MAAMxyC,MAAMA,QAAsB7K,KAAK+gD,UAAU1D,MAAMP,UAAY/tC,EAAQsuC,MAAMxyC,MAAMA,SAK1GkE,EAAQytC,OACNztC,EAAQytC,MAAM3xC,MAAO,CACvB,GAAIq8C,GAAcvmD,EAAKiK,WAAWmE,EAAQytC,MAAM3xC,MAChD7K,MAAK+gD,UAAUvE,MAAM3xC,MAAMiB,WAAao7C,EAAYp7C,WACpD9L,KAAK+gD,UAAUvE,MAAM3xC,MAAMkB,OAASm7C,EAAYn7C,OAChD/L,KAAK+gD,UAAUvE,MAAM3xC,MAAMmB,UAAUF,WAAao7C,EAAYl7C,UAAUF,WACxE9L,KAAK+gD,UAAUvE,MAAM3xC,MAAMmB,UAAUD,OAASm7C,EAAYl7C,UAAUD,OACpE/L,KAAK+gD,UAAUvE,MAAM3xC,MAAMoB,MAAMH,WAAao7C,EAAYj7C,MAAMH,WAChE9L,KAAK+gD,UAAUvE,MAAM3xC,MAAMoB,MAAMF,OAASm7C,EAAYj7C,MAAMF,OAGhE,GAAIgD,EAAQ2lB,OACV,IAAK,GAAIyyB,KAAap4C,GAAQ2lB,OAC5B,GAAI3lB,EAAQ2lB,OAAO7uB,eAAeshD,GAAY,CAC5C,GAAI50C,GAAQxD,EAAQ2lB,OAAOyyB,EAC3BnnD,MAAK00B,OAAOnhB,IAAI4zC,EAAW50C,GAKjC,GAAIxD,EAAQuX,QAAS,CACnB,IAAK1gB,IAAQmJ,GAAQuX,QACfvX,EAAQuX,QAAQzgB,eAAeD,KACjC5F,KAAK+gD,UAAUz6B,QAAQ1gB,GAAQmJ,EAAQuX,QAAQ1gB,GAG/CmJ,GAAQuX,QAAQzb,QAClB7K,KAAK+gD,UAAUz6B,QAAQzb,MAAQlK,EAAKiK,WAAWmE,EAAQuX,QAAQzb,QAiBnE,GAbI,cAAgBkE,KACdA,EAAQq4C,YACVpnD,KAAKqnD,UAAY,GAAI5C,GAAUzkD,KAAKwf,OACpCxf,KAAKqnD,UAAUxzC,GAAG,SAAU7T,KAAKsnD,gBAAgBjyB,KAAKr1B,QAGlDA,KAAKqnD,YACPrnD,KAAKqnD,UAAUzzC,gBACR5T,MAAKqnD,YAKdt4C,EAAQy3B,OACV,KAAM,IAAI5iC,OAAM,8EAMpB5D,KAAKqiD,qBAELriD,KAAKunD,0BAELvnD,KAAKwnD,0BAELxnD,KAAKynD,yBAILznD,KAAKsnD,kBACLtnD,KAAK6kB,QAAQ7kB,KAAK+gD,UAAUluC,MAAO7S,KAAK+gD,UAAUjuC,QAClD9S,KAAKkkD,QAAS,EACdlkD,KAAKkQ,SAYPhN,EAAQuQ,UAAUwhB,QAAU,WAE1B,KAAOj1B,KAAKga,iBAAiB4J,iBAC3B5jB,KAAKga,iBAAiBvI,YAAYzR,KAAKga,iBAAiB6J,WAiB1D,IAdA7jB,KAAKwf,MAAQ3N,SAASM,cAAc,OACpCnS,KAAKwf,MAAMzX,UAAY,oBACvB/H,KAAKwf,MAAMhS,MAAMsW,SAAW,WAC5B9jB,KAAKwf,MAAMhS,MAAMuW,SAAW,SAK5B/jB,KAAKwf,MAAMC,OAAS5N,SAASM,cAAc,UAE3CnS,KAAKwf,MAAMC,OAAOjS,MAAMsW,SAAW,WACnC9jB,KAAKwf,MAAMzN,YAAY/R,KAAKwf,MAAMC,QAG7Bzf,KAAKwf,MAAMC,OAAOyH,WAQlB,CAEH,GAAID,GAAMjnB,KAAKwf,MAAMC,OAAOyH,WAAW,KAEvClnB,MAAKghD,YAAcv5C,OAAOigD,kBAAoB,IAAMzgC,EAAI0gC,8BAC9C1gC,EAAI2gC,2BACJ3gC,EAAI4gC,0BACJ5gC,EAAI6gC,yBACJ7gC,EAAI8gC,wBAA0B,GAIxC/nD,KAAKwf,MAAMC,OAAOyH,WAAW,MAAM8gC,aAAahoD,KAAKghD,WAAY,EAAG,EAAGhhD,KAAKghD,WAAY,EAAG,OApB1D,CACjC,GAAIh9B,GAAWnS,SAASM,cAAe,MACvC6R,GAASxW,MAAM3C,MAAQ,MACvBmZ,EAASxW,MAAMyW,WAAc,OAC7BD,EAASxW,MAAM0W,QAAW,OAC1BF,EAASG,UAAa,mDACtBnkB,KAAKwf,MAAMC,OAAO1N,YAAYiS,GAoBhC,GAAIvP,GAAKzU,IACTA,MAAKslC,QACLtlC,KAAKioD,SACLjoD,KAAK8D,OAASuhC,EAAOrlC,KAAKwf,MAAMC,QAC9B8lB,iBAAiB,IAEnBvlC,KAAK8D,OAAO+P,GAAG,MAAaY,EAAGyzC,OAAO7yB,KAAK5gB,IAC3CzU,KAAK8D,OAAO+P,GAAG,YAAaY,EAAG0zC,aAAa9yB,KAAK5gB,IACjDzU,KAAK8D,OAAO+P,GAAG,OAAaY,EAAGiqB,QAAQrJ,KAAK5gB,IAC5CzU,KAAK8D,OAAO+P,GAAG,QAAaY,EAAGoqB,SAASxJ,KAAK5gB,IAC7CzU,KAAK8D,OAAO+P,GAAG,QAAaY,EAAGmqB,SAASvJ,KAAK5gB,IAC7CzU,KAAK8D,OAAO+P,GAAG,YAAaY,EAAG8pB,aAAalJ,KAAK5gB,IACjDzU,KAAK8D,OAAO+P,GAAG,OAAaY,EAAG+pB,QAAQnJ,KAAK5gB,IAC5CzU,KAAK8D,OAAO+P,GAAG,UAAaY,EAAGgqB,WAAWpJ,KAAK5gB,IAC/CzU,KAAK8D,OAAO+P,GAAG,aAAaY,EAAGkqB,cAActJ,KAAK5gB,IAClDzU,KAAK8D,OAAO+P,GAAG,iBAAiBY,EAAGkqB,cAActJ,KAAK5gB,IACtDzU,KAAK8D,OAAO+P,GAAG,YAAaY,EAAG2zC,kBAAkB/yB,KAAK5gB,IAEtDzU,KAAKqoD,YAAchjB,EAAOrlC,KAAKwf,OAC7B+lB,iBAAiB,IAGnBvlC,KAAKqoD,YAAYx0C,GAAG,UAAaY,EAAG6zC,WAAWjzB,KAAK5gB,IAGpDzU,KAAKga,iBAAiBjI,YAAY/R,KAAKwf,QASzCtc,EAAQuQ,UAAU6zC,gBAAkB,WAClC,GAAI7yC,GAAKzU,IACauG,UAAlBvG,KAAKukD,UACPvkD,KAAKukD,SAAS3wC,UAEhB5T,KAAKukD,SAAWA,IAEhBvkD,KAAKukD,SAASgE,QAEVvoD,KAAK+gD,UAAUpB,SAAS3wC,SAAWhP,KAAKwoD,aAC1CxoD,KAAKukD,SAASlvB,KAAK,KAAQr1B,KAAKyoD,QAAQpzB,KAAK5gB,GAAQ,WACrDzU,KAAKukD,SAASlvB,KAAK,KAAQr1B,KAAK0oD,aAAarzB,KAAK5gB,GAAK,SACvDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAK2oD,UAAUtzB,KAAK5gB,GAAM,WACrDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAK0oD,aAAarzB,KAAK5gB,GAAK,SACvDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAK4oD,UAAUvzB,KAAK5gB,GAAM,WACrDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAK6oD,aAAaxzB,KAAK5gB,GAAK,SACvDzU,KAAKukD,SAASlvB,KAAK,QAAQr1B,KAAK8oD,WAAWzzB,KAAK5gB,GAAK,WACrDzU,KAAKukD,SAASlvB,KAAK,QAAQr1B,KAAK6oD,aAAaxzB,KAAK5gB,GAAK,SACvDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAK+oD,QAAQ1zB,KAAK5gB,GAAQ,WACrDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAQ,SACvDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAK+oD,QAAQ1zB,KAAK5gB,GAAQ,WACrDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAQ,SACvDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAKipD,SAAS5zB,KAAK5gB,GAAO,WACrDzU,KAAKukD,SAASlvB,KAAK,OAAQr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAQ,SACvDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAKipD,SAAS5zB,KAAK5gB,GAAO,WACrDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAQ,SACvDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAK+oD,QAAQ1zB,KAAK5gB,GAAQ,WACrDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAQ,SACvDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAKipD,SAAS5zB,KAAK5gB,GAAO,WACrDzU,KAAKukD,SAASlvB,KAAK,IAAQr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAQ,SACvDzU,KAAKukD,SAASlvB,KAAK,SAASr1B,KAAK+oD,QAAQ1zB,KAAK5gB,GAAO,WACrDzU,KAAKukD,SAASlvB,KAAK,SAASr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAO,SACvDzU,KAAKukD,SAASlvB,KAAK,WAAWr1B,KAAKipD,SAAS5zB,KAAK5gB,GAAI,WACrDzU,KAAKukD,SAASlvB,KAAK,WAAWr1B,KAAKgpD,UAAU3zB,KAAK5gB,GAAK,UAGV,GAA3CzU,KAAK+gD,UAAUlB,iBAAiB7wC,UAClChP,KAAKukD,SAASlvB,KAAK,MAAMr1B,KAAKkpD,sBAAsB7zB,KAAK5gB,IACzDzU,KAAKukD,SAASlvB,KAAK,SAASr1B,KAAKmpD,gBAAgB9zB,KAAK5gB,MAU1DvR,EAAQuQ,UAAU21C,YAAc,SAAU/qB,GACxC,OACEhsB,EAAGgsB,EAAMW,MAAQr+B,EAAK0G,gBAAgBrH,KAAKwf,MAAMC,QACjDnN,EAAG+rB,EAAMY,MAAQt+B,EAAKgH,eAAe3H,KAAKwf,MAAMC,UASpDvc,EAAQuQ,UAAUmrB,SAAW,SAAUp1B,GACrCxJ,KAAKslC,KAAK9E,QAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,QACnDrsB,KAAKslC,KAAK+jB,SAAU,EACpBrpD,KAAKioD,MAAM9qC,MAAQnd,KAAKspD,YAExBtpD,KAAKupD,aAAavpD,KAAKslC,KAAK9E,UAO9Bt9B,EAAQuQ,UAAU8qB,aAAe,WAC/Bv+B,KAAKwpD,oBAUPtmD,EAAQuQ,UAAU+1C,iBAAmB,WACnC,GAAIlkB,GAAOtlC,KAAKslC,KACZyf,EAAO/kD,KAAKypD,WAAWnkB,EAAK9E,QAShC,IANA8E,EAAKnG,UAAW,EAChBmG,EAAK6K,aACL7K,EAAK3nB,YAAc3d,KAAK0pD,kBACxBpkB,EAAK8f,OAAS,KACdplD,KAAK+iD,eAAgB,EAET,MAARgC,GAA4C,GAA5B/kD,KAAK+gD,UAAUH,UAAmB,CACpD5gD,KAAK+iD,eAAgB,EACrBzd,EAAK8f,OAASL,EAAK1kD,GAEd0kD,EAAK4E,cACR3pD,KAAK4pD,cAAc7E,GAAK,GAG1B/kD,KAAKiuB,KAAK,aAAa47B,QAAQ7pD,KAAKm3B,eAAeqlB,OAGnD,KAAK,GAAIsN,KAAY9pD,MAAK+pD,aAAavN,MACrC,GAAIx8C,KAAK+pD,aAAavN,MAAM32C,eAAeikD,GAAW,CACpD,GAAI9lD,GAAShE,KAAK+pD,aAAavN,MAAMsN,GACjCv+C,GACFlL,GAAI2D,EAAO3D,GACX0kD,KAAM/gD,EAGNqO,EAAGrO,EAAOqO,EACVC,EAAGtO,EAAOsO,EACV03C,OAAQhmD,EAAOgmD,OACfC,OAAQjmD,EAAOimD,OAGjBjmD,GAAOgmD,QAAS,EAChBhmD,EAAOimD,QAAS,EAEhB3kB,EAAK6K,UAAUjoC,KAAKqD,MAW5BrI,EAAQuQ,UAAU+qB,QAAU,SAAUh1B,GACpCxJ,KAAKkqD,cAAc1gD,IAUrBtG,EAAQuQ,UAAUy2C,cAAgB,SAAS1gD,GACzC,IAAIxJ,KAAKslC,KAAK+jB,QAAd,CAKArpD,KAAKmqD,aAEL,IAAI3pB,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,QACzC5X,EAAKzU,KACLslC,EAAOtlC,KAAKslC,KACZ6K,EAAY7K,EAAK6K,SACrB,IAAIA,GAAaA,EAAUzqC,QAAsC,GAA5B1F,KAAK+gD,UAAUH,UAAmB,CAErE,GAAI1gB,GAASM,EAAQnuB,EAAIizB,EAAK9E,QAAQnuB,EAClC8tB,EAASK,EAAQluB,EAAIgzB,EAAK9E,QAAQluB,CAGtC69B,GAAU5nC,QAAQ,SAAUgD,GAC1B,GAAIw5C,GAAOx5C,EAAEw5C,IAERx5C,GAAEy+C,SACLjF,EAAK1yC,EAAIoC,EAAG21C,qBAAqB31C,EAAG41C,qBAAqB9+C,EAAE8G,GAAK6tB,IAG7D30B,EAAE0+C,SACLlF,EAAKzyC,EAAImC,EAAG61C,qBAAqB71C,EAAG81C,qBAAqBh/C,EAAE+G,GAAK6tB,MAM/DngC,KAAKkkD,SACRlkD,KAAKkkD,QAAS,EACdlkD,KAAKkQ,aAIP,IAAkC,GAA9BlQ,KAAK+gD,UAAUJ,YAAqB,CAEtC,GAAIlzB,GAAQ+S,EAAQnuB,EAAIrS,KAAKslC,KAAK9E,QAAQnuB,EACtCqb,EAAQ8S,EAAQluB,EAAItS,KAAKslC,KAAK9E,QAAQluB,CAE1CtS,MAAK0iD,gBACH1iD,KAAKslC,KAAK3nB,YAAYtL,EAAIob,EAC1BztB,KAAKslC,KAAK3nB,YAAYrL,EAAIob,GAE5B1tB,KAAKiiD,aAWX/+C,EAAQuQ,UAAUgrB,WAAa,SAAUj1B,GACvCxJ,KAAKwqD,eAAehhD,IAItBtG,EAAQuQ,UAAU+2C,eAAiB,WACjCxqD,KAAKslC,KAAKnG,UAAW,CACrB,IAAIgR,GAAYnwC,KAAKslC,KAAK6K,SACtBA,IAAaA,EAAUzqC,QACzByqC,EAAU5nC,QAAQ,SAAUgD,GAE1BA,EAAEw5C,KAAKiF,OAASz+C,EAAEy+C,OAClBz+C,EAAEw5C,KAAKkF,OAAS1+C,EAAE0+C,SAEpBjqD,KAAKkkD,QAAS,EACdlkD,KAAKkQ,SAGLlQ,KAAKiiD,UAEmB,GAAtBjiD,KAAK+iD,cACP/iD,KAAKiuB,KAAK,WAAW47B,aAGrB7pD,KAAKiuB,KAAK,WAAW47B,QAAQ7pD,KAAKm3B,eAAeqlB,SAQrDt5C,EAAQuQ,UAAUy0C,OAAS,SAAU1+C,GACnC,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OAC7CrsB,MAAKqjD,gBAAkB7iB,EACvBxgC,KAAKyqD,WAAWjqB,IASlBt9B,EAAQuQ,UAAU00C,aAAe,SAAU3+C,GACzC,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OAC7CrsB,MAAK0qD,iBAAiBlqB,IAQxBt9B,EAAQuQ,UAAUirB,QAAU,SAAUl1B,GACpC,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OAC7CrsB,MAAKqjD,gBAAkB7iB,EACvBxgC,KAAK2qD,cAAcnqB,IAQrBt9B,EAAQuQ,UAAU60C,WAAa,SAAU9+C,GACvC,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OAC7CrsB,MAAK4qD,iBAAiBpqB,IAQxBt9B,EAAQuQ,UAAUorB,SAAW,SAAUr1B,GACrC,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OAE7CrsB,MAAKslC,KAAK+jB,SAAU,EACd,SAAWrpD,MAAKioD,QACpBjoD,KAAKioD,MAAM9qC,MAAQ,EAIrB,IAAIA,GAAQnd,KAAKioD,MAAM9qC,MAAQ3T,EAAMy2B,QAAQ9iB,KAC7Cnd,MAAK6qD,MAAM1tC,EAAOqjB,IAUpBt9B,EAAQuQ,UAAUo3C,MAAQ,SAAS1tC,EAAOqjB,GACxC,GAA+B,GAA3BxgC,KAAK+gD,UAAU7iB,SAAkB,CACnC,GAAI4sB,GAAW9qD,KAAKspD,WACR,MAARnsC,IACFA,EAAQ,MAENA,EAAQ,KACVA,EAAQ,GAGV,IAAI4tC,GAAsB,IACRxkD,UAAdvG,KAAKslC,MACmB,GAAtBtlC,KAAKslC,KAAKnG,WACZ4rB,EAAsB/qD,KAAKgrD,YAAYhrD,KAAKslC,KAAK9E,SAIrD,IAAI7iB,GAAc3d,KAAK0pD,kBAEnBuB,EAAY9tC,EAAQ2tC,EACpBI,GAAM,EAAID,GAAazqB,EAAQnuB,EAAIsL,EAAYtL,EAAI44C,EACnDE,GAAM,EAAIF,GAAazqB,EAAQluB,EAAIqL,EAAYrL,EAAI24C,CASvD,IAPAjrD,KAAKsjD,YAAcjxC,EAAMrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GACxCC,EAAMtS,KAAKsqD,qBAAqB9pB,EAAQluB,IAE3DtS,KAAKkd,UAAUC,GACfnd,KAAK0iD,gBAAgBwI,EAAIC,GACzBnrD,KAAKorD,wBAEsB,MAAvBL,EAA6B,CAC/B,GAAIM,GAAuBrrD,KAAKsrD,YAAYP,EAC5C/qD,MAAKslC,KAAK9E,QAAQnuB,EAAIg5C,EAAqBh5C,EAC3CrS,KAAKslC,KAAK9E,QAAQluB,EAAI+4C,EAAqB/4C,EAY7C,MATAtS,MAAKiiD,UAEU9kC,EAAX2tC,EACF9qD,KAAKiuB,KAAK,QAASuN,UAAU,MAG7Bx7B,KAAKiuB,KAAK,QAASuN,UAAU,MAGxBre,IAYXja,EAAQuQ,UAAUkrB,cAAgB,SAASn1B,GAEzC,GAAIqlB,GAAQ,CAYZ,IAXIrlB,EAAMslB,WACRD,EAAQrlB,EAAMslB,WAAW,IAChBtlB,EAAMulB,SAGfF,GAASrlB,EAAMulB,OAAO,GAMpBF,EAAO,CAGT,GAAI1R,GAAQnd,KAAKspD,YACb3oB,EAAO9R,EAAQ,EACP,GAARA,IACF8R,GAAe,EAAIA,GAErBxjB,GAAU,EAAIwjB,CAGd,IAAIV,GAAUf,EAAWqB,YAAYvgC,KAAMwJ,GACvCg3B,EAAUxgC,KAAKopD,YAAYnpB,EAAQ5T,OAGvCrsB,MAAK6qD,MAAM1tC,EAAOqjB,GAIpBh3B,EAAMD,kBASRrG,EAAQuQ,UAAU20C,kBAAoB,SAAU5+C,GAC9C,GAAIy2B,GAAUf,EAAWqB,YAAYvgC,KAAMwJ,GACvCg3B,EAAUxgC,KAAKopD,YAAYnpB,EAAQ5T,OAGnCrsB,MAAKurD,UACPvrD,KAAKwrD,gBAAgBhrB,EAKvB,IAAI/rB,GAAKzU,KACLyrD,EAAY,WACdh3C,EAAGi3C,gBAAgBlrB,GAarB,IAXIxgC,KAAK2rD,YACP34B,cAAchzB,KAAK2rD,YAEhB3rD,KAAKslC,KAAKnG,WACbn/B,KAAK2rD,WAAa9xC,WAAW4xC,EAAWzrD,KAAK+gD,UAAUz6B,QAAQvN,QAOrC,GAAxB/Y,KAAK+gD,UAAU90C,MAAe,CAEhC,IAAK,GAAI2/C,KAAU5rD,MAAKihD,SAAS5D,MAC3Br9C,KAAKihD,SAAS5D,MAAMx3C,eAAe+lD,KACrC5rD,KAAKihD,SAAS5D,MAAMuO,GAAQ3/C,OAAQ,QAC7BjM,MAAKihD,SAAS5D,MAAMuO,GAK/B,IAAI1oC,GAAMljB,KAAKypD,WAAWjpB,EACf,OAAPtd,IACFA,EAAMljB,KAAK6rD,WAAWrrB,IAEb,MAAPtd,GACFljB,KAAK8rD,aAAa5oC,EAIpB,KAAK,GAAIkiC,KAAUplD,MAAKihD,SAASzE,MAC3Bx8C,KAAKihD,SAASzE,MAAM32C,eAAeu/C,KACjCliC,YAAe3f,IAAQ2f,EAAI7iB,IAAM+kD,GAAUliC,YAAe9f,IAAe,MAAP8f,KACpEljB,KAAK+rD,YAAY/rD,KAAKihD,SAASzE,MAAM4I,UAC9BplD,MAAKihD,SAASzE,MAAM4I,GAIjCplD,MAAK2hB,WAYTze,EAAQuQ,UAAUi4C,gBAAkB,SAAUlrB,GAC5C,GAOIngC,GAPA6iB,GACF1b,KAAQxH,KAAKoqD,qBAAqB5pB,EAAQnuB,GAC1CzK,IAAQ5H,KAAKsqD,qBAAqB9pB,EAAQluB,GAC1CiV,MAAQvnB,KAAKoqD,qBAAqB5pB,EAAQnuB,GAC1CmR,OAAQxjB,KAAKsqD,qBAAqB9pB,EAAQluB,IAIxC05C,EAAgBhsD,KAAKurD,QAEzB,IAAqBhlD,QAAjBvG,KAAKurD,SAAuB,CAE9B,GAAI/O,GAAQx8C,KAAKw8C,KACjB,KAAKn8C,IAAMm8C,GACT,GAAIA,EAAM32C,eAAexF,GAAK,CAC5B,GAAI0kD,GAAOvI,EAAMn8C,EACjB,IAAwBkG,SAApBw+C,EAAKkH,YAA4BlH,EAAKmH,kBAAkBhpC,GAAM,CAChEljB,KAAKurD,SAAWxG,CAChB,SAMR,GAAsBx+C,SAAlBvG,KAAKurD,SAAwB,CAE/B,GAAIlO,GAAQr9C,KAAKq9C,KACjB,KAAKh9C,IAAMg9C,GACT,GAAIA,EAAMx3C,eAAexF,GAAK,CAC5B,GAAI8rD,GAAO9O,EAAMh9C,EACjB,IAAI8rD,EAAKC,WAAkC7lD,SAApB4lD,EAAKF,YACxBE,EAAKD,kBAAkBhpC,GAAM,CAC/BljB,KAAKurD,SAAWY,CAChB,SAMR,GAAInsD,KAAKurD,UAEP,GAAIvrD,KAAKurD,UAAYS,EAAe,CAClC,GAAIv3C,GAAKzU,IACJyU,GAAG43C,QACN53C,EAAG43C,MAAQ,GAAI7oD,GAAMiR,EAAG+K,MAAO/K,EAAGssC,UAAUz6B,UAM9C7R,EAAG43C,MAAMC,YAAY9rB,EAAQnuB,EAAI,EAAGmuB,EAAQluB,EAAI,GAChDmC,EAAG43C,MAAME,QAAQ93C,EAAG82C,SAASU,YAC7Bx3C,EAAG43C,MAAM3kB,YAIP1nC,MAAKqsD,OACPrsD,KAAKqsD,MAAM5kB,QAYjBvkC,EAAQuQ,UAAU+3C,gBAAkB,SAAUhrB,GACvCxgC,KAAKurD,UAAavrD,KAAKypD,WAAWjpB,KACrCxgC,KAAKurD,SAAWhlD,OACZvG,KAAKqsD,OACPrsD,KAAKqsD,MAAM5kB,SAajBvkC,EAAQuQ,UAAUoR,QAAU,SAAShS,EAAOC,GAC1C,GAAI05C,IAAY,EACZC,EAAWzsD,KAAKwf,MAAMC,OAAO5M,MAC7B65C,EAAY1sD,KAAKwf,MAAMC,OAAO3M,MAC9BD,IAAS7S,KAAK+gD,UAAUluC,OAASC,GAAU9S,KAAK+gD,UAAUjuC,QAAU9S,KAAKwf,MAAMhS,MAAMqF,OAASA,GAAS7S,KAAKwf,MAAMhS,MAAMsF,QAAUA,GACpI9S,KAAKwf,MAAMhS,MAAMqF,MAAQA,EACzB7S,KAAKwf,MAAMhS,MAAMsF,OAASA,EAE1B9S,KAAKwf,MAAMC,OAAOjS,MAAMqF,MAAQ,OAChC7S,KAAKwf,MAAMC,OAAOjS,MAAMsF,OAAS,OAEjC9S,KAAKwf,MAAMC,OAAO5M,MAAQ7S,KAAKwf,MAAMC,OAAOC,YAAc1f,KAAKghD,WAC/DhhD,KAAKwf,MAAMC,OAAO3M,OAAS9S,KAAKwf,MAAMC,OAAOsF,aAAe/kB,KAAKghD,WAEjEhhD,KAAK+gD,UAAUluC,MAAQA,EACvB7S,KAAK+gD,UAAUjuC,OAASA,EAExB05C,GAAY,IAMRxsD,KAAKwf,MAAMC,OAAO5M,OAAS7S,KAAKwf,MAAMC,OAAOC,YAAc1f,KAAKghD,aAClEhhD,KAAKwf,MAAMC,OAAO5M,MAAQ7S,KAAKwf,MAAMC,OAAOC,YAAc1f,KAAKghD,WAC/DwL,GAAY,GAEVxsD,KAAKwf,MAAMC,OAAO3M,QAAU9S,KAAKwf,MAAMC,OAAOsF,aAAe/kB,KAAKghD,aACpEhhD,KAAKwf,MAAMC,OAAO3M,OAAS9S,KAAKwf,MAAMC,OAAOsF,aAAe/kB,KAAKghD,WACjEwL,GAAY,IAIC,GAAbA,GACFxsD,KAAKiuB,KAAK,UAAWpb,MAAM7S,KAAKwf,MAAMC,OAAO5M,MAAQ7S,KAAKghD,WAAWluC,OAAO9S,KAAKwf,MAAMC,OAAO3M,OAAS9S,KAAKghD,WAAYyL,SAAUA,EAAWzsD,KAAKghD,WAAY0L,UAAWA,EAAY1sD,KAAKghD,cAS9L99C,EAAQuQ,UAAU+yC,UAAY,SAAShK,GACrC,GAAImQ,GAAe3sD,KAAKwjD,SAExB,IAAIhH,YAAiB37C,IAAW27C,YAAiB17C,GAC/Cd,KAAKwjD,UAAYhH,MAEd,IAAIx2C,MAAMC,QAAQu2C,GACrBx8C,KAAKwjD,UAAY,GAAI3iD,GACrBb,KAAKwjD,UAAUjwC,IAAIipC,OAEhB,CAAA,GAAKA,EAIR,KAAM,IAAIp2C,WAAU,4BAHpBpG,MAAKwjD,UAAY,GAAI3iD,GAgBvB,GAVI8rD,GAEFhsD,EAAK4H,QAAQvI,KAAK0jD,eAAgB,SAAUl7C,EAAUgB,GACpDmjD,EAAa34C,IAAIxK,EAAOhB,KAK5BxI,KAAKw8C,SAEDx8C,KAAKwjD,UAAW,CAElB,GAAI/uC,GAAKzU,IACTW,GAAK4H,QAAQvI,KAAK0jD,eAAgB,SAAUl7C,EAAUgB,GACpDiL,EAAG+uC,UAAU3vC,GAAGrK,EAAOhB,IAIzB,IAAIiN,GAAMzV,KAAKwjD,UAAUptC,QACzBpW,MAAK2jD,UAAUluC,GAEjBzV,KAAK4sD,oBAQP1pD,EAAQuQ,UAAUkwC,UAAY,SAASluC,GAErC,IAAK,GADDpV,GACKkF,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IAAK,CAC9ClF,EAAKoV,EAAIlQ,EACT,IAAIyN,GAAOhT,KAAKwjD,UAAUhuC,IAAInV,GAC1B0kD,EAAO,GAAIxhD,GAAKyP,EAAMhT,KAAK+hD,OAAQ/hD,KAAK00B,OAAQ10B,KAAK+gD,UAEzD,IADA/gD,KAAKw8C,MAAMn8C,GAAM0kD,IACG,GAAfA,EAAKiF,QAAkC,GAAfjF,EAAKkF,QAAgC,OAAXlF,EAAK1yC,GAAyB,OAAX0yC,EAAKzyC,GAAa,CAC1F,GAAIsZ,GAAS,EAASnW,EAAI/P,OAAS,GAC/BmnD,EAAQ,EAAI5nD,KAAK6mB,GAAK7mB,KAAKE,QACZ,IAAf4/C,EAAKiF,SAAkBjF,EAAK1yC,EAAIuZ,EAAS3mB,KAAKwZ,IAAIouC,IACnC,GAAf9H,EAAKkF,SAAkBlF,EAAKzyC,EAAIsZ,EAAS3mB,KAAKqZ,IAAIuuC,IAExD7sD,KAAKkkD,QAAS,EAGhBlkD,KAAKgmD,uBAC4C,GAA7ChmD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAwC,GAArBhP,KAAKk8C,eAC5Dl8C,KAAK2mD,eACL3mD,KAAKokD,4BAEPpkD,KAAK8sD,0BACL9sD,KAAK+sD,kBACL/sD,KAAKgtD,kBAAkBhtD,KAAKw8C,OAC5Bx8C,KAAKitD,gBAQP/pD,EAAQuQ,UAAUmwC,aAAe,SAASnuC,EAAIy3C,GAE5C,IAAK,GADD1Q,GAAQx8C,KAAKw8C,MACRj3C,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAIlF,GAAKoV,EAAIlQ,GACTw/C,EAAOvI,EAAMn8C,GACb2S,EAAOk6C,EAAY3nD,EACnBw/C,GAEFA,EAAKoI,cAAcn6C,EAAMhT,KAAK+gD,YAI9BgE,EAAO,GAAIxhD,GAAK6pD,WAAYptD,KAAK+hD,OAAQ/hD,KAAK00B,OAAQ10B,KAAK+gD,WAC3DvE,EAAMn8C,GAAM0kD,GAGhB/kD,KAAKkkD,QAAS,EACmC,GAA7ClkD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAwC,GAArBhP,KAAKk8C,eAC5Dl8C,KAAK2mD,eACL3mD,KAAKokD,4BAEPpkD,KAAKgmD,uBACLhmD,KAAKgtD,kBAAkBxQ,IAQzBt5C,EAAQuQ,UAAUowC,aAAe,SAASpuC,GAExC,IAAK,GADD+mC,GAAQx8C,KAAKw8C,MACRj3C,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAIlF,GAAKoV,EAAIlQ,SACNi3C,GAAMn8C,GAEfL,KAAKgmD,uBAC4C,GAA7ChmD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAwC,GAArBhP,KAAKk8C,eAC5Dl8C,KAAK2mD,eACL3mD,KAAKokD,4BAEPpkD,KAAK8sD,0BACL9sD,KAAK+sD,kBACL/sD,KAAK4sD,mBACL5sD,KAAKgtD,kBAAkBxQ,IASzBt5C,EAAQuQ,UAAUgzC,UAAY,SAASpJ,GACrC,GAAIgQ,GAAertD,KAAKyjD,SAExB,IAAIpG,YAAiBx8C,IAAWw8C,YAAiBv8C,GAC/Cd,KAAKyjD,UAAYpG,MAEd,IAAIr3C,MAAMC,QAAQo3C,GACrBr9C,KAAKyjD,UAAY,GAAI5iD,GACrBb,KAAKyjD,UAAUlwC,IAAI8pC,OAEhB,CAAA,GAAKA,EAIR,KAAM,IAAIj3C,WAAU,4BAHpBpG,MAAKyjD,UAAY,GAAI5iD,GAgBvB,GAVIwsD,GAEF1sD,EAAK4H,QAAQvI,KAAK8jD,eAAgB,SAAUt7C,EAAUgB,GACpD6jD,EAAar5C,IAAIxK,EAAOhB,KAK5BxI,KAAKq9C,SAEDr9C,KAAKyjD,UAAW,CAElB,GAAIhvC,GAAKzU,IACTW,GAAK4H,QAAQvI,KAAK8jD,eAAgB,SAAUt7C,EAAUgB,GACpDiL,EAAGgvC,UAAU5vC,GAAGrK,EAAOhB,IAIzB,IAAIiN,GAAMzV,KAAKyjD,UAAUrtC,QACzBpW,MAAK+jD,UAAUtuC,GAGjBzV,KAAK+sD,mBAQP7pD,EAAQuQ,UAAUswC,UAAY,SAAUtuC,GAItC,IAAK,GAHD4nC,GAAQr9C,KAAKq9C,MACboG,EAAYzjD,KAAKyjD,UAEZl+C,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAIlF,GAAKoV,EAAIlQ,GAET+nD,EAAUjQ,EAAMh9C,EAChBitD,IACFA,EAAQC,YAGV,IAAIv6C,GAAOywC,EAAUjuC,IAAInV,GAAKmtD,iBAAoB,GAClDnQ,GAAMh9C,GAAM,GAAI+C,GAAK4P,EAAMhT,KAAMA,KAAK+gD,WAExC/gD,KAAKkkD,QAAS,EACdlkD,KAAKgtD,kBAAkB3P,GACvBr9C,KAAKytD,qBACLztD,KAAK8sD,0BAC4C,GAA7C9sD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAwC,GAArBhP,KAAKk8C,eAC5Dl8C,KAAK2mD,eACL3mD,KAAKokD,6BASTlhD,EAAQuQ,UAAUuwC,aAAe,SAAUvuC,GAGzC,IAAK,GAFD4nC,GAAQr9C,KAAKq9C,MACboG,EAAYzjD,KAAKyjD,UACZl+C,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAIlF,GAAKoV,EAAIlQ,GAETyN,EAAOywC,EAAUjuC,IAAInV,GACrB8rD,EAAO9O,EAAMh9C,EACb8rD,IAEFA,EAAKoB,aACLpB,EAAKgB,cAAcn6C,EAAMhT,KAAK+gD,WAC9BoL,EAAK7P,YAIL6P,EAAO,GAAI/oD,GAAK4P,EAAMhT,KAAMA,KAAK+gD,WACjC/gD,KAAKq9C,MAAMh9C,GAAM8rD,GAIrBnsD,KAAKytD,qBAC4C,GAA7CztD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAwC,GAArBhP,KAAKk8C,eAC5Dl8C,KAAK2mD,eACL3mD,KAAKokD,4BAEPpkD,KAAKkkD,QAAS,EACdlkD,KAAKgtD,kBAAkB3P,IAQzBn6C,EAAQuQ,UAAUwwC,aAAe,SAAUxuC,GAEzC,IAAK,GADD4nC,GAAQr9C,KAAKq9C,MACR93C,EAAI,EAAGC,EAAMiQ,EAAI/P,OAAYF,EAAJD,EAASA,IAAK,CAC9C,GAAIlF,GAAKoV,EAAIlQ,GACT4mD,EAAO9O,EAAMh9C,EACb8rD,KACc,MAAZA,EAAKuB,WACA1tD,MAAK2tD,QAAiB,QAAS,MAAExB,EAAKuB,IAAIrtD,IAEnD8rD,EAAKoB,mBACElQ,GAAMh9C,IAIjBL,KAAKkkD,QAAS,EACdlkD,KAAKgtD,kBAAkB3P,GAC0B,GAA7Cr9C,KAAK+gD,UAAUhB,mBAAmB/wC,SAAwC,GAArBhP,KAAKk8C,eAC5Dl8C,KAAK2mD,eACL3mD,KAAKokD,4BAEPpkD,KAAK8sD,2BAOP5pD,EAAQuQ,UAAUs5C,gBAAkB,WAClC,GAAI1sD,GACAm8C,EAAQx8C,KAAKw8C,MACba,EAAQr9C,KAAKq9C,KACjB,KAAKh9C,IAAMm8C,GACLA,EAAM32C,eAAexF,KACvBm8C,EAAMn8C,GAAIg9C,SACVb,EAAMn8C,GAAIutD,gBAId,KAAKvtD,IAAMg9C,GACT,GAAIA,EAAMx3C,eAAexF,GAAK,CAC5B,GAAI8rD,GAAO9O,EAAMh9C,EACjB8rD,GAAK7iC,KAAO,KACZ6iC,EAAK5iC,GAAK,KACV4iC,EAAK7P,YAaXp5C,EAAQuQ,UAAUu5C,kBAAoB,SAAS9pC,GAC7C,GAAI7iB,GAGAoc,EAAWlW,OACXmW,EAAWnW,MACf,KAAKlG,IAAM6iB,GACT,GAAIA,EAAIrd,eAAexF,GAAK,CAC1B,GAAI+G,GAAQ8b,EAAI7iB,GAAI6U,UACN3O,UAAVa,IACFqV,EAAyBlW,SAAbkW,EAA0BrV,EAAQnC,KAAKwG,IAAIrE,EAAOqV,GAC9DC,EAAyBnW,SAAbmW,EAA0BtV,EAAQnC,KAAKiI,IAAI9F,EAAOsV,IAMpE,GAAiBnW,SAAbkW,GAAuClW,SAAbmW,EAC5B,IAAKrc,IAAM6iB,GACLA,EAAIrd,eAAexF,IACrB6iB,EAAI7iB,GAAIwtD,cAAcpxC,EAAUC,IAUxCxZ,EAAQuQ,UAAUkO,OAAS,WACzB3hB,KAAK6kB,QAAQ7kB,KAAK+gD,UAAUluC,MAAO7S,KAAK+gD,UAAUjuC,QAClD9S,KAAKiiD,WAOP/+C,EAAQuQ,UAAUwuC,QAAU,WAC1B,GAAIh7B,GAAMjnB,KAAKwf,MAAMC,OAAOyH,WAAW,KAEvCD,GAAI+gC,aAAahoD,KAAKghD,WAAY,EAAG,EAAGhhD,KAAKghD,WAAY,EAAG,EAG5D,IAAI8M,GAAI9tD,KAAKwf,MAAMC,OAAO5M,MAAS7S,KAAKghD,WACpC11C,EAAItL,KAAKwf,MAAMC,OAAO3M,OAAU9S,KAAKghD,UACzC/5B,GAAIE,UAAU,EAAG,EAAG2mC,EAAGxiD,GAGvB2b,EAAI8mC,OACJ9mC,EAAI+mC,UAAUhuD,KAAK2d,YAAYtL,EAAGrS,KAAK2d,YAAYrL,GACnD2U,EAAI9J,MAAMnd,KAAKmd,MAAOnd,KAAKmd,OAE3Bnd,KAAKmjD,eACH9wC,EAAKrS,KAAKoqD,qBAAqB,GAC/B93C,EAAKtS,KAAKsqD,qBAAqB,IAEjCtqD,KAAKojD,mBACH/wC,EAAKrS,KAAKoqD,qBAAqBpqD,KAAKwf,MAAMC,OAAOC,YAAc1f,KAAKghD,YACpE1uC,EAAKtS,KAAKsqD,qBAAqBtqD,KAAKwf,MAAMC,OAAOsF,aAAe/kB,KAAKghD,aAIvEhhD,KAAKiuD,gBAAgB,sBAAsBhnC,IACjB,GAAtBjnB,KAAKslC,KAAKnG,UAA4C54B,SAAvBvG,KAAKslC,KAAKnG,UAA4D,GAAlCn/B,KAAK+gD,UAAUF,kBACpF7gD,KAAKiuD,gBAAgB,aAAahnC,IAGV,GAAtBjnB,KAAKslC,KAAKnG,UAA4C54B,SAAvBvG,KAAKslC,KAAKnG,UAA4D,GAAlCn/B,KAAK+gD,UAAUD,kBACpF9gD,KAAKiuD,gBAAgB,aAAahnC,GAAI,GAGT,GAA3BjnB,KAAKkhD,oBACPlhD,KAAKiuD,gBAAgB,oBAAoBhnC,GAO3CA,EAAIinC,WASNhrD,EAAQuQ,UAAUivC,gBAAkB,SAASyL,EAASC,GAC3B7nD,SAArBvG,KAAK2d,cACP3d,KAAK2d,aACHtL,EAAG,EACHC,EAAG,IAIS/L,SAAZ4nD,IACFnuD,KAAK2d,YAAYtL,EAAI87C,GAEP5nD,SAAZ6nD,IACFpuD,KAAK2d,YAAYrL,EAAI87C,GAGvBpuD,KAAKiuB,KAAK,gBAQZ/qB,EAAQuQ,UAAUi2C,gBAAkB,WAClC,OACEr3C,EAAGrS,KAAK2d,YAAYtL,EACpBC,EAAGtS,KAAK2d,YAAYrL,IASxBpP,EAAQuQ,UAAUyJ,UAAY,SAASC,GACrCnd,KAAKmd,MAAQA,GAQfja,EAAQuQ,UAAU61C,UAAY,WAC5B,MAAOtpD,MAAKmd,OAUdja,EAAQuQ,UAAU22C,qBAAuB,SAAS/3C,GAChD,OAAQA,EAAIrS,KAAK2d,YAAYtL,GAAKrS,KAAKmd,OAUzCja,EAAQuQ,UAAU42C,qBAAuB,SAASh4C,GAChD,MAAOA,GAAIrS,KAAKmd,MAAQnd,KAAK2d,YAAYtL,GAU3CnP,EAAQuQ,UAAU62C,qBAAuB,SAASh4C,GAChD,OAAQA,EAAItS,KAAK2d,YAAYrL,GAAKtS,KAAKmd,OAUzCja,EAAQuQ,UAAU82C,qBAAuB,SAASj4C,GAChD,MAAOA,GAAItS,KAAKmd,MAAQnd,KAAK2d,YAAYrL,GAU3CpP,EAAQuQ,UAAU63C,YAAc,SAAU7lC,GACxC,OAAQpT,EAAGrS,KAAKqqD,qBAAqB5kC,EAAIpT,GAAIC,EAAGtS,KAAKuqD,qBAAqB9kC,EAAInT,KAShFpP,EAAQuQ,UAAUu3C,YAAc,SAAUvlC,GACxC,OAAQpT,EAAGrS,KAAKoqD,qBAAqB3kC,EAAIpT,GAAIC,EAAGtS,KAAKsqD,qBAAqB7kC,EAAInT,KAUhFpP,EAAQuQ,UAAU46C,WAAa,SAASpnC,EAAIqnC,GACvB/nD,SAAf+nD,IACFA,GAAa,EAIf,IAAI9R,GAAQx8C,KAAKw8C,MACbvJ,IAEJ,KAAK,GAAI5yC,KAAMm8C,GACTA,EAAM32C,eAAexF,KACvBm8C,EAAMn8C,GAAIkuD,eAAevuD,KAAKmd,MAAMnd,KAAKmjD,cAAcnjD,KAAKojD,mBACxD5G,EAAMn8C,GAAIspD,aACZ1W,EAAS/qC,KAAK7H,IAGVm8C,EAAMn8C,GAAImuD,UAAYF,IACxB9R,EAAMn8C,GAAI0rC,KAAK9kB,GAOvB,KAAK,GAAI1b,GAAI,EAAGkjD,EAAOxb,EAASvtC,OAAY+oD,EAAJljD,EAAUA,KAC5CixC,EAAMvJ,EAAS1nC,IAAIijD,UAAYF,IACjC9R,EAAMvJ,EAAS1nC,IAAIwgC,KAAK9kB,IAW9B/jB,EAAQuQ,UAAUi7C,WAAa,SAASznC,GACtC,GAAIo2B,GAAQr9C,KAAKq9C,KACjB,KAAK,GAAIh9C,KAAMg9C,GACb,GAAIA,EAAMx3C,eAAexF,GAAK,CAC5B,GAAI8rD,GAAO9O,EAAMh9C,EACjB8rD,GAAK5oB,SAASvjC,KAAKmd,OACfgvC,EAAKC,WACP/O,EAAMh9C,GAAI0rC,KAAK9kB,KAYvB/jB,EAAQuQ,UAAUk7C,kBAAoB,SAAS1nC,GAC7C,GAAIo2B,GAAQr9C,KAAKq9C,KACjB,KAAK,GAAIh9C,KAAMg9C,GACTA,EAAMx3C,eAAexF,IACvBg9C,EAAMh9C,GAAIsuD,kBAAkB1nC,IASlC/jB,EAAQuQ,UAAUmzC,WAAa,WACgB,GAAzC5mD,KAAK+gD,UAAUZ,wBACjBngD,KAAK4uD,qBAKP,KADA,GAAIr3C,GAAQ,EACLvX,KAAKkkD,QAAU3sC,EAAQvX,KAAK+gD,UAAUL,yBAC3C1gD,KAAK6uD,eACLt3C,GAEFvX,MAAKqkD,WAAW99C,QAAU,GAAM,GACa,GAAzCvG,KAAK+gD,UAAUZ,wBACjBngD,KAAK8uD,uBAUT5rD,EAAQuQ,UAAUm7C,oBAAsB,WACtC,GAAIpS,GAAQx8C,KAAKw8C,KACjB,KAAK,GAAIn8C,KAAMm8C,GACTA,EAAM32C,eAAexF,IACJ,MAAfm8C,EAAMn8C,GAAIgS,GAA4B,MAAfmqC,EAAMn8C,GAAIiS,IACnCkqC,EAAMn8C,GAAI0uD,UAAU18C,EAAImqC,EAAMn8C,GAAI2pD,OAClCxN,EAAMn8C,GAAI0uD,UAAUz8C,EAAIkqC,EAAMn8C,GAAI4pD,OAClCzN,EAAMn8C,GAAI2pD,QAAS,EACnBxN,EAAMn8C,GAAI4pD,QAAS,IAW3B/mD,EAAQuQ,UAAUq7C,oBAAsB,WACtC,GAAItS,GAAQx8C,KAAKw8C,KACjB,KAAK,GAAIn8C,KAAMm8C,GACTA,EAAM32C,eAAexF,IACM,MAAzBm8C,EAAMn8C,GAAI0uD,UAAU18C,IACtBmqC,EAAMn8C,GAAI2pD,OAASxN,EAAMn8C,GAAI0uD,UAAU18C,EACvCmqC,EAAMn8C,GAAI4pD,OAASzN,EAAMn8C,GAAI0uD,UAAUz8C,IAa/CpP,EAAQuQ,UAAUu7C,UAAY,SAASC,GACrC,GAAIzS,GAAQx8C,KAAKw8C,KACjB,KAAK,GAAIn8C,KAAMm8C,GACb,GAAIA,EAAM32C,eAAexF,IAAOm8C,EAAMn8C,GAAI6uD,SAASD,GACjD,OAAO,CAGX,QAAO,GAUT/rD,EAAQuQ,UAAU07C,mBAAqB,WACrC,GAEI/J,GAFAryB,EAAW/yB,KAAKi8C,wBAChBO,EAAQx8C,KAAKw8C,MAEb4S,GAAe,CAEnB,IAAIpvD,KAAK+gD,UAAUR,YAAc,EAC/B,IAAK6E,IAAU5I,GACTA,EAAM32C,eAAeu/C,KACvB5I,EAAM4I,GAAQiK,oBAAoBt8B,EAAU/yB,KAAK+gD,UAAUR,aAC3D6O,GAAe,OAKnB,KAAKhK,IAAU5I,GACTA,EAAM32C,eAAeu/C,KACvB5I,EAAM4I,GAAQkK,aAAav8B,GAC3Bq8B,GAAe,EAKrB,IAAoB,GAAhBA,EAAsB,CACxB,GAAIG,GAAgBvvD,KAAK+gD,UAAUP,YAAcv7C,KAAKiI,IAAIlN,KAAKmd,MAAM,IACrE,OAAIoyC,GAAgB,GAAIvvD,KAAK+gD,UAAUR,aAC9B,EAGAvgD,KAAKgvD,UAAUO,GAG1B,OAAO,GAQTrsD,EAAQuQ,UAAUo7C,aAAe,WAC/B,IAAK7uD,KAAK2iD,kBACW,GAAf3iD,KAAKkkD,OAAgB,CACvB,GAAIsL,IAAmB,EACnBC,GAAsB,CAE1BzvD,MAAK0vD,sBAAsB,8BAC3B,IAAIC,GAAa3vD,KAAK0vD,sBAAsB,qBACD,IAAvC1vD,KAAK+gD,UAAUX,aAAapxC,SAA0D,GAAvChP,KAAK+gD,UAAUX,aAAaC,UAC7EoP,EAAsBzvD,KAAK4vD,mBAAmB,sBAGhD,KAAK,GAAIrqD,GAAI,EAAGA,EAAIoqD,EAAWjqD,OAAQH,IAAMiqD,EAAmBG,EAAW,IAAMH,CAGjFxvD,MAAKkkD,OAASsL,GAAoBC,EAElCzvD,KAAK0gD,4BAYXx9C,EAAQuQ,UAAUo8C,eAAiB,WAEjC7vD,KAAKmkD,MAAQ59C,OAEbvG,KAAK8vD,oBAGL9vD,KAAKkQ,OAGL,IAAI6/C,GAAkB1rD,KAAKq5B,MACvBsyB,EAAW,CACfhwD,MAAK6uD,cAEL,KADA,GAAIoB,GAAe5rD,KAAKq5B,MAAQqyB,EACzBE,EAAe,IAAKjwD,KAAK87C,eAAiB97C,KAAK+7C,aAAeiU,EAAWhwD,KAAKg8C,0BACnFh8C,KAAK6uD,eACLoB,EAAe5rD,KAAKq5B,MAAQqyB,EAC5BC,GAGF,IAAIjU,GAAa13C,KAAKq5B,KACtB19B,MAAKiiD,UACLjiD,KAAK+7C,WAAa13C,KAAKq5B,MAAQqe,GAGX,mBAAXt0C,UACTA,OAAOyoD,sBAAwBzoD,OAAOyoD,uBAAyBzoD,OAAO0oD,0BACvC1oD,OAAO2oD,6BAA+B3oD,OAAO4oD,yBAM9EntD,EAAQuQ,UAAUvD,MAAQ,WACxB,GAAmB,GAAflQ,KAAKkkD,QAAqC,GAAnBlkD,KAAKkiD,YAAsC,GAAnBliD,KAAKmiD,YAAyC,GAAtBniD,KAAKoiD,eAM9E,GALiC,GAA7BpiD,KAAK6iD,uBACP7iD,KAAKiuB,KAAK,sBACVjuB,KAAK6iD,sBAAuB,IAGzB7iD,KAAKmkD,MAAO,CACf,GAAImM,GAAKpnD,UAAUC,UAAUonD,cAEzBC,GAAkB,CACQ,KAA1BF,EAAG5pD,QAAQ,YACb8pD,GAAkB,EAEa,IAAxBF,EAAG5pD,QAAQ,WACd4pD,EAAG5pD,QAAQ,WAAa,KAC1B8pD,GAAkB,GAKpBxwD,KAAKmkD,MADgB,GAAnBqM,EACW/oD,OAAOoS,WAAW7Z,KAAK6vD,eAAex6B,KAAKr1B,MAAOA,KAAK87C,gBAGvDr0C,OAAOyoD,sBAAsBlwD,KAAK6vD,eAAex6B,KAAKr1B,MAAOA,KAAK87C,qBAMnF,IADA97C,KAAKiiD,UACDjiD,KAAK0gD,wBAA0B,EAAG,CAKpC,GAAIjsC,GAAKzU,KACLoU,GACFq8C,WAAYh8C,EAAGisC,wBAEjBjsC,GAAGisC,wBAA0B,EAC7BjsC,EAAGouC,sBAAuB,EAC1BhpC,WAAW,WACTpF,EAAGwZ,KAAK,aAAc7Z,IACrB,KAWTlR,EAAQuQ,UAAUq8C,kBAAoB,WACpC,GAAuB,GAAnB9vD,KAAKkiD,YAAsC,GAAnBliD,KAAKmiD,WAAiB,CAChD,GAAIxkC,GAAc3d,KAAK0pD,iBACvB1pD,MAAK0iD,gBAAgB/kC,EAAYtL,EAAErS,KAAKkiD,WAAYvkC,EAAYrL,EAAEtS,KAAKmiD,YAEzE,GAA0B,GAAtBniD,KAAKoiD,cAAoB,CAC3B,GAAI/1B,IACFha,EAAGrS,KAAKwf,MAAMC,OAAOC,YAAc,EACnCpN,EAAGtS,KAAKwf,MAAMC,OAAOsF,aAAe,EAEtC/kB,MAAK6qD,MAAM7qD,KAAKmd,OAAO,EAAInd,KAAKoiD,eAAgB/1B,KAQpDnpB,EAAQuQ,UAAUi9C,aAAe,WACF,GAAzB1wD,KAAK2iD,iBACP3iD,KAAK2iD,kBAAmB,GAGxB3iD,KAAK2iD,kBAAmB,EACxB3iD,KAAKkQ,UAWThN,EAAQuQ,UAAUg0C,uBAAyB,SAASjC,GAIlD,GAHqBj/C,SAAjBi/C,IACFA,GAAe,GAE0B,GAAvCxlD,KAAK+gD,UAAUX,aAAapxC,SAA0D,GAAvChP,KAAK+gD,UAAUX,aAAaC,QAAiB,CAC9FrgD,KAAKytD,oBAEL,KAAK,GAAIrI,KAAUplD,MAAK2tD,QAAiB,QAAS,MAC5C3tD,KAAK2tD,QAAiB,QAAS,MAAE9nD,eAAeu/C,IACwB7+C,SAAtEvG,KAAKq9C,MAAMr9C,KAAK2tD,QAAiB,QAAS,MAAEvI,GAAQuL,qBAC/C3wD,MAAK2tD,QAAiB,QAAS,MAAEvI,OAK3C,CAEHplD,KAAK2tD,QAAiB,QAAS,QAC/B,KAAK,GAAI/B,KAAU5rD,MAAKq9C,MAClBr9C,KAAKq9C,MAAMx3C,eAAe+lD,KAC5B5rD,KAAKq9C,MAAMuO,GAAQ8B,IAAM,MAM/B1tD,KAAK8sD,0BACAtH,IACHxlD,KAAKkkD,QAAS,EACdlkD,KAAKkQ,UAWThN,EAAQuQ,UAAUg6C,mBAAqB,WACrC,GAA2C,GAAvCztD,KAAK+gD,UAAUX,aAAapxC,SAA0D,GAAvChP,KAAK+gD,UAAUX,aAAaC,QAC7E,IAAK,GAAIuL,KAAU5rD,MAAKq9C,MACtB,GAAIr9C,KAAKq9C,MAAMx3C,eAAe+lD,GAAS,CACrC,GAAIO,GAAOnsD,KAAKq9C,MAAMuO,EACtB,IAAgB,MAAZO,EAAKuB,IAAa,CACpB,GAAItI,GAAS,UAAU9wC,OAAO63C,EAAK9rD,GACnCL,MAAK2tD,QAAiB,QAAS,MAAEvI,GAAU,GAAI7hD,IACtClD,GAAG+kD,EACF3I,KAAK,EACLG,MAAM,SACNC,MAAM,GACN+T,mBAAmB,SACb5wD,KAAK+gD,WACrBoL,EAAKuB,IAAM1tD,KAAK2tD,QAAiB,QAAS,MAAEvI,GAC5C+G,EAAKuB,IAAIiD,aAAexE,EAAK9rD,GAC7B8rD,EAAK0E,wBAYf3tD,EAAQuQ,UAAUmoC,wBAA0B,WAC1C,IAAK,GAAIkV,KAAStM,GACZA,EAAY3+C,eAAeirD,KAC7B5tD,EAAQuQ,UAAUq9C,GAAStM,EAAYsM,KAQ7C5tD,EAAQuQ,UAAUs9C,cAAgB,WAChC93B,QAAQ/E,IAAI,mEACZl0B,KAAKgxD,kBAMP9tD,EAAQuQ,UAAUu9C,eAAiB,WACjC,GAAIC,KACJ,KAAK,GAAI7L,KAAUplD,MAAKw8C,MACtB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrC,GAAIL,GAAO/kD,KAAKw8C,MAAM4I,GAClB8L,GAAkBlxD,KAAKw8C,MAAMwN,OAC7BmH,GAAkBnxD,KAAKw8C,MAAMyN,QAC7BjqD,KAAKwjD,UAAUtwC,MAAMkyC,GAAQ/yC,GAAKpN,KAAK8oB,MAAMg3B,EAAK1yC,IAAMrS,KAAKwjD,UAAUtwC,MAAMkyC,GAAQ9yC,GAAKrN,KAAK8oB,MAAMg3B,EAAKzyC,KAC5G2+C,EAAU/oD,MAAM7H,GAAG+kD,EAAO/yC,EAAEpN,KAAK8oB,MAAMg3B,EAAK1yC,GAAGC,EAAErN,KAAK8oB,MAAMg3B,EAAKzyC,GAAG4+C,eAAeA,EAAeC,eAAeA,IAIvHnxD,KAAKwjD,UAAUruC,OAAO87C,IAMxB/tD,EAAQuQ,UAAU29C,aAAe,SAAS37C,GACxC,GAAIw7C,KACJ,IAAY1qD,SAARkP,GACF,GAA0B,GAAtBzP,MAAMC,QAAQwP,IAChB,IAAK,GAAIlQ,GAAI,EAAGA,EAAIkQ,EAAI/P,OAAQH,IAC9B,GAA2BgB,SAAvBvG,KAAKw8C,MAAM/mC,EAAIlQ,IAAmB,CACpC,GAAIw/C,GAAO/kD,KAAKw8C,MAAM/mC,EAAIlQ,GAC1B0rD,GAAUx7C,EAAIlQ,KAAO8M,EAAGpN,KAAK8oB,MAAMg3B,EAAK1yC,GAAIC,EAAGrN,KAAK8oB,MAAMg3B,EAAKzyC,SAKnE,IAAwB/L,SAApBvG,KAAKw8C,MAAM/mC,GAAoB,CACjC,GAAIsvC,GAAO/kD,KAAKw8C,MAAM/mC,EACtBw7C,GAAUx7C,IAAQpD,EAAGpN,KAAK8oB,MAAMg3B,EAAK1yC,GAAIC,EAAGrN,KAAK8oB,MAAMg3B,EAAKzyC,SAKhE,KAAK,GAAI8yC,KAAUplD,MAAKw8C,MACtB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrC,GAAIL,GAAO/kD,KAAKw8C,MAAM4I,EACtB6L,GAAU7L,IAAW/yC,EAAGpN,KAAK8oB,MAAMg3B,EAAK1yC,GAAIC,EAAGrN,KAAK8oB,MAAMg3B,EAAKzyC,IAIrE,MAAO2+C,IAWT/tD,EAAQuQ,UAAU49C,YAAc,SAAUjM,EAAQr2C,GAChD,GAAI/O,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrB7+C,SAAZwI,IACFA,KAEF,IAAIuiD,IAAgBj/C,EAAGrS,KAAKw8C,MAAM4I,GAAQ/yC,EAAGC,EAAGtS,KAAKw8C,MAAM4I,GAAQ9yC,EACnEvD,GAAQ+U,SAAWwtC,EACnBviD,EAAQwiD,aAAenM,EAEvBplD,KAAK+nB,OAAOhZ,OAGZkqB,SAAQ/E,IAAI,iCAWhBhxB,EAAQuQ,UAAUsU,OAAS,SAAUhZ,GACnC,MAAgBxI,UAAZwI,OACFA,OAGwBxI,SAAtBwI,EAAQ8a,SAAoC9a,EAAQ8a,QAAaxX,EAAG,EAAGC,EAAG,IACpD/L,SAAtBwI,EAAQ8a,OAAOxX,IAA6BtD,EAAQ8a,OAAOxX,EAAK,GAC1C9L,SAAtBwI,EAAQ8a,OAAOvX,IAA6BvD,EAAQ8a,OAAOvX,EAAK,GAC1C/L,SAAtBwI,EAAQoO,QAAoCpO,EAAQoO,MAAYnd,KAAKspD,aAC/C/iD,SAAtBwI,EAAQ+U,WAAoC/U,EAAQ+U,SAAY9jB,KAAK0pD,mBAC/CnjD,SAAtBwI,EAAQg3C,YAAoCh3C,EAAQg3C,WAAa31C,SAAS,IAC1ErB,EAAQg3C,aAAc,IAAsBh3C,EAAQg3C,WAAa31C,SAAS,IAC1ErB,EAAQg3C,aAAc,IAAsBh3C,EAAQg3C,cACrBx/C,SAA/BwI,EAAQg3C,UAAU31C,WAA0BrB,EAAQg3C,UAAU31C,SAAW,KACpC7J,SAArCwI,EAAQg3C,UAAUyL,iBAAgCziD,EAAQg3C,UAAUyL,eAAiB,qBAEzFxxD,MAAKyxD,YAAY1iD,KAcnB7L,EAAQuQ,UAAUg+C,YAAc,SAAU1iD,GACxC,GAAgBxI,SAAZwI,EAEF,YADAA,KAKF/O,MAAKmqD,cACiB,GAAlBp7C,EAAQ2iD,SACV1xD,KAAK6hD,eAAiB9yC,EAAQwiD,aAC9BvxD,KAAK8hD,mBAAqB/yC,EAAQ8a,QAIb,GAAnB7pB,KAAKwhD,YACPxhD,KAAK2xD,kBAAkB,GAGzB3xD,KAAKyhD,YAAczhD,KAAKspD,YACxBtpD,KAAK2hD,kBAAoB3hD,KAAK0pD,kBAC9B1pD,KAAK0hD,YAAc3yC,EAAQoO,MAI3Bnd,KAAKkd,UAAUld,KAAK0hD,YACpB,IAAIkQ,GAAa5xD,KAAKgrD,aAAa34C,EAAG,GAAMrS,KAAKwf,MAAMC,OAAOC,YAAapN,EAAG,GAAMtS,KAAKwf,MAAMC,OAAOsF,eAClG8sC,GACFx/C,EAAGu/C,EAAWv/C,EAAItD,EAAQ+U,SAASzR,EACnCC,EAAGs/C,EAAWt/C,EAAIvD,EAAQ+U,SAASxR,EAErCtS,MAAK4hD,mBACHvvC,EAAGrS,KAAK2hD,kBAAkBtvC,EAAIw/C,EAAmBx/C,EAAIrS,KAAK0hD,YAAc3yC,EAAQ8a,OAAOxX,EACvFC,EAAGtS,KAAK2hD,kBAAkBrvC,EAAIu/C,EAAmBv/C,EAAItS,KAAK0hD,YAAc3yC,EAAQ8a,OAAOvX,GAIvD,GAA9BvD,EAAQg3C,UAAU31C,SACO,MAAvBpQ,KAAK6hD,gBACP7hD,KAAK8xD,eAAiB9xD,KAAKiiD,QAC3BjiD,KAAKiiD,QAAUjiD,KAAK+xD,gBAGpB/xD,KAAKkd,UAAUld,KAAK0hD,aACpB1hD,KAAK0iD,gBAAgB1iD,KAAK4hD,kBAAkBvvC,EAAGrS,KAAK4hD,kBAAkBtvC,GACtEtS,KAAKiiD,YAIPjiD,KAAKshD,eAAiB,GAAKthD,KAAK67C,kBAAoB9sC,EAAQg3C,UAAU31C,SAAW,OAAU,EAAIpQ,KAAK67C,kBACpG77C,KAAKuhD,wBAA0BxyC,EAAQg3C,UAAUyL,eACjDxxD,KAAK8xD,eAAiB9xD,KAAKiiD,QAC3BjiD,KAAKiiD,QAAUjiD,KAAK2xD,kBACpB3xD,KAAKiiD,UACLjiD,KAAKkkD,QAAS,EACdlkD,KAAKkQ,UAKThN,EAAQuQ,UAAUs+C,cAAgB,WAChC,GAAIT,IAAgBj/C,EAAGrS,KAAKw8C,MAAMx8C,KAAK6hD,gBAAgBxvC,EAAGC,EAAGtS,KAAKw8C,MAAMx8C,KAAK6hD,gBAAgBvvC,GACzFs/C,EAAa5xD,KAAKgrD,aAAa34C,EAAG,GAAMrS,KAAKwf,MAAMC,OAAOC,YAAapN,EAAG,GAAMtS,KAAKwf,MAAMC,OAAOsF,eAClG8sC,GACFx/C,EAAGu/C,EAAWv/C,EAAIi/C,EAAaj/C,EAC/BC,EAAGs/C,EAAWt/C,EAAIg/C,EAAah/C,GAE7BqvC,EAAoB3hD,KAAK0pD,kBACzB9H,GACFvvC,EAAGsvC,EAAkBtvC,EAAIw/C,EAAmBx/C,EAAIrS,KAAKmd,MAAQnd,KAAK8hD,mBAAmBzvC,EACrFC,EAAGqvC,EAAkBrvC,EAAIu/C,EAAmBv/C,EAAItS,KAAKmd,MAAQnd,KAAK8hD,mBAAmBxvC,EAGvFtS,MAAK0iD,gBAAgBd,EAAkBvvC,EAAEuvC,EAAkBtvC,GAC3DtS,KAAK8xD,kBAGP5uD,EAAQuQ,UAAU02C,YAAc,WACH,MAAvBnqD,KAAK6hD,iBACP7hD,KAAKiiD,QAAUjiD,KAAK8xD,eACpB9xD,KAAK6hD,eAAiB,KACtB7hD,KAAK8hD,mBAAqB,OAS9B5+C,EAAQuQ,UAAUk+C,kBAAoB,SAAUnQ,GAC9CxhD,KAAKwhD,WAAaA,GAAcxhD,KAAKwhD,WAAaxhD,KAAKshD,eACvDthD,KAAKwhD,YAAcxhD,KAAKshD,cAExB,IAAItvB,GAAWrxB,EAAK2P,gBAAgBtQ,KAAKuhD,yBAAyBvhD,KAAKwhD,WAEvExhD,MAAKkd,UAAUld,KAAKyhD,aAAezhD,KAAK0hD,YAAc1hD,KAAKyhD,aAAezvB,GAC1EhyB,KAAK0iD,gBACH1iD,KAAK2hD,kBAAkBtvC,GAAKrS,KAAK4hD,kBAAkBvvC,EAAIrS,KAAK2hD,kBAAkBtvC,GAAK2f,EACnFhyB,KAAK2hD,kBAAkBrvC,GAAKtS,KAAK4hD,kBAAkBtvC,EAAItS,KAAK2hD,kBAAkBrvC,GAAK0f,GAGrFhyB,KAAK8xD,iBACL9xD,KAAKkkD,QAAS,EAGVlkD,KAAKwhD,YAAc,IACrBxhD,KAAKwhD,WAAa,EAEhBxhD,KAAKiiD,QADoB,MAAvBjiD,KAAK6hD,eACQ7hD,KAAK+xD,cAGL/xD,KAAK8xD,eAEtB9xD,KAAKiuB,KAAK,uBAId/qB,EAAQuQ,UAAUq+C,eAAiB,aAQnC5uD,EAAQuQ,UAAU+0C,SAAW,WAC3B,OAAQxoD,KAAKqnD,WAAarnD,KAAKqnD,UAAU2K,QAQ3C9uD,EAAQuQ,UAAU8vB,SAAW,WAC3B,MAAOvjC,MAAKkd,aAQdha,EAAQuQ,UAAUw+C,SAAW,WAC3B,MAAOjyD,MAAKspD,aAQdpmD,EAAQuQ,UAAUy+C,qBAAuB,WACvC,MAAOlyD,MAAKgrD,aAAa34C,EAAG,GAAMrS,KAAKwf,MAAMC,OAAOC,YAAapN,EAAG,GAAMtS,KAAKwf,MAAMC,OAAOsF,gBAG9FllB,EAAOD,QAAUsD,GAKb,SAASrD,EAAQD,EAASM,GAoB9B,QAASkD,GAAMgqD,EAAYjqD,EAASgvD,GAClC,IAAKhvD,EACH,KAAM,qBAER,IAAIqL,IAAU,QAAQ,WAClBuyC,EAAYpgD,EAAK4N,sBAAsBC,EAAO2jD,EAClDnyD,MAAK+O,QAAUgyC,EAAU1D,MACzBr9C,KAAK89C,QAAUiD,EAAUjD,QACzB99C,KAAK+O,QAAsB,aAAIojD,EAA+B,aAG9DnyD,KAAKmD,QAAUA,EAGfnD,KAAKK,GAASkG,OACdvG,KAAKoyD,OAAS7rD,OACdvG,KAAKqyD,KAAS9rD,OACdvG,KAAK+kC,MAASx+B,OACdvG,KAAKsyD,cAAgBtyD,KAAK+O,QAAQ8D,MAAQ7S,KAAK+O,QAAQuuC,yBACvDt9C,KAAKoH,MAASb,OACdvG,KAAKizC,UAAW,EAChBjzC,KAAKiM,OAAQ,EACbjM,KAAKuyD,iBAAmB3qD,IAAI,EAAEJ,KAAK,EAAEqL,MAAM,EAAEC,OAAO,EAAE0/C,MAAM,GAC5DxyD,KAAKyyD,YAAa,EAElBzyD,KAAKspB,KAAO,KACZtpB,KAAKupB,GAAK,KACVvpB,KAAK0tD,IAAM,KAIX1tD,KAAK0yD,kBACL1yD,KAAK2yD,gBAEL3yD,KAAKosD,WAAY,EAEjBpsD,KAAK4yD,YAAc,EACnB5yD,KAAK6yD,aAAc,EAEnB7yD,KAAKmtD,cAAcC,GAEnBptD,KAAK8yD,qBAAsB,EAC3B9yD,KAAK+yD,cAAgBzpC,KAAK,KAAMC,GAAG,KAAMypC,cACzChzD,KAAKizD,cAAgB,KA7DvB,GAAItyD,GAAOT,EAAoB,GAC3BqD,EAAOrD,EAAoB,GAoE/BkD,GAAKqQ,UAAU05C,cAAgB,SAASC,GACtC,GAAKA,EAAL,CAIA,GAAI5+C,IAAU,QAAQ,WAAW,WAAW,YAAY,WAAW,QACjE,2BAA2B,aAAa,mBAAmB,OAAO,eAoCpE,QAlCA7N,EAAKuF,oBAAoBsI,EAAQxO,KAAK+O,QAASq+C,GAEvB7mD,SAApB6mD,EAAW9jC,OAA+BtpB,KAAKoyD,OAAShF,EAAW9jC,MACjD/iB,SAAlB6mD,EAAW7jC,KAA+BvpB,KAAKqyD,KAAOjF,EAAW7jC,IAE/ChjB,SAAlB6mD,EAAW/sD,KAA+BL,KAAKK,GAAK+sD,EAAW/sD,IAC1CkG,SAArB6mD,EAAWzkC,QAA+B3oB,KAAK2oB,MAAQykC,EAAWzkC,MAAO3oB,KAAKyyD,YAAa,GAEtElsD,SAArB6mD,EAAWroB,QAA6B/kC,KAAK+kC,MAAQqoB,EAAWroB,OAC3Cx+B,SAArB6mD,EAAWhmD,QAA6BpH,KAAKoH,MAAQgmD,EAAWhmD,OAC1Cb,SAAtB6mD,EAAW1nD,SAA6B1F,KAAK89C,QAAQK,aAAeiP,EAAW1nD,QAE1Da,SAArB6mD,EAAWviD,QACb7K,KAAK+O,QAAQ6uC,cAAe,EACxBj9C,EAAKuD,SAASkpD,EAAWviD,QAC3B7K,KAAK+O,QAAQlE,MAAMA,MAAQuiD,EAAWviD,MACtC7K,KAAK+O,QAAQlE,MAAMmB,UAAYohD,EAAWviD,QAGXtE,SAA3B6mD,EAAWviD,MAAMA,QAA0B7K,KAAK+O,QAAQlE,MAAMA,MAAQuiD,EAAWviD,MAAMA,OACxDtE,SAA/B6mD,EAAWviD,MAAMmB,YAA0BhM,KAAK+O,QAAQlE,MAAMmB,UAAYohD,EAAWviD,MAAMmB,WAChEzF,SAA3B6mD,EAAWviD,MAAMoB,QAA0BjM,KAAK+O,QAAQlE,MAAMoB,MAAQmhD,EAAWviD,MAAMoB,SAK/FjM,KAAKs8C,UAELt8C,KAAK4yD,WAAa5yD,KAAK4yD,YAAoCrsD,SAArB6mD,EAAWv6C,MACjD7S,KAAK6yD,YAAc7yD,KAAK6yD,aAAsCtsD,SAAtB6mD,EAAW1nD,OAEnD1F,KAAKsyD,cAAgBtyD,KAAK+O,QAAQ8D,MAAO7S,KAAK+O,QAAQuuC,yBAG9Ct9C,KAAK+O,QAAQvB,OACnB,IAAK,OAAiBxN,KAAK+rC,KAAO/rC,KAAKkzD,SAAW,MAClD,KAAK,QAAiBlzD,KAAK+rC,KAAO/rC,KAAKmzD,UAAY,MACnD,KAAK,eAAiBnzD,KAAK+rC,KAAO/rC,KAAKozD,gBAAkB,MACzD,KAAK,YAAiBpzD,KAAK+rC,KAAO/rC,KAAKqzD,aAAe,MACtD,SAAsBrzD,KAAK+rC,KAAO/rC,KAAKkzD,aAO3C9vD,EAAKqQ,UAAU6oC,QAAU,WACvBt8C,KAAKutD,aAELvtD,KAAKspB,KAAOtpB,KAAKmD,QAAQq5C,MAAMx8C,KAAKoyD,SAAW,KAC/CpyD,KAAKupB,GAAKvpB,KAAKmD,QAAQq5C,MAAMx8C,KAAKqyD,OAAS,KAC3CryD,KAAKosD,UAAapsD,KAAKspB,MAAQtpB,KAAKupB,GAEhCvpB,KAAKosD,WACPpsD,KAAKspB,KAAKgqC,WAAWtzD,MACrBA,KAAKupB,GAAG+pC,WAAWtzD,QAGfA,KAAKspB,MACPtpB,KAAKspB,KAAKiqC,WAAWvzD,MAEnBA,KAAKupB,IACPvpB,KAAKupB,GAAGgqC,WAAWvzD,QAQzBoD,EAAKqQ,UAAU85C,WAAa,WACtBvtD,KAAKspB,OACPtpB,KAAKspB,KAAKiqC,WAAWvzD,MACrBA,KAAKspB,KAAO,MAEVtpB,KAAKupB,KACPvpB,KAAKupB,GAAGgqC,WAAWvzD,MACnBA,KAAKupB,GAAK,MAGZvpB,KAAKosD,WAAY,GAQnBhpD,EAAKqQ,UAAUw4C,SAAW,WACxB,MAA6B,kBAAfjsD,MAAK+kC,MAAuB/kC,KAAK+kC,QAAU/kC,KAAK+kC,OAQhE3hC,EAAKqQ,UAAUyB,SAAW,WACxB,MAAOlV,MAAKoH,OASdhE,EAAKqQ,UAAUo6C,cAAgB,SAASpiD,EAAKyB,GAC3C,IAAKlN,KAAK4yD,YAA6BrsD,SAAfvG,KAAKoH,MAAqB,CAChD,GAAI+V,IAASnd,KAAK+O,QAAQsY,SAAWrnB,KAAK+O,QAAQqY,WAAala,EAAMzB,EACrEzL,MAAK+O,QAAQ8D,OAAQ7S,KAAKoH,MAAQqE,GAAO0R,EAAQnd,KAAK+O,QAAQqY,SAC9DpnB,KAAKsyD,cAAgBtyD,KAAK+O,QAAQ8D,MAAO7S,KAAK+O,QAAQuuC,2BAU1Dl6C,EAAKqQ,UAAUs4B,KAAO,WACpB,KAAM,uCAQR3oC,EAAKqQ,UAAUy4C,kBAAoB,SAAShpC,GAC1C,GAAIljB,KAAKosD,UAAW,CAClB,GAAI58B,GAAU,GACVgkC,EAAQxzD,KAAKspB,KAAKjX,EAClBohD,EAAQzzD,KAAKspB,KAAKhX,EAClBohD,EAAM1zD,KAAKupB,GAAGlX,EACdshD,EAAM3zD,KAAKupB,GAAGjX,EACdshD,EAAO1wC,EAAI1b,KACXqsD,EAAO3wC,EAAItb,IAEXyjB,EAAOrrB,KAAK8zD,mBAAmBN,EAAOC,EAAOC,EAAKC,EAAKC,EAAMC,EAEjE,OAAerkC,GAAPnE,EAGR,OAAO,GAIXjoB,EAAKqQ,UAAUsgD,UAAY,WACzB,GAAIC,GAAWh0D,KAAK+O,QAAQlE,KAgB5B,OAfiC,MAA7B7K,KAAK+O,QAAQ6uC,aACfoW,GACEhoD,UAAWhM,KAAKupB,GAAGxa,QAAQlE,MAAMmB,UAAUD,OAC3CE,MAAOjM,KAAKupB,GAAGxa,QAAQlE,MAAMoB,MAAMF,OACnClB,MAAO7K,KAAKupB,GAAGxa,QAAQlE,MAAMkB,SAGK,QAA7B/L,KAAK+O,QAAQ6uC,cAAuD,GAA7B59C,KAAK+O,QAAQ6uC,gBAC3DoW,GACEhoD,UAAWhM,KAAKspB,KAAKva,QAAQlE,MAAMmB,UAAUD,OAC7CE,MAAOjM,KAAKspB,KAAKva,QAAQlE,MAAMoB,MAAMF,OACrClB,MAAO7K,KAAKspB,KAAKva,QAAQlE,MAAMkB,SAId,GAAjB/L,KAAKizC,SAA4B+gB,EAAShoD,UACvB,GAAdhM,KAAKiM,MAAuB+nD,EAAS/nD,MACT+nD,EAASnpD,OAWhDzH,EAAKqQ,UAAUy/C,UAAY,SAASjsC,GAKlC,GAHAA,EAAIY,YAAc7nB,KAAK+zD,YACvB9sC,EAAIO,UAAcxnB,KAAKi0D,gBAEnBj0D,KAAKspB,MAAQtpB,KAAKupB,GAAI,CAExB,GAGI/W,GAHAk7C,EAAM1tD,KAAKk0D,MAAMjtC,EAIrB,IAAIjnB,KAAK2oB,MAAO,CACd,GAAyC,GAArC3oB,KAAK+O,QAAQqxC,aAAapxC,SAA0B,MAAP0+C,EAAa,CAC5D,GAAIyG,GAAY,IAAK,IAAKn0D,KAAKspB,KAAKjX,EAAIq7C,EAAIr7C,GAAK,IAAKrS,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,IAClE+hD,EAAY,IAAK,IAAKp0D,KAAKspB,KAAKhX,EAAIo7C,EAAIp7C,GAAK,IAAKtS,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,GACtEE;GAASH,EAAE8hD,EAAW7hD,EAAE8hD,OAGxB5hD,GAAQxS,KAAKq0D,aAAa,GAE5Br0D,MAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,QAG3C,CACH,GAAID,GAAGC,EACHsZ,EAAS5rB,KAAK89C,QAAQK,aAAe,EACrC4G,EAAO/kD,KAAKspB,IACXy7B,GAAKlyC,OACRkyC,EAAKwP,OAAOttC,GAEV89B,EAAKlyC,MAAQkyC,EAAKjyC,QACpBT,EAAI0yC,EAAK1yC,EAAI0yC,EAAKlyC,MAAQ,EAC1BP,EAAIyyC,EAAKzyC,EAAIsZ,IAGbvZ,EAAI0yC,EAAK1yC,EAAIuZ,EACbtZ,EAAIyyC,EAAKzyC,EAAIyyC,EAAKjyC,OAAS,GAE7B9S,KAAKw0D,QAAQvtC,EAAK5U,EAAGC,EAAGsZ,GACxBpZ,EAAQxS,KAAKy0D,eAAepiD,EAAGC,EAAGsZ,EAAQ,IAC1C5rB,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,KAUhDlP,EAAKqQ,UAAUwgD,cAAgB,WAC7B,MAAqB,IAAjBj0D,KAAKizC,SACChuC,KAAKiI,IAAIjI,KAAKwG,IAAIzL,KAAKsyD,cAAetyD,KAAK+O,QAAQsY,UAAW,GAAIrnB,KAAK00D,iBAG7D,GAAd10D,KAAKiM,MACAhH,KAAKiI,IAAIjI,KAAKwG,IAAIzL,KAAK+O,QAAQwuC,WAAYv9C,KAAK+O,QAAQsY,UAAW,GAAIrnB,KAAK00D,iBAG5EzvD,KAAKiI,IAAIlN,KAAK+O,QAAQ8D,MAAO,GAAI7S,KAAK00D,kBAKnDtxD,EAAKqQ,UAAUkhD,mBAAqB,WAClC,GAAIC,GAAO,KACPC,EAAO,KACPlP,EAAS3lD,KAAK+O,QAAQqxC,aAAaE,UACnCz5C,EAAO7G,KAAK+O,QAAQqxC,aAAav5C,KAEjCiY,EAAK7Z,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GACpC0M,EAAK9Z,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EA2JxC,OA1JY,YAARzL,GAA8B,iBAARA,EACpB5B,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAAKpN,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,IACjEtS,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EACpBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GACxBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,GAEvB/e,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAC7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,GAGzB/e,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,IACzBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GACxBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,GAEvB/e,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAC7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,IAGtB,YAARlY,IACF+tD,EAAYjP,EAAS5mC,EAAdD,EAAmB9e,KAAKspB,KAAKjX,EAAIuiD,IAGnC3vD,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAAKpN,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,KACtEtS,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EACpBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GACxBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,GAEvB9e,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAC7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,GAGzB9e,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,IACzBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GACxBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,GAEvB9e,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAC7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,IAGtB,YAARjY,IACFguD,EAAYlP,EAAS7mC,EAAdC,EAAmB/e,KAAKspB,KAAKhX,EAAIuiD,IAI7B,iBAARhuD,EACH5B,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAAKpN,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,IACrEsiD,EAAO50D,KAAKspB,KAAKjX,EAEfwiD,EADE70D,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EACjBtS,KAAKupB,GAAGjX,GAAK,EAAEqzC,GAAU5mC,EAGzB/e,KAAKupB,GAAGjX,GAAK,EAAEqzC,GAAU5mC,GAG3B9Z,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAAKpN,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,KAExEsiD,EADE50D,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,EACjBrS,KAAKupB,GAAGlX,GAAK,EAAEszC,GAAU7mC,EAGzB9e,KAAKupB,GAAGlX,GAAK,EAAEszC,GAAU7mC,EAElC+1C,EAAO70D,KAAKspB,KAAKhX,GAGJ,cAARzL,GAEL+tD,EADE50D,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,EACjBrS,KAAKupB,GAAGlX,GAAK,EAAEszC,GAAU7mC,EAGzB9e,KAAKupB,GAAGlX,GAAK,EAAEszC,GAAU7mC,EAElC+1C,EAAO70D,KAAKspB,KAAKhX,GAEF,YAARzL,GACP+tD,EAAO50D,KAAKspB,KAAKjX,EAEfwiD,EADE70D,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EACjBtS,KAAKupB,GAAGjX,GAAK,EAAEqzC,GAAU5mC,EAGzB/e,KAAKupB,GAAGjX,GAAK,EAAEqzC,GAAU5mC,GAI9B9Z,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAAKpN,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,GACjEtS,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EACpBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAExBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,EAC9B61C,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,GAE/B50D,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAE7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,EAC9B61C,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,EAAO50D,KAAKupB,GAAGlX,EAAGuiD,GAGhC50D,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,IACzBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAExBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,EAC9B61C,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,GAE/B50D,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAE7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS5mC,EAC9B81C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS5mC,EAC9B61C,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,EAAO50D,KAAKupB,GAAGlX,EAAIuiD,IAInC3vD,KAAK8lB,IAAI/qB,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAAKpN,KAAK8lB,IAAI/qB,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,KACtEtS,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,EACpBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAExBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,GAE/B70D,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAE7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,GAGjC70D,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,IACzBtS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAExBuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,GAE/B70D,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,IAE7BuiD,EAAO50D,KAAKspB,KAAKjX,EAAIszC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKspB,KAAKhX,EAAIqzC,EAAS7mC,EAC9B+1C,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,EAAO70D,KAAKupB,GAAGjX,EAAIuiD,MAOtCxiD,EAAEuiD,EAAMtiD,EAAEuiD,IAQpBzxD,EAAKqQ,UAAUygD,MAAQ,SAAUjtC,GAI/B,GAFAA,EAAIa,YACJb,EAAIc,OAAO/nB,KAAKspB,KAAKjX,EAAGrS,KAAKspB,KAAKhX,GACO,GAArCtS,KAAK+O,QAAQqxC,aAAapxC,QAAiB,CAC7C,GAAyC,GAArChP,KAAK+O,QAAQqxC,aAAaC,QAAkB,CAC9C,GAAIqN,GAAM1tD,KAAK20D,oBACf,OAAa,OAATjH,EAAIr7C,GACN4U,EAAIe,OAAOhoB,KAAKupB,GAAGlX,EAAGrS,KAAKupB,GAAGjX,GAC9B2U,EAAIlH,SACG,OAKPkH,EAAI6tC,iBAAiBpH,EAAIr7C,EAAEq7C,EAAIp7C,EAAEtS,KAAKupB,GAAGlX,EAAGrS,KAAKupB,GAAGjX,GACpD2U,EAAIlH,SACG2tC,GAMT,MAFAzmC,GAAI6tC,iBAAiB90D,KAAK0tD,IAAIr7C,EAAErS,KAAK0tD,IAAIp7C,EAAEtS,KAAKupB,GAAGlX,EAAGrS,KAAKupB,GAAGjX,GAC9D2U,EAAIlH,SACG/f,KAAK0tD,IAMd,MAFAzmC,GAAIe,OAAOhoB,KAAKupB,GAAGlX,EAAGrS,KAAKupB,GAAGjX,GAC9B2U,EAAIlH,SACG,MAYX3c,EAAKqQ,UAAU+gD,QAAU,SAAUvtC,EAAK5U,EAAGC,EAAGsZ,GAE5C3E,EAAIa,YACJb,EAAI4E,IAAIxZ,EAAGC,EAAGsZ,EAAQ,EAAG,EAAI3mB,KAAK6mB,IAAI,GACtC7E,EAAIlH,UAWN3c,EAAKqQ,UAAU6gD,OAAS,SAAUrtC,EAAKwC,EAAMpX,EAAGC,GAC9C,GAAImX,EAAM,CACRxC,EAAIQ,MAASznB,KAAKspB,KAAK2pB,UAAYjzC,KAAKupB,GAAG0pB,SAAY,QAAU,IACjEjzC,KAAK+O,QAAQguC,SAAW,MAAQ/8C,KAAK+O,QAAQiuC,QAC7C,IAAIwV,EAEJ,IAAuB,GAAnBxyD,KAAKyyD,WAAoB,CAC3B,GAAIlsB,GAAQpiC,OAAOslB,GAAMxhB,MAAM,MAC3B8sD,EAAYxuB,EAAM7gC,OAClBq3C,EAAY94C,OAAOjE,KAAK+O,QAAQguC,UAAY,CAChDyV,GAAQlgD,GAAK,EAAIyiD,GAAa,EAAIhY,CAGlC,KAAK,GADDlqC,GAAQoU,EAAI+tC,YAAYzuB,EAAM,IAAI1zB,MAC7BtN,EAAI,EAAOwvD,EAAJxvD,EAAeA,IAAK,CAClC,GAAIiiB,GAAYP,EAAI+tC,YAAYzuB,EAAMhhC,IAAIsN,KAC1CA,GAAQ2U,EAAY3U,EAAQ2U,EAAY3U,EAE1C,GAAIC,GAAS9S,KAAK+O,QAAQguC,SAAWgY,EACjCvtD,EAAO6K,EAAIQ,EAAQ,EACnBjL,EAAM0K,EAAIQ,EAAS,CAGvB9S,MAAKuyD,iBAAmB3qD,IAAIA,EAAIJ,KAAKA,EAAKqL,MAAMA,EAAMC,OAAOA,EAAO0/C,MAAMA,GAI9CjsD,SAA1BvG,KAAK+O,QAAQkuC,UAAoD,OAA1Bj9C,KAAK+O,QAAQkuC,UAA+C,SAA1Bj9C,KAAK+O,QAAQkuC,WACxFh2B,EAAIiB,UAAYloB,KAAK+O,QAAQkuC,SAC7Bh2B,EAAIguC,SAASj1D,KAAKuyD,gBAAgB/qD,KAChCxH,KAAKuyD,gBAAgB3qD,IACrB5H,KAAKuyD,gBAAgB1/C,MACrB7S,KAAKuyD,gBAAgBz/C,SAIzBmU,EAAIiB,UAAYloB,KAAK+O,QAAQ+tC,WAAa,QAC1C71B,EAAIuB,UAAY,SAChBvB,EAAIwB,aAAgB,SACpB+pC,EAAQxyD,KAAKuyD,gBAAgBC,KAC7B,KAAK,GAAIjtD,GAAI,EAAOwvD,EAAJxvD,EAAeA,IAC7B0hB,EAAIyB,SAAS6d,EAAMhhC,GAAI8M,EAAGmgD,GAC1BA,GAASzV,IAcf35C,EAAKqQ,UAAU4/C,cAAgB,SAASpsC,GAEtCA,EAAIY,YAAc7nB,KAAK+zD,YACvB9sC,EAAIO,UAAYxnB,KAAKi0D,eAErB,IAAIvG,GAAM,IAEV,IAAoBnnD,SAAhB0gB,EAAIiuC,SAA6C3uD,SAApB0gB,EAAIkuC,YAA2B,CAE9D,GAAIC,IAAW,EAEbA,GAD+B7uD,SAA7BvG,KAAK+O,QAAQ0uC,KAAK/3C,QAAkDa,SAA1BvG,KAAK+O,QAAQ0uC,KAAKC,KACnD19C,KAAK+O,QAAQ0uC,KAAK/3C,OAAO1F,KAAK+O,QAAQ0uC,KAAKC,MAG3C,EAAE,GAIgB,mBAApBz2B,GAAIkuC,aACbluC,EAAIkuC,YAAYC,GAChBnuC,EAAIouC,eAAiB,IAGrBpuC,EAAIiuC,QAAUE,EACdnuC,EAAIquC,cAAgB,GAItB5H,EAAM1tD,KAAKk0D,MAAMjtC,GAGc,mBAApBA,GAAIkuC,aACbluC,EAAIkuC,aAAa,IACjBluC,EAAIouC,eAAiB,IAGrBpuC,EAAIiuC,SAAW,GACfjuC,EAAIquC,cAAgB,OAKtBruC,GAAIa,YACJb,EAAIsuC,QAAU,QACsBhvD,SAAhCvG,KAAK+O,QAAQ0uC,KAAKE,UAEpB12B,EAAIuuC,WAAWx1D,KAAKspB,KAAKjX,EAAErS,KAAKspB,KAAKhX,EAAEtS,KAAKupB,GAAGlX,EAAErS,KAAKupB,GAAGjX,GACpDtS,KAAK+O,QAAQ0uC,KAAK/3C,OAAO1F,KAAK+O,QAAQ0uC,KAAKC,IAAI19C,KAAK+O,QAAQ0uC,KAAKE,UAAU39C,KAAK+O,QAAQ0uC,KAAKC,MAE9Dn3C,SAA7BvG,KAAK+O,QAAQ0uC,KAAK/3C,QAAkDa,SAA1BvG,KAAK+O,QAAQ0uC,KAAKC,IAEnEz2B,EAAIuuC,WAAWx1D,KAAKspB,KAAKjX,EAAErS,KAAKspB,KAAKhX,EAAEtS,KAAKupB,GAAGlX,EAAErS,KAAKupB,GAAGjX,GACpDtS,KAAK+O,QAAQ0uC,KAAK/3C,OAAO1F,KAAK+O,QAAQ0uC,KAAKC,OAIhDz2B,EAAIc,OAAO/nB,KAAKspB,KAAKjX,EAAGrS,KAAKspB,KAAKhX,GAClC2U,EAAIe,OAAOhoB,KAAKupB,GAAGlX,EAAGrS,KAAKupB,GAAGjX,IAEhC2U,EAAIlH,QAIN,IAAI/f,KAAK2oB,MAAO,CACd,GAAInW,EACJ,IAAyC,GAArCxS,KAAK+O,QAAQqxC,aAAapxC,SAA0B,MAAP0+C,EAAa,CAC5D,GAAIyG,GAAY,IAAK,IAAKn0D,KAAKspB,KAAKjX,EAAIq7C,EAAIr7C,GAAK,IAAKrS,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,IAClE+hD,EAAY,IAAK,IAAKp0D,KAAKspB,KAAKhX,EAAIo7C,EAAIp7C,GAAK,IAAKtS,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,GACtEE,IAASH,EAAE8hD,EAAW7hD,EAAE8hD,OAGxB5hD,GAAQxS,KAAKq0D,aAAa,GAE5Br0D,MAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,KAUhDlP,EAAKqQ,UAAU4gD,aAAe,SAAUoB,GACtC,OACEpjD,GAAI,EAAIojD,GAAcz1D,KAAKspB,KAAKjX,EAAIojD,EAAaz1D,KAAKupB,GAAGlX,EACzDC,GAAI,EAAImjD,GAAcz1D,KAAKspB,KAAKhX,EAAImjD,EAAaz1D,KAAKupB,GAAGjX,IAa7DlP,EAAKqQ,UAAUghD,eAAiB,SAAUpiD,EAAGC,EAAGsZ,EAAQ6pC,GACtD,GAAI5I,GAA6B,GAApB4I,EAAa,EAAE,GAASxwD,KAAK6mB,EAC1C,QACEzZ,EAAGA,EAAIuZ,EAAS3mB,KAAKwZ,IAAIouC,GACzBv6C,EAAGA,EAAIsZ,EAAS3mB,KAAKqZ,IAAIuuC,KAW7BzpD,EAAKqQ,UAAU2/C,iBAAmB,SAASnsC,GACzC,GAAIzU,EAMJ,IAJAyU,EAAIY,YAAc7nB,KAAK+zD,YACvB9sC,EAAIiB,UAAYjB,EAAIY,YACpBZ,EAAIO,UAAYxnB,KAAKi0D,gBAEjBj0D,KAAKspB,MAAQtpB,KAAKupB,GAAI,CAExB,GAAImkC,GAAM1tD,KAAKk0D,MAAMjtC,GAEjB4lC,EAAQ5nD,KAAKywD,MAAO11D,KAAKupB,GAAGjX,EAAItS,KAAKspB,KAAKhX,EAAKtS,KAAKupB,GAAGlX,EAAIrS,KAAKspB,KAAKjX,GACrE3M,GAAU,GAAK,EAAI1F,KAAK+O,QAAQ8D,OAAS7S,KAAK+O,QAAQyuC,gBAE1D,IAAyC,GAArCx9C,KAAK+O,QAAQqxC,aAAapxC,SAA0B,MAAP0+C,EAAa,CAC5D,GAAIyG,GAAY,IAAK,IAAKn0D,KAAKspB,KAAKjX,EAAIq7C,EAAIr7C,GAAK,IAAKrS,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,IAClE+hD,EAAY,IAAK,IAAKp0D,KAAKspB,KAAKhX,EAAIo7C,EAAIp7C,GAAK,IAAKtS,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,GACtEE,IAASH,EAAE8hD,EAAW7hD,EAAE8hD,OAGxB5hD,GAAQxS,KAAKq0D,aAAa,GAG5BptC,GAAI0uC,MAAMnjD,EAAMH,EAAGG,EAAMF,EAAGu6C,EAAOnnD,GACnCuhB,EAAInH,OACJmH,EAAIlH,SAGA/f,KAAK2oB,OACP3oB,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,OAG3C,CAEH,GAAID,GAAGC,EACHsZ,EAAS,IAAO3mB,KAAKiI,IAAI,IAAIlN,KAAK89C,QAAQK,cAC1C4G,EAAO/kD,KAAKspB,IACXy7B,GAAKlyC,OACRkyC,EAAKwP,OAAOttC,GAEV89B,EAAKlyC,MAAQkyC,EAAKjyC,QACpBT,EAAI0yC,EAAK1yC,EAAiB,GAAb0yC,EAAKlyC,MAClBP,EAAIyyC,EAAKzyC,EAAIsZ,IAGbvZ,EAAI0yC,EAAK1yC,EAAIuZ,EACbtZ,EAAIyyC,EAAKzyC,EAAkB,GAAdyyC,EAAKjyC,QAEpB9S,KAAKw0D,QAAQvtC,EAAK5U,EAAGC,EAAGsZ,EAGxB,IAAIihC,GAAQ,GAAM5nD,KAAK6mB,GACnBpmB,GAAU,GAAK,EAAI1F,KAAK+O,QAAQ8D,OAAS7S,KAAK+O,QAAQyuC,gBAC1DhrC,GAAQxS,KAAKy0D,eAAepiD,EAAGC,EAAGsZ,EAAQ,IAC1C3E,EAAI0uC,MAAMnjD,EAAMH,EAAGG,EAAMF,EAAGu6C,EAAOnnD,GACnCuhB,EAAInH,OACJmH,EAAIlH,SAGA/f,KAAK2oB,QACPnW,EAAQxS,KAAKy0D,eAAepiD,EAAGC,EAAGsZ,EAAQ,IAC1C5rB,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,MAclDlP,EAAKqQ,UAAU0/C,WAAa,SAASlsC,GAEnCA,EAAIY,YAAc7nB,KAAK+zD,YACvB9sC,EAAIiB,UAAYjB,EAAIY,YACpBZ,EAAIO,UAAYxnB,KAAKi0D,eAErB,IAAIpH,GAAOnnD,CAEX,IAAI1F,KAAKspB,MAAQtpB,KAAKupB,GAAI,CACxBsjC,EAAQ5nD,KAAKywD,MAAO11D,KAAKupB,GAAGjX,EAAItS,KAAKspB,KAAKhX,EAAKtS,KAAKupB,GAAGlX,EAAIrS,KAAKspB,KAAKjX,EACrE,IASIq7C,GATA5uC,EAAM9e,KAAKupB,GAAGlX,EAAIrS,KAAKspB,KAAKjX,EAC5B0M,EAAM/e,KAAKupB,GAAGjX,EAAItS,KAAKspB,KAAKhX,EAC5BsjD,EAAoB3wD,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAE7C82C,EAAiB71D,KAAKspB,KAAKwsC,iBAAiB7uC,EAAK4lC,EAAQ5nD,KAAK6mB,IAC9DiqC,GAAmBH,EAAoBC,GAAkBD,EACzDpC,EAAQ,EAAoBxzD,KAAKspB,KAAKjX,GAAK,EAAI0jD,GAAmB/1D,KAAKupB,GAAGlX,EAC1EohD,EAAQ,EAAoBzzD,KAAKspB,KAAKhX,GAAK,EAAIyjD,GAAmB/1D,KAAKupB,GAAGjX,CAGrC,IAArCtS,KAAK+O,QAAQqxC,aAAaC,SAAwD,GAArCrgD,KAAK+O,QAAQqxC,aAAapxC,QACzE0+C,EAAM1tD,KAAK0tD,IAEiC,GAArC1tD,KAAK+O,QAAQqxC,aAAapxC,UACjC0+C,EAAM1tD,KAAK20D,sBAG4B,GAArC30D,KAAK+O,QAAQqxC,aAAapxC,SAA4B,MAAT0+C,EAAIr7C,IACnDw6C,EAAQ5nD,KAAKywD,MAAO11D,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,EAAKtS,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,GACzDyM,EAAM9e,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,EACtB0M,EAAM/e,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,EACtBsjD,EAAoB3wD,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAE/C,IAGI20C,GAAIC,EAHJqC,EAAeh2D,KAAKupB,GAAGusC,iBAAiB7uC,EAAK4lC,GAC7CoJ,GAAiBL,EAAoBI,GAAgBJ,CA6BzD,IA1ByC,GAArC51D,KAAK+O,QAAQqxC,aAAapxC,SAA4B,MAAT0+C,EAAIr7C,GACpDqhD,GAAO,EAAIuC,GAAiBvI,EAAIr7C,EAAI4jD,EAAgBj2D,KAAKupB,GAAGlX,EAC5DshD,GAAO,EAAIsC,GAAiBvI,EAAIp7C,EAAI2jD,EAAgBj2D,KAAKupB,GAAGjX,IAG3DohD,GAAO,EAAIuC,GAAiBj2D,KAAKspB,KAAKjX,EAAI4jD,EAAgBj2D,KAAKupB,GAAGlX,EAClEshD,GAAO,EAAIsC,GAAiBj2D,KAAKspB,KAAKhX,EAAI2jD,EAAgBj2D,KAAKupB,GAAGjX,GAGpE2U,EAAIa,YACJb,EAAIc,OAAOyrC,EAAMC,GACwB,GAArCzzD,KAAK+O,QAAQqxC,aAAapxC,SAA4B,MAAT0+C,EAAIr7C,EACnD4U,EAAI6tC,iBAAiBpH,EAAIr7C,EAAEq7C,EAAIp7C,EAAEohD,EAAKC,GAGtC1sC,EAAIe,OAAO0rC,EAAKC,GAElB1sC,EAAIlH,SAGJra,GAAU,GAAK,EAAI1F,KAAK+O,QAAQ8D,OAAS7S,KAAK+O,QAAQyuC,iBACtDv2B,EAAI0uC,MAAMjC,EAAKC,EAAK9G,EAAOnnD,GAC3BuhB,EAAInH,OACJmH,EAAIlH,SAGA/f,KAAK2oB,MAAO,CACd,GAAInW,EACJ,IAAyC,GAArCxS,KAAK+O,QAAQqxC,aAAapxC,SAA0B,MAAP0+C,EAAa,CAC5D,GAAIyG,GAAY,IAAK,IAAKn0D,KAAKspB,KAAKjX,EAAIq7C,EAAIr7C,GAAK,IAAKrS,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,IAClE+hD,EAAY,IAAK,IAAKp0D,KAAKspB,KAAKhX,EAAIo7C,EAAIp7C,GAAK,IAAKtS,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,GACtEE,IAASH,EAAE8hD,EAAW7hD,EAAE8hD,OAGxB5hD,GAAQxS,KAAKq0D,aAAa,GAE5Br0D,MAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,QAG3C,CAEH,GACID,GAAGC,EAAGqjD,EADN5Q,EAAO/kD,KAAKspB,KAEZsC,EAAS,IAAO3mB,KAAKiI,IAAI,IAAIlN,KAAK89C,QAAQK,aACzC4G,GAAKlyC,OACRkyC,EAAKwP,OAAOttC,GAEV89B,EAAKlyC,MAAQkyC,EAAKjyC,QACpBT,EAAI0yC,EAAK1yC,EAAiB,GAAb0yC,EAAKlyC,MAClBP,EAAIyyC,EAAKzyC,EAAIsZ,EACb+pC,GACEtjD,EAAGA,EACHC,EAAGyyC,EAAKzyC,EACRu6C,MAAO,GAAM5nD,KAAK6mB,MAIpBzZ,EAAI0yC,EAAK1yC,EAAIuZ,EACbtZ,EAAIyyC,EAAKzyC,EAAkB,GAAdyyC,EAAKjyC,OAClB6iD,GACEtjD,EAAG0yC,EAAK1yC,EACRC,EAAGA,EACHu6C,MAAO,GAAM5nD,KAAK6mB,KAGtB7E,EAAIa,YAEJb,EAAI4E,IAAIxZ,EAAGC,EAAGsZ,EAAQ,EAAG,EAAI3mB,KAAK6mB,IAAI,GACtC7E,EAAIlH,QAGJ,IAAIra,IAAU,GAAK,EAAI1F,KAAK+O,QAAQ8D,OAAS7S,KAAK+O,QAAQyuC,gBAC1Dv2B,GAAI0uC,MAAMA,EAAMtjD,EAAGsjD,EAAMrjD,EAAGqjD,EAAM9I,MAAOnnD,GACzCuhB,EAAInH,OACJmH,EAAIlH,SAGA/f,KAAK2oB,QACPnW,EAAQxS,KAAKy0D,eAAepiD,EAAGC,EAAGsZ,EAAQ,IAC1C5rB,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAOnW,EAAMH,EAAGG,EAAMF,MAmBlDlP,EAAKqQ,UAAUqgD,mBAAqB,SAAUoC,EAAGC,EAAIC,EAAGC,EAAIC,EAAGC,GAC7D,GAAI9sD,GAAc,CAClB,IAAIzJ,KAAKspB,MAAQtpB,KAAKupB,GACpB,GAAyC,GAArCvpB,KAAK+O,QAAQqxC,aAAapxC,QAAiB,CAC7C,GAAI4lD,GAAMC,CACV,IAAyC,GAArC70D,KAAK+O,QAAQqxC,aAAapxC,SAAwD,GAArChP,KAAK+O,QAAQqxC,aAAaC,QACzEuU,EAAO50D,KAAK0tD,IAAIr7C,EAChBwiD,EAAO70D,KAAK0tD,IAAIp7C,MAEb,CACH,GAAIo7C,GAAM1tD,KAAK20D,oBACfC,GAAOlH,EAAIr7C,EACXwiD,EAAOnH,EAAIp7C,EAEb,GACIuT,GACAtgB,EAAE6I,EAAEiE,EAAEC,EAAGkkD,EAAOC,EAFhBC,EAAc,GAGlB,KAAKnxD,EAAI,EAAO,GAAJA,EAAQA,IAClB6I,EAAI,GAAI7I,EACR8M,EAAIpN,KAAKovB,IAAI,EAAEjmB,EAAE,GAAG8nD,EAAM,EAAE9nD,GAAG,EAAIA,GAAIwmD,EAAO3vD,KAAKovB,IAAIjmB,EAAE,GAAGgoD,EAC5D9jD,EAAIrN,KAAKovB,IAAI,EAAEjmB,EAAE,GAAG+nD,EAAM,EAAE/nD,GAAG,EAAIA,GAAIymD,EAAO5vD,KAAKovB,IAAIjmB,EAAE,GAAGioD,EACxD9wD,EAAI,IACNsgB,EAAW7lB,KAAK22D,mBAAmBH,EAAMC,EAAMpkD,EAAEC,EAAGgkD,EAAGC,GACvDG,EAAyBA,EAAX7wC,EAAyBA,EAAW6wC,GAEpDF,EAAQnkD,EAAGokD,EAAQnkD,CAErB7I,GAAcitD,MAGdjtD,GAAczJ,KAAK22D,mBAAmBT,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,OAGpD,CACH,GAAIlkD,GAAGC,EAAGwM,EAAIC,EACV6M,EAAS,IAAO5rB,KAAK89C,QAAQK,aAC7B4G,EAAO/kD,KAAKspB,IACZy7B,GAAKlyC,MAAQkyC,EAAKjyC,QACpBT,EAAI0yC,EAAK1yC,EAAI,GAAM0yC,EAAKlyC,MACxBP,EAAIyyC,EAAKzyC,EAAIsZ,IAGbvZ,EAAI0yC,EAAK1yC,EAAIuZ,EACbtZ,EAAIyyC,EAAKzyC,EAAI,GAAMyyC,EAAKjyC,QAE1BgM,EAAKzM,EAAIikD,EACTv3C,EAAKzM,EAAIikD,EACT9sD,EAAcxE,KAAK8lB,IAAI9lB,KAAK8qB,KAAKjR,EAAGA,EAAKC,EAAGA,GAAM6M,GAGpD,MAAI5rB,MAAKuyD,gBAAgB/qD,KAAO8uD,GAC9Bt2D,KAAKuyD,gBAAgB/qD,KAAOxH,KAAKuyD,gBAAgB1/C,MAAQyjD,GACzDt2D,KAAKuyD,gBAAgB3qD,IAAM2uD,GAC3Bv2D,KAAKuyD,gBAAgB3qD,IAAM5H,KAAKuyD,gBAAgBz/C,OAASyjD,EAClD,EAGA9sD,GAIXrG,EAAKqQ,UAAUkjD,mBAAqB,SAAST,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,GAC1D,GAAIK,GAAKR,EAAGF,EACVW,EAAKR,EAAGF,EACRW,EAAYF,EAAGA,EAAKC,EAAGA,EACvBE,IAAOT,EAAKJ,GAAMU,GAAML,EAAKJ,GAAMU,GAAMC,CAEvCC,GAAI,EACNA,EAAI,EAEO,EAAJA,IACPA,EAAI,EAGN,IAAI1kD,GAAI6jD,EAAKa,EAAIH,EACftkD,EAAI6jD,EAAKY,EAAIF,EACb/3C,EAAKzM,EAAIikD,EACTv3C,EAAKzM,EAAIikD,CAQX,OAAOtxD,MAAK8qB,KAAKjR,EAAGA,EAAKC,EAAGA,IAQ9B3b,EAAKqQ,UAAU8vB,SAAW,SAASpmB,GACjCnd,KAAK00D,gBAAkB,EAAIv3C,GAI7B/Z,EAAKqQ,UAAUy9B,OAAS,WACtBlxC,KAAKizC,UAAW,GAGlB7vC,EAAKqQ,UAAUw9B,SAAW,WACxBjxC,KAAKizC,UAAW,GAGlB7vC,EAAKqQ,UAAUo9C,mBAAqB,WACjB,OAAb7wD,KAAK0tD,KAA8B,OAAd1tD,KAAKspB,MAA6B,OAAZtpB,KAAKupB,KAClDvpB,KAAK0tD,IAAIr7C,EAAI,IAAOrS,KAAKspB,KAAKjX,EAAIrS,KAAKupB,GAAGlX,GAC1CrS,KAAK0tD,IAAIp7C,EAAI,IAAOtS,KAAKspB,KAAKhX,EAAItS,KAAKupB,GAAGjX,KAQ9ClP,EAAKqQ,UAAUk7C,kBAAoB,SAAS1nC,GAC1C,GAAgC,GAA5BjnB,KAAK8yD,oBAA6B,CACpC,GAA+B,OAA3B9yD,KAAK+yD,aAAazpC,MAA0C,OAAzBtpB,KAAK+yD,aAAaxpC,GAAa,CACpE,GAAIytC,GAAa,cAAc1iD,OAAOtU,KAAKK,IACvC42D,EAAW,YAAY3iD,OAAOtU,KAAKK,IACnC0gD,GACYvE,OAAOjqC,MAAM,GAAIqZ,OAAO,GACxBkyB,SAASO,QAAQ,GACjBI,YAAac,sBAAuB,EAAGD,aAAczsC,MAAM,EAAGC,OAAQ,EAAG8Y,OAAO,IAEhG5rB,MAAK+yD,aAAazpC,KAAO,GAAI/lB,IAC1BlD,GAAG22D,EACFpa,MAAM,MACJ/xC,OAAOiB,WAAW,UAAWC,OAAO,UAAWC,WAAYF,WAAW,mBAClEi1C,GACV/gD,KAAK+yD,aAAaxpC,GAAK,GAAIhmB,IACxBlD,GAAG42D,EACFra,MAAM,MACN/xC,OAAOiB,WAAW,UAAWC,OAAO,UAAWC,WAAYF,WAAW,mBAChEi1C,GAG2B,GAAnC/gD,KAAK+yD,aAAazpC,KAAK2pB,UAAsD,GAAjCjzC,KAAK+yD,aAAaxpC,GAAG0pB,WACnEjzC,KAAK+yD,aAAaC,UAAYhzD,KAAKk3D,wBAAwBjwC,GAC3DjnB,KAAK+yD,aAAazpC,KAAKjX,EAAIrS,KAAK+yD,aAAaC,UAAU1pC,KAAKjX,EAC5DrS,KAAK+yD,aAAazpC,KAAKhX,EAAItS,KAAK+yD,aAAaC,UAAU1pC,KAAKhX,EAC5DtS,KAAK+yD,aAAaxpC,GAAGlX,EAAIrS,KAAK+yD,aAAaC,UAAUzpC,GAAGlX,EACxDrS,KAAK+yD,aAAaxpC,GAAGjX,EAAItS,KAAK+yD,aAAaC,UAAUzpC,GAAGjX,GAG1DtS,KAAK+yD,aAAazpC,KAAKyiB,KAAK9kB,GAC5BjnB,KAAK+yD,aAAaxpC,GAAGwiB,KAAK9kB,OAG1BjnB,MAAK+yD,cAAgBzpC,KAAK,KAAMC,GAAG,KAAMypC,eAQ7C5vD,EAAKqQ,UAAU0jD,oBAAsB,WACnCn3D,KAAK8yD,qBAAsB,GAO7B1vD,EAAKqQ,UAAU2jD,qBAAuB,WACpCp3D,KAAK8yD,qBAAsB,GAU7B1vD,EAAKqQ,UAAU4jD,wBAA0B,SAAShlD,EAAEC,GAClD,GAAI0gD,GAAYhzD,KAAK+yD,aAAaC,UAC9BsE,EAAeryD,KAAK8qB,KAAK9qB,KAAKovB,IAAIhiB,EAAI2gD,EAAU1pC,KAAKjX,EAAE,GAAKpN,KAAKovB,IAAI/hB,EAAI0gD,EAAU1pC,KAAKhX,EAAE,IAC1FilD,EAAetyD,KAAK8qB,KAAK9qB,KAAKovB,IAAIhiB,EAAI2gD,EAAUzpC,GAAGlX,EAAI,GAAKpN,KAAKovB,IAAI/hB,EAAI0gD,EAAUzpC,GAAGjX,EAAI,GAE9F,OAAmB,IAAfglD,GACFt3D,KAAKizD,cAAgBjzD,KAAKspB,KAC1BtpB,KAAKspB,KAAOtpB,KAAK+yD,aAAazpC,KACvBtpB,KAAK+yD,aAAazpC,MAEL,GAAbiuC,GACPv3D,KAAKizD,cAAgBjzD,KAAKupB,GAC1BvpB,KAAKupB,GAAKvpB,KAAK+yD,aAAaxpC,GACrBvpB,KAAK+yD,aAAaxpC,IAGlB,MASXnmB,EAAKqQ,UAAU+jD,qBAAuB,WACG,GAAnCx3D,KAAK+yD,aAAazpC,KAAK2pB,WACzBjzC,KAAKspB,KAAOtpB,KAAKizD,cACjBjzD,KAAKizD,cAAgB,KACrBjzD,KAAK+yD,aAAazpC,KAAK2nB,YAEY,GAAjCjxC,KAAK+yD,aAAaxpC,GAAG0pB,WACvBjzC,KAAKupB,GAAKvpB,KAAKizD,cACfjzD,KAAKizD,cAAgB,KACrBjzD,KAAK+yD,aAAaxpC,GAAG0nB,aAUzB7tC,EAAKqQ,UAAUyjD,wBAA0B,SAASjwC,GAChD,GASIymC,GATAb,EAAQ5nD,KAAKywD,MAAO11D,KAAKupB,GAAGjX,EAAItS,KAAKspB,KAAKhX,EAAKtS,KAAKupB,GAAGlX,EAAIrS,KAAKspB,KAAKjX,GACrEyM,EAAM9e,KAAKupB,GAAGlX,EAAIrS,KAAKspB,KAAKjX,EAC5B0M,EAAM/e,KAAKupB,GAAGjX,EAAItS,KAAKspB,KAAKhX,EAC5BsjD,EAAoB3wD,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAC7C82C,EAAiB71D,KAAKspB,KAAKwsC,iBAAiB7uC,EAAK4lC,EAAQ5nD,KAAK6mB,IAC9DiqC,GAAmBH,EAAoBC,GAAkBD,EACzDpC,EAAQ,EAAoBxzD,KAAKspB,KAAKjX,GAAK,EAAI0jD,GAAmB/1D,KAAKupB,GAAGlX,EAC1EohD,EAAQ,EAAoBzzD,KAAKspB,KAAKhX,GAAK,EAAIyjD,GAAmB/1D,KAAKupB,GAAGjX,CAGrC,IAArCtS,KAAK+O,QAAQqxC,aAAaC,SAAwD,GAArCrgD,KAAK+O,QAAQqxC,aAAapxC,QACzE0+C,EAAM1tD,KAAK0tD,IAEiC,GAArC1tD,KAAK+O,QAAQqxC,aAAapxC,UACjC0+C,EAAM1tD,KAAK20D,sBAG4B,GAArC30D,KAAK+O,QAAQqxC,aAAapxC,SAA4B,MAAT0+C,EAAIr7C,IACnDw6C,EAAQ5nD,KAAKywD,MAAO11D,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,EAAKtS,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,GACzDyM,EAAM9e,KAAKupB,GAAGlX,EAAIq7C,EAAIr7C,EACtB0M,EAAM/e,KAAKupB,GAAGjX,EAAIo7C,EAAIp7C,EACtBsjD,EAAoB3wD,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAE/C,IAGI20C,GAAIC,EAHJqC,EAAeh2D,KAAKupB,GAAGusC,iBAAiB7uC,EAAK4lC,GAC7CoJ,GAAiBL,EAAoBI,GAAgBJ,CAYzD,OATyC,IAArC51D,KAAK+O,QAAQqxC,aAAapxC,SAA4B,MAAT0+C,EAAIr7C,GACnDqhD,GAAO,EAAIuC,GAAiBvI,EAAIr7C,EAAI4jD,EAAgBj2D,KAAKupB,GAAGlX,EAC5DshD,GAAO,EAAIsC,GAAiBvI,EAAIp7C,EAAI2jD,EAAgBj2D,KAAKupB,GAAGjX,IAG5DohD,GAAO,EAAIuC,GAAiBj2D,KAAKspB,KAAKjX,EAAI4jD,EAAgBj2D,KAAKupB,GAAGlX,EAClEshD,GAAO,EAAIsC,GAAiBj2D,KAAKspB,KAAKhX,EAAI2jD,EAAgBj2D,KAAKupB,GAAGjX,IAG5DgX,MAAMjX,EAAEmhD,EAAMlhD,EAAEmhD,GAAOlqC,IAAIlX,EAAEqhD,EAAIphD,EAAEqhD,KAG7C9zD,EAAOD,QAAUwD,GAIb,SAASvD,EAAQD,EAASM,GAQ9B,QAASmD,KACPrD,KAAKgX,QACLhX,KAAKy3D,aAAe,EARtB,GAAI92D,GAAOT,EAAoB,EAe/BmD,GAAOq0D,UACJ3rD,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aACxIC,OAAQ,UAAWD,WAAY,UAAWE,WAAYD,OAAQ,UAAWD,WAAY,WAAYG,OAAQF,OAAQ,UAAWD,WAAY,aAO3IzI,EAAOoQ,UAAUuD,MAAQ,WACvBhX,KAAK00B,UACL10B,KAAK00B,OAAOhvB,OAAS,WAEnB,GAAIH,GAAI,CACR,KAAM,GAAI7E,KAAKV,MACTA,KAAK6F,eAAenF,IACtB6E,GAGJ,OAAOA,KAWXlC,EAAOoQ,UAAU+B,IAAM,SAAU2xC,GAC/B,GAAI50C,GAAQvS,KAAK00B,OAAOyyB,EACxB,IAAa5gD,QAATgM,EAAoB,CAEtB,GAAIlK,GAAQrI,KAAKy3D,aAAep0D,EAAOq0D,QAAQhyD,MAC/C1F,MAAKy3D,eACLllD,KACAA,EAAM1H,MAAQxH,EAAOq0D,QAAQrvD,GAC7BrI,KAAK00B,OAAOyyB,GAAa50C,EAG3B,MAAOA,IAUTlP,EAAOoQ,UAAUF,IAAM,SAAU4zC,EAAW35C,GAK1C,MAJAxN,MAAK00B,OAAOyyB,GAAa35C,EACrBA,EAAM3C,QACR2C,EAAM3C,MAAQlK,EAAKiK,WAAW4C,EAAM3C,QAE/B2C,GAGT3N,EAAOD,QAAUyD,GAKb,SAASxD,GAMb,QAASyD,KACPtD,KAAK+hD,UAEL/hD,KAAKwI,SAAWjC,OAQlBjD,EAAOmQ,UAAUuuC,kBAAoB,SAASx5C,GAC5CxI,KAAKwI,SAAWA,GASlBlF,EAAOmQ,UAAUkkD,KAAO,SAASC,EAAKC,GACpC,GAAIC,GAAM93D,KAAK+hD,OAAO6V,EACtB,IAAWrxD,QAAPuxD,EAAkB,CAEpB,GAAI/V,GAAS/hD,IACb83D,GAAM,GAAIC,OACV/3D,KAAK+hD,OAAO6V,GAAOE,EACnBA,EAAIE,OAAS,WACPjW,EAAOv5C,UACTu5C,EAAOv5C,SAASxI,OAIpB83D,EAAIG,QAAU,WACfj4D,KAAK6kD,IAAMgT,EACP9V,EAAOv5C,UACZu5C,EAAOv5C,SAASxI,OAId83D,EAAIjT,IAAM+S,EAGZ,MAAOE,IAGTj4D,EAAOD,QAAU0D,GAKb,SAASzD,EAAQD,EAASM,GA6B9B,QAASqD,GAAK6pD,EAAY8K,EAAWC,EAAWhG,GAC9C,GAAIpR,GAAYpgD,EAAK4N,uBAAuB,SAAS4jD,EACrDnyD,MAAK+O,QAAUgyC,EAAUvE,MAEzBx8C,KAAKizC,UAAW,EAChBjzC,KAAKiM,OAAQ,EAEbjM,KAAKq9C,SACLr9C,KAAK4tD,gBACL5tD,KAAKo4D,iBAELp4D,KAAKq4D,kBAAoB,EAGzBr4D,KAAKK,GAAKkG,OACVvG,KAAKqS,EAAI,KACTrS,KAAKsS,EAAI,KACTtS,KAAKkxD,gBAAiB,EACtBlxD,KAAKmxD,gBAAiB,EACtBnxD,KAAKgqD,QAAS,EACdhqD,KAAKiqD,QAAS,EACdjqD,KAAKs4D,qBAAsB,EAC3Bt4D,KAAKu4D,kBAAsB,EAC3Bv4D,KAAKw4D,gBAAkBrG,EAAiB3V,MAAM5wB,OAC9C5rB,KAAKy4D,aAAc,EACnBz4D,KAAKk9C,MAAQ,GACbl9C,KAAK04D,kBAAmB,EACxB14D,KAAK24D,qBAAsB,EAC3B34D,KAAKuyD,iBAAmB3qD,IAAI,EAAEJ,KAAK,EAAEqL,MAAM,EAAEC,OAAO,EAAE0/C,MAAM,GAG5DxyD,KAAKk4D,UAAYA,EACjBl4D,KAAKm4D,UAAYA,EAGjBn4D,KAAK44D,GAAK,EACV54D,KAAK64D,GAAK,EACV74D,KAAK84D,GAAK,EACV94D,KAAK+4D,GAAK,EACV/4D,KAAKq+C,QAAU8T,EAAiBrU,QAAQO,QACxCr+C,KAAK+uD,WAAa18C,EAAE,KAAKC,EAAE,MAE3BtS,KAAKmtD,cAAcC,EAAYrM,GAG/B/gD,KAAKg5D,eACLh5D,KAAKi5D,mBAAqB,EAC1Bj5D,KAAKk5D,eAAiB,EACtBl5D,KAAKm5D,uBAA0BhH,EAAiB1T,WAAWa,YAAYzsC,MACvE7S,KAAKo5D,wBAA0BjH,EAAiB1T,WAAWa,YAAYxsC,OACvE9S,KAAKq5D,wBAA0BlH,EAAiB1T,WAAWa,YAAY1zB,OACvE5rB,KAAKu/C,sBAAwB4S,EAAiB1T,WAAWc,sBACzDv/C,KAAKs5D,gBAAkB,EAGvBt5D,KAAK00D,gBAAkB,EACvB10D,KAAKu5D,aAAe,EACpBv5D,KAAKmjD,eAAiB9wC,EAAK,KAAMC,EAAK,MACtCtS,KAAKojD,mBAAqB/wC,EAAM,IAAKC,EAAM,KAC3CtS,KAAK2wD,aAAe,KAtFtB,GAAIhwD,GAAOT,EAAoB,EA4F/BqD,GAAKkQ,UAAUulD,aAAe,WAE5Bh5D,KAAKw5D,eAAiBjzD,OACtBvG,KAAKy5D,YAAc,EACnBz5D,KAAK05D,kBACL15D,KAAK25D,kBACL35D,KAAK45D,oBAOPr2D,EAAKkQ,UAAU6/C,WAAa,SAASnH,GACH,IAA5BnsD,KAAKq9C,MAAM32C,QAAQylD,IACrBnsD,KAAKq9C,MAAMn1C,KAAKikD,GAEqB,IAAnCnsD,KAAK4tD,aAAalnD,QAAQylD,IAC5BnsD,KAAK4tD,aAAa1lD,KAAKikD,GAEzBnsD,KAAKi5D,mBAAqBj5D,KAAK4tD,aAAaloD,QAO9CnC,EAAKkQ,UAAU8/C,WAAa,SAASpH,GACnC,GAAI9jD,GAAQrI,KAAKq9C,MAAM32C,QAAQylD,EAClB,KAAT9jD,GACFrI,KAAKq9C,MAAM/0C,OAAOD,EAAO,GAE3BA,EAAQrI,KAAK4tD,aAAalnD,QAAQylD,GACrB,IAAT9jD,GACFrI,KAAK4tD,aAAatlD,OAAOD,EAAO,GAElCrI,KAAKi5D,mBAAqBj5D,KAAK4tD,aAAaloD,QAS9CnC,EAAKkQ,UAAU05C,cAAgB,SAASC,EAAYrM,GAClD,GAAKqM,EAAL,CAIA,GAAI5+C,IAAU,cAAc,sBAAsB,QAAQ,QAAQ,cAAc,SAAS,YACvF,WAAW,WAAW,WAAW,QAAQ,OAkB3C,IAhBA7N,EAAKuF,oBAAoBsI,EAAQxO,KAAK+O,QAASq+C,GAGzB7mD,SAAlB6mD,EAAW/sD,KAA0BL,KAAKK,GAAK+sD,EAAW/sD,IACrCkG,SAArB6mD,EAAWzkC,QAA0B3oB,KAAK2oB,MAAQykC,EAAWzkC,MAAO3oB,KAAK65D,cAAgBzM,EAAWzkC,OAC/EpiB,SAArB6mD,EAAWroB,QAA0B/kC,KAAK+kC,MAAQqoB,EAAWroB,OAC5Cx+B,SAAjB6mD,EAAW/6C,IAA0BrS,KAAKqS,EAAI+6C,EAAW/6C,GACxC9L,SAAjB6mD,EAAW96C,IAA0BtS,KAAKsS,EAAI86C,EAAW96C,GACpC/L,SAArB6mD,EAAWhmD,QAA0BpH,KAAKoH,MAAQgmD,EAAWhmD,OACxCb,SAArB6mD,EAAWlQ,QAA0Bl9C,KAAKk9C,MAAQkQ,EAAWlQ,MAAOl9C,KAAK04D,kBAAmB,GAGzDnyD,SAAnC6mD,EAAWkL,sBAAoCt4D,KAAKs4D,oBAAsBlL,EAAWkL,qBAClD/xD,SAAnC6mD,EAAWmL,mBAAoCv4D,KAAKu4D,iBAAsBnL,EAAWmL,kBAClDhyD,SAAnC6mD,EAAW0M,kBAAoC95D,KAAK85D,gBAAsB1M,EAAW0M,iBAEzEvzD,SAAZvG,KAAKK,GACP,KAAM,sBAIR,IAAkC,gBAAvBL,MAAK+O,QAAQwD,OAAqD,gBAAvBvS,MAAK+O,QAAQwD,OAA4C,IAAtBvS,KAAK+O,QAAQwD,MAAc,CAClH,GAAIwnD,GAAW/5D,KAAKm4D,UAAU3iD,IAAIxV,KAAK+O,QAAQwD,MAC/C,KAAK,GAAI3M,KAAQm0D,GACXA,EAASl0D,eAAeD,KAC1B5F,KAAK+O,QAAQnJ,GAAQm0D,EAASn0D,IAUpC,GAH0BW,SAAtB6mD,EAAWxhC,SAA+B5rB,KAAKw4D,gBAAkBx4D,KAAK+O,QAAQ6c,QACzDrlB,SAArB6mD,EAAWviD,QAA+B7K,KAAK+O,QAAQlE,MAAQlK,EAAKiK,WAAWwiD,EAAWviD,QAEpEtE,SAAtBvG,KAAK+O,QAAQ8tC,OAA2C,IAArB78C,KAAK+O,QAAQ8tC,MAAY,CAC9D,IAAI78C,KAAKk4D,UAIP,KAAM,uBAHNl4D,MAAKg6D,SAAWh6D,KAAKk4D,UAAUP,KAAK33D,KAAK+O,QAAQ8tC,MAAO78C,KAAK+O,QAAQkrD,aAkCzE,OA3BkC1zD,SAA9B6mD,EAAW8D,gBACblxD,KAAKgqD,QAAUoD,EAAW8D,eAC1BlxD,KAAKkxD,eAAiB9D,EAAW8D,gBAET3qD,SAAjB6mD,EAAW/6C,GAA0C,GAAvBrS,KAAKkxD,iBAC1ClxD,KAAKgqD,QAAS,GAIkBzjD,SAA9B6mD,EAAW+D,gBACbnxD,KAAKiqD,QAAUmD,EAAW+D,eAC1BnxD,KAAKmxD,eAAiB/D,EAAW+D,gBAET5qD,SAAjB6mD,EAAW96C,GAA0C,GAAvBtS,KAAKmxD,iBAC1CnxD,KAAKiqD,QAAS,GAGhBjqD,KAAKy4D,YAAcz4D,KAAKy4D,aAAsClyD,SAAtB6mD,EAAWxhC,OAEzB,SAAtB5rB,KAAK+O,QAAQ6tC,QACf58C,KAAK+O,QAAQ2tC,UAAYqE,EAAUvE,MAAMp1B,SACzCpnB,KAAK+O,QAAQ4tC,UAAYoE,EAAUvE,MAAMn1B,UAMnCrnB,KAAK+O,QAAQ6tC,OACnB,IAAK,WAAiB58C,KAAK+rC,KAAO/rC,KAAKk6D,cAAel6D,KAAKu0D,OAASv0D,KAAKm6D,eAAiB,MAC1F,KAAK,MAAiBn6D,KAAK+rC,KAAO/rC,KAAKo6D,SAAUp6D,KAAKu0D,OAASv0D,KAAKq6D,UAAY,MAChF,KAAK,SAAiBr6D,KAAK+rC,KAAO/rC,KAAKs6D,YAAat6D,KAAKu0D,OAASv0D,KAAKu6D,aAAe,MACtF,KAAK,UAAiBv6D,KAAK+rC,KAAO/rC,KAAKw6D,aAAcx6D,KAAKu0D,OAASv0D,KAAKy6D,cAAgB,MAExF,KAAK,QAAiBz6D,KAAK+rC,KAAO/rC,KAAK06D,WAAY16D,KAAKu0D,OAASv0D,KAAK26D,YAAc,MACpF,KAAK,OAAiB36D,KAAK+rC,KAAO/rC,KAAK46D,UAAW56D,KAAKu0D,OAASv0D,KAAK66D,WAAa,MAClF,KAAK,MAAiB76D,KAAK+rC,KAAO/rC,KAAK86D,SAAU96D,KAAKu0D,OAASv0D,KAAK+6D,YAAc,MAClF,KAAK,SAAiB/6D,KAAK+rC,KAAO/rC,KAAKg7D,YAAah7D,KAAKu0D,OAASv0D,KAAK+6D,YAAc,MACrF,KAAK,WAAiB/6D,KAAK+rC,KAAO/rC,KAAKi7D,cAAej7D,KAAKu0D,OAASv0D,KAAK+6D,YAAc,MACvF,KAAK,eAAiB/6D,KAAK+rC,KAAO/rC,KAAKk7D,kBAAmBl7D,KAAKu0D,OAASv0D,KAAK+6D,YAAc,MAC3F,KAAK,OAAiB/6D,KAAK+rC,KAAO/rC,KAAKm7D,UAAWn7D,KAAKu0D,OAASv0D,KAAK+6D,YAAc,MACnF,SAAsB/6D,KAAK+rC,KAAO/rC,KAAKw6D,aAAcx6D,KAAKu0D,OAASv0D,KAAKy6D,eAG1Ez6D,KAAKo7D,WAOP73D,EAAKkQ,UAAUy9B,OAAS,WACtBlxC,KAAKizC,UAAW,EAChBjzC,KAAKo7D,UAMP73D,EAAKkQ,UAAUw9B,SAAW,WACxBjxC,KAAKizC,UAAW,EAChBjzC,KAAKo7D,UAOP73D,EAAKkQ,UAAU4nD,eAAiB,WAC9Br7D,KAAKo7D,UAOP73D,EAAKkQ,UAAU2nD,OAAS,WACtBp7D,KAAK6S,MAAQtM,OACbvG,KAAK8S,OAASvM,QAQhBhD,EAAKkQ,UAAUw4C,SAAW,WACxB,MAA6B,kBAAfjsD,MAAK+kC,MAAuB/kC,KAAK+kC,QAAU/kC,KAAK+kC,OAShExhC,EAAKkQ,UAAUqiD,iBAAmB,SAAU7uC,EAAK4lC,GAC/C,GAAI3sC,GAAc,CAMlB,QAJKlgB,KAAK6S,OACR7S,KAAKu0D,OAAOttC,GAGNjnB,KAAK+O,QAAQ6tC,OACnB,IAAK,SACL,IAAK,MACH,MAAO58C,MAAK+O,QAAQ6c,OAAQ1L,CAE9B,KAAK,UACH,GAAI5a,GAAItF,KAAK6S,MAAQ,EACjB1M,EAAInG,KAAK8S,OAAS,EAClBg7C,EAAK7oD,KAAKqZ,IAAIuuC,GAASvnD,EACvBgG,EAAKrG,KAAKwZ,IAAIouC,GAAS1mD,CAC3B,OAAOb,GAAIa,EAAIlB,KAAK8qB,KAAK+9B,EAAIA,EAAIxiD,EAAIA,EAMvC,KAAK,MACL,IAAK,QACL,IAAK,OACL,QACE,MAAItL,MAAK6S,MACA5N,KAAKwG,IACRxG,KAAK8lB,IAAI/qB,KAAK6S,MAAQ,EAAI5N,KAAKwZ,IAAIouC,IACnC5nD,KAAK8lB,IAAI/qB,KAAK8S,OAAS,EAAI7N,KAAKqZ,IAAIuuC,KAAW3sC,EAI5C,IAYf3c,EAAKkQ,UAAU6nD,UAAY,SAAS1C,EAAIC,GACtC74D,KAAK44D,GAAKA,EACV54D,KAAK64D,GAAKA,GASZt1D,EAAKkQ,UAAU8nD,UAAY,SAAS3C,EAAIC,GACtC74D,KAAK44D,IAAMA,EACX54D,KAAK64D,IAAMA,GAObt1D,EAAKkQ,UAAU67C,aAAe,SAASv8B,GACrC,GAAK/yB,KAAKgqD,OAORhqD,KAAK44D,GAAK,EACV54D,KAAK84D,GAAK,MARM,CAChB,GAAIh6C,GAAO9e,KAAKq+C,QAAUr+C,KAAK84D,GAC3Bh7C,GAAQ9d,KAAK44D,GAAK95C,GAAM9e,KAAK+O,QAAQ0tC,IACzCz8C,MAAK84D,IAAMh7C,EAAKiV,EAChB/yB,KAAKqS,GAAMrS,KAAK84D,GAAK/lC,EAOvB,GAAK/yB,KAAKiqD,OAORjqD,KAAK64D,GAAK,EACV74D,KAAK+4D,GAAK,MARM,CAChB,GAAIh6C,GAAO/e,KAAKq+C,QAAUr+C,KAAK+4D,GAC3Bh7C,GAAQ/d,KAAK64D,GAAK95C,GAAM/e,KAAK+O,QAAQ0tC,IACzCz8C,MAAK+4D,IAAMh7C,EAAKgV,EAChB/yB,KAAKsS,GAAMtS,KAAK+4D,GAAKhmC,IAezBxvB,EAAKkQ,UAAU47C,oBAAsB,SAASt8B,EAAUwtB,GACtD,GAAKvgD,KAAKgqD,OAQRhqD,KAAK44D,GAAK,EACV54D,KAAK84D,GAAK,MATM,CAChB,GAAIh6C,GAAO9e,KAAKq+C,QAAUr+C,KAAK84D,GAC3Bh7C,GAAQ9d,KAAK44D,GAAK95C,GAAM9e,KAAK+O,QAAQ0tC,IACzCz8C,MAAK84D,IAAMh7C,EAAKiV,EAChB/yB,KAAK84D,GAAM7zD,KAAK8lB,IAAI/qB,KAAK84D,IAAMvY,EAAiBvgD,KAAK84D,GAAK,EAAKvY,GAAeA,EAAevgD,KAAK84D,GAClG94D,KAAKqS,GAAMrS,KAAK84D,GAAK/lC,EAOvB,GAAK/yB,KAAKiqD,OAQRjqD,KAAK64D,GAAK,EACV74D,KAAK+4D,GAAK,MATM,CAChB,GAAIh6C,GAAO/e,KAAKq+C,QAAUr+C,KAAK+4D,GAC3Bh7C,GAAQ/d,KAAK64D,GAAK95C,GAAM/e,KAAK+O,QAAQ0tC,IACzCz8C,MAAK+4D,IAAMh7C,EAAKgV,EAChB/yB,KAAK+4D,GAAM9zD,KAAK8lB,IAAI/qB,KAAK+4D,IAAMxY,EAAiBvgD,KAAK+4D,GAAK,EAAKxY,GAAeA,EAAevgD,KAAK+4D,GAClG/4D,KAAKsS,GAAMtS,KAAK+4D,GAAKhmC,IAYzBxvB,EAAKkQ,UAAU+nD,QAAU,WACvB,MAAQx7D,MAAKgqD,QAAUhqD,KAAKiqD,QAQ9B1mD,EAAKkQ,UAAUy7C,SAAW,SAASD,GACjC,GAAIwM,GAAWx2D,KAAK8qB,KAAK9qB,KAAKovB,IAAIr0B,KAAK84D,GAAG,GAAK7zD,KAAKovB,IAAIr0B,KAAK+4D,GAAG,GAEhE,OAAQ0C,GAAWxM,GAOrB1rD,EAAKkQ,UAAUk2C,WAAa,WAC1B,MAAO3pD,MAAKizC,UAOd1vC,EAAKkQ,UAAUyB,SAAW,WACxB,MAAOlV,MAAKoH,OASd7D,EAAKkQ,UAAUioD,YAAc,SAASrpD,EAAGC,GACvC,GAAIwM,GAAK9e,KAAKqS,EAAIA,EACd0M,EAAK/e,KAAKsS,EAAIA,CAClB,OAAOrN,MAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,IAUlCxb,EAAKkQ,UAAUo6C,cAAgB,SAASpiD,EAAKyB,GAC3C,IAAKlN,KAAKy4D,aAA8BlyD,SAAfvG,KAAKoH,MAC5B,GAAI8F,GAAOzB,EACTzL,KAAK+O,QAAQ6c,QAAS5rB,KAAK+O,QAAQ2tC,UAAY18C,KAAK+O,QAAQ4tC,WAAa,MAEtE,CACH,GAAIx/B,IAASnd,KAAK+O,QAAQ4tC,UAAY38C,KAAK+O,QAAQ2tC,YAAcxvC,EAAMzB,EACvEzL,MAAK+O,QAAQ6c,QAAS5rB,KAAKoH,MAAQqE,GAAO0R,EAAQnd,KAAK+O,QAAQ2tC,UAGnE18C,KAAKw4D,gBAAkBx4D,KAAK+O,QAAQ6c,QAQtCroB,EAAKkQ,UAAUs4B,KAAO,WACpB,KAAM,wCAQRxoC,EAAKkQ,UAAU8gD,OAAS,WACtB,KAAM,0CAQRhxD,EAAKkQ,UAAUy4C,kBAAoB,SAAShpC,GAC1C,MAAQljB,MAAKwH,KAAoB0b,EAAIqE,OAC7BvnB,KAAKwH,KAAOxH,KAAK6S,MAAQqQ,EAAI1b,MAC7BxH,KAAK4H,IAAoBsb,EAAIM,QAC7BxjB,KAAK4H,IAAM5H,KAAK8S,OAASoQ,EAAItb,KAGvCrE,EAAKkQ,UAAUknD,aAAe,WAG5B,IAAK36D,KAAK6S,QAAU7S,KAAK8S,OAAQ,CAC/B,GAAID,GAAOC,CACX,IAAI9S,KAAKoH,MAAO,CACdpH,KAAK+O,QAAQ6c,OAAQ5rB,KAAKw4D,eAC1B,IAAIr7C,GAAQnd,KAAKg6D,SAASlnD,OAAS9S,KAAKg6D,SAASnnD,KACnCtM,UAAV4W,GACFtK,EAAQ7S,KAAK+O,QAAQ6c,QAAS5rB,KAAKg6D,SAASnnD,MAC5CC,EAAS9S,KAAK+O,QAAQ6c,OAAQzO,GAASnd,KAAKg6D,SAASlnD,SAGrDD,EAAQ,EACRC,EAAS,OAIXD,GAAQ7S,KAAKg6D,SAASnnD,MACtBC,EAAS9S,KAAKg6D,SAASlnD,MAEzB9S,MAAK6S,MAASA,EACd7S,KAAK8S,OAASA,EAEd9S,KAAKs5D,gBAAkB,EACnBt5D,KAAK6S,MAAQ,GAAK7S,KAAK8S,OAAS,IAClC9S,KAAK6S,OAAU5N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAA0Bv/C,KAAKm5D,uBAClFn5D,KAAK8S,QAAU7N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKo5D,wBACjFp5D,KAAK+O,QAAQ6c,QAAS3mB,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKq5D,wBACxFr5D,KAAKs5D,gBAAkBt5D,KAAK6S,MAAQA,KAM1CtP,EAAKkQ,UAAUinD,WAAa,SAAUzzC,GACpCjnB,KAAK26D,aAAa1zC,GAElBjnB,KAAKwH,KAASxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EACpC7S,KAAK4H,IAAS5H,KAAKsS,EAAItS,KAAK8S,OAAS,CAErC,IAAIuH,EACJ,IAA2B,GAAvBra,KAAKg6D,SAASnnD,MAAa,CAE7B,GAAI7S,KAAKy5D,YAAc,EAAG,CACxB,GAAIjyC,GAAcxnB,KAAKy5D,YAAc,EAAK,GAAK,CAC/CjyC,IAAaxnB,KAAK00D,gBAClBltC,EAAYviB,KAAKwG,IAAI,GAAMzL,KAAK6S,MAAM2U,GAEtCP,EAAI00C,YAAc,GAClB10C,EAAI20C,UAAU57D,KAAKg6D,SAAUh6D,KAAKwH,KAAOggB,EAAWxnB,KAAK4H,IAAM4f,EAAWxnB,KAAK6S,MAAQ,EAAE2U,EAAWxnB,KAAK8S,OAAS,EAAE0U,GAItHP,EAAI00C,YAAc,EAClB10C,EAAI20C,UAAU57D,KAAKg6D,SAAUh6D,KAAKwH,KAAMxH,KAAK4H,IAAK5H,KAAK6S,MAAO7S,KAAK8S,QACnEuH,EAASra,KAAKsS,EAAItS,KAAK8S,OAAS,MAIhCuH,GAASra,KAAKsS,CAGhBtS,MAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGgI,EAAQ9T,OAAW,QAI1DhD,EAAKkQ,UAAU4mD,WAAa,SAAUpzC,GACpC,IAAKjnB,KAAK6S,MAAO,CACf,GAAIoH,GAAS,EACT4hD,EAAW77D,KAAK87D,YAAY70C,EAChCjnB,MAAK6S,MAAQgpD,EAAShpD,MAAQ,EAAIoH,EAClCja,KAAK8S,OAAS+oD,EAAS/oD,OAAS,EAAImH,EAEpCja,KAAK6S,OAAuE,GAA7D5N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAA+Bv/C,KAAKm5D,uBACvFn5D,KAAK8S,QAAuE,GAA7D7N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAA+Bv/C,KAAKo5D,wBACvFp5D,KAAKs5D,gBAAkBt5D,KAAK6S,OAASgpD,EAAShpD,MAAQ,EAAIoH,KAM9D1W,EAAKkQ,UAAU2mD,SAAW,SAAUnzC,GAClCjnB,KAAKq6D,WAAWpzC,GAEhBjnB,KAAKwH,KAAOxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EAClC7S,KAAK4H,IAAM5H,KAAKsS,EAAItS,KAAK8S,OAAS,CAElC,IAAIipD,GAAmB,IACnB77C,EAAclgB,KAAK+O,QAAQmR,YAC3B87C,EAAqBh8D,KAAK+O,QAAQquC,qBAAuB,EAAIp9C,KAAK+O,QAAQmR,WAE9E+G,GAAIY,YAAc7nB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUD,OAAS/L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMF,OAAS/L,KAAK+O,QAAQlE,MAAMkB,OAGtI/L,KAAKy5D,YAAc,IACrBxyC,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIg1C,UAAUj8D,KAAKwH,KAAK,EAAEyf,EAAIO,UAAWxnB,KAAK4H,IAAI,EAAEqf,EAAIO,UAAWxnB,KAAK6S,MAAM,EAAEoU,EAAIO,UAAWxnB,KAAK8S,OAAO,EAAEmU,EAAIO,UAAWxnB,KAAK+O,QAAQ6c,QACzI3E,EAAIlH,UAENkH,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIiB,UAAYloB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUF,WAAa9L,KAAK+O,QAAQlE,MAAMiB,WAE7Fmb,EAAIg1C,UAAUj8D,KAAKwH,KAAMxH,KAAK4H,IAAK5H,KAAK6S,MAAO7S,KAAK8S,OAAQ9S,KAAK+O,QAAQ6c,QACzE3E,EAAInH,OACJmH,EAAIlH,SAEJ/f,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGrS,KAAKsS,IAI5C/O,EAAKkQ,UAAU0mD,gBAAkB,SAAUlzC,GACzC,IAAKjnB,KAAK6S,MAAO,CACf,GAAIoH,GAAS,EACT4hD,EAAW77D,KAAK87D,YAAY70C,GAC5BtU,EAAOkpD,EAAShpD,MAAQ,EAAIoH,CAChCja,MAAK6S,MAAQF,EACb3S,KAAK8S,OAASH,EAGd3S,KAAK6S,OAAU5N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKm5D,uBACjFn5D,KAAK8S,QAAU7N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKo5D,wBACjFp5D,KAAK+O,QAAQ6c,QAAS3mB,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKq5D,wBACxFr5D,KAAKs5D,gBAAkBt5D,KAAK6S,MAAQF,IAIxCpP,EAAKkQ,UAAUymD,cAAgB,SAAUjzC,GACvCjnB,KAAKm6D,gBAAgBlzC,GACrBjnB,KAAKwH,KAAOxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EAClC7S,KAAK4H,IAAM5H,KAAKsS,EAAItS,KAAK8S,OAAS,CAElC,IAAIipD,GAAmB,IACnB77C,EAAclgB,KAAK+O,QAAQmR,YAC3B87C,EAAqBh8D,KAAK+O,QAAQquC,qBAAuB,EAAIp9C,KAAK+O,QAAQmR,WAE9E+G,GAAIY,YAAc7nB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUD,OAAS/L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMF,OAAS/L,KAAK+O,QAAQlE,MAAMkB,OAGtI/L,KAAKy5D,YAAc,IACrBxyC,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIi1C,SAASl8D,KAAKqS,EAAIrS,KAAK6S,MAAM,EAAI,EAAEoU,EAAIO,UAAWxnB,KAAKsS,EAAgB,GAAZtS,KAAK8S,OAAa,EAAEmU,EAAIO,UAAWxnB,KAAK6S,MAAQ,EAAEoU,EAAIO,UAAWxnB,KAAK8S,OAAS,EAAEmU,EAAIO,WACpJP,EAAIlH,UAENkH,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIiB,UAAYloB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUF,WAAa9L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMH,WAAa9L,KAAK+O,QAAQlE,MAAMiB,WAChJmb,EAAIi1C,SAASl8D,KAAKqS,EAAIrS,KAAK6S,MAAM,EAAG7S,KAAKsS,EAAgB,GAAZtS,KAAK8S,OAAY9S,KAAK6S,MAAO7S,KAAK8S,QAC/EmU,EAAInH,OACJmH,EAAIlH,SAEJ/f,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGrS,KAAKsS,IAI5C/O,EAAKkQ,UAAU8mD,cAAgB,SAAUtzC,GACvC,IAAKjnB,KAAK6S,MAAO,CACf,GAAIoH,GAAS,EACT4hD,EAAW77D,KAAK87D,YAAY70C,GAC5Bk1C,EAAWl3D,KAAKiI,IAAI2uD,EAAShpD,MAAOgpD,EAAS/oD,QAAU,EAAImH,CAC/Dja,MAAK+O,QAAQ6c,OAASuwC,EAAW,EAEjCn8D,KAAK6S,MAAQspD,EACbn8D,KAAK8S,OAASqpD,EAKdn8D,KAAK+O,QAAQ6c,QAAuE,GAA7D3mB,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAA+Bv/C,KAAKq5D,wBAC/Fr5D,KAAKs5D,gBAAkBt5D,KAAK+O,QAAQ6c,OAAQ,GAAIuwC,IAIpD54D,EAAKkQ,UAAU6mD,YAAc,SAAUrzC,GACrCjnB,KAAKu6D,cAActzC,GACnBjnB,KAAKwH,KAAOxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EAClC7S,KAAK4H,IAAM5H,KAAKsS,EAAItS,KAAK8S,OAAS,CAElC,IAAIipD,GAAmB,IACnB77C,EAAclgB,KAAK+O,QAAQmR,YAC3B87C,EAAqBh8D,KAAK+O,QAAQquC,qBAAuB,EAAIp9C,KAAK+O,QAAQmR,WAE9E+G,GAAIY,YAAc7nB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUD,OAAS/L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMF,OAAS/L,KAAK+O,QAAQlE,MAAMkB,OAGtI/L,KAAKy5D,YAAc,IACrBxyC,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIm1C,OAAOp8D,KAAKqS,EAAGrS,KAAKsS,EAAGtS,KAAK+O,QAAQ6c,OAAO,EAAE3E,EAAIO,WACrDP,EAAIlH,UAENkH,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIiB,UAAYloB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUF,WAAa9L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMH,WAAa9L,KAAK+O,QAAQlE,MAAMiB,WAChJmb,EAAIm1C,OAAOp8D,KAAKqS,EAAGrS,KAAKsS,EAAGtS,KAAK+O,QAAQ6c,QACxC3E,EAAInH,OACJmH,EAAIlH,SAEJ/f,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGrS,KAAKsS,IAG5C/O,EAAKkQ,UAAUgnD,eAAiB,SAAUxzC,GACxC,IAAKjnB,KAAK6S,MAAO,CACf,GAAIgpD,GAAW77D,KAAK87D,YAAY70C,EAEhCjnB,MAAK6S,MAAyB,IAAjBgpD,EAAShpD,MACtB7S,KAAK8S,OAA2B,EAAlB+oD,EAAS/oD,OACnB9S,KAAK6S,MAAQ7S,KAAK8S,SACpB9S,KAAK6S,MAAQ7S,KAAK8S,OAEpB,IAAIupD,GAAcr8D,KAAK6S,KAGvB7S,MAAK6S,OAAU5N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKm5D,uBACjFn5D,KAAK8S,QAAU7N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKo5D,wBACjFp5D,KAAK+O,QAAQ6c,QAAU3mB,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKq5D,wBACzFr5D,KAAKs5D,gBAAkBt5D,KAAK6S,MAAQwpD,IAIxC94D,EAAKkQ,UAAU+mD,aAAe,SAAUvzC,GACtCjnB,KAAKy6D,eAAexzC,GACpBjnB,KAAKwH,KAAOxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EAClC7S,KAAK4H,IAAM5H,KAAKsS,EAAItS,KAAK8S,OAAS,CAElC,IAAIipD,GAAmB,IACnB77C,EAAclgB,KAAK+O,QAAQmR,YAC3B87C,EAAqBh8D,KAAK+O,QAAQquC,qBAAuB,EAAIp9C,KAAK+O,QAAQmR,WAE9E+G,GAAIY,YAAc7nB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUD,OAAS/L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMF,OAAS/L,KAAK+O,QAAQlE,MAAMkB,OAGtI/L,KAAKy5D,YAAc,IACrBxyC,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIq1C,QAAQt8D,KAAKwH,KAAK,EAAEyf,EAAIO,UAAWxnB,KAAK4H,IAAI,EAAEqf,EAAIO,UAAWxnB,KAAK6S,MAAM,EAAEoU,EAAIO,UAAWxnB,KAAK8S,OAAO,EAAEmU,EAAIO,WAC/GP,EAAIlH,UAENkH,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIiB,UAAYloB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUF,WAAa9L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMH,WAAa9L,KAAK+O,QAAQlE,MAAMiB,WAEhJmb,EAAIq1C,QAAQt8D,KAAKwH,KAAMxH,KAAK4H,IAAK5H,KAAK6S,MAAO7S,KAAK8S,QAClDmU,EAAInH,OACJmH,EAAIlH,SACJ/f,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGrS,KAAKsS,IAG5C/O,EAAKkQ,UAAUqnD,SAAW,SAAU7zC,GAClCjnB,KAAKu8D,WAAWt1C,EAAK,WAGvB1jB,EAAKkQ,UAAUwnD,cAAgB,SAAUh0C,GACvCjnB,KAAKu8D,WAAWt1C,EAAK,aAGvB1jB,EAAKkQ,UAAUynD,kBAAoB,SAAUj0C,GAC3CjnB,KAAKu8D,WAAWt1C,EAAK,iBAGvB1jB,EAAKkQ,UAAUunD,YAAc,SAAU/zC,GACrCjnB,KAAKu8D,WAAWt1C,EAAK,WAGvB1jB,EAAKkQ,UAAU0nD,UAAY,SAAUl0C,GACnCjnB,KAAKu8D,WAAWt1C,EAAK,SAGvB1jB,EAAKkQ,UAAUsnD,aAAe,WAC5B,IAAK/6D,KAAK6S,MAAO,CACf7S,KAAK+O,QAAQ6c,OAAQ5rB,KAAKw4D,eAC1B,IAAI7lD,GAAO,EAAI3S,KAAK+O,QAAQ6c,MAC5B5rB,MAAK6S,MAAQF,EACb3S,KAAK8S,OAASH,EAGd3S,KAAK6S,OAAU5N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKm5D,uBACjFn5D,KAAK8S,QAAU7N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKo5D,wBACjFp5D,KAAK+O,QAAQ6c,QAAsE,GAA7D3mB,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAA+Bv/C,KAAKq5D,wBAC9Fr5D,KAAKs5D,gBAAkBt5D,KAAK6S,MAAQF,IAIxCpP,EAAKkQ,UAAU8oD,WAAa,SAAUt1C,EAAK21B,GACzC58C,KAAK+6D,aAAa9zC,GAElBjnB,KAAKwH,KAAOxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EAClC7S,KAAK4H,IAAM5H,KAAKsS,EAAItS,KAAK8S,OAAS,CAElC,IAAIipD,GAAmB,IACnB77C,EAAclgB,KAAK+O,QAAQmR,YAC3B87C,EAAqBh8D,KAAK+O,QAAQquC,qBAAuB,EAAIp9C,KAAK+O,QAAQmR,YAC1Es8C,EAAmB,CAGvB,QAAQ5f,GACN,IAAK,MAAiB4f,EAAmB,CAAG,MAC5C,KAAK,SAAiBA,EAAmB,CAAG,MAC5C,KAAK,WAAiBA,EAAmB,CAAG,MAC5C,KAAK,eAAiBA,EAAmB,CAAG,MAC5C,KAAK,OAAiBA,EAAmB,EAG3Cv1C,EAAIY,YAAc7nB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUD,OAAS/L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMF,OAAS/L,KAAK+O,QAAQlE,MAAMkB,OAEtI/L,KAAKy5D,YAAc,IACrBxyC,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAI21B,GAAO58C,KAAKqS,EAAGrS,KAAKsS,EAAGtS,KAAK+O,QAAQ6c,OAAQ4wC,EAAmBv1C,EAAIO,WACvEP,EAAIlH,UAENkH,EAAIO,WAAaxnB,KAAKizC,SAAW+oB,EAAqB97C,IAAiBlgB,KAAKy5D,YAAc,EAAKsC,EAAmB,GAClH90C,EAAIO,WAAaxnB,KAAK00D,gBACtBztC,EAAIO,UAAYviB,KAAKwG,IAAIzL,KAAK6S,MAAMoU,EAAIO,WAExCP,EAAIiB,UAAYloB,KAAKizC,SAAWjzC,KAAK+O,QAAQlE,MAAMmB,UAAUF,WAAa9L,KAAKiM,MAAQjM,KAAK+O,QAAQlE,MAAMoB,MAAMH,WAAa9L,KAAK+O,QAAQlE,MAAMiB,WAChJmb,EAAI21B,GAAO58C,KAAKqS,EAAGrS,KAAKsS,EAAGtS,KAAK+O,QAAQ6c,QACxC3E,EAAInH,OACJmH,EAAIlH,SAEA/f,KAAK2oB,OACP3oB,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGrS,KAAKsS,EAAItS,KAAK8S,OAAS,EAAGvM,OAAW,OAAM,IAIpFhD,EAAKkQ,UAAUonD,YAAc,SAAU5zC,GACrC,IAAKjnB,KAAK6S,MAAO,CACf,GAAIoH,GAAS,EACT4hD,EAAW77D,KAAK87D,YAAY70C,EAChCjnB,MAAK6S,MAAQgpD,EAAShpD,MAAQ,EAAIoH,EAClCja,KAAK8S,OAAS+oD,EAAS/oD,OAAS,EAAImH,EAGpCja,KAAK6S,OAAU5N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKm5D,uBACjFn5D,KAAK8S,QAAU7N,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKo5D,wBACjFp5D,KAAK+O,QAAQ6c,QAAS3mB,KAAKwG,IAAIzL,KAAKy5D,YAAc,EAAGz5D,KAAKu/C,uBAAyBv/C,KAAKq5D,wBACxFr5D,KAAKs5D,gBAAkBt5D,KAAK6S,OAASgpD,EAAShpD,MAAQ,EAAIoH,KAI9D1W,EAAKkQ,UAAUmnD,UAAY,SAAU3zC,GACnCjnB,KAAK66D,YAAY5zC,GACjBjnB,KAAKwH,KAAOxH,KAAKqS,EAAIrS,KAAK6S,MAAQ,EAClC7S,KAAK4H,IAAM5H,KAAKsS,EAAItS,KAAK8S,OAAS,EAElC9S,KAAKs0D,OAAOrtC,EAAKjnB,KAAK2oB,MAAO3oB,KAAKqS,EAAGrS,KAAKsS,IAI5C/O,EAAKkQ,UAAU6gD,OAAS,SAAUrtC,EAAKwC,EAAMpX,EAAGC,EAAGy8B,EAAO0tB,EAAUC,GAClE,GAAIjzC,GAAQxlB,OAAOjE,KAAK+O,QAAQguC,UAAY/8C,KAAKu5D,aAAev5D,KAAKq4D,kBAAmB,CACtFpxC,EAAIQ,MAAQznB,KAAKizC,SAAW,QAAU,IAAMjzC,KAAK+O,QAAQguC,SAAW,MAAQ/8C,KAAK+O,QAAQiuC,QAEzF;GAAIzW,GAAQ9c,EAAKxhB,MAAM,MACnB8sD,EAAYxuB,EAAM7gC,OAClBq3C,EAAY94C,OAAOjE,KAAK+O,QAAQguC,UAAY,EAC5CyV,EAAQlgD,GAAK,EAAIyiD,GAAa,EAAIhY,CAChB,IAAlB2f,IACFlK,EAAQlgD,GAAK,EAAIyiD,IAAc,EAAIhY,GAKrC,KAAK,GADDlqC,GAAQoU,EAAI+tC,YAAYzuB,EAAM,IAAI1zB,MAC7BtN,EAAI,EAAOwvD,EAAJxvD,EAAeA,IAAK,CAClC,GAAIiiB,GAAYP,EAAI+tC,YAAYzuB,EAAMhhC,IAAIsN,KAC1CA,GAAQ2U,EAAY3U,EAAQ2U,EAAY3U,EAE1C,GAAIC,GAAS9S,KAAK+O,QAAQguC,SAAWgY,EACjCvtD,EAAO6K,EAAIQ,EAAQ,EACnBjL,EAAM0K,EAAIQ,EAAS,CACP,QAAZ2pD,IACF70D,GAAO,GAAMm1C,GAEf/8C,KAAKuyD,iBAAmB3qD,IAAIA,EAAIJ,KAAKA,EAAKqL,MAAMA,EAAMC,OAAOA,EAAO0/C,MAAMA,GAG5CjsD,SAA1BvG,KAAK+O,QAAQkuC,UAAoD,OAA1Bj9C,KAAK+O,QAAQkuC,UAA+C,SAA1Bj9C,KAAK+O,QAAQkuC,WACxFh2B,EAAIiB,UAAYloB,KAAK+O,QAAQkuC,SAC7Bh2B,EAAIguC,SAASztD,EAAMI,EAAKiL,EAAOC,IAIjCmU,EAAIiB,UAAYloB,KAAK+O,QAAQ+tC,WAAa,QAC1C71B,EAAIuB,UAAYumB,GAAS,SACzB9nB,EAAIwB,aAAeg0C,GAAY,QAC/B,KAAK,GAAIl3D,GAAI,EAAOwvD,EAAJxvD,EAAeA,IAC7B0hB,EAAIyB,SAAS6d,EAAMhhC,GAAI8M,EAAGmgD,GAC1BA,GAASzV,IAMfx5C,EAAKkQ,UAAUqoD,YAAc,SAAS70C,GACpC,GAAmB1gB,SAAfvG,KAAK2oB,MAAqB,CAC5B1B,EAAIQ,MAAQznB,KAAKizC,SAAW,QAAU,IAAMjzC,KAAK+O,QAAQguC,SAAW,MAAQ/8C,KAAK+O,QAAQiuC,QAMzF,KAAK,GAJDzW,GAAQvmC,KAAK2oB,MAAM1gB,MAAM,MACzB6K,GAAU7O,OAAOjE,KAAK+O,QAAQguC,UAAY,GAAKxW,EAAM7gC,OACrDmN,EAAQ,EAEHtN,EAAI,EAAG+7B,EAAOiF,EAAM7gC,OAAY47B,EAAJ/7B,EAAUA,IAC7CsN,EAAQ5N,KAAKiI,IAAI2F,EAAOoU,EAAI+tC,YAAYzuB,EAAMhhC,IAAIsN,MAGpD,QAAQA,MAASA,EAAOC,OAAUA,GAGlC,OAAQD,MAAS,EAAGC,OAAU,IAUlCvP,EAAKkQ,UAAU+6C,OAAS,WACtB,MAAmBjoD,UAAfvG,KAAK6S,MACD7S,KAAKqS,EAAIrS,KAAK6S,MAAO7S,KAAK00D,iBAAoB10D,KAAKmjD,cAAc9wC,GACjErS,KAAKqS,EAAIrS,KAAK6S,MAAO7S,KAAK00D,gBAAoB10D,KAAKojD,kBAAkB/wC,GACrErS,KAAKsS,EAAItS,KAAK8S,OAAO9S,KAAK00D,iBAAoB10D,KAAKmjD,cAAc7wC,GACjEtS,KAAKsS,EAAItS,KAAK8S,OAAO9S,KAAK00D,gBAAoB10D,KAAKojD,kBAAkB9wC,GAGpE,GAQX/O,EAAKkQ,UAAUkpD,OAAS,WACtB,MAAQ38D,MAAKqS,GAAKrS,KAAKmjD,cAAc9wC,GAC7BrS,KAAKqS,EAAIrS,KAAKojD,kBAAkB/wC,GAChCrS,KAAKsS,GAAKtS,KAAKmjD,cAAc7wC,GAC7BtS,KAAKsS,EAAItS,KAAKojD,kBAAkB9wC,GAW1C/O,EAAKkQ,UAAU86C,eAAiB,SAASpxC,EAAMgmC,EAAcC,GAC3DpjD,KAAK00D,gBAAkB,EAAIv3C,EAC3Bnd,KAAKu5D,aAAep8C,EACpBnd,KAAKmjD,cAAgBA,EACrBnjD,KAAKojD,kBAAoBA,GAS3B7/C,EAAKkQ,UAAU8vB,SAAW,SAASpmB,GACjCnd,KAAK00D,gBAAkB,EAAIv3C,EAC3Bnd,KAAKu5D,aAAep8C,GAQtB5Z,EAAKkQ,UAAUmpD,cAAgB,WAC7B58D,KAAK84D,GAAK,EACV94D,KAAK+4D,GAAK,GASZx1D,EAAKkQ,UAAUopD,eAAiB,SAASC,GACvC,GAAIC,GAAe/8D,KAAK84D,GAAK94D,KAAK84D,GAAKgE,CAEvC98D,MAAK84D,GAAK7zD,KAAK8qB,KAAKgtC,EAAa/8D,KAAK+O,QAAQ0tC,MAC9CsgB,EAAe/8D,KAAK+4D,GAAK/4D,KAAK+4D,GAAK+D,EAEnC98D,KAAK+4D,GAAK9zD,KAAK8qB,KAAKgtC,EAAa/8D,KAAK+O,QAAQ0tC,OAGhD58C,EAAOD,QAAU2D,GAKb,SAAS1D,GAWb,QAAS2D,GAAMsW,EAAWzH,EAAGC,EAAGmX,EAAMjc,GAElCxN,KAAK8Z,UADHA,EACeA,EAGAjI,SAASqjB,KAId3uB,SAAViH,IACe,gBAAN6E,IACT7E,EAAQ6E,EACRA,EAAI9L,QACqB,gBAATkjB,IAChBjc,EAAQic,EACRA,EAAOljB,QAGPiH,GACEsvC,UAAW,QACXC,SAAU,GACVC,SAAU,UACVnyC,OACEkB,OAAQ,OACRD,WAAY,aAMpB9L,KAAKqS,EAAI,EACTrS,KAAKsS,EAAI,EACTtS,KAAKkkB,QAAU,EAEL3d,SAAN8L,GAAyB9L,SAAN+L,GACrBtS,KAAKssD,YAAYj6C,EAAGC,GAET/L,SAATkjB,GACFzpB,KAAKusD,QAAQ9iC,GAIfzpB,KAAKwf,MAAQ3N,SAASM,cAAc,MACpC,IAAI6qD,GAAYh9D,KAAKwf,MAAMhS,KAC3BwvD,GAAUl5C,SAAW,WACrBk5C,EAAUllC,WAAa,SACvBklC,EAAUjxD,OAAS,aAAeyB,EAAM3C,MAAMkB,OAC9CixD,EAAUnyD,MAAQ2C,EAAMsvC,UACxBkgB,EAAUjgB,SAAWvvC,EAAMuvC,SAAW,KACtCigB,EAAUC,WAAazvD,EAAMwvC,SAC7BggB,EAAU94C,QAAUlkB,KAAKkkB,QAAU,KACnC84C,EAAUn9C,gBAAkBrS,EAAM3C,MAAMiB,WACxCkxD,EAAU5sC,aAAe,MACzB4sC,EAAU3qC,gBAAkB,MAC5B2qC,EAAUE,mBAAqB,MAC/BF,EAAU3sC,UAAY,wCACtB2sC,EAAUG,WAAa,SACvBn9D,KAAK8Z,UAAU/H,YAAY/R,KAAKwf,OAOlChc,EAAMiQ,UAAU64C,YAAc,SAASj6C,EAAGC,GACxCtS,KAAKqS,EAAI2Y,SAAS3Y,GAClBrS,KAAKsS,EAAI0Y,SAAS1Y,IAOpB9O,EAAMiQ,UAAU84C,QAAU,SAASv8B,GAC7BA,YAAmB2c,UACrB3sC,KAAKwf,MAAM2E,UAAY,GACvBnkB,KAAKwf,MAAMzN,YAAYie,IAGvBhwB,KAAKwf,MAAM2E,UAAY6L,GAQ3BxsB,EAAMiQ,UAAUi0B,KAAO,SAAUA,GAK/B,GAJanhC,SAATmhC,IACFA,GAAO,GAGLA,EAAM,CACR,GAAI50B,GAAS9S,KAAKwf,MAAMuF,aACpBlS,EAAS7S,KAAKwf,MAAME,YACpBqV,EAAY/0B,KAAKwf,MAAM1V,WAAWib,aAClCq4C,EAAWp9D,KAAKwf,MAAM1V,WAAW4V,YAEjC9X,EAAO5H,KAAKsS,EAAIQ,CAChBlL,GAAMkL,EAAS9S,KAAKkkB,QAAU6Q,IAChCntB,EAAMmtB,EAAYjiB,EAAS9S,KAAKkkB,SAE9Btc,EAAM5H,KAAKkkB,UACbtc,EAAM5H,KAAKkkB,QAGb,IAAI1c,GAAOxH,KAAKqS,CACZ7K,GAAOqL,EAAQ7S,KAAKkkB,QAAUk5C,IAChC51D,EAAO41D,EAAWvqD,EAAQ7S,KAAKkkB,SAE7B1c,EAAOxH,KAAKkkB,UACd1c,EAAOxH,KAAKkkB,SAGdlkB,KAAKwf,MAAMhS,MAAMhG,KAAOA,EAAO,KAC/BxH,KAAKwf,MAAMhS,MAAM5F,IAAMA,EAAM,KAC7B5H,KAAKwf,MAAMhS,MAAMsqB,WAAa,cAG9B93B,MAAKynC,QAOTjkC,EAAMiQ,UAAUg0B,KAAO,WACrBznC,KAAKwf,MAAMhS,MAAMsqB,WAAa,UAGhCj4B,EAAOD,QAAU4D,GAKb,SAAS3D,EAAQD,GAarB,QAASy9D,GAAUrqD,GAEjB,MADAkd,GAAMld,EACCsqD,IAoCT,QAAS96B,KACPn6B,EAAQ,EACR5H,EAAIyvB,EAAI5K,OAAO,GAQjB,QAASiD,KACPlgB,IACA5H,EAAIyvB,EAAI5K,OAAOjd,GAOjB,QAASk1D,KACP,MAAOrtC,GAAI5K,OAAOjd,EAAQ,GAS5B,QAASm1D,GAAe/8D,GACtB,MAAOg9D,GAAkBnvD,KAAK7N,GAShC,QAASi9D,GAAOp4D,EAAGa,GAKjB,GAJKb,IACHA,MAGEa,EACF,IAAK,GAAIqQ,KAAQrQ,GACXA,EAAEN,eAAe2Q,KACnBlR,EAAEkR,GAAQrQ,EAAEqQ,GAIlB,OAAOlR,GAeT,QAAS6S,GAAS+K,EAAKioB,EAAM/jC,GAG3B,IAFA,GAAIuG,GAAOw9B,EAAKljC,MAAM,KAClB01D,EAAIz6C,EACDvV,EAAKjI,QAAQ,CAClB,GAAIkD,GAAM+E,EAAKiE,OACXjE,GAAKjI,QAEFi4D,EAAE/0D,KACL+0D,EAAE/0D,OAEJ+0D,EAAIA,EAAE/0D,IAIN+0D,EAAE/0D,GAAOxB,GAWf,QAASw2D,GAAQpsC,EAAOuzB,GAOtB,IANA,GAAIx/C,GAAGC,EACH40B,EAAU,KAGVyjC,GAAUrsC,GACV9xB,EAAO8xB,EACJ9xB,EAAKmlC,QACVg5B,EAAO31D,KAAKxI,EAAKmlC,QACjBnlC,EAAOA,EAAKmlC,MAId,IAAInlC,EAAK88C,MACP,IAAKj3C,EAAI,EAAGC,EAAM9F,EAAK88C,MAAM92C,OAAYF,EAAJD,EAASA,IAC5C,GAAIw/C,EAAK1kD,KAAOX,EAAK88C,MAAMj3C,GAAGlF,GAAI,CAChC+5B,EAAU16B,EAAK88C,MAAMj3C,EACrB,OAiBN,IAZK60B,IAEHA,GACE/5B,GAAI0kD,EAAK1kD,IAEPmxB,EAAMuzB,OAER3qB,EAAQ0jC,KAAOJ,EAAMtjC,EAAQ0jC,KAAMtsC,EAAMuzB,QAKxCx/C,EAAIs4D,EAAOn4D,OAAS,EAAGH,GAAK,EAAGA,IAAK,CACvC,GAAIoH,GAAIkxD,EAAOt4D,EAEVoH,GAAE6vC,QACL7vC,EAAE6vC,UAE4B,IAA5B7vC,EAAE6vC,MAAM91C,QAAQ0zB,IAClBztB,EAAE6vC,MAAMt0C,KAAKkyB,GAKb2qB,EAAK+Y,OACP1jC,EAAQ0jC,KAAOJ,EAAMtjC,EAAQ0jC,KAAM/Y,EAAK+Y,OAS5C,QAASC,GAAQvsC,EAAO26B,GAKtB,GAJK36B,EAAM6rB,QACT7rB,EAAM6rB,UAER7rB,EAAM6rB,MAAMn1C,KAAKikD,GACb36B,EAAM26B,KAAM,CACd,GAAI2R,GAAOJ,KAAUlsC,EAAM26B,KAC3BA,GAAK2R,KAAOJ,EAAMI,EAAM3R,EAAK2R,OAajC,QAASE,GAAWxsC,EAAOlI,EAAMC,EAAI1iB,EAAMi3D,GACzC,GAAI3R,IACF7iC,KAAMA,EACNC,GAAIA,EACJ1iB,KAAMA,EAQR,OALI2qB,GAAM26B,OACRA,EAAK2R,KAAOJ,KAAUlsC,EAAM26B,OAE9BA,EAAK2R,KAAOJ,EAAMvR,EAAK2R,SAAYA,GAE5B3R,EAOT,QAAS8R,KAKP,IAJAC,EAAYC,EAAUC,KACtBC,EAAQ,GAGI,KAAL59D,GAAiB,KAALA,GAAkB,MAALA,GAAkB,MAALA,GAC3C8nB,GAGF,GAAG,CACD,GAAI+1C,IAAY,CAGhB,IAAS,KAAL79D,EAAU,CAGZ,IADA,GAAI8E,GAAI8C,EAAQ,EACQ,KAAjB6nB,EAAI5K,OAAO/f,IAA8B,KAAjB2qB,EAAI5K,OAAO/f,IACxCA,GAEF,IAAqB,MAAjB2qB,EAAI5K,OAAO/f,IAA+B,IAAjB2qB,EAAI5K,OAAO/f,GAAU,CAEhD,KAAY,IAAL9E,GAAgB,MAALA,GAChB8nB,GAEF+1C,IAAY,GAGhB,GAAS,KAAL79D,GAA6B,KAAjB88D,IAAsB,CAEpC,KAAY,IAAL98D,GAAgB,MAALA,GAChB8nB,GAEF+1C,IAAY,EAEd,GAAS,KAAL79D,GAA6B,KAAjB88D,IAAsB,CAEpC,KAAY,IAAL98D,GAAS,CACd,GAAS,KAALA,GAA6B,KAAjB88D,IAAsB,CAEpCh1C,IACAA,GACA,OAGAA,IAGJ+1C,GAAY,EAId,KAAY,KAAL79D,GAAiB,KAALA,GAAkB,MAALA,GAAkB,MAALA,GAC3C8nB,UAGG+1C,EAGP,IAAS,IAAL79D,EAGF,YADAy9D,EAAYC,EAAUI,UAKxB,IAAIC,GAAK/9D,EAAI88D,GACb,IAAIkB,EAAWD,GAKb,MAJAN,GAAYC,EAAUI,UACtBF,EAAQG,EACRj2C,QACAA,IAKF,IAAIk2C,EAAWh+D,GAIb,MAHAy9D,GAAYC,EAAUI,UACtBF,EAAQ59D,MACR8nB,IAMF,IAAIi1C,EAAe/8D,IAAW,KAALA,EAAU,CAIjC,IAHA49D,GAAS59D,EACT8nB,IAEOi1C,EAAe/8D,IACpB49D,GAAS59D,EACT8nB,GAYF,OAVa,SAAT81C,EACFA,GAAQ,EAEQ,QAATA,EACPA,GAAQ,EAEA55D,MAAMR,OAAOo6D,MACrBA,EAAQp6D,OAAOo6D,SAEjBH,EAAYC,EAAUO,YAKxB,GAAS,KAALj+D,EAAU,CAEZ,IADA8nB,IACY,IAAL9nB,IAAiB,KAALA,GAAkB,KAALA,GAA6B,KAAjB88D,MAC1Cc,GAAS59D,EACA,KAALA,GACF8nB,IAEFA,GAEF,IAAS,KAAL9nB,EACF,KAAMk+D,GAAe,2BAIvB,OAFAp2C,UACA21C,EAAYC,EAAUO,YAMxB,IADAR,EAAYC,EAAUS,QACV,IAALn+D,GACL49D,GAAS59D,EACT8nB,GAEF,MAAM,IAAIxO,aAAY,yBAA2B8kD,EAAKR,EAAO,IAAM,KAOrE,QAASf,KACP,GAAI9rC,KAwBJ,IAtBAgR,IACAy7B,IAGa,UAATI,IACF7sC,EAAMstC,QAAS,EACfb,MAIW,SAATI,GAA6B,WAATA,KACtB7sC,EAAM3qB,KAAOw3D,EACbJ,KAIEC,GAAaC,EAAUO,aACzBltC,EAAMnxB,GAAKg+D,EACXJ,KAIW,KAATI,EACF,KAAMM,GAAe,2BAQvB,IANAV,IAGAc,EAAgBvtC,GAGH,KAAT6sC,EACF,KAAMM,GAAe,2BAKvB,IAHAV,IAGc,KAAVI,EACF,KAAMM,GAAe,uBASvB,OAPAV,WAGOzsC,GAAMuzB,WACNvzB,GAAM26B,WACN36B,GAAMA,MAENA,EAOT,QAASutC,GAAiBvtC,GACxB,KAAiB,KAAV6sC,GAAyB,KAATA,GACrBW,EAAextC,GACF,KAAT6sC,GACFJ,IAWN,QAASe,GAAextC,GAEtB,GAAIytC,GAAWC,EAAc1tC,EAC7B,IAAIytC,EAIF,WAFAE,GAAU3tC,EAAOytC,EAMnB,IAAInB,GAAOsB,EAAwB5tC,EACnC,KAAIssC,EAAJ,CAKA,GAAII,GAAaC,EAAUO,WACzB,KAAMC,GAAe,sBAEvB,IAAIt+D,GAAKg+D,CAGT,IAFAJ,IAEa,KAATI,EAAc,CAGhB,GADAJ,IACIC,GAAaC,EAAUO,WACzB,KAAMC,GAAe,sBAEvBntC,GAAMnxB,GAAMg+D,EACZJ,QAIAoB,GAAmB7tC,EAAOnxB,IAS9B,QAAS6+D,GAAe1tC,GACtB,GAAIytC,GAAW,IAgBf,IAba,YAATZ,IACFY,KACAA,EAASp4D,KAAO,WAChBo3D,IAGIC,GAAaC,EAAUO,aACzBO,EAAS5+D,GAAKg+D,EACdJ,MAKS,KAATI,EAAc,CAehB,GAdAJ,IAEKgB,IACHA,MAEFA,EAASp6B,OAASrT,EAClBytC,EAASla,KAAOvzB,EAAMuzB,KACtBka,EAAS9S,KAAO36B,EAAM26B,KACtB8S,EAASztC,MAAQA,EAAMA,MAGvButC,EAAgBE,GAGH,KAATZ,EACF,KAAMM,GAAe,2BAEvBV,WAGOgB,GAASla,WACTka,GAAS9S,WACT8S,GAASztC,YACTytC,GAASp6B,OAGXrT,EAAM8tC,YACT9tC,EAAM8tC,cAER9tC,EAAM8tC,UAAUp3D,KAAK+2D,GAGvB,MAAOA,GAYT,QAASG,GAAyB5tC,GAEhC,MAAa,QAAT6sC,GACFJ,IAGAzsC,EAAMuzB,KAAOwa,IACN,QAES,QAATlB,GACPJ,IAGAzsC,EAAM26B,KAAOoT,IACN,QAES,SAATlB,GACPJ,IAGAzsC,EAAMA,MAAQ+tC,IACP,SAGF,KAQT,QAASF,GAAmB7tC,EAAOnxB,GAEjC,GAAI0kD,IACF1kD,GAAIA,GAEFy9D,EAAOyB,GACPzB,KACF/Y,EAAK+Y,KAAOA,GAEdF,EAAQpsC,EAAOuzB,GAGfoa,EAAU3tC,EAAOnxB,GAQnB,QAAS8+D,GAAU3tC,EAAOlI,GACxB,KAAgB,MAAT+0C,GAA0B,MAATA,GAAe,CACrC,GAAI90C,GACA1iB,EAAOw3D,CACXJ,IAEA,IAAIgB,GAAWC,EAAc1tC,EAC7B,IAAIytC,EACF11C,EAAK01C,MAEF,CACH,GAAIf,GAAaC,EAAUO,WACzB,KAAMC,GAAe,kCAEvBp1C,GAAK80C,EACLT,EAAQpsC,GACNnxB,GAAIkpB,IAEN00C,IAIF,GAAIH,GAAOyB,IAGPpT,EAAO6R,EAAWxsC,EAAOlI,EAAMC,EAAI1iB,EAAMi3D,EAC7CC,GAAQvsC,EAAO26B,GAEf7iC,EAAOC,GASX,QAASg2C,KAGP,IAFA,GAAIzB,GAAO,KAEK,KAATO,GAAc,CAGnB,IAFAJ,IACAH,KACiB,KAAVO,GAAyB,KAATA,GAAc,CACnC,GAAIH,GAAaC,EAAUO,WACzB,KAAMC,GAAe,0BAEvB,IAAInoD,GAAO6nD,CAGX,IADAJ,IACa,KAATI,EACF,KAAMM,GAAe,wBAIvB,IAFAV,IAEIC,GAAaC,EAAUO,WACzB,KAAMC,GAAe,2BAEvB,IAAIv3D,GAAQi3D,CACZlmD,GAAS2lD,EAAMtnD,EAAMpP,GAErB62D,IACY,KAARI,GACFJ,IAIJ,GAAa,KAATI,EACF,KAAMM,GAAe,qBAEvBV,KAGF,MAAOH,GAQT,QAASa,GAAea,GACtB,MAAO,IAAIzlD,aAAYylD,EAAU,UAAYX,EAAKR,EAAO,IAAM,WAAah2D,EAAQ,KAStF,QAASw2D,GAAMp1C,EAAMg2C,GACnB,MAAQh2C,GAAK/jB,QAAU+5D,EAAah2C,EAAQA,EAAKze,OAAO,EAAG,IAAM,MASnE,QAAS00D,GAASC,EAAQC,EAAQnmD,GAC5BzT,MAAMC,QAAQ05D,GAChBA,EAAOp3D,QAAQ,SAAUs3D,GACnB75D,MAAMC,QAAQ25D,GAChBA,EAAOr3D,QAAQ,SAAUu3D,GACvBrmD,EAAGomD,EAAOC,KAIZrmD,EAAGomD,EAAOD,KAKV55D,MAAMC,QAAQ25D,GAChBA,EAAOr3D,QAAQ,SAAUu3D,GACvBrmD,EAAGkmD,EAAQG,KAIbrmD,EAAGkmD,EAAQC,GAWjB,QAASxZ,GAAYpzC,GA+BjB,QAAS+sD,GAAYC,GACnB,GAAIC,IACF32C,KAAM02C,EAAQ12C,KACdC,GAAIy2C,EAAQz2C,GAId,OAFAm0C,GAAMuC,EAAWD,EAAQlC,MACzBmC,EAAUzyD,MAAyB,MAAhBwyD,EAAQn5D,KAAgB,QAAU,OAC9Co5D,EApCX,GAAI9Z,GAAUkX,EAASrqD,GACnBktD,GACF1jB,SACAa,SACAtuC,WAkFF,OA9EIo3C,GAAQ3J,OACV2J,EAAQ3J,MAAMj0C,QAAQ,SAAU43D,GAC9B,GAAIC,IACF//D,GAAI8/D,EAAQ9/D,GACZsoB,MAAOxkB,OAAOg8D,EAAQx3C,OAASw3C,EAAQ9/D,IAEzCq9D,GAAM0C,EAAWD,EAAQrC,MACrBsC,EAAUvjB,QACZujB,EAAUxjB,MAAQ,SAEpBsjB,EAAU1jB,MAAMt0C,KAAKk4D,KAKrBja,EAAQ9I,OAgBV8I,EAAQ9I,MAAM90C,QAAQ,SAAUy3D,GAC9B,GAAI12C,GAAMC,CAERD,GADE02C,EAAQ12C,eAAgBhjB,QACnB05D,EAAQ12C,KAAKkzB,OAIlBn8C,GAAI2/D,EAAQ12C,MAKdC,EADEy2C,EAAQz2C,aAAcjjB,QACnB05D,EAAQz2C,GAAGizB,OAIdn8C,GAAI2/D,EAAQz2C,IAIZy2C,EAAQ12C,eAAgBhjB,SAAU05D,EAAQ12C,KAAK+zB,OACjD2iB,EAAQ12C,KAAK+zB,MAAM90C,QAAQ,SAAU83D,GACnC,GAAIJ,GAAYF,EAAYM,EAC5BH,GAAU7iB,MAAMn1C,KAAK+3D,KAIzBP,EAASp2C,EAAMC,EAAI,SAAUD,EAAMC,GACjC,GAAI82C,GAAUrC,EAAWkC,EAAW52C,EAAKjpB,GAAIkpB,EAAGlpB,GAAI2/D,EAAQn5D,KAAMm5D,EAAQlC,MACtEmC,EAAYF,EAAYM,EAC5BH,GAAU7iB,MAAMn1C,KAAK+3D,KAGnBD,EAAQz2C,aAAcjjB,SAAU05D,EAAQz2C,GAAG8zB,OAC7C2iB,EAAQz2C,GAAG8zB,MAAM90C,QAAQ,SAAU83D,GACjC,GAAIJ,GAAYF,EAAYM,EAC5BH,GAAU7iB,MAAMn1C,KAAK+3D,OAOzB9Z,EAAQ2X,OACVoC,EAAUnxD,QAAUo3C,EAAQ2X,MAGvBoC,EAnyBT,GAAI/B,IACFC,KAAO,EACPG,UAAY,EACZG,WAAY,EACZE,QAAU,GAIRH,GACF6B,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,KAAK,EAELC,MAAM,EACNC,MAAM,GAGJ5wC,EAAM,GACN7nB,EAAQ,EACR5H,EAAI,GACJ49D,EAAQ,GACRH,EAAYC,EAAUC,KAmCtBX,EAAoB,iBA2uBxB79D,GAAQy9D,SAAWA,EACnBz9D,EAAQwmD,WAAaA,GAKjB,SAASvmD,EAAQD,GAGrB,QAAS2mD,GAAWwa,EAAWhyD,GAC7B,GAAIsuC,MACAb,IACJx8C,MAAK+O,SACHsuC,OACEO,cAAc,GAEhBpB,OACEwkB,eAAe,EACfp2D,YAAY,IAIArE,SAAZwI,IACF/O,KAAK+O,QAAQytC,MAAqB,cAAIztC,EAAQiyD,eAAgB,EAC9DhhE,KAAK+O,QAAQytC,MAAkB,WAAOztC,EAAQnE,YAAgB,EAC9D5K,KAAK+O,QAAQsuC,MAAoB,aAAKtuC,EAAQ6uC,cAAgB,EAKhE,KAAK,GAFDqjB,GAASF,EAAU1jB,MACnB6jB,EAASH,EAAUvkB,MACdj3C,EAAI,EAAGA,EAAI07D,EAAOv7D,OAAQH,IAAK,CACtC,GAAI4mD,MACAgV,EAAQF,EAAO17D,EACnB4mD,GAAS,GAAIgV,EAAM9gE,GACnB8rD,EAAW,KAAIgV,EAAMC,OACrBjV,EAAS,GAAIgV,EAAMx3D,OACnBwiD,EAAiB,WAAIgV,EAAMvmB,WAG3BuR,EAAY,MAAIgV,EAAMt2D,MACtBshD,EAAmB,aAAsB5lD,SAAlB4lD,EAAY,OAAkB,EAAQnsD,KAAK+O,QAAQ6uC,aAC1EP,EAAMn1C,KAAKikD,GAGb,IAAK,GAAI5mD,GAAI,EAAGA,EAAI27D,EAAOx7D,OAAQH,IAAK,CACtC,GAAIw/C,MACAsc,EAAQH,EAAO37D,EACnBw/C,GAAS,GAAIsc,EAAMhhE,GACnB0kD,EAAiB,WAAIsc,EAAMzmB,WAC3BmK,EAAQ,EAAIsc,EAAMhvD,EAClB0yC,EAAQ,EAAIsc,EAAM/uD,EAClByyC,EAAY,MAAIsc,EAAM14C,MAEpBo8B,EAAY,MADuB,GAAjC/kD,KAAK+O,QAAQytC,MAAM5xC,WACLy2D,EAAMx2D,MAGUtE,SAAhB86D,EAAMx2D,OAAuBiB,WAAWu1D,EAAMx2D,MAAOkB,OAAOs1D,EAAMx2D,OAAStE,OAE7Fw+C,EAAa,OAAIsc,EAAM1uD,KACvBoyC,EAAqB,eAAI/kD,KAAK+O,QAAQytC,MAAMwkB,cAC5Cjc,EAAqB,eAAI/kD,KAAK+O,QAAQytC,MAAMwkB,cAC5CxkB,EAAMt0C,KAAK68C,GAGb,OAAQvI,MAAMA,EAAOa,MAAMA,GAG7Bz9C,EAAQ2mD,WAAaA,GAIjB,SAAS1mD,EAAQD,EAASM,GAI9BL,EAAOD,QAA6B,mBAAX6H,SAA2BA,OAAe,QAAKvH,EAAoB,KAKxF,SAASL,EAAQD,EAASM,GAK5BL,EAAOD,QADa,mBAAX6H,QACQA,OAAe,QAAKvH,EAAoB,IAGxC,WACf,KAAM0D,OAAM,+DAOZ,SAAS/D,EAAQD,EAASM,GAmB9B,QAASu2B,MAjBT,GAAIxZ,GAAU/c,EAAoB,IAC9BmlC,EAASnlC,EAAoB,IAC7BS,EAAOT,EAAoB,GAK3BukD,GAJUvkD,EAAoB,GACnBA,EAAoB,GACvBA,EAAoB,IAClBA,EAAoB,IAClBA,EAAoB,KAChCyB,EAAWzB,EAAoB,GAYnC+c,GAAQwZ,EAAKhjB,WASbgjB,EAAKhjB,UAAUwhB,QAAU,SAAUnb,GACjC9Z,KAAKmwB,OAELnwB,KAAKmwB,IAAIzwB,KAAuBmS,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIrkB,WAAuB+F,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI2U,mBAAuBjzB,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI8X,qBAAuBp2B,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIgI,gBAAuBtmB,SAASM,cAAc,OACvDnS,KAAKmwB,IAAImxC,cAAuBzvD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIoxC,eAAuB1vD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI9D,OAAuBxa,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI3oB,KAAuBqK,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI5I,MAAuB1V,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIvoB,IAAuBiK,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI3M,OAAuB3R,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIqxC,UAAuB3vD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIsxC,aAAuB5vD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIuxC,cAAuB7vD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIwxC,iBAAuB9vD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAIyxC,eAAuB/vD,SAASM,cAAc,OACvDnS,KAAKmwB,IAAI0xC,kBAAuBhwD,SAASM,cAAc,OAEvDnS,KAAKmwB,IAAIzwB,KAAKqI,UAA4B,oBAC1C/H,KAAKmwB,IAAIrkB,WAAW/D,UAAsB,sBAC1C/H,KAAKmwB,IAAI2U,mBAAmB/8B,UAAc,+BAC1C/H,KAAKmwB,IAAI8X,qBAAqBlgC,UAAY,iCAC1C/H,KAAKmwB,IAAIgI,gBAAgBpwB,UAAiB,kBAC1C/H,KAAKmwB,IAAImxC,cAAcv5D,UAAmB,gBAC1C/H,KAAKmwB,IAAIoxC,eAAex5D,UAAkB,iBAC1C/H,KAAKmwB,IAAIvoB,IAAIG,UAA6B,eAC1C/H,KAAKmwB,IAAI3M,OAAOzb,UAA0B,kBAC1C/H,KAAKmwB,IAAI3oB,KAAKO,UAA4B,UAC1C/H,KAAKmwB,IAAI9D,OAAOtkB,UAA0B,UAC1C/H,KAAKmwB,IAAI5I,MAAMxf,UAA2B,UAC1C/H,KAAKmwB,IAAIqxC,UAAUz5D,UAAuB,aAC1C/H,KAAKmwB,IAAIsxC,aAAa15D,UAAoB,gBAC1C/H,KAAKmwB,IAAIuxC,cAAc35D,UAAmB,aAC1C/H,KAAKmwB,IAAIwxC,iBAAiB55D,UAAgB,gBAC1C/H,KAAKmwB,IAAIyxC,eAAe75D,UAAkB,aAC1C/H,KAAKmwB,IAAI0xC,kBAAkB95D,UAAe,gBAE1C/H,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAIrkB,YACnC9L,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAI2U,oBACnC9kC,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAI8X,sBACnCjoC,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAIgI,iBACnCn4B,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAImxC,eACnCthE,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAIoxC,gBACnCvhE,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAIvoB,KACnC5H,KAAKmwB,IAAIzwB,KAAKqS,YAAY/R,KAAKmwB,IAAI3M,QAEnCxjB,KAAKmwB,IAAIgI,gBAAgBpmB,YAAY/R,KAAKmwB,IAAI9D,QAC9CrsB,KAAKmwB,IAAImxC,cAAcvvD,YAAY/R,KAAKmwB,IAAI3oB,MAC5CxH,KAAKmwB,IAAIoxC,eAAexvD,YAAY/R,KAAKmwB,IAAI5I,OAE7CvnB,KAAKmwB,IAAIgI,gBAAgBpmB,YAAY/R,KAAKmwB,IAAIqxC,WAC9CxhE,KAAKmwB,IAAIgI,gBAAgBpmB,YAAY/R,KAAKmwB,IAAIsxC,cAC9CzhE,KAAKmwB,IAAImxC,cAAcvvD,YAAY/R,KAAKmwB,IAAIuxC,eAC5C1hE,KAAKmwB,IAAImxC,cAAcvvD,YAAY/R,KAAKmwB,IAAIwxC,kBAC5C3hE,KAAKmwB,IAAIoxC,eAAexvD,YAAY/R,KAAKmwB,IAAIyxC,gBAC7C5hE,KAAKmwB,IAAIoxC,eAAexvD,YAAY/R,KAAKmwB,IAAI0xC,mBAE7C7hE,KAAK6T,GAAG,cAAe7T,KAAK2hB,OAAO0T,KAAKr1B,OACxCA,KAAK6T,GAAG,QAAS7T,KAAK4+B,SAASvJ,KAAKr1B,OACpCA,KAAK6T,GAAG,QAAS7T,KAAK6+B,SAASxJ,KAAKr1B,OACpCA,KAAK6T,GAAG,YAAa7T,KAAKu+B,aAAalJ,KAAKr1B,OAC5CA,KAAK6T,GAAG,OAAQ7T,KAAKw+B,QAAQnJ,KAAKr1B,MAElC,IAAIyU,GAAKzU,IACTA,MAAK6T,GAAG,SAAU,SAAUu5C,GACtBA,GAAkC,GAApBA,EAAW15C,MAEtBe,EAAGqtD,eACNrtD,EAAGqtD,aAAejoD,WAAW,WAC3BpF,EAAGqtD,aAAe,KAClBrtD,EAAGkN,UACF,IAKLlN,EAAGkN,WAMP3hB,KAAK8D,OAASuhC,EAAOrlC,KAAKmwB,IAAIzwB,MAC5B6J,gBAAgB,IAElBvJ,KAAK+hE,YAEL,IAAIC,IACF,QAAS,QACT,MAAO,YAAa,OACpB,YAAa,OAAQ,UACrB,aAAc,iBAkChB,IAhCAA,EAAOz5D,QAAQ,SAAUiB,GACvB,GAAIR,GAAW,WACb,GAAIwQ,IAAQhQ,GAAO8K,OAAOtO,MAAMyN,UAAU6pB,MAAM/8B,KAAKkF,UAAW,GAC5DgP,GAAG+zC,YACL/zC,EAAGwZ,KAAK3V,MAAM7D,EAAI+E,GAGtB/E,GAAG3Q,OAAO+P,GAAGrK,EAAOR,GACpByL,EAAGstD,UAAUv4D,GAASR,IAIxBhJ,KAAK+F,OACHrG,QACAoM,cACAqsB,mBACAmpC,iBACAC,kBACAl1C,UACA7kB,QACA+f,SACA3f,OACA4b,UACAzX,UACAq7B,UAAW,EACX66B,aAAc,GAEhBjiE,KAAKq+B,SAELr+B,KAAKkiE,YAAc,GAGdpoD,EAAW,KAAM,IAAIlW,OAAM,wBAChCkW,GAAU/H,YAAY/R,KAAKmwB,IAAIzwB,OA4BjC+2B,EAAKhjB,UAAUD,WAAa,SAAUzE,GACpC,GAAIA,EAAS,CAEX,GAAIP,IAAU,QAAS,SAAU,YAAa,YAAa,aAAc,QAAS,MAAO,cAAe,aAAc,iBAAkB,cACxI7N,GAAKmF,gBAAgB0I,EAAQxO,KAAK+O,QAASA,GAEvC,eAAiB/O,MAAK+O,SACxBpN,EAASo2B,qBAAqB/3B,KAAKk1B,KAAMl1B,KAAK+O,QAAQumB,aAGpD,cAAgBvmB,KACdA,EAAQq4C,WACVpnD,KAAKqnD,UAAY,GAAI5C,GAAUzkD,KAAKmwB,IAAIzwB,MAGpCM,KAAKqnD,YACPrnD,KAAKqnD,UAAUzzC,gBACR5T,MAAKqnD,YAMlBrnD,KAAKmiE,kBASP,GALAniE,KAAKgC,WAAWuG,QAAQ,SAAU65D,GAChCA,EAAU5uD,WAAWzE,KAInBA,GAAWA,EAAQgH,MACrB,KAAM,IAAInS,OAAM,wEAIlB5D,MAAK2hB,UAOP8U,EAAKhjB,UAAU+0C,SAAW,WACxB,OAAQxoD,KAAKqnD,WAAarnD,KAAKqnD,UAAU2K,QAM3Cv7B,EAAKhjB,UAAUG,QAAU,WAEvB5T,KAAKgX,QAGLhX,KAAKgU,MAGLhU,KAAKqiE,kBAGDriE,KAAKmwB,IAAIzwB,KAAKoK,YAChB9J,KAAKmwB,IAAIzwB,KAAKoK,WAAW2H,YAAYzR,KAAKmwB,IAAIzwB,MAEhDM,KAAKmwB,IAAM,KAGPnwB,KAAKqnD,YACPrnD,KAAKqnD,UAAUzzC,gBACR5T,MAAKqnD,UAId,KAAK,GAAI79C,KAASxJ,MAAK+hE,UACjB/hE,KAAK+hE,UAAUl8D,eAAe2D,UACzBxJ,MAAK+hE,UAAUv4D,EAG1BxJ,MAAK+hE,UAAY,KACjB/hE,KAAK8D,OAAS,KAGd9D,KAAKgC,WAAWuG,QAAQ,SAAU65D,GAChCA,EAAUxuD,YAGZ5T,KAAKk1B,KAAO,MAQduB,EAAKhjB,UAAU+xB,cAAgB,SAAU/K,GACvC,IAAKz6B,KAAKm2B,WACR,KAAM,IAAIvyB,OAAM,yDAGlB5D,MAAKm2B,WAAWqP,cAAc/K,IAOhChE,EAAKhjB,UAAUgyB,cAAgB,WAC7B,IAAKzlC,KAAKm2B,WACR,KAAM,IAAIvyB,OAAM,yDAGlB,OAAO5D,MAAKm2B,WAAWsP,iBAQzBhP,EAAKhjB,UAAU09B,gBAAkB,WAC/B,MAAOnxC,MAAKo2B,SAAWp2B,KAAKo2B,QAAQ+a,uBAetC1a,EAAKhjB,UAAUuD,MAAQ,SAASsrD,KAEzBA,GAAQA,EAAKrgE,QAChBjC,KAAKw2B,SAAS,QAIX8rC,GAAQA,EAAK5tC,SAChB10B,KAAKu2B,UAAU,QAIZ+rC,GAAQA,EAAKvzD,WAChB/O,KAAKgC,WAAWuG,QAAQ,SAAU65D,GAChCA,EAAU5uD,WAAW4uD,EAAUxtC,kBAGjC50B,KAAKwT,WAAWxT,KAAK40B,kBAazB6B,EAAKhjB,UAAUujB,IAAM,SAASjoB,GAC5B,GAAIinB,GAAQh2B,KAAK62B,eAGjB,IAAoB,OAAhBb,EAAM9lB,OAAgC,OAAd8lB,EAAM7lB,IAAlC,CAIA,GAAI4mB,GAAWhoB,GAA+BxI,SAApBwI,EAAQgoB,QAAyBhoB,EAAQgoB,SAAU,CAC7E/2B,MAAKg2B,MAAMlC,SAASkC,EAAM9lB,MAAO8lB,EAAM7lB,IAAK4mB,KAQ9CN,EAAKhjB,UAAUojB,cAAgB,WAE7B,GAAID,GAAY52B,KAAKq3B,eAGjBnnB,EAAQ0mB,EAAUnrB,IAClB0E,EAAMymB,EAAU1pB,GACpB,IAAa,MAATgD,GAAwB,MAAPC,EAAa,CAChC,GAAI4iB,GAAY5iB,EAAIpJ,UAAYmJ,EAAMnJ,SACtB,IAAZgsB,IAEFA,EAAW,OAEb7iB,EAAQ,GAAI7L,MAAK6L,EAAMnJ,UAAuB,IAAXgsB,GACnC5iB,EAAM,GAAI9L,MAAK8L,EAAIpJ,UAAuB,IAAXgsB,GAGjC,OACE7iB,MAAOA,EACPC,IAAKA,IAuBTsmB,EAAKhjB,UAAUqjB,UAAY,SAAS5mB,EAAOC,EAAKpB,GAC9C,GAAIgoB,GAAWhoB,GAA+BxI,SAApBwI,EAAQgoB,QAAyBhoB,EAAQgoB,SAAU,CAC7E,IAAwB,GAApBtxB,UAAUC,OAAa,CACzB,GAAIswB,GAAQvwB,UAAU,EACtBzF,MAAKg2B,MAAMlC,SAASkC,EAAM9lB,MAAO8lB,EAAM7lB,IAAK4mB,OAG5C/2B,MAAKg2B,MAAMlC,SAAS5jB,EAAOC,EAAK4mB,IAcpCN,EAAKhjB,UAAUsU,OAAS,SAAS0S,EAAM1rB,GACrC,GAAIgkB,GAAW/yB,KAAKg2B,MAAM7lB,IAAMnQ,KAAKg2B,MAAM9lB,MACvC9B,EAAIzN,EAAKiG,QAAQ6zB,EAAM,QAAQ1zB,UAE/BmJ,EAAQ9B,EAAI2kB,EAAW,EACvB5iB,EAAM/B,EAAI2kB,EAAW,EACrBgE,EAAWhoB,GAA+BxI,SAApBwI,EAAQgoB,QAAyBhoB,EAAQgoB,SAAU,CAE7E/2B,MAAKg2B,MAAMlC,SAAS5jB,EAAOC,EAAK4mB,IAOlCN,EAAKhjB,UAAU8uD,UAAY,WACzB,GAAIvsC,GAAQh2B,KAAKg2B,MAAM6J,UACvB,QACE3vB,MAAO,GAAI7L,MAAK2xB,EAAM9lB,OACtBC,IAAK,GAAI9L,MAAK2xB,EAAM7lB,OAQxBsmB,EAAKhjB,UAAUkO,OAAS,WACtB,GAAI4iB,IAAU,EACVx1B,EAAU/O,KAAK+O,QACfhJ,EAAQ/F,KAAK+F,MACboqB,EAAMnwB,KAAKmwB,GAEf,IAAKA,EAAL,CAEAxuB,EAASu2B,kBAAkBl4B,KAAKk1B,KAAMl1B,KAAK+O,QAAQumB,aAGxB,OAAvBvmB,EAAQ+lB,aACVn0B,EAAKmH,aAAaqoB,EAAIzwB,KAAM,OAC5BiB,EAAKyH,gBAAgB+nB,EAAIzwB,KAAM,YAG/BiB,EAAKyH,gBAAgB+nB,EAAIzwB,KAAM,OAC/BiB,EAAKmH,aAAaqoB,EAAIzwB,KAAM,WAI9BywB,EAAIzwB,KAAK8N,MAAMunB,UAAYp0B,EAAKoJ,OAAOK,OAAO2E,EAAQgmB,UAAW,IACjE5E,EAAIzwB,KAAK8N,MAAMwnB,UAAYr0B,EAAKoJ,OAAOK,OAAO2E,EAAQimB,UAAW,IACjE7E,EAAIzwB,KAAK8N,MAAMqF,MAAQlS,EAAKoJ,OAAOK,OAAO2E,EAAQ8D,MAAO,IAGzD9M,EAAMgG,OAAOvE,MAAU2oB,EAAIgI,gBAAgB3H,YAAcL,EAAIgI,gBAAgBzY,aAAe,EAC5F3Z,EAAMgG,OAAOwb,MAASxhB,EAAMgG,OAAOvE,KACnCzB,EAAMgG,OAAOnE,KAAUuoB,EAAIgI,gBAAgBzH,aAAeP,EAAIgI,gBAAgBpT,cAAgB,EAC9Fhf,EAAMgG,OAAOyX,OAASzd,EAAMgG,OAAOnE,GACnC,IAAI46D,GAAkBryC,EAAIzwB,KAAKgxB,aAAeP,EAAIzwB,KAAKqlB,aACnD09C,EAAkBtyC,EAAIzwB,KAAK8wB,YAAcL,EAAIzwB,KAAKggB,WAIb,KAArCyQ,EAAIgI,gBAAgBpT,eACtBhf,EAAMgG,OAAOvE,KAAOzB,EAAMgG,OAAOnE,IACjC7B,EAAMgG,OAAOwb,MAASxhB,EAAMgG,OAAOvE,MAEP,IAA1B2oB,EAAIzwB,KAAKqlB,eACX09C,EAAkBD,GAKpBz8D,EAAMsmB,OAAOvZ,OAASqd,EAAI9D,OAAOqE,aACjC3qB,EAAMyB,KAAKsL,OAAWqd,EAAI3oB,KAAKkpB,aAC/B3qB,EAAMwhB,MAAMzU,OAAUqd,EAAI5I,MAAMmJ,aAChC3qB,EAAM6B,IAAIkL,OAAYqd,EAAIvoB,IAAImd,eAAoBhf,EAAMgG,OAAOnE,IAC/D7B,EAAMyd,OAAO1Q,OAASqd,EAAI3M,OAAOuB,eAAiBhf,EAAMgG,OAAOyX,MAM/D,IAAIiN,GAAgBxrB,KAAKiI,IAAInH,EAAMyB,KAAKsL,OAAQ/M,EAAMsmB,OAAOvZ,OAAQ/M,EAAMwhB,MAAMzU,QAC7E4vD,EAAa38D,EAAM6B,IAAIkL,OAAS2d,EAAgB1qB,EAAMyd,OAAO1Q,OAC/D0vD,EAAmBz8D,EAAMgG,OAAOnE,IAAM7B,EAAMgG,OAAOyX,MACrD2M,GAAIzwB,KAAK8N,MAAMsF,OAASnS,EAAKoJ,OAAOK,OAAO2E,EAAQ+D,OAAQ4vD,EAAa,MAGxE38D,EAAMrG,KAAKoT,OAASqd,EAAIzwB,KAAKgxB,aAC7B3qB,EAAM+F,WAAWgH,OAAS/M,EAAMrG,KAAKoT,OAAS0vD,CAC9C,IAAI7mC,GAAkB51B,EAAMrG,KAAKoT,OAAS/M,EAAM6B,IAAIkL,OAAS/M,EAAMyd,OAAO1Q,OACxE0vD,CACFz8D,GAAMoyB,gBAAgBrlB,OAAU6oB,EAChC51B,EAAMu7D,cAAcxuD,OAAY6oB,EAChC51B,EAAMw7D,eAAezuD,OAAW/M,EAAMu7D,cAAcxuD,OAGpD/M,EAAMrG,KAAKmT,MAAQsd,EAAIzwB,KAAK8wB,YAC5BzqB,EAAM+F,WAAW+G,MAAQ9M,EAAMrG,KAAKmT,MAAQ4vD,EAC5C18D,EAAMyB,KAAKqL,MAAQsd,EAAImxC,cAAc5hD,cAAkB3Z,EAAMgG,OAAOvE,KACpEzB,EAAMu7D,cAAczuD,MAAQ9M,EAAMyB,KAAKqL,MACvC9M,EAAMwhB,MAAM1U,MAAQsd,EAAIoxC,eAAe7hD,cAAgB3Z,EAAMgG,OAAOwb,MACpExhB,EAAMw7D,eAAe1uD,MAAQ9M,EAAMwhB,MAAM1U,KACzC,IAAI8vD,GAAc58D,EAAMrG,KAAKmT,MAAQ9M,EAAMyB,KAAKqL,MAAQ9M,EAAMwhB,MAAM1U,MAAQ4vD,CAC5E18D,GAAMsmB,OAAOxZ,MAAiB8vD,EAC9B58D,EAAMoyB,gBAAgBtlB,MAAQ8vD,EAC9B58D,EAAM6B,IAAIiL,MAAoB8vD,EAC9B58D,EAAMyd,OAAO3Q,MAAiB8vD,EAG9BxyC,EAAIrkB,WAAW0B,MAAMsF,OAAmB/M,EAAM+F,WAAWgH,OAAS,KAClEqd,EAAI2U,mBAAmBt3B,MAAMsF,OAAW/M,EAAM+F,WAAWgH,OAAS,KAClEqd,EAAI8X,qBAAqBz6B,MAAMsF,OAAS/M,EAAMoyB,gBAAgBrlB,OAAS,KACvEqd,EAAIgI,gBAAgB3qB,MAAMsF,OAAc/M,EAAMoyB,gBAAgBrlB,OAAS,KACvEqd,EAAImxC,cAAc9zD,MAAMsF,OAAgB/M,EAAMu7D,cAAcxuD,OAAS,KACrEqd,EAAIoxC,eAAe/zD,MAAMsF,OAAe/M,EAAMw7D,eAAezuD,OAAS,KAEtEqd,EAAIrkB,WAAW0B,MAAMqF,MAAmB9M,EAAM+F,WAAW+G,MAAQ,KACjEsd,EAAI2U,mBAAmBt3B,MAAMqF,MAAW9M,EAAMoyB,gBAAgBtlB,MAAQ,KACtEsd,EAAI8X,qBAAqBz6B,MAAMqF,MAAS9M,EAAM+F,WAAW+G,MAAQ,KACjEsd,EAAIgI,gBAAgB3qB,MAAMqF,MAAc9M,EAAMsmB,OAAOxZ,MAAQ,KAC7Dsd,EAAIvoB,IAAI4F,MAAMqF,MAA0B9M,EAAM6B,IAAIiL,MAAQ,KAC1Dsd,EAAI3M,OAAOhW,MAAMqF,MAAuB9M,EAAMyd,OAAO3Q,MAAQ,KAG7Dsd,EAAIrkB,WAAW0B,MAAMhG,KAAiB,IACtC2oB,EAAIrkB,WAAW0B,MAAM5F,IAAiB,IACtCuoB,EAAI2U,mBAAmBt3B,MAAMhG,KAAUzB,EAAMyB,KAAKqL,MAAQ9M,EAAMgG,OAAOvE,KAAQ,KAC/E2oB,EAAI2U,mBAAmBt3B,MAAM5F,IAAS,IACtCuoB,EAAI8X,qBAAqBz6B,MAAMhG,KAAO,IACtC2oB,EAAI8X,qBAAqBz6B,MAAM5F,IAAO7B,EAAM6B,IAAIkL,OAAS,KACzDqd,EAAIgI,gBAAgB3qB,MAAMhG,KAAYzB,EAAMyB,KAAKqL,MAAQ,KACzDsd,EAAIgI,gBAAgB3qB,MAAM5F,IAAY7B,EAAM6B,IAAIkL,OAAS,KACzDqd,EAAImxC,cAAc9zD,MAAMhG,KAAc,IACtC2oB,EAAImxC,cAAc9zD,MAAM5F,IAAc7B,EAAM6B,IAAIkL,OAAS,KACzDqd,EAAIoxC,eAAe/zD,MAAMhG,KAAczB,EAAMyB,KAAKqL,MAAQ9M,EAAMsmB,OAAOxZ,MAAS,KAChFsd,EAAIoxC,eAAe/zD,MAAM5F,IAAa7B,EAAM6B,IAAIkL,OAAS,KACzDqd,EAAIvoB,IAAI4F,MAAMhG,KAAwBzB,EAAMyB,KAAKqL,MAAQ,KACzDsd,EAAIvoB,IAAI4F,MAAM5F,IAAwB,IACtCuoB,EAAI3M,OAAOhW,MAAMhG,KAAqBzB,EAAMyB,KAAKqL,MAAQ,KACzDsd,EAAI3M,OAAOhW,MAAM5F,IAAsB7B,EAAM6B,IAAIkL,OAAS/M,EAAMoyB,gBAAgBrlB,OAAU,KAI1F9S,KAAK4iE,kBAGL,IAAI/4C,GAAS7pB,KAAK+F,MAAMqhC,SACG,WAAvBr4B,EAAQ+lB,cACVjL,GAAU5kB,KAAKiI,IAAIlN,KAAK+F,MAAMoyB,gBAAgBrlB,OAAS9S,KAAK+F,MAAMsmB,OAAOvZ,OACvE9S,KAAK+F,MAAMgG,OAAOnE,IAAM5H,KAAK+F,MAAMgG,OAAOyX,OAAQ,IAEtD2M,EAAI9D,OAAO7e,MAAMhG,KAAO,IACxB2oB,EAAI9D,OAAO7e,MAAM5F,IAAOiiB,EAAS,KACjCsG,EAAI3oB,KAAKgG,MAAMhG,KAAS,IACxB2oB,EAAI3oB,KAAKgG,MAAM5F,IAASiiB,EAAS,KACjCsG,EAAI5I,MAAM/Z,MAAMhG,KAAQ,IACxB2oB,EAAI5I,MAAM/Z,MAAM5F,IAAQiiB,EAAS,IAGjC,IAAIg5C,GAAwC,GAAxB7iE,KAAK+F,MAAMqhC,UAAiB,SAAW,GACvD07B,EAAmB9iE,KAAK+F,MAAMqhC,WAAapnC,KAAK+F,MAAMk8D,aAAe,SAAW,EAYpF,IAXA9xC,EAAIqxC,UAAUh0D,MAAMsqB,WAAsB+qC,EAC1C1yC,EAAIsxC,aAAaj0D,MAAMsqB,WAAmBgrC,EAC1C3yC,EAAIuxC,cAAcl0D,MAAMsqB,WAAkB+qC,EAC1C1yC,EAAIwxC,iBAAiBn0D,MAAMsqB,WAAegrC,EAC1C3yC,EAAIyxC,eAAep0D,MAAMsqB,WAAiB+qC,EAC1C1yC,EAAI0xC,kBAAkBr0D,MAAMsqB,WAAcgrC,EAG1C9iE,KAAKgC,WAAWuG,QAAQ,SAAU65D,GAChC79B,EAAU69B,EAAUzgD,UAAY4iB,IAE9BA,EAAS,CAEX,GAAIw+B,GAAc,CACd/iE,MAAKkiE,YAAca,GACrB/iE,KAAKkiE,cACLliE,KAAK2hB,UAGLsX,QAAQ/E,IAAI,qCAEdl0B,KAAKkiE,YAAc,EAGrBliE,KAAKiuB,KAAK,oBAIZwI,EAAKhjB,UAAUuvD,QAAU,WACvB,KAAM,IAAIp/D,OAAM,wDAUlB6yB,EAAKhjB,UAAUwxB,eAAiB,SAASxK,GACvC,IAAKz6B,KAAKk2B,YACR,KAAM,IAAItyB,OAAM,sCAGlB5D,MAAKk2B,YAAY+O,eAAexK,IAQlChE,EAAKhjB,UAAUyxB,eAAiB,WAC9B,IAAKllC,KAAKk2B,YACR,KAAM,IAAItyB,OAAM,sCAGlB,OAAO5D,MAAKk2B,YAAYgP,kBAU1BzO,EAAKhjB,UAAUoiB,QAAU,SAASxjB,GAChC,MAAO1Q,GAASi0B,OAAO51B,KAAMqS,EAAGrS,KAAK+F,MAAMsmB,OAAOxZ,QAUpD4jB,EAAKhjB,UAAUsiB,cAAgB,SAAS1jB,GACtC,MAAO1Q,GAASi0B,OAAO51B,KAAMqS,EAAGrS,KAAK+F,MAAMrG,KAAKmT,QAalD4jB,EAAKhjB,UAAUgiB,UAAY,SAASgF,GAClC,MAAO94B,GAAS6zB,SAASx1B,KAAMy6B,EAAMz6B,KAAK+F,MAAMsmB,OAAOxZ,QAczD4jB,EAAKhjB,UAAUkiB,gBAAkB,SAAS8E,GACxC,MAAO94B,GAAS6zB,SAASx1B,KAAMy6B,EAAMz6B,KAAK+F,MAAMrG,KAAKmT,QAUvD4jB,EAAKhjB,UAAU0uD,gBAAkB,WACA,GAA3BniE,KAAK+O,QAAQ8lB,WACf70B,KAAKijE,mBAGLjjE,KAAKqiE,mBAST5rC,EAAKhjB,UAAUwvD,iBAAmB,WAChC,GAAIxuD,GAAKzU,IAETA,MAAKqiE,kBAELriE,KAAKkjE,UAAY,WACf,MAA6B,IAAzBzuD,EAAG1F,QAAQ8lB,eAEbpgB,GAAG4tD,uBAID5tD,EAAG0b,IAAIzwB,OAKJ+U,EAAG0b,IAAIzwB,KAAK8wB,aAAe/b,EAAG1O,MAAM2rC,WACtCj9B,EAAG0b,IAAIzwB,KAAKgxB,cAAgBjc,EAAG1O,MAAMo9D,cACtC1uD,EAAG1O,MAAM2rC,UAAYj9B,EAAG0b,IAAIzwB,KAAK8wB,YACjC/b,EAAG1O,MAAMo9D,WAAa1uD,EAAG0b,IAAIzwB,KAAKgxB,aAElCjc,EAAGwZ,KAAK,aAMdttB,EAAKkI,iBAAiBpB,OAAQ,SAAUzH,KAAKkjE,WAE7CljE,KAAKojE,WAAaC,YAAYrjE,KAAKkjE,UAAW,MAOhDzsC,EAAKhjB,UAAU4uD,gBAAkB,WAC3BriE,KAAKojE,aACPpwC,cAAchzB,KAAKojE,YACnBpjE,KAAKojE,WAAa78D,QAIpB5F,EAAK0I,oBAAoB5B,OAAQ,SAAUzH,KAAKkjE,WAChDljE,KAAKkjE,UAAY,MAQnBzsC,EAAKhjB,UAAUmrB,SAAW,WACxB5+B,KAAKq+B,MAAM2B,eAAgB,GAQ7BvJ,EAAKhjB,UAAUorB,SAAW,WACxB7+B,KAAKq+B,MAAM2B,eAAgB,GAQ7BvJ,EAAKhjB,UAAU8qB,aAAe,WAC5Bv+B,KAAKq+B,MAAMilC,iBAAmBtjE,KAAK+F,MAAMqhC,WAQ3C3Q,EAAKhjB,UAAU+qB,QAAU,SAAUh1B,GAGjC,GAAKxJ,KAAKq+B,MAAM2B,cAAhB,CAEA,GAAInR,GAAQrlB,EAAMy2B,QAAQE,OAEtBojC,EAAevjE,KAAKwjE,gBACpBC,EAAezjE,KAAK0jE,cAAc1jE,KAAKq+B,MAAMilC,iBAAmBz0C,EAGhE40C,IAAgBF,IAClBvjE,KAAK2hB,SACL3hB,KAAKiuB,KAAK,mBAUdwI,EAAKhjB,UAAUiwD,cAAgB,SAAUt8B,GAGvC,MAFApnC,MAAK+F,MAAMqhC,UAAYA,EACvBpnC,KAAK4iE,mBACE5iE,KAAK+F,MAAMqhC,WAQpB3Q,EAAKhjB,UAAUmvD,iBAAmB,WAEhC,GAAIX,GAAeh9D,KAAKwG,IAAIzL,KAAK+F,MAAMoyB,gBAAgBrlB,OAAS9S,KAAK+F,MAAMsmB,OAAOvZ,OAAQ,EAc1F,OAbImvD,IAAgBjiE,KAAK+F,MAAMk8D,eAGG,UAA5BjiE,KAAK+O,QAAQ+lB,cACf90B,KAAK+F,MAAMqhC,WAAc66B,EAAejiE,KAAK+F,MAAMk8D,cAErDjiE,KAAK+F,MAAMk8D,aAAeA,GAIxBjiE,KAAK+F,MAAMqhC,UAAY,IAAGpnC,KAAK+F,MAAMqhC,UAAY,GACjDpnC,KAAK+F,MAAMqhC,UAAY66B,IAAcjiE,KAAK+F,MAAMqhC,UAAY66B,GAEzDjiE,KAAK+F,MAAMqhC,WAQpB3Q,EAAKhjB,UAAU+vD,cAAgB,WAC7B,MAAOxjE,MAAK+F,MAAMqhC,WAGpBvnC,EAAOD,QAAU62B,GAKb,SAAS52B,EAAQD,EAASM,GAE9B,GAAImlC,GAASnlC,EAAoB,GAOjCN,GAAQ2gC,YAAc,SAASz3B,EAASU,GACtC,GAAIm6D,GAAY,KAMZ/iC,EAAUyE,EAAO77B,MAAMo6D,aAAap6D,EAAOm6D,GAC3C1jC,EAAUoF,EAAO77B,MAAMq6D,iBAAiB7jE,KAAM2jE,EAAW/iC,EAASp3B,EAWtE,OAPI/E,OAAMw7B,EAAQ5T,OAAO2S,SACvBiB,EAAQ5T,OAAO2S,MAAQx1B,EAAMw1B,OAE3Bv6B,MAAMw7B,EAAQ5T,OAAO4S,SACvBgB,EAAQ5T,OAAO4S,MAAQz1B,EAAMy1B,OAGxBgB,IAML,SAASpgC,EAAQD,GAGrBA,EAAY,IACVw6B,QAAS,UACTK,KAAM,QAER76B,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,GAG/BA,EAAY,IACVkkE,OAAQ,aACRrpC,KAAM,QAER76B,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,IAK3B,SAASC,EAAQD,GAGrBA,EAAY,IACVw8C,KAAM,OACNG,IAAK,kBACLwnB,KAAM,OACNnG,QAAS,WACTG,QAAS,WACTiG,SAAU,YACV3nB,SAAU,YACV4nB,eAAgB,+CAChBC,gBAAiB,qEACjBC,oBAAqB,wEACrBC,gBAAiB,kCACjBC,mBAAoB,+BAEtBzkE,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,GAG/BA,EAAY,IACVw8C,KAAM,WACNG,IAAK,uBACLwnB,KAAM,QACNnG,QAAS,iBACTG,QAAS,iBACTiG,SAAU,gBACV3nB,SAAU,gBACV4nB,eAAgB,uDAChBC,gBAAiB,6EACjBC,oBAAqB,kFACrBC,gBAAiB,wCACjBC,mBAAoB,2CAEtBzkE,EAAe,MAAIA,EAAY,GAC/BA,EAAe,MAAIA,EAAY,IAK3B,WAKoC,mBAA7B0kE,4BAKTA,yBAAyB7wD,UAAU2oD,OAAS,SAAS/pD,EAAGC,EAAG5F,GACzD1M,KAAK8nB,YACL9nB,KAAK6rB,IAAIxZ,EAAGC,EAAG5F,EAAG,EAAG,EAAEzH,KAAK6mB,IAAI,IASlCw4C,yBAAyB7wD,UAAU8wD,OAAS,SAASlyD,EAAGC,EAAG5F,GACzD1M,KAAK8nB,YACL9nB,KAAK+S,KAAKV,EAAI3F,EAAG4F,EAAI5F,EAAO,EAAJA,EAAW,EAAJA,IASjC43D,yBAAyB7wD,UAAU0b,SAAW,SAAS9c,EAAGC,EAAG5F,GAE3D1M,KAAK8nB,WAEL,IAAIvc,GAAQ,EAAJmB,EACJ83D,EAAKj5D,EAAI,EACTk5D,EAAKx/D,KAAK8qB,KAAK,GAAK,EAAIxkB,EACxBD,EAAIrG,KAAK8qB,KAAKxkB,EAAIA,EAAIi5D,EAAKA,EAE/BxkE,MAAK+nB,OAAO1V,EAAGC,GAAKhH,EAAIm5D,IACxBzkE,KAAKgoB,OAAO3V,EAAImyD,EAAIlyD,EAAImyD,GACxBzkE,KAAKgoB,OAAO3V,EAAImyD,EAAIlyD,EAAImyD,GACxBzkE,KAAKgoB,OAAO3V,EAAGC,GAAKhH,EAAIm5D,IACxBzkE,KAAKmoB,aASPm8C,yBAAyB7wD,UAAUixD,aAAe,SAASryD,EAAGC,EAAG5F,GAE/D1M,KAAK8nB,WAEL,IAAIvc,GAAQ,EAAJmB,EACJ83D,EAAKj5D,EAAI,EACTk5D,EAAKx/D,KAAK8qB,KAAK,GAAK,EAAIxkB,EACxBD,EAAIrG,KAAK8qB,KAAKxkB,EAAIA,EAAIi5D,EAAKA,EAE/BxkE,MAAK+nB,OAAO1V,EAAGC,GAAKhH,EAAIm5D,IACxBzkE,KAAKgoB,OAAO3V,EAAImyD,EAAIlyD,EAAImyD,GACxBzkE,KAAKgoB,OAAO3V,EAAImyD,EAAIlyD,EAAImyD,GACxBzkE,KAAKgoB,OAAO3V,EAAGC,GAAKhH,EAAIm5D,IACxBzkE,KAAKmoB,aASPm8C,yBAAyB7wD,UAAUkxD,KAAO,SAAStyD,EAAGC,EAAG5F,GAEvD1M,KAAK8nB,WAEL,KAAK,GAAI88C,GAAI,EAAO,GAAJA,EAAQA,IAAK,CAC3B,GAAIh5C,GAAUg5C,EAAI,IAAM,EAAS,IAAJl4D,EAAc,GAAJA,CACvC1M,MAAKgoB,OACD3V,EAAIuZ,EAAS3mB,KAAKqZ,IAAQ,EAAJsmD,EAAQ3/D,KAAK6mB,GAAK,IACxCxZ,EAAIsZ,EAAS3mB,KAAKwZ,IAAQ,EAAJmmD,EAAQ3/D,KAAK6mB,GAAK,KAI9C9rB,KAAKmoB,aAMPm8C,yBAAyB7wD,UAAUwoD,UAAY,SAAS5pD,EAAGC,EAAGw7C,EAAGxiD,EAAGoB,GAClE,GAAIm4D,GAAM5/D,KAAK6mB,GAAG,GACE,GAAhBgiC,EAAM,EAAIphD,IAAYA,EAAMohD,EAAI,GAChB,EAAhBxiD,EAAM,EAAIoB,IAAYA,EAAMpB,EAAI,GACpCtL,KAAK8nB,YACL9nB,KAAK+nB,OAAO1V,EAAE3F,EAAE4F,GAChBtS,KAAKgoB,OAAO3V,EAAEy7C,EAAEphD,EAAE4F,GAClBtS,KAAK6rB,IAAIxZ,EAAEy7C,EAAEphD,EAAE4F,EAAE5F,EAAEA,EAAM,IAAJm4D,EAAY,IAAJA,GAAQ,GACrC7kE,KAAKgoB,OAAO3V,EAAEy7C,EAAEx7C,EAAEhH,EAAEoB,GACpB1M,KAAK6rB,IAAIxZ,EAAEy7C,EAAEphD,EAAE4F,EAAEhH,EAAEoB,EAAEA,EAAE,EAAM,GAAJm4D,GAAO,GAChC7kE,KAAKgoB,OAAO3V,EAAE3F,EAAE4F,EAAEhH,GAClBtL,KAAK6rB,IAAIxZ,EAAE3F,EAAE4F,EAAEhH,EAAEoB,EAAEA,EAAM,GAAJm4D,EAAW,IAAJA,GAAQ,GACpC7kE,KAAKgoB,OAAO3V,EAAEC,EAAE5F,GAChB1M,KAAK6rB,IAAIxZ,EAAE3F,EAAE4F,EAAE5F,EAAEA,EAAM,IAAJm4D,EAAY,IAAJA,GAAQ,IAMrCP,yBAAyB7wD,UAAU6oD,QAAU,SAASjqD,EAAGC,EAAGw7C,EAAGxiD,GAC7D,GAAIw5D,GAAQ,SACRC,EAAMjX,EAAI,EAAKgX,EACfE,EAAM15D,EAAI,EAAKw5D,EACfG,EAAK5yD,EAAIy7C,EACToX,EAAK5yD,EAAIhH,EACT65D,EAAK9yD,EAAIy7C,EAAI,EACbsX,EAAK9yD,EAAIhH,EAAI,CAEjBtL,MAAK8nB,YACL9nB,KAAK+nB,OAAO1V,EAAG+yD,GACfplE,KAAKqlE,cAAchzD,EAAG+yD,EAAKJ,EAAIG,EAAKJ,EAAIzyD,EAAG6yD,EAAI7yD,GAC/CtS,KAAKqlE,cAAcF,EAAKJ,EAAIzyD,EAAG2yD,EAAIG,EAAKJ,EAAIC,EAAIG,GAChDplE,KAAKqlE,cAAcJ,EAAIG,EAAKJ,EAAIG,EAAKJ,EAAIG,EAAIC,EAAID,GACjDllE,KAAKqlE,cAAcF,EAAKJ,EAAIG,EAAI7yD,EAAG+yD,EAAKJ,EAAI3yD,EAAG+yD,IAQjDd,yBAAyB7wD,UAAUyoD,SAAW,SAAS7pD,EAAGC,EAAGw7C,EAAGxiD,GAC9D,GAAImB,GAAI,EAAE,EACN64D,EAAWxX,EACXyX,EAAWj6D,EAAImB,EAEfq4D,EAAQ,SACRC,EAAMO,EAAW,EAAKR,EACtBE,EAAMO,EAAW,EAAKT,EACtBG,EAAK5yD,EAAIizD,EACTJ,EAAK5yD,EAAIizD,EACTJ,EAAK9yD,EAAIizD,EAAW,EACpBF,EAAK9yD,EAAIizD,EAAW,EACpBC,EAAMlzD,GAAKhH,EAAIi6D,EAAS,GACxBE,EAAMnzD,EAAIhH,CAEdtL,MAAK8nB,YACL9nB,KAAK+nB,OAAOk9C,EAAIG,GAEhBplE,KAAKqlE,cAAcJ,EAAIG,EAAKJ,EAAIG,EAAKJ,EAAIG,EAAIC,EAAID,GACjDllE,KAAKqlE,cAAcF,EAAKJ,EAAIG,EAAI7yD,EAAG+yD,EAAKJ,EAAI3yD,EAAG+yD,GAE/CplE,KAAKqlE,cAAchzD,EAAG+yD,EAAKJ,EAAIG,EAAKJ,EAAIzyD,EAAG6yD,EAAI7yD,GAC/CtS,KAAKqlE,cAAcF,EAAKJ,EAAIzyD,EAAG2yD,EAAIG,EAAKJ,EAAIC,EAAIG,GAEhDplE,KAAKgoB,OAAOi9C,EAAIO,GAEhBxlE,KAAKqlE,cAAcJ,EAAIO,EAAMR,EAAIG,EAAKJ,EAAIU,EAAKN,EAAIM,GACnDzlE,KAAKqlE,cAAcF,EAAKJ,EAAIU,EAAKpzD,EAAGmzD,EAAMR,EAAI3yD,EAAGmzD,GAEjDxlE,KAAKgoB,OAAO3V,EAAG+yD,IAOjBd,yBAAyB7wD,UAAUkiD,MAAQ,SAAStjD,EAAGC,EAAGu6C,EAAOnnD,GAE/D,GAAIggE,GAAKrzD,EAAI3M,EAAST,KAAKwZ,IAAIouC,GAC3B8Y,EAAKrzD,EAAI5M,EAAST,KAAKqZ,IAAIuuC,GAI3B+Y,EAAKvzD,EAAa,GAAT3M,EAAeT,KAAKwZ,IAAIouC,GACjCgZ,EAAKvzD,EAAa,GAAT5M,EAAeT,KAAKqZ,IAAIuuC,GAGjCiZ,EAAKJ,EAAKhgE,EAAS,EAAIT,KAAKwZ,IAAIouC,EAAQ,GAAM5nD,KAAK6mB,IACnDi6C,EAAKJ,EAAKjgE,EAAS,EAAIT,KAAKqZ,IAAIuuC,EAAQ,GAAM5nD,KAAK6mB,IAGnDk6C,EAAKN,EAAKhgE,EAAS,EAAIT,KAAKwZ,IAAIouC,EAAQ,GAAM5nD,KAAK6mB,IACnDm6C,EAAKN,EAAKjgE,EAAS,EAAIT,KAAKqZ,IAAIuuC,EAAQ,GAAM5nD,KAAK6mB,GAEvD9rB,MAAK8nB,YACL9nB,KAAK+nB,OAAO1V,EAAGC,GACftS,KAAKgoB,OAAO89C,EAAIC,GAChB/lE,KAAKgoB,OAAO49C,EAAIC,GAChB7lE,KAAKgoB,OAAOg+C,EAAIC,GAChBjmE,KAAKmoB,aASPm8C,yBAAyB7wD,UAAU+hD,WAAa,SAASnjD,EAAEC,EAAE8jD,EAAGC,EAAG6P,GAC5DA,IAAWA,GAAW,GAAG,IACd,GAAZC,IAAeA,EAAa,KAChC,IAAIC,GAAYF,EAAUxgE,MAC1B1F,MAAK+nB,OAAO1V,EAAGC,EAKf,KAJA,GAAIwM,GAAMs3C,EAAG/jD,EAAI0M,EAAMs3C,EAAG/jD,EACtB+zD,EAAQtnD,EAAGD,EACXwnD,EAAgBrhE,KAAK8qB,KAAMjR,EAAGA,EAAKC,EAAGA,GACtCwnD,EAAU,EAAGx6B,GAAK,EACfu6B,GAAe,IAAI,CACxB,GAAIH,GAAaD,EAAUK,IAAYH,EACnCD,GAAaG,IAAeH,EAAaG,EAC7C,IAAIrqD,GAAQhX,KAAK8qB,KAAMo2C,EAAWA,GAAc,EAAIE,EAAMA,GACnD,GAAHvnD,IAAM7C,GAASA,GACnB5J,GAAK4J,EACL3J,GAAK+zD,EAAMpqD,EACXjc,KAAK+rC,EAAO,SAAW,UAAU15B,EAAEC,GACnCg0D,GAAiBH,EACjBp6B,GAAQA,MAUV,SAASlsC,EAAQD,EAASM,GAQ9B,QAASyqC,GAAK/S,EAAS7oB,GACrB/O,KAAK43B,QAAUA,EACf53B,KAAK+O,QAAUA,EALjB,GAAInO,GAAUV,EAAoB,GAC9B2qC,EAAS3qC,EAAoB,GAOjCyqC,GAAKl3B,UAAUo4B,UAAY,SAASC,GAClC,GAAI3vB,GAAO2vB,EAAU,GAAGx5B,EACpB+J,EAAOyvB,EAAU,GAAGx5B,CACxB,KAAKyZ,EAAI,EAAGA,EAAI+f,EAAUpmC,OAAQqmB,IAChC5P,EAAOA,EAAO2vB,EAAU/f,GAAGzZ,EAAIw5B,EAAU/f,GAAGzZ,EAAI6J,EAChDE,EAAOA,EAAOyvB,EAAU/f,GAAGzZ,EAAIw5B,EAAU/f,GAAGzZ,EAAI+J,CAElD,QAAQ5Q,IAAK0Q,EAAMjP,IAAKmP,EAAMuvB,iBAAkB5rC,KAAK+O,QAAQ68B,mBAU/DjB,EAAKl3B,UAAUs4B,KAAO,SAAUzU,EAAS/kB,EAAOy5B,GAC9C,GAAe,MAAX1U,GACEA,EAAQ5xB,OAAS,EAAG,CACtB,GAAIylC,GAAM5+B,EACNksC,EAAYx0C,OAAO+nC,EAAUrG,IAAIn4B,MAAMsF,OAAO1G,QAAQ,KAAK,IAgB/D,IAfA++B,EAAOvqC,EAAQ8Q,cAAc,OAAQs6B,EAAUhF,YAAagF,EAAUrG,KACtEwF,EAAKz4B,eAAe,KAAM,QAASH,EAAMxK,WACtBxB,SAAhBgM,EAAM/E,OACP29B,EAAKz4B,eAAe,KAAM,QAASH,EAAM/E,OAKzCjB,EADsC,GAApCgG,EAAMxD,QAAQg8B,WAAW/7B,QACvB27B,EAAK67B,YAAYlvC,EAAS/kB,GAG1Bo4B,EAAK87B,QAAQnvC,GAIiB,GAAhC/kB,EAAMxD,QAAQw8B,OAAOv8B,QAAiB,CACxC,GACI03D,GADAt7B,EAAWxqC,EAAQ8Q,cAAc,OAAQs6B,EAAUhF,YAAagF,EAAUrG,IAG5E+gC,GADsC,OAApCn0D,EAAMxD,QAAQw8B,OAAOzW,YACf,IAAMwC,EAAQ,GAAGjlB,EAAI,MAAgB9F,EAAI,IAAM+qB,EAAQA,EAAQ5xB,OAAS,GAAG2M,EAAI,KAG/E,IAAMilB,EAAQ,GAAGjlB,EAAI,IAAMomC,EAAY,IAAMlsC,EAAI,IAAM+qB,EAAQA,EAAQ5xB,OAAS,GAAG2M,EAAI,IAAMomC,EAEvGrN,EAAS14B,eAAe,KAAM,QAASH,EAAMxK,UAAY,SACvBxB,SAA/BgM,EAAMxD,QAAQw8B,OAAO/9B,OACtB49B,EAAS14B,eAAe,KAAM,QAASH,EAAMxD,QAAQw8B,OAAO/9B,OAE9D49B,EAAS14B,eAAe,KAAM,IAAKg0D,GAGrCv7B,EAAKz4B,eAAe,KAAM,IAAK,IAAMnG,GAGG,GAApCgG,EAAMxD,QAAQ0D,WAAWzD,SAC3B67B,EAAOkB,KAAKzU,EAAS/kB,EAAOy5B,KAepCrB,EAAKg8B,mBAAqB,SAAS3zD,GAMjC,IAAK,GAJD4zD,GAAIC,EAAIC,EAAIC,EAAIC,EAAKC,EACrB16D,EAAItH,KAAK8oB,MAAM/a,EAAK,GAAGX,GAAK,IAAMpN,KAAK8oB,MAAM/a,EAAK,GAAGV,GAAK,IAC1D40D,EAAgB,EAAE,EAClBxhE,EAASsN,EAAKtN,OACTH,EAAI,EAAOG,EAAS,EAAbH,EAAgBA,IAE9BqhE,EAAW,GAALrhE,EAAUyN,EAAK,GAAKA,EAAKzN,EAAE,GACjCshE,EAAK7zD,EAAKzN,GACVuhE,EAAK9zD,EAAKzN,EAAE,GACZwhE,EAAcrhE,EAARH,EAAI,EAAcyN,EAAKzN,EAAE,GAAKuhE,EAUpCE,GAAQ30D,IAAMu0D,EAAGv0D,EAAI,EAAEw0D,EAAGx0D,EAAIy0D,EAAGz0D,GAAI60D,EAAgB50D,IAAMs0D,EAAGt0D,EAAI,EAAEu0D,EAAGv0D,EAAIw0D,EAAGx0D,GAAI40D,GAClFD,GAAQ50D,GAAMw0D,EAAGx0D,EAAI,EAAEy0D,EAAGz0D,EAAI00D,EAAG10D,GAAI60D,EAAgB50D,GAAMu0D,EAAGv0D,EAAI,EAAEw0D,EAAGx0D,EAAIy0D,EAAGz0D,GAAI40D,GAGlF36D,GAAK,IACLy6D,EAAI30D,EAAI,IACR20D,EAAI10D,EAAI,IACR20D,EAAI50D,EAAI,IACR40D,EAAI30D,EAAI,IACRw0D,EAAGz0D,EAAI,IACPy0D,EAAGx0D,EAAI,GAGT,OAAO/F,IAcTo+B,EAAK67B,YAAc,SAASxzD,EAAMT,GAChC,GAAI04B,GAAQ14B,EAAMxD,QAAQg8B,WAAWE,KACrC,IAAa,GAATA,GAAwB1kC,SAAV0kC,EAChB,MAAOjrC,MAAK2mE,mBAAmB3zD,EAO/B,KAAK,GAJD4zD,GAAIC,EAAIC,EAAIC,EAAIC,EAAKC,EAAKE,EAAGC,EAAGC,EAAIC,EAAG38C,EAAG48C,EAAGC,EAC7CC,EAAQC,EAAQC,EAASC,EAASC,EAASC,EAC3Cv7D,EAAItH,KAAK8oB,MAAM/a,EAAK,GAAGX,GAAK,IAAMpN,KAAK8oB,MAAM/a,EAAK,GAAGV,GAAK,IAC1D5M,EAASsN,EAAKtN,OACTH,EAAI,EAAOG,EAAS,EAAbH,EAAgBA,IAE9BqhE,EAAW,GAALrhE,EAAUyN,EAAK,GAAKA,EAAKzN,EAAE,GACjCshE,EAAK7zD,EAAKzN,GACVuhE,EAAK9zD,EAAKzN,EAAE,GACZwhE,EAAcrhE,EAARH,EAAI,EAAcyN,EAAKzN,EAAE,GAAKuhE,EAEpCK,EAAKliE,KAAK8qB,KAAK9qB,KAAKovB,IAAIuyC,EAAGv0D,EAAIw0D,EAAGx0D,EAAE,GAAKpN,KAAKovB,IAAIuyC,EAAGt0D,EAAIu0D,EAAGv0D,EAAE,IAC9D80D,EAAKniE,KAAK8qB,KAAK9qB,KAAKovB,IAAIwyC,EAAGx0D,EAAIy0D,EAAGz0D,EAAE,GAAKpN,KAAKovB,IAAIwyC,EAAGv0D,EAAIw0D,EAAGx0D,EAAE,IAC9D+0D,EAAKpiE,KAAK8qB,KAAK9qB,KAAKovB,IAAIyyC,EAAGz0D,EAAI00D,EAAG10D,EAAE,GAAKpN,KAAKovB,IAAIyyC,EAAGx0D,EAAIy0D,EAAGz0D,EAAE,IAY9Dm1D,EAAUxiE,KAAKovB,IAAIgzC,EAAKp8B,GACxB08B,EAAU1iE,KAAKovB,IAAIgzC,EAAG,EAAEp8B,GACxBy8B,EAAUziE,KAAKovB,IAAI+yC,EAAKn8B,GACxB28B,EAAU3iE,KAAKovB,IAAI+yC,EAAG,EAAEn8B,GACxB68B,EAAU7iE,KAAKovB,IAAI8yC,EAAKl8B,GACxB48B,EAAU5iE,KAAKovB,IAAI8yC,EAAG,EAAEl8B,GAExBq8B,EAAI,EAAEO,EAAU,EAAEC,EAASJ,EAASE,EACpCj9C,EAAI,EAAEg9C,EAAU,EAAEF,EAASC,EAASE,EACpCL,EAAI,EAAEO,GAAUA,EAASJ,GACrBH,EAAI,IAAIA,EAAI,EAAIA,GACpBC,EAAI,EAAEC,GAAUA,EAASC,GACrBF,EAAI,IAAIA,EAAI,EAAIA,GAEpBR,GAAQ30D,IAAMu1D,EAAUhB,EAAGv0D,EAAIi1D,EAAET,EAAGx0D,EAAIw1D,EAAUf,EAAGz0D,GAAKk1D,EACxDj1D,IAAMs1D,EAAUhB,EAAGt0D,EAAIg1D,EAAET,EAAGv0D,EAAIu1D,EAAUf,EAAGx0D,GAAKi1D,GAEpDN,GAAQ50D,GAAMs1D,EAAUd,EAAGx0D,EAAIsY,EAAEm8C,EAAGz0D,EAAIu1D,EAAUb,EAAG10D,GAAKm1D,EACxDl1D,GAAMq1D,EAAUd,EAAGv0D,EAAIqY,EAAEm8C,EAAGx0D,EAAIs1D,EAAUb,EAAGz0D,GAAKk1D,GAEvC,GAATR,EAAI30D,GAAmB,GAAT20D,EAAI10D,IAAS00D,EAAMH,GACxB,GAATI,EAAI50D,GAAmB,GAAT40D,EAAI30D,IAAS20D,EAAMH,GACrCv6D,GAAK,IACLy6D,EAAI30D,EAAI,IACR20D,EAAI10D,EAAI,IACR20D,EAAI50D,EAAI,IACR40D,EAAI30D,EAAI,IACRw0D,EAAGz0D,EAAI,IACPy0D,EAAGx0D,EAAI,GAGT,OAAO/F,IAUXo+B,EAAK87B,QAAU,SAASzzD,GAGtB,IAAK,GADDzG,GAAI,GACChH,EAAI,EAAGA,EAAIyN,EAAKtN,OAAQH,IAE7BgH,GADO,GAALhH,EACGyN,EAAKzN,GAAG8M,EAAI,IAAMW,EAAKzN,GAAG+M,EAG1B,IAAMU,EAAKzN,GAAG8M,EAAI,IAAMW,EAAKzN,GAAG+M,CAGzC,OAAO/F,IAGT1M,EAAOD,QAAU+qC,GAKb,SAAS9qC,EAAQD,EAASM,GAQ9B,QAAS6nE,GAASnwC,EAAS7oB,GACzB/O,KAAK43B,QAAUA,EACf53B,KAAK+O,QAAUA,EALjB,GAAInO,GAAUV,EAAoB,GAC9B2qC,EAAS3qC,EAAoB,GAOjC6nE,GAASt0D,UAAUo4B,UAAY,SAASC,GACtC,GAA2C,SAAvC9rC,KAAK+O,QAAQkmC,SAASC,cAA0B,CAGlD,IAAK,GAFD/4B,GAAO2vB,EAAU,GAAGx5B,EACpB+J,EAAOyvB,EAAU,GAAGx5B,EACfyZ,EAAI,EAAGA,EAAI+f,EAAUpmC,OAAQqmB,IACpC5P,EAAOA,EAAO2vB,EAAU/f,GAAGzZ,EAAIw5B,EAAU/f,GAAGzZ,EAAI6J,EAChDE,EAAOA,EAAOyvB,EAAU/f,GAAGzZ,EAAIw5B,EAAU/f,GAAGzZ,EAAI+J,CAElD,QAAQ5Q,IAAK0Q,EAAMjP,IAAKmP,EAAMuvB,iBAAkB5rC,KAAK+O,QAAQ68B,kBAI7D,IAAK,GADDo8B,MACKj8C,EAAI,EAAGA,EAAI+f,EAAUpmC,OAAQqmB,IACpCi8C,EAAgB9/D,MACdmK,EAAGy5B,EAAU/f,GAAG1Z,EAChBC,EAAGw5B,EAAU/f,GAAGzZ,EAChBslB,QAAS53B,KAAK43B,SAGlB,OAAOowC,IAYXD,EAASh8B,KAAO,SAAUmE,EAAUkG,EAAoBpK,GACtD,GAEIi8B,GACAr/D,EAAKs/D,EACL31D,EACAhN,EAAEwmB,EALFo8C,KACAC,KAKAC,EAAY,CAGhB,KAAK9iE,EAAI,EAAGA,EAAI2qC,EAASxqC,OAAQH,IAE/B,GADAgN,EAAQy5B,EAAUtX,OAAOwb,EAAS3qC,IACP,OAAvBgN,EAAMxD,QAAQvB,OACK,GAAjB+E,EAAMqW,UAAyEriB,SAArDylC,EAAUj9B,QAAQ2lB,OAAOoD,WAAWoY,EAAS3qC,KAAyE,GAApDymC,EAAUj9B,QAAQ2lB,OAAOoD,WAAWoY,EAAS3qC,KAC3I,IAAKwmB,EAAI,EAAGA,EAAIqqB,EAAmBlG,EAAS3qC,IAAIG,OAAQqmB,IACtDo8C,EAAajgE,MACXmK,EAAG+jC,EAAmBlG,EAAS3qC,IAAIwmB,GAAG1Z,EACtCC,EAAG8jC,EAAmBlG,EAAS3qC,IAAIwmB,GAAGzZ,EACtCslB,QAASsY,EAAS3qC,KAEpB8iE,GAAa,CAMrB,IAAiB,GAAbA,EAeJ,IAZAF,EAAa1xD,KAAK,SAAUnR,EAAGa,GAC7B,MAAIb,GAAE+M,GAAKlM,EAAEkM,EACJ/M,EAAEsyB,QAAUzxB,EAAEyxB,QAEdtyB,EAAE+M,EAAIlM,EAAEkM,IAKnB01D,EAASO,sBAAsBF,EAAeD,GAGzC5iE,EAAI,EAAGA,EAAI4iE,EAAaziE,OAAQH,IAAK,CACxCgN,EAAQy5B,EAAUtX,OAAOyzC,EAAa5iE,GAAGqyB,QACzC,IAAI8O,GAAW,GAAMn0B,EAAMxD,QAAQkmC,SAASpiC,KAE5CjK,GAAMu/D,EAAa5iE,GAAG8M,CACtB,IAAIk2D,GAAe,CACnB,IAA2BhiE,SAAvB6hE,EAAcx/D,GACZrD,EAAE,EAAI4iE,EAAaziE,SAASuiE,EAAehjE,KAAK8lB,IAAIo9C,EAAa5iE,EAAE,GAAG8M,EAAIzJ,IAC1ErD,EAAI,IAAwB0iE,EAAehjE,KAAKwG,IAAIw8D,EAAahjE,KAAK8lB,IAAIo9C,EAAa5iE,EAAE,GAAG8M,EAAIzJ,KACpGs/D,EAAWH,EAASS,iBAAiBP,EAAc11D,EAAOm0B,OAEvD,CACH,GAAI+hC,GAAUljE,GAAK6iE,EAAcx/D,GAAK8/D,OAASN,EAAcx/D,GAAK+/D,UAC9DC,EAAUrjE,GAAK6iE,EAAcx/D,GAAK+/D,SAAW,EAC7CF,GAAUN,EAAaziE,SAASuiE,EAAehjE,KAAK8lB,IAAIo9C,EAAaM,GAASp2D,EAAIzJ,IAClFggE,EAAU,IAAsBX,EAAehjE,KAAKwG,IAAIw8D,EAAahjE,KAAK8lB,IAAIo9C,EAAaS,GAASv2D,EAAIzJ,KAC5Gs/D,EAAWH,EAASS,iBAAiBP,EAAc11D,EAAOm0B,GAC1D0hC,EAAcx/D,GAAK+/D,UAAY,EAEa,SAAxCp2D,EAAMxD,QAAQkmC,SAASC,eACzBqzB,EAAeH,EAAcx/D,GAAKigE,YAClCT,EAAcx/D,GAAKigE,aAAet2D,EAAMm4B,aAAey9B,EAAa5iE,GAAG+M,GAExB,cAAxCC,EAAMxD,QAAQkmC,SAASC,gBAC9BgzB,EAASr1D,MAAQq1D,EAASr1D,MAAQu1D,EAAcx/D,GAAK8/D,OACrDR,EAASr+C,QAAWu+C,EAAcx/D,GAAa,SAAIs/D,EAASr1D,MAAS,GAAIq1D,EAASr1D,OAASu1D,EAAcx/D,GAAK8/D,OAAO,GACjF,QAAhCn2D,EAAMxD,QAAQkmC,SAASlG,MAAwBm5B,EAASr+C,QAAU,GAAIq+C,EAASr1D,MAC1C,SAAhCN,EAAMxD,QAAQkmC,SAASlG,QAAmBm5B,EAASr+C,QAAU,GAAIq+C,EAASr1D,QAGvFjS,EAAQgS,QAAQu1D,EAAa5iE,GAAG8M,EAAI61D,EAASr+C,OAAQs+C,EAAa5iE,GAAG+M,EAAIi2D,EAAcL,EAASr1D,MAAON,EAAMm4B,aAAey9B,EAAa5iE,GAAG+M,EAAGC,EAAMxK,UAAY,OAAQikC,EAAUhF,YAAagF,EAAUrG,KAElK,GAApCpzB,EAAMxD,QAAQ0D,WAAWzD,SAC3B67B,EAAOkB,KAAKo8B,EAAc51D,EAAOy5B,EAAWk8B,EAASr+C,UAY3Dk+C,EAASO,sBAAwB,SAAUF,EAAeD,GAGxD,IAAK,GADDF,GACK1iE,EAAI,EAAGA,EAAI4iE,EAAaziE,OAAQH,IACnCA,EAAI,EAAI4iE,EAAaziE,SACvBuiE,EAAehjE,KAAK8lB,IAAIo9C,EAAa5iE,EAAI,GAAG8M,EAAI81D,EAAa5iE,GAAG8M,IAE9D9M,EAAI,IACN0iE,EAAehjE,KAAKwG,IAAIw8D,EAAchjE,KAAK8lB,IAAIo9C,EAAa5iE,EAAI,GAAG8M,EAAI81D,EAAa5iE,GAAG8M,KAErE,GAAhB41D,IACuC1hE,SAArC6hE,EAAcD,EAAa5iE,GAAG8M,KAChC+1D,EAAcD,EAAa5iE,GAAG8M,IAAMq2D,OAAQ,EAAGC,SAAU,EAAGE,YAAa,IAE3ET,EAAcD,EAAa5iE,GAAG8M,GAAGq2D,QAAU,IAejDX,EAASS,iBAAmB,SAAUP,EAAc11D,EAAOm0B,GACzD,GAAI7zB,GAAOgX,CAwBX,OAvBIo+C,GAAe11D,EAAMxD,QAAQkmC,SAASpiC,OAASo1D,EAAe,GAChEp1D,EAAuB6zB,EAAfuhC,EAA0BvhC,EAAWuhC,EAE7Cp+C,EAAS,EAC2B,QAAhCtX,EAAMxD,QAAQkmC,SAASlG,MACzBllB,GAAU,GAAMo+C,EAEuB,SAAhC11D,EAAMxD,QAAQkmC,SAASlG,QAC9BllB,GAAU,GAAMo+C,KAKlBp1D,EAAQN,EAAMxD,QAAQkmC,SAASpiC,MAC/BgX,EAAS,EAC2B,QAAhCtX,EAAMxD,QAAQkmC,SAASlG,MACzBllB,GAAU,GAAMtX,EAAMxD,QAAQkmC,SAASpiC,MAEA,SAAhCN,EAAMxD,QAAQkmC,SAASlG,QAC9BllB,GAAU,GAAMtX,EAAMxD,QAAQkmC,SAASpiC,SAInCA,MAAOA,EAAOgX,OAAQA,IAGhCk+C,EAASvwB,oBAAsB,SAASwwB,EAAiB3xB,EAAanG,EAAU44B,EAAYh0C,GAC1F,GAAIkzC,EAAgBtiE,OAAS,EAAG,CAE9BsiE,EAAgBvxD,KAAK,SAAUnR,EAAGa,GAChC,MAAIb,GAAE+M,GAAKlM,EAAEkM,EACJ/M,EAAEsyB,QAAUzxB,EAAEyxB,QAEdtyB,EAAE+M,EAAIlM,EAAEkM,GAGnB,IAAI+1D,KAEJL,GAASO,sBAAsBF,EAAeJ,GAC9C3xB,EAAYyyB,GAAcf,EAASgB,qBAAqBX,EAAeJ,GACvE3xB,EAAYyyB,GAAYl9B,iBAAmB9W,EAC3Cob,EAAShoC,KAAK4gE,KAIlBf,EAASgB,qBAAuB,SAAUX,EAAeD,GAIvD,IAAK,GAHDv/D,GACAuT,EAAOgsD,EAAa,GAAG71D,EACvB+J,EAAO8rD,EAAa,GAAG71D,EAClB/M,EAAI,EAAGA,EAAI4iE,EAAaziE,OAAQH,IACvCqD,EAAMu/D,EAAa5iE,GAAG8M,EACK9L,SAAvB6hE,EAAcx/D,IAChBuT,EAAOA,EAAOgsD,EAAa5iE,GAAG+M,EAAI61D,EAAa5iE,GAAG+M,EAAI6J,EACtDE,EAAOA,EAAO8rD,EAAa5iE,GAAG+M,EAAI61D,EAAa5iE,GAAG+M,EAAI+J,GAGtD+rD,EAAcx/D,GAAKigE,aAAeV,EAAa5iE,GAAG+M,CAGtD,KAAK,GAAI02D,KAAQZ,GACXA,EAAcviE,eAAemjE,KAC/B7sD,EAAOA,EAAOisD,EAAcY,GAAMH,YAAcT,EAAcY,GAAMH,YAAc1sD,EAClFE,EAAOA,EAAO+rD,EAAcY,GAAMH,YAAcT,EAAcY,GAAMH,YAAcxsD,EAItF,QAAQ5Q,IAAK0Q,EAAMjP,IAAKmP,IAG1Bxc,EAAOD,QAAUmoE,GAIb,SAASloE,EAAQD,EAASM,GAO9B,QAAS2qC,GAAOjT,EAAS7oB,GACvB/O,KAAK43B,QAAUA,EACf53B,KAAK+O,QAAUA;CAJjB,GAAInO,GAAUV,EAAoB,EAQlC2qC,GAAOp3B,UAAUo4B,UAAY,SAASC,GACpC,GAAI3vB,GAAO2vB,EAAU,GAAGx5B,EACpB+J,EAAOyvB,EAAU,GAAGx5B,CACxB,KAAKyZ,EAAI,EAAGA,EAAI+f,EAAUpmC,OAAQqmB,IAChC5P,EAAOA,EAAO2vB,EAAU/f,GAAGzZ,EAAIw5B,EAAU/f,GAAGzZ,EAAI6J,EAChDE,EAAOA,EAAOyvB,EAAU/f,GAAGzZ,EAAIw5B,EAAU/f,GAAGzZ,EAAI+J,CAElD,QAAQ5Q,IAAK0Q,EAAMjP,IAAKmP,EAAMuvB,iBAAkB5rC,KAAK+O,QAAQ68B,mBAG/Df,EAAOp3B,UAAUs4B,KAAO,SAASzU,EAAS/kB,EAAOy5B,EAAWniB,GAC1DghB,EAAOkB,KAAKzU,EAAS/kB,EAAOy5B,EAAWniB,IAYzCghB,EAAOkB,KAAO,SAAUzU,EAAS/kB,EAAOy5B,EAAWniB,GAClCtjB,SAAXsjB,IAAuBA,EAAS,EACpC,KAAK,GAAItkB,GAAI,EAAGA,EAAI+xB,EAAQ5xB,OAAQH,IAClC3E,EAAQwR,UAAUklB,EAAQ/xB,GAAG8M,EAAIwX,EAAQyN,EAAQ/xB,GAAG+M,EAAGC,EAAOy5B,EAAUhF,YAAagF,EAAUrG,MAKnG9lC,EAAOD,QAAUirC,GAIb,SAAShrC,EAAQD,EAASM,GAE9B,GAAI+oE,GAAe/oE,EAAoB,IACnCgpE,EAAehpE,EAAoB,IACnCipE,EAAejpE,EAAoB,IACnCkpE,EAAiBlpE,EAAoB,IACrCmpE,EAAoBnpE,EAAoB,IACxCopE,EAAkBppE,EAAoB,IACtCqpE,EAA0BrpE,EAAoB,GAQlDN,GAAQ4pE,WAAa,SAAUC,GAC7B,IAAK,GAAIC,KAAiBD,GACpBA,EAAe5jE,eAAe6jE,KAChC1pE,KAAK0pE,GAAiBD,EAAeC,KAY3C9pE,EAAQ+pE,YAAc,SAAUF,GAC9B,IAAK,GAAIC,KAAiBD,GACpBA,EAAe5jE,eAAe6jE,KAChC1pE,KAAK0pE,GAAiBnjE,SAW5B3G,EAAQyiD,mBAAqB,WAC3BriD,KAAKwpE,WAAWP,GAChBjpE,KAAK4pE,2BACkC,GAAnC5pE,KAAK+gD,UAAUlD,kBACjB79C,KAAK6pE,6BAUTjqE,EAAQ2iD,mBAAqB,WAC3BviD,KAAKk5D,eAAiB,EACtBl5D,KAAK8pE,aAAe,EACpB9pE,KAAKwpE,WAAWN,IASlBtpE,EAAQ0iD,kBAAoB,WAC1BtiD,KAAK2tD,WACL3tD,KAAK+pE,cAAgB,WACrB/pE,KAAK2tD,QAAgB,UACrB3tD,KAAK2tD,QAAgB,OAAE,YAAcnR,SACnCa,SACA6F,eACAsW,eAAkB,EAClBwQ,YAAezjE,QACjBvG,KAAK2tD,QAAgB,UACrB3tD,KAAK2tD,QAAiB,SAAKnR,SACzBa,SACA6F,eACAsW,eAAkB,EAClBwQ,YAAezjE,QAEjBvG,KAAKkjD,YAAcljD,KAAK2tD,QAAgB,OAAE,WAAwB,YAElE3tD,KAAKwpE,WAAWL,IASlBvpE,EAAQ4iD,qBAAuB,WAC7BxiD,KAAK+pD,cAAgBvN,SAAWa,UAEhCr9C,KAAKwpE,WAAWJ,IASlBxpE,EAAQ4nD,wBAA0B,WAEhCxnD,KAAKiqE,8BAA+B,EACpCjqE,KAAKkqE,sBAAuB,EAEmB,GAA3ClqE,KAAK+gD,UAAUlB,iBAAiB7wC,SAELzI,SAAzBvG,KAAKmqE,kBACPnqE,KAAKmqE,gBAAkBt4D,SAASM,cAAc,OAC9CnS,KAAKmqE,gBAAgBpiE,UAAY,0BAE/B/H,KAAKmqE,gBAAgB38D,MAAMm6B,QADR,GAAjB3nC,KAAKinD,SAC8B,QAGA,OAEvCjnD,KAAKwf,MAAMzN,YAAY/R,KAAKmqE,kBAGL5jE,SAArBvG,KAAKoqE,cACPpqE,KAAKoqE,YAAcv4D,SAASM,cAAc,OAC1CnS,KAAKoqE,YAAYriE,UAAY,gCAE3B/H,KAAKoqE,YAAY58D,MAAMm6B,QADJ,GAAjB3nC,KAAKinD,SAC0B,OAGA,QAEnCjnD,KAAKwf,MAAMzN,YAAY/R,KAAKoqE,cAGR7jE,SAAlBvG,KAAKqqE,WACPrqE,KAAKqqE,SAAWx4D,SAASM,cAAc,OACvCnS,KAAKqqE,SAAStiE,UAAY,gCAC1B/H,KAAKqqE,SAAS78D,MAAMm6B,QAAU3nC,KAAKmqE,gBAAgB38D,MAAMm6B,QACzD3nC,KAAKwf,MAAMzN,YAAY/R,KAAKqqE,WAI9BrqE,KAAKwpE,WAAWH,GAGhBrpE,KAAKkpD,yBAGwB3iD,SAAzBvG,KAAKmqE,kBAEPnqE,KAAKkpD,wBAGLlpD,KAAKwf,MAAM/N,YAAYzR,KAAKmqE,iBAC5BnqE,KAAKwf,MAAM/N,YAAYzR,KAAKoqE,aAC5BpqE,KAAKwf,MAAM/N,YAAYzR,KAAKqqE,UAE5BrqE,KAAKmqE,gBAAkB5jE,OACvBvG,KAAKoqE,YAAc7jE,OACnBvG,KAAKqqE,SAAW9jE,OAEhBvG,KAAK2pE,YAAYN,KAWvBzpE,EAAQ2nD,wBAA0B,WAChCvnD,KAAKwpE,WAAWF,GAEhBtpE,KAAKsqE,mBACoC,GAArCtqE,KAAK+gD,UAAUrB,WAAW1wC,SAC5BhP,KAAKuqE,2BAUT3qE,EAAQ6iD,qBAAuB,WAC7BziD,KAAKwpE,WAAWD,KAMd,SAAS1pE,EAAQD,EAASM,GAiB9B,QAASukD,GAAU3qC,GACjB9Z,KAAKgyD,QAAS,EAEdhyD,KAAKmwB,KACHrW,UAAWA,GAGb9Z,KAAKmwB,IAAIq6C,QAAU34D,SAASM,cAAc,OAC1CnS,KAAKmwB,IAAIq6C,QAAQziE,UAAY,UAE7B/H,KAAKmwB,IAAIrW,UAAU/H,YAAY/R,KAAKmwB,IAAIq6C,SAExCxqE,KAAK8D,OAASuhC,EAAOrlC,KAAKmwB,IAAIq6C,SAAUjlC,iBAAiB,IACzDvlC,KAAK8D,OAAO+P,GAAG,MAAO7T,KAAKyqE,cAAcp1C,KAAKr1B,MAG9C,IAAIyU,GAAKzU,KACLgiE,GACF,QAAS,QACT,YAAa,OACb,YAAa,OAAQ,UACrB,aAAc,iBAEhBA,GAAOz5D,QAAQ,SAAUiB,GACvBiL,EAAG3Q,OAAO+P,GAAGrK,EAAO,SAAUA,GAC5BA,EAAMk8B,sBAKV1lC,KAAK0qE,aAAerlC,EAAO59B,QAAS89B,iBAAiB,IACrDvlC,KAAK0qE,aAAa72D,GAAG,MAAO,SAAUrK,GAE/BmhE,EAAWnhE,EAAMG,OAAQmQ,IAC5BrF,EAAGm2D,eAIerkE,SAAlBvG,KAAKukD,UACPvkD,KAAKukD,SAAS3wC,UAEhB5T,KAAKukD,SAAWA,IAGhBvkD,KAAK6qE,YAAc7qE,KAAK4qE,WAAWv1C,KAAKr1B,MAiF1C,QAAS2qE,GAAW7hE,EAAS+7B,GAC3B,KAAO/7B,GAAS,CACd,GAAIA,IAAY+7B,EACd,OAAO,CAET/7B,GAAUA,EAAQgB,WAEpB,OAAO,EAnJT,GAAIy6C,GAAWrkD,EAAoB,IAC/B+c,EAAU/c,EAAoB,IAC9BmlC,EAASnlC,EAAoB,IAC7BS,EAAOT,EAAoB,EA4D/B+c,GAAQwnC,EAAUhxC,WAGlBgxC,EAAUrqB,QAAU,KAKpBqqB,EAAUhxC,UAAUG,QAAU,WAC5B5T,KAAK4qE,aAGL5qE,KAAKmwB,IAAIq6C,QAAQ1gE,WAAW2H,YAAYzR,KAAKmwB,IAAIq6C,SAGjDxqE,KAAK8D,OAAS,KACd9D,KAAK0qE,aAAe,MAQtBjmB,EAAUhxC,UAAUq3D,SAAW,WAEzBrmB,EAAUrqB,SACZqqB,EAAUrqB,QAAQwwC,aAEpBnmB,EAAUrqB,QAAUp6B,KAEpBA,KAAKgyD,QAAS,EACdhyD,KAAKmwB,IAAIq6C,QAAQh9D,MAAMm6B,QAAU,OACjChnC,EAAKmH,aAAa9H,KAAKmwB,IAAIrW,UAAW,cAEtC9Z,KAAKiuB,KAAK,UACVjuB,KAAKiuB,KAAK,YAIVjuB,KAAKukD,SAASlvB,KAAK,MAAOr1B,KAAK6qE,cAOjCpmB,EAAUhxC,UAAUm3D,WAAa,WAC/B5qE,KAAKgyD,QAAS,EACdhyD,KAAKmwB,IAAIq6C,QAAQh9D,MAAMm6B,QAAU,GACjChnC,EAAKyH,gBAAgBpI,KAAKmwB,IAAIrW,UAAW,cACzC9Z,KAAKukD,SAASwmB,OAAO,MAAO/qE,KAAK6qE,aAEjC7qE,KAAKiuB,KAAK,UACVjuB,KAAKiuB,KAAK,eAQZw2B,EAAUhxC,UAAUg3D,cAAgB,SAAUjhE,GAE5CxJ,KAAK8qE,WACLthE,EAAMk8B,mBAsBR7lC,EAAOD,QAAU6kD,GAKb,SAAS5kD,GAeb,QAASod,GAAQiG,GACf,MAAIA,GAAY4tC,EAAM5tC,GAAtB,OAWF,QAAS4tC,GAAM5tC,GACb,IAAK,GAAIta,KAAOqU,GAAQxJ,UACtByP,EAAIta,GAAOqU,EAAQxJ,UAAU7K,EAE/B,OAAOsa,GAxBTrjB,EAAOD,QAAUqd,EAoCjBA,EAAQxJ,UAAUI,GAClBoJ,EAAQxJ,UAAU5K,iBAAmB,SAASW,EAAOiQ,GAInD,MAHAzZ,MAAKgrE,WAAahrE,KAAKgrE,gBACtBhrE,KAAKgrE,WAAWxhE,GAASxJ,KAAKgrE,WAAWxhE,QACvCtB,KAAKuR,GACDzZ,MAaTid,EAAQxJ,UAAUw3D,KAAO,SAASzhE,EAAOiQ,GAIvC,QAAS5F,KACPq3D,EAAKl3D,IAAIxK,EAAOqK,GAChB4F,EAAGnB,MAAMtY,KAAMyF,WALjB,GAAIylE,GAAOlrE,IAUX,OATAA,MAAKgrE,WAAahrE,KAAKgrE,eAOvBn3D,EAAG4F,GAAKA,EACRzZ,KAAK6T,GAAGrK,EAAOqK,GACR7T,MAaTid,EAAQxJ,UAAUO,IAClBiJ,EAAQxJ,UAAU03D,eAClBluD,EAAQxJ,UAAU23D,mBAClBnuD,EAAQxJ,UAAUpK,oBAAsB,SAASG,EAAOiQ,GAItD,GAHAzZ,KAAKgrE,WAAahrE,KAAKgrE,eAGnB,GAAKvlE,UAAUC,OAEjB,MADA1F,MAAKgrE,cACEhrE,IAIT,IAAIqrE,GAAYrrE,KAAKgrE,WAAWxhE,EAChC,KAAK6hE,EAAW,MAAOrrE,KAGvB,IAAI,GAAKyF,UAAUC,OAEjB,aADO1F,MAAKgrE,WAAWxhE,GAChBxJ,IAKT,KAAK,GADDsrE,GACK/lE,EAAI,EAAGA,EAAI8lE,EAAU3lE,OAAQH,IAEpC,GADA+lE,EAAKD,EAAU9lE,GACX+lE,IAAO7xD,GAAM6xD,EAAG7xD,KAAOA,EAAI,CAC7B4xD,EAAU/iE,OAAO/C,EAAG,EACpB,OAGJ,MAAOvF,OAWTid,EAAQxJ,UAAUwa,KAAO,SAASzkB,GAChCxJ,KAAKgrE,WAAahrE,KAAKgrE,cACvB,IAAIxxD,MAAU8jB,MAAM/8B,KAAKkF,UAAW,GAChC4lE,EAAYrrE,KAAKgrE,WAAWxhE,EAEhC,IAAI6hE,EAAW,CACbA,EAAYA,EAAU/tC,MAAM,EAC5B,KAAK,GAAI/3B,GAAI,EAAGC,EAAM6lE,EAAU3lE,OAAYF,EAAJD,IAAWA,EACjD8lE,EAAU9lE,GAAG+S,MAAMtY,KAAMwZ,GAI7B,MAAOxZ,OAWTid,EAAQxJ,UAAUsuD,UAAY,SAASv4D,GAErC,MADAxJ,MAAKgrE,WAAahrE,KAAKgrE,eAChBhrE,KAAKgrE,WAAWxhE,QAWzByT,EAAQxJ,UAAU83D,aAAe,SAAS/hE,GACxC,QAAUxJ,KAAK+hE,UAAUv4D,GAAO9D,SAM9B,SAAS7F,EAAQD,GAErB,GAAI4rE,GAAgCC,EAA8BC,GAMjE,SAAUhsE,EAAMC,GAGX8rE,KAAmCD,EAAiC,EAAWE,EAA2E,kBAAnCF,GAAiDA,EAA+BlzD,MAAM1Y,EAAS6rE,GAAiCD,IAAmEjlE,SAAlCmlE,IAAgD7rE,EAAOD,QAAU8rE,KAU7V1rE,KAAM,WAEN,QAASukD,GAASx1C,GAChB,GAIIxJ,GAJAgE,EAAiBwF,GAAWA,EAAQxF,iBAAkB,EAEtDoiE,GAAUC,WAAYC,UACtBC,IAIJ,KAAKvmE,EAAI,GAAS,KAALA,EAAUA,IAAMumE,EAAM3nE,OAAO4nE,aAAaxmE,KAAOymE,KAAK,IAAMzmE,EAAI,IAAKqM,OAAO,EAEzF,KAAKrM,EAAI,GAAS,IAALA,EAASA,IAAMumE,EAAM3nE,OAAO4nE,aAAaxmE,KAAOymE,KAAKzmE,EAAGqM,OAAO,EAE5E,KAAKrM,EAAI,EAAS,GAALA,EAAUA,IAAMumE,EAAM,GAAKvmE,IAAMymE,KAAK,GAAKzmE,EAAGqM,OAAO,EAElE,KAAKrM,EAAI,EAAS,IAALA,EAAWA,IAAMumE,EAAM,IAAMvmE,IAAMymE,KAAK,IAAMzmE,EAAGqM,OAAO,EAErE,KAAKrM,EAAI,EAAS,GAALA,EAAUA,IAAMumE,EAAM,MAAQvmE,IAAMymE,KAAK,GAAKzmE,EAAGqM,OAAO,EAGrEk6D,GAAM,SAAWE,KAAK,IAAKp6D,OAAO,GAClCk6D,EAAM,SAAWE,KAAK,IAAKp6D,OAAO,GAClCk6D,EAAM,SAAWE,KAAK,IAAKp6D,OAAO,GAClCk6D,EAAM,SAAWE,KAAK,IAAKp6D,OAAO,GAClCk6D,EAAM,SAAWE,KAAK,IAAKp6D,OAAO,GAElCk6D,EAAY,MAAME,KAAK,GAAIp6D,OAAO,GAClCk6D,EAAU,IAAQE,KAAK,GAAIp6D,OAAO,GAClCk6D,EAAa,OAAKE,KAAK,GAAIp6D,OAAO,GAClCk6D,EAAY,MAAME,KAAK,GAAIp6D,OAAO,GAElCk6D,EAAa,OAAKE,KAAK,GAAIp6D,OAAO,GAClCk6D,EAAa,OAAKE,KAAK,GAAIp6D,OAAO,GAClCk6D,EAAa,OAAKE,KAAK,GAAIp6D,MAAOrL,QAClCulE,EAAW,KAAOE,KAAK,GAAIp6D,OAAO,GAClCk6D,EAAiB,WAAKE,KAAK,EAAGp6D,OAAO,GACrCk6D,EAAW,KAAWE,KAAK,EAAGp6D,OAAO,GACrCk6D,EAAY,MAAUE,KAAK,GAAIp6D,OAAO,GACtCk6D,EAAW,KAAWE,KAAK,GAAIp6D,OAAO,GACtCk6D,EAAM,WAAgBE,KAAK,GAAIp6D,OAAO,GACtCk6D,EAAc,QAAQE,KAAK,GAAIp6D,OAAO,GACtCk6D,EAAgB,UAAME,KAAK,GAAIp6D,OAAO,GAEtCk6D,EAAM,MAAYE,KAAK,IAAKp6D,OAAO,GACnCk6D,EAAM,MAAYE,KAAK,IAAKp6D,OAAO,GACnCk6D,EAAM,MAAYE,KAAK,IAAKp6D,OAAO,GACnCk6D,EAAM,MAAYE,KAAK,IAAKp6D,OAAO,EAInC,IAAIq6D,GAAO,SAASziE,GAAQ0iE,EAAY1iE,EAAM,YAC1C2iE,EAAK,SAAS3iE,GAAQ0iE,EAAY1iE,EAAM,UAGxC0iE,EAAc,SAAS1iE,EAAM3C,GAC/B,GAAoCN,SAAhColE,EAAO9kE,GAAM2C,EAAM4iE,SAAwB,CAE7C,IAAK,GADDC,GAAQV,EAAO9kE,GAAM2C,EAAM4iE,SACtB7mE,EAAI,EAAGA,EAAI8mE,EAAM3mE,OAAQH,IACTgB,SAAnB8lE,EAAM9mE,GAAGqM,MACXy6D,EAAM9mE,GAAGkU,GAAGjQ,GAEa,GAAlB6iE,EAAM9mE,GAAGqM,OAAmC,GAAlBpI,EAAMsqC,SACvCu4B,EAAM9mE,GAAGkU,GAAGjQ,GAEa,GAAlB6iE,EAAM9mE,GAAGqM,OAAoC,GAAlBpI,EAAMsqC,UACxCu4B,EAAM9mE,GAAGkU,GAAGjQ,EAIM,IAAlBD,GACFC,EAAMD,kBA0FZ,OApFAvJ,MAAKq1B,KAAO,SAASzsB,EAAKJ,EAAU3B,GAIlC,GAHaN,SAATM,IACFA,EAAO,WAEUN,SAAfulE,EAAMljE,GACR,KAAM,IAAIhF,OAAM,oBAAsBgF,EAEFrC,UAAlColE,EAAO9kE,GAAMilE,EAAMljE,GAAKojE,QAC1BL,EAAO9kE,GAAMilE,EAAMljE,GAAKojE,UAE1BL,EAAO9kE,GAAMilE,EAAMljE,GAAKojE,MAAM9jE,MAAMuR,GAAGjR,EAAUoJ,MAAMk6D,EAAMljE,GAAKgJ,SAKpE5R,KAAKssE,QAAU,SAAS9jE,EAAU3B,GACnBN,SAATM,IACFA,EAAO,UAET,KAAK+B,MAAOkjE,GACNA,EAAMjmE,eAAe+C,MACvB5I,KAAKq1B,KAAKzsB,IAAIJ,EAAS3B,IAM7B7G,KAAKusE,OAAS,SAAS/iE,GACrB,IAAKZ,MAAOkjE,GACV,GAAIA,EAAMjmE,eAAe+C,KAAM,CAC7B,GAAsB,GAAlBY,EAAMsqC,UAAwC,GAApBg4B,EAAMljE,KAAKgJ,OAAiBpI,EAAM4iE,SAAWN,EAAMljE,KAAKojE,KACpF,MAAOpjE,IAEJ,IAAsB,GAAlBY,EAAMsqC,UAAyC,GAApBg4B,EAAMljE,KAAKgJ,OAAkBpI,EAAM4iE,SAAWN,EAAMljE,KAAKojE,KAC3F,MAAOpjE,IAEJ,IAAIY,EAAM4iE,SAAWN,EAAMljE,KAAKojE,MAAe,SAAPpjE,IAC3C,MAAOA,KAIb,MAAO,wCAIT5I,KAAK+qE,OAAS,SAASniE,EAAKJ,EAAU3B,GAIpC,GAHaN,SAATM,IACFA,EAAO,WAEUN,SAAfulE,EAAMljE,GACR,KAAM,IAAIhF,OAAM,oBAAsBgF,EAExC,IAAiBrC,SAAbiC,EAAwB,CAG1B,IAAK,GAFDgkE,MACAH,EAAQV,EAAO9kE,GAAMilE,EAAMljE,GAAKojE,MAC3BzmE,EAAI,EAAGA,EAAI8mE,EAAM3mE,OAAQH,KAC1B8mE,EAAM9mE,GAAGkU,IAAMjR,GAAY6jE,EAAM9mE,GAAGqM,OAASk6D,EAAMljE,GAAKgJ,QAC5D46D,EAAYtkE,KAAKyjE,EAAO9kE,GAAMilE,EAAMljE,GAAKojE,MAAMzmE,GAGnDomE,GAAO9kE,GAAMilE,EAAMljE,GAAKojE,MAAQQ,MAGhCb,GAAO9kE,GAAMilE,EAAMljE,GAAKojE,UAK5BhsE,KAAKuoD,MAAQ,WACXojB,GAAUC,WAAYC,WAIxB7rE,KAAK4T,QAAU,WACb+3D,GAAUC,WAAYC,UACtBpkE,OAAO4B,oBAAoB,UAAW4iE,GAAM,GAC5CxkE,OAAO4B,oBAAoB,QAAS8iE,GAAI,IAI1C1kE,OAAOoB,iBAAiB,UAAUojE,GAAK,GACvCxkE,OAAOoB,iBAAiB,QAAQsjE,GAAG,GAG5BnsE,KAGT,MAAOukD,MAQL,SAAS1kD,EAAQD,EAASM,GAE9B,GAAIwrE,IAA0D,SAASe,EAAQ5sE,IAM/E,SAAW0G,GA0RP,QAASmmE,GAAIpnE,EAAGa,EAAG1F,GACf,OAAQgF,UAAUC,QACd,IAAK,GAAG,MAAY,OAALJ,EAAYA,EAAIa,CAC/B,KAAK,GAAG,MAAY,OAALb,EAAYA,EAAS,MAALa,EAAYA,EAAI1F,CAC/C,SAAS,KAAM,IAAImD,OAAM,iBAIjC,QAAS+oE,GAAWrnE,EAAGa,GACnB,MAAON,IAAetF,KAAK+E,EAAGa,GAGlC,QAASymE,KAGL,OACIC,OAAQ,EACRC,gBACAC,eACAhpD,SAAW,GACXipD,cAAgB,EAChBC,WAAY,EACZC,aAAe,KACfC,eAAgB,EAChBC,iBAAkB,EAClBC,KAAK,GAIb,QAASC,GAASC,GACV1pE,GAAO2pE,+BAAgC,GAChB,mBAAZv0C,UAA2BA,QAAQw0C,MAC9Cx0C,QAAQw0C,KAAK,wBAA0BF,GAI/C,QAASG,GAAUH,EAAK9zD,GACpB,GAAIk0D,IAAY,CAChB,OAAOtoE,GAAO,WAKV,MAJIsoE,KACAL,EAASC,GACTI,GAAY,GAETl0D,EAAGnB,MAAMtY,KAAMyF,YACvBgU,GAGP,QAASm0D,GAAgBp3D,EAAM+2D,GACtBM,GAAar3D,KACd82D,EAASC,GACTM,GAAar3D,IAAQ,GAI7B,QAASs3D,GAASC,EAAMx2D,GACpB,MAAO,UAAUjS,GACb,MAAO0oE,GAAaD,EAAKxtE,KAAKP,KAAMsF,GAAIiS,IAGhD,QAAS02D,GAAgBF,EAAMG,GAC3B,MAAO,UAAU5oE,GACb,MAAOtF,MAAKmuE,aAAaC,QAAQL,EAAKxtE,KAAKP,KAAMsF,GAAI4oE,IAmB7D,QAASG,MAIT,QAASC,GAAOC,EAAQC,GAChBA,KAAiB,GACjBC,EAAcF,GAElBG,EAAW1uE,KAAMuuE,GACjBvuE,KAAKw4B,GAAK,GAAIn0B,OAAMkqE,EAAO/1C,IAI/B,QAASm2C,GAASv+D,GACd,GAAIw+D,GAAkBC,EAAqBz+D,GACvC0+D,EAAQF,EAAgB/1C,MAAQ,EAChCk2C,EAAWH,EAAgBI,SAAW,EACtCC,EAASL,EAAgB51C,OAAS,EAClCk2C,EAAQN,EAAgBO,MAAQ,EAChCC,EAAOR,EAAgBj2C,KAAO,EAC9BgF,EAAQixC,EAAgBS,MAAQ,EAChCzxC,EAAUgxC,EAAgBU,QAAU,EACpCzxC,EAAU+wC,EAAgBW,QAAU,EACpCzxC,EAAe8wC,EAAgBY,aAAe,CAGlDxvE,MAAKyvE,eAAiB3xC,EACR,IAAVD,EACU,IAAVD,EACQ,KAARD,EAGJ39B,KAAK0vE,OAASN,EACF,EAARF,EAIJlvE,KAAK2vE,SAAWV,EACD,EAAXF,EACQ,GAARD,EAEJ9uE,KAAKkT,SAELlT,KAAK4vE,QAAU/rE,GAAOsqE,aAEtBnuE,KAAK6vE,UAQT,QAASxqE,GAAOC,EAAGa,GACf,IAAK,GAAIZ,KAAKY,GACNwmE,EAAWxmE,EAAGZ,KACdD,EAAEC,GAAKY,EAAEZ,GAYjB,OARIonE,GAAWxmE,EAAG,cACdb,EAAEF,SAAWe,EAAEf,UAGfunE,EAAWxmE,EAAG,aACdb,EAAEyB,QAAUZ,EAAEY,SAGXzB,EAGX,QAASopE,GAAWnlD,EAAID,GACpB,GAAI/jB,GAAGK,EAAMkqE,CAiCb,IA/BqC,mBAA1BxmD,GAAKymD,mBACZxmD,EAAGwmD,iBAAmBzmD,EAAKymD,kBAER,mBAAZzmD,GAAK0mD,KACZzmD,EAAGymD,GAAK1mD,EAAK0mD,IAEM,mBAAZ1mD,GAAK2mD,KACZ1mD,EAAG0mD,GAAK3mD,EAAK2mD,IAEM,mBAAZ3mD,GAAK4mD,KACZ3mD,EAAG2mD,GAAK5mD,EAAK4mD,IAEW,mBAAjB5mD,GAAK6mD,UACZ5mD,EAAG4mD,QAAU7mD,EAAK6mD,SAEG,mBAAd7mD,GAAK8mD,OACZ7mD,EAAG6mD,KAAO9mD,EAAK8mD,MAEQ,mBAAhB9mD,GAAK+mD,SACZ9mD,EAAG8mD,OAAS/mD,EAAK+mD,QAEO,mBAAjB/mD,GAAKgnD,UACZ/mD,EAAG+mD,QAAUhnD,EAAKgnD,SAEE,mBAAbhnD,GAAKinD,MACZhnD,EAAGgnD,IAAMjnD,EAAKinD,KAEU,mBAAjBjnD,GAAKsmD,UACZrmD,EAAGqmD,QAAUtmD,EAAKsmD,SAGlBY,GAAiB9qE,OAAS,EAC1B,IAAKH,IAAKirE,IACN5qE,EAAO4qE,GAAiBjrE,GACxBuqE,EAAMxmD,EAAK1jB,GACQ,mBAARkqE,KACPvmD,EAAG3jB,GAAQkqE,EAKvB,OAAOvmD,GAGX,QAASknD,GAASC,GACd,MAAa,GAATA,EACOzrE,KAAKmyC,KAAKs5B,GAEVzrE,KAAKC,MAAMwrE,GAM1B,QAAS1C,GAAa0C,EAAQC,EAAcC,GAIxC,IAHA,GAAIC,GAAS,GAAK5rE,KAAK8lB,IAAI2lD,GACvBthD,EAAOshD,GAAU,EAEdG,EAAOnrE,OAASirE,GACnBE,EAAS,IAAMA,CAEnB,QAAQzhD,EAAQwhD,EAAY,IAAM,GAAM,KAAOC,EAGnD,QAASC,GAA0BC,EAAMprE,GACrC,GAAIqrE,IAAOlzC,aAAc,EAAGmxC,OAAQ,EAUpC,OARA+B,GAAI/B,OAAStpE,EAAMqzB,QAAU+3C,EAAK/3C,QACC,IAA9BrzB,EAAMkzB,OAASk4C,EAAKl4C,QACrBk4C,EAAKr4C,QAAQnlB,IAAIy9D,EAAI/B,OAAQ,KAAKgC,QAAQtrE,MACxCqrE,EAAI/B,OAGV+B,EAAIlzC,cAAgBn4B,GAAUorE,EAAKr4C,QAAQnlB,IAAIy9D,EAAI/B,OAAQ,KAEpD+B,EAGX,QAASE,GAAkBH,EAAMprE,GAC7B,GAAIqrE,EAUJ,OATArrE,GAAQwrE,EAAOxrE,EAAOorE,GAClBA,EAAKK,SAASzrE,GACdqrE,EAAMF,EAA0BC,EAAMprE,IAEtCqrE,EAAMF,EAA0BnrE,EAAOorE,GACvCC,EAAIlzC,cAAgBkzC,EAAIlzC,aACxBkzC,EAAI/B,QAAU+B,EAAI/B,QAGf+B,EAIX,QAASK,GAAY71C,EAAWhlB,GAC5B,MAAO,UAAUs5D,EAAK5B,GAClB,GAAIoD,GAAKC,CAUT,OARe,QAAXrD,GAAoBzpE,OAAOypE,KAC3BN,EAAgBp3D,EAAM,YAAcA,EAAQ,uDAAyDA,EAAO,qBAC5G+6D,EAAMzB,EAAKA,EAAM5B,EAAQA,EAASqD,GAGtCzB,EAAqB,gBAARA,IAAoBA,EAAMA,EACvCwB,EAAMztE,GAAOuM,SAAS0/D,EAAK5B,GAC3BsD,EAAgCxxE,KAAMsxE,EAAK91C,GACpCx7B,MAIf,QAASwxE,GAAgCC,EAAKrhE,EAAUshE,EAAUC,GAC9D,GAAI7zC,GAAe1tB,EAASq/D,cACxBL,EAAOh/D,EAASs/D,MAChBT,EAAS7+D,EAASu/D,OACtBgC,GAA+B,MAAhBA,GAAuB,EAAOA,EAEzC7zC,GACA2zC,EAAIj5C,GAAGo5C,SAASH,EAAIj5C,GAAKsF,EAAe4zC,GAExCtC,GACAyC,GAAUJ,EAAK,OAAQK,GAAUL,EAAK,QAAUrC,EAAOsC,GAEvDzC,GACA8C,GAAeN,EAAKK,GAAUL,EAAK,SAAWxC,EAASyC,GAEvDC,GACA9tE,GAAO8tE,aAAaF,EAAKrC,GAAQH,GAKzC,QAAShpE,GAAQ+rE,GACb,MAAiD,mBAA1C1rE,OAAOmN,UAAUrO,SAAS7E,KAAKyxE,GAG1C,QAAS5tE,GAAO4tE,GACZ,MAAiD,kBAA1C1rE,OAAOmN,UAAUrO,SAAS7E,KAAKyxE,IAClCA,YAAiB3tE,MAIzB,QAAS4tE,GAActS,EAAQC,EAAQsS,GACnC,GAGI3sE,GAHAC,EAAMP,KAAKwG,IAAIk0D,EAAOj6D,OAAQk6D,EAAOl6D,QACrCysE,EAAaltE,KAAK8lB,IAAI40C,EAAOj6D,OAASk6D,EAAOl6D,QAC7C0sE,EAAQ,CAEZ,KAAK7sE,EAAI,EAAOC,EAAJD,EAASA,KACZ2sE,GAAevS,EAAOp6D,KAAOq6D,EAAOr6D,KACnC2sE,GAAeG,EAAM1S,EAAOp6D,MAAQ8sE,EAAMzS,EAAOr6D,MACnD6sE,GAGR,OAAOA,GAAQD,EAGnB,QAASG,GAAeC,GACpB,GAAIA,EAAO,CACP,GAAIC,GAAUD,EAAMhiB,cAAcnkD,QAAQ,QAAS,KACnDmmE,GAAQE,GAAYF,IAAUG,GAAeF,IAAYA,EAE7D,MAAOD,GAGX,QAAS1D,GAAqB8D,GAC1B,GACIC,GACAhtE,EAFAgpE,IAIJ,KAAKhpE,IAAQ+sE,GACLhG,EAAWgG,EAAa/sE,KACxBgtE,EAAiBN,EAAe1sE,GAC5BgtE,IACAhE,EAAgBgE,GAAkBD,EAAY/sE,IAK1D,OAAOgpE,GAGX,QAASiE,GAASzjE,GACd,GAAImI,GAAOu7D,CAEX,IAA8B,IAA1B1jE,EAAM1I,QAAQ,QACd6Q,EAAQ,EACRu7D,EAAS,UAER,CAAA,GAA+B,IAA3B1jE,EAAM1I,QAAQ,SAKnB,MAJA6Q,GAAQ,GACRu7D,EAAS,QAMbjvE,GAAOuL,GAAS,SAAUg1B,EAAQ/7B,GAC9B,GAAI9C,GAAGwtE,EACHx5D,EAAS1V,GAAO+rE,QAAQxgE,GACxB4jE,IAYJ,IAVsB,gBAAX5uC,KACP/7B,EAAQ+7B,EACRA,EAAS79B,GAGbwsE,EAAS,SAAUxtE,GACf,GAAI/E,GAAIqD,KAASovE,MAAMC,IAAIJ,EAAQvtE,EACnC,OAAOgU,GAAOhZ,KAAKsD,GAAO+rE,QAASpvE,EAAG4jC,GAAU,KAGvC,MAAT/7B,EACA,MAAO0qE,GAAO1qE,EAGd,KAAK9C,EAAI,EAAOgS,EAAJhS,EAAWA,IACnBytE,EAAQ9qE,KAAK6qE,EAAOxtE,GAExB,OAAOytE,IAKnB,QAASX,GAAMc,GACX,GAAIC,IAAiBD,EACjB/rE,EAAQ,CAUZ,OARsB,KAAlBgsE,GAAuBC,SAASD,KAE5BhsE,EADAgsE,GAAiB,EACTnuE,KAAKC,MAAMkuE,GAEXnuE,KAAKmyC,KAAKg8B,IAInBhsE,EAGX,QAASksE,GAAYz6C,EAAMG,GACvB,MAAO,IAAI30B,MAAKA,KAAKkvE,IAAI16C,EAAMG,EAAQ,EAAG,IAAIw6C,aAGlD,QAASC,GAAY56C,EAAM66C,EAAKC,GAC5B,MAAOC,IAAW/vE,IAAQg1B,EAAM,GAAI,GAAK66C,EAAMC,IAAOD,EAAKC,GAAKxE,KAGpE,QAAS0E,GAAWh7C,GAChB,MAAOi7C,GAAWj7C,GAAQ,IAAM,IAGpC,QAASi7C,GAAWj7C,GAChB,MAAQA,GAAO,IAAM,GAAKA,EAAO,MAAQ,GAAMA,EAAO,MAAQ,EAGlE,QAAS41C,GAAcjuE,GACnB,GAAIujB,EACAvjB,GAAEuzE,IAAyB,KAAnBvzE,EAAE+vE,IAAIxsD,WACdA,EACIvjB,EAAEuzE,GAAGzxC,IAAS,GAAK9hC,EAAEuzE,GAAGzxC,IAAS,GAAKA,GACtC9hC,EAAEuzE,GAAGC,IAAQ,GAAKxzE,EAAEuzE,GAAGC,IAAQV,EAAY9yE,EAAEuzE,GAAGxxC,IAAO/hC,EAAEuzE,GAAGzxC,KAAU0xC,GACtExzE,EAAEuzE,GAAG3xC,IAAQ,GAAK5hC,EAAEuzE,GAAG3xC,IAAQ,GAAKA,GACpC5hC,EAAEuzE,GAAG5xC,IAAU,GAAK3hC,EAAEuzE,GAAG5xC,IAAU,GAAKA,GACxC3hC,EAAEuzE,GAAG7xC,IAAU,GAAK1hC,EAAEuzE,GAAG7xC,IAAU,GAAKA,GACxC1hC,EAAEuzE,GAAG9xC,IAAe,GAAKzhC,EAAEuzE,GAAG9xC,IAAe,IAAMA,GACnD,GAEAzhC,EAAE+vE,IAAI0D,qBAAkC1xC,GAAXxe,GAAmBA,EAAWiwD,MAC3DjwD,EAAWiwD,IAGfxzE,EAAE+vE,IAAIxsD,SAAWA,GAIzB,QAASmwD,GAAQ1zE,GAgBb,MAfkB,OAAdA,EAAE2zE,WACF3zE,EAAE2zE,UAAY1vE,MAAMjE,EAAEg4B,GAAG47C,YACrB5zE,EAAE+vE,IAAIxsD,SAAW,IAChBvjB,EAAE+vE,IAAI1D,QACNrsE,EAAE+vE,IAAIrD,eACN1sE,EAAE+vE,IAAItD,YACNzsE,EAAE+vE,IAAIpD,gBACN3sE,EAAE+vE,IAAInD,gBAEP5sE,EAAE2vE,UACF3vE,EAAE2zE,SAAW3zE,EAAE2zE,UACa,IAAxB3zE,EAAE+vE,IAAIvD,eACwB,IAA9BxsE,EAAE+vE,IAAIzD,aAAapnE,SAGxBlF,EAAE2zE,SAGb,QAASE,GAAgBzrE,GACrB,MAAOA,GAAMA,EAAI2nD,cAAcnkD,QAAQ,IAAK,KAAOxD,EAMvD,QAAS0rE,GAAaC,GAGlB,IAFA,GAAWxoD,GAAGxD,EAAMqc,EAAQ38B,EAAxB1C,EAAI,EAEDA,EAAIgvE,EAAM7uE,QAAQ,CAKrB,IAJAuC,EAAQosE,EAAgBE,EAAMhvE,IAAI0C,MAAM,KACxC8jB,EAAI9jB,EAAMvC,OACV6iB,EAAO8rD,EAAgBE,EAAMhvE,EAAI,IACjCgjB,EAAOA,EAAOA,EAAKtgB,MAAM,KAAO,KACzB8jB,EAAI,GAAG,CAEV,GADA6Y,EAAS4vC,EAAWvsE,EAAMq1B,MAAM,EAAGvR,GAAG5jB,KAAK,MAEvC,MAAOy8B,EAEX,IAAIrc,GAAQA,EAAK7iB,QAAUqmB,GAAKkmD,EAAchqE,EAAOsgB,GAAM,IAASwD,EAAI,EAEpE,KAEJA,KAEJxmB,IAEJ,MAAO,MAGX,QAASivE,GAAWh+D,GAChB,GAAIi+D,GAAY,IAChB,KAAK9vC,GAAQnuB,IAASk+D,GAClB,IACID,EAAY5wE,GAAO+gC,UACjB,WAAkC,GAAIp4B,GAAI,GAAI5I,OAAM,gCAAiE,MAA7B4I,GAAEw/D,KAAO,mBAA0Bx/D,KAE7H3I,GAAO+gC,OAAO6vC,GAChB,MAAOjoE,IAEb,MAAOm4B,IAAQnuB,GAInB,QAAS26D,GAAOa,EAAO2C,GACnB,MAAOA,GAAMtE,OAASxsE,GAAOmuE,GAAO4C,KAAKD,EAAMrE,SAAW,GACtDzsE,GAAOmuE,GAAO6C,QAoMtB,QAASC,GAAuB9C,GAC5B,MAAIA,GAAM1tE,MAAM,YACL0tE,EAAM5lE,QAAQ,WAAY,IAE9B4lE,EAAM5lE,QAAQ,MAAO,IAGhC,QAAS2oE,GAAmB3wC,GACxB,GAA4C7+B,GAAGG,EAA3CgD,EAAQ07B,EAAO9/B,MAAM0wE,GAEzB,KAAKzvE,EAAI,EAAGG,EAASgD,EAAMhD,OAAYA,EAAJH,EAAYA,IAEvCmD,EAAMnD,GADN0vE,GAAqBvsE,EAAMnD,IAChB0vE,GAAqBvsE,EAAMnD,IAE3BuvE,EAAuBpsE,EAAMnD,GAIhD,OAAO,UAAUksE,GACb,GAAIZ,GAAS,EACb,KAAKtrE,EAAI,EAAOG,EAAJH,EAAYA,IACpBsrE,GAAUnoE,EAAMnD,YAAcwrC,UAAWroC,EAAMnD,GAAGhF,KAAKkxE,EAAKrtC,GAAU17B,EAAMnD,EAEhF,OAAOsrE,IAKf,QAASqE,GAAa10E,EAAG4jC,GACrB,MAAK5jC,GAAE0zE,WAIP9vC,EAAS+wC,EAAa/wC,EAAQ5jC,EAAE2tE,cAE3BiH,GAAgBhxC,KACjBgxC,GAAgBhxC,GAAU2wC,EAAmB3wC,IAG1CgxC,GAAgBhxC,GAAQ5jC,IATpBA,EAAE2tE,aAAakH,cAY9B,QAASF,GAAa/wC,EAAQQ,GAG1B,QAAS0wC,GAA4BtD,GACjC,MAAOptC,GAAO2wC,eAAevD,IAAUA,EAH3C,GAAIzsE,GAAI,CAOR,KADAiwE,GAAsBC,UAAY,EAC3BlwE,GAAK,GAAKiwE,GAAsBlnE,KAAK81B,IACxCA,EAASA,EAAOh4B,QAAQopE,GAAuBF,GAC/CE,GAAsBC,UAAY,EAClClwE,GAAK,CAGT,OAAO6+B,GAUX,QAASsxC,GAAsBrX,EAAOkQ,GAClC,GAAIjpE,GAAGw5D,EAASyP,EAAO4B,OACvB,QAAQ9R,GACR,IAAK,IACD,MAAOsX,GACX,KAAK,OACD,MAAOC,GACX,KAAK,OACL,IAAK,OACL,IAAK,OACD,MAAO9W,GAAS+W,GAAuBC,EAC3C,KAAK,IACL,IAAK,IACL,IAAK,IACD,MAAOC,GACX,KAAK,SACL,IAAK,QACL,IAAK,QACL,IAAK,QACD,MAAOjX,GAASkX,GAAsBC,EAC1C,KAAK,IACD,GAAInX,EACA,MAAO6W,GAGf,KAAK,KACD,GAAI7W,EACA,MAAOoX,GAGf,KAAK,MACD,GAAIpX,EACA,MAAO8W,GAGf,KAAK,MACD,MAAOO,GACX,KAAK,MACL,IAAK,OACL,IAAK,KACL,IAAK,MACL,IAAK,OACD,MAAOC,GACX,KAAK,IACL,IAAK,IACD,MAAO7H,GAAOqB,QAAQyG,cAC1B,KAAK,IACD,MAAOC,GACX,KAAK,IACL,IAAK,KACD,MAAOC,GACX,KAAK,IACD,MAAOC,GACX,KAAK,OACD,MAAOC,GACX,KAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACD,MAAO3X,GAASoX,GAAsBQ,EAC1C,KAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACD,MAAOA,GACX,KAAK,KACD,MAAOC,GACX,SAEI,MADArxE,GAAI,GAAIsxE,QAAOC,GAAaC,GAAezY,EAAMjyD,QAAQ,KAAM,KAAM,OAK7E,QAAS2qE,GAA0BC,GAC/BA,EAASA,GAAU,EACnB,IAAIC,GAAqBD,EAAO1yE,MAAMiyE,QAClCW,EAAUD,EAAkBA,EAAkBvxE,OAAS,OACvDgI,GAASwpE,EAAU,IAAI5yE,MAAM6yE,MAA0B,IAAK,EAAG,GAC/Dv5C,IAAuB,GAAXlwB,EAAM,IAAW2kE,EAAM3kE,EAAM,GAE7C,OAAoB,MAAbA,EAAM,IAAckwB,EAAUA,EAIzC,QAASw5C,GAAwB/Y,EAAO2T,EAAOzD,GAC3C,GAAIjpE,GAAG+xE,EAAgB9I,EAAOwF,EAE9B,QAAQ1V,GAER,IAAK,IACY,MAAT2T,IACAqF,EAAc/0C,IAA8B,GAApB+vC,EAAML,GAAS,GAE3C,MAEJ,KAAK,IACL,IAAK,KACY,MAATA,IACAqF,EAAc/0C,IAAS+vC,EAAML,GAAS,EAE1C,MACJ,KAAK,MACL,IAAK,OACD1sE,EAAIipE,EAAOqB,QAAQ0H,YAAYtF,GAEtB,MAAL1sE,EACA+xE,EAAc/0C,IAASh9B,EAEvBipE,EAAOgC,IAAIrD,aAAe8E,CAE9B,MAEJ,KAAK,IACL,IAAK,KACY,MAATA,IACAqF,EAAcrD,IAAQ3B,EAAML,GAEhC,MACJ,KAAK,KACY,MAATA,IACAqF,EAAcrD,IAAQ3B,EAAMrnD,SAASgnD,EAAO,KAEhD,MAEJ,KAAK,MACL,IAAK,OACY,MAATA,IACAzD,EAAOgJ,WAAalF,EAAML,GAG9B,MAEJ,KAAK,KACDqF,EAAc90C,IAAQ1+B,GAAO2zE,kBAAkBxF,EAC/C,MACJ,KAAK,OACL,IAAK,QACL,IAAK,SACDqF,EAAc90C,IAAQ8vC,EAAML,EAC5B,MAEJ,KAAK,IACL,IAAK,IACDzD,EAAOkJ,MAAQlJ,EAAOqB,QAAQ8H,KAAK1F,EACnC,MAEJ,KAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACDqF,EAAcj1C,IAAQiwC,EAAML,EAC5B,MAEJ,KAAK,IACL,IAAK,KACDqF,EAAcl1C,IAAUkwC,EAAML,EAC9B,MAEJ,KAAK,IACL,IAAK,KACDqF,EAAcn1C,IAAUmwC,EAAML,EAC9B,MAEJ,KAAK,IACL,IAAK,KACL,IAAK,MACL,IAAK,OACDqF,EAAcp1C,IAAeowC,EAAuB,KAAhB,KAAOL,GAC3C,MAEJ,KAAK,IACDzD,EAAO/1C,GAAK,GAAIn0B,MAAyB,IAApBkhB,WAAWysD,GAChC,MAEJ,KAAK,IACL,IAAK,KACDzD,EAAOoJ,SAAU,EACjBpJ,EAAO6B,KAAO2G,EAA0B/E,EACxC,MAEJ,KAAK,KACL,IAAK,MACL,IAAK,OACD1sE,EAAIipE,EAAOqB,QAAQgI,cAAc5F,GAExB,MAAL1sE,GACAipE,EAAOsJ,GAAKtJ,EAAOsJ,OACnBtJ,EAAOsJ,GAAM,EAAIvyE,GAEjBipE,EAAOgC,IAAIuH,eAAiB9F,CAEhC,MAEJ,KAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACD3T,EAAQA,EAAMrzD,OAAO,EAAG,EAE5B,KAAK,OACL,IAAK,OACL,IAAK,QACDqzD,EAAQA,EAAMrzD,OAAO,EAAG,GACpBgnE,IACAzD,EAAOsJ,GAAKtJ,EAAOsJ,OACnBtJ,EAAOsJ,GAAGxZ,GAASgU,EAAML,GAE7B,MACJ,KAAK,KACL,IAAK,KACDzD,EAAOsJ,GAAKtJ,EAAOsJ,OACnBtJ,EAAOsJ,GAAGxZ,GAASx6D,GAAO2zE,kBAAkBxF,IAIpD,QAAS+F,GAAsBxJ,GAC3B,GAAIzgB,GAAGkqB,EAAU7I,EAAM8I,EAASvE,EAAKC,EAAKuE,CAE1CpqB,GAAIygB,EAAOsJ,GACC,MAAR/pB,EAAEqqB,IAAqB,MAAPrqB,EAAEsqB,GAAoB,MAAPtqB,EAAEuqB,GACjC3E,EAAM,EACNC,EAAM,EAMNqE,EAAWtL,EAAI5e,EAAEqqB,GAAI5J,EAAOwF,GAAGxxC,IAAOqxC,GAAW/vE,KAAU,EAAG,GAAGg1B,MACjEs2C,EAAOzC,EAAI5e,EAAEsqB,EAAG,GAChBH,EAAUvL,EAAI5e,EAAEuqB,EAAG,KAEnB3E,EAAMnF,EAAOqB,QAAQ0I,MAAM5E,IAC3BC,EAAMpF,EAAOqB,QAAQ0I,MAAM3E,IAE3BqE,EAAWtL,EAAI5e,EAAEyqB,GAAIhK,EAAOwF,GAAGxxC,IAAOqxC,GAAW/vE,KAAU6vE,EAAKC,GAAK96C,MACrEs2C,EAAOzC,EAAI5e,EAAEA,EAAG,GAEL,MAAPA,EAAEvhD,GAEF0rE,EAAUnqB,EAAEvhD,EACEmnE,EAAVuE,KACE9I,GAIN8I,EAFc,MAAPnqB,EAAEthD,EAECshD,EAAEthD,EAAIknE,EAGNA,GAGlBwE,EAAOM,GAAmBR,EAAU7I,EAAM8I,EAAStE,EAAKD,GAExDnF,EAAOwF,GAAGxxC,IAAQ21C,EAAKr/C,KACvB01C,EAAOgJ,WAAaW,EAAKt/C,UAO7B,QAAS6/C,GAAelK,GACpB,GAAIhpE,GAAGwzB,EAAkB2/C,EAAaC,EAAzB3G,IAEb,KAAIzD,EAAO/1C,GAAX,CA6BA,IAzBAkgD,EAAcE,EAAiBrK,GAG3BA,EAAOsJ,IAAyB,MAAnBtJ,EAAOwF,GAAGC,KAAqC,MAApBzF,EAAOwF,GAAGzxC,KAClDy1C,EAAsBxJ,GAItBA,EAAOgJ,aACPoB,EAAYjM,EAAI6B,EAAOwF,GAAGxxC,IAAOm2C,EAAYn2C,KAEzCgsC,EAAOgJ,WAAa1D,EAAW8E,KAC/BpK,EAAOgC,IAAI0D,oBAAqB,GAGpCl7C,EAAO8/C,GAAYF,EAAW,EAAGpK,EAAOgJ,YACxChJ,EAAOwF,GAAGzxC,IAASvJ,EAAK+/C,cACxBvK,EAAOwF,GAAGC,IAAQj7C,EAAKy6C,cAQtBjuE,EAAI,EAAO,EAAJA,GAAyB,MAAhBgpE,EAAOwF,GAAGxuE,KAAcA,EACzCgpE,EAAOwF,GAAGxuE,GAAKysE,EAAMzsE,GAAKmzE,EAAYnzE,EAI1C,MAAW,EAAJA,EAAOA,IACVgpE,EAAOwF,GAAGxuE,GAAKysE,EAAMzsE,GAAsB,MAAhBgpE,EAAOwF,GAAGxuE,GAAqB,IAANA,EAAU,EAAI,EAAKgpE,EAAOwF,GAAGxuE,EAGrFgpE,GAAO/1C,IAAM+1C,EAAOoJ,QAAUkB,GAAcE,IAAUzgE,MAAM,KAAM05D,GAG/C,MAAfzD,EAAO6B,MACP7B,EAAO/1C,GAAGwgD,cAAczK,EAAO/1C,GAAGygD,gBAAkB1K,EAAO6B,OAInE,QAAS8I,GAAe3K,GACpB,GAAIK,EAEAL,GAAO/1C,KAIXo2C,EAAkBC,EAAqBN,EAAOyB,IAC9CzB,EAAOwF,IACHnF,EAAgB/1C,KAChB+1C,EAAgB51C,MAChB41C,EAAgBj2C,IAChBi2C,EAAgBS,KAChBT,EAAgBU,OAChBV,EAAgBW,OAChBX,EAAgBY,aAGpBiJ,EAAelK,IAGnB,QAASqK,GAAiBrK,GACtB,GAAI7wC,GAAM,GAAIr5B,KACd,OAAIkqE,GAAOoJ,SAEHj6C,EAAIy7C,iBACJz7C,EAAIo7C,cACJp7C,EAAI81C,eAGA91C,EAAIgF,cAAehF,EAAI4F,WAAY5F,EAAI2F,WAKvD,QAAS+1C,GAA4B7K,GACjC,GAAIA,EAAO0B,KAAOpsE,GAAOw1E,SAErB,WADAC,IAAS/K,EAIbA,GAAOwF,MACPxF,EAAOgC,IAAI1D,OAAQ,CAGnB,IACItnE,GAAGg0E,EAAaC,EAAQnb,EAAOob,EAD/BzC,EAAS,GAAKzI,EAAOyB,GAErB0J,EAAe1C,EAAOtxE,OACtBi0E,EAAyB,CAI7B,KAFAH,EAASrE,EAAa5G,EAAO0B,GAAI1B,EAAOqB,SAAStrE,MAAM0wE,QAElDzvE,EAAI,EAAGA,EAAIi0E,EAAO9zE,OAAQH,IAC3B84D,EAAQmb,EAAOj0E,GACfg0E,GAAevC,EAAO1yE,MAAMoxE,EAAsBrX,EAAOkQ,SAAgB,GACrEgL,IACAE,EAAUzC,EAAOhsE,OAAO,EAAGgsE,EAAOtwE,QAAQ6yE,IACtCE,EAAQ/zE,OAAS,GACjB6oE,EAAOgC,IAAIxD,YAAY7kE,KAAKuxE,GAEhCzC,EAASA,EAAO15C,MAAM05C,EAAOtwE,QAAQ6yE,GAAeA,EAAY7zE,QAChEi0E,GAA0BJ,EAAY7zE,QAGtCuvE,GAAqB5W,IACjBkb,EACAhL,EAAOgC,IAAI1D,OAAQ,EAGnB0B,EAAOgC,IAAIzD,aAAa5kE,KAAKm2D,GAEjC+Y,EAAwB/Y,EAAOkb,EAAahL,IAEvCA,EAAO4B,UAAYoJ,GACxBhL,EAAOgC,IAAIzD,aAAa5kE,KAAKm2D,EAKrCkQ,GAAOgC,IAAIvD,cAAgB0M,EAAeC,EACtC3C,EAAOtxE,OAAS,GAChB6oE,EAAOgC,IAAIxD,YAAY7kE,KAAK8uE,GAI5BzI,EAAOkJ,OAASlJ,EAAOwF,GAAG3xC,IAAQ,KAClCmsC,EAAOwF,GAAG3xC,KAAS,IAGnBmsC,EAAOkJ,SAAU,GAA6B,KAApBlJ,EAAOwF,GAAG3xC,MACpCmsC,EAAOwF,GAAG3xC,IAAQ,GAGtBq2C,EAAelK,GACfE,EAAcF,GAGlB,QAASuI,IAAevrE,GACpB,MAAOA,GAAEa,QAAQ,sCAAuC,SAAUwtE,EAAS/S,EAAIC,EAAIC,EAAI8S,GACnF,MAAOhT,IAAMC,GAAMC,GAAM8S,IAKjC,QAAShD,IAAatrE,GAClB,MAAOA,GAAEa,QAAQ,yBAA0B,QAI/C,QAAS0tE,IAA2BvL,GAChC,GAAIwL,GACAC,EAEAC,EACA10E,EACA20E,CAEJ,IAAyB,IAArB3L,EAAO0B,GAAGvqE,OAGV,MAFA6oE,GAAOgC,IAAIpD,eAAgB,OAC3BoB,EAAO/1C,GAAK,GAAIn0B,MAAK81E,KAIzB,KAAK50E,EAAI,EAAGA,EAAIgpE,EAAO0B,GAAGvqE,OAAQH,IAC9B20E,EAAe,EACfH,EAAarL,KAAeH,GACN,MAAlBA,EAAOoJ,UACPoC,EAAWpC,QAAUpJ,EAAOoJ,SAEhCoC,EAAWxJ,IAAM3D,IACjBmN,EAAW9J,GAAK1B,EAAO0B,GAAG1qE,GAC1B6zE,EAA4BW,GAEvB7F,EAAQ6F,KAKbG,GAAgBH,EAAWxJ,IAAIvD,cAG/BkN,GAAqD,GAArCH,EAAWxJ,IAAIzD,aAAapnE,OAE5Cq0E,EAAWxJ,IAAI6J,MAAQF,GAEJ,MAAfD,GAAsCA,EAAfC,KACvBD,EAAcC,EACdF,EAAaD,GAIrB10E,GAAOkpE,EAAQyL,GAAcD,GAIjC,QAAST,IAAS/K,GACd,GAAIhpE,GAAG80E,EACHrD,EAASzI,EAAOyB,GAChB1rE,EAAQg2E,GAAS91E,KAAKwyE,EAE1B,IAAI1yE,EAAO,CAEP,IADAiqE,EAAOgC,IAAIlD,KAAM,EACZ9nE,EAAI,EAAG80E,EAAIE,GAAS70E,OAAY20E,EAAJ90E,EAAOA,IACpC,GAAIg1E,GAASh1E,GAAG,GAAGf,KAAKwyE,GAAS,CAE7BzI,EAAO0B,GAAKsK,GAASh1E,GAAG,IAAMjB,EAAM,IAAM,IAC1C,OAGR,IAAKiB,EAAI,EAAG80E,EAAIG,GAAS90E,OAAY20E,EAAJ90E,EAAOA,IACpC,GAAIi1E,GAASj1E,GAAG,GAAGf,KAAKwyE,GAAS,CAC7BzI,EAAO0B,IAAMuK,GAASj1E,GAAG,EACzB,OAGJyxE,EAAO1yE,MAAMiyE,MACbhI,EAAO0B,IAAM,KAEjBmJ,EAA4B7K,OAE5BA,GAAO4F,UAAW,EAK1B,QAASsG,IAAmBlM,GACxB+K,GAAS/K,GACLA,EAAO4F,YAAa,UACb5F,GAAO4F,SACdtwE,GAAO62E,wBAAwBnM,IAIvC,QAAS3gE,IAAImsC,EAAKtgC,GACd,GAAclU,GAAVyrE,IACJ,KAAKzrE,EAAI,EAAGA,EAAIw0C,EAAIr0C,SAAUH,EAC1ByrE,EAAI9oE,KAAKuR,EAAGsgC,EAAIx0C,GAAIA,GAExB,OAAOyrE,GAGX,QAAS2J,IAAkBpM,GACvB,GAAuBqL,GAAnB5H,EAAQzD,EAAOyB,EACfgC,KAAUzrE,EACVgoE,EAAO/1C,GAAK,GAAIn0B,MACTD,EAAO4tE,GACdzD,EAAO/1C,GAAK,GAAIn0B,OAAM2tE,GAC6B,QAA3C4H,EAAUgB,GAAgBp2E,KAAKwtE,IACvCzD,EAAO/1C,GAAK,GAAIn0B,OAAMu1E,EAAQ,IACN,gBAAV5H,GACdyI,GAAmBlM,GACZtoE,EAAQ+rE,IACfzD,EAAOwF,GAAKnmE,GAAIokE,EAAM10C,MAAM,GAAI,SAAUpa,GACtC,MAAO8H,UAAS9H,EAAK,MAEzBu1D,EAAelK,IACU,gBAAZ,GACb2K,EAAe3K,GACU,gBAAZ,GAEbA,EAAO/1C,GAAK,GAAIn0B,MAAK2tE,GAErBnuE,GAAO62E,wBAAwBnM,GAIvC,QAASwK,IAASzmE,EAAG9R,EAAG+L,EAAGjB,EAAGk8D,EAAGj8D,EAAGsvE,GAGhC,GAAI9hD,GAAO,GAAI10B,MAAKiO,EAAG9R,EAAG+L,EAAGjB,EAAGk8D,EAAGj8D,EAAGsvE,EAMtC,OAHQ,MAAJvoE,GACAymB,EAAK0J,YAAYnwB,GAEdymB,EAGX,QAAS8/C,IAAYvmE,GACjB,GAAIymB,GAAO,GAAI10B,MAAKA,KAAKkvE,IAAIj7D,MAAM,KAAM7S,WAIzC,OAHQ,MAAJ6M,GACAymB,EAAK+hD,eAAexoE,GAEjBymB,EAGX,QAASgiD,IAAa/I,EAAOptC,GACzB,GAAqB,gBAAVotC,GACP,GAAKvtE,MAAMutE,IAKP,GADAA,EAAQptC,EAAOgzC,cAAc5F,GACR,gBAAVA,GACP,MAAO,UALXA,GAAQhnD,SAASgnD,EAAO,GAShC,OAAOA,GASX,QAASgJ,IAAkBhE,EAAQtG,EAAQuK,EAAeC,EAAUt2C,GAChE,MAAOA,GAAOu2C,aAAazK,GAAU,IAAKuK,EAAejE,EAAQkE,GAGrE,QAASC,IAAaC,EAAgBH,EAAer2C,GACjD,GAAIx0B,GAAWvM,GAAOuM,SAASgrE,GAAgBrwD,MAC3C8S,EAAU9P,GAAM3d,EAASif,GAAG,MAC5BuO,EAAU7P,GAAM3d,EAASif,GAAG,MAC5BsO,EAAQ5P,GAAM3d,EAASif,GAAG,MAC1B+/C,EAAOrhD,GAAM3d,EAASif,GAAG,MACzB4/C,EAASlhD,GAAM3d,EAASif,GAAG,MAC3By/C,EAAQ/gD,GAAM3d,EAASif,GAAG,MAE1B7V,EAAOqkB,EAAUw9C,GAAuB9vE,IAAM,IAAKsyB,IACnC,IAAZD,IAAkB,MAClBA,EAAUy9C,GAAuB76E,IAAM,KAAMo9B,IACnC,IAAVD,IAAgB,MAChBA,EAAQ09C,GAAuB/vE,IAAM,KAAMqyB,IAClC,IAATyxC,IAAe,MACfA,EAAOiM,GAAuB9uE,IAAM,KAAM6iE,IAC/B,IAAXH,IAAiB,MACjBA,EAASoM,GAAuB7T,IAAM,KAAMyH,IAClC,IAAVH,IAAgB,OAAS,KAAMA,EAKvC,OAHAt1D,GAAK,GAAKyhE,EACVzhE,EAAK,IAAM4hE,EAAiB,EAC5B5hE,EAAK,GAAKorB,EACHo2C,GAAkB1iE,SAAUkB,GAgBvC,QAASo6D,IAAWnC,EAAK6J,EAAgBC,GACrC,GAEIC,GAFArrE,EAAMorE,EAAuBD,EAC7BG,EAAkBF,EAAuB9J,EAAI94C,KAajD,OATI8iD,GAAkBtrE,IAClBsrE,GAAmB,GAGDtrE,EAAM,EAAxBsrE,IACAA,GAAmB,GAGvBD,EAAiB33E,GAAO4tE,GAAKl+D,IAAIkoE,EAAiB,MAE9CtM,KAAMlqE,KAAKmyC,KAAKokC,EAAe5iD,YAAc,GAC7CC,KAAM2iD,EAAe3iD,QAK7B,QAAS2/C,IAAmB3/C,EAAMs2C,EAAM8I,EAASsD,EAAsBD,GACnE,GAA6CI,GAAW9iD,EAApDrsB,EAAIssE,GAAYhgD,EAAM,EAAG,GAAG8iD,WAOhC,OALApvE,GAAU,IAANA,EAAU,EAAIA,EAClB0rE,EAAqB,MAAXA,EAAkBA,EAAUqD,EACtCI,EAAYJ,EAAiB/uE,GAAKA,EAAIgvE,EAAuB,EAAI,IAAUD,EAAJ/uE,EAAqB,EAAI,GAChGqsB,EAAY,GAAKu2C,EAAO,IAAM8I,EAAUqD,GAAkBI,EAAY,GAGlE7iD,KAAMD,EAAY,EAAIC,EAAOA,EAAO,EACpCD,UAAWA,EAAY,EAAKA,EAAYi7C,EAAWh7C,EAAO,GAAKD,GAQvE,QAASgjD,IAAWrN,GAChB,GAAIyD,GAAQzD,EAAOyB,GACf5rC,EAASmqC,EAAO0B,EAIpB,OAFA1B,GAAOqB,QAAUrB,EAAOqB,SAAW/rE,GAAOsqE,WAAWI,EAAO2B,IAE9C,OAAV8B,GAAmB5tC,IAAW79B,GAAuB,KAAVyrE,EACpCnuE,GAAOg4E,SAAS5O,WAAW,KAGjB,gBAAV+E,KACPzD,EAAOyB,GAAKgC,EAAQzD,EAAOqB,QAAQkM,SAAS9J,IAG5CnuE,GAAOmD,SAASgrE,GACT,GAAI1D,GAAO0D,GAAO,IAClB5tC,EACHn+B,EAAQm+B,GACR01C,GAA2BvL,GAE3B6K,EAA4B7K,GAGhCoM,GAAkBpM,GAGf,GAAID,GAAOC,KAyCtB,QAASwN,IAAOtiE,EAAIuiE,GAChB,GAAIhL,GAAKzrE,CAIT,IAHuB,IAAnBy2E,EAAQt2E,QAAgBO,EAAQ+1E,EAAQ,MACxCA,EAAUA,EAAQ,KAEjBA,EAAQt2E,OACT,MAAO7B,KAGX,KADAmtE,EAAMgL,EAAQ,GACTz2E,EAAI,EAAGA,EAAIy2E,EAAQt2E,SAAUH,EAC1By2E,EAAQz2E,GAAGkU,GAAIu3D,KACfA,EAAMgL,EAAQz2E,GAGtB,OAAOyrE,GAgsBX,QAASe,IAAeN,EAAKrqE,GACzB,GAAI60E,EAGJ,OAAqB,gBAAV70E,KACPA,EAAQqqE,EAAItD,aAAamJ,YAAYlwE,GAEhB,gBAAVA,IACAqqE,GAIfwK,EAAah3E,KAAKwG,IAAIgmE,EAAI14C,OAClBu6C,EAAY7B,EAAI54C,OAAQzxB,IAChCqqE,EAAIj5C,GAAG,OAASi5C,EAAIpB,OAAS,MAAQ,IAAM,SAASjpE,EAAO60E,GACpDxK,GAGX,QAASK,IAAUL,EAAKyK,GACpB,MAAOzK,GAAIj5C,GAAG,OAASi5C,EAAIpB,OAAS,MAAQ,IAAM6L,KAGtD,QAASrK,IAAUJ,EAAKyK,EAAM90E,GAC1B,MAAa,UAAT80E,EACOnK,GAAeN,EAAKrqE,GAEpBqqE,EAAIj5C,GAAG,OAASi5C,EAAIpB,OAAS,MAAQ,IAAM6L,GAAM90E,GAIhE,QAAS+0E,IAAaD,EAAME,GACxB,MAAO,UAAUh1E,GACb,MAAa,OAATA,GACAyqE,GAAU7xE,KAAMk8E,EAAM90E,GACtBvD,GAAO8tE,aAAa3xE,KAAMo8E,GACnBp8E,MAEA8xE,GAAU9xE,KAAMk8E,IAkCnC,QAASG,IAAajN,GAElB,MAAc,KAAPA,EAAa,OAGxB,QAASkN,IAAaxN,GAGlB,MAAe,QAARA,EAAiB,IAmL5B,QAASyN,IAAmB/lE,GACxB3S,GAAOuM,SAASqJ,GAAGjD,GAAQ,WACvB,MAAOxW,MAAKkT,MAAMsD,IA0D1B,QAASgmE,IAAWC,GAEK,mBAAVC,SAGXC,GAAkBC,GAAY/4E,OAE1B+4E,GAAY/4E,OADZ44E,EACqB/O,EACb,uGAGA7pE,IAEaA,IAl7E7B,IAtVA,GAAIA,IAIA84E,GAGAp3E,GANAs3E,GAAU,QAEVD,GAAgC,mBAAXnQ,GAAyBA,EAASzsE,KAEvD+tB,GAAQ9oB,KAAK8oB,MACbloB,GAAiBS,OAAOmN,UAAU5N,eAGlC08B,GAAO,EACPD,GAAQ,EACR0xC,GAAO,EACP5xC,GAAO,EACPD,GAAS,EACTD,GAAS,EACTD,GAAc,EAGd0C,MAGA6rC,MAGAkE,GAA+B,mBAAX70E,IAA0BA,EAAOD,QAGrDg7E,GAAkB,sBAClBkC,GAA0B,uDAI1BC,GAAmB,gIAGnB/H,GAAmB,mKACnBQ,GAAwB,yCAGxBkB,GAA2B,QAC3BP,GAA6B,UAC7BL,GAA4B,UAC5BG,GAA2B,gBAC3BQ,GAAmB,MACnBL,GAAiB,mHACjBG,GAAqB,uBACrBC,GAAc,KACdF,GAAwB,yBACxBK,GAAoB,UAGpBhB,GAAqB,KACrBO,GAAsB,OACtBN,GAAwB,QACxBC,GAAuB,QACvBG,GAAsB,aACtBD,GAAyB,WAIzBuE,GAAW,4IAEX0C,GAAY,uBAEZzC,KACK,eAAgB,0BAChB,aAAc,sBACd,eAAgB,oBAChB,aAAc,iBACd,WAAY,gBAIjBC,KACK,gBAAiB,6BACjB,WAAY,wBACZ,QAAS,mBACT,KAAM,cAIXrD,GAAuB,kBAIvB8F,IADyB,0CAA0Ch1E,MAAM,MAErEi1E,aAAiB,EACjBC,QAAY,IACZC,QAAY,IACZC,MAAU,KACVC,KAAS,MACTC,OAAW,OACXC,MAAU,UAGd/K,IACIoI,GAAK,cACLtvE,EAAI,SACJ/K,EAAI,SACJ8K,EAAI,OACJiB,EAAI,MACJkxE,EAAI,OACJ3vB,EAAI,OACJsqB,EAAI,UACJ5Q,EAAI,QACJkW,EAAI,UACJprE,EAAI,OACJqrE,IAAM,YACNnxE,EAAI,UACJ6rE,EAAI,aACJE,GAAI,WACJJ,GAAI,eAGRzF,IACIkL,UAAY,YACZC,WAAa,aACbC,QAAU,UACVC,SAAW,WACXC,YAAc,eAIlB5I,MAGAiG,IACI9vE,EAAG,GACH/K,EAAG,GACH8K,EAAG,GACHiB,EAAG,GACHi7D,EAAG,IAIPyW,GAAmB,gBAAgBh2E,MAAM,KACzCi2E,GAAe,kBAAkBj2E,MAAM,KAEvCgtE,IACIzN,EAAO,WACH,MAAOxnE,MAAKg5B,QAAU,GAE1BmlD,IAAO,SAAU/5C,GACb,MAAOpkC,MAAKmuE,aAAaiQ,YAAYp+E,KAAMokC,IAE/Ci6C,KAAO,SAAUj6C,GACb,MAAOpkC,MAAKmuE,aAAac,OAAOjvE,KAAMokC,IAE1Cq5C,EAAO,WACH,MAAOz9E,MAAK+4B,QAEhB4kD,IAAO,WACH,MAAO39E,MAAK44B,aAEhBrsB,EAAO,WACH,MAAOvM,MAAK24B,OAEhB2lD,GAAO,SAAUl6C,GACb,MAAOpkC,MAAKmuE,aAAaoQ,YAAYv+E,KAAMokC,IAE/Co6C,IAAO,SAAUp6C,GACb,MAAOpkC,MAAKmuE,aAAasQ,cAAcz+E,KAAMokC,IAEjDs6C,KAAO,SAAUt6C,GACb,MAAOpkC,MAAKmuE,aAAawQ,SAAS3+E,KAAMokC,IAE5C0pB,EAAO,WACH,MAAO9tD,MAAKmvE,QAEhBiJ,EAAO,WACH,MAAOp4E,MAAK4+E,WAEhBC,GAAO,WACH,MAAO7Q,GAAahuE,KAAK64B,OAAS,IAAK,IAE3CimD,KAAO,WACH,MAAO9Q,GAAahuE,KAAK64B,OAAQ,IAErCkmD,MAAQ,WACJ,MAAO/Q,GAAahuE,KAAK64B,OAAQ,IAErCmmD,OAAS,WACL,GAAI1sE,GAAItS,KAAK64B,OAAQzJ,EAAO9c,GAAK,EAAI,IAAM,GAC3C,OAAO8c,GAAO4+C,EAAa/oE,KAAK8lB,IAAIzY,GAAI,IAE5CimE,GAAO,WACH,MAAOvK,GAAahuE,KAAKg4E,WAAa,IAAK,IAE/CiH,KAAO,WACH,MAAOjR,GAAahuE,KAAKg4E,WAAY,IAEzCkH,MAAQ,WACJ,MAAOlR,GAAahuE,KAAKg4E,WAAY,IAEzCG,GAAO,WACH,MAAOnK,GAAahuE,KAAKm/E,cAAgB,IAAK,IAElDC,KAAO,WACH,MAAOpR,GAAahuE,KAAKm/E,cAAe,IAE5CE,MAAQ,WACJ,MAAOrR,GAAahuE,KAAKm/E,cAAe,IAE5C3yE,EAAI,WACA,MAAOxM,MAAKi4E,WAEhBI,EAAI,WACA,MAAOr4E,MAAKs/E,cAEhBh6E,EAAO,WACH,MAAOtF,MAAKmuE,aAAaoR,SAASv/E,KAAK29B,QAAS39B,KAAK49B,WAAW,IAEpE0pC,EAAO,WACH,MAAOtnE,MAAKmuE,aAAaoR,SAASv/E,KAAK29B,QAAS39B,KAAK49B,WAAW,IAEpEtT,EAAO,WACH,MAAOtqB,MAAK29B,SAEhBryB,EAAO,WACH,MAAOtL,MAAK29B,QAAU,IAAM,IAEhCn9B,EAAO,WACH,MAAOR,MAAK49B,WAEhBryB,EAAO,WACH,MAAOvL,MAAK69B,WAEhBtT,EAAO,WACH,MAAO8nD,GAAMryE,KAAK89B,eAAiB,MAEvC0hD,GAAO,WACH,MAAOxR,GAAaqE,EAAMryE,KAAK89B,eAAiB,IAAK,IAEzD2hD,IAAO,WACH,MAAOzR,GAAahuE,KAAK89B,eAAgB,IAE7C4hD,KAAO,WACH,MAAO1R,GAAahuE,KAAK89B,eAAgB,IAE7C6hD,EAAO,WACH,GAAIr6E,IAAKtF,KAAK40E,OACVzuE,EAAI,GAKR,OAJQ,GAAJb,IACAA,GAAKA,EACLa,EAAI,KAEDA,EAAI6nE,EAAaqE,EAAM/sE,EAAI,IAAK,GAAK,IAAM0oE,EAAaqE,EAAM/sE,GAAK,GAAI,IAElFs6E,GAAO,WACH,GAAIt6E,IAAKtF,KAAK40E,OACVzuE,EAAI,GAKR,OAJQ,GAAJb,IACAA,GAAKA,EACLa,EAAI,KAEDA,EAAI6nE,EAAaqE,EAAM/sE,EAAI,IAAK,GAAK0oE,EAAaqE,EAAM/sE,GAAK,GAAI,IAE5E8X,EAAI,WACA,MAAOpd,MAAK6/E,YAEhBC,GAAK,WACD,MAAO9/E,MAAK+/E,YAEhBj1D,EAAO,WACH,MAAO9qB,MAAKggF,QAEhBtC,EAAI,WACA,MAAO19E,MAAKgvE,YAIpBnB,MAEAoS,IAAS,SAAU,cAAe,WAAY,gBAAiB,eAqE5DhC,GAAiBv4E,QACpBH,GAAI04E,GAAiBjkC,MACrBi7B,GAAqB1vE,GAAI,KAAO0oE,EAAgBgH,GAAqB1vE,IAAIA,GAE7E,MAAO24E,GAAax4E,QAChBH,GAAI24E,GAAalkC,MACjBi7B,GAAqB1vE,GAAIA,IAAKuoE,EAASmH,GAAqB1vE,IAAI,EAEpE0vE,IAAqBiL,KAAOpS,EAASmH,GAAqB0I,IAAK,GA2a/Dt4E,EAAOgpE,EAAO56D,WAEVy/D,IAAM,SAAU3E,GACZ,GAAI3oE,GAAML,CACV,KAAKA,IAAKgpE,GACN3oE,EAAO2oE,EAAOhpE,GACM,kBAATK,GACP5F,KAAKuF,GAAKK,EAEV5F,KAAK,IAAMuF,GAAKK,GAK5B+pE,QAAU,wFAAwF1nE,MAAM,KACxGgnE,OAAS,SAAUzuE,GACf,MAAOR,MAAK2vE,QAAQnvE,EAAEw4B,UAG1BmnD,aAAe,kDAAkDl4E,MAAM,KACvEm2E,YAAc,SAAU59E,GACpB,MAAOR,MAAKmgF,aAAa3/E,EAAEw4B,UAG/Bs+C,YAAc,SAAU8I,GACpB,GAAI76E,GAAGksE,EAAK4O,CAMZ,KAJKrgF,KAAKsgF,eACNtgF,KAAKsgF,iBAGJ/6E,EAAI,EAAO,GAAJA,EAAQA,IAQhB,GANKvF,KAAKsgF,aAAa/6E,KACnBksE,EAAM5tE,GAAOovE,KAAK,IAAM1tE,IACxB86E,EAAQ,IAAMrgF,KAAKivE,OAAOwC,EAAK,IAAM,KAAOzxE,KAAKo+E,YAAY3M,EAAK,IAClEzxE,KAAKsgF,aAAa/6E,GAAK,GAAIqxE,QAAOyJ,EAAMj0E,QAAQ,IAAK,IAAK,MAG1DpM,KAAKsgF,aAAa/6E,GAAG+I,KAAK8xE,GAC1B,MAAO76E,IAKnBg7E,UAAY,2DAA2Dt4E,MAAM,KAC7E02E,SAAW,SAAUn+E,GACjB,MAAOR,MAAKugF,UAAU//E,EAAEm4B,QAG5B6nD,eAAiB,8BAA8Bv4E,MAAM,KACrDw2E,cAAgB,SAAUj+E,GACtB,MAAOR,MAAKwgF,eAAehgF,EAAEm4B,QAGjC8nD,aAAe,uBAAuBx4E,MAAM,KAC5Cs2E,YAAc,SAAU/9E,GACpB,MAAOR,MAAKygF,aAAajgF,EAAEm4B,QAG/Bi/C,cAAgB,SAAU8I,GACtB,GAAIn7E,GAAGksE,EAAK4O,CAMZ,KAJKrgF,KAAK2gF,iBACN3gF,KAAK2gF,mBAGJp7E,EAAI,EAAO,EAAJA,EAAOA,IAQf,GANKvF,KAAK2gF,eAAep7E,KACrBksE,EAAM5tE,IAAQ,IAAM,IAAI80B,IAAIpzB,GAC5B86E,EAAQ,IAAMrgF,KAAK2+E,SAASlN,EAAK,IAAM,KAAOzxE,KAAKy+E,cAAchN,EAAK,IAAM,KAAOzxE,KAAKu+E,YAAY9M,EAAK,IACzGzxE,KAAK2gF,eAAep7E,GAAK,GAAIqxE,QAAOyJ,EAAMj0E,QAAQ,IAAK,IAAK,MAG5DpM,KAAK2gF,eAAep7E,GAAG+I,KAAKoyE,GAC5B,MAAOn7E,IAKnBq7E,iBACIC,GAAK,SACLC,EAAI,aACJC,GAAK,eACLC,IAAM,kBACNC,KAAO,yBAEX1L,eAAiB,SAAU3sE,GACvB,GAAIioE,GAAS7wE,KAAK4gF,gBAAgBh4E,EAOlC,QANKioE,GAAU7wE,KAAK4gF,gBAAgBh4E,EAAIyD,iBACpCwkE,EAAS7wE,KAAK4gF,gBAAgBh4E,EAAIyD,eAAeD,QAAQ,mBAAoB,SAAU0jE,GACnF,MAAOA,GAAIxyC,MAAM,KAErBt9B,KAAK4gF,gBAAgBh4E,GAAOioE,GAEzBA,GAGX6G,KAAO,SAAU1F,GAGb,MAAiD,OAAxCA,EAAQ,IAAIzhB,cAAcjrC,OAAO,IAG9C+wD,eAAiB,gBACjBkJ,SAAW,SAAU5hD,EAAOC,EAASsjD,GACjC,MAAIvjD,GAAQ,GACDujD,EAAU,KAAO,KAEjBA,EAAU,KAAO,MAIhCC,WACIC,QAAU,gBACVC,QAAU,mBACVC,SAAW,eACXC,QAAU,oBACVC,SAAW,sBACXC,SAAW,KAEfC,SAAW,SAAU94E,EAAK6oE,GACtB,GAAIZ,GAAS7wE,KAAKmhF,UAAUv4E,EAC5B,OAAyB,kBAAXioE,GAAwBA,EAAOv4D,MAAMm5D,GAAOZ,GAG9D8Q,eACIC,OAAS,QACTC,KAAO,SACPt2E,EAAI,gBACJ/K,EAAI,WACJshF,GAAK,aACLx2E,EAAI,UACJy2E,GAAK,WACLx1E,EAAI,QACJ+xE,GAAK,UACL9W,EAAI,UACJwa,GAAK,YACL1vE,EAAI,SACJ2vE,GAAK,YAGT9G,aAAe,SAAUzK,EAAQuK,EAAejE,EAAQkE,GACpD,GAAIrK,GAAS7wE,KAAK2hF,cAAc3K,EAChC,OAA0B,kBAAXnG,GACXA,EAAOH,EAAQuK,EAAejE,EAAQkE,GACtCrK,EAAOzkE,QAAQ,MAAOskE,IAG9BwR,WAAa,SAAU11D,EAAMqkD,GACzB,GAAIzsC,GAASpkC,KAAK2hF,cAAcn1D,EAAO,EAAI,SAAW,OACtD,OAAyB,kBAAX4X,GAAwBA,EAAOysC,GAAUzsC,EAAOh4B,QAAQ,MAAOykE,IAGjFzC,QAAU,SAAUsC,GAChB,MAAO1wE,MAAKmiF,SAAS/1E,QAAQ,KAAMskE,IAEvCyR,SAAW,KAEXrG,SAAW,SAAU9E,GACjB,MAAOA,IAGXoL,WAAa,SAAUpL,GACnB,MAAOA,IAGX7H,KAAO,SAAUsC,GACb,MAAOmC,IAAWnC,EAAKzxE,KAAKs4E,MAAM5E,IAAK1zE,KAAKs4E,MAAM3E,KAAKxE,MAG3DmJ,OACI5E,IAAM,EACNC,IAAM,GAGV0O,aAAc,eACdhN,YAAa,WACT,MAAOr1E,MAAKqiF,gBA6wBpBx+E,GAAS,SAAUmuE,EAAO5tC,EAAQQ,EAAQk6B,GACtC,GAAIr+D,EAiBJ,OAfuB,iBAAb,KACNq+D,EAASl6B,EACTA,EAASr+B,GAIb9F,KACAA,EAAEsvE,kBAAmB,EACrBtvE,EAAEuvE,GAAKgC,EACPvxE,EAAEwvE,GAAK7rC,EACP3jC,EAAEyvE,GAAKtrC,EACPnkC,EAAE0vE,QAAUrR,EACZr+D,EAAE4vE,QAAS,EACX5vE,EAAE8vE,IAAM3D,IAEDgP,GAAWn7E,IAGtBoD,GAAO2pE,6BAA8B,EAErC3pE,GAAO62E,wBAA0BhN,EAC7B,4LAIA,SAAUa,GACNA,EAAO/1C,GAAK,GAAIn0B,MAAKkqE,EAAOyB,MA0BpCnsE,GAAO4H,IAAM,WACT,GAAI+N,MAAU8jB,MAAM/8B,KAAKkF,UAAW,EAEpC,OAAOs2E,IAAO,WAAYviE,IAG9B3V,GAAOqJ,IAAM,WACT,GAAIsM,MAAU8jB,MAAM/8B,KAAKkF,UAAW,EAEpC,OAAOs2E,IAAO,UAAWviE,IAI7B3V,GAAOovE,IAAM,SAAUjB,EAAO5tC,EAAQQ,EAAQk6B,GAC1C,GAAIr+D,EAkBJ,OAhBuB,iBAAb,KACNq+D,EAASl6B,EACTA,EAASr+B,GAIb9F,KACAA,EAAEsvE,kBAAmB,EACrBtvE,EAAEk3E,SAAU,EACZl3E,EAAE4vE,QAAS,EACX5vE,EAAEyvE,GAAKtrC,EACPnkC,EAAEuvE,GAAKgC,EACPvxE,EAAEwvE,GAAK7rC,EACP3jC,EAAE0vE,QAAUrR,EACZr+D,EAAE8vE,IAAM3D,IAEDgP,GAAWn7E,GAAGwyE,OAIzBpvE,GAAOm8E,KAAO,SAAUhO,GACpB,MAAOnuE,IAAe,IAARmuE,IAIlBnuE,GAAOuM,SAAW,SAAU4hE,EAAOppE,GAC/B,GAGIwmB,GACAkzD,EACAC,EACAC,EANApyE,EAAW4hE,EAEX1tE,EAAQ,IA+DZ,OAzDIT,IAAO4+E,WAAWzQ,GAClB5hE,GACIyqE,GAAI7I,EAAMvC,cACVljE,EAAGylE,EAAMtC,MACTlI,EAAGwK,EAAMrC,SAEW,gBAAVqC,IACd5hE,KACIxH,EACAwH,EAASxH,GAAOopE,EAEhB5hE,EAAS0tB,aAAek0C,IAElB1tE,EAAQw4E,GAAwBt4E,KAAKwtE,KAC/C5iD,EAAqB,MAAb9qB,EAAM,GAAc,GAAK,EACjC8L,GACIkC,EAAG,EACH/F,EAAG8lE,EAAM/tE,EAAM0vE,KAAS5kD,EACxB9jB,EAAG+mE,EAAM/tE,EAAM89B,KAAShT,EACxB5uB,EAAG6xE,EAAM/tE,EAAM69B,KAAW/S,EAC1B7jB,EAAG8mE,EAAM/tE,EAAM49B,KAAW9S,EAC1ByrD,GAAIxI,EAAM/tE,EAAM29B,KAAgB7S,KAE1B9qB,EAAQy4E,GAAiBv4E,KAAKwtE,KACxC5iD,EAAqB,MAAb9qB,EAAM,GAAc,GAAK,EACjCi+E,EAAW,SAAUG,GAIjB,GAAI1R,GAAM0R,GAAOn9D,WAAWm9D,EAAIt2E,QAAQ,IAAK,KAE7C,QAAQ3H,MAAMusE,GAAO,EAAIA,GAAO5hD,GAEpChf,GACIkC,EAAGiwE,EAASj+E,EAAM,IAClBkjE,EAAG+a,EAASj+E,EAAM,IAClBiI,EAAGg2E,EAASj+E,EAAM,IAClBgH,EAAGi3E,EAASj+E,EAAM,IAClB9D,EAAG+hF,EAASj+E,EAAM,IAClBiH,EAAGg3E,EAASj+E,EAAM,IAClBwpD,EAAGy0B,EAASj+E,EAAM,MAEK,gBAAb8L,KACT,QAAUA,IAAY,MAAQA,MACnCoyE,EAAUtR,EAAkBrtE,GAAOuM,EAASkZ,MAAOzlB,GAAOuM,EAASmZ,KAEnEnZ,KACAA,EAASyqE,GAAK2H,EAAQ1kD,aACtB1tB,EAASo3D,EAAIgb,EAAQvT,QAGzBqT,EAAM,GAAI3T,GAASv+D,GAEfvM,GAAO4+E,WAAWzQ,IAAUrF,EAAWqF,EAAO,aAC9CsQ,EAAI1S,QAAUoC,EAAMpC,SAGjB0S,GAIXz+E,GAAO8+E,QAAU9F,GAGjBh5E,GAAO++E,cAAgB5F,GAGvBn5E,GAAOw1E,SAAW,aAIlBx1E,GAAO2sE,iBAAmBA,GAI1B3sE,GAAO8tE,aAAe,aAGtB9tE,GAAOg/E,sBAAwB,SAAUC,EAAWC,GAChD,MAAI1H,IAAuByH,KAAev8E,GAC/B,EAEPw8E,IAAUx8E,EACH80E,GAAuByH,IAElCzH,GAAuByH,GAAaC,GAC7B,IAGXl/E,GAAOk1C,KAAO20B,EACV,wDACA,SAAU9kE,EAAKxB,GACX,MAAOvD,IAAO+gC,OAAOh8B,EAAKxB,KAOlCvD,GAAO+gC,OAAS,SAAUh8B,EAAKyO,GAC3B,GAAIrE,EAcJ,OAbIpK,KAEIoK,EADmB,mBAAb,GACCnP,GAAOm/E,aAAap6E,EAAKyO,GAGzBxT,GAAOsqE,WAAWvlE,GAGzBoK,IACAnP,GAAOuM,SAASw/D,QAAU/rE,GAAO+rE,QAAU58D,IAI5CnP,GAAO+rE,QAAQqT,OAG1Bp/E,GAAOm/E,aAAe,SAAUxsE,EAAMa,GAClC,MAAe,QAAXA,GACAA,EAAO6rE,KAAO1sE,EACTmuB,GAAQnuB,KACTmuB,GAAQnuB,GAAQ,GAAI63D,IAExB1pC,GAAQnuB,GAAM08D,IAAI77D,GAGlBxT,GAAO+gC,OAAOpuB,GAEPmuB,GAAQnuB,WAGRmuB,IAAQnuB,GACR,OAIf3S,GAAOs/E,SAAWzV,EACd,gEACA,SAAU9kE,GACN,MAAO/E,IAAOsqE,WAAWvlE,KAKjC/E,GAAOsqE,WAAa,SAAUvlE,GAC1B,GAAIg8B,EAMJ,IAJIh8B,GAAOA,EAAIgnE,SAAWhnE,EAAIgnE,QAAQqT,QAClCr6E,EAAMA,EAAIgnE,QAAQqT,QAGjBr6E,EACD,MAAO/E,IAAO+rE,OAGlB,KAAK3pE,EAAQ2C,GAAM,CAGf,GADAg8B,EAAS4vC,EAAW5rE,GAEhB,MAAOg8B,EAEXh8B,IAAOA,GAGX,MAAO0rE,GAAa1rE,IAIxB/E,GAAOmD,SAAW,SAAUkc,GACxB,MAAOA,aAAeorD,IACV,MAAPprD,GAAeypD,EAAWzpD,EAAK,qBAIxCrf,GAAO4+E,WAAa,SAAUv/D,GAC1B,MAAOA,aAAeyrD,GAG1B,KAAKppE,GAAI06E,GAAMv6E,OAAS,EAAGH,IAAK,IAAKA,GACjCstE,EAASoN,GAAM16E,IAGnB1B,IAAOyuE,eAAiB,SAAUC,GAC9B,MAAOD,GAAeC,IAG1B1uE,GAAOg4E,QAAU,SAAUuH,GACvB,GAAI5iF,GAAIqD,GAAOovE,IAAIkH,IAQnB,OAPa,OAATiJ,EACA/9E,EAAO7E,EAAE+vE,IAAK6S,GAGd5iF,EAAE+vE,IAAInD,iBAAkB,EAGrB5sE,GAGXqD,GAAOw/E,UAAY,WACf,MAAOx/E,IAAOyU,MAAM,KAAM7S,WAAW49E,aAGzCx/E,GAAO2zE,kBAAoB,SAAUxF,GACjC,MAAOK,GAAML,IAAUK,EAAML,GAAS,GAAK,KAAO,MAQtD3sE,EAAOxB,GAAO4V,GAAK60D,EAAO76D,WAEtBilB,MAAQ,WACJ,MAAO70B,IAAO7D,OAGlB+G,QAAU,WACN,OAAQ/G,KAAKw4B,GAA4B,KAArBx4B,KAAKswE,SAAW,IAGxC0P,KAAO,WACH,MAAO/6E,MAAKC,OAAOlF,KAAO,MAG9BoF,SAAW,WACP,MAAOpF,MAAK04B,QAAQkM,OAAO,MAAMR,OAAO,qCAG5Cn9B,OAAS,WACL,MAAOjH,MAAKswE,QAAU,GAAIjsE,OAAMrE,MAAQA,KAAKw4B,IAGjDrxB,YAAc,WACV,GAAI3G,GAAIqD,GAAO7D,MAAMizE,KACrB,OAAI,GAAIzyE,EAAEq4B,QAAUr4B,EAAEq4B,QAAU,KACrBq8C,EAAa10E,EAAG,gCAEhB00E,EAAa10E,EAAG,mCAI/BiI,QAAU,WACN,GAAIjI,GAAIR,IACR,QACIQ,EAAEq4B,OACFr4B,EAAEw4B,QACFx4B,EAAEu4B,OACFv4B,EAAEm9B,QACFn9B,EAAEo9B,UACFp9B,EAAEq9B,UACFr9B,EAAEs9B,iBAIVo2C,QAAU,WACN,MAAOA,GAAQl0E,OAGnBsjF,aAAe,WACX,MAAItjF,MAAK+zE,GACE/zE,KAAKk0E,WAAajC,EAAcjyE,KAAK+zE,IAAK/zE,KAAKqwE,OAASxsE,GAAOovE,IAAIjzE,KAAK+zE,IAAMlwE,GAAO7D,KAAK+zE,KAAKtrE,WAAa,GAGhH,GAGX86E,aAAe,WACX,MAAOl+E,MAAWrF,KAAKuwE,MAG3BiT,UAAW,WACP,MAAOxjF,MAAKuwE,IAAIxsD,UAGpBkvD,IAAM,SAAUwQ,GACZ,MAAOzjF,MAAK40E,KAAK,EAAG6O,IAGxB5O,MAAQ,SAAU4O,GASd,MARIzjF,MAAKqwE,SACLrwE,KAAK40E,KAAK,EAAG6O,GACbzjF,KAAKqwE,QAAS,EAEVoT,GACAzjF,KAAKuT,IAAIvT,KAAK0jF,gBAAiB,MAGhC1jF,MAGXokC,OAAS,SAAUu/C,GACf,GAAI9S,GAASqE,EAAal1E,KAAM2jF,GAAe9/E,GAAO++E,cACtD,OAAO5iF,MAAKmuE,aAAaiU,WAAWvR,IAGxCt9D,IAAM89D,EAAY,EAAG,OAErB7lD,SAAW6lD,EAAY,GAAI,YAE3B7kD,KAAO,SAAUwlD,EAAOO,EAAOqR,GAC3B,GAEIp3D,GAAMqkD,EAAQgT,EAFdC,EAAO3S,EAAOa,EAAOhyE,MACrB+jF,EAAyC,KAA7B/jF,KAAK40E,OAASkP,EAAKlP,OA8BnC,OA3BArC,GAAQD,EAAeC,GAET,SAAVA,GAA8B,UAAVA,GAEpB/lD,EAAmD,OAA3CxsB,KAAKszE,cAAgBwQ,EAAKxQ,eAElCzC,EAAwC,IAA7B7wE,KAAK64B,OAASirD,EAAKjrD,SAAiB74B,KAAKg5B,QAAU8qD,EAAK9qD,SAGnE6qD,EAAc7jF,KAAO6D,GAAO7D,MAAMgkF,QAAQ,UACrCF,EAAOjgF,GAAOigF,GAAME,QAAQ,UAEjCH,GACgE,KADhD7jF,KAAK40E,OAAS/wE,GAAO7D,MAAMgkF,QAAQ,SAASpP,QACnDkP,EAAKlP,OAAS/wE,GAAOigF,GAAME,QAAQ,SAASpP,SACrD/D,GAAUgT,EAAar3D,EACT,SAAV+lD,IACA1B,GAAkB,MAGtBrkD,EAAQxsB,KAAO8jF,EACfjT,EAAmB,WAAV0B,EAAqB/lD,EAAO,IACvB,WAAV+lD,EAAqB/lD,EAAO,IAClB,SAAV+lD,EAAmB/lD,EAAO,KAChB,QAAV+lD,GAAmB/lD,EAAOu3D,GAAY,MAC5B,SAAVxR,GAAoB/lD,EAAOu3D,GAAY,OACvCv3D,GAEDo3D,EAAU/S,EAASJ,EAASI;EAGvCvnD,KAAO,SAAUmR,EAAMwgD,GACnB,MAAOp3E,IAAOuM,UAAUmZ,GAAIvpB,KAAMspB,KAAMmR,IAAOmK,OAAO5kC,KAAK4kC,UAAUq/C,UAAUhJ,IAGnFiJ,QAAU,SAAUjJ,GAChB,MAAOj7E,MAAKspB,KAAKzlB,KAAUo3E,IAG/ByG,SAAW,SAAUjnD,GAGjB,GAAIiD,GAAMjD,GAAQ52B,KACdsgF,EAAMhT,EAAOzzC,EAAK19B,MAAMgkF,QAAQ,OAChCx3D,EAAOxsB,KAAKwsB,KAAK23D,EAAK,QAAQ,GAC9B//C,EAAgB,GAAP5X,EAAY,WACV,GAAPA,EAAY,WACL,EAAPA,EAAW,UACJ,EAAPA,EAAW,UACJ,EAAPA,EAAW,UACJ,EAAPA,EAAW,WAAa,UAChC,OAAOxsB,MAAKokC,OAAOpkC,KAAKmuE,aAAauT,SAASt9C,EAAQpkC,QAG1D8zE,WAAa,WACT,MAAOA,GAAW9zE,KAAK64B,SAG3BurD,MAAQ,WACJ,MAAQpkF,MAAK40E,OAAS50E,KAAK04B,QAAQM,MAAM,GAAG47C,QACxC50E,KAAK40E,OAAS50E,KAAK04B,QAAQM,MAAM,GAAG47C,QAG5Cj8C,IAAM,SAAUq5C,GACZ,GAAIr5C,GAAM34B,KAAKqwE,OAASrwE,KAAKw4B,GAAGmjD,YAAc37E,KAAKw4B,GAAG6rD,QACtD,OAAa,OAATrS,GACAA,EAAQ+I,GAAa/I,EAAOhyE,KAAKmuE,cAC1BnuE,KAAKuT,IAAIy+D,EAAQr5C,EAAK,MAEtBA,GAIfK,MAAQmjD,GAAa,SAAS,GAE9B6H,QAAU,SAAUzR,GAIhB,OAHAA,EAAQD,EAAeC,IAIvB,IAAK,OACDvyE,KAAKg5B,MAAM,EAEf,KAAK,UACL,IAAK,QACDh5B,KAAK+4B,KAAK,EAEd,KAAK,OACL,IAAK,UACL,IAAK,MACD/4B,KAAK29B,MAAM,EAEf,KAAK,OACD39B,KAAK49B,QAAQ,EAEjB,KAAK,SACD59B,KAAK69B,QAAQ,EAEjB,KAAK,SACD79B,KAAK89B,aAAa,GAgBtB,MAXc,SAAVy0C,EACAvyE,KAAKi4E,QAAQ,GACI,YAAV1F,GACPvyE,KAAKs/E,WAAW,GAIN,YAAV/M,GACAvyE,KAAKg5B,MAAqC,EAA/B/zB,KAAKC,MAAMlF,KAAKg5B,QAAU,IAGlCh5B,MAGXskF,MAAO,SAAU/R,GAEb,MADAA,GAAQD,EAAeC,GAChBvyE,KAAKgkF,QAAQzR,GAAOh/D,IAAI,EAAc,YAAVg/D,EAAsB,OAASA,GAAQ/mD,SAAS,EAAG,OAG1FylD,QAAS,SAAUe,EAAOO,GAEtB,MADAA,GAAQD,EAAgC,mBAAVC,GAAwBA,EAAQ,eAChD,gBAAVA,GACAP,EAAQnuE,GAAOmD,SAASgrE,GAASA,EAAQnuE,GAAOmuE,IACxChyE,MAAQgyE,IAERhyE,KAAK04B,QAAQsrD,QAAQzR,IAAU1uE,GAAOmuE,GAAOgS,QAAQzR,IAIrEnB,SAAU,SAAUY,EAAOO,GAEvB,MADAA,GAAQD,EAAgC,mBAAVC,GAAwBA,EAAQ,eAChD,gBAAVA,GACAP,EAAQnuE,GAAOmD,SAASgrE,GAASA,EAAQnuE,GAAOmuE,IAChCA,GAARhyE,OAEAA,KAAK04B,QAAQsrD,QAAQzR,IAAU1uE,GAAOmuE,GAAOgS,QAAQzR,IAIrEgS,OAAQ,SAAUvS,EAAOO,GAErB,MADAA,GAAQD,EAAeC,GAAS,eAClB,gBAAVA,GACAP,EAAQnuE,GAAOmD,SAASgrE,GAASA,EAAQnuE,GAAOmuE,IACxChyE,QAAUgyE,IAEVhyE,KAAK04B,QAAQsrD,QAAQzR,MAAYpB,EAAOa,EAAOhyE,MAAMgkF,QAAQzR,IAI7E9mE,IAAKiiE,EACI,mGACA,SAAU/nE,GAEN,MADAA,GAAQ9B,GAAOyU,MAAM,KAAM7S,WACZzF,KAAR2F,EAAe3F,KAAO2F,IAI1CuH,IAAKwgE,EACG,mGACA,SAAU/nE,GAEN,MADAA,GAAQ9B,GAAOyU,MAAM,KAAM7S,WACpBE,EAAQ3F,KAAOA,KAAO2F,IAczCivE,KAAO,SAAU5C,EAAOyR,GACpB,GACIe,GADA36D,EAAS7pB,KAAKswE,SAAW,CAE7B,OAAa,OAAT0B,EA0BOhyE,KAAKqwE,OAASxmD,EAAS7pB,KAAK0jF,iBAzBd,gBAAV1R,KACPA,EAAQ+E,EAA0B/E,IAElC/sE,KAAK8lB,IAAIinD,GAAS,KAClBA,EAAgB,GAARA,IAEPhyE,KAAKqwE,QAAUoT,IAChBe,EAAcxkF,KAAK0jF,iBAEvB1jF,KAAKswE,QAAU0B,EACfhyE,KAAKqwE,QAAS,EACK,MAAfmU,GACAxkF,KAAKwrB,SAASg5D,EAAa,KAE3B36D,IAAWmoD,KACNyR,GAAiBzjF,KAAKykF,kBACvBjT,EAAgCxxE,KACxB6D,GAAOuM,SAASyZ,EAASmoD,EAAO,KAAM,GAAG,GACzChyE,KAAKykF,oBACbzkF,KAAKykF,mBAAoB,EACzB5gF,GAAO8tE,aAAa3xE,MAAM,GAC1BA,KAAKykF,kBAAoB,OAM9BzkF,OAGX6/E,SAAW,WACP,MAAO7/E,MAAKqwE,OAAS,MAAQ,IAGjC0P,SAAW,WACP,MAAO//E,MAAKqwE,OAAS,6BAA+B,IAGxDgT,UAAY,WAMR,MALIrjF,MAAKowE,KACLpwE,KAAK40E,KAAK50E,KAAKowE,MACW,gBAAZpwE,MAAKgwE,IACnBhwE,KAAK40E,KAAK50E,KAAKgwE,IAEZhwE,MAGX0kF,qBAAuB,SAAU1S,GAQ7B,MAHIA,GAJCA,EAIOnuE,GAAOmuE,GAAO4C,OAHd,GAMJ50E,KAAK40E,OAAS5C,GAAS,KAAO,GAG1CsB,YAAc,WACV,MAAOA,GAAYtzE,KAAK64B,OAAQ74B,KAAKg5B,UAGzCJ,UAAY,SAAUo5C,GAClB,GAAIp5C,GAAY7K,IAAOlqB,GAAO7D,MAAMgkF,QAAQ,OAASngF,GAAO7D,MAAMgkF,QAAQ,SAAW,OAAS,CAC9F,OAAgB,OAAThS,EAAgBp5C,EAAY54B,KAAKuT,IAAKy+D,EAAQp5C,EAAY,MAGrEo2C,QAAU,SAAUgD,GAChB,MAAgB,OAATA,EAAgB/sE,KAAKmyC,MAAMp3C,KAAKg5B,QAAU,GAAK,GAAKh5B,KAAKg5B,MAAoB,GAAbg5C,EAAQ,GAAShyE,KAAKg5B,QAAU,IAG3Gg/C,SAAW,SAAUhG,GACjB,GAAIn5C,GAAO+6C,GAAW5zE,KAAMA,KAAKmuE,aAAamK,MAAM5E,IAAK1zE,KAAKmuE,aAAamK,MAAM3E,KAAK96C,IACtF,OAAgB,OAATm5C,EAAgBn5C,EAAO74B,KAAKuT,IAAKy+D,EAAQn5C,EAAO,MAG3DsmD,YAAc,SAAUnN,GACpB,GAAIn5C,GAAO+6C,GAAW5zE,KAAM,EAAG,GAAG64B,IAClC,OAAgB,OAATm5C,EAAgBn5C,EAAO74B,KAAKuT,IAAKy+D,EAAQn5C,EAAO,MAG3Ds2C,KAAO,SAAU6C,GACb,GAAI7C,GAAOnvE,KAAKmuE,aAAagB,KAAKnvE,KAClC,OAAgB,OAATgyE,EAAgB7C,EAAOnvE,KAAKuT,IAAqB,GAAhBy+D,EAAQ7C,GAAW,MAG/DyP,QAAU,SAAU5M,GAChB,GAAI7C,GAAOyE,GAAW5zE,KAAM,EAAG,GAAGmvE,IAClC,OAAgB,OAAT6C,EAAgB7C,EAAOnvE,KAAKuT,IAAqB,GAAhBy+D,EAAQ7C,GAAW,MAG/D8I,QAAU,SAAUjG,GAChB,GAAIiG,IAAWj4E,KAAK24B,MAAQ,EAAI34B,KAAKmuE,aAAamK,MAAM5E,KAAO,CAC/D,OAAgB,OAAT1B,EAAgBiG,EAAUj4E,KAAKuT,IAAIy+D,EAAQiG,EAAS,MAG/DqH,WAAa,SAAUtN,GAInB,MAAgB,OAATA,EAAgBhyE,KAAK24B,OAAS,EAAI34B,KAAK24B,IAAI34B,KAAK24B,MAAQ,EAAIq5C,EAAQA,EAAQ,IAGvF2S,eAAiB,WACb,MAAOlR,GAAYzzE,KAAK64B,OAAQ,EAAG,IAGvC46C,YAAc,WACV,GAAImR,GAAW5kF,KAAKmuE,aAAamK,KACjC,OAAO7E,GAAYzzE,KAAK64B,OAAQ+rD,EAASlR,IAAKkR,EAASjR,MAG3Dn+D,IAAM,SAAU+8D,GAEZ,MADAA,GAAQD,EAAeC,GAChBvyE,KAAKuyE,MAGhBW,IAAM,SAAUX,EAAOnrE,GAKnB,MAJAmrE,GAAQD,EAAeC,GACI,kBAAhBvyE,MAAKuyE,IACZvyE,KAAKuyE,GAAOnrE,GAETpH,MAMX4kC,OAAS,SAAUh8B,GACf,GAAIi8E,EAEJ,OAAIj8E,KAAQrC,EACDvG,KAAK4vE,QAAQqT,OAEpB4B,EAAgBhhF,GAAOsqE,WAAWvlE,GACb,MAAjBi8E,IACA7kF,KAAK4vE,QAAUiV,GAEZ7kF,OAIf+4C,KAAO20B,EACH,oEACA,SAAU9kE,GACN,MAAIA,KAAQrC,EACDvG,KAAKmuE,aAELnuE,KAAK4kC,OAAOh8B,KAK/BulE,WAAa,WACT,MAAOnuE,MAAK4vE,SAGhB8T,cAAgB,WAGZ,MAAsD,IAA/Cz+E,KAAK8oB,MAAM/tB,KAAKw4B,GAAGssD,oBAAsB,OA8CxDjhF,GAAO4V,GAAG+1D,YAAc3rE,GAAO4V,GAAGqkB,aAAeq+C,GAAa,gBAAgB,GAC9Et4E,GAAO4V,GAAG81D,OAAS1rE,GAAO4V,GAAGokB,QAAUs+C,GAAa,WAAW,GAC/Dt4E,GAAO4V,GAAG61D,OAASzrE,GAAO4V,GAAGmkB,QAAUu+C,GAAa,WAAW,GAK/Dt4E,GAAO4V,GAAG41D,KAAOxrE,GAAO4V,GAAGkkB,MAAQw+C,GAAa,SAAS,GAEzDt4E,GAAO4V,GAAGsf,KAAOojD,GAAa,QAAQ,GACtCt4E,GAAO4V,GAAGqgB,MAAQ4zC,EAAU,kDAAmDyO,GAAa,QAAQ,IACpGt4E,GAAO4V,GAAGof,KAAOsjD,GAAa,YAAY,GAC1Ct4E,GAAO4V,GAAGq1D,MAAQpB,EAAU,kDAAmDyO,GAAa,YAAY,IAGxGt4E,GAAO4V,GAAG21D,KAAOvrE,GAAO4V,GAAGkf,IAC3B90B,GAAO4V,GAAGw1D,OAASprE,GAAO4V,GAAGuf,MAC7Bn1B,GAAO4V,GAAGy1D,MAAQrrE,GAAO4V,GAAG01D,KAC5BtrE,GAAO4V,GAAGsrE,SAAWlhF,GAAO4V,GAAGmlE,QAC/B/6E,GAAO4V,GAAGs1D,SAAWlrE,GAAO4V,GAAGu1D,QAG/BnrE,GAAO4V,GAAGurE,OAASnhF,GAAO4V,GAAGtS,YAkB7B9B,EAAOxB,GAAOuM,SAASqJ,GAAKk1D,EAASl7D,WAEjCo8D,QAAU,WACN,GAIIhyC,GAASD,EAASD,EAJlBG,EAAe99B,KAAKyvE,cACpBL,EAAOpvE,KAAK0vE,MACZT,EAASjvE,KAAK2vE,QACd38D,EAAOhT,KAAKkT,MACa47D,EAAQ,CAIrC97D,GAAK8qB,aAAeA,EAAe,IAEnCD,EAAU4yC,EAAS3yC,EAAe,KAClC9qB,EAAK6qB,QAAUA,EAAU,GAEzBD,EAAU6yC,EAAS5yC,EAAU,IAC7B7qB,EAAK4qB,QAAUA,EAAU,GAEzBD,EAAQ8yC,EAAS7yC,EAAU,IAC3B5qB,EAAK2qB,MAAQA,EAAQ,GAErByxC,GAAQqB,EAAS9yC,EAAQ,IAGzBmxC,EAAQ2B,EAAS4L,GAAYjN,IAC7BA,GAAQqB,EAAS6L,GAAYxN,IAI7BG,GAAUwB,EAASrB,EAAO,IAC1BA,GAAQ,GAGRN,GAAS2B,EAASxB,EAAS,IAC3BA,GAAU,GAEVj8D,EAAKo8D,KAAOA,EACZp8D,EAAKi8D,OAASA,EACdj8D,EAAK87D,MAAQA,GAGjB/jD,IAAM,WAYF,MAXA/qB,MAAKyvE,cAAgBxqE,KAAK8lB,IAAI/qB,KAAKyvE,eACnCzvE,KAAK0vE,MAAQzqE,KAAK8lB,IAAI/qB,KAAK0vE,OAC3B1vE,KAAK2vE,QAAU1qE,KAAK8lB,IAAI/qB,KAAK2vE,SAE7B3vE,KAAKkT,MAAM4qB,aAAe74B,KAAK8lB,IAAI/qB,KAAKkT,MAAM4qB,cAC9C99B,KAAKkT,MAAM2qB,QAAU54B,KAAK8lB,IAAI/qB,KAAKkT,MAAM2qB,SACzC79B,KAAKkT,MAAM0qB,QAAU34B,KAAK8lB,IAAI/qB,KAAKkT,MAAM0qB,SACzC59B,KAAKkT,MAAMyqB,MAAQ14B,KAAK8lB,IAAI/qB,KAAKkT,MAAMyqB,OACvC39B,KAAKkT,MAAM+7D,OAAShqE,KAAK8lB,IAAI/qB,KAAKkT,MAAM+7D,QACxCjvE,KAAKkT,MAAM47D,MAAQ7pE,KAAK8lB,IAAI/qB,KAAKkT,MAAM47D,OAEhC9uE,MAGXkvE,MAAQ,WACJ,MAAOuB,GAASzwE,KAAKovE,OAAS,IAGlCroE,QAAU,WACN,MAAO/G,MAAKyvE,cACG,MAAbzvE,KAAK0vE,MACJ1vE,KAAK2vE,QAAU,GAAM,OACK,QAA3B0C,EAAMryE,KAAK2vE,QAAU,KAG3BsU,SAAW,SAAUgB,GACjB,GAAIpU,GAASsK,GAAan7E,MAAOilF,EAAYjlF,KAAKmuE,aAMlD,OAJI8W,KACApU,EAAS7wE,KAAKmuE,aAAa+T,YAAYliF,KAAM6wE,IAG1C7wE,KAAKmuE,aAAaiU,WAAWvR,IAGxCt9D,IAAM,SAAUy+D,EAAOlC,GAEnB,GAAIwB,GAAMztE,GAAOuM,SAAS4hE,EAAOlC,EAQjC,OANA9vE,MAAKyvE,eAAiB6B,EAAI7B,cAC1BzvE,KAAK0vE,OAAS4B,EAAI5B,MAClB1vE,KAAK2vE,SAAW2B,EAAI3B,QAEpB3vE,KAAK6vE,UAEE7vE,MAGXwrB,SAAW,SAAUwmD,EAAOlC,GACxB,GAAIwB,GAAMztE,GAAOuM,SAAS4hE,EAAOlC,EAQjC,OANA9vE,MAAKyvE,eAAiB6B,EAAI7B,cAC1BzvE,KAAK0vE,OAAS4B,EAAI5B,MAClB1vE,KAAK2vE,SAAW2B,EAAI3B,QAEpB3vE,KAAK6vE,UAEE7vE,MAGXwV,IAAM,SAAU+8D,GAEZ,MADAA,GAAQD,EAAeC,GAChBvyE,KAAKuyE,EAAMhiB,cAAgB,QAGtClhC,GAAK,SAAUkjD,GACX,GAAInD,GAAMH,CAGV,IAFAsD,EAAQD,EAAeC,GAET,UAAVA,GAA+B,SAAVA,EAGrB,MAFAnD,GAAOpvE,KAAK0vE,MAAQ1vE,KAAKyvE,cAAgB,MACzCR,EAASjvE,KAAK2vE,QAA8B,GAApB0M,GAAYjN,GACnB,UAAVmD,EAAoBtD,EAASA,EAAS,EAI7C,QADAG,EAAOpvE,KAAK0vE,MAAQ4M,GAAYt8E,KAAK2vE,QAAU,IACvC4C,GACJ,IAAK,OAAQ,MAAOnD,GAAO,EAAIpvE,KAAKyvE,cAAgB,MACpD,KAAK,MAAO,MAAOL,GAAOpvE,KAAKyvE,cAAgB,KAC/C,KAAK,OAAQ,MAAc,IAAPL,EAAYpvE,KAAKyvE,cAAgB,IACrD,KAAK,SAAU,MAAc,IAAPL,EAAY,GAAKpvE,KAAKyvE,cAAgB,GAC5D,KAAK,SAAU,MAAc,IAAPL,EAAY,GAAK,GAAKpvE,KAAKyvE,cAAgB,GAEjE,KAAK,cAAe,MAAOxqE,MAAKC,MAAa,GAAPkqE,EAAY,GAAK,GAAK,KAAQpvE,KAAKyvE,aACzE,SAAS,KAAM,IAAI7rE,OAAM,gBAAkB2uE,KAKvDx5B,KAAOl1C,GAAO4V,GAAGs/B,KACjBnU,OAAS/gC,GAAO4V,GAAGmrB,OAEnBsgD,YAAcxX,EACV,sFAEA,WACI,MAAO1tE,MAAKmH,gBAIpBA,YAAc,WAEV,GAAI2nE,GAAQ7pE,KAAK8lB,IAAI/qB,KAAK8uE,SACtBG,EAAShqE,KAAK8lB,IAAI/qB,KAAKivE,UACvBG,EAAOnqE,KAAK8lB,IAAI/qB,KAAKovE,QACrBzxC,EAAQ14B,KAAK8lB,IAAI/qB,KAAK29B,SACtBC,EAAU34B,KAAK8lB,IAAI/qB,KAAK49B,WACxBC,EAAU54B,KAAK8lB,IAAI/qB,KAAK69B,UAAY79B,KAAK89B,eAAiB,IAE9D,OAAK99B,MAAKmlF,aAMFnlF,KAAKmlF,YAAc,EAAI,IAAM,IACjC,KACCrW,EAAQA,EAAQ,IAAM,KACtBG,EAASA,EAAS,IAAM,KACxBG,EAAOA,EAAO,IAAM,KACnBzxC,GAASC,GAAWC,EAAW,IAAM,KACtCF,EAAQA,EAAQ,IAAM,KACtBC,EAAUA,EAAU,IAAM,KAC1BC,EAAUA,EAAU,IAAM,IAXpB,OAcfswC,WAAa,WACT,MAAOnuE,MAAK4vE,WAIpB/rE,GAAOuM,SAASqJ,GAAGrU,SAAWvB,GAAOuM,SAASqJ,GAAGtS,WAQjD,KAAK5B,KAAK03E,IACFtQ,EAAWsQ,GAAwB13E,KACnCg3E,GAAmBh3E,GAAEgrD,cAI7B1sD,IAAOuM,SAASqJ,GAAG2rE,eAAiB,WAChC,MAAOplF,MAAKqvB,GAAG,OAEnBxrB,GAAOuM,SAASqJ,GAAG0rE,UAAY,WAC3B,MAAOnlF,MAAKqvB,GAAG,MAEnBxrB,GAAOuM,SAASqJ,GAAG4rE,UAAY,WAC3B,MAAOrlF,MAAKqvB,GAAG,MAEnBxrB,GAAOuM,SAASqJ,GAAG6rE,QAAU,WACzB,MAAOtlF,MAAKqvB,GAAG,MAEnBxrB,GAAOuM,SAASqJ,GAAG8rE,OAAS,WACxB,MAAOvlF,MAAKqvB,GAAG,MAEnBxrB,GAAOuM,SAASqJ,GAAG+rE,QAAU,WACzB,MAAOxlF,MAAKqvB,GAAG,UAEnBxrB,GAAOuM,SAASqJ,GAAGgsE,SAAW,WAC1B,MAAOzlF,MAAKqvB,GAAG,MAEnBxrB,GAAOuM,SAASqJ,GAAGisE,QAAU,WACzB,MAAO1lF,MAAKqvB,GAAG,MASnBxrB,GAAO+gC,OAAO,MACVwpC,QAAU,SAAUsC,GAChB,GAAIvqE,GAAIuqE,EAAS,GACbG,EAAuC,IAA7BwB,EAAM3B,EAAS,IAAM,IAAa,KACrC,IAANvqE,EAAW,KACL,IAANA,EAAW,KACL,IAANA,EAAW,KAAO,IACvB,OAAOuqE,GAASG,KA4BpB6D,GACA70E,EAAOD,QAAUiE,IAEf6nE,EAAgC,SAAUia,EAAS/lF,EAASC,GAM1D,MALIA,GAAO0uE,QAAU1uE,EAAO0uE,UAAY1uE,EAAO0uE,SAASqX,YAAa,IAEjEhJ,GAAY/4E,OAAS84E,IAGlB94E,IACTtD,KAAKX,EAASM,EAAqBN,EAASC,KAAS6rE,IAAkCnlE,IAAc1G,EAAOD,QAAU8rE,IACxH8Q,IAAW,MAIhBj8E,KAAKP,QAEqBO,KAAKX,EAAU,WAAa,MAAOI,SAAYE,EAAoB,IAAIL,KAIhG,SAASA,EAAQD,EAASM,GAE9B,GAAIwrE,IAMJ,SAAUjkE,EAAQlB,GAChB,YA2OF,SAASs/E,KACFxgD,EAAOygD,QAKVC,EAAMC,sBAGNC,EAAMC,KAAK7gD,EAAO8gD,SAAU,SAASlmD,GACjCmmD,EAAUC,SAASpmD,KAIvB8lD,EAAMO,QAAQjhD,EAAOkhD,SAAUC,EAAYJ,EAAUK,QACrDV,EAAMO,QAAQjhD,EAAOkhD,SAAUG,EAAWN,EAAUK,QAGpDphD,EAAOygD,OAAQ,GAxOnB,GAAIzgD,GAAS,QAASA,GAAOv8B,EAASiG,GAClC,MAAO,IAAIs2B,GAAOshD,SAAS79E,EAASiG,OAUxCs2B,GAAOw3C,QAAU,QAgBjBx3C,EAAOuhD,UAOHC,UAQIC,WAAY,OASZC,YAAa,QAUbC,aAAc,OAQdC,eAAgB,OAShBC,SAAU,OAaVC,kBAAmB,kBAU3B9hD,EAAOkhD,SAAW10E,SAOlBwzB,EAAO+hD,kBAAoBl+E,UAAUm+E,gBAAkBn+E,UAAUo+E,iBAOjEjiD,EAAOkiD,gBAAmB,gBAAkB9/E,GAO5C49B,EAAOmiD,UAAY,6CAA6Cl5E,KAAKpF,UAAUC,WAO/Ek8B,EAAOoiD,eAAkBpiD,EAAOkiD,iBAAmBliD,EAAOmiD,WAAcniD,EAAO+hD,kBAQ/E/hD,EAAOqiD,mBAAqB,EAU5B,IAAIC,MASAC,EAAiBviD,EAAOuiD,eAAiB,OACzCC,EAAiBxiD,EAAOwiD,eAAiB,OACzCC,EAAeziD,EAAOyiD,aAAe,KACrCC,EAAkB1iD,EAAO0iD,gBAAkB,QAS3CC,EAAgB3iD,EAAO2iD,cAAgB,QACvCC,EAAgB5iD,EAAO4iD,cAAgB,QACvCC,EAAc7iD,EAAO6iD,YAAc,MASnCC,EAAc9iD,EAAO8iD,YAAc,QACnC3B,EAAanhD,EAAOmhD,WAAa,OACjCE,EAAYrhD,EAAOqhD,UAAY,MAC/B0B,EAAgB/iD,EAAO+iD,cAAgB,UACvCC,EAAchjD,EAAOgjD,YAAc,OASvChjD,GAAOygD,OAAQ,EAOfzgD,EAAOijD,QAAUjjD,EAAOijD,YAQxBjjD,EAAO8gD,SAAW9gD,EAAO8gD,YAkCzB,IAAIF,GAAQ5gD,EAAOkjD,OAUfljF,OAAQ,SAAgBmjF,EAAM3jC,EAAK6Y,GAC/B,IAAI,GAAI90D,KAAOi8C,IACPA,EAAIh/C,eAAe+C,IAAS4/E,EAAK5/E,KAASrC,GAAam3D,IAG3D8qB,EAAK5/E,GAAOi8C,EAAIj8C,GAEpB,OAAO4/E,IAUX30E,GAAI,SAAY/K,EAASjC,EAAM4hF,GAC3B3/E,EAAQD,iBAAiBhC,EAAM4hF,GAAS,IAU5Cz0E,IAAK,SAAalL,EAASjC,EAAM4hF,GAC7B3/E,EAAQO,oBAAoBxC,EAAM4hF,GAAS,IAa/CvC,KAAM,SAAchjE,EAAKwlE,EAAUhvE,GAC/B,GAAInU,GAAGC,CAGP,IAAG,WAAa0d,GACZA,EAAI3a,QAAQmgF,EAAUhvE,OAEnB,IAAGwJ,EAAIxd,SAAWa,GACrB,IAAIhB,EAAI,EAAGC,EAAM0d,EAAIxd,OAAYF,EAAJD,EAASA,IAClC,GAAGmjF,EAASnoF,KAAKmZ,EAASwJ,EAAI3d,GAAIA,EAAG2d,MAAS,EAC1C,WAKR,KAAI3d,IAAK2d,GACL,GAAGA,EAAIrd,eAAeN,IAClBmjF,EAASnoF,KAAKmZ,EAASwJ,EAAI3d,GAAIA,EAAG2d,MAAS,EAC3C,QAahBylE,MAAO,SAAe9jC,EAAK+jC,GACvB,MAAO/jC,GAAIn+C,QAAQkiF,GAAQ,IAU/BC,QAAS,SAAiBhkC,EAAK+jC,GAC3B,GAAG/jC,EAAIn+C,QAAS,CACZ,GAAI2B,GAAQw8C,EAAIn+C,QAAQkiF,EACxB,OAAkB,KAAVvgF,GAAgB,EAAQA,EAEhC,IAAI,GAAI9C,GAAI,EAAGC,EAAMq/C,EAAIn/C,OAAYF,EAAJD,EAASA,IACtC,GAAGs/C,EAAIt/C,KAAOqjF,EACV,MAAOrjF,EAGf,QAAO,GAUfkD,QAAS,SAAiBya,GACtB,MAAOld,OAAMyN,UAAU6pB,MAAM/8B,KAAK2iB,EAAK,IAU3C4lE,UAAW,SAAmB/jC,EAAMlgB,GAChC,KAAMkgB,GAAM,CACR,GAAGA,GAAQlgB,EACP,OAAO,CAEXkgB,GAAOA,EAAKj7C,WAEhB,OAAO,GASXi/E,UAAW,SAAmBnoD,GAC1B,GAAI5B,MACAC,KACAnO,KACAE,KACAvlB,EAAMxG,KAAKwG,IACXyB,EAAMjI,KAAKiI,GAGf,OAAsB,KAAnB0zB,EAAQl7B,QAEHs5B,MAAO4B,EAAQ,GAAG5B,MAClBC,MAAO2B,EAAQ,GAAG3B,MAClBnO,QAAS8P,EAAQ,GAAG9P,QACpBE,QAAS4P,EAAQ,GAAG5P,UAI5Bi1D,EAAMC,KAAKtlD,EAAS,SAASvC,GACzBW,EAAM92B,KAAKm2B,EAAMW,OACjBC,EAAM/2B,KAAKm2B,EAAMY,OACjBnO,EAAQ5oB,KAAKm2B,EAAMvN,SACnBE,EAAQ9oB,KAAKm2B,EAAMrN,YAInBgO,OAAQvzB,EAAI6M,MAAMrT,KAAM+5B,GAAS9xB,EAAIoL,MAAMrT,KAAM+5B,IAAU,EAC3DC,OAAQxzB,EAAI6M,MAAMrT,KAAMg6B,GAAS/xB,EAAIoL,MAAMrT,KAAMg6B,IAAU,EAC3DnO,SAAUrlB,EAAI6M,MAAMrT,KAAM6rB,GAAW5jB,EAAIoL,MAAMrT,KAAM6rB,IAAY,EACjEE,SAAUvlB,EAAI6M,MAAMrT,KAAM+rB,GAAW9jB,EAAIoL,MAAMrT,KAAM+rB,IAAY,KAYzEg4D,YAAa,SAAqBC,EAAW/oD,EAAQC,GACjD,OACI9tB,EAAGpN,KAAK8lB,IAAImV,EAAS+oD,IAAc,EACnC32E,EAAGrN,KAAK8lB,IAAIoV,EAAS8oD,IAAc,IAW3CC,SAAU,SAAkBC,EAAQC,GAChC,GAAI/2E,GAAI+2E,EAAOt4D,QAAUq4D,EAAOr4D,QAC5Bxe,EAAI82E,EAAOp4D,QAAUm4D,EAAOn4D,OAEhC,OAA0B,KAAnB/rB,KAAKywD,MAAMpjD,EAAGD,GAAWpN,KAAK6mB,IAUzCu9D,aAAc,SAAsBF,EAAQC,GACxC,GAAI/2E,GAAIpN,KAAK8lB,IAAIo+D,EAAOr4D,QAAUs4D,EAAOt4D,SACrCxe,EAAIrN,KAAK8lB,IAAIo+D,EAAOn4D,QAAUo4D,EAAOp4D,QAEzC,OAAG3e,IAAKC,EACG62E,EAAOr4D,QAAUs4D,EAAOt4D,QAAU,EAAI+2D,EAAiBE,EAE3DoB,EAAOn4D,QAAUo4D,EAAOp4D,QAAU,EAAI82D,EAAeF,GAUhElsB,YAAa,SAAqBytB,EAAQC,GACtC,GAAI/2E,GAAI+2E,EAAOt4D,QAAUq4D,EAAOr4D,QAC5Bxe,EAAI82E,EAAOp4D,QAAUm4D,EAAOn4D,OAEhC,OAAO/rB,MAAK8qB,KAAM1d,EAAIA,EAAMC,EAAIA,IAWpC2/C,SAAU,SAAkB/hD,EAAOC,GAE/B,MAAGD,GAAMxK,QAAU,GAAKyK,EAAIzK,QAAU,EAC3B1F,KAAK07D,YAAYvrD,EAAI,GAAIA,EAAI,IAAMnQ,KAAK07D,YAAYxrD,EAAM,GAAIA,EAAM,IAExE,GAUXo5E,YAAa,SAAqBp5E,EAAOC,GAErC,MAAGD,GAAMxK,QAAU,GAAKyK,EAAIzK,QAAU,EAC3B1F,KAAKkpF,SAAS/4E,EAAI,GAAIA,EAAI,IAAMnQ,KAAKkpF,SAASh5E,EAAM,GAAIA,EAAM,IAElE,GASXq5E,WAAY,SAAoB/tD,GAC5B,MAAOA,IAAassD,GAAgBtsD,GAAaosD,GAWrD4B,eAAgB,SAAwB1gF,EAASlD,EAAMwB,EAAOqiF,GAC1D,GAAIC,IAAY,GAAI,SAAU,MAAO,IAAK,KAC1C9jF,GAAOqgF,EAAM0D,YAAY/jF,EAEzB,KAAI,GAAIL,GAAI,EAAGA,EAAImkF,EAAShkF,OAAQH,IAAK,CACrC,GAAI7E,GAAIkF,CAOR,IALG8jF,EAASnkF,KACR7E,EAAIgpF,EAASnkF,GAAK7E,EAAE48B,MAAM,EAAG,GAAGjxB,cAAgB3L,EAAE48B,MAAM,IAIzD58B,IAAKoI,GAAQ0E,MAAO,CACnB1E,EAAQ0E,MAAM9M,IAAgB,MAAV+oF,GAAkBA,IAAWriF,GAAS,EAC1D,UAeZwiF,eAAgB,SAAwB9gF,EAAS/C,EAAO0jF,GACpD,GAAI1jF,GAAU+C,GAAYA,EAAQ0E,MAAlC,CAKAy4E,EAAMC,KAAKngF,EAAO,SAASqB,EAAOxB,GAC9BqgF,EAAMuD,eAAe1gF,EAASlD,EAAMwB,EAAOqiF,IAG/C,IAAII,GAAUJ,GAAU,WACpB,OAAO,EAIY,SAApB1jF,EAAM+gF,aACLh+E,EAAQghF,cAAgBD,GAGP,QAAlB9jF,EAAMmhF,WACLp+E,EAAQihF,YAAcF,KAU9BF,YAAa,SAAqBK,GAC9B,MAAOA,GAAI59E,QAAQ,eAAgB,SAASb,GACxC,MAAOA,GAAE,GAAGc,kBAapB05E,EAAQ1gD,EAAO77B,OAQfygF,oBAAoB,EAQpBC,SAAS,EAQTC,cAAc,EAWdt2E,GAAI,SAAY/K,EAASjC,EAAM4hF,EAAS2B,GACpC,GAAI3yE,GAAQ5Q,EAAKoB,MAAM,IACvBg+E,GAAMC,KAAKzuE,EAAO,SAAS5Q,GACvBo/E,EAAMpyE,GAAG/K,EAASjC,EAAM4hF,GACxB2B,GAAQA,EAAKvjF,MAarBmN,IAAK,SAAalL,EAASjC,EAAM4hF,EAAS2B,GACtC,GAAI3yE,GAAQ5Q,EAAKoB,MAAM,IACvBg+E,GAAMC,KAAKzuE,EAAO,SAAS5Q,GACvBo/E,EAAMjyE,IAAIlL,EAASjC,EAAM4hF,GACzB2B,GAAQA,EAAKvjF,MAarBy/E,QAAS,SAAiBx9E,EAAS66D,EAAW8kB,GAC1C,GAAIvd,GAAOlrE,KAEPqqF,EAAiB,SAAwBC,GACzC,GAGIC,GAHAC,EAAUF,EAAGzjF,KAAK0pD,cAClBk6B,EAAYplD,EAAO+hD,kBACnBsD,EAAUzE,EAAM0C,MAAM6B,EAAS,QAKhCE,IAAWxf,EAAK+e,qBAITS,GAAW/mB,GAAawkB,GAA6B,IAAdmC,EAAG19D,QAChDs+C,EAAK+e,oBAAqB,EAC1B/e,EAAKif,cAAe,GACdM,GAAa9mB,GAAawkB,EAChCjd,EAAKif,aAA+B,IAAfG,EAAGK,SAAiBC,EAAaC,UAAU5C,EAAeqC,GAExEI,GAAW/mB,GAAawkB,IAC/Bjd,EAAK+e,oBAAqB,EAC1B/e,EAAKif,cAAe,GAIrBM,GAAa9mB,GAAa+iB,GACzBkE,EAAaE,cAAcnnB,EAAW2mB,GAIvCpf,EAAKif,eACJI,EAAcrf,EAAK6f,SAASxqF,KAAK2qE,EAAMof,EAAI3mB,EAAW76D,EAAS2/E,IAKhE8B,GAAe7D,IACdxb,EAAK+e,oBAAqB,EAC1B/e,EAAKif,cAAe,EACpBS,EAAariC,SAIdkiC,GAAa9mB,GAAa+iB,GACzBkE,EAAaE,cAAcnnB,EAAW2mB,IAK9C,OADAtqF,MAAK6T,GAAG/K,EAAS6+E,EAAYhkB,GAAY0mB,GAClCA,GAaXU,SAAU,SAAkBT,EAAI3mB,EAAW76D,EAAS2/E,GAChD,GAAIuC,GAAYhrF,KAAK4jE,aAAa0mB,EAAI3mB,GAClCsnB,EAAkBD,EAAUtlF,OAC5B6kF,EAAc5mB,EACdunB,EAAgBF,EAAUG,QAC1BC,EAAgBH,CAGjBtnB,IAAawkB,EACZ+C,EAAgB7C,EAEV1kB,GAAa+iB,IACnBwE,EAAgB9C,EAGhBgD,EAAgBJ,EAAUtlF,QAAW4kF,EAAiB,eAAIA,EAAGe,eAAe3lF,OAAS,IAMtF0lF,EAAgB,GAAKprF,KAAKkqF,UACzBK,EAAc/D,GAIlBxmF,KAAKkqF,SAAU,CAGf,IAAIoB,GAAStrF,KAAK6jE,iBAAiB/6D,EAASyhF,EAAaS,EAAWV,EA4BpE,OAxBG3mB,IAAa+iB,GACZ+B,EAAQloF,KAAK6lF,EAAWkF,GAIzBJ,IACCI,EAAOF,cAAgBA,EACvBE,EAAO3nB,UAAYunB,EAEnBzC,EAAQloF,KAAK6lF,EAAWkF,GAExBA,EAAO3nB,UAAY4mB,QACZe,GAAOF,eAIfb,GAAe7D,IACd+B,EAAQloF,KAAK6lF,EAAWkF,GAIxBtrF,KAAKkqF,SAAU,GAGZK,GAUXvE,oBAAqB,WACjB,GAAIvuE,EAgCJ,OA7BQA,GAFL4tB,EAAO+hD,kBACH3/E,EAAOmjF,cAEF,cACA,cACA,+CAIA,gBACA,gBACA,oDAGFvlD,EAAOoiD,gBAET,aACA,YACA,yBAIA,uBACA,sBACA,gCAIRE,EAAYQ,GAAe1wE,EAAM,GACjCkwE,EAAYnB,GAAc/uE,EAAM,GAChCkwE,EAAYjB,GAAajvE,EAAM,GACxBkwE,GAUX/jB,aAAc,SAAsB0mB,EAAI3mB,GAEpC,GAAGt+B,EAAO+hD,kBACN,MAAOwD,GAAahnB,cAIxB,IAAG0mB,EAAG1pD,QAAS,CACX,GAAG+iC,GAAa6iB,EACZ,MAAO8D,GAAG1pD,OAGd,IAAI2qD,MACAj3E,KAAYA,OAAO2xE,EAAMx9E,QAAQ6hF,EAAG1pD,SAAUqlD,EAAMx9E,QAAQ6hF,EAAGe,iBAC/DL,IASJ,OAPA/E,GAAMC,KAAK5xE,EAAQ,SAAS+pB,GACrB4nD,EAAM4C,QAAQ0C,EAAaltD,EAAMmtD,eAAgB,GAChDR,EAAU9iF,KAAKm2B,GAEnBktD,EAAYrjF,KAAKm2B,EAAMmtD,cAGpBR,EAKX,MADAV,GAAGkB,WAAa,GACRlB,IAYZzmB,iBAAkB,SAA0B/6D,EAAS66D,EAAW/iC,EAAS0pD,GAErE,GAAImB,GAAcxD,CAOlB,OANGhC,GAAM0C,MAAM2B,EAAGzjF,KAAM,UAAY+jF,EAAaC,UAAU7C,EAAesC,GACtEmB,EAAczD,EACR4C,EAAaC,UAAU3C,EAAaoC,KAC1CmB,EAAcvD,IAId77D,OAAQ45D,EAAM8C,UAAUnoD,GACxB8qD,UAAWrnF,KAAKq5B,MAChB/zB,OAAQ2gF,EAAG3gF,OACXi3B,QAASA,EACT+iC,UAAWA,EACX8nB,YAAaA,EACb53C,SAAUy2C,EAMV/gF,eAAgB,WACZ,GAAIsqC,GAAW7zC,KAAK6zC,QACpBA,GAAS83C,qBAAuB93C,EAAS83C,sBACzC93C,EAAStqC,gBAAkBsqC,EAAStqC,kBAMxCm8B,gBAAiB,WACb1lC,KAAK6zC,SAASnO,mBAQlBkmD,WAAY,WACR,MAAOxF,GAAUwF,iBAa7BhB,EAAevlD,EAAOulD,cAMtBiB,YAOAjoB,aAAc,WACV,GAAIkoB,KAKJ,OAHA7F,GAAMC,KAAKlmF,KAAK6rF,SAAU,SAASrrD,GAC/BsrD,EAAU5jF,KAAKs4B,KAEZsrD,GASXhB,cAAe,SAAuBnnB,EAAWooB,GAC1CpoB,GAAa+iB,GAAc/iB,GAAa+iB,GAAsC,IAAzBqF,EAAapB,cAC1D3qF,MAAK6rF,SAASE,EAAaC,YAElCD,EAAaP,WAAaO,EAAaC,UACvChsF,KAAK6rF,SAASE,EAAaC,WAAaD,IAUhDlB,UAAW,SAAmBY,EAAanB,GACvC,IAAIA,EAAGmB,YACH,OAAO,CAGX,IAAIQ,GAAK3B,EAAGmB,YACRh0E,IAKJ,OAHAA,GAAMuwE,GAAkBiE,KAAQ3B,EAAG4B,sBAAwBlE,GAC3DvwE,EAAMwwE,GAAkBgE,KAAQ3B,EAAG6B,sBAAwBlE,GAC3DxwE,EAAMywE,GAAgB+D,KAAQ3B,EAAG8B,oBAAsBlE,GAChDzwE,EAAMg0E,IAOjBljC,MAAO,WACHvoD,KAAK6rF,cAWTzF,EAAY/gD,EAAOgnD,WAEnBlG,YAGA/rD,QAAS,KAITgD,SAAU,KAGVkvD,SAAS,EAQTC,YAAa,SAAqBC,EAAMC,GAEjCzsF,KAAKo6B,UAIRp6B,KAAKssF,SAAU,EAGftsF,KAAKo6B,SACDoyD,KAAMA,EACNE,WAAYzG,EAAM5gF,UAAWonF,GAC7BE,WAAW,EACXC,eAAe,EACfC,iBAAiB,EACjBC,gBACAt2E,KAAM,IAGVxW,KAAKymF,OAAOgG,KAShBhG,OAAQ,SAAgBgG,GACpB,GAAIzsF,KAAKo6B,UAAWp6B,KAAKssF,QAAzB,CAKAG,EAAYzsF,KAAK+sF,gBAAgBN,EAGjC,IAAID,GAAOxsF,KAAKo6B,QAAQoyD,KACpBQ,EAAcR,EAAKz9E,OAmBvB,OAhBAk3E,GAAMC,KAAKlmF,KAAKmmF,SAAU,SAAwBlmD,IAE1CjgC,KAAKssF,SAAWE,EAAKx9E,SAAWg+E,EAAY/sD,EAAQzpB,OACpDypB,EAAQwoD,QAAQloF,KAAK0/B,EAASwsD,EAAWD,IAE9CxsF,MAGAA,KAAKo6B,UACJp6B,KAAKo6B,QAAQuyD,UAAYF,GAG1BA,EAAU9oB,WAAa+iB,GACtB1mF,KAAK4rF,aAGFa,IASXb,WAAY,WAGR5rF,KAAKo9B,SAAW6oD,EAAM5gF,UAAWrF,KAAKo6B,SAGtCp6B,KAAKo6B,QAAU,KACfp6B,KAAKssF,SAAU,GAYnBW,kBAAmB,SAA2B3C,EAAIj+D,EAAQ48D,EAAW/oD,EAAQC,GACzE,GAAIoZ,GAAMv5C,KAAKo6B,QACX8yD,GAAS,EACTC,EAAS5zC,EAAIqzC,cACbQ,EAAW7zC,EAAIuzC,YAEhBK,IAAU7C,EAAGoB,UAAYyB,EAAOzB,UAAYrmD,EAAOqiD,qBAClDr7D,EAAS8gE,EAAO9gE,OAChB48D,EAAYqB,EAAGoB,UAAYyB,EAAOzB,UAClCxrD,EAASoqD,EAAGj+D,OAAOyE,QAAUq8D,EAAO9gE,OAAOyE,QAC3CqP,EAASmqD,EAAGj+D,OAAO2E,QAAUm8D,EAAO9gE,OAAO2E,QAC3Ck8D,GAAS,IAGV5C,EAAG3mB,WAAa0kB,GAAeiC,EAAG3mB,WAAaykB,KAC9C7uC,EAAIszC,gBAAkBvC,KAGtB/wC,EAAIqzC,eAAiBM,KACrBE,EAAS3xB,SAAWwqB,EAAM+C,YAAYC,EAAW/oD,EAAQC,GACzDitD,EAASvgC,MAAQo5B,EAAMiD,SAAS78D,EAAQi+D,EAAGj+D,QAC3C+gE,EAAS5xD,UAAYyqD,EAAMoD,aAAah9D,EAAQi+D,EAAGj+D,QAEnDktB,EAAIqzC,cAAgBrzC,EAAIszC,iBAAmBvC,EAC3C/wC,EAAIszC,gBAAkBvC,GAG1BA,EAAG+C,UAAYD,EAAS3xB,SAASppD,EACjCi4E,EAAGgD,UAAYF,EAAS3xB,SAASnpD,EACjCg4E,EAAGiD,aAAeH,EAASvgC,MAC3By9B,EAAGkD,iBAAmBJ,EAAS5xD,WASnCuxD,gBAAiB,SAAyBzC,GACtC,GAAI/wC,GAAMv5C,KAAKo6B,QACXqzD,EAAUl0C,EAAImzC,WACdgB,EAASn0C,EAAIozC,WAAac,GAG3BnD,EAAG3mB,WAAa0kB,GAAeiC,EAAG3mB,WAAaykB,KAC9CqF,EAAQ7sD,WACRqlD,EAAMC,KAAKoE,EAAG1pD,QAAS,SAASvC,GAC5BovD,EAAQ7sD,QAAQ14B,MACZ4oB,QAASuN,EAAMvN,QACfE,QAASqN,EAAMrN,YAK3B,IAAIi4D,GAAYqB,EAAGoB,UAAY+B,EAAQ/B,UACnCxrD,EAASoqD,EAAGj+D,OAAOyE,QAAU28D,EAAQphE,OAAOyE,QAC5CqP,EAASmqD,EAAGj+D,OAAO2E,QAAUy8D,EAAQphE,OAAO2E,OAkBhD,OAhBAhxB,MAAKitF,kBAAkB3C,EAAIoD,EAAOrhE,OAAQ48D,EAAW/oD,EAAQC,GAE7D8lD,EAAM5gF,OAAOilF,GACToC,WAAYe,EAEZxE,UAAWA,EACX/oD,OAAQA,EACRC,OAAQA,EAERta,SAAUogE,EAAMvqB,YAAY+xB,EAAQphE,OAAQi+D,EAAGj+D,QAC/CwgC,MAAOo5B,EAAMiD,SAASuE,EAAQphE,OAAQi+D,EAAGj+D,QACzCmP,UAAWyqD,EAAMoD,aAAaoE,EAAQphE,OAAQi+D,EAAGj+D,QACjDlP,MAAO8oE,EAAMh0B,SAASw7B,EAAQ7sD,QAAS0pD,EAAG1pD,SAC1C+sD,SAAU1H,EAAMqD,YAAYmE,EAAQ7sD,QAAS0pD,EAAG1pD,WAG7C0pD,GASXjE,SAAU,SAAkBpmD,GAExB,GAAIlxB,GAAUkxB,EAAQ2mD,YAyBtB,OAxBG73E,GAAQkxB,EAAQzpB,QAAUjQ,IACzBwI,EAAQkxB,EAAQzpB,OAAQ,GAI5ByvE,EAAM5gF,OAAOggC,EAAOuhD,SAAU73E,GAAS,GAGvCkxB,EAAQ53B,MAAQ43B,EAAQ53B,OAAS,IAGjCrI,KAAKmmF,SAASj+E,KAAK+3B,GAGnBjgC,KAAKmmF,SAAS1vE,KAAK,SAASnR,EAAGa,GAC3B,MAAGb,GAAE+C,MAAQlC,EAAEkC,MACJ,GAER/C,EAAE+C,MAAQlC,EAAEkC,MACJ,EAEJ,IAGJrI,KAAKmmF,UAmBpB9gD,GAAOshD,SAAW,SAAS79E,EAASiG,GAChC,GAAIm8D,GAAOlrE,IAIX6lF,KAMA7lF,KAAK8I,QAAUA,EAOf9I,KAAKgP,SAAU,EAQfi3E,EAAMC,KAAKn3E,EAAS,SAAS3H,EAAOoP,SACzBzH,GAAQyH,GACfzH,EAAQk3E,EAAM0D,YAAYnzE,IAASpP,IAGvCpH,KAAK+O,QAAUk3E,EAAM5gF,OAAO4gF,EAAM5gF,UAAWggC,EAAOuhD,UAAW73E,OAG5D/O,KAAK+O,QAAQ83E,UACZZ,EAAM2D,eAAe5pF,KAAK8I,QAAS9I,KAAK+O,QAAQ83E,UAAU,GAQ9D7mF,KAAK4tF,kBAAoB7H,EAAMO,QAAQx9E,EAASq/E,EAAa,SAASmC,GAC/Dpf,EAAKl8D,SAAWs7E,EAAG3mB,WAAawkB,EAC/B/B,EAAUmG,YAAYrhB,EAAMof,GACtBA,EAAG3mB,WAAa0kB,GACtBjC,EAAUK,OAAO6D,KASzBtqF,KAAK6tF,kBAGTxoD,EAAOshD,SAASlzE,WASZI,GAAI,SAAiBsyE,EAAUsC,GAC3B,GAAIvd,GAAOlrE,IAIX,OAHA+lF,GAAMlyE,GAAGq3D,EAAKpiE,QAASq9E,EAAUsC,EAAS,SAAS5hF,GAC/CqkE,EAAK2iB,cAAc3lF,MAAO+3B,QAASp5B,EAAM4hF,QAASA,MAE/Cvd,GAUXl3D,IAAK,SAAkBmyE,EAAUsC,GAC7B,GAAIvd,GAAOlrE,IAQX,OANA+lF,GAAM/xE,IAAIk3D,EAAKpiE,QAASq9E,EAAUsC,EAAS,SAAS5hF,GAChD,GAAIwB,GAAQ49E,EAAM4C,SAAU5oD,QAASp5B,EAAM4hF,QAASA,GACjDpgF,MAAU,GACT6iE,EAAK2iB,cAAcvlF,OAAOD,EAAO,KAGlC6iE,GAUXigB,QAAS,SAAsBlrD,EAASwsD,GAEhCA,IACAA,KAIJ,IAAIjjF,GAAQ67B,EAAOkhD,SAASuH,YAAY,QACxCtkF,GAAMukF,UAAU9tD,GAAS,GAAM,GAC/Bz2B,EAAMy2B,QAAUwsD,CAIhB,IAAI3jF,GAAU9I,KAAK8I,OAMnB,OALGm9E,GAAM6C,UAAU2D,EAAU9iF,OAAQb,KACjCA,EAAU2jF,EAAU9iF,QAGxBb,EAAQklF,cAAcxkF,GACfxJ,MASX2jC,OAAQ,SAAgBsqD,GAEpB,MADAjuF,MAAKgP,QAAUi/E,EACRjuF,MAQXkuF,QAAS,WACL,GAAI3oF,GAAG4oF,CAMP,KAHAlI,EAAM2D,eAAe5pF,KAAK8I,QAAS9I,KAAK+O,QAAQ83E,UAAU,GAGtDthF,EAAI,GAAK4oF,EAAKnuF,KAAK6tF,gBAAgBtoF,IACnC0gF,EAAMjyE,IAAIhU,KAAK8I,QAASqlF,EAAGluD,QAASkuD,EAAG1F,QAQ3C,OALAzoF,MAAK6tF,iBAGL9H,EAAM/xE,IAAIhU,KAAK8I,QAAS6+E,EAAYQ,GAAcnoF,KAAK4tF,mBAEhD,OAqDf,SAAUp3E,GAGN,QAAS43E,GAAY9D,EAAIkC,GACrB,GAAIjzC,GAAM6sC,EAAUhsD,OAGpB,MAAGoyD,EAAKz9E,QAAQs/E,eAAiB,GAC7B/D,EAAG1pD,QAAQl7B,OAAS8mF,EAAKz9E,QAAQs/E,gBAIrC,OAAO/D,EAAG3mB,WACN,IAAKwkB,GACDmG,GAAY,CACZ,MAEJ,KAAK9H,GAGD,GAAG8D,EAAGzkE,SAAW2mE,EAAKz9E,QAAQw/E,iBAC1Bh1C,EAAI/iC,MAAQA,EACZ,MAGJ,IAAIg4E,GAAcj1C,EAAImzC,WAAWrgE,MAGjC,IAAGktB,EAAI/iC,MAAQA,IACX+iC,EAAI/iC,KAAOA,EACRg2E,EAAKz9E,QAAQ0/E,wBAA0BnE,EAAGzkE,SAAW,GAAG,CAIvD,GAAI8/B,GAAS1gD,KAAK8lB,IAAIyhE,EAAKz9E,QAAQw/E,gBAAkBjE,EAAGzkE,SACxD2oE,GAAYxvD,OAASsrD,EAAGpqD,OAASylB,EACjC6oC,EAAYvvD,OAASqrD,EAAGnqD,OAASwlB,EACjC6oC,EAAY19D,SAAWw5D,EAAGpqD,OAASylB,EACnC6oC,EAAYx9D,SAAWs5D,EAAGnqD,OAASwlB,EAGnC2kC,EAAKlE,EAAU2G,gBAAgBzC,IAKpC/wC,EAAIozC,UAAU+B,gBACXlC,EAAKz9E,QAAQ2/E,gBACXlC,EAAKz9E,QAAQ4/E,qBAAuBrE,EAAGzkE,YAE3CykE,EAAGoE,gBAAiB,EAIxB,IAAIE,GAAgBr1C,EAAIozC,UAAUnxD,SAC/B8uD,GAAGoE,gBAAkBE,IAAkBtE,EAAG9uD,YAErC8uD,EAAG9uD,UADJyqD,EAAMsD,WAAWqF,GACAtE,EAAGnqD,OAAS,EAAK2nD,EAAeF,EAEhC0C,EAAGpqD,OAAS,EAAK2nD,EAAiBE,GAKtDuG,IACA9B,EAAKrB,QAAQ30E,EAAO,QAAS8zE,GAC7BgE,GAAY,GAIhB9B,EAAKrB,QAAQ30E,EAAM8zE,GACnBkC,EAAKrB,QAAQ30E,EAAO8zE,EAAG9uD,UAAW8uD,EAElC,IAAIf,GAAatD,EAAMsD,WAAWe,EAAG9uD,YAGjCgxD,EAAKz9E,QAAQ8/E,mBAAqBtF,GACjCiD,EAAKz9E,QAAQ+/E,sBAAwBvF,IACtCe,EAAG/gF,gBAEP,MAEJ,KAAK6+E,GACEkG,GAAahE,EAAGc,eAAiBoB,EAAKz9E,QAAQs/E,iBAC7C7B,EAAKrB,QAAQ30E,EAAO,MAAO8zE,GAC3BgE,GAAY,EAEhB,MAEJ,KAAK5H,GACD4H,GAAY,GAzFxB,GAAIA,IAAY,CA8FhBjpD,GAAO8gD,SAAS4I,MACZv4E,KAAMA,EACNnO,MAAO,GACPogF,QAAS2F,EACTxH,UAOI2H,gBAAiB,GAWjBE,wBAAwB,EAQxBJ,eAAgB,EAUhBS,qBAAqB,EAQrBD,mBAAmB,EASnBH,gBAAgB,EAShBC,oBAAqB,MAG9B,QAgBHtpD,EAAO8gD,SAAS6I,SACZx4E,KAAM,UACNnO,MAAO,KACPogF,QAAS,SAAwB6B,EAAIkC,GACjCA,EAAKrB,QAAQnrF,KAAKwW,KAAM8zE,KAqBhC,SAAU9zE,GAGN,QAASy4E,GAAY3E,EAAIkC,GACrB,GAAIz9E,GAAUy9E,EAAKz9E,QACfqrB,EAAUgsD,EAAUhsD,OAExB,QAAOkwD,EAAG3mB,WACN,IAAKwkB,GACDvuE,aAAauqC,GAGb/pB,EAAQ5jB,KAAOA,EAIf2tC,EAAQtqC,WAAW,WACZugB,GAAWA,EAAQ5jB,MAAQA,GAC1Bg2E,EAAKrB,QAAQ30E,EAAM8zE,IAExBv7E,EAAQmgF,YACX,MAEJ,KAAK1I,GACE8D,EAAGzkE,SAAW9W,EAAQogF,eACrBv1E,aAAauqC,EAEjB,MAEJ,KAAKikC,GACDxuE,aAAauqC,IA7BzB,GAAIA,EAkCJ9e,GAAO8gD,SAASiJ,MACZ54E,KAAMA,EACNnO,MAAO,GACPu+E,UAMIsI,YAAa,IAQbC,cAAe,GAEnB1G,QAASwG,IAEd,QAeH5pD,EAAO8gD,SAASkJ,SACZ74E,KAAM,UACNnO,MAAO2Q,IACPyvE,QAAS,SAAwB6B,EAAIkC,GAC9BlC,EAAG3mB,WAAaykB,GACfoE,EAAKrB,QAAQnrF,KAAKwW,KAAM8zE,KAyCpCjlD,EAAO8gD,SAASmJ,OACZ94E,KAAM,QACNnO,MAAO,GACPu+E,UAMI2I,gBAAiB,EAOjBC,gBAAiB,EAQjBC,eAAgB,GAQhBC,eAAgB,IAGpBjH,QAAS,SAAsB6B,EAAIkC,GAC/B,GAAGlC,EAAG3mB,WAAaykB,EAAe,CAC9B,GAAIxnD,GAAU0pD,EAAG1pD,QAAQl7B,OACrBqJ,EAAUy9E,EAAKz9E,OAGnB,IAAG6xB,EAAU7xB,EAAQwgF,iBACjB3uD,EAAU7xB,EAAQygF,gBAClB,QAKDlF,EAAG+C,UAAYt+E,EAAQ0gF,gBACtBnF,EAAGgD,UAAYv+E,EAAQ2gF,kBAEvBlD,EAAKrB,QAAQnrF,KAAKwW,KAAM8zE,GACxBkC,EAAKrB,QAAQnrF,KAAKwW,KAAO8zE,EAAG9uD,UAAW8uD,OA2BvD,SAAU9zE,GAGN,QAASm5E,GAAWrF,EAAIkC,GACpB,GAGIoD,GACAC,EAJA9gF,EAAUy9E,EAAKz9E,QACfqrB,EAAUgsD,EAAUhsD,QACpBjI,EAAOi0D,EAAUhpD,QAIrB,QAAOktD,EAAG3mB,WACN,IAAKwkB,GACD2H,GAAW,CACX,MAEJ,KAAKtJ,GACDsJ,EAAWA,GAAaxF,EAAGzkE,SAAW9W,EAAQghF,cAC9C,MAEJ,KAAKrJ,IACGT,EAAM0C,MAAM2B,EAAGz2C,SAAShtC,KAAM,WAAayjF,EAAGrB,UAAYl6E,EAAQihF,aAAeF,IAEjFF,EAAYz9D,GAAQA,EAAKw6D,WAAarC,EAAGoB,UAAYv5D,EAAKw6D,UAAUjB,UACpEmE,GAAe,EAGZ19D,GAAQA,EAAK3b,MAAQA,GACnBo5E,GAAaA,EAAY7gF,EAAQkhF,mBAClC3F,EAAGzkE,SAAW9W,EAAQmhF,oBACtB1D,EAAKrB,QAAQ,YAAab,GAC1BuF,GAAe,KAIfA,GAAgB9gF,EAAQohF,aACxB/1D,EAAQ5jB,KAAOA,EACfg2E,EAAKrB,QAAQ/wD,EAAQ5jB,KAAM8zE,MAnC/C,GAAIwF,IAAW,CA0CfzqD,GAAO8gD,SAASiK,KACZ55E,KAAMA,EACNnO,MAAO,IACPogF,QAASkH,EACT/I,UAOIoJ,WAAY,IAQZD,eAAgB,GAQhBI,WAAW,EAQXD,kBAAmB,GAQnBD,kBAAmB,OAG5B,OAeH5qD,EAAO8gD,SAASkK,OACZ75E,KAAM,QACNnO,OAAQ2Q,IACR4tE,UASIr9E,gBAAgB,EAQhB+mF,cAAc,GAElB7H,QAAS,SAAsB6B,EAAIkC,GAC/B,MAAGA,GAAKz9E,QAAQuhF,cAAgBhG,EAAGmB,aAAezD,MAC9CsC,GAAGsB,cAIJY,EAAKz9E,QAAQxF,gBACZ+gF,EAAG/gF,sBAGJ+gF,EAAG3mB,WAAa0kB,GACfmE,EAAKrB,QAAQ,QAASb,OA4ClC,SAAU9zE,GAGN,QAAS+5E,GAAiBjG,EAAIkC,GAC1B,OAAOlC,EAAG3mB,WACN,IAAKwkB,GACDmG,GAAY,CACZ,MAEJ,KAAK9H,GAED,GAAG8D,EAAG1pD,QAAQl7B,OAAS,EACnB,MAGJ,IAAI8qF,GAAiBvrF,KAAK8lB,IAAI,EAAIu/D,EAAGntE,OACjCszE,EAAoBxrF,KAAK8lB,IAAIu/D,EAAGqD,SAIpC,IAAG6C,EAAiBhE,EAAKz9E,QAAQ2hF,mBAC7BD,EAAoBjE,EAAKz9E,QAAQ4hF,qBACjC,MAIJvK,GAAUhsD,QAAQ5jB,KAAOA,EAGrB83E,IACA9B,EAAKrB,QAAQ30E,EAAO,QAAS8zE,GAC7BgE,GAAY,GAGhB9B,EAAKrB,QAAQ30E,EAAM8zE,GAGhBmG,EAAoBjE,EAAKz9E,QAAQ4hF,sBAChCnE,EAAKrB,QAAQ,SAAUb,GAIxBkG,EAAiBhE,EAAKz9E,QAAQ2hF,oBAC7BlE,EAAKrB,QAAQ,QAASb,GACtBkC,EAAKrB,QAAQ,SAAWb,EAAGntE,MAAQ,EAAI,KAAO,OAAQmtE,GAE1D,MAEJ,KAAKlC,GACEkG,GAAahE,EAAGc,cAAgB,IAC/BoB,EAAKrB,QAAQ30E,EAAO,MAAO8zE,GAC3BgE,GAAY,IAlD5B,GAAIA,IAAY,CAwDhBjpD,GAAO8gD,SAASyK,WACZp6E,KAAMA,EACNnO,MAAO,GACPu+E,UAOI8J,kBAAmB,IAQnBC,qBAAsB,GAG1BlI,QAAS8H,IAEd,aAQG7kB,EAAgC,WAC9B,MAAOrmC,IACT9kC,KAAKX,EAASM,EAAqBN,EAASC,KAAS6rE,IAAkCnlE,IAAc1G,EAAOD,QAAU8rE,KASzHjkE,SAIC,SAAS5H,EAAQD,GAYrBA,EAAQ0kD,oBAAsB,WAE7BtkD,KAAK6wF,aAAa7wF,KAAK+gD,UAAUtC,WAAWC,iBAAiB,GAG7D1+C,KAAKitD,eAIDjtD,KAAKygD,WACPzgD,KAAK4mD,aAEP5mD,KAAKkQ,SASNtQ,EAAQixF,aAAe,SAASC,EAAkBC,GAOhD,IANA,GAAIrrC,GAAgB1lD,KAAKkjD,YAAYx9C,OAEjCsrF,EAAY,GACZ9zC,EAAQ,EAGLwI,EAAgBorC,GAA4BE,EAAR9zC,GACrCA,EAAQ,GAAK,GACfl9C,KAAKixF,oBAAmB,GACxBjxF,KAAKkxF,0BAGLlxF,KAAKmxF,uBAGPzrC,EAAgB1lD,KAAKkjD,YAAYx9C,OACjCw3C,GAAS,CAIPA,GAAQ,GAAmB,GAAd6zC,GACf/wF,KAAKoxF,kBAEPpxF,KAAK8sD,2BASPltD,EAAQyxF,YAAc,SAAStsC,GAC7B,GAAIusC,GAA2BtxF,KAAKkkD,MACpC,IAAIa,EAAK0U,YAAcz5D,KAAK+gD,UAAUtC,WAAWM,iBAAmB/+C,KAAKuxF,kBAAkBxsC,KACrE,WAAlB/kD,KAAKwxF,WAAqD,GAA3BxxF,KAAKkjD,YAAYx9C,QAAc,CAEhE1F,KAAKyxF,WAAW1sC,EAIhB,KAHA,GAAI7H,GAAQ,EAGJl9C,KAAKkjD,YAAYx9C,OAAS1F,KAAK+gD,UAAUtC,WAAWC,iBAA6B,GAARxB,GAC/El9C,KAAK0xF,uBACLx0C,GAAS,MAKXl9C,MAAK2xF,mBAAmB5sC,GAAK,GAAM,GAGnC/kD,KAAKgmD,uBACLhmD,KAAK4xF,sBACL5xF,KAAK8sD,0BACL9sD,KAAKitD,cAIHjtD,MAAKkkD,QAAUotC,GACjBtxF,KAAKkQ,SAQTtQ,EAAQwrD,sBAAwB,WACW,GAArCprD,KAAK+gD,UAAUtC,WAAWzvC,SAC5BhP,KAAK6xF,eAAe,GAAE,GAAM,IAUhCjyF,EAAQuxF,qBAAuB,WAC7BnxF,KAAK6xF,eAAe,IAAG,GAAM,IAS/BjyF,EAAQ8xF,qBAAuB,WAC7B1xF,KAAK6xF,eAAe,GAAE,GAAM,IAgB9BjyF,EAAQiyF,eAAiB,SAASC,EAAcC,EAAU1wD,EAAM2wD,GAC9D,GAAIV,GAA2BtxF,KAAKkkD,OAChC+tC,EAAgBjyF,KAAKkjD,YAAYx9C,MAGjC1F,MAAKujD,cAAgBvjD,KAAKmd,OAA0B,GAAjB20E,GACrC9xF,KAAKkyF,kBAIHlyF,KAAKujD,cAAgBvjD,KAAKmd,OAA0B,IAAjB20E,EAGrC9xF,KAAKmyF,cAAc9wD,IAEZrhC,KAAKujD,cAAgBvjD,KAAKmd,OAA0B,GAAjB20E,KAC7B,GAATzwD,EAGFrhC,KAAKoyF,cAAcL,EAAU1wD,GAI7BrhC,KAAKqyF,uBAGTryF,KAAKgmD,uBAGDhmD,KAAKkjD,YAAYx9C,QAAUusF,IAAkBjyF,KAAKujD,cAAgBvjD,KAAKmd,OAA0B,IAAjB20E,KAClF9xF,KAAKsyF,eAAejxD,GACpBrhC,KAAKgmD,yBAIHhmD,KAAKujD,cAAgBvjD,KAAKmd,OAA0B,IAAjB20E,KACrC9xF,KAAKuyF,eACLvyF,KAAKgmD,wBAGPhmD,KAAKujD,cAAgBvjD,KAAKmd,MAG1Bnd,KAAK4xF,sBACL5xF,KAAKitD,eAGDjtD,KAAKkjD,YAAYx9C,OAASusF,IAC5BjyF,KAAKk5D,gBAAkB,EAEvBl5D,KAAKkxF,2BAGW,GAAdc,GAAsCzrF,SAAfyrF,IAErBhyF,KAAKkkD,QAAUotC,GACjBtxF,KAAKkQ,QAITlQ,KAAK8sD,2BAMPltD,EAAQ2yF,aAAe,WAErB,GAAIC,GAAkBxyF,KAAKyyF,mBACvBD,GAAkBxyF,KAAK+gD,UAAUtC,WAAWI,gBAC9C7+C,KAAK0yF,sBAAsB,EAAI1yF,KAAK+gD,UAAUtC,WAAWI,eAAiB2zC,IAW9E5yF,EAAQ0yF,eAAiB,SAASjxD,GAChCrhC,KAAK2yF,cACL3yF,KAAK4yF,mBAAmBvxD,GAAM,IAQhCzhC,EAAQqxF,mBAAqB,SAASe,GACpC,GAAIV,GAA2BtxF,KAAKkkD,OAChC+tC,EAAgBjyF,KAAKkjD,YAAYx9C,MAErC1F,MAAKsyF,gBAAe,GAGpBtyF,KAAKgmD,uBACLhmD,KAAK4xF,sBACL5xF,KAAKitD,eAGDjtD,KAAKkjD,YAAYx9C,QAAUusF,IAC7BjyF,KAAKk5D,gBAAkB,IAGP,GAAd84B,GAAsCzrF,SAAfyrF,IAErBhyF,KAAKkkD,QAAUotC,GACjBtxF,KAAKkQ,SAUXtQ,EAAQyyF,oBAAsB,WAC5B,IAAK,GAAIjtC,KAAUplD,MAAKw8C,MACtB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrC,GAAIL,GAAO/kD,KAAKw8C,MAAM4I,EACD,IAAjBL,EAAK4X,WACF5X,EAAKlyC,MAAM7S,KAAKmd,MAAQnd,KAAK+gD,UAAUtC,WAAWO,oBAAsBh/C,KAAKwf,MAAMC,OAAOC,aAC1FqlC,EAAKjyC,OAAO9S,KAAKmd,MAAQnd,KAAK+gD,UAAUtC,WAAWO,oBAAsBh/C,KAAKwf,MAAMC,OAAOsF,eAC9F/kB,KAAKqxF,YAAYtsC,KAc3BnlD,EAAQwyF,cAAgB,SAASL,EAAU1wD,GACzC,IAAK,GAAI97B,GAAI,EAAGA,EAAIvF,KAAKkjD,YAAYx9C,OAAQH,IAAK,CAChD,GAAIw/C,GAAO/kD,KAAKw8C,MAAMx8C,KAAKkjD,YAAY39C,GACvCvF,MAAK2xF,mBAAmB5sC,EAAKgtC,EAAU1wD,GACvCrhC,KAAK8sD,4BAeTltD,EAAQ+xF,mBAAqB,SAAS7nF,EAAYioF,EAAW1wD,EAAOwxD,GAElE,GAAI/oF,EAAW2vD,YAAc,IAEvB3vD,EAAW2vD,YAAcz5D,KAAK+gD,UAAUtC,WAAWM,kBACrD8zC,GAAU,GAEZd,EAAYc,GAAU,EAAOd,EAGzBjoF,EAAW0vD,eAAiBx5D,KAAKmd,OAAkB,GAATkkB,GAE5C,IAAK,GAAIyxD,KAAmBhpF,GAAW4vD,eACrC,GAAI5vD,EAAW4vD,eAAe7zD,eAAeitF,GAAkB,CAC7D,GAAIC,GAAYjpF,EAAW4vD,eAAeo5B,EAI7B,IAATzxD,GACE0xD,EAAU75B,gBAAkBpvD,EAAW8vD,gBAAgB9vD,EAAW8vD,gBAAgBl0D,OAAO,IACtFmtF,IACL7yF,KAAKgzF,sBAAsBlpF,EAAWgpF,EAAgBf,EAAU1wD,EAAMwxD,GAIpE7yF,KAAKuxF,kBAAkBznF,IACzB9J,KAAKgzF,sBAAsBlpF,EAAWgpF,EAAgBf,EAAU1wD,EAAMwxD,KAwBpFjzF,EAAQozF,sBAAwB,SAASlpF,EAAYgpF,EAAiBf,EAAW1wD,EAAOwxD,GACtF,GAAIE,GAAYjpF,EAAW4vD,eAAeo5B,EAG1C,IAAIC,EAAUv5B,eAAiBx5D,KAAKmd,OAAkB,GAATkkB,EAAe,CAE1DrhC,KAAKizF,eAGLjzF,KAAKw8C,MAAMs2C,GAAmBC,EAG9B/yF,KAAKkzF,uBAAuBppF,EAAWipF,GAGvC/yF,KAAKmzF,wBAAwBrpF,EAAWipF,GAGxC/yF,KAAKozF,eAAetpF,GAGpBA,EAAWiF,QAAQ0tC,MAAQs2C,EAAUhkF,QAAQ0tC,KAC7C3yC,EAAW2vD,aAAes5B,EAAUt5B,YACpC3vD,EAAWiF,QAAQguC,SAAW93C,KAAKwG,IAAIzL,KAAK+gD,UAAUtC,WAAWS,YAAal/C,KAAK+gD,UAAUvE,MAAMO,SAAW/8C,KAAK+gD,UAAUtC,WAAWQ,oBAAoBn1C,EAAW2vD,YAAY,IACnL3vD,EAAWmvD,mBAAqBnvD,EAAW8jD,aAAaloD,OAGxDqtF,EAAU1gF,EAAIvI,EAAWuI,EAAIvI,EAAWwvD,iBAAmB,GAAMr0D,KAAKE,UACtE4tF,EAAUzgF,EAAIxI,EAAWwI,EAAIxI,EAAWwvD,iBAAmB,GAAMr0D,KAAKE,gBAG/D2E,GAAW4vD,eAAeo5B,EAGjC,IAAIO,IAAgB,CACpB,KAAK,GAAIC,KAAexpF,GAAW4vD,eACjC,GAAI5vD,EAAW4vD,eAAe7zD,eAAeytF,IACvCxpF,EAAW4vD,eAAe45B,GAAap6B,gBAAkB65B,EAAU75B,eAAgB,CACrFm6B,GAAgB,CAChB,OAKe,GAAjBA,GACFvpF,EAAW8vD,gBAAgB5f,MAG7Bh6C,KAAKuzF,uBAAuBR,GAI5BA,EAAU75B,eAAiB,EAG3BpvD,EAAWuxD,iBAGXr7D,KAAKkkD,QAAS,EAIC,GAAb6tC,GACF/xF,KAAK2xF,mBAAmBoB,EAAUhB,EAAU1wD,EAAMwxD,IAWtDjzF,EAAQ2zF,uBAAyB,SAASxuC,GACxC,IAAK,GAAIx/C,GAAI,EAAGA,EAAIw/C,EAAK6I,aAAaloD,OAAQH,IAC5Cw/C,EAAK6I,aAAaroD,GAAGsrD,sBAczBjxD,EAAQuyF,cAAgB,SAAS9wD,GAClB,GAATA,EACFrhC,KAAKwzF,sBAGLxzF,KAAKyzF,wBAUT7zF,EAAQ4zF,oBAAsB,WAC5B,GAAI10E,GAAGC,EAAGrZ,EACNguF,EAAY1zF,KAAK+gD,UAAUtC,WAAWK,qBAAqB9+C,KAAKmd,KAIpE,KAAK,GAAIyuC,KAAU5rD,MAAKq9C,MACtB,GAAIr9C,KAAKq9C,MAAMx3C,eAAe+lD,GAAS,CACrC,GAAIO,GAAOnsD,KAAKq9C,MAAMuO,EACtB,IAAIO,EAAKC,WACHD,EAAKkG,MAAQlG,EAAKiG,SACpBtzC,EAAMqtC,EAAK5iC,GAAGlX,EAAI85C,EAAK7iC,KAAKjX,EAC5B0M,EAAMotC,EAAK5iC,GAAGjX,EAAI65C,EAAK7iC,KAAKhX,EAC5B5M,EAAST,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAGrB20E,EAAThuF,GAAoB,CAEtB,GAAIoE,GAAaqiD,EAAK7iC,KAClBypE,EAAY5mC,EAAK5iC,EACjB4iC,GAAK5iC,GAAGxa,QAAQ0tC,KAAO0P,EAAK7iC,KAAKva,QAAQ0tC,OAC3C3yC,EAAaqiD,EAAK5iC,GAClBwpE,EAAY5mC,EAAK7iC,MAGiB,GAAhCypE,EAAU95B,mBACZj5D,KAAK2zF,cAAc7pF,EAAWipF,GAAU,GAEA,GAAjCjpF,EAAWmvD,oBAClBj5D,KAAK2zF,cAAcZ,EAAUjpF,GAAW,MAetDlK,EAAQ6zF,qBAAuB,WAC7B,IAAK,GAAIruC,KAAUplD,MAAKw8C,MAEtB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrC,GAAI2tC,GAAY/yF,KAAKw8C,MAAM4I,EAG3B,IAAoC,GAAhC2tC,EAAU95B,oBAA4D,GAAjC85B,EAAUnlC,aAAaloD,OAAa,CAC3E,GAAIymD,GAAO4mC,EAAUnlC,aAAa,GAC9B9jD,EAAcqiD,EAAKkG,MAAQ0gC,EAAU1yF,GAAML,KAAKw8C,MAAM2P,EAAKiG,QAAUpyD,KAAKw8C,MAAM2P,EAAKkG,KAGrF0gC,GAAU1yF,IAAMyJ,EAAWzJ,KACzByJ,EAAWiF,QAAQ0tC,KAAOs2C,EAAUhkF,QAAQ0tC,KAC9Cz8C,KAAK2zF,cAAc7pF,EAAWipF,GAAU,GAGxC/yF,KAAK2zF,cAAcZ,EAAUjpF,GAAW,OAgBpDlK,EAAQg0F,4BAA8B,SAAS7uC,GAG7C,IAAK,GAFD8uC,GAAoB,GACpBC,EAAwB,KACnBvuF,EAAI,EAAGA,EAAIw/C,EAAK6I,aAAaloD,OAAQH,IAC5C,GAA6BgB,SAAzBw+C,EAAK6I,aAAaroD,GAAkB,CACtC,GAAIwuF,GAAY,IACZhvC,GAAK6I,aAAaroD,GAAG6sD,QAAUrN,EAAK1kD,GACtC0zF,EAAYhvC,EAAK6I,aAAaroD,GAAG+jB,KAE1By7B,EAAK6I,aAAaroD,GAAG8sD,MAAQtN,EAAK1kD,KACzC0zF,EAAYhvC,EAAK6I,aAAaroD,GAAGgkB,IAIlB,MAAbwqE,GAAqBF,EAAoBE,EAAUn6B,gBAAgBl0D,SACrEmuF,EAAoBE,EAAUn6B,gBAAgBl0D,OAC9CouF,EAAwBC,GAKb,MAAbA,GAAkDxtF,SAA7BvG,KAAKw8C,MAAMu3C,EAAU1zF,KAC5CL,KAAK2zF,cAAcI,EAAWhvC,GAAM,IAYxCnlD,EAAQgzF,mBAAqB,SAASvxD,EAAO2yD,GAE3C,IAAK,GAAI5uC,KAAUplD,MAAKw8C,MAElBx8C,KAAKw8C,MAAM32C,eAAeu/C,IAC5BplD,KAAKi0F,oBAAoBj0F,KAAKw8C,MAAM4I,GAAQ/jB,EAAM2yD,IAcxDp0F,EAAQq0F,oBAAsB,SAASC,EAAS7yD,EAAO2yD,EAAWG,GAKhE,GAJ6B5tF,SAAzB4tF,IACFA,EAAuB,GAGpBD,EAAQj7B,oBAAsBj5D,KAAK8pE,cAA6B,GAAbkqB,GACrDE,EAAQj7B,oBAAsBj5D,KAAK8pE,cAA6B,GAAbkqB,EAAoB,CASxE,IAAK,GAPDl1E,GAAGC,EAAGrZ,EACNguF,EAAY1zF,KAAK+gD,UAAUtC,WAAWK,qBAAqB9+C,KAAKmd,MAChEi3E,GAAe,EAGfC,KACAC,EAAuBJ,EAAQtmC,aAAaloD,OACvCqmB,EAAI,EAAOuoE,EAAJvoE,EAA0BA,IACxCsoE,EAAansF,KAAKgsF,EAAQtmC,aAAa7hC,GAAG1rB,GAK5C,IAAa,GAATghC,EAEF,IADA+yD,GAAe,EACVroE,EAAI,EAAOuoE,EAAJvoE,EAA0BA,IAAK,CACzC,GAAIogC,GAAOnsD,KAAKq9C,MAAMg3C,EAAatoE,GACnC,IAAaxlB,SAAT4lD,GACEA,EAAKC,WACHD,EAAKkG,MAAQlG,EAAKiG,SACpBtzC,EAAMqtC,EAAK5iC,GAAGlX,EAAI85C,EAAK7iC,KAAKjX,EAC5B0M,EAAMotC,EAAK5iC,GAAGjX,EAAI65C,EAAK7iC,KAAKhX,EAC5B5M,EAAST,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAErB20E,EAAThuF,GAAoB,CACtB0uF,GAAe,CACf,QASZ,IAAM/yD,GAAS+yD,GAAiB/yD,EAE9B,IAAKtV,EAAI,EAAOuoE,EAAJvoE,EAA0BA,IAGpC,GAFAogC,EAAOnsD,KAAKq9C,MAAMg3C,EAAatoE,IAElBxlB,SAAT4lD,EAAoB,CACtB,GAAI4mC,GAAY/yF,KAAKw8C,MAAO2P,EAAKiG,QAAU8hC,EAAQ7zF,GAAM8rD,EAAKkG,KAAOlG,EAAKiG,OAErE2gC,GAAUnlC,aAAaloD,QAAW1F,KAAK8pE,aAAeqqB,GACtDpB,EAAU1yF,IAAM6zF,EAAQ7zF,IAC3BL,KAAK2zF,cAAcO,EAAQnB,EAAU1xD,MAkBjDzhC,EAAQ+zF,cAAgB,SAAS7pF,EAAYipF,EAAW1xD,GAEtDv3B,EAAW4vD,eAAeq5B,EAAU1yF,IAAM0yF,CAG1C,KAAK,GAAIxtF,GAAI,EAAGA,EAAIwtF,EAAUnlC,aAAaloD,OAAQH,IAAK,CACtD,GAAI4mD,GAAO4mC,EAAUnlC,aAAaroD,EAC9B4mD,GAAKkG,MAAQvoD,EAAWzJ,IAAM8rD,EAAKiG,QAAUtoD,EAAWzJ,GAC1DL,KAAKu0F,qBAAqBzqF,EAAWipF,EAAU5mC,GAG/CnsD,KAAKw0F,sBAAsB1qF,EAAWipF,EAAU5mC,GAIpD4mC,EAAUnlC,gBAGV5tD,KAAKy0F,8BAA8B3qF,EAAWipF,SAIvC/yF,MAAKw8C,MAAMu2C,EAAU1yF,GAG5B,IAAIq0F,GAAa5qF,EAAWiF,QAAQ0tC,IACpCs2C,GAAU75B,eAAiBl5D,KAAKk5D,eAChCpvD,EAAWiF,QAAQ0tC,MAAQs2C,EAAUhkF,QAAQ0tC,KAC7C3yC,EAAW2vD,aAAes5B,EAAUt5B,YACpC3vD,EAAWiF,QAAQguC,SAAW93C,KAAKwG,IAAIzL,KAAK+gD,UAAUtC,WAAWS,YAAal/C,KAAK+gD,UAAUvE,MAAMO,SAAW/8C,KAAK+gD,UAAUtC,WAAWQ,mBAAmBn1C,EAAW2vD,aAGlK3vD,EAAW8vD,gBAAgB9vD,EAAW8vD,gBAAgBl0D,OAAS,IAAM1F,KAAKk5D,gBAC5EpvD,EAAW8vD,gBAAgB1xD,KAAKlI,KAAKk5D,gBAMrCpvD,EAAW0vD,eAFA,GAATn4B,EAE0B,EAGArhC,KAAKmd,MAInCrT,EAAWuxD,iBAGXvxD,EAAW4vD,eAAeq5B,EAAU1yF,IAAIm5D,eAAiB1vD,EAAW0vD,eAGpEu5B,EAAUn2B,gBAGV9yD,EAAW+yD,eAAe63B,GAG1B10F,KAAKkkD,QAAS,GAUhBtkD,EAAQgyF,oBAAsB,WAC5B,IAAK,GAAIrsF,GAAI,EAAGA,EAAIvF,KAAKkjD,YAAYx9C,OAAQH,IAAK,CAChD,GAAIw/C,GAAO/kD,KAAKw8C,MAAMx8C,KAAKkjD,YAAY39C,GACvCw/C,GAAKkU,mBAAqBlU,EAAK6I,aAAaloD,MAG5C,IAAIivF,GAAa,CACjB,IAAI5vC,EAAKkU,mBAAqB,EAC5B,IAAK,GAAIltC,GAAI,EAAGA,EAAIg5B,EAAKkU,mBAAqB,EAAGltC,IAG/C,IAAK,GAFD6oE,GAAW7vC,EAAK6I,aAAa7hC,GAAGsmC,KAChCwiC,EAAa9vC,EAAK6I,aAAa7hC,GAAGqmC,OAC7B0iC,EAAI/oE,EAAE,EAAG+oE,EAAI/vC,EAAKkU,mBAAoB67B,KACxC/vC,EAAK6I,aAAaknC,GAAGziC,MAAQuiC,GAAY7vC,EAAK6I,aAAaknC,GAAG1iC,QAAUyiC,GACxE9vC,EAAK6I,aAAaknC,GAAG1iC,QAAUwiC,GAAY7vC,EAAK6I,aAAaknC,GAAGziC,MAAQwiC,KAC3EF,GAAc,EAKtB5vC,GAAKkU,oBAAsB07B,IAa/B/0F,EAAQ20F,qBAAuB,SAASzqF,EAAYipF,EAAW5mC,GAEvDriD,EAAW6vD,eAAe9zD,eAAektF,EAAU1yF,MACvDyJ,EAAW6vD,eAAeo5B,EAAU1yF,QAGtCyJ,EAAW6vD,eAAeo5B,EAAU1yF,IAAI6H,KAAKikD,SAGtCnsD,MAAKq9C,MAAM8O,EAAK9rD,GAGvB,KAAK,GAAIkF,GAAI,EAAGA,EAAIuE,EAAW8jD,aAAaloD,OAAQH,IAClD,GAAIuE,EAAW8jD,aAAaroD,GAAGlF,IAAM8rD,EAAK9rD,GAAI,CAC5CyJ,EAAW8jD,aAAatlD,OAAO/C,EAAE,EACjC,SAcN3F,EAAQ40F,sBAAwB,SAAS1qF,EAAYipF,EAAW5mC,GAE1DA,EAAKkG,MAAQlG,EAAKiG,OACpBpyD,KAAKu0F,qBAAqBzqF,EAAYipF,EAAW5mC,IAG7CA,EAAKkG,MAAQ0gC,EAAU1yF,IACzB8rD,EAAKwG,aAAazqD,KAAK6qF,EAAU1yF,IACjC8rD,EAAK5iC,GAAKzf,EACVqiD,EAAKkG,KAAOvoD,EAAWzJ,KAIvB8rD,EAAKuG,eAAexqD,KAAK6qF,EAAU1yF,IACnC8rD,EAAK7iC,KAAOxf,EACZqiD,EAAKiG,OAAStoD,EAAWzJ,IAG3BL,KAAK+0F,oBAAoBjrF,EAAWipF,EAAU5mC,KAalDvsD,EAAQ60F,8BAAgC,SAAS3qF,EAAYipF,GAE3D,IAAK,GAAIxtF,GAAI,EAAGA,EAAIuE,EAAW8jD,aAAaloD,OAAQH,IAAK,CACvD,GAAI4mD,GAAOriD,EAAW8jD,aAAaroD,EAE/B4mD,GAAKkG,MAAQlG,EAAKiG,QACpBpyD,KAAKu0F,qBAAqBzqF,EAAYipF,EAAW5mC,KAcvDvsD,EAAQm1F,oBAAsB,SAASjrF,EAAYipF,EAAW5mC,GAGtDriD,EAAWsuD,cAAcvyD,eAAektF,EAAU1yF,MACtDyJ,EAAWsuD,cAAc26B,EAAU1yF,QAErCyJ,EAAWsuD,cAAc26B,EAAU1yF,IAAI6H,KAAKikD,GAG5CriD,EAAW8jD,aAAa1lD,KAAKikD,IAY/BvsD,EAAQuzF,wBAA0B,SAASrpF,EAAYipF,GACrD,GAAIjpF,EAAWsuD,cAAcvyD,eAAektF,EAAU1yF,IAAK,CACzD,IAAK,GAAIkF,GAAI,EAAGA,EAAIuE,EAAWsuD,cAAc26B,EAAU1yF,IAAIqF,OAAQH,IAAK,CACtE,GAAI4mD,GAAOriD,EAAWsuD,cAAc26B,EAAU1yF,IAAIkF,EAC9C4mD,GAAKuG,eAAevG,EAAKuG,eAAehtD,OAAO,IAAMqtF,EAAU1yF,IACjE8rD,EAAKuG,eAAe1Y,MACpBmS,EAAKiG,OAAS2gC,EAAU1yF,GACxB8rD,EAAK7iC,KAAOypE,IAGZ5mC,EAAKwG,aAAa3Y,MAClBmS,EAAKkG,KAAO0gC,EAAU1yF,GACtB8rD,EAAK5iC,GAAKwpE,GAIZA,EAAUnlC,aAAa1lD,KAAKikD,EAG5B,KAAK,GAAIpgC,GAAI,EAAGA,EAAIjiB,EAAW8jD,aAAaloD,OAAQqmB,IAClD,GAAIjiB,EAAW8jD,aAAa7hC,GAAG1rB,IAAM8rD,EAAK9rD,GAAI,CAC5CyJ,EAAW8jD,aAAatlD,OAAOyjB,EAAE,EACjC,cAKCjiB,GAAWsuD,cAAc26B,EAAU1yF,MAa9CT,EAAQwzF,eAAiB,SAAStpF,GAChC,IAAK,GAAIvE,GAAI,EAAGA,EAAIuE,EAAW8jD,aAAaloD,OAAQH,IAAK,CACvD,GAAI4mD,GAAOriD,EAAW8jD,aAAaroD,EAC/BuE,GAAWzJ,IAAM8rD,EAAKkG,MAAQvoD,EAAWzJ,IAAM8rD,EAAKiG,QACtDtoD,EAAW8jD,aAAatlD,OAAO/C,EAAE,KAcvC3F,EAAQszF,uBAAyB,SAASppF,EAAYipF,GACpD,IAAK,GAAIxtF,GAAI,EAAGA,EAAIuE,EAAW6vD,eAAeo5B,EAAU1yF,IAAIqF,OAAQH,IAAK,CACvE,GAAI4mD,GAAOriD,EAAW6vD,eAAeo5B,EAAU1yF,IAAIkF,EAGnDvF,MAAKq9C,MAAM8O,EAAK9rD,IAAM8rD,EAGtB4mC,EAAUnlC,aAAa1lD,KAAKikD,GAC5BriD,EAAW8jD,aAAa1lD,KAAKikD,SAGxBriD,GAAW6vD,eAAeo5B,EAAU1yF,KAa7CT,EAAQqtD,aAAe,WACrB,GAAI7H,EAEJ,KAAKA,IAAUplD,MAAKw8C,MAClB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrC,GAAIL,GAAO/kD,KAAKw8C,MAAM4I,EAClBL,GAAK0U,YAAc,IACrB1U,EAAKp8B,MAAQ,IAAIrU,OAAOnQ,OAAO4gD,EAAK0U,aAAa,MAMvD,IAAKrU,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GACM,GAApBL,EAAK0U,cAEL1U,EAAKp8B,MADoBpiB,SAAvBw+C,EAAK8U,cACM9U,EAAK8U,cAGL11D,OAAO4gD,EAAK1kD,OAuBnCT,EAAQsxF,uBAAyB,WAC/B,GAGI9rC,GAHA4vC,EAAW,EACXC,EAAW,IACXC,EAAe,CAInB,KAAK9vC,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5B8vC,EAAel1F,KAAKw8C,MAAM4I,GAAQwU,gBAAgBl0D,OACnCwvF,EAAXF,IAA0BA,EAAWE,GACrCD,EAAWC,IAAeD,EAAWC,GAI7C,IAAIF,EAAWC,EAAWj1F,KAAK+gD,UAAUtC,WAAWgB,uBAAwB,CAC1E,GAAIwyC,GAAgBjyF,KAAKkjD,YAAYx9C,OACjCyvF,EAAcH,EAAWh1F,KAAK+gD,UAAUtC,WAAWgB,sBAEvD,KAAK2F,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,IACxBplD,KAAKw8C,MAAM4I,GAAQwU,gBAAgBl0D,OAASyvF,GAC9Cn1F,KAAK4zF,4BAA4B5zF,KAAKw8C,MAAM4I,GAIlDplD,MAAKgmD,uBACLhmD,KAAK4xF,sBAED5xF,KAAKkjD,YAAYx9C,QAAUusF,IAC7BjyF,KAAKk5D,gBAAkB;GAe7Bt5D,EAAQ2xF,kBAAoB,SAASxsC,GACnC,MACE9/C,MAAK8lB,IAAIg6B,EAAK1yC,EAAIrS,KAAKsjD,WAAWjxC,IAAMrS,KAAK+gD,UAAUtC,WAAWe,kBAAkBx/C,KAAKmd,OAEzFlY,KAAK8lB,IAAIg6B,EAAKzyC,EAAItS,KAAKsjD,WAAWhxC,IAAMtS,KAAK+gD,UAAUtC,WAAWe,kBAAkBx/C,KAAKmd,OAU7Fvd,EAAQwxF,gBAAkB,WACxB,IAAK,GAAI7rF,GAAI,EAAGA,EAAIvF,KAAKkjD,YAAYx9C,OAAQH,IAAK,CAChD,GAAIw/C,GAAO/kD,KAAKw8C,MAAMx8C,KAAKkjD,YAAY39C,GACvC,IAAoB,GAAfw/C,EAAKiF,QAAkC,GAAfjF,EAAKkF,OAAkB,CAClD,GAAIr+B,GAAS,EAAS5rB,KAAKkjD,YAAYx9C,OAAST,KAAKwG,IAAI,IAAIs5C,EAAKh2C,QAAQ0tC,MACtEoQ,EAAQ,EAAI5nD,KAAK6mB,GAAK7mB,KAAKE,QACZ,IAAf4/C,EAAKiF,SAAkBjF,EAAK1yC,EAAIuZ,EAAS3mB,KAAKwZ,IAAIouC,IACnC,GAAf9H,EAAKkF,SAAkBlF,EAAKzyC,EAAIsZ,EAAS3mB,KAAKqZ,IAAIuuC,IACtD7sD,KAAKuzF,uBAAuBxuC,MAYlCnlD,EAAQ+yF,YAAc,WAMpB,IAAK,GALDyC,GAAU,EACVC,EAAiB,EACjBC,EAAa,EACbC,EAAa,EAERhwF,EAAI,EAAGA,EAAIvF,KAAKkjD,YAAYx9C,OAAQH,IAAK,CAEhD,GAAIw/C,GAAO/kD,KAAKw8C,MAAMx8C,KAAKkjD,YAAY39C,GACnCw/C,GAAKkU,mBAAqBs8B,IAC5BA,EAAaxwC,EAAKkU,oBAEpBm8B,GAAWrwC,EAAKkU,mBAChBo8B,GAAkBpwF,KAAKovB,IAAI0wB,EAAKkU,mBAAmB,GACnDq8B,GAAc,EAEhBF,GAAoBE,EACpBD,GAAkCC,CAElC,IAAIE,GAAWH,EAAiBpwF,KAAKovB,IAAI+gE,EAAQ,GAE7CK,EAAoBxwF,KAAK8qB,KAAKylE,EAElCx1F,MAAK8pE,aAAe7kE,KAAKC,MAAMkwF,EAAU,EAAEK,GAGvCz1F,KAAK8pE,aAAeyrB,IACtBv1F,KAAK8pE,aAAeyrB,IAexB31F,EAAQ8yF,sBAAwB,SAASgD,GACvC11F,KAAK8pE,aAAe,CACpB,IAAI6rB,GAAe1wF,KAAKC,MAAMlF,KAAKkjD,YAAYx9C,OAASgwF,EACxD,KAAK,GAAItwC,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,IACiB,GAAzCplD,KAAKw8C,MAAM4I,GAAQ6T,oBAA2Bj5D,KAAKw8C,MAAM4I,GAAQwI,aAAaloD,QAAU,GACtFiwF,EAAe,IACjB31F,KAAKi0F,oBAAoBj0F,KAAKw8C,MAAM4I,IAAQ,GAAK,EAAK,GACtDuwC,GAAgB,IAa1B/1F,EAAQ6yF,kBAAoB,WAC1B,GAAImD,GAAS,EACTC,EAAQ,CACZ,KAAK,GAAIzwC,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,KACiB,GAAzCplD,KAAKw8C,MAAM4I,GAAQ6T,oBAA2Bj5D,KAAKw8C,MAAM4I,GAAQwI,aAAaloD,QAAU,IAC1FkwF,GAAU,GAEZC,GAAS,EAGb,OAAOD,GAAOC,IAMZ,SAASh2F,EAAQD,EAASM,GAE9B,GAAIS,GAAOT,EAAoB,GAC3BqD,EAAOrD,EAAoB,GAgB/BN,GAAQ8mD,iBAAmB,WACzB1mD,KAAK2tD,QAAgB,OAAE3tD,KAAKwxF,WAAWh1C,MAAQx8C,KAAKw8C,MACpDx8C,KAAK2tD,QAAgB,OAAE3tD,KAAKwxF,WAAWn0C,MAAQr9C,KAAKq9C,MACpDr9C,KAAK2tD,QAAgB,OAAE3tD,KAAKwxF,WAAWtuC,YAAcljD,KAAKkjD,aAa5DtjD,EAAQk2F,gBAAkB,SAASC,EAAUC,GACxBzvF,SAAfyvF,GAA0C,UAAdA,EAC9Bh2F,KAAKi2F,sBAAsBF,GAG3B/1F,KAAKk2F,sBAAsBH,IAY/Bn2F,EAAQq2F,sBAAwB,SAASF,GACvC/1F,KAAKkjD,YAAcljD,KAAK2tD,QAAgB,OAAEooC,GAAuB,YACjE/1F,KAAKw8C,MAAcx8C,KAAK2tD,QAAgB,OAAEooC,GAAiB,MAC3D/1F,KAAKq9C,MAAcr9C,KAAK2tD,QAAgB,OAAEooC,GAAiB,OAU7Dn2F,EAAQu2F,uBAAyB,WAC/Bn2F,KAAKkjD,YAAcljD,KAAK2tD,QAAiB,QAAe,YACxD3tD,KAAKw8C,MAAcx8C,KAAK2tD,QAAiB,QAAS,MAClD3tD,KAAKq9C,MAAcr9C,KAAK2tD,QAAiB,QAAS,OAWpD/tD,EAAQs2F,sBAAwB,SAASH,GACvC/1F,KAAKkjD,YAAcljD,KAAK2tD,QAAgB,OAAEooC,GAAuB,YACjE/1F,KAAKw8C,MAAcx8C,KAAK2tD,QAAgB,OAAEooC,GAAiB,MAC3D/1F,KAAKq9C,MAAcr9C,KAAK2tD,QAAgB,OAAEooC,GAAiB,OAU7Dn2F,EAAQw2F,kBAAoB,WAC1Bp2F,KAAK81F,gBAAgB91F,KAAKwxF,YAU5B5xF,EAAQ4xF,QAAU,WAChB,MAAOxxF,MAAK+pE,aAAa/pE,KAAK+pE,aAAarkE,OAAO,IAUpD9F,EAAQy2F,gBAAkB,WACxB,GAAIr2F,KAAK+pE,aAAarkE,OAAS,EAC7B,MAAO1F,MAAK+pE,aAAa/pE,KAAK+pE,aAAarkE,OAAO,EAGlD,MAAM,IAAIU,WAAU,iEAaxBxG,EAAQ02F,iBAAmB,SAASC,GAClCv2F,KAAK+pE,aAAa7hE,KAAKquF,IAUzB32F,EAAQ42F,kBAAoB,WAC1Bx2F,KAAK+pE,aAAa/vB,OAWpBp6C,EAAQ62F,iBAAmB,SAASF,GAElCv2F,KAAK2tD,QAAgB,OAAE4oC,IAAU/5C,SACAa,SACA6F,eACAsW,eAAkBx5D,KAAKmd,MACvB6sD,YAAezjE,QAGhDvG,KAAK2tD,QAAgB,OAAE4oC,GAAoB,YAAI,GAAIhzF,IAC9ClD,GAAGk2F,EACF1rF,OACEiB,WAAY,UACZC,OAAQ,iBAEJ/L,KAAK+gD,WACjB/gD,KAAK2tD,QAAgB,OAAE4oC,GAAoB,YAAE98B,YAAc,GAW7D75D,EAAQ82F,oBAAsB,SAASX,SAC9B/1F,MAAK2tD,QAAgB,OAAEooC,IAWhCn2F,EAAQ+2F,oBAAsB,SAASZ,SAC9B/1F,MAAK2tD,QAAgB,OAAEooC,IAWhCn2F,EAAQg3F,cAAgB,SAASb,GAE/B/1F,KAAK2tD,QAAgB,OAAEooC,GAAY/1F,KAAK2tD,QAAgB,OAAEooC,GAG1D/1F,KAAK02F,oBAAoBX,IAW3Bn2F,EAAQi3F,gBAAkB,SAASd,GAEjC/1F,KAAK2tD,QAAgB,OAAEooC,GAAY/1F,KAAK2tD,QAAgB,OAAEooC,GAG1D/1F,KAAK22F,oBAAoBZ,IAa3Bn2F,EAAQk3F,qBAAuB,SAASf,GAEtC,IAAK,GAAI3wC,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BplD,KAAK2tD,QAAgB,OAAEooC,GAAiB,MAAE3wC,GAAUplD,KAAKw8C,MAAM4I,GAKnE,KAAK,GAAIwG,KAAU5rD,MAAKq9C,MAClBr9C,KAAKq9C,MAAMx3C,eAAe+lD,KAC5B5rD,KAAK2tD,QAAgB,OAAEooC,GAAiB,MAAEnqC,GAAU5rD,KAAKq9C,MAAMuO,GAKnE,KAAK,GAAIrmD,GAAI,EAAGA,EAAIvF,KAAKkjD,YAAYx9C,OAAQH,IAC3CvF,KAAK2tD,QAAgB,OAAEooC,GAAuB,YAAE7tF,KAAKlI,KAAKkjD,YAAY39C,KAW1E3F,EAAQm3F,6BAA+B,WACrC/2F,KAAK6wF,aAAa,GAAE,IAUtBjxF,EAAQ6xF,WAAa,SAAS1sC,GAE5B,GAAIiyC,GAASh3F,KAAKwxF,gBAWXxxF,MAAKw8C,MAAMuI,EAAK1kD,GAEvB,IAAI42F,GAAmBt2F,EAAKoE,YAG5B/E,MAAK42F,cAAcI,GAGnBh3F,KAAKy2F,iBAAiBQ,GAGtBj3F,KAAKs2F,iBAAiBW,GAGtBj3F,KAAK81F,gBAAgB91F,KAAKwxF,WAG1BxxF,KAAKw8C,MAAMuI,EAAK1kD,IAAM0kD,GAUxBnlD,EAAQsyF,gBAAkB,WAExB,GAAI8E,GAASh3F,KAAKwxF,SAGlB,IAAc,WAAVwF,IAC8B,GAA3Bh3F,KAAKkjD,YAAYx9C,QACpB1F,KAAK2tD,QAAgB,OAAEqpC,GAAqB,YAAEnkF,MAAM7S,KAAKmd,MAAQnd,KAAK+gD,UAAUtC,WAAWO,oBAAsBh/C,KAAKwf,MAAMC,OAAOC,aACnI1f,KAAK2tD,QAAgB,OAAEqpC,GAAqB,YAAElkF,OAAO9S,KAAKmd,MAAQnd,KAAK+gD,UAAUtC,WAAWO,oBAAsBh/C,KAAKwf,MAAMC,OAAOsF,cAAe,CACnJ,GAAImyE,GAAiBl3F,KAAKq2F,iBAG1Br2F,MAAK+2F,+BAIL/2F,KAAK82F,qBAAqBI,GAI1Bl3F,KAAK02F,oBAAoBM,GAGzBh3F,KAAK62F,gBAAgBK,GAGrBl3F,KAAK81F,gBAAgBoB,GAGrBl3F,KAAKw2F,oBAGLx2F,KAAKgmD,uBAGLhmD,KAAK8sD,4BAeXltD,EAAQ8vD,sBAAwB,SAASynC,EAAYC,GACnD,GAAIC,KACJ,IAAiB9wF,SAAb6wF,EACF,IAAK,GAAIJ,KAAUh3F,MAAK2tD,QAAgB,OAClC3tD,KAAK2tD,QAAgB,OAAE9nD,eAAemxF,KAExCh3F,KAAKi2F,sBAAsBe,GAC3BK,EAAanvF,KAAMlI,KAAKm3F,WAK5B,KAAK,GAAIH,KAAUh3F,MAAK2tD,QAAgB,OACtC,GAAI3tD,KAAK2tD,QAAgB,OAAE9nD,eAAemxF,GAAS,CAEjDh3F,KAAKi2F,sBAAsBe,EAC3B,IAAIx9E,GAAOxT,MAAMyN,UAAUnL,OAAO/H,KAAKkF,UAAW,EAEhD4xF,GAAanvF,KADXsR,EAAK9T,OAAS,EACG1F,KAAKm3F,GAAa39E,EAAK,GAAGA,EAAK,IAG/BxZ,KAAKm3F,GAAaC,IAO7C,MADAp3F,MAAKo2F,oBACEiB,GAaTz3F,EAAQgwD,mBAAqB,SAASunC,EAAYC,GAChD,GAAIC,IAAe,CACnB,IAAiB9wF,SAAb6wF,EACFp3F,KAAKm2F,yBACLkB,EAAer3F,KAAKm3F,SAEjB,CACHn3F,KAAKm2F,wBACL,IAAI38E,GAAOxT,MAAMyN,UAAUnL,OAAO/H,KAAKkF,UAAW,EAEhD4xF,GADE79E,EAAK9T,OAAS,EACD1F,KAAKm3F,GAAa39E,EAAK,GAAGA,EAAK,IAG/BxZ,KAAKm3F,GAAaC,GAKrC,MADAp3F,MAAKo2F,oBACEiB,GAaTz3F,EAAQ03F,sBAAwB,SAASH,EAAYC,GACnD,GAAiB7wF,SAAb6wF,EACF,IAAK,GAAIJ,KAAUh3F,MAAK2tD,QAAgB,OAClC3tD,KAAK2tD,QAAgB,OAAE9nD,eAAemxF,KAExCh3F,KAAKk2F,sBAAsBc,GAC3Bh3F,KAAKm3F,UAKT,KAAK,GAAIH,KAAUh3F,MAAK2tD,QAAgB,OACtC,GAAI3tD,KAAK2tD,QAAgB,OAAE9nD,eAAemxF,GAAS,CAEjDh3F,KAAKk2F,sBAAsBc,EAC3B,IAAIx9E,GAAOxT,MAAMyN,UAAUnL,OAAO/H,KAAKkF,UAAW,EAC9C+T,GAAK9T,OAAS,EAChB1F,KAAKm3F,GAAa39E,EAAK,GAAGA,EAAK,IAG/BxZ,KAAKm3F,GAAaC,GAK1Bp3F,KAAKo2F,qBAaPx2F,EAAQquD,gBAAkB,SAASkpC,EAAYC,GAC7C,GAAI59E,GAAOxT,MAAMyN,UAAUnL,OAAO/H,KAAKkF,UAAW,EACjCc,UAAb6wF,GACFp3F,KAAK0vD,sBAAsBynC,GAC3Bn3F,KAAKs3F,sBAAsBH,IAGvB39E,EAAK9T,OAAS,GAChB1F,KAAK0vD,sBAAsBynC,EAAY39E,EAAK,GAAGA,EAAK,IACpDxZ,KAAKs3F,sBAAsBH,EAAY39E,EAAK,GAAGA,EAAK,MAGpDxZ,KAAK0vD,sBAAsBynC,EAAYC,GACvCp3F,KAAKs3F,sBAAsBH,EAAYC,KAY7Cx3F,EAAQqmD,oBAAsB,WAC5B,GAAI+wC,GAASh3F,KAAKwxF,SAClBxxF,MAAK2tD,QAAgB,OAAEqpC,GAAqB,eAC5Ch3F,KAAKkjD,YAAcljD,KAAK2tD,QAAgB,OAAEqpC,GAAqB,aAWjEp3F,EAAQ23F,iBAAmB,SAAStwE,EAAI+uE,GACtC,GAAsDjxC,GAAlDC,EAAO,IAAKC,EAAO,KAAMC,EAAO,IAAKC,EAAO,IAChD,KAAK,GAAI6xC,KAAUh3F,MAAK2tD,QAAQqoC,GAC9B,GAAIh2F,KAAK2tD,QAAQqoC,GAAYnwF,eAAemxF,IACczwF,SAApDvG,KAAK2tD,QAAQqoC,GAAYgB,GAAqB,YAAiB,CAEjEh3F,KAAK81F,gBAAgBkB,EAAOhB,GAE5BhxC,EAAO,IAAKC,EAAO,KAAMC,EAAO,IAAKC,EAAO,IAC5C,KAAK,GAAIC,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GAClBL,EAAKwP,OAAOttC,GACRi+B,EAAOH,EAAK1yC,EAAI,GAAM0yC,EAAKlyC,QAAQqyC,EAAOH,EAAK1yC,EAAI,GAAM0yC,EAAKlyC,OAC9DsyC,EAAOJ,EAAK1yC,EAAI,GAAM0yC,EAAKlyC,QAAQsyC,EAAOJ,EAAK1yC,EAAI,GAAM0yC,EAAKlyC,OAC9DmyC,EAAOD,EAAKzyC,EAAI,GAAMyyC,EAAKjyC,SAASkyC,EAAOD,EAAKzyC,EAAI,GAAMyyC,EAAKjyC,QAC/DmyC,EAAOF,EAAKzyC,EAAI,GAAMyyC,EAAKjyC,SAASmyC,EAAOF,EAAKzyC,EAAI,GAAMyyC,EAAKjyC,QAGvEiyC,GAAO/kD,KAAK2tD,QAAQqoC,GAAYgB,GAAqB,YACrDjyC,EAAK1yC,EAAI,IAAO8yC,EAAOD,GACvBH,EAAKzyC,EAAI,IAAO2yC,EAAOD,GACvBD,EAAKlyC,MAAQ,GAAKkyC,EAAK1yC,EAAI6yC,GAC3BH,EAAKjyC,OAAS,GAAKiyC,EAAKzyC,EAAI0yC,GAC5BD,EAAKh2C,QAAQ6c,OAAS3mB,KAAK8qB,KAAK9qB,KAAKovB,IAAI,GAAI0wB,EAAKlyC,MAAM,GAAK5N,KAAKovB,IAAI,GAAI0wB,EAAKjyC,OAAO,IACtFiyC,EAAKxhB,SAASvjC,KAAKmd,OACnB4nC,EAAKuV,YAAYrzC,KAMzBrnB,EAAQ43F,oBAAsB,SAASvwE,GACrCjnB,KAAKu3F,iBAAiBtwE,EAAI,UAC1BjnB,KAAKu3F,iBAAiBtwE,EAAI,UAC1BjnB,KAAKo2F,sBAMH,SAASv2F,EAAQD,EAASM,GAE9B,GAAIqD,GAAOrD,EAAoB,GAS/BN,GAAQ63F,yBAA2B,SAASzzF,EAAQ0zF,GAClD,GAAIl7C,GAAQx8C,KAAKw8C,KACjB,KAAK,GAAI4I,KAAU5I,GACbA,EAAM32C,eAAeu/C,IACnB5I,EAAM4I,GAAQ8G,kBAAkBloD,IAClC0zF,EAAiBxvF,KAAKk9C,IAY9BxlD,EAAQ+3F,4BAA8B,SAAU3zF,GAC9C,GAAI0zF,KAEJ,OADA13F,MAAK0vD,sBAAsB,2BAA2B1rD,EAAO0zF,GACtDA,GAWT93F,EAAQg4F,yBAA2B,SAASp3D,GAC1C,GAAInuB,GAAIrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GACtCC,EAAItS,KAAKsqD,qBAAqB9pB,EAAQluB,EAE1C,QACE9K,KAAQ6K,EACRzK,IAAQ0K,EACRiV,MAAQlV,EACRmR,OAAQlR,IAYZ1S,EAAQ6pD,WAAa,SAAUjpB,GAE7B,GAAIq3D,GAAiB73F,KAAK43F,yBAAyBp3D,GAC/Ck3D,EAAmB13F,KAAK23F,4BAA4BE,EAIxD,OAAIH,GAAiBhyF,OAAS,EACpB1F,KAAKw8C,MAAMk7C,EAAiBA,EAAiBhyF,OAAS,IAGvD,MAWX9F,EAAQk4F,yBAA2B,SAAU9zF,EAAQ+zF,GACnD,GAAI16C,GAAQr9C,KAAKq9C,KACjB,KAAK,GAAIuO,KAAUvO,GACbA,EAAMx3C,eAAe+lD,IACnBvO,EAAMuO,GAAQM,kBAAkBloD,IAClC+zF,EAAiB7vF,KAAK0jD,IAa9BhsD,EAAQo4F,4BAA8B,SAAUh0F,GAC9C,GAAI+zF,KAEJ,OADA/3F,MAAK0vD,sBAAsB,2BAA2B1rD,EAAO+zF,GACtDA,GAWTn4F,EAAQisD,WAAa,SAASrrB,GAC5B,GAAIq3D,GAAiB73F,KAAK43F,yBAAyBp3D,GAC/Cu3D,EAAmB/3F,KAAKg4F,4BAA4BH,EAExD,OAAIE,GAAiBryF,OAAS,EACrB1F,KAAKq9C,MAAM06C,EAAiBA,EAAiBryF,OAAS,IAGtD,MAWX9F,EAAQq4F,gBAAkB,SAAS/0E,GAC7BA,YAAe3f,GACjBvD,KAAK+pD,aAAavN,MAAMt5B,EAAI7iB,IAAM6iB,EAGlCljB,KAAK+pD,aAAa1M,MAAMn6B,EAAI7iB,IAAM6iB,GAUtCtjB,EAAQs4F,YAAc,SAASh1E,GACzBA,YAAe3f,GACjBvD,KAAKihD,SAASzE,MAAMt5B,EAAI7iB,IAAM6iB,EAG9BljB,KAAKihD,SAAS5D,MAAMn6B,EAAI7iB,IAAM6iB,GAWlCtjB,EAAQu4F,qBAAuB,SAASj1E,GAClCA,YAAe3f,SACVvD,MAAK+pD,aAAavN,MAAMt5B,EAAI7iB,UAG5BL,MAAK+pD,aAAa1M,MAAMn6B,EAAI7iB,KAUvCT,EAAQqzF,aAAe,SAASmF,GACT7xF,SAAjB6xF,IACFA,GAAe,EAEjB,KAAI,GAAIhzC,KAAUplD,MAAK+pD,aAAavN,MAC/Bx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,IACxCplD,KAAK+pD,aAAavN,MAAM4I,GAAQnU,UAGpC,KAAI,GAAI2a,KAAU5rD,MAAK+pD,aAAa1M,MAC/Br9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,IACxC5rD,KAAK+pD,aAAa1M,MAAMuO,GAAQ3a,UAIpCjxC,MAAK+pD,cAAgBvN,SAASa,UAEV,GAAhB+6C,GACFp4F,KAAKiuB,KAAK,SAAUjuB,KAAKm3B,iBAU7Bv3B,EAAQy4F,kBAAoB,SAASD,GACd7xF,SAAjB6xF,IACFA,GAAe,EAGjB,KAAK,GAAIhzC,KAAUplD,MAAK+pD,aAAavN,MAC/Bx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,IACrCplD,KAAK+pD,aAAavN,MAAM4I,GAAQqU,YAAc,IAChDz5D,KAAK+pD,aAAavN,MAAM4I,GAAQnU,WAChCjxC,KAAKm4F,qBAAqBn4F,KAAK+pD,aAAavN,MAAM4I,IAKpC,IAAhBgzC,GACFp4F,KAAKiuB,KAAK,SAAUjuB,KAAKm3B,iBAW7Bv3B,EAAQ04F,sBAAwB,WAC9B,GAAI/gF,GAAQ,CACZ,KAAK,GAAI6tC,KAAUplD,MAAK+pD,aAAavN,MAC/Bx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,KACzC7tC,GAAS,EAGb,OAAOA,IAST3X,EAAQ24F,iBAAmB,WACzB,IAAK,GAAInzC,KAAUplD,MAAK+pD,aAAavN,MACnC,GAAIx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,GACzC,MAAOplD,MAAK+pD,aAAavN,MAAM4I,EAGnC,OAAO,OASTxlD,EAAQ44F,iBAAmB,WACzB,IAAK,GAAI5sC,KAAU5rD,MAAK+pD,aAAa1M,MACnC,GAAIr9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,GACzC,MAAO5rD,MAAK+pD,aAAa1M,MAAMuO,EAGnC,OAAO,OAUThsD,EAAQ64F,sBAAwB,WAC9B,GAAIlhF,GAAQ,CACZ,KAAK,GAAIq0C,KAAU5rD,MAAK+pD,aAAa1M,MAC/Br9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,KACzCr0C,GAAS,EAGb,OAAOA,IAUT3X,EAAQ84F,wBAA0B,WAChC,GAAInhF,GAAQ,CACZ,KAAI,GAAI6tC,KAAUplD,MAAK+pD,aAAavN,MAC/Bx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,KACxC7tC,GAAS,EAGb,KAAI,GAAIq0C,KAAU5rD,MAAK+pD,aAAa1M,MAC/Br9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,KACxCr0C,GAAS,EAGb,OAAOA,IAST3X,EAAQ+4F,kBAAoB,WAC1B,IAAI,GAAIvzC,KAAUplD,MAAK+pD,aAAavN,MAClC,GAAGx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,GACxC,OAAO,CAGX,KAAI,GAAIwG,KAAU5rD,MAAK+pD,aAAa1M,MAClC,GAAGr9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,GACxC,OAAO,CAGX,QAAO,GAUThsD,EAAQg5F,oBAAsB,WAC5B,IAAI,GAAIxzC,KAAUplD,MAAK+pD,aAAavN,MAClC,GAAGx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,IACpCplD,KAAK+pD,aAAavN,MAAM4I,GAAQqU,YAAc,EAChD,OAAO,CAIb,QAAO,GAST75D,EAAQi5F,sBAAwB,SAAS9zC,GACvC,IAAK,GAAIx/C,GAAI,EAAGA,EAAIw/C,EAAK6I,aAAaloD,OAAQH,IAAK,CACjD,GAAI4mD,GAAOpH,EAAK6I,aAAaroD,EAC7B4mD,GAAKjb,SACLlxC,KAAKi4F,gBAAgB9rC,KAUzBvsD,EAAQk5F,qBAAuB,SAAS/zC,GACtC,IAAK,GAAIx/C,GAAI,EAAGA,EAAIw/C,EAAK6I,aAAaloD,OAAQH,IAAK,CACjD,GAAI4mD,GAAOpH,EAAK6I,aAAaroD,EAC7B4mD,GAAKlgD,OAAQ,EACbjM,KAAKk4F,YAAY/rC,KAWrBvsD,EAAQm5F,wBAA0B,SAASh0C,GACzC,IAAK,GAAIx/C,GAAI,EAAGA,EAAIw/C,EAAK6I,aAAaloD,OAAQH,IAAK,CACjD,GAAI4mD,GAAOpH,EAAK6I,aAAaroD,EAC7B4mD,GAAKlb,WACLjxC,KAAKm4F,qBAAqBhsC,KAgB9BvsD,EAAQgqD,cAAgB,SAAS5lD,EAAQg1F,EAAQZ,EAAca,EAAgBC,GACxD3yF,SAAjB6xF,IACFA,GAAe,GAEM7xF,SAAnB0yF,IACFA,GAAiB,GAGa,GAA5Bj5F,KAAK24F,qBAA0C,GAAVK,GAAgD,GAA7Bh5F,KAAKkqE,sBAC/DlqE,KAAKizF,cAAa,GAIG,GAAnBjvF,EAAOivC,UAAmD,GAA7BjzC,KAAK+gD,UAAU9R,aAAsBiqD,EAQ1C,GAAnBl1F,EAAOivC,UACdjzC,KAAKi4F,gBAAgBj0F,GACrBo0F,GAAe,IAGfp0F,EAAOitC,WACPjxC,KAAKm4F,qBAAqBn0F,KAb1BA,EAAOktC,SACPlxC,KAAKi4F,gBAAgBj0F,GACjBA,YAAkBT,IAA6C,GAArCvD,KAAKiqE,8BAA2D,GAAlBgvB,GAC1Ej5F,KAAK64F,sBAAsB70F,IAaX,GAAhBo0F,GACFp4F,KAAKiuB,KAAK,SAAUjuB,KAAKm3B,iBAY7Bv3B,EAAQmsD,YAAc,SAAS/nD,GACT,GAAhBA,EAAOiI,QACTjI,EAAOiI,OAAQ,EACfjM,KAAKiuB,KAAK,YAAY82B,KAAK/gD,EAAO3D,OAWtCT,EAAQksD,aAAe,SAAS9nD,GACV,GAAhBA,EAAOiI,QACTjI,EAAOiI,OAAQ,EACfjM,KAAKk4F,YAAYl0F,GACbA,YAAkBT,IACpBvD,KAAKiuB,KAAK,aAAa82B,KAAK/gD,EAAO3D,MAGnC2D,YAAkBT,IACpBvD,KAAK84F,qBAAqB90F,IAa9BpE,EAAQ2pD,aAAe,aAUvB3pD,EAAQ6qD,WAAa,SAASjqB,GAC5B,GAAIukB,GAAO/kD,KAAKypD,WAAWjpB,EAC3B,IAAY,MAARukB,EACF/kD,KAAK4pD,cAAc7E,GAAM,OAEtB,CACH,GAAIoH,GAAOnsD,KAAK6rD,WAAWrrB,EACf,OAAR2rB,EACFnsD,KAAK4pD,cAAcuC,GAAM,GAGzBnsD,KAAKizF,eAGT,GAAI7lC,GAAaptD,KAAKm3B,cACtBi2B,GAAoB,SAClB+rC,KAAM9mF,EAAGmuB,EAAQnuB,EAAGC,EAAGkuB,EAAQluB,GAC/BmN,QAASpN,EAAGrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GAAIC,EAAGtS,KAAKsqD,qBAAqB9pB,EAAQluB,KAEzFtS,KAAKiuB,KAAK,QAASm/B,GACnBptD,KAAKiiD,WAUPriD,EAAQ8qD,iBAAmB,SAASlqB,GAClC,GAAIukB,GAAO/kD,KAAKypD,WAAWjpB,EACf,OAARukB,GAAyBx+C,SAATw+C,IAElB/kD,KAAKsjD,YAAejxC,EAAMrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GACxCC,EAAMtS,KAAKsqD,qBAAqB9pB,EAAQluB,IAC5DtS,KAAKqxF,YAAYtsC,GAEnB,IAAIqI,GAAaptD,KAAKm3B,cACtBi2B,GAAoB,SAClB+rC,KAAM9mF,EAAGmuB,EAAQnuB,EAAGC,EAAGkuB,EAAQluB,GAC/BmN,QAASpN,EAAGrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GAAIC,EAAGtS,KAAKsqD,qBAAqB9pB,EAAQluB,KAEzFtS,KAAKiuB,KAAK,cAAem/B,IAU3BxtD,EAAQ+qD,cAAgB,SAASnqB,GAC/B,GAAIukB,GAAO/kD,KAAKypD,WAAWjpB,EAC3B,IAAY,MAARukB,EACF/kD,KAAK4pD,cAAc7E,GAAK,OAErB,CACH,GAAIoH,GAAOnsD,KAAK6rD,WAAWrrB,EACf,OAAR2rB,GACFnsD,KAAK4pD,cAAcuC,GAAK,GAG5BnsD,KAAKiiD,WAUPriD,EAAQgrD,iBAAmB,SAASpqB,GAClCxgC,KAAKo5F,6BAA6B54D,GAClCxgC,KAAKq5F,2BAA2B74D,IAGlC5gC,EAAQw5F,6BAA+B,aACvCx5F,EAAQy5F,2BAA6B,aAOrCz5F,EAAQu3B,aAAe,WACrB,GAAI0yB,GAAU7pD,KAAKs5F,mBACfC,EAAUv5F,KAAKw5F,kBACnB,QAAQh9C,MAAMqN,EAASxM,MAAMk8C,IAS/B35F,EAAQ05F,iBAAmB,WACzB,GAAIG,KACJ,IAAiC,GAA7Bz5F,KAAK+gD,UAAU9R,WACjB,IAAK,GAAImW,KAAUplD,MAAK+pD,aAAavN,MAC/Bx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,IACzCq0C,EAAQvxF,KAAKk9C,EAInB,OAAOq0C,IAST75F,EAAQ45F,iBAAmB,WACzB,GAAIC,KACJ,IAAiC,GAA7Bz5F,KAAK+gD,UAAU9R,WACjB,IAAK,GAAI2c,KAAU5rD,MAAK+pD,aAAa1M,MAC/Br9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,IACzC6tC,EAAQvxF,KAAK0jD,EAInB,OAAO6tC,IAST75F,EAAQq3B,aAAe,WACrBgC,QAAQ/E,IAAI,gEAUdt0B,EAAQ85F,YAAc,SAASvpD,EAAW8oD,GACxC,GAAI1zF,GAAG+7B,EAAMjhC,CAEb,KAAK8vC,GAAkC5pC,QAApB4pC,EAAUzqC,OAC3B,KAAM,qCAKR,KAFA1F,KAAKizF,cAAa,GAEb1tF,EAAI,EAAG+7B,EAAO6O,EAAUzqC,OAAY47B,EAAJ/7B,EAAUA,IAAK,CAClDlF,EAAK8vC,EAAU5qC,EAEf,IAAIw/C,GAAO/kD,KAAKw8C,MAAMn8C,EACtB,KAAK0kD,EACH,KAAM,IAAI40C,YAAW,iBAAmBt5F,EAAK,cAE/CL,MAAK4pD,cAAc7E,GAAK,GAAK,EAAKk0C,GAAe,GAEnDj5F,KAAK2hB,UASP/hB,EAAQg6F,YAAc,SAASzpD,GAC7B,GAAI5qC,GAAG+7B,EAAMjhC,CAEb,KAAK8vC,GAAkC5pC,QAApB4pC,EAAUzqC,OAC3B,KAAM,qCAKR,KAFA1F,KAAKizF,cAAa,GAEb1tF,EAAI,EAAG+7B,EAAO6O,EAAUzqC,OAAY47B,EAAJ/7B,EAAUA,IAAK,CAClDlF,EAAK8vC,EAAU5qC,EAEf,IAAI4mD,GAAOnsD,KAAKq9C,MAAMh9C,EACtB,KAAK8rD,EACH,KAAM,IAAIwtC,YAAW,iBAAmBt5F,EAAK,cAE/CL,MAAK4pD,cAAcuC,GAAK,GAAK,GAAK,GAAM,GAE1CnsD,KAAK2hB,UAOP/hB,EAAQgtD,iBAAmB,WACzB,IAAI,GAAIxH,KAAUplD,MAAK+pD,aAAavN,MAC/Bx8C,KAAK+pD,aAAavN,MAAM32C,eAAeu/C,KACnCplD,KAAKw8C,MAAM32C,eAAeu/C,UACtBplD,MAAK+pD,aAAavN,MAAM4I,GAIrC,KAAI,GAAIwG,KAAU5rD,MAAK+pD,aAAa1M,MAC/Br9C,KAAK+pD,aAAa1M,MAAMx3C,eAAe+lD,KACnC5rD,KAAKq9C,MAAMx3C,eAAe+lD,UACtB5rD,MAAK+pD,aAAa1M,MAAMuO,MASnC,SAAS/rD,EAAQD,EAASM,GAE9B,GAAIS,GAAOT,EAAoB,GAC3BqD,EAAOrD,EAAoB,IAC3BkD,EAAOlD,EAAoB,GAO/BN,GAAQi6F,qBAAuB,WAC7B,KAAO75F,KAAKmqE,gBAAgBvmD,iBAC1B5jB,KAAKmqE,gBAAgB14D,YAAYzR,KAAKmqE,gBAAgBtmD,WAExD7jB,MAAK85F,mBAEL95F,KAAKo5F,6BAA+B,mBAC7Bp5F,MAAK2tD,QAAiB,QAAS,MAAc,iBAC7C3tD,MAAK2tD,QAAiB,QAAS,MAAiB,cACvD3tD,KAAKkhD,oBAAqB,GAU5BthD,EAAQm6F,4BAA8B,WACpC,IAAK,GAAIC,KAAgBh6F,MAAK4iD,gBACxB5iD,KAAK4iD,gBAAgB/8C,eAAem0F,KACtCh6F,KAAKg6F,GAAgBh6F,KAAK4iD,gBAAgBo3C,KAUhDp6F,EAAQq6F,gBAAkB,WACxBj6F,KAAKinD,UAAYjnD,KAAKinD,QACtB,IAAIizC,GAAUl6F,KAAKmqE,gBACfE,EAAWrqE,KAAKqqE,SAChBD,EAAcpqE,KAAKoqE,WACF,IAAjBpqE,KAAKinD,UACPizC,EAAQ1sF,MAAMm6B,QAAQ,QACtB0iC,EAAS78D,MAAMm6B,QAAQ,QACvByiC,EAAY58D,MAAMm6B,QAAQ,OAC1B0iC,EAAS93C,QAAUvyB,KAAKi6F,gBAAgB5kE,KAAKr1B,QAG7Ck6F,EAAQ1sF,MAAMm6B,QAAQ,OACtB0iC,EAAS78D,MAAMm6B,QAAQ,OACvByiC,EAAY58D,MAAMm6B,QAAQ,QAC1B0iC,EAAS93C,QAAU,MAErBvyB,KAAKkpD,yBAQPtpD,EAAQspD,sBAAwB,WAE1BlpD,KAAKm6F,eACPn6F,KAAKgU,IAAI,SAAUhU,KAAKm6F,cAG1B,IAAIv1D,GAAS5kC,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,OAoBnD,IAlB6Br+B,SAAzBvG,KAAKo6F,kBACPp6F,KAAKo6F,gBAAgBhjC,uBACrBp3D,KAAKo6F,gBAAkB7zF,OACvBvG,KAAKq6F,oBAAsB,KAC3Br6F,KAAKkhD,oBAAqB,GAI5BlhD,KAAK+5F,8BAGL/5F,KAAK2iD,kBAAmB,EAGxB3iD,KAAKiqE,8BAA+B,EACpCjqE,KAAKkqE,sBAAuB,EAC5BlqE,KAAK85F,mBAEgB,GAAjB95F,KAAKinD,SAAkB,CACzB,KAAOjnD,KAAKmqE,gBAAgBvmD,iBAC1B5jB,KAAKmqE,gBAAgB14D,YAAYzR,KAAKmqE,gBAAgBtmD,WAGxD7jB,MAAK85F,gBAA6B,YAAIjoF,SAASM,cAAc,QAC7DnS,KAAK85F,gBAA6B,YAAE/xF,UAAY,6BAChD/H,KAAK85F,gBAAkC,iBAAIjoF,SAASM,cAAc,QAClEnS,KAAK85F,gBAAkC,iBAAE/xF,UAAY,4BACrD/H,KAAK85F,gBAAkC,iBAAE31E,UAAYygB,EAAgB,QACrE5kC,KAAK85F,gBAA6B,YAAE/nF,YAAY/R,KAAK85F,gBAAkC,kBAEvF95F,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAA6B,YAAIjoF,SAASM,cAAc,QAC7DnS,KAAK85F,gBAA6B,YAAE/xF,UAAY,iCAChD/H,KAAK85F,gBAAkC,iBAAIjoF,SAASM,cAAc,QAClEnS,KAAK85F,gBAAkC,iBAAE/xF,UAAY,4BACrD/H,KAAK85F,gBAAkC,iBAAE31E,UAAYygB,EAAgB,QACrE5kC,KAAK85F,gBAA6B,YAAE/nF,YAAY/R,KAAK85F,gBAAkC,kBAEvF95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA6B,aACnE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA6B,aAE/B,GAAhC95F,KAAKs4F,yBAAgCt4F,KAAKm8C,iBAAiBC,MAC7Dp8C,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAA8B,aAAIjoF,SAASM,cAAc,QAC9DnS,KAAK85F,gBAA8B,aAAE/xF,UAAY,8BACjD/H,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,QACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,4BACtD/H,KAAK85F,gBAAmC,kBAAE31E,UAAYygB,EAAiB,SACvE5kC,KAAK85F,gBAA8B,aAAE/nF,YAAY/R,KAAK85F,gBAAmC,mBAEzF95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA8B,eAE7B,GAAhC95F,KAAKy4F,yBAAgE,GAAhCz4F,KAAKs4F,0BACjDt4F,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAA8B,aAAIjoF,SAASM,cAAc,QAC9DnS,KAAK85F,gBAA8B,aAAE/xF,UAAY,8BACjD/H,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,QACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,4BACtD/H,KAAK85F,gBAAmC,kBAAE31E,UAAYygB,EAAiB,SACvE5kC,KAAK85F,gBAA8B,aAAE/nF,YAAY/R,KAAK85F,gBAAmC,mBAEzF95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA8B,eAEtC,GAA5B95F,KAAK24F,sBACP34F,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAA4B,WAAIjoF,SAASM,cAAc,QAC5DnS,KAAK85F,gBAA4B,WAAE/xF,UAAY,gCAC/C/H,KAAK85F,gBAAiC,gBAAIjoF,SAASM,cAAc,QACjEnS,KAAK85F,gBAAiC,gBAAE/xF,UAAY,4BACpD/H,KAAK85F,gBAAiC,gBAAE31E,UAAYygB,EAAY,IAChE5kC,KAAK85F,gBAA4B,WAAE/nF,YAAY/R,KAAK85F,gBAAiC,iBAErF95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA4B,aAKpE95F,KAAK85F,gBAA6B,YAAEvnE,QAAUvyB,KAAKs6F,sBAAsBjlE,KAAKr1B,MAC9EA,KAAK85F,gBAA6B,YAAEvnE,QAAUvyB,KAAKu6F,sBAAsBllE,KAAKr1B,MAC1C,GAAhCA,KAAKs4F,yBAAgCt4F,KAAKm8C,iBAAiBC,KAC7Dp8C,KAAK85F,gBAA8B,aAAEvnE,QAAUvyB,KAAKw6F,UAAUnlE,KAAKr1B,MAE5B,GAAhCA,KAAKy4F,yBAAgE,GAAhCz4F,KAAKs4F,0BACjDt4F,KAAK85F,gBAA8B,aAAEvnE,QAAUvyB,KAAKy6F,uBAAuBplE,KAAKr1B,OAElD,GAA5BA,KAAK24F,sBACP34F,KAAK85F,gBAA4B,WAAEvnE,QAAUvyB,KAAKmpD,gBAAgB9zB,KAAKr1B,OAEzEA,KAAKqqE,SAAS93C,QAAUvyB,KAAKi6F,gBAAgB5kE,KAAKr1B,MAElDA,KAAKm6F,cAAgBn6F,KAAKkpD,sBAAsB7zB,KAAKr1B,MACrDA,KAAK6T,GAAG,SAAU7T,KAAKm6F,mBAEpB,CACH,KAAOn6F,KAAKoqE,YAAYxmD,iBACtB5jB,KAAKoqE,YAAY34D,YAAYzR,KAAKoqE,YAAYvmD,WAGhD7jB,MAAK85F,gBAA8B,aAAIjoF,SAASM,cAAc,QAC9DnS,KAAK85F,gBAA8B,aAAE/xF,UAAY,uCACjD/H,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,QACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,4BACtD/H,KAAK85F,gBAAmC,kBAAE31E,UAAYygB,EAAa,KACnE5kC,KAAK85F,gBAA8B,aAAE/nF,YAAY/R,KAAK85F,gBAAmC,mBAEzF95F,KAAKoqE,YAAYr4D,YAAY/R,KAAK85F,gBAA8B,cAEhE95F,KAAK85F,gBAA8B,aAAEvnE,QAAUvyB,KAAKi6F,gBAAgB5kE,KAAKr1B,QAW7EJ,EAAQ06F,sBAAwB,WAE9Bt6F,KAAK65F,uBACD75F,KAAKm6F,eACPn6F,KAAKgU,IAAI,SAAUhU,KAAKm6F,cAG1B,IAAIv1D,GAAS5kC,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,OAEnD5kC,MAAK85F,mBACL95F,KAAK85F,gBAA0B,SAAIjoF,SAASM,cAAc,QAC1DnS,KAAK85F,gBAA0B,SAAE/xF,UAAY,8BAC7C/H,KAAK85F,gBAA+B,cAAIjoF,SAASM,cAAc,QAC/DnS,KAAK85F,gBAA+B,cAAE/xF,UAAY,4BAClD/H,KAAK85F,gBAA+B,cAAE31E,UAAYygB,EAAa,KAC/D5kC,KAAK85F,gBAA0B,SAAE/nF,YAAY/R,KAAK85F,gBAA+B,eAEjF95F,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAAiC,gBAAIjoF,SAASM,cAAc,QACjEnS,KAAK85F,gBAAiC,gBAAE/xF,UAAY,8BACpD/H,KAAK85F,gBAAsC,qBAAIjoF,SAASM,cAAc,QACtEnS,KAAK85F,gBAAsC,qBAAE/xF,UAAY,4BACzD/H,KAAK85F,gBAAsC,qBAAE31E,UAAYygB,EAAuB,eAChF5kC,KAAK85F,gBAAiC,gBAAE/nF,YAAY/R,KAAK85F,gBAAsC,sBAE/F95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA0B,UAChE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAiC,iBAGvE95F,KAAK85F,gBAA0B,SAAEvnE,QAAUvyB,KAAKkpD,sBAAsB7zB,KAAKr1B,MAG3EA,KAAKm6F,cAAgBn6F,KAAK06F,SAASrlE,KAAKr1B,MACxCA,KAAK6T,GAAG,SAAU7T,KAAKm6F,gBASzBv6F,EAAQ26F,sBAAwB,WAE9Bv6F,KAAK65F,uBACL75F,KAAKizF,cAAa,GAClBjzF,KAAK2iD,kBAAmB,CAExB,IAAI/d,GAAS5kC,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,OAE/C5kC,MAAKm6F,eACPn6F,KAAKgU,IAAI,SAAUhU,KAAKm6F,eAG1Bn6F,KAAKizF,eACLjzF,KAAKkqE,sBAAuB,EAC5BlqE,KAAKiqE,8BAA+B,EAEpCjqE,KAAK85F,mBACL95F,KAAK85F,gBAA0B,SAAIjoF,SAASM,cAAc,QAC1DnS,KAAK85F,gBAA0B,SAAE/xF,UAAY,8BAC7C/H,KAAK85F,gBAA+B,cAAIjoF,SAASM,cAAc,QAC/DnS,KAAK85F,gBAA+B,cAAE/xF,UAAY,4BAClD/H,KAAK85F,gBAA+B,cAAE31E,UAAYygB,EAAa,KAC/D5kC,KAAK85F,gBAA0B,SAAE/nF,YAAY/R,KAAK85F,gBAA+B,eAEjF95F,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAAiC,gBAAIjoF,SAASM,cAAc,QACjEnS,KAAK85F,gBAAiC,gBAAE/xF,UAAY,8BACpD/H,KAAK85F,gBAAsC,qBAAIjoF,SAASM,cAAc,QACtEnS,KAAK85F,gBAAsC,qBAAE/xF,UAAY,4BACzD/H,KAAK85F,gBAAsC,qBAAE31E,UAAYygB,EAAwB,gBACjF5kC,KAAK85F,gBAAiC,gBAAE/nF,YAAY/R,KAAK85F,gBAAsC,sBAE/F95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA0B,UAChE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAiC,iBAGvE95F,KAAK85F,gBAA0B,SAAEvnE,QAAUvyB,KAAKkpD,sBAAsB7zB,KAAKr1B,MAG3EA,KAAKm6F,cAAgBn6F,KAAK26F,eAAetlE,KAAKr1B,MAC9CA,KAAK6T,GAAG,SAAU7T,KAAKm6F,eAGvBn6F,KAAK4iD,gBAA8B,aAAI5iD,KAAKupD,aAC5CvpD,KAAK4iD,gBAA8C,6BAAI5iD,KAAKo5F,6BAC5Dp5F,KAAK4iD,gBAAkC,iBAAI5iD,KAAKwpD,iBAChDxpD,KAAK4iD,gBAAgC,eAAI5iD,KAAKwqD,eAC9CxqD,KAAKupD,aAAevpD,KAAK26F,eACzB36F,KAAKo5F,6BAA+B,aACpCp5F,KAAKwpD,iBAAmB,aACxBxpD,KAAKwqD,eAAiBxqD,KAAK46F,eAG3B56F,KAAKiiD,WAQPriD,EAAQ66F,uBAAyB,WAE/Bz6F,KAAK65F,uBACL75F,KAAKkhD,oBAAqB,EAEtBlhD,KAAKm6F,eACPn6F,KAAKgU,IAAI,SAAUhU,KAAKm6F,eAG1Bn6F,KAAKo6F,gBAAkBp6F,KAAKw4F,mBAC5Bx4F,KAAKo6F,gBAAgBjjC,qBAErB,IAAIvyB,GAAS5kC,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,OAEnD5kC,MAAK85F,mBACL95F,KAAK85F,gBAA0B,SAAIjoF,SAASM,cAAc,QAC1DnS,KAAK85F,gBAA0B,SAAE/xF,UAAY,8BAC7C/H,KAAK85F,gBAA+B,cAAIjoF,SAASM,cAAc,QAC/DnS,KAAK85F,gBAA+B,cAAE/xF,UAAY,4BAClD/H,KAAK85F,gBAA+B,cAAE31E,UAAYygB,EAAa,KAC/D5kC,KAAK85F,gBAA0B,SAAE/nF,YAAY/R,KAAK85F,gBAA+B,eAEjF95F,KAAK85F,gBAAmC,kBAAIjoF,SAASM,cAAc,OACnEnS,KAAK85F,gBAAmC,kBAAE/xF,UAAY,wBAEtD/H,KAAK85F,gBAAiC,gBAAIjoF,SAASM,cAAc,QACjEnS,KAAK85F,gBAAiC,gBAAE/xF,UAAY,8BACpD/H,KAAK85F,gBAAsC,qBAAIjoF,SAASM,cAAc,QACtEnS,KAAK85F,gBAAsC,qBAAE/xF,UAAY,4BACzD/H,KAAK85F,gBAAsC,qBAAE31E,UAAYygB,EAA4B,oBACrF5kC,KAAK85F,gBAAiC,gBAAE/nF,YAAY/R,KAAK85F,gBAAsC,sBAE/F95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAA0B,UAChE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAmC,mBACzE95F,KAAKmqE,gBAAgBp4D,YAAY/R,KAAK85F,gBAAiC,iBAGvE95F,KAAK85F,gBAA0B,SAAEvnE,QAAUvyB,KAAKkpD,sBAAsB7zB,KAAKr1B,MAG3EA,KAAK4iD,gBAA8B,aAAS5iD,KAAKupD,aACjDvpD,KAAK4iD,gBAA8C,6BAAK5iD,KAAKo5F,6BAC7Dp5F,KAAK4iD,gBAA4B,WAAW5iD,KAAKyqD,WACjDzqD,KAAK4iD,gBAAkC,iBAAK5iD,KAAKwpD,iBACjDxpD,KAAK4iD,gBAA+B,cAAQ5iD,KAAKkqD,cACjDlqD,KAAKupD,aAAmBvpD,KAAK66F,mBAC7B76F,KAAKyqD,WAAmB,aACxBzqD,KAAKkqD,cAAmBlqD,KAAK86F,iBAC7B96F,KAAKwpD,iBAAmB,aACxBxpD,KAAKo5F,6BAA+Bp5F,KAAK+6F,oBAGzC/6F,KAAKiiD,WAUPriD,EAAQi7F,mBAAqB,SAASr6D,GACpCxgC,KAAKo6F,gBAAgBrnC,aAAazpC,KAAK2nB,WACvCjxC,KAAKo6F,gBAAgBrnC,aAAaxpC,GAAG0nB,WACrCjxC,KAAKq6F,oBAAsBr6F,KAAKo6F,gBAAgB/iC,wBAAwBr3D,KAAKoqD,qBAAqB5pB,EAAQnuB,GAAGrS,KAAKsqD,qBAAqB9pB,EAAQluB,IAC9G,OAA7BtS,KAAKq6F,sBACPr6F,KAAKq6F,oBAAoBnpD,SACzBlxC,KAAK2iD,kBAAmB,GAE1B3iD,KAAKiiD,WAUPriD,EAAQk7F,iBAAmB,SAAStxF,GAClC,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OACZ,QAA7BrsB,KAAKq6F,qBAA6D9zF,SAA7BvG,KAAKq6F,sBAC5Cr6F,KAAKq6F,oBAAoBhoF,EAAIrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GAC/DrS,KAAKq6F,oBAAoB/nF,EAAItS,KAAKsqD,qBAAqB9pB,EAAQluB,IAEjEtS,KAAKiiD,WAGPriD,EAAQm7F,oBAAsB,SAASv6D,GACrC,GAAIw6D,GAAUh7F,KAAKypD,WAAWjpB,EACf,OAAXw6D,GACqD,GAAnDh7F,KAAKo6F,gBAAgBrnC,aAAazpC,KAAK2pB,WACzCjzC,KAAKi7F,UAAUD,EAAQ36F,GAAIL,KAAKo6F,gBAAgB7wE,GAAGlpB,IACnDL,KAAKo6F,gBAAgBrnC,aAAazpC,KAAK2nB,YAEY,GAAjDjxC,KAAKo6F,gBAAgBrnC,aAAaxpC,GAAG0pB,WACvCjzC,KAAKi7F,UAAUj7F,KAAKo6F,gBAAgB9wE,KAAKjpB,GAAI26F,EAAQ36F,IACrDL,KAAKo6F,gBAAgBrnC,aAAaxpC,GAAG0nB,aAIvCjxC,KAAKo6F,gBAAgB5iC,uBAEvBx3D,KAAK2iD,kBAAmB,EACxB3iD,KAAKiiD,WASPriD,EAAQ+6F,eAAiB,SAASn6D,GAChC,GAAoC,GAAhCxgC,KAAKs4F,wBAA8B,CACrC,GAAIvzC,GAAO/kD,KAAKypD,WAAWjpB,EAE3B,IAAY,MAARukB,EACF,GAAIA,EAAK0U,YAAc,EACrByhC,MAAMl7F,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,QAAyB,qBAElE,CACH5kC,KAAK4pD,cAAc7E,GAAK,EACxB,IAAIo2C,GAAen7F,KAAK2tD,QAAiB,QAAS,KAGlDwtC,GAAyB,WAAI,GAAI53F,IAAMlD,GAAG,oBAAoBL,KAAK+gD,UACnE,IAAIq6C,GAAaD,EAAyB,UAC1CC,GAAW/oF,EAAI0yC,EAAK1yC,EACpB+oF,EAAW9oF,EAAIyyC,EAAKzyC,EAGpBtS,KAAKq9C,MAAsB,eAAI,GAAIj6C,IAAM/C,GAAG,iBAAiBipB,KAAKy7B,EAAK1kD,GAAGkpB,GAAG6xE,EAAW/6F,IAAKL,KAAMA,KAAK+gD,UACxG,IAAIs6C,GAAiBr7F,KAAKq9C,MAAsB,cAChDg+C,GAAe/xE,KAAOy7B,EACtBs2C,EAAejvC,WAAY,EAC3BivC,EAAetsF,QAAQqxC,cAAgBpxC,SAAS,EAC5CqxC,SAAS,EACTx5C,KAAM,aACNy5C,UAAW,IAEf+6C,EAAepoD,UAAW,EAC1BooD,EAAe9xE,GAAK6xE,EAEpBp7F,KAAK4iD,gBAA+B,cAAI5iD,KAAKkqD,cAC7ClqD,KAAKkqD,cAAgB,SAAS1gD,GAC5B,GAAIg3B,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,QACzCgvE,EAAiBr7F,KAAKq9C,MAAsB,cAChDg+C,GAAe9xE,GAAGlX,EAAIrS,KAAKoqD,qBAAqB5pB,EAAQnuB,GACxDgpF,EAAe9xE,GAAGjX,EAAItS,KAAKsqD,qBAAqB9pB,EAAQluB,IAG1DtS,KAAKkkD,QAAS,EACdlkD,KAAKkQ,WAMbtQ,EAAQg7F,eAAiB,SAASpxF,GAChC,GAAoC,GAAhCxJ,KAAKs4F,wBAA8B,CACrC,GAAI93D,GAAUxgC,KAAKopD,YAAY5/C,EAAMy2B,QAAQ5T,OAE7CrsB,MAAKkqD,cAAgBlqD,KAAK4iD,gBAA+B,oBAClD5iD,MAAK4iD,gBAA+B,aAG3C,IAAI04C,GAAgBt7F,KAAKq9C,MAAsB,eAAE+U,aAG1CpyD,MAAKq9C,MAAsB,qBAC3Br9C,MAAK2tD,QAAiB,QAAS,MAAc,iBAC7C3tD,MAAK2tD,QAAiB,QAAS,MAAiB,aAEvD,IAAI5I,GAAO/kD,KAAKypD,WAAWjpB,EACf,OAARukB,IACEA,EAAK0U,YAAc,EACrByhC,MAAMl7F,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,QAAyB,kBAGrE5kC,KAAKu7F,YAAYD,EAAcv2C,EAAK1kD,IACpCL,KAAKkpD,0BAGTlpD,KAAKizF,iBAQTrzF,EAAQ86F,SAAW,WACjB,GAAI16F,KAAK24F,qBAAwC,GAAjB34F,KAAKinD,SAAkB,CACrD,GAAI4wC,GAAiB73F,KAAK43F,yBAAyB53F,KAAKqjD,iBACpDm4C,GAAen7F,GAAGM,EAAKoE,aAAasN,EAAEwlF,EAAerwF,KAAK8K,EAAEulF,EAAejwF,IAAI+gB,MAAM,MAAMuoC,gBAAe,EAAKC,gBAAe,EAClI,IAAInxD,KAAKm8C,iBAAiB5oC,IAAK,CAC7B,GAAwC,GAApCvT,KAAKm8C,iBAAiB5oC,IAAI7N,OAU5B,KAAM,IAAI9B,OAAM,sEAThB,IAAI6Q,GAAKzU,IACTA,MAAKm8C,iBAAiB5oC,IAAIioF,EAAa,SAASC,GAC9ChnF,EAAG+uC,UAAUjwC,IAAIkoF,GACjBhnF,EAAGy0C,wBACHz0C,EAAGyvC,QAAS,EACZzvC,EAAGvE,cAWPlQ,MAAKwjD,UAAUjwC,IAAIioF,GACnBx7F,KAAKkpD,wBACLlpD,KAAKkkD,QAAS,EACdlkD,KAAKkQ,UAWXtQ,EAAQ27F,YAAc,SAASG,EAAaC,GAC1C,GAAqB,GAAjB37F,KAAKinD,SAAkB,CACzB,GAAIu0C,IAAelyE,KAAKoyE,EAAcnyE,GAAGoyE,EACzC,IAAI37F,KAAKm8C,iBAAiBG,QAAS,CACjC,GAA4C,GAAxCt8C,KAAKm8C,iBAAiBG,QAAQ52C,OAShC,KAAM,IAAI9B,OAAM,0EARhB,IAAI6Q,GAAKzU,IACTA,MAAKm8C,iBAAiBG,QAAQk/C,EAAa,SAASC,GAClDhnF,EAAGgvC,UAAUlwC,IAAIkoF,GACjBhnF,EAAGyvC,QAAS,EACZzvC,EAAGvE,cAUPlQ,MAAKyjD,UAAUlwC,IAAIioF,GACnBx7F,KAAKkkD,QAAS,EACdlkD,KAAKkQ,UAUXtQ,EAAQq7F,UAAY,SAASS,EAAaC,GACxC,GAAqB,GAAjB37F,KAAKinD,SAAkB,CACzB,GAAIu0C,IAAen7F,GAAIL,KAAKo6F,gBAAgB/5F,GAAIipB,KAAKoyE,EAAcnyE,GAAGoyE,EACtE,IAAI37F,KAAKm8C,iBAAiBE,SAAU,CAClC,GAA6C,GAAzCr8C,KAAKm8C,iBAAiBE,SAAS32C,OASjC,KAAM,IAAI9B,OAAM,wEARhB,IAAI6Q,GAAKzU,IACTA,MAAKm8C,iBAAiBE,SAASm/C,EAAa,SAASC,GACnDhnF,EAAGgvC,UAAUtuC,OAAOsmF,GACpBhnF,EAAGyvC,QAAS,EACZzvC,EAAGvE,cAUPlQ,MAAKyjD,UAAUtuC,OAAOqmF,GACtBx7F,KAAKkkD,QAAS,EACdlkD,KAAKkQ,UAUXtQ,EAAQ46F,UAAY,WAClB,IAAIx6F,KAAKm8C,iBAAiBC,MAAyB,GAAjBp8C,KAAKinD,SA4BrC,KAAM,IAAIrjD,OAAM,iDA3BhB,IAAImhD,GAAO/kD,KAAKu4F,mBACZvlF,GAAQ3S,GAAG0kD,EAAK1kD,GAClBsoB,MAAOo8B,EAAKp8B,MACZpW,MAAOwyC,EAAKh2C,QAAQwD,MACpBqqC,MAAOmI,EAAKh2C,QAAQ6tC,MACpB/xC,OACEiB,WAAWi5C,EAAKh2C,QAAQlE,MAAMiB,WAC9BC,OAAOg5C,EAAKh2C,QAAQlE,MAAMkB,OAC1BC,WACEF,WAAWi5C,EAAKh2C,QAAQlE,MAAMmB,UAAUF,WACxCC,OAAOg5C,EAAKh2C,QAAQlE,MAAMmB,UAAUD,SAG1C,IAAyC,GAArC/L,KAAKm8C,iBAAiBC,KAAK12C,OAU7B,KAAM,IAAI9B,OAAM,wEAThB,IAAI6Q,GAAKzU,IACTA,MAAKm8C,iBAAiBC,KAAKppC,EAAM,SAAUyoF,GACzChnF,EAAG+uC,UAAUruC,OAAOsmF,GACpBhnF,EAAGy0C,wBACHz0C,EAAGyvC,QAAS,EACZzvC,EAAGvE,WAoBXtQ,EAAQupD,gBAAkB,WACxB,IAAKnpD,KAAK24F,qBAAwC,GAAjB34F,KAAKinD,SACpC,GAAKjnD,KAAK44F,sBA4BRsC,MAAMl7F,KAAK+gD,UAAUpc,QAAQ3kC,KAAK+gD,UAAUnc,QAA4B,wBA5BzC,CAC/B,GAAIg3D,GAAgB57F,KAAKs5F,mBACrBuC,EAAgB77F,KAAKw5F,kBACzB,IAAIx5F,KAAKm8C,iBAAiBI,IAAK,CAC7B,GAAI9nC,GAAKzU,KACLgT,GAAQwpC,MAAOo/C,EAAev+C,MAAOw+C,EACzC,MAAI77F,KAAKm8C,iBAAiBI,IAAI72C,OAAS,GAUrC,KAAM,IAAI9B,OAAM,0EAThB5D,MAAKm8C,iBAAiBI,IAAIvpC,EAAM,SAAUyoF,GACxChnF,EAAGgvC,UAAU7sC,OAAO6kF,EAAcp+C,OAClC5oC,EAAG+uC,UAAU5sC,OAAO6kF,EAAcj/C,OAClC/nC,EAAGw+E,eACHx+E,EAAGyvC,QAAS,EACZzvC,EAAGvE,cAQPlQ,MAAKyjD,UAAU7sC,OAAOilF,GACtB77F,KAAKwjD,UAAU5sC,OAAOglF,GACtB57F,KAAKizF,eACLjzF,KAAKkkD,QAAS,EACdlkD,KAAKkQ,WAYT,SAASrQ,EAAQD,EAASM,GAE9B,GACImlC,IADOnlC,EAAoB,GAClBA,EAAoB,IAEjCN,GAAQ0qE,iBAAmB,WAEzB,GAA8C,GAA1CtqE,KAAKmhD,kBAAkBC,SAAS17C,OAAa,CAC/C,IAAK,GAAIH,GAAI,EAAGA,EAAIvF,KAAKmhD,kBAAkBC,SAAS17C,OAAQH,IAC1DvF,KAAKmhD,kBAAkBC,SAAS77C,GAAG2oF,SAErCluF,MAAKmhD,kBAAkBC,YAGzBphD,KAAKq5F,2BAA6B,aAG9Br5F,KAAK87F,gBAAkB97F,KAAK87F,eAAwB,SAAK97F,KAAK87F,eAAwB,QAAEhyF,YAC1F9J,KAAK87F,eAAwB,QAAEhyF,WAAW2H,YAAYzR,KAAK87F,eAAwB,UAYvFl8F,EAAQ2qE,wBAA0B,WAChCvqE,KAAKsqE,mBAELtqE,KAAK87F,iBACL,IAAIA,IAAkB,KAAK,OAAO,OAAO,QAAQ,SAAS,UAAU,eAChEC,GAAwB,UAAU,YAAY,YAAY,aAAa,UAAU,WAAW,cAEhG/7F,MAAK87F,eAAwB,QAAIjqF,SAASM,cAAc,OACxDnS,KAAKwf,MAAMzN,YAAY/R,KAAK87F,eAAwB,QAEpD;IAAK,GAAIv2F,GAAI,EAAGA,EAAIu2F,EAAep2F,OAAQH,IAAK,CAC9CvF,KAAK87F,eAAeA,EAAev2F,IAAMsM,SAASM,cAAc,OAChEnS,KAAK87F,eAAeA,EAAev2F,IAAIwC,UAAY,sBAAwB+zF,EAAev2F,GAC1FvF,KAAK87F,eAAwB,QAAE/pF,YAAY/R,KAAK87F,eAAeA,EAAev2F,IAE9E,IAAIzB,GAASuhC,EAAOrlC,KAAK87F,eAAeA,EAAev2F,KAAMggC,iBAAiB,GAC9EzhC,GAAO+P,GAAG,QAAS7T,KAAK+7F,EAAqBx2F,IAAI8vB,KAAKr1B,OACtDA,KAAKmhD,kBAAkBE,IAAIn5C,KAAKpE,GAGlC9D,KAAKq5F,2BAA6Br5F,KAAKg8F,cAEvCh8F,KAAKmhD,kBAAkBC,SAAWphD,KAAKmhD,kBAAkBE,KAS3DzhD,EAAQq8F,YAAc,SAASzyF,GAC7BxJ,KAAKqkD,YAAYj0C,SAAS,MAC1B5G,EAAMk8B,mBAQR9lC,EAAQo8F,cAAgB,WACtBh8F,KAAK6oD,eACL7oD,KAAK0oD,eACL1oD,KAAKgpD,aAYPppD,EAAQ6oD,QAAU,SAASj/C,GACzBxJ,KAAKmiD,WAAaniD,KAAK+gD,UAAUpB,SAASC,MAAMttC,EAChDtS,KAAKkQ,QACL1G,EAAMD,kBAQR3J,EAAQ+oD,UAAY,SAASn/C,GAC3BxJ,KAAKmiD,YAAcniD,KAAK+gD,UAAUpB,SAASC,MAAMttC,EACjDtS,KAAKkQ,QACL1G,EAAMD,kBAQR3J,EAAQgpD,UAAY,SAASp/C,GAC3BxJ,KAAKkiD,WAAaliD,KAAK+gD,UAAUpB,SAASC,MAAMvtC,EAChDrS,KAAKkQ,QACL1G,EAAMD,kBAQR3J,EAAQkpD,WAAa,SAASt/C,GAC5BxJ,KAAKkiD,YAAcliD,KAAK+gD,UAAUpB,SAASC,MAAMttC,EACjDtS,KAAKkQ,QACL1G,EAAMD,kBAQR3J,EAAQmpD,QAAU,SAASv/C,GACzBxJ,KAAKoiD,cAAgBpiD,KAAK+gD,UAAUpB,SAASC,MAAMjf,KACnD3gC,KAAKkQ,QACL1G,EAAMD,kBAQR3J,EAAQqpD,SAAW,SAASz/C,GAC1BxJ,KAAKoiD,eAAiBpiD,KAAK+gD,UAAUpB,SAASC,MAAMjf,KACpD3gC,KAAKkQ,QACL1G,EAAMD,kBAQR3J,EAAQopD,UAAY,SAASx/C,GAC3BxJ,KAAKoiD,cAAgB,EACrB54C,GAASA,EAAMD,kBAQjB3J,EAAQ8oD,aAAe,SAASl/C,GAC9BxJ,KAAKmiD,WAAa,EAClB34C,GAASA,EAAMD,kBAQjB3J,EAAQipD,aAAe,SAASr/C,GAC9BxJ,KAAKkiD,WAAa,EAClB14C,GAASA,EAAMD,mBAMb,SAAS1J,EAAQD,GAErBA,EAAQ+mD,aAAe,WACrB,IAAK,GAAIvB,KAAUplD,MAAKw8C,MACtB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrC,GAAIL,GAAO/kD,KAAKw8C,MAAM4I,EACO,IAAzBL,EAAK2T,mBACP3T,EAAK7H,MAAQ,GACb6H,EAAK4T,qBAAsB,KAYnC/4D,EAAQwkD,yBAA2B,WACjC,GAAiD,GAA7CpkD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAmBhP,KAAKkjD,YAAYx9C,OAAS,EAAG,CACjC,MAA/C1F,KAAK+gD,UAAUhB,mBAAmBvkB,WAAoE,MAA/Cx7B,KAAK+gD,UAAUhB,mBAAmBvkB,UAC3Fx7B,KAAK+gD,UAAUhB,mBAAmBC,iBAAmB,GAGrDhgD,KAAK+gD,UAAUhB,mBAAmBC,gBAAkB/6C,KAAK8lB,IAAI/qB,KAAK+gD,UAAUhB,mBAAmBC,iBAG9C,MAA/ChgD,KAAK+gD,UAAUhB,mBAAmBvkB,WAAoE,MAA/Cx7B,KAAK+gD,UAAUhB,mBAAmBvkB,UAChD,GAAvCx7B,KAAK+gD,UAAUX,aAAapxC,UAC9BhP,KAAK+gD,UAAUX,aAAav5C,KAAO,YAIM,GAAvC7G,KAAK+gD,UAAUX,aAAapxC,UAC9BhP,KAAK+gD,UAAUX,aAAav5C,KAAO,aAIvC,IACIk+C,GAAMK,EADN82C,EAAU,EAEVC,GAAe,EACfC,GAAiB,CAErB,KAAKh3C,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GACA,IAAdL,EAAK7H,MACPi/C,GAAe,EAGfC,GAAiB,EAEfF,EAAUn3C,EAAK1H,MAAM33C,SACvBw2F,EAAUn3C,EAAK1H,MAAM33C,QAM3B,IAAsB,GAAlB02F,GAA0C,GAAhBD,EAC5B,KAAM,IAAIv4F,OAAM,wHAQhB5D,MAAKq8F,mBAGiB,GAAlBD,IAC8C,WAA5Cp8F,KAAK+gD,UAAUhB,mBAAmBG,OACpClgD,KAAKs8F,iBAAiBJ,GAGtBl8F,KAAKu8F,2BAKT,IAAIC,GAAex8F,KAAKy8F,kBAGxBz8F,MAAK08F,uBAAuBF,GAG5Bx8F,KAAKkQ,UAYXtQ,EAAQ88F,uBAAyB,SAASF,GACxC,GAAIp3C,GAAQL,CAGZ,KAAK,GAAI7H,KAASs/C,GAChB,GAAIA,EAAa32F,eAAeq3C,GAE9B,IAAKkI,IAAUo3C,GAAat/C,GAAOV,MAC7BggD,EAAat/C,GAAOV,MAAM32C,eAAeu/C,KAC3CL,EAAOy3C,EAAat/C,GAAOV,MAAM4I,GACkB,MAA/CplD,KAAK+gD,UAAUhB,mBAAmBvkB,WAAoE,MAA/Cx7B,KAAK+gD,UAAUhB,mBAAmBvkB,UACvFupB,EAAKiF,SACPjF,EAAK1yC,EAAImqF,EAAat/C,GAAOy/C,OAC7B53C,EAAKiF,QAAS,EAEdwyC,EAAat/C,GAAOy/C,QAAUH,EAAat/C,GAAO+C,aAIhD8E,EAAKkF,SACPlF,EAAKzyC,EAAIkqF,EAAat/C,GAAOy/C,OAC7B53C,EAAKkF,QAAS,EAEduyC,EAAat/C,GAAOy/C,QAAUH,EAAat/C,GAAO+C,aAGtDjgD,KAAK48F,kBAAkB73C,EAAK1H,MAAM0H,EAAK1kD,GAAGm8F,EAAaz3C,EAAK7H,OAOpEl9C,MAAK4mD,cAUPhnD,EAAQ68F,iBAAmB,WACzB,GACIr3C,GAAQL,EAAM7H,EADds/C,IAKJ,KAAKp3C,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GAClBL,EAAKiF,QAAS,EACdjF,EAAKkF,QAAS,EACqC,MAA/CjqD,KAAK+gD,UAAUhB,mBAAmBvkB,WAAoE,MAA/Cx7B,KAAK+gD,UAAUhB,mBAAmBvkB,UAC3FupB,EAAKzyC,EAAItS,KAAK+gD,UAAUhB,mBAAmBC,gBAAgB+E,EAAK7H,MAGhE6H,EAAK1yC,EAAIrS,KAAK+gD,UAAUhB,mBAAmBC,gBAAgB+E,EAAK7H,MAEjC32C,SAA7Bi2F,EAAaz3C,EAAK7H,SACpBs/C,EAAaz3C,EAAK7H,QAAUwrB,OAAQ,EAAGlsB,SAAWmgD,OAAO,EAAG18C,YAAY,IAE1Eu8C,EAAaz3C,EAAK7H,OAAOwrB,QAAU,EACnC8zB,EAAaz3C,EAAK7H,OAAOV,MAAM4I,GAAUL,EAK7C,IAAI83C,GAAW,CACf,KAAK3/C,IAASs/C,GACRA,EAAa32F,eAAeq3C,IAC1B2/C,EAAWL,EAAat/C,GAAOwrB,SACjCm0B,EAAWL,EAAat/C,GAAOwrB,OAMrC,KAAKxrB,IAASs/C,GACRA,EAAa32F,eAAeq3C,KAC9Bs/C,EAAat/C,GAAO+C,aAAe48C,EAAW,GAAK78F,KAAK+gD,UAAUhB,mBAAmBE,YACrFu8C,EAAat/C,GAAO+C,aAAgBu8C,EAAat/C,GAAOwrB,OAAS,EACjE8zB,EAAat/C,GAAOy/C,OAASH,EAAat/C,GAAO+C,YAAe,IAAOu8C,EAAat/C,GAAOwrB,OAAS,GAAK8zB,EAAat/C,GAAO+C,YAIjI,OAAOu8C,IAUT58F,EAAQ08F,iBAAmB,SAASJ,GAClC,GAAI92C,GAAQL,CAGZ,KAAKK,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GACdL,EAAK1H,MAAM33C,QAAUw2F,IACvBn3C,EAAK7H,MAAQ,GAMnB,KAAKkI,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GACA,GAAdL,EAAK7H,OACPl9C,KAAK88F,UAAU,EAAE/3C,EAAK1H,MAAM0H,EAAK1kD,MAYzCT,EAAQ28F,yBAA2B,WACjC,GAAIn3C,GAAQL,CAGZ,KAAKK,IAAUplD,MAAKw8C,MAClB,GAAIx8C,KAAKw8C,MAAM32C,eAAeu/C,GAAS,CACrCplD,KAAKw8C,MAAM4I,GAAQlI,MAAQ,GAC3B,OAKJ,IAAKkI,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GACA,KAAdL,EAAK7H,OACPl9C,KAAK+8F,kBAAkB,IAAMh4C,EAAK1H,MAAM0H,EAAK1kD,IAOnD,IAAI40F,GAAW,GACf,KAAK7vC,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GAClB6vC,EAAWlwC,EAAK7H,MAAQ+3C,EAAWlwC,EAAK7H,MAAQ+3C,EAKpD,KAAK7vC,IAAUplD,MAAKw8C,MACdx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BL,EAAO/kD,KAAKw8C,MAAM4I,GAClBL,EAAK7H,OAAS+3C,IAepBr1F,EAAQy8F,iBAAmB,WACzBr8F,KAAK+gD,UAAUtC,WAAWzvC,SAAU,EACpChP,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SAAU,EAC3ChP,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,SAAU,EACvDhP,KAAK4pE,2BACsC,GAAvC5pE,KAAK+gD,UAAUX,aAAapxC,UAC9BhP,KAAK+gD,UAAUX,aAAaC,SAAU,GAExCrgD,KAAKynD,0BAcP7nD,EAAQg9F,kBAAoB,SAASv/C,EAAO2/C,EAAUR,EAAcS,GAClE,IAAK,GAAI13F,GAAI,EAAGA,EAAI83C,EAAM33C,OAAQH,IAAK,CACrC,GAAIwtF,GAAY,IAEdA,GADE11C,EAAM93C,GAAG8sD,MAAQ2qC,EACP3/C,EAAM93C,GAAG+jB,KAGT+zB,EAAM93C,GAAGgkB,EAIvB,IAAI2zE,IAAY,CACmC,OAA/Cl9F,KAAK+gD,UAAUhB,mBAAmBvkB,WAAoE,MAA/Cx7B,KAAK+gD,UAAUhB,mBAAmBvkB,UACvFu3D,EAAU/oC,QAAU+oC,EAAU71C,MAAQ+/C,IACxClK,EAAU/oC,QAAS,EACnB+oC,EAAU1gF,EAAImqF,EAAazJ,EAAU71C,OAAOy/C,OAC5CO,GAAY,GAIVnK,EAAU9oC,QAAU8oC,EAAU71C,MAAQ+/C,IACxClK,EAAU9oC,QAAS,EACnB8oC,EAAUzgF,EAAIkqF,EAAazJ,EAAU71C,OAAOy/C,OAC5CO,GAAY,GAIC,GAAbA,IACFV,EAAazJ,EAAU71C,OAAOy/C,QAAUH,EAAazJ,EAAU71C,OAAO+C,YAClE8yC,EAAU11C,MAAM33C,OAAS,GAC3B1F,KAAK48F,kBAAkB7J,EAAU11C,MAAM01C,EAAU1yF,GAAGm8F,EAAazJ,EAAU71C,UAenFt9C,EAAQk9F,UAAY,SAAS5/C,EAAOG,EAAO2/C,GACzC,IAAK,GAAIz3F,GAAI,EAAGA,EAAI83C,EAAM33C,OAAQH,IAAK,CACrC,GAAIwtF,GAAY,IAEdA,GADE11C,EAAM93C,GAAG8sD,MAAQ2qC,EACP3/C,EAAM93C,GAAG+jB,KAGT+zB,EAAM93C,GAAGgkB,IAEA,IAAnBwpE,EAAU71C,OAAe61C,EAAU71C,MAAQA,KAC7C61C,EAAU71C,MAAQA,EACd61C,EAAU11C,MAAM33C,OAAS,GAC3B1F,KAAK88F,UAAU5/C,EAAM,EAAG61C,EAAU11C,MAAO01C,EAAU1yF,OAe3DT,EAAQm9F,kBAAoB,SAAS7/C,EAAOG,EAAO2/C,GACjDh9F,KAAKw8C,MAAMwgD,GAAUrkC,qBAAsB,CAC3C,KAAK,GAAIpzD,GAAI,EAAGA,EAAI83C,EAAM33C,OAAQH,IAAK,CACrC,GAAIwtF,GAAY,KACZv3D,EAAY,CACZ6hB,GAAM93C,GAAG8sD,MAAQ2qC,GACnBjK,EAAY11C,EAAM93C,GAAG+jB,KACrBkS,EAAY,IAGZu3D,EAAY11C,EAAM93C,GAAGgkB,GAEA,IAAnBwpE,EAAU71C,QACZ61C,EAAU71C,MAAQA,EAAQ1hB,GAI9B,IAAK,GAAIj2B,GAAI,EAAGA,EAAI83C,EAAM33C,OAAQH,IAAK,CACrC,GAAIwtF,GAAY,IACgBA,GAA5B11C,EAAM93C,GAAG8sD,MAAQ2qC,EAAuB3/C,EAAM93C,GAAG+jB,KACnC+zB,EAAM93C,GAAGgkB,GACvBwpE,EAAU11C,MAAM33C,OAAS,GAAKqtF,EAAUp6B,uBAAwB,GAClE34D,KAAK+8F,kBAAkBhK,EAAU71C,MAAO61C,EAAU11C,MAAO01C,EAAU1yF,MAWzET,EAAQu9F,cAAgB,WACtB,IAAK,GAAI/3C,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BplD,KAAKw8C,MAAM4I,GAAQ4E,QAAS,EAC5BhqD,KAAKw8C,MAAM4I,GAAQ6E,QAAS,KAQ9B,SAASpqD,EAAQD,EAASM,GAuf9B,QAASk9F,KACPp9F,KAAK+gD,UAAUX,aAAapxC,SAAWhP,KAAK+gD,UAAUX,aAAapxC,OACnE,IAAIquF,GAAqBxrF,SAASyrF,eAAe,qBACCD,GAAmB7vF,MAAM1B,WAAhC,GAAvC9L,KAAK+gD,UAAUX,aAAapxC,QAAwD,UACR,UAEhFhP,KAAKynD,wBAAuB,GAO9B,QAAS81C,KACP,IAAK,GAAIn4C,KAAUplD,MAAKgjD,iBAClBhjD,KAAKgjD,iBAAiBn9C,eAAeu/C,KACvCplD,KAAKgjD,iBAAiBoC,GAAQ0T,GAAK,EAAI94D,KAAKgjD,iBAAiBoC,GAAQ2T,GAAK,EAC1E/4D,KAAKgjD,iBAAiBoC,GAAQwT,GAAK,EAAI54D,KAAKgjD,iBAAiBoC,GAAQyT,GAAK,EAG7B,IAA7C74D,KAAK+gD,UAAUhB,mBAAmB/wC,SACpChP,KAAKokD,2BACLo5C,EAAiBj9F,KAAKP,KAAM,aAAc,EAAG,8CAC7Cw9F,EAAiBj9F,KAAKP,KAAM,aAAc,EAAG,0BAC7Cw9F,EAAiBj9F,KAAKP,KAAM,aAAc,EAAG,0BAC7Cw9F,EAAiBj9F,KAAKP,KAAM,aAAc,EAAG,wBAC7Cw9F,EAAiBj9F,KAAKP,KAAM,eAAgB,EAAG,oBAG/CA,KAAKoxF,kBAEPpxF,KAAKkkD,QAAS,EACdlkD,KAAKkQ,QAMP,QAASutF,KACP,GAAI1uF,GAAU,gDACV2uF,KACAC,EAAe9rF,SAASyrF,eAAe,wBACvCM,EAAe/rF,SAASyrF,eAAe,uBAC3C,IAA4B,GAAxBK,EAAaE,QAAiB,CAMhC,GALI79F,KAAK+gD,UAAUjD,QAAQC,UAAUE,uBAAyBj+C,KAAK89F,gBAAgBhgD,QAAQC,UAAUE,uBAAwBy/C,EAAgBx1F,KAAK,0BAA4BlI,KAAK+gD,UAAUjD,QAAQC,UAAUE,uBAC3Mj+C,KAAK+gD,UAAUjD,QAAQI,gBAAkBl+C,KAAK89F,gBAAgBhgD,QAAQC,UAAUG,gBAAyCw/C,EAAgBx1F,KAAK,mBAAqBlI,KAAK+gD,UAAUjD,QAAQI,gBAC1Ll+C,KAAK+gD,UAAUjD,QAAQK,cAAgBn+C,KAAK89F,gBAAgBhgD,QAAQC,UAAUI,cAA2Cu/C,EAAgBx1F,KAAK,iBAAmBlI,KAAK+gD,UAAUjD,QAAQK,cACxLn+C,KAAK+gD,UAAUjD,QAAQM,gBAAkBp+C,KAAK89F,gBAAgBhgD,QAAQC,UAAUK,gBAAyCs/C,EAAgBx1F,KAAK,mBAAqBlI,KAAK+gD,UAAUjD,QAAQM,gBAC1Lp+C,KAAK+gD,UAAUjD,QAAQO,SAAWr+C,KAAK89F,gBAAgBhgD,QAAQC,UAAUM,SAAgDq/C,EAAgBx1F,KAAK,YAAclI,KAAK+gD,UAAUjD,QAAQO,SACzJ,GAA1Bq/C,EAAgBh4F,OAAa,CAC/BqJ,EAAU,kBACVA,GAAW,wBACX,KAAK,GAAIxJ,GAAI,EAAGA,EAAIm4F,EAAgBh4F,OAAQH,IAC1CwJ,GAAW2uF,EAAgBn4F,GACvBA,EAAIm4F,EAAgBh4F,OAAS,IAC/BqJ,GAAW,KAGfA,IAAW,KAET/O,KAAK+gD,UAAUX,aAAapxC,SAAWhP,KAAK89F,gBAAgB19C,aAAapxC,UAC7C,GAA1B0uF,EAAgBh4F,OAAcqJ,EAAU,kBACtCA,GAAW,KACjBA,GAAW,iBAAmB/O,KAAK+gD,UAAUX,aAAapxC,SAE7C,iDAAXD,IACFA,GAAW,UAGV,IAA4B,GAAxB6uF,EAAaC,QAAiB,CAQrC,GAPA9uF,EAAU,kBACVA,GAAW,wCACP/O,KAAK+gD,UAAUjD,QAAQQ,UAAUC,cAAgBv+C,KAAK89F,gBAAgBhgD,QAAQQ,UAAUC,cAAgBm/C,EAAgBx1F,KAAK,iBAAmBlI,KAAK+gD,UAAUjD,QAAQQ,UAAUC,cACjLv+C,KAAK+gD,UAAUjD,QAAQI,gBAAkBl+C,KAAK89F,gBAAgBhgD,QAAQQ,UAAUJ,gBAAwBw/C,EAAgBx1F,KAAK,mBAAqBlI,KAAK+gD,UAAUjD,QAAQI,gBACzKl+C,KAAK+gD,UAAUjD,QAAQK,cAAgBn+C,KAAK89F,gBAAgBhgD,QAAQQ,UAAUH,cAA0Bu/C,EAAgBx1F,KAAK,iBAAmBlI,KAAK+gD,UAAUjD,QAAQK,cACvKn+C,KAAK+gD,UAAUjD,QAAQM,gBAAkBp+C,KAAK89F,gBAAgBhgD,QAAQQ,UAAUF,gBAAwBs/C,EAAgBx1F,KAAK,mBAAqBlI,KAAK+gD,UAAUjD,QAAQM,gBACzKp+C,KAAK+gD,UAAUjD,QAAQO,SAAWr+C,KAAK89F,gBAAgBhgD,QAAQQ,UAAUD,SAA+Bq/C,EAAgBx1F,KAAK,YAAclI,KAAK+gD,UAAUjD,QAAQO,SACxI,GAA1Bq/C,EAAgBh4F,OAAa,CAC/BqJ,GAAW,gBACX,KAAK,GAAIxJ,GAAI,EAAGA,EAAIm4F,EAAgBh4F,OAAQH,IAC1CwJ,GAAW2uF,EAAgBn4F,GACvBA,EAAIm4F,EAAgBh4F,OAAS,IAC/BqJ,GAAW,KAGfA,IAAW,KAEiB,GAA1B2uF,EAAgBh4F,SAAcqJ,GAAW,KACzC/O,KAAK+gD,UAAUX,cAAgBpgD,KAAK89F,gBAAgB19C,eACtDrxC,GAAW,mBAAqB/O,KAAK+gD,UAAUX,cAEjDrxC,GAAW,SAER,CAOH,GANAA,EAAU,kBACN/O,KAAK+gD,UAAUjD,QAAQU,sBAAsBD,cAAgBv+C,KAAK89F,gBAAgBhgD,QAAQU,sBAAsBD,cAAgBm/C,EAAgBx1F,KAAK,iBAAmBlI,KAAK+gD,UAAUjD,QAAQU,sBAAsBD,cACrNv+C,KAAK+gD,UAAUjD,QAAQI,gBAAkBl+C,KAAK89F,gBAAgBhgD,QAAQU,sBAAsBN,gBAAwBw/C,EAAgBx1F,KAAK,mBAAqBlI,KAAK+gD,UAAUjD,QAAQI,gBACrLl+C,KAAK+gD,UAAUjD,QAAQK,cAAgBn+C,KAAK89F,gBAAgBhgD,QAAQU,sBAAsBL,cAA0Bu/C,EAAgBx1F,KAAK,iBAAmBlI,KAAK+gD,UAAUjD,QAAQK,cACnLn+C,KAAK+gD,UAAUjD,QAAQM,gBAAkBp+C,KAAK89F,gBAAgBhgD,QAAQU,sBAAsBJ,gBAAwBs/C,EAAgBx1F,KAAK,mBAAqBlI,KAAK+gD,UAAUjD,QAAQM,gBACrLp+C,KAAK+gD,UAAUjD,QAAQO,SAAWr+C,KAAK89F,gBAAgBhgD,QAAQU,sBAAsBH,SAA+Bq/C,EAAgBx1F,KAAK,YAAclI,KAAK+gD,UAAUjD,QAAQO,SACpJ,GAA1Bq/C,EAAgBh4F,OAAa,CAC/BqJ,GAAW,oCACX,KAAK,GAAIxJ,GAAI,EAAGA,EAAIm4F,EAAgBh4F,OAAQH,IAC1CwJ,GAAW2uF,EAAgBn4F,GACvBA,EAAIm4F,EAAgBh4F,OAAS,IAC/BqJ,GAAW,KAGfA,IAAW,MAOb,GALAA,GAAW,wBACX2uF,KACI19F,KAAK+gD,UAAUhB,mBAAmBvkB,WAAax7B,KAAK89F,gBAAgB/9C,mBAAmBvkB,WAAkCkiE,EAAgBx1F,KAAK,cAAgBlI,KAAK+gD,UAAUhB,mBAAmBvkB,WAChMv2B,KAAK8lB,IAAI/qB,KAAK+gD,UAAUhB,mBAAmBC,kBAAoBhgD,KAAK89F,gBAAgB/9C,mBAAmBC,iBAAkB09C,EAAgBx1F,KAAK,oBAAsBlI,KAAK+gD,UAAUhB,mBAAmBC,iBACtMhgD,KAAK+gD,UAAUhB,mBAAmBE,aAAejgD,KAAK89F,gBAAgB/9C,mBAAmBE,aAAgCy9C,EAAgBx1F,KAAK,gBAAkBlI,KAAK+gD,UAAUhB,mBAAmBE,aACxK,GAA1By9C,EAAgBh4F,OAAa,CAC/B,IAAK,GAAIH,GAAI,EAAGA,EAAIm4F,EAAgBh4F,OAAQH,IAC1CwJ,GAAW2uF,EAAgBn4F,GACvBA,EAAIm4F,EAAgBh4F,OAAS,IAC/BqJ,GAAW,KAGfA,IAAW,QAGXA,IAAW,eAEbA,IAAW,KAIb/O,KAAK+9F,WAAW55E,UAAYpV,EAO9B,QAASivF,KACP,GAAIvoF,IAAO,iBAAkB,gBAAiB,iBAC1CwoF,EAAcpsF,SAASqsF,cAAc,6CAA6C92F,MAClF+2F,EAAU,SAAWF,EAAc,SACnCG,EAAQvsF,SAASyrF,eAAea,EACpCC,GAAM5wF,MAAMm6B,QAAU,OACtB,KAAK,GAAIpiC,GAAI,EAAGA,EAAIkQ,EAAI/P,OAAQH,IAC1BkQ,EAAIlQ,IAAM44F,IACZC,EAAQvsF,SAASyrF,eAAe7nF,EAAIlQ,IACpC64F,EAAM5wF,MAAMm6B,QAAU,OAG1B3nC,MAAKm9F,gBACc,KAAfc,GACFj+F,KAAK+gD,UAAUhB,mBAAmB/wC,SAAU,EAC5ChP,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,SAAU,EACvDhP,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SAAU,GAErB,KAAfivF,EAC0C,GAA7Cj+F,KAAK+gD,UAAUhB,mBAAmB/wC,UACpChP,KAAK+gD,UAAUhB,mBAAmB/wC,SAAU,EAC5ChP,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,SAAU,EACvDhP,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SAAU,EAC3ChP,KAAK+gD,UAAUX,aAAapxC,SAAU,EACtChP,KAAKokD,6BAIPpkD,KAAK+gD,UAAUhB,mBAAmB/wC,SAAU,EAC5ChP,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,SAAU,EACvDhP,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SAAU,GAE7ChP,KAAK4pE,0BACL,IAAIyzB,GAAqBxrF,SAASyrF,eAAe,qBACCD,GAAmB7vF,MAAM1B,WAAhC,GAAvC9L,KAAK+gD,UAAUX,aAAapxC,QAAwD,UACR,UAChFhP,KAAKkkD,QAAS,EACdlkD,KAAKkQ,QAWP,QAASstF,GAAkBn9F,EAAGuN,EAAIywF,GAChC,GAAIC,GAAUj+F,EAAK,SACfk+F,EAAa1sF,SAASyrF,eAAej9F,GAAI+G,KAEzCpB,OAAMC,QAAQ2H,IAChBiE,SAASyrF,eAAegB,GAASl3F,MAAQwG,EAAIod,SAASuzE,IACtDv+F,KAAKw+F,yBAAyBH,EAAsBzwF,EAAIod,SAASuzE,OAGjE1sF,SAASyrF,eAAegB,GAASl3F,MAAQ4jB,SAASpd,GAAO2X,WAAWg5E,GACpEv+F,KAAKw+F,yBAAyBH,EAAuBrzE,SAASpd,GAAO2X,WAAWg5E,MAGrD,gCAAzBF,GACuB,sCAAzBA,GACyB,kCAAzBA,IACAr+F,KAAKokD,2BAEPpkD,KAAKkkD,QAAS,EACdlkD,KAAKkQ,QAlsBP,GAAIvP,GAAOT,EAAoB,GAC3Bu+F,EAAiBv+F,EAAoB,IACrCw+F,EAA4Bx+F,EAAoB,IAChDy+F,EAAiBz+F,EAAoB,GAOzCN,GAAQg/F,iBAAmB,WACzB5+F,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SAAWhP,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,QAC7EhP,KAAK4pE,2BACL5pE,KAAKkkD,QAAS,EACdlkD,KAAKkQ,SASPtQ,EAAQgqE,yBAA2B,WAEe,GAA5C5pE,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,SACnChP,KAAK2pE,YAAY80B,GACjBz+F,KAAK2pE,YAAY+0B,GAEjB1+F,KAAK+gD,UAAUjD,QAAQI,eAAiBl+C,KAAK+gD,UAAUjD,QAAQC,UAAUG,eACzEl+C,KAAK+gD,UAAUjD,QAAQK,aAAen+C,KAAK+gD,UAAUjD,QAAQC,UAAUI,aACvEn+C,KAAK+gD,UAAUjD,QAAQM,eAAiBp+C,KAAK+gD,UAAUjD,QAAQC,UAAUK,eACzEp+C,KAAK+gD,UAAUjD,QAAQO,QAAUr+C,KAAK+gD,UAAUjD,QAAQC,UAAUM,QAElEr+C,KAAKwpE,WAAWm1B,IAE+C,GAAxD3+F,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,SACpDhP,KAAK2pE,YAAYg1B,GACjB3+F,KAAK2pE,YAAY80B,GAEjBz+F,KAAK+gD,UAAUjD,QAAQI,eAAiBl+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBN,eACrFl+C,KAAK+gD,UAAUjD,QAAQK,aAAen+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBL,aACnFn+C,KAAK+gD,UAAUjD,QAAQM,eAAiBp+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBJ,eACrFp+C,KAAK+gD,UAAUjD,QAAQO,QAAUr+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBH,QAE9Er+C,KAAKwpE,WAAWk1B,KAGhB1+F,KAAK2pE,YAAYg1B,GACjB3+F,KAAK2pE,YAAY+0B,GACjB1+F,KAAK6+F,cAAgBt4F,OAErBvG,KAAK+gD,UAAUjD,QAAQI,eAAiBl+C,KAAK+gD,UAAUjD,QAAQQ,UAAUJ,eACzEl+C,KAAK+gD,UAAUjD,QAAQK,aAAen+C,KAAK+gD,UAAUjD,QAAQQ,UAAUH,aACvEn+C,KAAK+gD,UAAUjD,QAAQM,eAAiBp+C,KAAK+gD,UAAUjD,QAAQQ,UAAUF,eACzEp+C,KAAK+gD,UAAUjD,QAAQO,QAAUr+C,KAAK+gD,UAAUjD,QAAQQ,UAAUD,QAElEr+C,KAAKwpE,WAAWi1B,KAUpB7+F,EAAQk/F,4BAA8B,WAEL,GAA3B9+F,KAAKkjD,YAAYx9C,OACnB1F,KAAKw8C,MAAMx8C,KAAKkjD,YAAY,IAAIoY,UAAU,EAAG,IAIzCt7D,KAAKkjD,YAAYx9C,OAAS1F,KAAK+gD,UAAUtC,WAAWE,kBAAyD,GAArC3+C,KAAK+gD,UAAUtC,WAAWzvC,SACpGhP,KAAK6wF,aAAa7wF,KAAK+gD,UAAUtC,WAAWG,eAAe,GAI7D5+C,KAAK++F,qBAUTn/F,EAAQm/F,iBAAmB,WAKzB/+F,KAAKg/F,gCACLh/F,KAAKi/F,uBAEDj/F,KAAK+gD,UAAUjD,QAAQM,eAAiB,IACC,GAAvCp+C,KAAK+gD,UAAUX,aAAapxC,SAA0D,GAAvChP,KAAK+gD,UAAUX,aAAaC,QAC7ErgD,KAAKk/F,oCAGuD,GAAxDl/F,KAAK+gD,UAAUjD,QAAQU,sBAAsBxvC,QAC/ChP,KAAKm/F,qCAGLn/F,KAAKo/F,2BAebx/F,EAAQktD,wBAA0B,WAChC,GAA2C,GAAvC9sD,KAAK+gD,UAAUX,aAAapxC,SAA0D,GAAvChP,KAAK+gD,UAAUX,aAAaC,QAAiB,CAC9FrgD,KAAKgjD,oBACLhjD,KAAKijD,yBAEL,KAAK,GAAImC,KAAUplD,MAAKw8C,MAClBx8C,KAAKw8C,MAAM32C,eAAeu/C,KAC5BplD,KAAKgjD,iBAAiBoC,GAAUplD,KAAKw8C,MAAM4I,GAG/C,IAAI+1C,GAAen7F,KAAK2tD,QAAiB,QAAS,KAClD,KAAK,GAAI0xC,KAAiBlE,GACpBA,EAAat1F,eAAew5F,KAC1Br/F,KAAKq9C,MAAMx3C,eAAes1F,EAAakE,GAAe1uC,cACxD3wD,KAAKgjD,iBAAiBq8C,GAAiBlE,EAAakE,GAGpDlE,EAAakE,GAAe/jC,UAAU,EAAG,GAK/C,KAAK,GAAIpV,KAAOlmD,MAAKgjD,iBACfhjD,KAAKgjD,iBAAiBn9C,eAAeqgD,IACvClmD,KAAKijD,uBAAuB/6C,KAAKg+C,OAKrClmD,MAAKgjD,iBAAmBhjD,KAAKw8C,MAC7Bx8C,KAAKijD,uBAAyBjjD,KAAKkjD,aAUvCtjD,EAAQo/F,8BAAgC,WACtC,GAAIlgF,GAAIC,EAAI8G,EAAUk/B,EAAMx/C,EACxBi3C,EAAQx8C,KAAKgjD,iBACbs8C,EAAUt/F,KAAK+gD,UAAUjD,QAAQI,eACjCqhD,EAAe,CAEnB,KAAKh6F,EAAI,EAAGA,EAAIvF,KAAKijD,uBAAuBv9C,OAAQH,IAClDw/C,EAAOvI,EAAMx8C,KAAKijD,uBAAuB19C,IACzCw/C,EAAK1G,QAAUr+C,KAAK+gD,UAAUjD,QAAQO,QAEhB,WAAlBr+C,KAAKwxF,WAAqC,GAAX8N,GACjCxgF,GAAMimC,EAAK1yC,EACX0M,GAAMgmC,EAAKzyC,EACXuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAEpCwgF,EAA4B,GAAZ15E,EAAiB,EAAKy5E,EAAUz5E,EAChDk/B,EAAK6T,GAAK95C,EAAKygF,EACfx6C,EAAK8T,GAAK95C,EAAKwgF,IAGfx6C,EAAK6T,GAAK,EACV7T,EAAK8T,GAAK,IAahBj5D,EAAQw/F,uBAAyB,WAC/B,GAAII,GAAYrzC,EAAMP,EAClB9sC,EAAIC,EAAI65C,EAAIC,EAAI4mC,EAAa55E,EAC7Bw3B,EAAQr9C,KAAKq9C,KAGjB,KAAKuO,IAAUvO,GACTA,EAAMx3C,eAAe+lD,KACvBO,EAAO9O,EAAMuO,GACTO,EAAKC,WAEHpsD,KAAKw8C,MAAM32C,eAAesmD,EAAKkG,OAASryD,KAAKw8C,MAAM32C,eAAesmD,EAAKiG,UACzEotC,EAAarzC,EAAKrO,QAAQK,aAE1BqhD,IAAerzC,EAAK5iC,GAAGkwC,YAActN,EAAK7iC,KAAKmwC,YAAc,GAAKz5D,KAAK+gD,UAAUtC,WAAWY,WAE5FvgC,EAAMqtC,EAAK7iC,KAAKjX,EAAI85C,EAAK5iC,GAAGlX,EAC5B0M,EAAMotC,EAAK7iC,KAAKhX,EAAI65C,EAAK5iC,GAAGjX,EAC5BuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAEpB,GAAZ8G,IACFA,EAAW,KAIb45E,EAAcz/F,KAAK+gD,UAAUjD,QAAQM,gBAAkBohD,EAAa35E,GAAYA,EAEhF+yC,EAAK95C,EAAK2gF,EACV5mC,EAAK95C,EAAK0gF,EAEVtzC,EAAK7iC,KAAKsvC,IAAMA,EAChBzM,EAAK7iC,KAAKuvC,IAAMA,EAChB1M,EAAK5iC,GAAGqvC,IAAMA,EACdzM,EAAK5iC,GAAGsvC,IAAMA,KAexBj5D,EAAQs/F,kCAAoC,WAC1C,GAAIM,GAAYrzC,EAAMP,EAAQ8zC,EAC1BriD,EAAQr9C,KAAKq9C,KAGjB,KAAKuO,IAAUvO,GACb,GAAIA,EAAMx3C,eAAe+lD,KACvBO,EAAO9O,EAAMuO,GACTO,EAAKC,WAEHpsD,KAAKw8C,MAAM32C,eAAesmD,EAAKkG,OAASryD,KAAKw8C,MAAM32C,eAAesmD,EAAKiG,SACzD,MAAZjG,EAAKuB,KAAa,CACpB,GAAIiyC,GAAQxzC,EAAK5iC,GACbq2E,EAAQzzC,EAAKuB,IACbmyC,EAAQ1zC,EAAK7iC,IAEjBk2E,GAAarzC,EAAKrO,QAAQK,aAE1BuhD,EAAsBC,EAAMlmC,YAAcomC,EAAMpmC,YAAc,EAG9D+lC,GAAcE,EAAsB1/F,KAAK+gD,UAAUtC,WAAWY,WAC9Dr/C,KAAK8/F,sBAAsBH,EAAOC,EAAO,GAAMJ,GAC/Cx/F,KAAK8/F,sBAAsBF,EAAOC,EAAO,GAAML,KAiB3D5/F,EAAQkgG,sBAAwB,SAAUH,EAAOC,EAAOJ,GACtD,GAAI1gF,GAAIC,EAAI65C,EAAIC,EAAI4mC,EAAa55E,CAEjC/G,GAAM6gF,EAAMttF,EAAIutF,EAAMvtF,EACtB0M,EAAM4gF,EAAMrtF,EAAIstF,EAAMttF,EACtBuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAEpB,GAAZ8G,IACFA,EAAW,KAIb45E,EAAcz/F,KAAK+gD,UAAUjD,QAAQM,gBAAkBohD,EAAa35E,GAAYA,EAEhF+yC,EAAK95C,EAAK2gF,EACV5mC,EAAK95C,EAAK0gF,EAEVE,EAAM/mC,IAAMA,EACZ+mC,EAAM9mC,IAAMA,EACZ+mC,EAAMhnC,IAAMA,EACZgnC,EAAM/mC,IAAMA,GAQdj5D,EAAQiqE,0BAA4B,WAClC,GAAkCtjE,SAA9BvG,KAAK+/F,qBAAoC,CAC3C//F,KAAK89F,mBACLn9F,EAAK6F,WAAWxG,KAAK89F,gBAAgB99F,KAAK+gD,UAE1C,IAAIi/C,IAAgC,KAAM,KAAM,KAAM,KACtDhgG,MAAK+/F,qBAAuBluF,SAASM,cAAc,OACnDnS,KAAK+/F,qBAAqBh4F,UAAY,uBACtC/H,KAAK+/F,qBAAqB57E,UAAY,onBAW2E,GAAKnkB,KAAK+gD,UAAUjD,QAAQC,UAAUE,sBAAyB,wGAA2G,GAAKj+C,KAAK+gD,UAAUjD,QAAQC,UAAUE,sBAAyB,4JAGpPj+C,KAAK+gD,UAAUjD,QAAQC,UAAUG,eAAiB,wFAA0Fl+C,KAAK+gD,UAAUjD,QAAQC,UAAUG,eAAiB,2JAG/Ll+C,KAAK+gD,UAAUjD,QAAQC,UAAUI,aAAe,sFAAwFn+C,KAAK+gD,UAAUjD,QAAQC,UAAUI,aAAe,6JAGtLn+C,KAAK+gD,UAAUjD,QAAQC,UAAUK,eAAiB,0FAA4Fp+C,KAAK+gD,UAAUjD,QAAQC,UAAUK,eAAiB,sJAGvMp+C,KAAK+gD,UAAUjD,QAAQC,UAAUM,QAAU,4FAA8Fr+C,KAAK+gD,UAAUjD,QAAQC,UAAUM,QAAU,sPAM/Kr+C,KAAK+gD,UAAUjD,QAAQQ,UAAUC,aAAe,kGAAoGv+C,KAAK+gD,UAAUjD,QAAQQ,UAAUC,aAAe,2JAGnMv+C,KAAK+gD,UAAUjD,QAAQQ,UAAUJ,eAAiB,uFAAyFl+C,KAAK+gD,UAAUjD,QAAQQ,UAAUJ,eAAiB,0JAG9Ll+C,KAAK+gD,UAAUjD,QAAQQ,UAAUH,aAAe,qFAAuFn+C,KAAK+gD,UAAUjD,QAAQQ,UAAUH,aAAe,4JAGrLn+C,KAAK+gD,UAAUjD,QAAQQ,UAAUF,eAAiB,yFAA2Fp+C,KAAK+gD,UAAUjD,QAAQQ,UAAUF,eAAiB,qJAGtMp+C,KAAK+gD,UAAUjD,QAAQQ,UAAUD,QAAU,2FAA6Fr+C,KAAK+gD,UAAUjD,QAAQQ,UAAUD,QAAU,oQAM9Kr+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBD,aAAe,kGAAoGv+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBD,aAAe,2JAG3Nv+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBN,eAAiB,uFAAyFl+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBN,eAAiB,0JAGtNl+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBL,aAAe,qFAAuFn+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBL,aAAe,4JAG7Mn+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBJ,eAAiB,yFAA2Fp+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBJ,eAAiB,qJAG9Np+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBH,QAAU,2FAA6Fr+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBH,QAAU,uJAG3M2hD,EAA6Bt5F,QAAQ1G,KAAK+gD,UAAUhB,mBAAmBvkB,WAAa,0FAA4Fx7B,KAAK+gD,UAAUhB,mBAAmBvkB,UAAY,oKAGtNx7B,KAAK+gD,UAAUhB,mBAAmBC,gBAAkB,yFAA2FhgD,KAAK+gD,UAAUhB,mBAAmBC,gBAAkB,6JAGvMhgD,KAAK+gD,UAAUhB,mBAAmBE,YAAc,wFAA0FjgD,KAAK+gD,UAAUhB,mBAAmBE,YAAc,odAU9RjgD,KAAKga,iBAAiBimF,cAAc/tF,aAAalS,KAAK+/F,qBAAsB//F,KAAKga,kBACjFha,KAAK+9F,WAAalsF,SAASM,cAAc,OACzCnS,KAAK+9F,WAAWvwF,MAAMuvC,SAAW,OACjC/8C,KAAK+9F,WAAWvwF,MAAMyvD,WAAa,UACnCj9D,KAAKga,iBAAiBimF,cAAc/tF,aAAalS,KAAK+9F,WAAY/9F,KAAKga,iBAEvE,IAAIkmF,EACJA,GAAeruF,SAASyrF,eAAe,eACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,cAAe,GAAI,2CACvEkgG,EAAeruF,SAASyrF,eAAe,eACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,cAAe,EAAG,0BACtEkgG,EAAeruF,SAASyrF,eAAe,eACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,cAAe,EAAG,0BACtEkgG,EAAeruF,SAASyrF,eAAe,eACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,cAAe,EAAG,wBACtEkgG,EAAeruF,SAASyrF,eAAe,iBACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,gBAAiB,EAAG,mBAExEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,kCACrEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,0BACrEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,0BACrEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,wBACrEkgG,EAAeruF,SAASyrF,eAAe,gBACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,eAAgB,EAAG,mBAEvEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,8CACrEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,0BACrEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,0BACrEkgG,EAAeruF,SAASyrF,eAAe,cACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,aAAc,EAAG,wBACrEkgG,EAAeruF,SAASyrF,eAAe,gBACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,eAAgB,EAAG,mBACvEkgG,EAAeruF,SAASyrF,eAAe,qBACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,oBAAqBggG,EAA8B,gCACvGE,EAAeruF,SAASyrF,eAAe,kBACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,iBAAkB,EAAG,sCACzEkgG,EAAeruF,SAASyrF,eAAe,iBACvC4C,EAAan3E,SAAWy0E,EAAiBnoE,KAAKr1B,KAAM,gBAAiB,EAAG,iCAExE,IAAI29F,GAAe9rF,SAASyrF,eAAe,wBACvCM,EAAe/rF,SAASyrF,eAAe,wBACvC6C,EAAetuF,SAASyrF,eAAe,uBAC3CM,GAAaC,SAAU,EACnB79F,KAAK+gD,UAAUjD,QAAQC,UAAU/uC,UACnC2uF,EAAaE,SAAU,GAErB79F,KAAK+gD,UAAUhB,mBAAmB/wC,UACpCmxF,EAAatC,SAAU,EAGzB,IAAIR,GAAqBxrF,SAASyrF,eAAe,sBAC7C8C,EAAwBvuF,SAASyrF,eAAe,yBAChD+C,EAAwBxuF,SAASyrF,eAAe,wBAEpDD,GAAmB9qE,QAAU6qE,EAAwB/nE,KAAKr1B,MAC1DogG,EAAsB7tE,QAAUgrE,EAAqBloE,KAAKr1B,MAC1DqgG,EAAsB9tE,QAAUkrE,EAAqBpoE,KAAKr1B,MAExDq9F,EAAmB7vF,MAAM1B,WADQ,GAA/B9L,KAAK+gD,UAAUX,cAA8D,GAAtCpgD,KAAK+gD,UAAUu/C,oBAClB,UAGA,UAIxCtC,EAAqB1lF,MAAMtY,MAE3B29F,EAAa50E,SAAWi1E,EAAqB3oE,KAAKr1B,MAClD49F,EAAa70E,SAAWi1E,EAAqB3oE,KAAKr1B,MAClDmgG,EAAap3E,SAAWi1E,EAAqB3oE,KAAKr1B,QAWtDJ,EAAQ4+F,yBAA2B,SAAUH,EAAuBj3F,GAClE,GAAIm5F,GAAYlC,EAAsBp2F,MAAM,IACpB,IAApBs4F,EAAU76F,OACZ1F,KAAK+gD,UAAUw/C,EAAU,IAAMn5F,EAEJ,GAApBm5F,EAAU76F,OACjB1F,KAAK+gD,UAAUw/C,EAAU,IAAIA,EAAU,IAAMn5F,EAElB,GAApBm5F,EAAU76F,SACjB1F,KAAK+gD,UAAUw/C,EAAU,IAAIA,EAAU,IAAIA,EAAU,IAAMn5F,KA2N3D,SAASvH,GAEb,QAAS2gG,GAAeC,GACvB,KAAM,IAAI78F,OAAM,uBAAyB68F,EAAM,MAEhDD,EAAe7yF,KAAO,WAAa,UACnC6yF,EAAeE,QAAUF,EACzB3gG,EAAOD,QAAU4gG,EACjBA,EAAengG,GAAK,IAKhB,SAASR,EAAQD,GAQrBA,EAAQq/F,qBAAuB,WAC7B,GAAIngF,GAAIC,EAAW8G,EAAU+yC,EAAIC,EAAI6mC,EACnCiB,EAAgBhB,EAAOC,EAAOr6F,EAAGwmB,EAE/BywB,EAAQx8C,KAAKgjD,iBACbE,EAAcljD,KAAKijD,uBAGnB29C,EAAS,GAAK,EACdz6F,EAAI,EAAI,EAGRo4C,EAAev+C,KAAK+gD,UAAUjD,QAAQQ,UAAUC,aAChDsiD,EAAkBtiD,CAItB,KAAKh5C,EAAI,EAAGA,EAAI29C,EAAYx9C,OAAS,EAAGH,IAEtC,IADAo6F,EAAQnjD,EAAM0G,EAAY39C,IACrBwmB,EAAIxmB,EAAI,EAAGwmB,EAAIm3B,EAAYx9C,OAAQqmB,IAAK,CAC3C6zE,EAAQpjD,EAAM0G,EAAYn3B,IAC1B2zE,EAAsBC,EAAMlmC,YAAcmmC,EAAMnmC,YAAc,EAE9D36C,EAAK8gF,EAAMvtF,EAAIstF,EAAMttF,EACrB0M,EAAK6gF,EAAMttF,EAAIqtF,EAAMrtF,EACrBuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAEpC8hF,EAA0C,GAAvBnB,EAA4BnhD,EAAgBA,GAAgB,EAAImhD,EAAsB1/F,KAAK+gD,UAAUtC,WAAWW,sBACnI,IAAI95C,GAAIs7F,EAASC,CACF,GAAIA,EAAfh7E,IAEA86E,EADa,GAAME,EAAjBh7E,EACe,EAGAvgB,EAAIugB,EAAW1f,EAIlCw6F,GAA0C,GAAvBjB,EAA4B,EAAI,EAAIA,EAAsB1/F,KAAK+gD,UAAUtC,WAAWU,mBACvGwhD,GAAkC96E,EAElC+yC,EAAK95C,EAAK6hF,EACV9nC,EAAK95C,EAAK4hF,EAEVhB,EAAM/mC,IAAMA,EACZ+mC,EAAM9mC,IAAMA,EACZ+mC,EAAMhnC,IAAMA,EACZgnC,EAAM/mC,IAAMA,MAShB,SAASh5D,EAAQD,GAQrBA,EAAQq/F,qBAAuB,WAC7B,GAAIngF,GAAIC,EAAI8G,EAAU+yC,EAAIC,EACxB8nC,EAAgBhB,EAAOC,EAAOr6F,EAAGwmB,EAE/BywB,EAAQx8C,KAAKgjD,iBACbE,EAAcljD,KAAKijD,uBAGnB1E,EAAev+C,KAAK+gD,UAAUjD,QAAQU,sBAAsBD,YAIhE,KAAKh5C,EAAI,EAAGA,EAAI29C,EAAYx9C,OAAS,EAAGH,IAEtC,IADAo6F,EAAQnjD,EAAM0G,EAAY39C,IACrBwmB,EAAIxmB,EAAI,EAAGwmB,EAAIm3B,EAAYx9C,OAAQqmB,IAItC,GAHA6zE,EAAQpjD,EAAM0G,EAAYn3B,IAGtB4zE,EAAMziD,OAAS0iD,EAAM1iD,MAAO,CAE9Bp+B,EAAK8gF,EAAMvtF,EAAIstF,EAAMttF,EACrB0M,EAAK6gF,EAAMttF,EAAIqtF,EAAMrtF,EACrBuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,EAGpC,IAAI+hF,GAAY,GAEdH,GADapiD,EAAX14B,GACgB5gB,KAAKovB,IAAIysE,EAAUj7E,EAAS,GAAK5gB,KAAKovB,IAAIysE,EAAUviD,EAAa,GAGlE,EAGD,GAAZ14B,EACFA,EAAW,IAGX86E,GAAkC96E,EAEpC+yC,EAAK95C,EAAK6hF,EACV9nC,EAAK95C,EAAK4hF,EAEVhB,EAAM/mC,IAAMA,EACZ+mC,EAAM9mC,IAAMA,EACZ+mC,EAAMhnC,IAAMA,EACZgnC,EAAM/mC,IAAMA,IAYtBj5D,EAAQu/F,mCAAqC,WAS3C,IAAK,GARDK,GAAYrzC,EAAMP,EAClB9sC,EAAIC,EAAI65C,EAAIC,EAAI4mC,EAAa55E,EAC7Bw3B,EAAQr9C,KAAKq9C,MAEbb,EAAQx8C,KAAKgjD,iBACbE,EAAcljD,KAAKijD,uBAGd19C,EAAI,EAAGA,EAAI29C,EAAYx9C,OAAQH,IAAK,CAC3C,GAAIo6F,GAAQnjD,EAAM0G,EAAY39C,GAC9Bo6F,GAAMoB,SAAW,EACjBpB,EAAMqB,SAAW,EAKnB,IAAKp1C,IAAUvO,GACb,GAAIA,EAAMx3C,eAAe+lD,KACvBO,EAAO9O,EAAMuO,GACTO,EAAKC,WAEHpsD,KAAKw8C,MAAM32C,eAAesmD,EAAKkG,OAASryD,KAAKw8C,MAAM32C,eAAesmD,EAAKiG,SAqBzE,GApBAotC,EAAarzC,EAAKrO,QAAQK,aAE1BqhD,IAAerzC,EAAK5iC,GAAGkwC,YAActN,EAAK7iC,KAAKmwC,YAAc,GAAKz5D,KAAK+gD,UAAUtC,WAAWY,WAE5FvgC,EAAMqtC,EAAK7iC,KAAKjX,EAAI85C,EAAK5iC,GAAGlX,EAC5B0M,EAAMotC,EAAK7iC,KAAKhX,EAAI65C,EAAK5iC,GAAGjX,EAC5BuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAEpB,GAAZ8G,IACFA,EAAW,KAIb45E,EAAcz/F,KAAK+gD,UAAUjD,QAAQM,gBAAkBohD,EAAa35E,GAAYA,EAEhF+yC,EAAK95C,EAAK2gF,EACV5mC,EAAK95C,EAAK0gF,EAINtzC,EAAK5iC,GAAG2zB,OAASiP,EAAK7iC,KAAK4zB,MAC7BiP,EAAK5iC,GAAGw3E,UAAYnoC,EACpBzM,EAAK5iC,GAAGy3E,UAAYnoC,EACpB1M,EAAK7iC,KAAKy3E,UAAYnoC,EACtBzM,EAAK7iC,KAAK03E,UAAYnoC,MAEnB,CACH,GAAIlT,GAAS,EACbwG,GAAK5iC,GAAGqvC,IAAMjT,EAAOiT,EACrBzM,EAAK5iC,GAAGsvC,IAAMlT,EAAOkT,EACrB1M,EAAK7iC,KAAKsvC,IAAMjT,EAAOiT,EACvBzM,EAAK7iC,KAAKuvC,IAAMlT,EAAOkT,EAQjC,GACIkoC,GAAUC,EADVvB,EAAc,CAElB,KAAKl6F,EAAI,EAAGA,EAAI29C,EAAYx9C,OAAQH,IAAK,CACvC,GAAIw/C,GAAOvI,EAAM0G,EAAY39C,GAC7Bw7F,GAAW97F,KAAKwG,IAAIg0F,EAAYx6F,KAAKiI,KAAKuyF,EAAY16C,EAAKg8C,WAC3DC,EAAW/7F,KAAKwG,IAAIg0F,EAAYx6F,KAAKiI,KAAKuyF,EAAY16C,EAAKi8C,WAE3Dj8C,EAAK6T,IAAMmoC,EACXh8C,EAAK8T,IAAMmoC,EAIb,GAAIC,GAAU,EACVC,EAAU,CACd,KAAK37F,EAAI,EAAGA,EAAI29C,EAAYx9C,OAAQH,IAAK,CACvC,GAAIw/C,GAAOvI,EAAM0G,EAAY39C,GAC7B07F,IAAWl8C,EAAK6T,GAChBsoC,GAAWn8C,EAAK8T,GAElB,GAAIsoC,GAAeF,EAAU/9C,EAAYx9C,OACrC07F,EAAeF,EAAUh+C,EAAYx9C,MAEzC,KAAKH,EAAI,EAAGA,EAAI29C,EAAYx9C,OAAQH,IAAK,CACvC,GAAIw/C,GAAOvI,EAAM0G,EAAY39C,GAC7Bw/C,GAAK6T,IAAMuoC,EACXp8C,EAAK8T,IAAMuoC,KAOX,SAASvhG,EAAQD,GAQrBA,EAAQq/F,qBAAuB,WAC7B,GAA8D,GAA1Dj/F,KAAK+gD,UAAUjD,QAAQC,UAAUE,sBAA4B,CAC/D,GAAI8G,GACAvI,EAAQx8C,KAAKgjD,iBACbE,EAAcljD,KAAKijD,uBACnBo+C,EAAYn+C,EAAYx9C,MAE5B1F,MAAKshG,mBAAmB9kD,EAAM0G,EAK9B,KAAK,GAHD27C,GAAgB7+F,KAAK6+F,cAGhBt5F,EAAI,EAAO87F,EAAJ97F,EAAeA,IAC7Bw/C,EAAOvI,EAAM0G,EAAY39C,IACrBw/C,EAAKh2C,QAAQ0tC,KAAO,IAEtBz8C,KAAKuhG,sBAAsB1C,EAAcn/F,KAAK8hG,SAASC,GAAG18C,GAC1D/kD,KAAKuhG,sBAAsB1C,EAAcn/F,KAAK8hG,SAASE,GAAG38C,GAC1D/kD,KAAKuhG,sBAAsB1C,EAAcn/F,KAAK8hG,SAASG,GAAG58C,GAC1D/kD,KAAKuhG,sBAAsB1C,EAAcn/F,KAAK8hG,SAASI,GAAG78C,MAelEnlD,EAAQ2hG,sBAAwB,SAASM,EAAa98C,GAEpD,GAAI88C,EAAaC,cAAgB,EAAG,CAClC,GAAIhjF,GAAGC,EAAG8G,CAUV,IAPA/G,EAAK+iF,EAAaE,aAAa1vF,EAAI0yC,EAAK1yC,EACxC0M,EAAK8iF,EAAaE,aAAazvF,EAAIyyC,EAAKzyC,EACxCuT,EAAW5gB,KAAK8qB,KAAKjR,EAAKA,EAAKC,EAAKA,GAKhC8G,EAAWg8E,EAAaG,SAAWhiG,KAAK+gD,UAAUjD,QAAQC,UAAUC,MAAO,CAE7D,GAAZn4B,IACFA,EAAW,GAAI5gB,KAAKE,SACpB2Z,EAAK+G,EAEP,IAAI05E,GAAev/F,KAAK+gD,UAAUjD,QAAQC,UAAUE,sBAAwB4jD,EAAaplD,KAAOsI,EAAKh2C,QAAQ0tC,MAAQ52B,EAAWA,EAAWA,GACvI+yC,EAAK95C,EAAKygF,EACV1mC,EAAK95C,EAAKwgF,CACdx6C,GAAK6T,IAAMA,EACX7T,EAAK8T,IAAMA,MAIX,IAAkC,GAA9BgpC,EAAaC,cACf9hG,KAAKuhG,sBAAsBM,EAAaL,SAASC,GAAG18C,GACpD/kD,KAAKuhG,sBAAsBM,EAAaL,SAASE,GAAG38C,GACpD/kD,KAAKuhG,sBAAsBM,EAAaL,SAASG,GAAG58C,GACpD/kD,KAAKuhG,sBAAsBM,EAAaL,SAASI,GAAG78C,OAGpD,IAAI88C,EAAaL,SAASxuF,KAAK3S,IAAM0kD,EAAK1kD,GAAI,CAE5B,GAAZwlB,IACFA,EAAW,GAAI5gB,KAAKE,SACpB2Z,EAAK+G,EAEP,IAAI05E,GAAev/F,KAAK+gD,UAAUjD,QAAQC,UAAUE,sBAAwB4jD,EAAaplD,KAAOsI,EAAKh2C,QAAQ0tC,MAAQ52B,EAAWA,EAAWA,GACvI+yC,EAAK95C,EAAKygF,EACV1mC,EAAK95C,EAAKwgF,CACdx6C,GAAK6T,IAAMA,EACX7T,EAAK8T,IAAMA,KAcrBj5D,EAAQ0hG,mBAAqB,SAAS9kD,EAAM0G,GAU1C,IAAK,GATD6B,GACAs8C,EAAYn+C,EAAYx9C,OAExBw/C,EAAOjhD,OAAOg+F,UAChBj9C,EAAO/gD,OAAOg+F,UACd98C,GAAOlhD,OAAOg+F,UACdh9C,GAAOhhD,OAAOg+F,UAGP18F,EAAI,EAAO87F,EAAJ97F,EAAeA,IAAK,CAClC,GAAI8M,GAAImqC,EAAM0G,EAAY39C,IAAI8M,EAC1BC,EAAIkqC,EAAM0G,EAAY39C,IAAI+M,CAC1BkqC,GAAM0G,EAAY39C,IAAIwJ,QAAQ0tC,KAAO,IAC/ByI,EAAJ7yC,IAAY6yC,EAAO7yC,GACnBA,EAAI8yC,IAAQA,EAAO9yC,GACf2yC,EAAJ1yC,IAAY0yC,EAAO1yC,GACnBA,EAAI2yC,IAAQA,EAAO3yC,IAI3B,GAAI4vF,GAAWj9F,KAAK8lB,IAAIo6B,EAAOD,GAAQjgD,KAAK8lB,IAAIk6B,EAAOD,EACnDk9C,GAAW,GAAIl9C,GAAQ,GAAMk9C,EAAUj9C,GAAQ,GAAMi9C,IACtCh9C,GAAQ,GAAMg9C,EAAU/8C,GAAQ,GAAM+8C,EAGzD,IAAIC,GAAkB,KAClBC,EAAWn9F,KAAKiI,IAAIi1F,EAAgBl9F,KAAK8lB,IAAIo6B,EAAOD,IACpDm9C,EAAe,GAAMD,EACrBE,EAAU,IAAOp9C,EAAOC,GAAOo9C,EAAU,IAAOv9C,EAAOC,GAGvD45C,GACFn/F,MACEqiG,cAAe1vF,EAAE,EAAGC,EAAE,GACtBmqC,KAAK,EACLzmB,OACEkvB,KAAMo9C,EAAQD,EAAal9C,KAAKm9C,EAAQD,EACxCr9C,KAAMu9C,EAAQF,EAAap9C,KAAKs9C,EAAQF,GAE1C1vF,KAAMyvF,EACNJ,SAAU,EAAII,EACdZ,UAAYxuF,KAAK,MACjBoqD,SAAU,EACVlgB,MAAO,EACP4kD,cAAe,GAMnB,KAHA9hG,KAAKwiG,aAAa3D,EAAcn/F,MAG3B6F,EAAI,EAAO87F,EAAJ97F,EAAeA,IACzBw/C,EAAOvI,EAAM0G,EAAY39C,IACrBw/C,EAAKh2C,QAAQ0tC,KAAO,GACtBz8C,KAAKyiG,aAAa5D,EAAcn/F,KAAKqlD,EAKzC/kD;KAAK6+F,cAAgBA,GAWvBj/F,EAAQ8iG,kBAAoB,SAASb,EAAc98C,GACjD,GAAI49C,GAAYd,EAAaplD,KAAOsI,EAAKh2C,QAAQ0tC,KAC7CmmD,EAAe,EAAED,CAErBd,GAAaE,aAAa1vF,EAAIwvF,EAAaE,aAAa1vF,EAAIwvF,EAAaplD,KAAOsI,EAAK1yC,EAAI0yC,EAAKh2C,QAAQ0tC,KACtGolD,EAAaE,aAAa1vF,GAAKuwF,EAE/Bf,EAAaE,aAAazvF,EAAIuvF,EAAaE,aAAazvF,EAAIuvF,EAAaplD,KAAOsI,EAAKzyC,EAAIyyC,EAAKh2C,QAAQ0tC,KACtGolD,EAAaE,aAAazvF,GAAKswF,EAE/Bf,EAAaplD,KAAOkmD,CACpB,IAAIE,GAAc59F,KAAKiI,IAAIjI,KAAKiI,IAAI63C,EAAKjyC,OAAOiyC,EAAKn5B,QAAQm5B,EAAKlyC,MAClEgvF,GAAazkC,SAAYykC,EAAazkC,SAAWylC,EAAeA,EAAchB,EAAazkC,UAa7Fx9D,EAAQ6iG,aAAe,SAASZ,EAAa98C,EAAK+9C,IAC1B,GAAlBA,GAA6Cv8F,SAAnBu8F,IAE5B9iG,KAAK0iG,kBAAkBb,EAAa98C,GAGlC88C,EAAaL,SAASC,GAAGzrE,MAAMmvB,KAAOJ,EAAK1yC,EACzCwvF,EAAaL,SAASC,GAAGzrE,MAAMivB,KAAOF,EAAKzyC,EAC7CtS,KAAK+iG,eAAelB,EAAa98C,EAAK,MAGtC/kD,KAAK+iG,eAAelB,EAAa98C,EAAK,MAIpC88C,EAAaL,SAASC,GAAGzrE,MAAMivB,KAAOF,EAAKzyC,EAC7CtS,KAAK+iG,eAAelB,EAAa98C,EAAK,MAGtC/kD,KAAK+iG,eAAelB,EAAa98C,EAAK,OAc5CnlD,EAAQmjG,eAAiB,SAASlB,EAAa98C,EAAKi+C,GAClD,OAAQnB,EAAaL,SAASwB,GAAQlB,eACpC,IAAK,GACHD,EAAaL,SAASwB,GAAQxB,SAASxuF,KAAO+xC,EAC9C88C,EAAaL,SAASwB,GAAQlB,cAAgB,EAC9C9hG,KAAK0iG,kBAAkBb,EAAaL,SAASwB,GAAQj+C,EACrD,MACF,KAAK,GAGC88C,EAAaL,SAASwB,GAAQxB,SAASxuF,KAAKX,GAAK0yC,EAAK1yC,GACtDwvF,EAAaL,SAASwB,GAAQxB,SAASxuF,KAAKV,GAAKyyC,EAAKzyC,GACxDyyC,EAAK1yC,GAAKpN,KAAKE,SACf4/C,EAAKzyC,GAAKrN,KAAKE,WAGfnF,KAAKwiG,aAAaX,EAAaL,SAASwB,IACxChjG,KAAKyiG,aAAaZ,EAAaL,SAASwB,GAAQj+C,GAElD,MACF,KAAK,GACH/kD,KAAKyiG,aAAaZ,EAAaL,SAASwB,GAAQj+C,KAatDnlD,EAAQ4iG,aAAe,SAASX,GAE9B,GAAIoB,GAAgB,IACc,IAA9BpB,EAAaC,gBACfmB,EAAgBpB,EAAaL,SAASxuF,KACtC6uF,EAAaplD,KAAO,EAAGolD,EAAaE,aAAa1vF,EAAI,EAAGwvF,EAAaE,aAAazvF,EAAI,GAExFuvF,EAAaC,cAAgB,EAC7BD,EAAaL,SAASxuF,KAAO,KAC7BhT,KAAKkjG,cAAcrB,EAAa,MAChC7hG,KAAKkjG,cAAcrB,EAAa,MAChC7hG,KAAKkjG,cAAcrB,EAAa,MAChC7hG,KAAKkjG,cAAcrB,EAAa,MAEX,MAAjBoB,GACFjjG,KAAKyiG,aAAaZ,EAAaoB,IAenCrjG,EAAQsjG,cAAgB,SAASrB,EAAcmB,GAC7C,GAAI99C,GAAKC,EAAKH,EAAKC,EACfk+C,EAAY,GAAMtB,EAAalvF,IACnC,QAAQqwF,GACN,IAAK,KACH99C,EAAO28C,EAAa7rE,MAAMkvB,KAC1BC,EAAO08C,EAAa7rE,MAAMkvB,KAAOi+C,EACjCn+C,EAAO68C,EAAa7rE,MAAMgvB,KAC1BC,EAAO48C,EAAa7rE,MAAMgvB,KAAOm+C,CACjC,MACF,KAAK,KACHj+C,EAAO28C,EAAa7rE,MAAMkvB,KAAOi+C,EACjCh+C,EAAO08C,EAAa7rE,MAAMmvB,KAC1BH,EAAO68C,EAAa7rE,MAAMgvB,KAC1BC,EAAO48C,EAAa7rE,MAAMgvB,KAAOm+C,CACjC,MACF,KAAK,KACHj+C,EAAO28C,EAAa7rE,MAAMkvB,KAC1BC,EAAO08C,EAAa7rE,MAAMkvB,KAAOi+C,EACjCn+C,EAAO68C,EAAa7rE,MAAMgvB,KAAOm+C,EACjCl+C,EAAO48C,EAAa7rE,MAAMivB,IAC1B,MACF,KAAK,KACHC,EAAO28C,EAAa7rE,MAAMkvB,KAAOi+C,EACjCh+C,EAAO08C,EAAa7rE,MAAMmvB,KAC1BH,EAAO68C,EAAa7rE,MAAMgvB,KAAOm+C,EACjCl+C,EAAO48C,EAAa7rE,MAAMivB,KAK9B48C,EAAaL,SAASwB,IACpBjB,cAAc1vF,EAAE,EAAEC,EAAE,GACpBmqC,KAAK,EACLzmB,OAAOkvB,KAAKA,EAAKC,KAAKA,EAAKH,KAAKA,EAAKC,KAAKA,GAC1CtyC,KAAM,GAAMkvF,EAAalvF,KACzBqvF,SAAU,EAAIH,EAAaG,SAC3BR,UAAWxuF,KAAK,MAChBoqD,SAAU,EACVlgB,MAAO2kD,EAAa3kD,MAAM,EAC1B4kD,cAAe,IAYnBliG,EAAQwjG,UAAY,SAASn8E,EAAIpc,GACJtE,SAAvBvG,KAAK6+F,gBAEP53E,EAAIO,UAAY,EAEhBxnB,KAAKqjG,YAAYrjG,KAAK6+F,cAAcn/F,KAAKunB,EAAIpc,KAajDjL,EAAQyjG,YAAc,SAASC,EAAOr8E,EAAIpc,GAC1BtE,SAAVsE,IACFA,EAAQ,WAGkB,GAAxBy4F,EAAOxB,gBACT9hG,KAAKqjG,YAAYC,EAAO9B,SAASC,GAAGx6E,GACpCjnB,KAAKqjG,YAAYC,EAAO9B,SAASE,GAAGz6E,GACpCjnB,KAAKqjG,YAAYC,EAAO9B,SAASI,GAAG36E,GACpCjnB,KAAKqjG,YAAYC,EAAO9B,SAASG,GAAG16E,IAEtCA,EAAIY,YAAchd,EAClBoc,EAAIa,YACJb,EAAIc,OAAOu7E,EAAOttE,MAAMkvB,KAAKo+C,EAAOttE,MAAMgvB,MAC1C/9B,EAAIe,OAAOs7E,EAAOttE,MAAMmvB,KAAKm+C,EAAOttE,MAAMgvB,MAC1C/9B,EAAIlH,SAEJkH,EAAIa,YACJb,EAAIc,OAAOu7E,EAAOttE,MAAMmvB,KAAKm+C,EAAOttE,MAAMgvB,MAC1C/9B,EAAIe,OAAOs7E,EAAOttE,MAAMmvB,KAAKm+C,EAAOttE,MAAMivB,MAC1Ch+B,EAAIlH,SAEJkH,EAAIa,YACJb,EAAIc,OAAOu7E,EAAOttE,MAAMmvB,KAAKm+C,EAAOttE,MAAMivB,MAC1Ch+B,EAAIe,OAAOs7E,EAAOttE,MAAMkvB,KAAKo+C,EAAOttE,MAAMivB,MAC1Ch+B,EAAIlH,SAEJkH,EAAIa,YACJb,EAAIc,OAAOu7E,EAAOttE,MAAMkvB,KAAKo+C,EAAOttE,MAAMivB,MAC1Ch+B,EAAIe,OAAOs7E,EAAOttE,MAAMkvB,KAAKo+C,EAAOttE,MAAMgvB,MAC1C/9B,EAAIlH,WAaF,SAASlgB,GAEbA,EAAOD,QAAU,SAASC,GAQzB,MAPIA,GAAO0jG,kBACV1jG,EAAO6tE,UAAY,aACnB7tE,EAAO2jG,SAEP3jG,EAAO2hG,YACP3hG,EAAO0jG,gBAAkB,GAEnB1jG"} \ No newline at end of file +{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DateUtil","DataStep","Range","stack","TimeStep","components","items","Item","BackgroundItem","BoxItem","PointItem","RangeItem","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","BackgroundGroup","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","cssUtil","cssText","styles","style","trim","parts","keys","map","addCssText","currentStyles","newStyles","removeCssText","removeStyles","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearchCustom","orderedItems","searchFunction","field","field2","maxIterations","iteration","low","high","middle","item","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easeInOutQuad","start","end","duration","change","easingFunctions","linear","easeInQuad","easeOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","insertBefore","createElement","drawPoint","x","y","group","point","drawPoints","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","setOptions","prototype","queue","_queue","destroy","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","col","cols","getValue","update","updatedIds","updatedData","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","args","fn","context","entry","clearTimeout","setTimeout","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","passValueFn","xValueLabel","yValueLabel","zValueLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","mouseX","mouseY","tooltipTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","log","LN10","step1","pow","step2","step5","toPrecision","getStep","groups","forthArgument","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","hiddenDates","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","range","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setGroups","setItems","Core","newDataSet","initialLoad","dataRange","_getDataRange","setWindow","animate","fit","setSelection","focus","getSelection","itemData","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","visibility","convertHiddenOptions","repeat","dateItem","updateHiddenDates","centerContainer","totalRange","pixelTime","startDate","endDate","_d","runUntil","clone","day","dayOfYear","year","dayOffset","date","month","console","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","startToFront","endToFront","_applyRange","safeDates","printDates","dates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","current","newValue","switchedYear","switchedMonth","switchedDay","time","conversion","getHiddenDurationBetween","correctTimeForHidden","hiddenDuration","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","getHiddenDurationBefore","timeOffset","requiredDuration","previousPoint","snapAwayFromHidden","direction","correctionEnabled","minimumStep","containerHeight","customRange","alignZeros","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","decimals","slice","exp","cnt","isMajor","now","hours","minutes","seconds","milliseconds","deltaDifference","scaleOffset","moveable","zoomable","zoomMin","zoomMax","touch","animateTimer","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","dragging","initTime","done","initStart","initEnd","changed","anyChanged","_cancelAnimation","newStart","newEnd","getRange","totalHidden","previousDelta","allowDragging","gesture","deltaX","deltaY","diffRange","safeStart","safeEnd","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","hiddenDurationBefore","hiddenDurationAfter","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","subgroups","newTop","subgroup","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","getLabelMinor","format","getLabelMajor","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","currentTimeTimer","setCurrentTime","getCurrentTime","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","stopPropagation","svg","linegraphOptions","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","zeroCrossing","lineOffset","master","svgElements","iconsRemoved","amountOfGroups","lineContainer","scrollTop","addGroup","graphOptions","updateGroup","removeGroup","hide","show","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","_cleanupIcons","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","_redrawTitle","amountOfSteps","stepDifference","zeroStepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","textTitle","measureCharTitle","titleCharWidth","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","Line","Bar","Points","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","getYRange","groupData","draw","framework","subgroupIndex","subgroupOrderer","subgroupOrder","visibleItems","byStart","byEnd","checkRangedItems","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","_calculateHeight","offsetTop","offsetLeft","ii","repositionY","resetSubgroups","labelSet","setParent","orderSubgroups","_checkIfVisible","sortArray","sortField","removeFromDataSet","removeItem","startArray","endArray","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","repositionX","initialPos","breakCondition","isVisible","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","onMoving","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","UNGROUPED","BACKGROUND","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","_order","getGroups","_getType","_removeItem","groupOptions","oldGroupId","oldGroup","_constructByEndArray","itemFromTarget","selected","dragLeftItem","dragRightItem","initialX","itemProps","newProps","initial","groupFromTarget","_updateItemProps","_moveToGroup","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","_getItemRange","_item","itemSetFromTarget","side","iconSize","iconSpacing","textArea","scrollableHeight","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","autoSizeSVG","lastStart","_updateGraph","BarGraphFunctions","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","rangePerPixelInv","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","dataContainer","guess","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedDataLeft","barCombinedDataRight","getStackedBarYRange","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","ignore","_toggleAxisVisiblity","drawIcons","axisUsed","datapoints","xValue","yValue","extractedData","svgHeight","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","_updateContents","template","_updateTitle","removeAttribute","_updateDataAttributes","dataAttributes","attributes","setAttribute","_updateStyle","emptyContent","baseClassName","onTop","itemSubgroup","itemSetHeight","marginLeft","maxWidth","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fontColor","fontSize","fontFace","fontFill","level","highlightColor","borderWidthSelected","edges","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","layout","freezeForStabilization","smoothCurves","dynamic","roundness","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","pixelRatio","hoverObj","controlNodesActive","navigationHammers","existing","new","animationSpeed","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","startedStabilization","stabilized","draggingNodes","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","keycharm","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","animationOptions","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","animation","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_resetLevels","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","pinch","_onTap","_onDoubleTap","_onMouseMoveTitle","hammerFrame","_onRelease","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","nodeIds","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","releaseNode","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleDragEnd","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","emitEvent","oldWidth","oldHeight","oldNodesData","_updateSelection","angle","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","changedData","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","dynamicEdges","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","mainMovingStatus","supportMovingStatus","_doInAllActiveSectors","mainMoving","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","iterations","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","storePositions","dataArray","allowedToMoveX","allowedToMoveY","getPositions","focusOnNode","nodePosition","lockedOnNode","easingFunction","animateView","locked","_transitionRedraw","viewCenter","distanceFromCenter","_classicRedraw","_lockedRedraw","active","getScale","getCenterCoordinates","networkConstants","fromId","toId","widthSelected","labelDimensions","yLine","dirtyLabel","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","lineCount","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","brokenUrl","img","Image","onload","onerror","imagelist","grouplist","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","hierarchyEnumerated","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","brokenImage","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_redrawTimer","listeners","events","scrollTopMin","redrawCount","_initAutoResize","component","_stopAutoResize","what","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","MAX_REDRAWS","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","_catmullRom","_linear","dFill","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","Bargraph","barCombinedData","coreDistance","drawData","combinedData","intersections","barPoints","_getDataIntersections","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","accumulated","groupLabel","_getStackedBarYRange","xpos","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_bound","keydown","keyup","_keys","fromCharCode","code","down","handleEvent","up","keyCode","bound","bindAll","getKey","newBindings","global","dfl","hasOwnProp","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","printMsg","msg","suppressDeprecationWarnings","warn","deprecate","firstTime","deprecateSimple","deprecations","padToken","func","leftZeroFill","ordinalizeToken","period","localeData","ordinal","Locale","Moment","config","skipOverflow","checkOverflow","copyConfig","Duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","weeks","week","days","hour","minute","second","millisecond","_milliseconds","_days","_months","_locale","_bubble","val","_isAMomentObject","_i","_f","_l","_strict","_tzm","_isUTC","_offset","_pf","momentProperties","absRound","number","targetLength","forceSign","output","positiveMomentsDifference","base","res","isAfter","momentsDifference","makeAs","isBefore","createAdder","dur","tmp","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","DATE","_overflowDayOfYear","isValid","_isValid","getTime","bigHour","normalizeLocale","chooseLocale","names","loadLocale","oldLocale","hasModule","model","local","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_meridiemParse","parseTokenOffsetMs","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","_ordinalParse","_ordinalParseLenient","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","_nextDay","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","getUTCFullYear","makeDateFromStringAndFormat","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","posNegDuration","relativeTimeThresholds","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","dayOfMonth","unit","makeAccessor","keepTime","daysToYears","yearsToDays","makeDurationGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","dd","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","zone","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_longMonthsParse","_shortMonthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LTS","LT","L","LL","LLL","LLLL","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","diffRes","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","defineLocale","_abbr","abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","keepLocalTime","_dateTzOffset","inputString","asFloat","daysAdjust","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","inputMs","isSame","localAdjust","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","newLocaleData","getTimezoneOffset","isoWeeks","toJSON","withSuffix","toIsoString","asSeconds","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","ordinalParse","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","returnValues","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","overrideSelectable","DOM","_manipulationReleaseOverload","_navigationReleaseOverload","getSelectedNodes","edgeIds","getSelectedEdges","idArray","selectNodes","RangeError","selectEdges","_clearManipulatorBar","manipulationDOM","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","_createAddNodeToolbar","_createAddEdgeToolbar","_editNode","_createEditEdgeToolbar","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","supportNodes","targetNode","connectionEdge","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","navigationDivs","navigationDivActions","_stopMovement","_zoomExtent","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","_determineLevelsDirected","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","_setLevelDirected","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","dynamicSmoothCurves","nameArray","webpackContext","req","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file diff --git a/dist/vis.min.css b/dist/vis.min.css index dc3c1ece..dfb42f12 100644 --- a/dist/vis.min.css +++ b/dist/vis.min.css @@ -1 +1 @@ -.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}.vis.timeline.root{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right,.vis.timeline .vispanel.top{border:1px #bfbfbf}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.top{border-left-style:solid;border-right-style:solid}.vis.timeline .background{overflow:hidden}.vis.timeline .vispanel>.content{position:relative}.vis.timeline .vispanel .shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis.timeline .vispanel .shadow.top{top:-1px;left:0}.vis.timeline .vispanel .shadow.bottom{bottom:-1px;left:0}.vis.timeline .labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel:last-child{border-bottom:none}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .labelset .vlabel .inner.hidden{padding:0}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .itemset .background,.vis.timeline .itemset .foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis.timeline .axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis.timeline .foreground .group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .foreground .group:last-child{border-bottom:none}.vis.timeline .item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#FFC200;background-color:#FFF785;z-index:2}.vis.timeline .editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#FFF785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0 0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range{border-style:solid;border-radius:2px;box-sizing:border-box;overflow:hidden}.vis.timeline .item.background{overflow:hidden;border:none;background-color:rgba(213,221,246,.4);box-sizing:border-box;padding:0;margin:0}.vis.timeline .item.range .content{position:relative;display:inline-block;overflow:hidden}.vis.timeline .item.background .content{position:absolute;display:inline-block;overflow:hidden;max-width:100%;margin:5px}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(img/timeline/delete.png) top center no-repeat;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize}.vis.timeline .item.range .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize}.vis.timeline .timeaxis{position:relative;overflow:hidden}.vis.timeline .timeaxis.foreground{top:0;left:0;width:100%}.vis.timeline .timeaxis.background{position:absolute;top:0;left:0;width:100%;height:100%}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;width:0;border-right:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#FF7F6E;width:2px;z-index:1}.vis.timeline .customtime{background-color:#6E94FF;width:2px;cursor:move;z-index:1}.vis.timeline .vispanel.background.horizontal .grid.horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis.timeline .vispanel.background.horizontal .grid.minor{border-color:#e5e5e5}.vis.timeline .vispanel.background.horizontal .grid.major{border-color:#bfbfbf}.vis.timeline .dataaxis .yAxis.major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis.timeline .dataaxis .yAxis.major.measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis.timeline .dataaxis .yAxis.minor.measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis.timeline .dataaxis .yAxis.title.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.title.left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis.timeline .dataaxis .yAxis.title.right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis.timeline .legend{background-color:rgba(247,252,255,.65);padding:5px;border-color:#b3b3b3;border-style:solid;border-width:1px;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis.timeline .legendText{white-space:nowrap;display:inline-block}.vis.timeline .graphGroup0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis.timeline .graphGroup1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis.timeline .graphGroup2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis.timeline .graphGroup3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis.timeline .graphGroup4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis.timeline .graphGroup5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis.timeline .graphGroup6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis.timeline .graphGroup7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis.timeline .graphGroup8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis.timeline .graphGroup9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis.timeline .fill{fill-opacity:.1;stroke:none}.vis.timeline .bar{fill-opacity:.5;stroke-width:1px}.vis.timeline .point{stroke-width:2px;fill-opacity:1}.vis.timeline .legendBackground{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis.timeline .outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis.timeline .iconFill{fill-opacity:.3;stroke:none}div.network-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0);position:absolute;left:0;top:0;width:100%;height:30px}div.network-manipulation-editMode{position:absolute;left:0;top:0;height:30px;margin-top:20px}div.network-manipulation-closeDiv{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-manipulation-closeDiv:hover{opacity:.6}span.network-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}span.network-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}span.network-manipulationUI.back{background-image:url(img/network/backIcon.png)}span.network-manipulationUI.none:hover{box-shadow:1px 1px 8px transparent;cursor:default}span.network-manipulationUI.none:active{box-shadow:1px 1px 8px transparent}span.network-manipulationUI.none{padding:0}span.network-manipulationUI.notification{margin:2px;font-weight:700}span.network-manipulationUI.add{background-image:url(img/network/addNodeIcon.png)}span.network-manipulationUI.edit{background-image:url(img/network/editIcon.png)}span.network-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.network-manipulationUI.connect{background-image:url(img/network/connectIcon.png)}span.network-manipulationUI.delete{background-image:url(img/network/deleteIcon.png)}span.network-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.network-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.network-navigation_wrapper{position:absolute;left:0;top:0;width:100%;height:100%}div.network-navigation{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.network-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.network-navigation.up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.network-navigation.down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.network-navigation.left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.network-navigation.right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.network-navigation.zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.network-navigation.zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.network-navigation.zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px} \ No newline at end of file +.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}.vis.timeline.root{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right,.vis.timeline .vispanel.top{border:1px #bfbfbf}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.top{border-left-style:solid;border-right-style:solid}.vis.timeline .background{overflow:hidden}.vis.timeline .vispanel>.content{position:relative}.vis.timeline .vispanel .shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis.timeline .vispanel .shadow.top{top:-1px;left:0}.vis.timeline .vispanel .shadow.bottom{bottom:-1px;left:0}.vis.timeline .labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel:last-child{border-bottom:none}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .labelset .vlabel .inner.hidden{padding:0}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .itemset .background,.vis.timeline .itemset .foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis.timeline .axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis.timeline .foreground .group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .foreground .group:last-child{border-bottom:none}.vis.timeline .item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#FFC200;background-color:#FFF785;z-index:2}.vis.timeline .editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#FFF785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0 0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis.timeline .item.background{overflow:hidden;border:none;background-color:rgba(213,221,246,.4);box-sizing:border-box;padding:0;margin:0}.vis.timeline .item.range .content{position:relative;display:inline-block;max-width:100%;overflow:hidden}.vis.timeline .item.background .content{position:absolute;display:inline-block;overflow:hidden;max-width:100%;margin:5px}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(img/timeline/delete.png) top center no-repeat;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize}.vis.timeline .item.range .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize}.vis.timeline .timeaxis{position:relative;overflow:hidden}.vis.timeline .timeaxis.foreground{top:0;left:0;width:100%}.vis.timeline .timeaxis.background{position:absolute;top:0;left:0;width:100%;height:100%}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;width:0;border-right:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#FF7F6E;width:2px;z-index:1}.vis.timeline .customtime{background-color:#6E94FF;width:2px;cursor:move;z-index:1}.vis.timeline .vispanel.background.horizontal .grid.horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis.timeline .vispanel.background.horizontal .grid.minor{border-color:#e5e5e5}.vis.timeline .vispanel.background.horizontal .grid.major{border-color:#bfbfbf}.vis.timeline .dataaxis .yAxis.major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis.timeline .dataaxis .yAxis.major.measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis.timeline .dataaxis .yAxis.minor.measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis.timeline .dataaxis .yAxis.title.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.title.left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis.timeline .dataaxis .yAxis.title.right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis.timeline .legend{background-color:rgba(247,252,255,.65);padding:5px;border-color:#b3b3b3;border-style:solid;border-width:1px;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis.timeline .legendText{white-space:nowrap;display:inline-block}.vis.timeline .graphGroup0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis.timeline .graphGroup1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis.timeline .graphGroup2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis.timeline .graphGroup3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis.timeline .graphGroup4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis.timeline .graphGroup5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis.timeline .graphGroup6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis.timeline .graphGroup7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis.timeline .graphGroup8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis.timeline .graphGroup9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis.timeline .fill{fill-opacity:.1;stroke:none}.vis.timeline .bar{fill-opacity:.5;stroke-width:1px}.vis.timeline .point{stroke-width:2px;fill-opacity:1}.vis.timeline .legendBackground{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis.timeline .outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis.timeline .iconFill{fill-opacity:.3;stroke:none}div.network-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0);position:absolute;left:0;top:0;width:100%;height:30px}div.network-manipulation-editMode{position:absolute;left:0;top:0;height:30px;margin-top:20px}div.network-manipulation-closeDiv{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-manipulation-closeDiv:hover{opacity:.6}span.network-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}span.network-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}span.network-manipulationUI.back{background-image:url(img/network/backIcon.png)}span.network-manipulationUI.none:hover{box-shadow:1px 1px 8px transparent;cursor:default}span.network-manipulationUI.none:active{box-shadow:1px 1px 8px transparent}span.network-manipulationUI.none{padding:0}span.network-manipulationUI.notification{margin:2px;font-weight:700}span.network-manipulationUI.add{background-image:url(img/network/addNodeIcon.png)}span.network-manipulationUI.edit{background-image:url(img/network/editIcon.png)}span.network-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.network-manipulationUI.connect{background-image:url(img/network/connectIcon.png)}span.network-manipulationUI.delete{background-image:url(img/network/deleteIcon.png)}span.network-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.network-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.network-navigation_wrapper{position:absolute;left:0;top:0;width:100%;height:100%}div.network-navigation{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.network-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.network-navigation.up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.network-navigation.down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.network-navigation.left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.network-navigation.right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.network-navigation.zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.network-navigation.zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.network-navigation.zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index da3f979a..975a5b3c 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -4,8 +4,8 @@ * * A dynamic, browser-based visualization library. * - * @version 3.7.1-SNAPSHOT - * @date 2014-11-25 + * @version 3.7.1 + * @date 2014-11-28 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -26,14 +26,14 @@ if(i=t.get(),0!=i.length){this.dataSet=t,this.dataTable=i,this._onChange=function(){e.setData(e.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z",this.colValue="style",this.colFilter="filter",i[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new c(t,this.colFilter,this),this.dataFilter.setOnLoadCallback(function(){e.redraw()}));var o=this.style==s.STYLE.BAR||this.style==s.STYLE.BARCOLOR||this.style==s.STYLE.BARSIZE;if(o){if(void 0!==this.defaultXBarWidth)this.xBarWidth=this.defaultXBarWidth;else{var a=this.getDistinctValues(i,this.colX);this.xBarWidth=a[1]-a[0]||1}if(void 0!==this.defaultYBarWidth)this.yBarWidth=this.defaultYBarWidth;else{var h=this.getDistinctValues(i,this.colY);this.yBarWidth=h[1]-h[0]||1}}var d=this.getColumnRange(i,this.colX);o&&(d.min-=this.xBarWidth/2,d.max+=this.xBarWidth/2),this.xMin=void 0!==this.defaultXMin?this.defaultXMin:d.min,this.xMax=void 0!==this.defaultXMax?this.defaultXMax:d.max,this.xMax<=this.xMin&&(this.xMax=this.xMin+1),this.xStep=void 0!==this.defaultXStep?this.defaultXStep:(this.xMax-this.xMin)/5;var l=this.getColumnRange(i,this.colY);o&&(l.min-=this.yBarWidth/2,l.max+=this.yBarWidth/2),this.yMin=void 0!==this.defaultYMin?this.defaultYMin:l.min,this.yMax=void 0!==this.defaultYMax?this.defaultYMax:l.max,this.yMax<=this.yMin&&(this.yMax=this.yMin+1),this.yStep=void 0!==this.defaultYStep?this.defaultYStep:(this.yMax-this.yMin)/5;var p=this.getColumnRange(i,this.colZ);if(this.zMin=void 0!==this.defaultZMin?this.defaultZMin:p.min,this.zMax=void 0!==this.defaultZMax?this.defaultZMax:p.max,this.zMax<=this.zMin&&(this.zMax=this.zMin+1),this.zStep=void 0!==this.defaultZStep?this.defaultZStep:(this.zMax-this.zMin)/5,void 0!==this.colValue){var u=this.getColumnRange(i,this.colValue);this.valueMin=void 0!==this.defaultValueMin?this.defaultValueMin:u.min,this.valueMax=void 0!==this.defaultValueMax?this.defaultValueMax:u.max,this.valueMax<=this.valueMin&&(this.valueMax=this.valueMin+1)}this._setScale()}}},s.prototype._getDataPoints=function(t){function e(t,e){return t-e}var i,o,n,r,a,d,l=[];if(this.style===s.STYLE.GRID||this.style===s.STYLE.SURFACE){var c=[],p=[];for(n=0;nt;t++){var f=(t-p)/(m-p),g=240*f,v=this._hsv2rgb(g,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new u(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new h(x,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+this.xValueLabel(i.getCurrent())+" ",o.x,o.y),i.next()}for(g.lineWidth=1,s=void 0===this.defaultYStep,i=new u(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new h(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+this.yValueLabel(i.getCurrent())+" ",o.x,o.y),i.next();for(g.lineWidth=1,s=void 0===this.defaultZStep,i=new u(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(n,r,i.getCurrent())),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(t.x-b,t.y),g.stroke(),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(this.zValueLabel(i.getCurrent())+" ",t.x-5,t.y),i.next();g.lineWidth=1,t=this._convert3Dto2D(new h(n,r,this.zMin)),e=this._convert3Dto2D(new h(n,r,this.zMax)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),g.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(m.x,m.y),g.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(m.x,m.y),g.stroke(),g.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(l=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(S,o.x,o.y));var D=this.zLabel;D.length>0&&(d=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new h(n,r,a)),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(D,o.x-d,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,d,l,c,p,u,m,f=this.frame.canvas,g=f.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(m=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(m-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/D/2,1),a=this._hsv2rgb(c,p,u),d=a):(u=1,a=this._hsv2rgb(c,p,u),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,g.lineWidth=l,g.fillStyle=a,g.strokeStyle=d,g.beginPath(),g.moveTo(t.screen.x,t.screen.y),g.lineTo(e.screen.x,e.screen.y),g.lineTo(o.screen.x,o.screen.y),g.lineTo(i.screen.x,i.screen.y),g.closePath(),g.fill(),g.stroke()}}else for(n=0;np&&(p=0);var u,m,f;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),m=this._hsv2rgb(u,1,1),f=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(m=this.colorDot,f=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),m=this._hsv2rgb(u,1,1),f=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=f,i.fillStyle=m,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},a.addEventListener(document,"mousemove",e.onmousemove),a.addEventListener(document,"mouseup",e.onmouseup),a.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,o=this.startArmRotation.vertical+i/200,n=4,r=Math.sin(n/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var l=n.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var p=l[c],u=p.corners,m=[u[0].screen,u[1].screen,u[2].screen],f=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,m)||this._insideTriangle(h,f))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t,e,i){var s=i(10);Camera=function(){this.armLocation=new s,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new s,this.cameraRotation=new s(.5*Math.PI,0,0),this.calculateCameraOrientation()},Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},Camera.prototype.getArmLength=function(){return this.armLength},Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=Camera},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column },s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i,r){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof n)&&i instanceof Object){var h=r;r=i,i=h}var u=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{snap:null,toScreen:u._toScreen.bind(u),toGlobalScreen:u._toGlobalScreen.bind(u),toTime:u._toTime.bind(u),toGlobalTime:u._toGlobalTime.bind(u)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,r&&this.setOptions(r),i&&this.setGroups(i),e?this.setItems(e):this.redraw()}var o=(i(56),i(45),i(1)),n=i(3),r=i(4),a=i(17),h=i(46),d=i(30),l=i(21),c=i(22),p=i(27);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){if(void 0==this.options.start||void 0==this.options.end)var s=this._getDataRange();var o=void 0!=this.options.start?this.options.start:s.start,a=void 0!=this.options.end?this.options.end:s.end;this.setWindow(o,a,{animate:!1})}else this.fit({animate:!1})},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],s=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),o=null,n=null;if(s.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===o||o>e)&&(o=e),(null===n||i>n)&&(n=i)}),null!==o&&null!==n){var r=(o+n)/2,a=Math.max(this.range.end-this.range.start,1.1*(n-o)),h=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(r-a/2,r+a/2,h)}}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){function s(t,e,i,s){if(!(Array.isArray(i)||i instanceof n)&&i instanceof Object){var r=s;s=i,i=r}var h=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{snap:null,toScreen:h._toScreen.bind(h),toGlobalScreen:h._toGlobalScreen.bind(h),toTime:h._toTime.bind(h),toGlobalTime:h._toGlobalTime.bind(h)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,s&&this.setOptions(s),i&&this.setGroups(i),e?this.setItems(e):this.redraw()}var o=(i(56),i(45),i(1)),n=i(3),r=i(4),a=i(17),h=i(46),d=i(30),l=i(21),c=i(22),p=i(29);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){var s=void 0!=this.options.start?this.options.start:null,o=void 0!=this.options.end?this.options.end:null;this.setWindow(s,o,{animate:!1})}else this.fit({animate:!1})},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.linegraph.options.groups.visibility[t]||1==this.linegraph.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t,e,i){var s=i(44);e.convertHiddenOptions=function(t,e){if(t.hiddenDates=[],e&&1==Array.isArray(e)){for(var i=0;i=4*a){var p=0,u=n.clone();switch(i[h].repeat){case"daily":d.day()!=l.day()&&(p=1),d.dayOfYear(o.dayOfYear()),d.year(o.year()),d.subtract(7,"days"),l.dayOfYear(o.dayOfYear()),l.year(o.year()),l.subtract(7-p,"days"),u.add(1,"weeks");break;case"weekly":var m=l.diff(d,"days"),f=d.day();d.date(o.date()),d.month(o.month()),d.year(o.year()),l=d.clone(),d.day(f),l.day(f),l.add(m,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),u.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(p=1),d.month(o.month()),d.year(o.year()),d.subtract(1,"months"),l.month(o.month()),l.year(o.year()),l.subtract(1,"months"),l.add(p,"months"),u.add(1,"months");break;case"yearly":d.year()!=l.year()&&(p=1),d.year(o.year()),d.subtract(1,"years"),l.year(o.year()),l.subtract(1,"years"),l.add(p,"years"),u.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}for(;u>d;)switch(t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),i[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(t);var g=e.isHidden(t.range.start,t.hiddenDates),v=e.isHidden(t.range.end,t.hiddenDates),y=t.range.start,b=t.range.end;1==g.hidden&&(y=1==t.range.startToFront?g.startDate-1:g.endDate+1),1==v.hidden&&(b=1==t.range.endToFront?v.startDate-1:v.endDate+1),(1==g.hidden||1==v.hidden)&&t.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],s=0;s=e[s].start&&e[o].end<=e[s].end?e[o].remove=!0:e[o].start>=e[s].start&&e[o].start<=e[s].end?(e[s].end=e[o].end,e[o].remove=!0):e[o].end>=e[s].start&&e[o].end<=e[s].end&&(e[s].start=e[o].start,e[o].remove=!0));for(var s=0;s=r&&a>o){i=!0;break}}if(1==i&&o=e&&i>r&&(s+=r-n)}return s},e.correctTimeForHidden=function(t,i,o){return o=s(o).toDate().valueOf(),o-=e.getHiddenDurationBefore(t,i,o)},e.getHiddenDurationBefore=function(t,e,i){var o=0;i=s(i).toDate().valueOf();for(var n=0;n=e.start&&a=a&&(o+=a-r)}return o},e.getAccumulatedHiddenDuration=function(t,e,i){for(var s=0,o=0,n=e.start,r=0;r=e.start&&h=i)break;s+=h-a}}return s},e.snapAwayFromHidden=function(t,i,s,o){var n=e.isHidden(i,t);return 1==n.hidden?0>s?1==o?n.startDate-(n.endDate-i)-1:n.startDate-1:1==o?n.endDate+(i-n.startDate)+1:n.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=s&&o>t)return{hidden:!0,startDate:s,endDate:o}}return{hidden:!1,startDate:s,endDate:o}}},function(t){function e(t,e,i,s,o,n){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.alignZeros=n,this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,this._start==this._end&&(this._start-=.75,this._end+=1),1==this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,1==this.alignZeros&&(this.marginEnd-this.marginStart)%this.step!=0&&(this.marginEnd+=this.marginEnd%this.step),this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(t){var e=""+Number(this.current).toPrecision(5);if(void 0===t||isNaN(Number(t))){if(-1!=e.indexOf(",")||-1!=e.indexOf("."))for(var i=e.length-1;i>0;i--){if("0"!=e[i]){if("."==e[i]||","==e[i]){e=e.slice(0,i);break}break}e=e.slice(0,i)}}else{var s="",o=e.indexOf("e");if(-1!=o&&(s=e.slice(o),e=e.slice(0,o)),o=Math.max(e.indexOf(","),e.indexOf(".")),-1===o?(0!==t&&(e+="."),o=e.length+t):0!==t&&(o+=t+1),o>e.length)for(var n=o-e.length;n>0;n--)e+="0";else e=e.slice(0,o);e+=s}return e},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add(-3,"days").valueOf(),this.end=i.clone().add(4,"days").valueOf(),this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.animateTimer=null,this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(47),h=i(44),d=i(20),l=i(15);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable","activate","hiddenDates"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e,i){function s(){if(!a.props.touch.dragging){var t=(new Date).valueOf(),e=t-p,i=e>c,f=i||null===o?o:r.easeInOutQuad(e,h,o,c),g=i||null===n?n:r.easeInOutQuad(e,d,n,c);m=a._applyRange(f,g),l.updateHiddenDates(a.body,a.options.hiddenDates),u=u||m,m&&a.body.emitter.emit("rangechange",{start:new Date(a.start),end:new Date(a.end)}),i?u&&a.body.emitter.emit("rangechanged",{start:new Date(a.start),end:new Date(a.end)}):a.animateTimer=setTimeout(s,20)}}var o=void 0!=t?r.convert(t,"Date").valueOf():null,n=void 0!=e?r.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),i){var a=this,h=this.start,d=this.end,c="number"==typeof i?i:500,p=(new Date).valueOf(),u=!1;return s()}var m=this._applyRange(o,n);if(l.updateHiddenDates(this.body,this.options.hiddenDates),m){var f={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",f),this.body.emitter.emit("rangechanged",f)}},s.prototype._cancelAnimation=function(){this.animateTimer&&(clearTimeout(this.animateTimer),this.animateTimer=null)},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return s>=this.start&&s<=this.end||o>=this.start&&o<=this.end||this.start>=s&&this.start<=o||this.end>=s&&this.end<=o||this.body.emitter.emit("checkRangedItems"),this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t,e){return s.conversion(this.start,this.end,t,e)},s.conversion=function(t,e,i,s){return void 0===s&&(s=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-s)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;o(e);var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY;i-=this.deltaDifference;var s=this.props.touch.end-this.props.touch.start,n=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);s-=n;var r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,a=-i/r*s,h=this.props.touch.start+a,d=this.props.touch.end+a,c=l.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0),p=l.snapAwayFromHidden(this.body.hiddenDates,d,this.previousDelta-i,!0);if(c!=h||p!=d)return this.deltaDifference+=i,this.props.touch.start=c,this.props.touch.end=p,void this._onDrag(t);this.previousDelta=i,this._applyRange(h,d),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r,e)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/(t.gesture.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),s=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),o=l.getHiddenDurationBefore(this.body.hiddenDates,this,i),r=s-o,a=i-o+(this.start-(i-o))*e,h=i+r+(this.end-(i+r))*e;this.startToFront=1-e>0?!1:!0,this.endToFront=e-1>0?!1:!0;var d=l.snapAwayFromHidden(this.body.hiddenDates,a,1-e,!0),c=l.snapAwayFromHidden(this.body.hiddenDates,h,e-1,!0);(d!=a||c!=h)&&(this.props.touch.start=d,this.props.touch.end=c,this.scaleOffset=1-t.gesture.scale,a=d,h=c),this.setRange(a,h),this.startToFront=!1,this.endToFront=!0}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var s=this.body.domProps.center.height;return e=this.conversion(s),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e,i){null==e&&(e=(this.start+this.end)/2);var s=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),o=l.getHiddenDurationBefore(this.body.hiddenDates,this,e),n=s-o,r=e-o+(this.start-(e-o))*t,a=e+n+(this.end-(e+n))*t;this.startToFront=i>0?!1:!0,this.endToFront=-i>0?!1:!0;var h=l.snapAwayFromHidden(this.body.hiddenDates,r,i,!0),d=l.snapAwayFromHidden(this.body.hiddenDates,a,-i,!0);(h!=r||d!=a)&&(r=h,a=d),this.setRange(r,a),this.startToFront=!1,this.endToFront=!0},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var o,n;if(s)for(o=0,n=t.length;n>o;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(r.stack&&null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&l.stack&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e,i){var s,o,n;for(s=0,o=t.length;o>s;s++)if(void 0!==t[s].data.subgroup){n=e.axis;for(var r in i)i.hasOwnProperty(r)&&1==i[r].visible&&i[r].indexe.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i,o){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,this.hiddenDates=o,void 0===o&&(this.hiddenDates=[])}var o=i(44),n=i(15);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step); break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.switchedYear=!1,this.scale){case s.SCALE.YEAR:case s.SCALE.MONTH:case s.SCALE.WEEKDAY:case s.SCALE.DAY:case s.SCALE.HOUR:case s.SCALE.MINUTE:case s.SCALE.SECOND:case s.SCALE.MILLISECOND:return!0;default:return!1}else if(1==this.switchedMonth)switch(this.switchedMonth=!1,this.scale){case s.SCALE.WEEKDAY:case s.SCALE.DAY:case s.SCALE.HOUR:case s.SCALE.MINUTE:case s.SCALE.SECOND:case s.SCALE.MILLISECOND:return!0;default:return!1}else if(1==this.switchedDay)switch(this.switchedDay=!1,this.scale){case s.SCALE.MILLISECOND:case s.SCALE.SECOND:case s.SCALE.MINUTE:case s.SCALE.HOUR:return!0;default:return!1}switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var o=i(1),n=i(20),r=i(44),a=i(48);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},s.prototype.setCurrentTime=function(t){var e=o.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},s.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(20),a=i(44),h=i(48);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=n.convert(t,"Date"),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i,s){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}},title:{left:{text:void 0},right:{text:void 0}},format:{left:{decimals:void 0},right:{decimals:void 0}}},this.linegraphOptions=s,this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{},title:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.zeroCrossing=-1,this.lineOffset=0,this.master=!0,this.svgElements={},this.iconsRemoved=!1,this.groups={},this.amountOfGroups=0,this._create();var n=this;this.body.emitter.on("verticalDrag",function(){n.dom.lineContainer.style.top=n.body.domProps.scrollTop+"px"})}var o=i(1),n=i(2),r=i(20),a=i(16);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","customRange","title","format","alignZeros"];o.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.dom.lineContainer.style.position="relative",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){n.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,o=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&(1!=this.groups[r].visible||void 0!==this.linegraphOptions.visibility[r]&&1!=this.linegraphOptions.visibility[r]||(this.groups[r].drawIcon(t,o,this.svgElements,this.svg,e,i),o+=i+s));n.cleanupElements(this.svgElements),this.iconsRemoved=!1},s.prototype._cleanupIcons=function(){0==this.iconsRemoved&&(n.prepareElements(this.svgElements),n.cleanupElements(this.svgElements),this.iconsRemoved=!0)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){0==this.master&&1==this.options.alignZeros&&-1!=this.zeroCrossing&&t>0&&(t=0),this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1,e=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+"px";for(var i in this.groups)this.groups.hasOwnProperty(i)&&(1!=this.groups[i].visible||void 0!==this.linegraphOptions.visibility[i]&&1!=this.linegraphOptions.visibility[i]||e++);if(0==this.amountOfGroups||0==e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var s=this.props,o=this.dom.frame;o.className="dataaxis",this._calculateCharSize();var n=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=a?s.majorCharHeight:0,s.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,s.minorLineHeight=1,s.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,s.majorLineHeight=1,"left"==n?(o.style.top="0",o.style.left="0",o.style.bottom="",o.style.width=this.width+"px",o.style.height=this.height+"px"):(o.style.top="",o.style.bottom="0",o.style.left="0",o.style.width=this.width+"px",o.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(n)}return t},s.prototype._redrawLabels=function(){n.prepareElements(this.DOMelements.lines),n.prepareElements(this.DOMelements.labels);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation],0==this.master&&this.options.alignZeros);this.step=i;var s=(this.dom.frame.offsetHeight-i.deadSpace*(this.dom.frame.offsetHeight/i.marginRange))/((i.marginRange-i.deadSpace)/i.step);this.stepPixels=s;var o=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.dom.frame.offsetHeight/s-o);for(var h=0;.5*r>h;h++)i.previous();if(o=this.height/s,-1!=this.zeroCrossing&&1==this.options.alignZeros){var d=i.marginEnd/i.step-this.zeroCrossing;if(d>0)for(var h=0;d>h;h++)i.next();else if(0>d)for(var h=0;-d>h;h++)i.previous()}}else o+=.25;this.valueAtZero=i.marginEnd;var l,c=0,p=1;void 0!==this.options.format[t]&&(l=this.options.format[t].decimals),this.maxLabelSize=0;for(var u=0;p=0&&this._redrawLabel(u-2,i.getCurrent(l),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(u,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(u,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),1==this.master&&0==i.current&&(this.zeroCrossing=p),p++}this.conversionFactor=0==this.master?u/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var f=0;void 0!==this.options.title[t]&&void 0!==this.options.title[t].text&&(f=this.props.titleCharHeight);var g=1==this.options.icons?Math.max(this.options.iconWidth,f)+this.options.labelOffsetX+15:f+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-g&&1==this.options.visible?(this.width=this.maxLabelSize+g,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+g),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSized;d++){var c=this.visibleItems[d];c.repositionY(e)}return s},s.prototype._calculateHeight=function(t){var e,i=this.visibleItems;this.resetSubgroups();var s=this;if(i.length){var n=i[0].top,r=i[0].top+i[0].height;if(o.forEach(i,function(t){n=Math.min(n,t.top),r=Math.max(r,t.top+t.height),void 0!==t.data.subgroup&&(s.subgroups[t.data.subgroup].height=Math.max(s.subgroups[t.data.subgroup].height,t.height),s.subgroups[t.data.subgroup].visible=!0)}),n>t.axis){var a=n-t.axis;r-=a,o.forEach(i,function(t){t.top-=a})}e=r+t.item.vertical/2}else e=t.axis+t.item.vertical;return e=Math.max(e,this.props.label.height)},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),void 0!==t.data.subgroup&&(void 0===this.subgroups[t.data.subgroup]&&(this.subgroups[t.data.subgroup]={height:0,visible:!1,index:this.subgroupIndex,items:[]},this.subgroupIndex++),this.subgroups[t.data.subgroup].items.push(t)),this.orderSubgroups(),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t=[];if("string"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push({subgroup:e,sortField:this.subgroups[e].items[0].data[this.subgroupOrderer]});t.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push(this.subgroups[e].items[0].data);t.sort(this.subgroupOrderer)}if(t.length>0)for(var i=0;it?-1:l>=t?0:1};if(e.length>0)for(n=0;nl}),1==this.checkRangedItems)for(this.checkRangedItems=!1,n=0;nl})}for(n=0;n=0&&(n=e[r],!o(n));r--)void 0===s[n.id]&&(s[n.id]=!0,i.push(n));for(r=t+1;rs;s++){var n=this.visibleItems[s];n.repositionY(e)}return i},s.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={type:null,orientation:"bottom",align:"auto",stack:!0,groupOrder:null,selectable:!0,editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},onMoving:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5},this.options=n.extend({},this.defaultOptions),this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.stackDirty=!0,this.touchParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(3),a=i(4),h=i(20),d=i(25),l=i(26),c=i(33),p=i(34),u=i(35),m=i(32),f="__ungrouped__",g="__background__";s.prototype=new h,s.types={background:m,box:c,range:u,point:p},s.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var n=document.createElement("div");n.className="labelset",this.dom.labelSet=n,this._updateUngrouped();var r=new l(g,null,this);r.show(),this.groups[g]=r,this.hammer=o(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},s.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder","dataAttributes","template","hide"];n.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"==typeof t.margin&&(n.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"==typeof t.margin.item&&n.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&n.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove","onMoving"].forEach(i),this.markDirty()}},s.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},s.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},s.prototype.setSelection=function(t){var e,i,s,o;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;i>e;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=n.option.asSize,s=this.options,o=s.orientation,r=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,a.className="itemset"+(h?" editable":""),r=this._orderGroups()||r;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},m={item:t.item,axis:t.item.vertical/2},f=0,v=t.axis+t.item.vertical;return this.groups[g].redraw(e,m,c),n.forEach(this.groups,function(t){var i=t==p?u:m,s=t.redraw(e,i,c);r=s||r,f+=t.height}),f=Math.max(f,v),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",r=this._isResized()||r},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){{var t,e,i=this.groups[f];this.groups[g]}if(this.groupsData){if(i){i.hide(),delete this.groups[f];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var s=this._getGroupId(t.data),o=this.groups[s];o&&o.add(t)||t.hide()}}}else if(!i){var n=null,r=null;i=new d(n,r,this),this.groups[f]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(n.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;n.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(n.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;n.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change",{queue:!0})},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},s.prototype._getGroupId=function(t){var e=this._getType(t);return"background"==e&&void 0==t.group?g:this.groupsData?t.group:f},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=e._getType(i),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0})},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0}))},s.prototype._order=function(){n.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f||t==g)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);n.extend(o,{height:null}),s=new d(t,i,e),e.groups[t]=s;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change",{queue:!0})},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change",{queue:!0})},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!n.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.setData(e),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:a})}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var r=e.itemsData.get(o.id);this.options.onUpdate(r,function(t){t&&e.itemsData.getDataSet().update(t)})}else{var a=n.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData._fieldId]=n.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.getDataSet().add(t)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=t.gesture.touches[0]&&t.gesture.touches[0].shiftKey||!1;if(o){e.push(i.id);var n=s._getItemRange(this.itemsData.get(e,this.itemOptions));e=[];for(var r in this.items)if(this.items.hasOwnProperty(r)){var a=this.items[r],h=a.data.start,d=void 0!==a.data.end?a.data.end:h;h>=n.min&&d<=n.max&&e.push(a.id)}}else{var l=e.indexOf(i.id);-1==l?e.push(i.id):e.splice(l,1)}this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()})}}},s._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i,s){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.linegraphOptions=s,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(2),r=i(20);s.prototype=new r,s.prototype.clear=function(){this.groups={},this.amountOfGroups=0},s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.svg.style.height="100%",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||t++);if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{if(this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position)this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom="";else{var i=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+i+Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""}0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var s="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||(s+=this.groups[e].content+"
"));this.dom.textArea.innerHTML=s,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.autoSizeSVG=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(20),d=i(23),l=i(24),c=i(28),p=i(52),u="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height&&void 0!==this.body.domProps.centerContainer.height?this.autoSizeSVG=!0:void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),this._applySampling(a,c),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a=[],h=[];if(t.length>0){for(n=0;n0&&(o=this.groups[t[n]],"stack"==r.barChart.handleOverlap&&"bar"==r.style?"left"==r.yAxisOrientation?a=a.concat(o.getYRange(s)):h=h.concat(o.getYRange(s)):i[t[n]]=o.getYRange(s,t[n]));p.getStackedBarYRange(a,i,t,"__barchartLeft","left"),p.getStackedBarYRange(h,i,t,"__barchartRight","right")}},s.prototype._updateYAxis=function(t,e){var i,s,o=!1,n=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,this.yAxisRight.zeroCrossing=this.yAxisLeft.zeroCrossing,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._convertXcoordinates=function(t){for(var e,i,s=[],o=this.body.util.toScreen,n=0;nc;){c++;var p=h.getCurrent(),u=this.body.util.toScreen(p),m=h.isMajor();this.options.showMinorLabels&&this._repaintMinorText(u,h.getLabelMinor(),t),m&&this.options.showMajorLabels?(u>0&&(void 0==l&&(l=u),this._repaintMajorText(u,h.getLabelMajor(),t)),this._repaintMajorLine(u,t)):this._repaintMinorLine(u,t),h.next()}if(this.options.showMajorLabels){var f=this.body.util.toTime(0),g=h.getLabelMajor(f),v=g.length*(this.props.majorCharWidth||10)+10;(void 0==l||l>v)&&this._repaintMajorText(0,g,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text major measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(45),n=i(1);s.prototype.stack=!0,s.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setData=function(t){this.data=t,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},s.prototype._updateContents=function(t){var e;if(this.options.template){var i=this.parent.itemSet.itemsData.get(this.id);e=this.options.template(i)}else e=this.data.content;if(e!==this.content){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},s.prototype._updateTitle=function(t){null!=this.data.title?t.title=this.data.title||"":t.removeAttribute("title")},s.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=Object.keys(this.data)}for(var i=0;it.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=0,this.dirty=!1}},s.prototype.show=r.prototype.show,s.prototype.hide=r.prototype.hide,s.prototype.repositionX=r.prototype.repositionX,s.prototype.repositionY=function(t){var e="top"===this.options.orientation;this.dom.content.style.top=e?"":"0",this.dom.content.style.bottom=e?"0":"";var i;if(void 0!==this.data.subgroup){var s=this.data.subgroup,o=this.parent.subgroups,r=o[s].index;if(1==e){i=this.parent.subgroups[s].height+t.item.vertical,i+=0==r?t.axis-.5*t.item.vertical:0;var a=this.parent.top;for(var h in o)o.hasOwnProperty(h)&&1==o[h].visible&&o[h].indexr&&(a+=o[h].height+t.item.vertical);i=this.parent.subgroups[s].height+t.item.vertical,this.dom.box.style.top=a+"px",this.dom.box.style.bottom=""}}else this.parent instanceof n?(i=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.top=e?"0":"",this.dom.box.style.bottom=e?"":"0"):(i=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=i+"px"},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}{var o=i(31);i(1)}s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this,this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw item: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.box),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1}this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end);-i>s&&(s=-i),o>2*i&&(o=2*i);var n=Math.max(o-s,1);switch(this.overflow?(this.left=s,this.width=n+this.props.content.width,e=this.props.content.width):(this.left=s,this.width=n,e=Math.min(o-s,this.props.content.width)),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=n+"px",this.options.align){case"left":this.dom.content.style.left="0";break;case"right":this.dom.content.style.left=Math.max(n-e-2*this.options.padding,0)+"px";break;case"center":this.dom.content.style.left=Math.max((n-e-2*this.options.padding)/2,0)+"px";break;default:t=this.overflow?Math.max(-s,0):0>s?Math.min(-s,o-s-this.props.content.width-2*this.options.padding):0,this.dom.content.style.left=t+"px"}},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fontColor:"black",fontSize:14,fontFace:"verdana",fontFill:void 0,level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1,borderWidthSelected:void 0},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD",layout:"hubsize"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.pixelRatio=1,this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1,this.navigationHammers={existing:[],"new":[]},this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=null,this.lockedOnNodeOffset=null;var o=this;this.groups=new u,this.images=new m,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.startedStabilization=!1,this.stabilized=!1,this.stabilizationIterations=null,this.draggingNodes=!1,this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items,e.data),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(void 0,!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(56),n=i(45),r=i(57),a=i(1),h=i(47),d=i(3),l=i(4),c=i(42),p=i(43),u=i(38),m=i(39),f=i(40),g=i(37),v=i(41),y=i(54),b=i(55),_=i(49);i(50),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(n+142.05338)+91444e-8:12.662/(n+7.4147)+.0964822:1==this.constants.clustering.enabled&&n>=this.constants.clustering.initialMaxNodes?77.5271985/(n+187.266146)+476710517e-13:30.5062972/(n+19.93597763)+.08413486;var r=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);s*=r}else{var a=1.1*Math.abs(o.maxX-o.minX),h=1.1*Math.abs(o.maxY-o.minY),d=this.frame.canvas.clientWidth/a,l=this.frame.canvas.clientHeight/h;s=l>=d?d:l}s>1&&(s=1);var c=this._findCenter(o);if(0==i){var p={position:c,scale:s,animation:t};this.moveTo(p),this.moving=!0,this.start()}else c.x*=s,c.y*=s,c.x-=.5*this.frame.canvas.clientWidth,c.y-=.5*this.frame.canvas.clientHeight,this._setScale(s),this._setTranslation(-c.x,-c.y)},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),this.initializing=!0,t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);this._putDataInSector(),0==e&&(1==this.constants.hierarchicalLayout.enabled?(this._resetLevels(),this._setupHierarchicalLayout()):this.constants.stabilize&&this._stabilize(),this.start()),this.initializing=!1},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e]) -}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext){var t=this.frame.canvas.getContext("2d");this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.frame.canvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}var i=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",i._onTap.bind(i)),this.hammer.on("doubletap",i._onDoubleTap.bind(i)),this.hammer.on("hold",i._onHold.bind(i)),this.hammer.on("pinch",i._onPinch.bind(i)),this.hammer.on("touch",i._onTouch.bind(i)),this.hammer.on("dragstart",i._onDragStart.bind(i)),this.hammer.on("drag",i._onDrag.bind(i)),this.hammer.on("dragend",i._onDragEnd.bind(i)),this.hammer.on("mousewheel",i._onMouseWheel.bind(i)),this.hammer.on("DOMMouseScroll",i._onMouseWheel.bind(i)),this.hammer.on("mousemove",i._onMouseMoveTitle.bind(i)),this.hammerFrame=n(this.frame,{prevent_default:!0}),this.hammerFrame.on("release",i._onRelease.bind(i)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=r(),this.keycharm.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.keycharm.bind("up",this._moveUp.bind(t),"keydown"),this.keycharm.bind("up",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("down",this._moveDown.bind(t),"keydown"),this.keycharm.bind("down",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("left",this._moveLeft.bind(t),"keydown"),this.keycharm.bind("left",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("right",this._moveRight.bind(t),"keydown"),this.keycharm.bind("right",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("=",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("=",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num+",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("num+",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("num-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("[",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("[",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("]",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("]",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pageup",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("pageup",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.keycharm.bind("esc",this._createManipulatorBar.bind(t)),this.keycharm.bind("delete",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,this.draggingNodes=!1,null!=e&&1==this.constants.dragNodes){this.draggingNodes=!0,t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1),this.emit("dragStart",{nodeIds:this.getSelection().nodes});for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){this.releaseNode();var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(t){this._handleDragEnd(t)},s.prototype._handleDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw(),0==this.draggingNodes?this.emit("dragEnd",{nodeIds:[]}):this.emit("dragEnd",{nodeIds:this.getSelection().nodes})},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof f&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){var i=!1,s=this.frame.canvas.width,o=this.frame.canvas.height;t!=this.constants.width||e!=this.constants.height||this.frame.style.width!=t||this.frame.style.height!=e?(this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,this.constants.width=t,this.constants.height=e,i=!0):(this.frame.canvas.width!=this.frame.canvas.clientWidth*this.pixelRatio&&(this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,i=!0),this.frame.canvas.height!=this.frame.canvas.clientHeight*this.pixelRatio&&(this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,i=!0)),1==i&&this.emit("resize",{width:this.frame.canvas.width*this.pixelRatio,height:this.frame.canvas.height*this.pixelRatio,oldWidth:s*this.pixelRatio,oldHeight:o*this.pixelRatio})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(Array.isArray(t))this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new f(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t,e){for(var i=this.nodes,s=0,o=t.length;o>s;s++){var n=t[s],r=i[n],a=e[s];r?r.setProperties(a,this.constants):(r=new f(properties,this.images,this.groups,this.constants),i[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._updateValueRange(i)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(Array.isArray(t))this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),this._updateCalculationNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout())},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[],e[t].dynamicEdges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.frame.canvas.width*this.pixelRatio,i=this.frame.canvas.height*this.pixelRatio;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth*this.pixelRatio),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight*this.pixelRatio)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStepLimited(e,this.constants.maxVelocity),s=!0);else for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStep(e),s=!0);if(1==s){var o=this.constants.minVelocity/Math.max(this.scale,.05);return o>.5*this.constants.maxVelocity?!0:this._isMoving(o)}return!1},s.prototype._physicsTick=function(){if(!this.freezeSimulation&&1==this.moving){var t=!1,e=!1;this._doInAllActiveSectors("_initializeForceCalculation");var i=this._doInAllActiveSectors("_discreteStepNodes");1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&(e=this._doInSupportSector("_discreteStepNodes"));for(var s=0;s0){var i=this,s={iterations:i.stabilizationIterations};i.stabilizationIterations=0,i.startedStabilization=!1,setTimeout(function(){i.emit("stabilized",s)},0)}},s.prototype._handleNavigation=function(){if(0!=this.xIncrement||0!=this.yIncrement){var t=this._getTranslation();this._setTranslation(t.x+this.xIncrement,t.y+this.yIncrement)}if(0!=this.zoomIncrement){var e={x:this.frame.canvas.clientWidth/2,y:this.frame.canvas.clientHeight/2};this._zoom(this.scale*(1+this.zoomIncrement),e)}},s.prototype.toggleFreeze=function(){0==this.freezeSimulation?this.freezeSimulation=!0:(this.freezeSimulation=!1,this.start())},s.prototype._configureSmoothCurves=function(t){if(void 0===t&&(t=!0),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this._createBezierNodes();for(var e in this.sectors.support.nodes)this.sectors.support.nodes.hasOwnProperty(e)&&void 0===this.edges[this.sectors.support.nodes[e].parentEdgeId]&&delete this.sectors.support.nodes[e]}else{this.sectors.support.nodes={};for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.edges[i].via=null)}this._updateCalculationNodes(),t||(this.moving=!0,this.start())},s.prototype._createBezierNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic)for(var t in this.edges)if(this.edges.hasOwnProperty(t)){var e=this.edges[t];if(null==e.via){var i="edgeId:".concat(e.id);this.sectors.support.nodes[i]=new f({id:i,mass:1,shape:"circle",image:"",internalMultiplier:1},{},{},this.constants),e.via=this.sectors.support.nodes[i],e.via.parentEdgeId=e.id,e.positionBezierNode()}}},s.prototype._initializeMixinLoaders=function(){for(var t in y)y.hasOwnProperty(t)&&(s.prototype[t]=y[t])},s.prototype.storePosition=function(){console.log("storePosition is depricated: use .storePositions() from now on."),this.storePositions()},s.prototype.storePositions=function(){var t=[];for(var e in this.nodes)if(this.nodes.hasOwnProperty(e)){var i=this.nodes[e],s=!this.nodes.xFixed,o=!this.nodes.yFixed;(this.nodesData._data[e].x!=Math.round(i.x)||this.nodesData._data[e].y!=Math.round(i.y))&&t.push({id:e,x:Math.round(i.x),y:Math.round(i.y),allowedToMoveX:s,allowedToMoveY:o})}this.nodesData.update(t)},s.prototype.getPositions=function(t){var e={};if(void 0!==t){if(1==Array.isArray(t)){for(var i=0;i=1&&(this.easingTime=0,this._redraw=null!=this.lockedOnNodeId?this._lockedRedraw:this._classicRedraw,this.emit("animationFinished"))},s.prototype._classicRedraw=function(){},s.prototype.isActive=function(){return!this.activator||this.activator.active},s.prototype.setScale=function(){return this._setScale()},s.prototype.getScale=function(){return this._getScale()},s.prototype.getCenterCoordinates=function(){return this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight})},t.exports=s},function(t,e,i){function s(t,e,i){if(!e)throw"No network provided";var s=["edges","physics"],n=o.selectiveBridgeObject(s,i);this.options=n.edges,this.physics=n.physics,this.options.smoothCurves=i.smoothCurves,this.network=e,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.title=void 0,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.value=void 0,this.selected=!1,this.hover=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.dirtyLabel=!0,this.from=null,this.to=null,this.via=null,this.originalFromId=[],this.originalToId=[],this.connected=!1,this.widthFixed=!1,this.lengthFixed=!1,this.setProperties(t),this.controlNodesEnabled=!1,this.controlNodes={from:null,to:null,positions:{}},this.connectedNode=null}var o=i(1),n=i(40);s.prototype.setProperties=function(t){if(t){var e=["style","fontSize","fontFace","fontColor","fontFill","width","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","inheritColor"];switch(o.selectiveDeepExtend(e,this.options,t),void 0!==t.from&&(this.fromId=t.from),void 0!==t.to&&(this.toId=t.to),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.dirtyLabel=!0),void 0!==t.title&&(this.title=t.title),void 0!==t.value&&(this.value=t.value),void 0!==t.length&&(this.physics.springLength=t.length),void 0!==t.color&&(this.options.inheritColor=!1,o.isString(t.color)?(this.options.color.color=t.color,this.options.color.highlight=t.color):(void 0!==t.color.color&&(this.options.color.color=t.color.color),void 0!==t.color.highlight&&(this.options.color.highlight=t.color.highlight),void 0!==t.color.hover&&(this.options.color.hover=t.color.hover))),this.connect(),this.widthFixed=this.widthFixed||void 0!==t.width,this.lengthFixed=this.lengthFixed||void 0!==t.length,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.options.style){case"line":this.draw=this._drawLine;break;case"arrow":this.draw=this._drawArrow;break;case"arrow-center":this.draw=this._drawArrowCenter;break;case"dash-line":this.draw=this._drawDashLine;break;default:this.draw=this._drawLine}}},s.prototype.connect=function(){this.disconnect(),this.from=this.network.nodes[this.fromId]||null,this.to=this.network.nodes[this.toId]||null,this.connected=this.from&&this.to,this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this))},s.prototype.disconnect=function(){this.from&&(this.from.detachEdge(this),this.from=null),this.to&&(this.to.detachEdge(this),this.to=null),this.connected=!1},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.getValue=function(){return this.value},s.prototype.setValueRange=function(t,e){if(!this.widthFixed&&void 0!==this.value){var i=(this.options.widthMax-this.options.widthMin)/(e-t);this.options.width=(this.value-t)*i+this.options.widthMin,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier}},s.prototype.draw=function(){throw"Method draw not initialized in edge"},s.prototype.isOverlappingWith=function(t){if(this.connected){var e=10,i=this.from.x,s=this.from.y,o=this.to.x,n=this.to.y,r=t.left,a=t.top,h=this._getDistanceToEdge(i,s,o,n,r,a);return e>h}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y)); -e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.max(Math.min(this.widthSelected,this.options.widthMax),.3*this.networkScaleInv):1==this.hover?Math.max(Math.min(this.options.hoverWidth,this.options.widthMax),.3*this.networkScaleInv):Math.max(this.options.width,.3*this.networkScaleInv)},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yd;d++){var l=t.measureText(n[d]).width;h=l>h?l:h}var c=this.options.fontSize*r,p=i-h/2,u=s-c/2;this.labelDimensions={top:u,left:p,width:h,height:c,yLine:o}}void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(this.labelDimensions.left,this.labelDimensions.top,this.labelDimensions.width,this.labelDimensions.height)),t.fillStyle=this.options.fontColor||"black",t.textAlign="center",t.textBaseline="middle",o=this.labelDimensions.yLine;for(var d=0;r>d;d++)t.fillText(n[d],i,o),o+=a}},s.prototype._drawDashLine=function(t){t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth();var e=null;if(void 0!==t.mozDash||void 0!==t.setLineDash){var i=[0];i=void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?[this.options.dash.length,this.options.dash.gap]:[5,5],"undefined"!=typeof t.setLineDash?(t.setLineDash(i),t.lineDashOffset=0):(t.mozDash=i,t.mozDashOffset=0),e=this._line(t),"undefined"!=typeof t.setLineDash?(t.setLineDash([0]),t.lineDashOffset=0):(t.mozDash=[0],t.mozDashOffset=0)}else t.beginPath(),t.lineCap="round",void 0!==this.options.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]):void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke();if(this.label){var s;if(1==this.options.smoothCurves.enabled&&null!=e){var o=.5*(.5*(this.from.x+e.x)+.5*(this.to.x+e.x)),n=.5*(.5*(this.from.y+e.y)+.5*(this.to.y+e.y));s={x:o,y:n}}else s=this._pointOnLine(.5);this._label(t,this.label,s.x,s.y)}},s.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},s.prototype._pointOnCircle=function(t,e,i,s){var o=2*(s-3/8)*Math.PI;return{x:t+i*Math.cos(o),y:e-i*Math.sin(o)}},s.prototype._drawArrowCenter=function(t){var e;if(t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth(),this.from!=this.to){var i=this._line(t),s=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),o=(10+5*this.options.width)*this.options.arrowScaleFactor;if(1==this.options.smoothCurves.enabled&&null!=i){var n=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),r=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:n,y:r}}else e=this._pointOnLine(.5);t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&this._label(t,this.label,e.x,e.y)}else{var a,h,d=.25*Math.max(100,this.physics.springLength),l=this.from;l.width||l.resize(t),l.width>l.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),m=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-m)*s.x+m*this.to.x,p=(1-m)*s.y+m*this.to.y):(c=(1-m)*this.from.x+m*this.to.x,p=(1-m)*this.from.y+m*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var f;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));f={x:g,y:v}}else f=this._pointOnLine(.5);this._label(t,this.label,f.x,f.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(f=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,f.x,f.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){var r=0;if(this.from!=this.to)if(1==this.options.smoothCurves.enabled){var a,h;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)a=this.via.x,h=this.via.y;else{var d=this._getViaCoordinates();a=d.x,h=d.y}var l,c,p,u,m,f,g,v=1e9;for(c=0;10>c;c++)p=.1*c,u=Math.pow(1-p,2)*t+2*p*(1-p)*a+Math.pow(p,2)*i,m=Math.pow(1-p,2)*e+2*p*(1-p)*h+Math.pow(p,2)*s,c>0&&(l=this._getDistanceToLine(f,g,u,m,o,n),v=v>l?l:v),f=u,g=m;r=v}else r=this._getDistanceToLine(t,e,i,s,o,n);else{var u,m,y,b,_=.25*this.physics.springLength,x=this.from;x.width>x.height?(u=x.x+.5*x.width,m=x.y-_):(u=x.x+_,m=x.y-.5*x.height),y=u-o,b=m-n,r=Math.abs(Math.sqrt(y*y+b*b)-_)}return this.labelDimensions.lefto&&this.labelDimensions.topn?0:r},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t,e){var i=this.images[t];if(void 0==i){var s=this;i=new Image,this.images[t]=i,i.onload=function(){s.callback&&s.callback(this)},i.onerror=function(){this.src=e,s.callback&&s.callback(this)},i.src=t}return i},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.allowedToMoveX=!1,this.allowedToMoveY=!1,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.hierarchyEnumerated=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1),e=this.dynamicEdges.indexOf(t),-1!=e&&this.dynamicEdges.splice(e,1),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","brokenImage","radius","fontColor","fontSize","fontFace","fontFill","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage)}switch(void 0!==t.allowedToMoveX?(this.xFixed=!t.allowedToMoveX,this.allowedToMoveX=t.allowedToMoveX):void 0!==t.x&&0==this.allowedToMoveX&&(this.xFixed=!0),void 0!==t.allowedToMoveY?(this.yFixed=!t.allowedToMoveY,this.allowedToMoveY=t.allowedToMoveY):void 0!==t.y&&0==this.allowedToMoveY&&(this.yFixed=!0),this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(this.xFixed)this.fx=0,this.vx=0;else{var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0,this.vx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace; -var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=t.measureText(a[0]).width,p=1;h>p;p++){var u=t.measureText(a[p]).width;c=u>c?u:c}var m=this.options.fontSize*h,f=i-c/2,g=s-m/2;"top"==n&&(g+=.5*d),this.labelDimensions={top:g,left:f,width:c,height:m,yLine:l},void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(f,g,c,m)),t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";for(var p=0;h>p;p++)t.fillText(a[p],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=M.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==E.charAt(e)||" "==E.charAt(e);)e--;if("\n"==E.charAt(e)||""==E.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=M.DELIMITER);var i=O+n();if(C[i])return k=M.DELIMITER,L=i,o(),void o();if(C[O])return k=M.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=M.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=M.IDENTIFIER)}for(k=M.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==M.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)f(t),";"==L&&p()}function f(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=M.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=M.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==M.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=M.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=M.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=M.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var M={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},C={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},E="",T=0,O="",L="",k=M.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=D},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}return{start:e,end:i}},s.prototype.setWindow=function(t,e,i){var s=i&&void 0!==i.animate?i.animate:!0;if(1==arguments.length){var o=arguments[0];this.range.setRange(o.start,o.end,s)}else this.range.setRange(t,e,s)},s.prototype.moveTo=function(t,e){var i=this.range.end-this.range.start,s=r.convert(t,"Date").valueOf(),o=s-i/2,n=s+i/2,a=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(o,n,a)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){h.updateHiddenDates(this.body,this.options.hiddenDates),"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;0===s.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===s.root.clientHeight&&(n=o),i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),d=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,d+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var l=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=l,i.leftContainer.height=l,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var c=i.root.width-i.left.width-i.right.width-n;i.center.width=c,i.centerContainer.width=c,i.top.width=c,i.bottom.width=c,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+i.border.left+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var p=this.props.scrollTop;"bottom"==e.orientation&&(p+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=p+"px",s.left.style.left="0",s.left.style.top=p+"px",s.right.style.left="0",s.right.style.top=p+"px";var u=0==this.props.scrollTop?"hidden":"",m=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";if(s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=m,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=m,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=m,this.components.forEach(function(e){t=e.redraw()||t}),t){var f=2;this.redrawCount0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,m=e+(s-r/2),f=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,m),this.bezierCurveTo(l,m+d,p+h,f,p,f),this.bezierCurveTo(p-h,f,t,m+d,t,m),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){function s(t,e){this.groupId=t,this.options=e}var o=i(2),n=i(53);s.prototype.getYRange=function(t){var e=t[0].y,i=t[0].y;for(j=0;jt[j].y?t[j].y:e,i=i0){var r,a,h=Number(i.svg.style.height.replace("px",""));if(r=o.getSVGElement("path",i.svgElements,i.svg),r.setAttributeNS(null,"class",e.className),void 0!==e.style&&r.setAttributeNS(null,"style",e.style),a=1==e.options.catmullRom.enabled?s._catmullRom(t,e):s._linear(t),1==e.options.shaded.enabled){var d,l=o.getSVGElement("path",i.svgElements,i.svg);d="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+a+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+h+" "+a+"L"+t[t.length-1].x+","+h,l.setAttributeNS(null,"class",e.className+" fill"),void 0!==e.options.shaded.style&&l.setAttributeNS(null,"style",e.options.shaded.style),l.setAttributeNS(null,"d",d)}r.setAttributeNS(null,"d","M"+a),1==e.options.drawPoints.enabled&&n.draw(t,e,i)}},s._catmullRomUniform=function(t){for(var e,i,s,o,n,r,a=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",h=1/6,d=t.length,l=0;d-1>l;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,m,f,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,D=0;S-1>D;D++)s=0==D?t[0]:t[D-1],o=t[D],n=t[D+1],r=S>D+2?t[D+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,m=3*x*(x+v),m>0&&(m=1/m),f=3*g*(g+v),f>0&&(f=1/f),a={x:(-b*s.x+p*o.x+_*n.x)*m,y:(-b*s.y+p*o.y+_*n.y)*m},h={x:(y*o.x+u*n.x-b*r.x)*f,y:(y*o.y+u*n.y-b*r.y)*f},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s._linear=function(t){for(var e="",i=0;it[s].y?t[s].y:e,i=i0&&(r=Math.min(r,Math.abs(p[l-1].x-a))),h=s._getSafeDrawData(r,d,f);else{var v=l+(u[a].amount-u[a].resolved),y=l-(u[a].resolved+1);v0&&(r=Math.min(r,Math.abs(p[y].x-a))),h=s._getSafeDrawData(r,d,f),u[a].resolved+=1,"stack"==d.options.barChart.handleOverlap?(g=u[a].accumulated,u[a].accumulated+=d.zeroPosition-p[l].y):"sideBySide"==d.options.barChart.handleOverlap&&(h.width=h.width/u[a].amount,h.offset+=u[a].resolved*h.width-.5*h.width*(u[a].amount+1),"left"==d.options.barChart.align?h.offset-=.5*h.width:"right"==d.options.barChart.align&&(h.offset+=.5*h.width))}o.drawBar(p[l].x+h.offset,p[l].y-g,h.width,d.zeroPosition-p[l].y,d.className+" bar",i.svgElements,i.svg),1==d.options.drawPoints.enabled&&n.draw(p,d,i,h.offset)}},s._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.getStackedBarYRange=function(t,e,i,o,n){if(t.length>0){t.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x});var r={};s._getDataIntersections(r,t),e[o]=s._getStackedBarYRange(r,t),e[o].yAxisOrientation=n,i.push(o)}},s._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=ot[j].y?t[j].y:e,i=is;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e){var i,s,o;!function(n,r){s=[],i=r,o="function"==typeof i?i.apply(e,s):i,!(void 0!==o&&(t.exports=o))}(this,function(){function t(t){var e,i=t&&t.preventDefault||!1,s={keydown:{},keyup:{}},o={};for(e=97;122>=e;e++)o[String.fromCharCode(e)]={code:65+(e-97),shift:!1};for(e=65;90>=e;e++)o[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;9>=e;e++)o[""+e]={code:48+e,shift:!1};for(e=1;12>=e;e++)o["F"+e]={code:111+e,shift:!1};for(e=0;9>=e;e++)o["num"+e]={code:96+e,shift:!1};o["num*"]={code:106,shift:!1},o["num+"]={code:107,shift:!1},o["num-"]={code:109,shift:!1},o["num/"]={code:111,shift:!1},o["num."]={code:110,shift:!1},o.left={code:37,shift:!1},o.up={code:38,shift:!1},o.right={code:39,shift:!1},o.down={code:40,shift:!1},o.space={code:32,shift:!1},o.enter={code:13,shift:!1},o.shift={code:16,shift:void 0},o.esc={code:27,shift:!1},o.backspace={code:8,shift:!1},o.tab={code:9,shift:!1},o.ctrl={code:17,shift:!1},o.alt={code:18,shift:!1},o["delete"]={code:46,shift:!1},o.pageup={code:33,shift:!1},o.pagedown={code:34,shift:!1},o["="]={code:187,shift:!1},o["-"]={code:189,shift:!1},o["]"]={code:221,shift:!1},o["["]={code:219,shift:!1};var n=function(t){a(t,"keydown")},r=function(t){a(t,"keyup")},a=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n0)for(i in He)s=He[i],o=e[s],"undefined"!=typeof o&&(t[s]=o);return t}function b(t){return 0>t?Math.ceil(t):Math.floor(t)}function _(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&k(t[s])!==k(e[s]))&&r++;return r+n}function T(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=mi[t]||fi[e]||e}return t}function O(t){var e,i,s={};for(i in t)a(t,i)&&(e=T(i),e&&(s[e]=t[i]));return s}function L(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}De[t]=function(s,o){var r,a,h=De._locale[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=De().utc().set(i,t);return h.call(De._locale,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function k(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function N(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function I(t,e,i){return pe(De([t,11,31+e-i]),e,i).week}function A(t){return z(t)?366:365}function z(t){return t%4===0&&t%100!==0||t%400===0}function P(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Ne]<0||t._a[Ne]>11?Ne:t._a[Ie]<1||t._a[Ie]>N(t._a[ke],t._a[Ne])?Ie:t._a[Ae]<0||t._a[Ae]>23?Ae:t._a[ze]<0||t._a[ze]>59?ze:t._a[Pe]<0||t._a[Pe]>59?Pe:t._a[Re]<0||t._a[Re]>999?Re:-1,t._pf._overflowDayOfYear&&(ke>e||e>Ie)&&(e=Ie),t._pf.overflow=e)}function R(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function F(t){return t?t.toLowerCase().replace("_","-"):t}function H(t){for(var e,i,s,o,n=0;n0;){if(s=Y(o.slice(0,e).join("-")))return s;if(i&&i.length>=e&&E(o,i,!0)>=e-1)break;e--}n++}return null}function Y(t){var e=null;if(!Fe[t]&&Ye)try{e=De.locale(),!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),De.locale(e)}catch(i){}return Fe[t]}function B(t,e){return e._isUTC?De(t).zone(e._offset||0):De(t).local()}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,i,s=t.match(je);for(e=0,i=s.length;i>e;e++)s[e]=_i[s[e]]?_i[s[e]]:W(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function j(t,e){return t.isValid()?(e=U(e,t.localeData()),gi[e]||(gi[e]=G(e)),gi[e](t)):t.localeData().invalidDate()}function U(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Ue.lastIndex=0;s>=0&&Ue.test(t);)t=t.replace(Ue,i),Ue.lastIndex=0,s-=1;return t}function V(t,e){var i,s=e._strict;switch(t){case"Q":return ii;case"DDDD":return oi;case"YYYY":case"GGGG":case"gggg":return s?ni:qe;case"Y":case"G":case"g":return ai;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?ri:Ze;case"S":if(s)return ii;case"SS":if(s)return si;case"SSS":if(s)return oi;case"DDD":return Xe;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Qe;case"a":case"A":return e._locale._meridiemParse;case"X":return ti;case"Z":case"ZZ":return $e;case"T":return Je;case"SSSS":return Ke;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?si:Ve;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ve;case"Do":return ei;default:return i=new RegExp(ee(te(t.replace("\\","")),"i"))}}function X(t){t=t||"";var e=t.match($e)||[],i=e[e.length-1]||[],s=(i+"").match(pi)||["-",0,0],o=+(60*s[1])+k(s[2]);return"+"===s[0]?-o:o}function q(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Ne]=3*(k(e)-1));break;case"M":case"MM":null!=e&&(o[Ne]=k(e)-1);break;case"MMM":case"MMMM":s=i._locale.monthsParse(e),null!=s?o[Ne]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ie]=k(e));break;case"Do":null!=e&&(o[Ie]=k(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=k(e));break;case"YY":o[ke]=De.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[ke]=k(e);break;case"a":case"A":i._isPm=i._locale.isPM(e);break;case"H":case"HH":case"h":case"hh":o[Ae]=k(e);break;case"m":case"mm":o[ze]=k(e);break;case"s":case"ss":o[Pe]=k(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Re]=k(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=X(e);break;case"dd":case"ddd":case"dddd":s=i._locale.weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=k(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=De.parseTwoDigitYear(e)}}function Z(t){var e,i,s,o,n,a,h;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[ke],pe(De(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(n=t._locale._week.dow,a=t._locale._week.doy,i=r(e.gg,t._a[ke],pe(De(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ue(i,s,o,a,n),t._a[ke]=h.year,t._dayOfYear=h.dayOfYear}function K(t){var e,i,s,o,n=[];if(!t._d){for(s=$(t),t._w&&null==t._a[Ie]&&null==t._a[Ne]&&Z(t),t._dayOfYear&&(o=r(t._a[ke],s[ke]),t._dayOfYear>A(o)&&(t._pf._overflowDayOfYear=!0),i=he(o,0,t._dayOfYear),t._a[Ne]=i.getUTCMonth(),t._a[Ie]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?he:ae).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function Q(t){var e;t._d||(e=O(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],K(t))}function $(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function J(t){if(t._f===De.ISO_8601)return void se(t);t._a=[],t._pf.empty=!0;var e,i,s,o,n,r=""+t._i,a=r.length,h=0;for(s=U(t._f,t._locale).match(je)||[],e=0;e0&&t._pf.unusedInput.push(n),r=r.slice(r.indexOf(i)+i.length),h+=i.length),_i[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),q(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=a-h,r.length>0&&t._pf.unusedInput.push(r),t._isPm&&t._a[Ae]<12&&(t._a[Ae]+=12),t._isPm===!1&&12===t._a[Ae]&&(t._a[Ae]=0),K(t),P(t)}function te(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function ee(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ie(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));v(t,i||e)}function se(t){var e,i,s=t._i,o=hi.exec(s);if(o){for(t._pf.iso=!0,e=0,i=li.length;i>e;e++)if(li[e][1].exec(s)){t._f=li[e][0]+(o[6]||" ");break}for(e=0,i=ci.length;i>e;e++)if(ci[e][1].exec(s)){t._f+=ci[e][0];break}s.match($e)&&(t._f+="Z"),J(t)}else t._isValid=!1}function oe(t){se(t),t._isValid===!1&&(delete t._isValid,De.createFromInputFallback(t))}function ne(t,e){var i,s=[];for(i=0;it&&a.setFullYear(t),a}function he(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function de(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function le(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ce(t,e,i){var s=De.duration(t).abs(),o=Oe(s.as("s")),n=Oe(s.as("m")),r=Oe(s.as("h")),a=Oe(s.as("d")),h=Oe(s.as("M")),d=Oe(s.as("y")),l=o0,l[4]=i,le.apply({},l)}function pe(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=De(t).add(n,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ue(t,e,i,s,o){var n,r,a=he(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:A(t-1)+r}}function me(t){var e=t._i,i=t._f;return t._locale=t._locale||De.localeData(t._l),null===e||i===n&&""===e?De.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),De.isMoment(e)?new f(e,!0):(i?M(i)?ie(t):J(t):re(t),new f(t)))}function fe(t,e){var i,s;if(1===e.length&&M(e[0])&&(e=e[0]),!e.length)return De();for(i=e[0],s=1;s=0?"+":"-";return e+_(Math.abs(t),6)},gg:function(){return _(this.weekYear()%100,2)},gggg:function(){return _(this.weekYear(),4)},ggggg:function(){return _(this.weekYear(),5)},GG:function(){return _(this.isoWeekYear()%100,2)},GGGG:function(){return _(this.isoWeekYear(),4)},GGGGG:function(){return _(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return k(this.milliseconds()/100)},SS:function(){return _(k(this.milliseconds()/10),2)},SSS:function(){return _(this.milliseconds(),3)},SSSS:function(){return _(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+":"+_(k(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+_(k(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},xi={},wi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];yi.length;)Ce=yi.pop(),_i[Ce+"o"]=u(_i[Ce],Ce);for(;bi.length;)Ce=bi.pop(),_i[Ce+Ce]=p(_i[Ce],2);_i.DDDD=p(_i.DDD,3),v(m.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=De.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=De([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return pe(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),De=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=h(),me(o)},De.suppressDeprecationWarnings=!1,De.createFromInputFallback=l("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),De.min=function(){var t=[].slice.call(arguments,0);return fe("isBefore",t)},De.max=function(){var t=[].slice.call(arguments,0);return fe("isAfter",t)},De.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=h(),me(o).utc()},De.unix=function(t){return De(1e3*t)},De.duration=function(t,e){var i,s,o,n,r=t,h=null;return De.isDuration(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(h=We.exec(t))?(i="-"===h[1]?-1:1,r={y:0,d:k(h[Ie])*i,h:k(h[Ae])*i,m:k(h[ze])*i,s:k(h[Pe])*i,ms:k(h[Re])*i}):(h=Ge.exec(t))?(i="-"===h[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},r={y:o(h[2]),M:o(h[3]),d:o(h[4]),h:o(h[5]),m:o(h[6]),s:o(h[7]),w:o(h[8])}):"object"==typeof r&&("from"in r||"to"in r)&&(n=w(De(r.from),De(r.to)),r={},r.ms=n.milliseconds,r.M=n.months),s=new g(r),De.isDuration(t)&&a(t,"_locale")&&(s._locale=t._locale),s},De.version=Ee,De.defaultFormat=di,De.ISO_8601=function(){},De.momentProperties=He,De.updateOffset=function(){},De.relativeTimeThreshold=function(t,e){return vi[t]===n?!1:e===n?vi[t]:(vi[t]=e,!0)},De.lang=l("moment.lang is deprecated. Use moment.locale instead.",function(t,e){return De.locale(t,e)}),De.locale=function(t,e){var i;return t&&(i="undefined"!=typeof e?De.defineLocale(t,e):De.localeData(t),i&&(De.duration._locale=De._locale=i)),De._locale._abbr},De.defineLocale=function(t,e){return null!==e?(e.abbr=t,Fe[t]||(Fe[t]=new m),Fe[t].set(e),De.locale(t),Fe[t]):(delete Fe[t],null)},De.langData=l("moment.langData is deprecated. Use moment.localeData instead.",function(t){return De.localeData(t)}),De.localeData=function(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return De._locale;if(!M(t)){if(e=Y(t))return e;t=[t]}return H(t)},De.isMoment=function(t){return t instanceof f||null!=t&&a(t,"_isAMomentObject")},De.isDuration=function(t){return t instanceof g};for(Ce=wi.length-1;Ce>=0;--Ce)L(wi[Ce]);De.normalizeUnits=function(t){return T(t)},De.invalid=function(t){var e=De.utc(0/0);return null!=t?v(e._pf,t):e._pf.userInvalidated=!0,e},De.parseZone=function(){return De.apply(null,arguments).parseZone()},De.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)},v(De.fn=f.prototype,{clone:function(){return De(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=De(this).utc();return 00:!1},parsingFlags:function(){return v({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(t){return this.zone(0,t)},local:function(t){return this._isUTC&&(this.zone(0,t),this._isUTC=!1,t&&this.add(this._dateTzOffset(),"m")),this},format:function(t){var e=j(this,t||De.defaultFormat);return this.localeData().postformat(e)},add:S(1,"add"),subtract:S(-1,"subtract"),diff:function(t,e,i){var s,o,n,r=B(t,this),a=6e4*(this.zone()-r.zone());return e=T(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+r.daysInMonth()),o=12*(this.year()-r.year())+(this.month()-r.month()),n=this-De(this).startOf("month")-(r-De(r).startOf("month")),n-=6e4*(this.zone()-De(this).startOf("month").zone()-(r.zone()-De(r).startOf("month").zone())),o+=n/s,"year"===e&&(o/=12)):(s=this-r,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),i?o:b(o) -},from:function(t,e){return De.duration({to:this,from:t}).locale(this.locale()).humanize(!e)},fromNow:function(t){return this.from(De(),t)},calendar:function(t){var e=t||De(),i=B(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.localeData().calendar(o,this))},isLeapYear:function(){return z(this.year())},isDST:function(){return this.zone()+t):+this.clone().startOf(e)>+De(t).startOf(e)},isBefore:function(t,e){return e=T("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=De.isMoment(t)?t:De(t),+t>+this):+this.clone().startOf(e)<+De(t).startOf(e)},isSame:function(t,e){return e=T(e||"millisecond"),"millisecond"===e?(t=De.isMoment(t)?t:De(t),+this===+t):+this.clone().startOf(e)===+B(t,this).startOf(e)},min:l("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=De.apply(null,arguments),this>t?this:t}),max:l("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=De.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i,s=this._offset||0;return null==t?this._isUTC?s:this._dateTzOffset():("string"==typeof t&&(t=X(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(i=this._dateTzOffset()),this._offset=t,this._isUTC=!0,null!=i&&this.subtract(i,"m"),s!==t&&(!e||this._changeInProgress?D(this,De.duration(s-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,De.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?De(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return N(this.year(),this.month())},dayOfYear:function(t){var e=Oe((De(this).startOf("day")-De(this).startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=pe(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==t?e:this.add(t-e,"y")},isoWeekYear:function(t){var e=pe(this,1,4).year;return null==t?e:this.add(t-e,"y")},week:function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},isoWeek:function(t){var e=pe(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},weekday:function(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return I(this.year(),1,4)},weeksInYear:function(){var t=this.localeData()._week;return I(this.year(),t.dow,t.doy)},get:function(t){return t=T(t),this[t]()},set:function(t,e){return t=T(t),"function"==typeof this[t]&&this[t](e),this},locale:function(t){var e;return t===n?this._locale._abbr:(e=De.localeData(t),null!=e&&(this._locale=e),this)},lang:l("moment().lang() is deprecated. Use moment().localeData() instead.",function(t){return t===n?this.localeData():this.locale(t)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),De.fn.millisecond=De.fn.milliseconds=be("Milliseconds",!1),De.fn.second=De.fn.seconds=be("Seconds",!1),De.fn.minute=De.fn.minutes=be("Minutes",!1),De.fn.hour=De.fn.hours=be("Hours",!0),De.fn.date=be("Date",!0),De.fn.dates=l("dates accessor is deprecated. Use date instead.",be("Date",!0)),De.fn.year=be("FullYear",!0),De.fn.years=l("years accessor is deprecated. Use year instead.",be("FullYear",!0)),De.fn.days=De.fn.day,De.fn.months=De.fn.month,De.fn.weeks=De.fn.week,De.fn.isoWeeks=De.fn.isoWeek,De.fn.quarters=De.fn.quarter,De.fn.toJSON=De.fn.toISOString,v(De.duration.fn=g.prototype,{_bubble:function(){var t,e,i,s=this._milliseconds,o=this._days,n=this._months,r=this._data,a=0;r.milliseconds=s%1e3,t=b(s/1e3),r.seconds=t%60,e=b(t/60),r.minutes=e%60,i=b(e/60),r.hours=i%24,o+=b(i/24),a=b(_e(o)),o-=b(xe(a)),n+=b(o/30),o%=30,a+=b(n/12),n%=12,r.days=o,r.months=n,r.years=a},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return b(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12)},humanize:function(t){var e=ce(this,!t,this.localeData());return t&&(e=this.localeData().pastFuture(+this,e)),this.localeData().postformat(e)},add:function(t,e){var i=De.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=De.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=T(t),this[t.toLowerCase()+"s"]()},as:function(t){var e,i;if(t=T(t),"month"===t||"year"===t)return e=this._days+this._milliseconds/864e5,i=this._months+12*_e(e),"month"===t?i:i/12;switch(e=this._days+xe(this._months/12),t){case"week":return e/7+this._milliseconds/6048e5;case"day":return e+this._milliseconds/864e5;case"hour":return 24*e+this._milliseconds/36e5;case"minute":return 24*e*60+this._milliseconds/6e4;case"second":return 24*e*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*e*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+t)}},lang:De.fn.lang,locale:De.fn.locale,toIsoString:l("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"},localeData:function(){return this._locale}}),De.duration.fn.toString=De.duration.fn.toISOString;for(Ce in ui)a(ui,Ce)&&we(Ce.toLowerCase());De.duration.fn.asMilliseconds=function(){return this.as("ms")},De.duration.fn.asSeconds=function(){return this.as("s")},De.duration.fn.asMinutes=function(){return this.as("m")},De.duration.fn.asHours=function(){return this.as("h")},De.duration.fn.asDays=function(){return this.as("d")},De.duration.fn.asWeeks=function(){return this.as("weeks")},De.duration.fn.asMonths=function(){return this.as("M")},De.duration.fn.asYears=function(){return this.as("y")},De.locale("en",{ordinal:function(t){var e=t%10,i=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ye?o.exports=De:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(Te.moment=Me),De}.call(e,i,e,o),!(s!==n&&(o.exports=s)),Se(!0))}).call(this)}).call(e,function(){return this}(),i(71)(t))},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){D.register(t)}),w.onTouch(a.DOCUMENT,v,D.detect),w.onTouch(a.DOCUMENT,y,D.detect),a.READY=!0)}var a=function M(t,e){return new M.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",m=a.POINTER_TOUCH="touch",f=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(D,d),a&&(d.changedLength=h,d.eventType=a,s.call(D,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(D,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=m;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(f,s)&&(o=f),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return D.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[m]=i===(e.MSPOINTER_TYPE_TOUCH||m),s[f]=i===(e.MSPOINTER_TYPE_PEN||f),s[t]},reset:function(){this.pointers={}}},D=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?D.startDetect(i,t):t.eventType==_&&D.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=D.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=D.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=D.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=D.current,h=D.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1),o=i(40);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new o({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](o[0],o[1]):this[t](e))}return this._loadLatestSector(),i},e._doInSupportSector=function(t,e){var i=!1;if(void 0===e)this._switchToSupportSector(),i=this[t]();else{this._switchToSupportSector();var s=Array.prototype.splice.call(arguments,1);i=s.length>1?this[t](s[0],s[1]):this[t](e)}return this._loadLatestSector(),i},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ei;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e,!0)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,!1,!0)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(40),n=i(37);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM={},this._manipulationReleaseOverload=function(){},delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode,this.controlNodesActive=!1},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=this.manipulationDiv,e=this.closeDiv,i=this.editModeDiv;1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,this.manipulationDOM={},1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM.addNodeSpan=document.createElement("span"),this.manipulationDOM.addNodeSpan.className="network-manipulationUI add",this.manipulationDOM.addNodeLabelSpan=document.createElement("span"),this.manipulationDOM.addNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addNodeLabelSpan.innerHTML=t.addNode,this.manipulationDOM.addNodeSpan.appendChild(this.manipulationDOM.addNodeLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.addEdgeSpan=document.createElement("span"),this.manipulationDOM.addEdgeSpan.className="network-manipulationUI connect",this.manipulationDOM.addEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.addEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addEdgeLabelSpan.innerHTML=t.addEdge,this.manipulationDOM.addEdgeSpan.appendChild(this.manipulationDOM.addEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.addNodeSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.addEdgeSpan),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?(this.manipulationDOM.seperatorLineDiv2=document.createElement("div"),this.manipulationDOM.seperatorLineDiv2.className="network-seperatorLine",this.manipulationDOM.editNodeSpan=document.createElement("span"),this.manipulationDOM.editNodeSpan.className="network-manipulationUI edit",this.manipulationDOM.editNodeLabelSpan=document.createElement("span"),this.manipulationDOM.editNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editNodeLabelSpan.innerHTML=t.editNode,this.manipulationDOM.editNodeSpan.appendChild(this.manipulationDOM.editNodeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv2),this.manipulationDiv.appendChild(this.manipulationDOM.editNodeSpan)):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.seperatorLineDiv3=document.createElement("div"),this.manipulationDOM.seperatorLineDiv3.className="network-seperatorLine",this.manipulationDOM.editEdgeSpan=document.createElement("span"),this.manipulationDOM.editEdgeSpan.className="network-manipulationUI edit",this.manipulationDOM.editEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.editEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editEdgeLabelSpan.innerHTML=t.editEdge,this.manipulationDOM.editEdgeSpan.appendChild(this.manipulationDOM.editEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv3),this.manipulationDiv.appendChild(this.manipulationDOM.editEdgeSpan)),0==this._selectionIsEmpty()&&(this.manipulationDOM.seperatorLineDiv4=document.createElement("div"),this.manipulationDOM.seperatorLineDiv4.className="network-seperatorLine",this.manipulationDOM.deleteSpan=document.createElement("span"),this.manipulationDOM.deleteSpan.className="network-manipulationUI delete",this.manipulationDOM.deleteLabelSpan=document.createElement("span"),this.manipulationDOM.deleteLabelSpan.className="network-manipulationLabel",this.manipulationDOM.deleteLabelSpan.innerHTML=t.del,this.manipulationDOM.deleteSpan.appendChild(this.manipulationDOM.deleteLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv4),this.manipulationDiv.appendChild(this.manipulationDOM.deleteSpan)),this.manipulationDOM.addNodeSpan.onclick=this._createAddNodeToolbar.bind(this),this.manipulationDOM.addEdgeSpan.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDOM.editNodeSpan.onclick=this._editNode.bind(this):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.editEdgeSpan.onclick=this._createEditEdgeToolbar.bind(this)),0==this._selectionIsEmpty()&&(this.manipulationDOM.deleteSpan.onclick=this._deleteSelected.bind(this)),this.closeDiv.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{for(;this.editModeDiv.hasChildNodes();)this.editModeDiv.removeChild(this.editModeDiv.firstChild);this.manipulationDOM.editModeSpan=document.createElement("span"),this.manipulationDOM.editModeSpan.className="network-manipulationUI edit editmode",this.manipulationDOM.editModeLabelSpan=document.createElement("span"),this.manipulationDOM.editModeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editModeLabelSpan.innerHTML=t.edit,this.manipulationDOM.editModeSpan.appendChild(this.manipulationDOM.editModeLabelSpan),this.editModeDiv.appendChild(this.manipulationDOM.editModeSpan),this.manipulationDOM.editModeSpan.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.addDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.edgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleDragEnd=this._handleDragEnd,this._handleTouch=this._handleConnect,this._manipulationReleaseOverload=function(){},this._handleDragStart=function(){},this._handleDragEnd=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.editEdgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._manipulationReleaseOverload=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);if(null!=e)if(e.clusterSize>1)alert(this.constants.locales[this.constants.locale].createEdgeError);else{this._selectObject(e,!1);var i=this.sectors.support.nodes;i.targetNode=new o({id:"targetNode"},{},{},this.constants);var s=i.targetNode;s.x=e.x,s.y=e.y,this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:s.id},this,this.constants);var r=this.edges.connectionEdge;r.from=e,r.connected=!0,r.options.smoothCurves={enabled:!0,dynamic:!1,type:"continuous",roundness:.5},r.selected=!0,r.to=s,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center),i=this.edges.connectionEdge;i.to.x=this._XconvertDOMtoCanvas(e.x),i.to.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()}}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){var e=this._getPointer(t.gesture.center);this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var i=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var s=this._getNodeAt(e);null!=s&&(s.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(i,s.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}};if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(45));e._cleanNavigation=function(){if(0!=this.navigationHammers.existing.length){for(var t=0;t0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,o.edges.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._setLevelDirected=function(t,e,i){this.nodes[i].hierarchyEnumerated=!0;for(var s=0;s1&&o.hierarchyEnumerated===!1&&this._setLevelDirected(o.level,o.edges,o.id)}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t){function e(t){throw new Error("Cannot find module '"+t+"'.")}e.keys=function(){return[]},e.resolve=e,t.exports=e,e.id=67},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,m=4/3,f=this.constants.physics.repulsion.nodeDistance,g=f;for(d=0;di&&(r=.5*g>i?1:v*i+m,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),m=.5*u,f=.5*(o+r),g=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:f-m,maxX:f+m,minY:g-m,maxY:g+m},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i); -this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); +this.orderedItems={byStart:e,byEnd:i},n.orderByStart(this.orderedItems.byStart),n.orderByEnd(this.orderedItems.byEnd)},s.prototype._updateVisibleItems=function(t,e,i){var s,n,r=[],a={},h=(i.end-i.start)/4,d=i.start-h,l=i.end+h,c=function(t){return d>t?-1:l>=t?0:1};if(e.length>0)for(n=0;nl}),1==this.checkRangedItems)for(this.checkRangedItems=!1,n=0;nl})}for(n=0;n=0&&(n=e[r],!o(n));r--)void 0===s[n.id]&&(s[n.id]=!0,i.push(n));for(r=t+1;rs;s++){var n=this.visibleItems[s];n.repositionY(e)}return i},s.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={type:null,orientation:"bottom",align:"auto",stack:!0,groupOrder:null,selectable:!0,editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},onMoving:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5},this.options=n.extend({},this.defaultOptions),this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.stackDirty=!0,this.touchParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(3),a=i(4),h=i(20),d=i(25),l=i(26),c=i(33),p=i(34),u=i(35),m=i(32),f="__ungrouped__",g="__background__";s.prototype=new h,s.types={background:m,box:c,range:u,point:p},s.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var n=document.createElement("div");n.className="labelset",this.dom.labelSet=n,this._updateUngrouped();var r=new l(g,null,this);r.show(),this.groups[g]=r,this.hammer=o(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},s.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder","dataAttributes","template","hide"];n.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"==typeof t.margin&&(n.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"==typeof t.margin.item&&n.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&n.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove","onMoving"].forEach(i),this.markDirty()}},s.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},s.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},s.prototype.setSelection=function(t){var e,i,s,o;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;i>e;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=n.option.asSize,s=this.options,o=s.orientation,r=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,a.className="itemset"+(h?" editable":""),r=this._orderGroups()||r;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},m={item:t.item,axis:t.item.vertical/2},f=0,v=t.axis+t.item.vertical;return this.groups[g].redraw(e,m,c),n.forEach(this.groups,function(t){var i=t==p?u:m,s=t.redraw(e,i,c);r=s||r,f+=t.height}),f=Math.max(f,v),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",r=this._isResized()||r},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){{var t,e,i=this.groups[f];this.groups[g]}if(this.groupsData){if(i){i.hide(),delete this.groups[f];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var s=this._getGroupId(t.data),o=this.groups[s];o&&o.add(t)||t.hide()}}}else if(!i){var n=null,r=null;i=new d(n,r,this),this.groups[f]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(n.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;n.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(n.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;n.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change",{queue:!0})},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},s.prototype._getGroupId=function(t){var e=this._getType(t);return"background"==e&&void 0==t.group?g:this.groupsData?t.group:f},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=e._getType(i),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0})},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0}))},s.prototype._order=function(){n.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f||t==g)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);n.extend(o,{height:null}),s=new d(t,i,e),e.groups[t]=s;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change",{queue:!0})},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change",{queue:!0})},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!n.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.setData(e),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:a})}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var r=e.itemsData.get(o.id);this.options.onUpdate(r,function(t){t&&e.itemsData.getDataSet().update(t)})}else{var a=n.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData._fieldId]=n.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.getDataSet().add(t)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=t.gesture.touches[0]&&t.gesture.touches[0].shiftKey||!1;if(o){e.push(i.id);var n=s._getItemRange(this.itemsData.get(e,this.itemOptions));e=[];for(var r in this.items)if(this.items.hasOwnProperty(r)){var a=this.items[r],h=a.data.start,d=void 0!==a.data.end?a.data.end:h;h>=n.min&&d<=n.max&&e.push(a.id)}}else{var l=e.indexOf(i.id);-1==l?e.push(i.id):e.splice(l,1)}this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()})}}},s._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i,s){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.linegraphOptions=s,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(2),r=i(20);s.prototype=new r,s.prototype.clear=function(){this.groups={},this.amountOfGroups=0},s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.svg.style.height="100%",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||t++);if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{if(this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position)this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom="";else{var i=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+i+Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""}0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var s="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||(s+=this.groups[e].content+"
"));this.dom.textArea.innerHTML=s,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.autoSizeSVG=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(20),d=i(23),l=i(24),c=i(28),p=i(52),u="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height&&void 0!==this.body.domProps.centerContainer.height?this.autoSizeSVG=!0:void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),this._applySampling(a,c),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a=[],h=[];if(t.length>0){for(n=0;n0&&(o=this.groups[t[n]],"stack"==r.barChart.handleOverlap&&"bar"==r.style?"left"==r.yAxisOrientation?a=a.concat(o.getYRange(s)):h=h.concat(o.getYRange(s)):i[t[n]]=o.getYRange(s,t[n]));p.getStackedBarYRange(a,i,t,"__barchartLeft","left"),p.getStackedBarYRange(h,i,t,"__barchartRight","right")}},s.prototype._updateYAxis=function(t,e){var i,s,o=!1,n=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,this.yAxisRight.zeroCrossing=this.yAxisLeft.zeroCrossing,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._convertXcoordinates=function(t){for(var e,i,s=[],o=this.body.util.toScreen,n=0;nc;){c++;var p=h.getCurrent(),u=this.body.util.toScreen(p),m=h.isMajor();this.options.showMinorLabels&&this._repaintMinorText(u,h.getLabelMinor(),t),m&&this.options.showMajorLabels?(u>0&&(void 0==l&&(l=u),this._repaintMajorText(u,h.getLabelMajor(),t)),this._repaintMajorLine(u,t)):this._repaintMinorLine(u,t),h.next()}if(this.options.showMajorLabels){var f=this.body.util.toTime(0),g=h.getLabelMajor(f),v=g.length*(this.props.majorCharWidth||10)+10;(void 0==l||l>v)&&this._repaintMajorText(0,g,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text major measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(45),n=i(1);s.prototype.stack=!0,s.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setData=function(t){this.data=t,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},s.prototype._updateContents=function(t){var e;if(this.options.template){var i=this.parent.itemSet.itemsData.get(this.id);e=this.options.template(i)}else e=this.data.content;if(e!==this.content){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},s.prototype._updateTitle=function(t){null!=this.data.title?t.title=this.data.title||"":t.removeAttribute("title")},s.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=Object.keys(this.data)}for(var i=0;it.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=0,this.dirty=!1}},s.prototype.show=r.prototype.show,s.prototype.hide=r.prototype.hide,s.prototype.repositionX=r.prototype.repositionX,s.prototype.repositionY=function(t){var e="top"===this.options.orientation;this.dom.content.style.top=e?"":"0",this.dom.content.style.bottom=e?"0":"";var i;if(void 0!==this.data.subgroup){var s=this.data.subgroup,o=this.parent.subgroups,r=o[s].index;if(1==e){i=this.parent.subgroups[s].height+t.item.vertical,i+=0==r?t.axis-.5*t.item.vertical:0;var a=this.parent.top;for(var h in o)o.hasOwnProperty(h)&&1==o[h].visible&&o[h].indexr&&(a+=o[h].height+t.item.vertical);i=this.parent.subgroups[s].height+t.item.vertical,this.dom.box.style.top=a+"px",this.dom.box.style.bottom=""}}else this.parent instanceof n?(i=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.top=e?"0":"",this.dom.box.style.bottom=e?"":"0"):(i=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=i+"px"},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}{var o=i(31);i(1)}s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this,this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw item: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.box),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.dom.content.style.maxWidth="none",this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dom.content.style.maxWidth="",this.dirty=!1}this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end);-i>s&&(s=-i),o>2*i&&(o=2*i);var n=Math.max(o-s,1);switch(this.overflow?(this.left=s,this.width=n+this.props.content.width,e=this.props.content.width):(this.left=s,this.width=n,e=Math.min(o-s-2*this.options.padding,this.props.content.width)),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=n+"px",this.options.align){case"left":this.dom.content.style.left="0";break;case"right":this.dom.content.style.left=Math.max(n-e-2*this.options.padding,0)+"px";break;case"center":this.dom.content.style.left=Math.max((n-e-2*this.options.padding)/2,0)+"px";break;default:t=this.overflow?o>0?Math.max(-s,0):-e:0>s?Math.min(-s,o-s-e-2*this.options.padding):0,this.dom.content.style.left=t+"px"}},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fontColor:"black",fontSize:14,fontFace:"verdana",fontFill:void 0,level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1,borderWidthSelected:void 0},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD",layout:"hubsize"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.pixelRatio=1,this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1,this.navigationHammers={existing:[],"new":[]},this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=null,this.lockedOnNodeOffset=null;var o=this;this.groups=new u,this.images=new m,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.startedStabilization=!1,this.stabilized=!1,this.stabilizationIterations=null,this.draggingNodes=!1,this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items,e.data),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(void 0,!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(56),n=i(45),r=i(57),a=i(1),h=i(47),d=i(3),l=i(4),c=i(42),p=i(43),u=i(38),m=i(39),f=i(40),g=i(37),v=i(41),y=i(54),b=i(55),_=i(49);i(50),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(n+142.05338)+91444e-8:12.662/(n+7.4147)+.0964822:1==this.constants.clustering.enabled&&n>=this.constants.clustering.initialMaxNodes?77.5271985/(n+187.266146)+476710517e-13:30.5062972/(n+19.93597763)+.08413486;var r=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);s*=r}else{var a=1.1*Math.abs(o.maxX-o.minX),h=1.1*Math.abs(o.maxY-o.minY),d=this.frame.canvas.clientWidth/a,l=this.frame.canvas.clientHeight/h;s=l>=d?d:l}s>1&&(s=1);var c=this._findCenter(o);if(0==i){var p={position:c,scale:s,animation:t};this.moveTo(p),this.moving=!0,this.start()}else c.x*=s,c.y*=s,c.x-=.5*this.frame.canvas.clientWidth,c.y-=.5*this.frame.canvas.clientHeight,this._setScale(s),this._setTranslation(-c.x,-c.y)},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),this.initializing=!0,t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);this._putDataInSector(),0==e&&(1==this.constants.hierarchicalLayout.enabled?(this._resetLevels(),this._setupHierarchicalLayout()):this.constants.stabilize&&this._stabilize(),this.start()),this.initializing=!1},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1; +for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext){var t=this.frame.canvas.getContext("2d");this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.frame.canvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}var i=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",i._onTap.bind(i)),this.hammer.on("doubletap",i._onDoubleTap.bind(i)),this.hammer.on("hold",i._onHold.bind(i)),this.hammer.on("pinch",i._onPinch.bind(i)),this.hammer.on("touch",i._onTouch.bind(i)),this.hammer.on("dragstart",i._onDragStart.bind(i)),this.hammer.on("drag",i._onDrag.bind(i)),this.hammer.on("dragend",i._onDragEnd.bind(i)),this.hammer.on("mousewheel",i._onMouseWheel.bind(i)),this.hammer.on("DOMMouseScroll",i._onMouseWheel.bind(i)),this.hammer.on("mousemove",i._onMouseMoveTitle.bind(i)),this.hammerFrame=n(this.frame,{prevent_default:!0}),this.hammerFrame.on("release",i._onRelease.bind(i)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=r(),this.keycharm.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.keycharm.bind("up",this._moveUp.bind(t),"keydown"),this.keycharm.bind("up",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("down",this._moveDown.bind(t),"keydown"),this.keycharm.bind("down",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("left",this._moveLeft.bind(t),"keydown"),this.keycharm.bind("left",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("right",this._moveRight.bind(t),"keydown"),this.keycharm.bind("right",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("=",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("=",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num+",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("num+",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("num-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("[",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("[",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("]",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("]",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pageup",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("pageup",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.keycharm.bind("esc",this._createManipulatorBar.bind(t)),this.keycharm.bind("delete",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,this.draggingNodes=!1,null!=e&&1==this.constants.dragNodes){this.draggingNodes=!0,t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1),this.emit("dragStart",{nodeIds:this.getSelection().nodes});for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){this.releaseNode();var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(t){this._handleDragEnd(t)},s.prototype._handleDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw(),0==this.draggingNodes?this.emit("dragEnd",{nodeIds:[]}):this.emit("dragEnd",{nodeIds:this.getSelection().nodes})},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof f&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){var i=!1,s=this.frame.canvas.width,o=this.frame.canvas.height;t!=this.constants.width||e!=this.constants.height||this.frame.style.width!=t||this.frame.style.height!=e?(this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,this.constants.width=t,this.constants.height=e,i=!0):(this.frame.canvas.width!=this.frame.canvas.clientWidth*this.pixelRatio&&(this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,i=!0),this.frame.canvas.height!=this.frame.canvas.clientHeight*this.pixelRatio&&(this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,i=!0)),1==i&&this.emit("resize",{width:this.frame.canvas.width*this.pixelRatio,height:this.frame.canvas.height*this.pixelRatio,oldWidth:s*this.pixelRatio,oldHeight:o*this.pixelRatio})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(Array.isArray(t))this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new f(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t,e){for(var i=this.nodes,s=0,o=t.length;o>s;s++){var n=t[s],r=i[n],a=e[s];r?r.setProperties(a,this.constants):(r=new f(properties,this.images,this.groups,this.constants),i[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._updateValueRange(i)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(Array.isArray(t))this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),this._updateCalculationNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout())},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[],e[t].dynamicEdges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.frame.canvas.width*this.pixelRatio,i=this.frame.canvas.height*this.pixelRatio;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth*this.pixelRatio),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight*this.pixelRatio)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStepLimited(e,this.constants.maxVelocity),s=!0);else for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStep(e),s=!0);if(1==s){var o=this.constants.minVelocity/Math.max(this.scale,.05);return o>.5*this.constants.maxVelocity?!0:this._isMoving(o)}return!1},s.prototype._physicsTick=function(){if(!this.freezeSimulation&&1==this.moving){var t=!1,e=!1;this._doInAllActiveSectors("_initializeForceCalculation");var i=this._doInAllActiveSectors("_discreteStepNodes");1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&(e=this._doInSupportSector("_discreteStepNodes"));for(var s=0;s0){var i=this,s={iterations:i.stabilizationIterations};i.stabilizationIterations=0,i.startedStabilization=!1,setTimeout(function(){i.emit("stabilized",s)},0)}},s.prototype._handleNavigation=function(){if(0!=this.xIncrement||0!=this.yIncrement){var t=this._getTranslation();this._setTranslation(t.x+this.xIncrement,t.y+this.yIncrement)}if(0!=this.zoomIncrement){var e={x:this.frame.canvas.clientWidth/2,y:this.frame.canvas.clientHeight/2};this._zoom(this.scale*(1+this.zoomIncrement),e)}},s.prototype.toggleFreeze=function(){0==this.freezeSimulation?this.freezeSimulation=!0:(this.freezeSimulation=!1,this.start())},s.prototype._configureSmoothCurves=function(t){if(void 0===t&&(t=!0),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this._createBezierNodes();for(var e in this.sectors.support.nodes)this.sectors.support.nodes.hasOwnProperty(e)&&void 0===this.edges[this.sectors.support.nodes[e].parentEdgeId]&&delete this.sectors.support.nodes[e]}else{this.sectors.support.nodes={};for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.edges[i].via=null)}this._updateCalculationNodes(),t||(this.moving=!0,this.start())},s.prototype._createBezierNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic)for(var t in this.edges)if(this.edges.hasOwnProperty(t)){var e=this.edges[t];if(null==e.via){var i="edgeId:".concat(e.id);this.sectors.support.nodes[i]=new f({id:i,mass:1,shape:"circle",image:"",internalMultiplier:1},{},{},this.constants),e.via=this.sectors.support.nodes[i],e.via.parentEdgeId=e.id,e.positionBezierNode()}}},s.prototype._initializeMixinLoaders=function(){for(var t in y)y.hasOwnProperty(t)&&(s.prototype[t]=y[t])},s.prototype.storePosition=function(){console.log("storePosition is depricated: use .storePositions() from now on."),this.storePositions()},s.prototype.storePositions=function(){var t=[];for(var e in this.nodes)if(this.nodes.hasOwnProperty(e)){var i=this.nodes[e],s=!this.nodes.xFixed,o=!this.nodes.yFixed;(this.nodesData._data[e].x!=Math.round(i.x)||this.nodesData._data[e].y!=Math.round(i.y))&&t.push({id:e,x:Math.round(i.x),y:Math.round(i.y),allowedToMoveX:s,allowedToMoveY:o})}this.nodesData.update(t)},s.prototype.getPositions=function(t){var e={};if(void 0!==t){if(1==Array.isArray(t)){for(var i=0;i=1&&(this.easingTime=0,this._redraw=null!=this.lockedOnNodeId?this._lockedRedraw:this._classicRedraw,this.emit("animationFinished"))},s.prototype._classicRedraw=function(){},s.prototype.isActive=function(){return!this.activator||this.activator.active},s.prototype.setScale=function(){return this._setScale()},s.prototype.getScale=function(){return this._getScale()},s.prototype.getCenterCoordinates=function(){return this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight})},t.exports=s},function(t,e,i){function s(t,e,i){if(!e)throw"No network provided";var s=["edges","physics"],n=o.selectiveBridgeObject(s,i);this.options=n.edges,this.physics=n.physics,this.options.smoothCurves=i.smoothCurves,this.network=e,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.title=void 0,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.value=void 0,this.selected=!1,this.hover=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.dirtyLabel=!0,this.from=null,this.to=null,this.via=null,this.originalFromId=[],this.originalToId=[],this.connected=!1,this.widthFixed=!1,this.lengthFixed=!1,this.setProperties(t),this.controlNodesEnabled=!1,this.controlNodes={from:null,to:null,positions:{}},this.connectedNode=null}var o=i(1),n=i(40);s.prototype.setProperties=function(t){if(t){var e=["style","fontSize","fontFace","fontColor","fontFill","width","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","inheritColor"];switch(o.selectiveDeepExtend(e,this.options,t),void 0!==t.from&&(this.fromId=t.from),void 0!==t.to&&(this.toId=t.to),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.dirtyLabel=!0),void 0!==t.title&&(this.title=t.title),void 0!==t.value&&(this.value=t.value),void 0!==t.length&&(this.physics.springLength=t.length),void 0!==t.color&&(this.options.inheritColor=!1,o.isString(t.color)?(this.options.color.color=t.color,this.options.color.highlight=t.color):(void 0!==t.color.color&&(this.options.color.color=t.color.color),void 0!==t.color.highlight&&(this.options.color.highlight=t.color.highlight),void 0!==t.color.hover&&(this.options.color.hover=t.color.hover))),this.connect(),this.widthFixed=this.widthFixed||void 0!==t.width,this.lengthFixed=this.lengthFixed||void 0!==t.length,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.options.style){case"line":this.draw=this._drawLine;break;case"arrow":this.draw=this._drawArrow;break;case"arrow-center":this.draw=this._drawArrowCenter;break;case"dash-line":this.draw=this._drawDashLine;break;default:this.draw=this._drawLine}}},s.prototype.connect=function(){this.disconnect(),this.from=this.network.nodes[this.fromId]||null,this.to=this.network.nodes[this.toId]||null,this.connected=this.from&&this.to,this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this))},s.prototype.disconnect=function(){this.from&&(this.from.detachEdge(this),this.from=null),this.to&&(this.to.detachEdge(this),this.to=null),this.connected=!1},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.getValue=function(){return this.value},s.prototype.setValueRange=function(t,e){if(!this.widthFixed&&void 0!==this.value){var i=(this.options.widthMax-this.options.widthMin)/(e-t);this.options.width=(this.value-t)*i+this.options.widthMin,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier}},s.prototype.draw=function(){throw"Method draw not initialized in edge"},s.prototype.isOverlappingWith=function(t){if(this.connected){var e=10,i=this.from.x,s=this.from.y,o=this.to.x,n=this.to.y,r=t.left,a=t.top,h=this._getDistanceToEdge(i,s,o,n,r,a);return e>h}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t); +if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.max(Math.min(this.widthSelected,this.options.widthMax),.3*this.networkScaleInv):1==this.hover?Math.max(Math.min(this.options.hoverWidth,this.options.widthMax),.3*this.networkScaleInv):Math.max(this.options.width,.3*this.networkScaleInv)},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yd;d++){var l=t.measureText(n[d]).width;h=l>h?l:h}var c=this.options.fontSize*r,p=i-h/2,u=s-c/2;this.labelDimensions={top:u,left:p,width:h,height:c,yLine:o}}void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(this.labelDimensions.left,this.labelDimensions.top,this.labelDimensions.width,this.labelDimensions.height)),t.fillStyle=this.options.fontColor||"black",t.textAlign="center",t.textBaseline="middle",o=this.labelDimensions.yLine;for(var d=0;r>d;d++)t.fillText(n[d],i,o),o+=a}},s.prototype._drawDashLine=function(t){t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth();var e=null;if(void 0!==t.mozDash||void 0!==t.setLineDash){var i=[0];i=void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?[this.options.dash.length,this.options.dash.gap]:[5,5],"undefined"!=typeof t.setLineDash?(t.setLineDash(i),t.lineDashOffset=0):(t.mozDash=i,t.mozDashOffset=0),e=this._line(t),"undefined"!=typeof t.setLineDash?(t.setLineDash([0]),t.lineDashOffset=0):(t.mozDash=[0],t.mozDashOffset=0)}else t.beginPath(),t.lineCap="round",void 0!==this.options.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]):void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke();if(this.label){var s;if(1==this.options.smoothCurves.enabled&&null!=e){var o=.5*(.5*(this.from.x+e.x)+.5*(this.to.x+e.x)),n=.5*(.5*(this.from.y+e.y)+.5*(this.to.y+e.y));s={x:o,y:n}}else s=this._pointOnLine(.5);this._label(t,this.label,s.x,s.y)}},s.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},s.prototype._pointOnCircle=function(t,e,i,s){var o=2*(s-3/8)*Math.PI;return{x:t+i*Math.cos(o),y:e-i*Math.sin(o)}},s.prototype._drawArrowCenter=function(t){var e;if(t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth(),this.from!=this.to){var i=this._line(t),s=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),o=(10+5*this.options.width)*this.options.arrowScaleFactor;if(1==this.options.smoothCurves.enabled&&null!=i){var n=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),r=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:n,y:r}}else e=this._pointOnLine(.5);t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&this._label(t,this.label,e.x,e.y)}else{var a,h,d=.25*Math.max(100,this.physics.springLength),l=this.from;l.width||l.resize(t),l.width>l.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),m=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-m)*s.x+m*this.to.x,p=(1-m)*s.y+m*this.to.y):(c=(1-m)*this.from.x+m*this.to.x,p=(1-m)*this.from.y+m*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var f;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));f={x:g,y:v}}else f=this._pointOnLine(.5);this._label(t,this.label,f.x,f.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(f=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,f.x,f.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){var r=0;if(this.from!=this.to)if(1==this.options.smoothCurves.enabled){var a,h;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)a=this.via.x,h=this.via.y;else{var d=this._getViaCoordinates();a=d.x,h=d.y}var l,c,p,u,m,f,g,v=1e9;for(c=0;10>c;c++)p=.1*c,u=Math.pow(1-p,2)*t+2*p*(1-p)*a+Math.pow(p,2)*i,m=Math.pow(1-p,2)*e+2*p*(1-p)*h+Math.pow(p,2)*s,c>0&&(l=this._getDistanceToLine(f,g,u,m,o,n),v=v>l?l:v),f=u,g=m;r=v}else r=this._getDistanceToLine(t,e,i,s,o,n);else{var u,m,y,b,_=.25*this.physics.springLength,x=this.from;x.width>x.height?(u=x.x+.5*x.width,m=x.y-_):(u=x.x+_,m=x.y-.5*x.height),y=u-o,b=m-n,r=Math.abs(Math.sqrt(y*y+b*b)-_)}return this.labelDimensions.lefto&&this.labelDimensions.topn?0:r},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t,e){var i=this.images[t];if(void 0==i){var s=this;i=new Image,this.images[t]=i,i.onload=function(){s.callback&&s.callback(this)},i.onerror=function(){this.src=e,s.callback&&s.callback(this)},i.src=t}return i},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.allowedToMoveX=!1,this.allowedToMoveY=!1,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.hierarchyEnumerated=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1),e=this.dynamicEdges.indexOf(t),-1!=e&&this.dynamicEdges.splice(e,1),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","brokenImage","radius","fontColor","fontSize","fontFace","fontFill","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage)}switch(void 0!==t.allowedToMoveX?(this.xFixed=!t.allowedToMoveX,this.allowedToMoveX=t.allowedToMoveX):void 0!==t.x&&0==this.allowedToMoveX&&(this.xFixed=!0),void 0!==t.allowedToMoveY?(this.yFixed=!t.allowedToMoveY,this.allowedToMoveY=t.allowedToMoveY):void 0!==t.y&&0==this.allowedToMoveY&&(this.yFixed=!0),this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(this.xFixed)this.fx=0,this.vx=0;else{var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0,this.vx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y) +},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=t.measureText(a[0]).width,p=1;h>p;p++){var u=t.measureText(a[p]).width;c=u>c?u:c}var m=this.options.fontSize*h,f=i-c/2,g=s-m/2;"top"==n&&(g+=.5*d),this.labelDimensions={top:g,left:f,width:c,height:m,yLine:l},void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(f,g,c,m)),t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";for(var p=0;h>p;p++)t.fillText(a[p],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=M.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==E.charAt(e)||" "==E.charAt(e);)e--;if("\n"==E.charAt(e)||""==E.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=M.DELIMITER);var i=O+n();if(C[i])return k=M.DELIMITER,L=i,o(),void o();if(C[O])return k=M.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=M.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=M.IDENTIFIER)}for(k=M.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==M.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)f(t),";"==L&&p()}function f(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=M.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=M.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==M.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=M.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=M.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=M.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var M={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},C={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},E="",T=0,O="",L="",k=M.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=D},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}return{start:e,end:i}},s.prototype.setWindow=function(t,e,i){var s=i&&void 0!==i.animate?i.animate:!0;if(1==arguments.length){var o=arguments[0];this.range.setRange(o.start,o.end,s)}else this.range.setRange(t,e,s)},s.prototype.moveTo=function(t,e){var i=this.range.end-this.range.start,s=r.convert(t,"Date").valueOf(),o=s-i/2,n=s+i/2,a=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(o,n,a)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){h.updateHiddenDates(this.body,this.options.hiddenDates),"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;0===s.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===s.root.clientHeight&&(n=o),i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),d=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,d+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var l=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=l,i.leftContainer.height=l,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var c=i.root.width-i.left.width-i.right.width-n;i.center.width=c,i.centerContainer.width=c,i.top.width=c,i.bottom.width=c,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+i.border.left+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var p=this.props.scrollTop;"bottom"==e.orientation&&(p+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=p+"px",s.left.style.left="0",s.left.style.top=p+"px",s.right.style.left="0",s.right.style.top=p+"px";var u=0==this.props.scrollTop?"hidden":"",m=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";if(s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=m,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=m,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=m,this.components.forEach(function(e){t=e.redraw()||t}),t){var f=2;this.redrawCount0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,m=e+(s-r/2),f=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,m),this.bezierCurveTo(l,m+d,p+h,f,p,f),this.bezierCurveTo(p-h,f,t,m+d,t,m),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){function s(t,e){this.groupId=t,this.options=e}var o=i(2),n=i(53);s.prototype.getYRange=function(t){var e=t[0].y,i=t[0].y;for(j=0;jt[j].y?t[j].y:e,i=i0){var r,a,h=Number(i.svg.style.height.replace("px",""));if(r=o.getSVGElement("path",i.svgElements,i.svg),r.setAttributeNS(null,"class",e.className),void 0!==e.style&&r.setAttributeNS(null,"style",e.style),a=1==e.options.catmullRom.enabled?s._catmullRom(t,e):s._linear(t),1==e.options.shaded.enabled){var d,l=o.getSVGElement("path",i.svgElements,i.svg);d="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+a+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+h+" "+a+"L"+t[t.length-1].x+","+h,l.setAttributeNS(null,"class",e.className+" fill"),void 0!==e.options.shaded.style&&l.setAttributeNS(null,"style",e.options.shaded.style),l.setAttributeNS(null,"d",d)}r.setAttributeNS(null,"d","M"+a),1==e.options.drawPoints.enabled&&n.draw(t,e,i)}},s._catmullRomUniform=function(t){for(var e,i,s,o,n,r,a=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",h=1/6,d=t.length,l=0;d-1>l;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,m,f,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,D=0;S-1>D;D++)s=0==D?t[0]:t[D-1],o=t[D],n=t[D+1],r=S>D+2?t[D+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,m=3*x*(x+v),m>0&&(m=1/m),f=3*g*(g+v),f>0&&(f=1/f),a={x:(-b*s.x+p*o.x+_*n.x)*m,y:(-b*s.y+p*o.y+_*n.y)*m},h={x:(y*o.x+u*n.x-b*r.x)*f,y:(y*o.y+u*n.y-b*r.y)*f},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s._linear=function(t){for(var e="",i=0;it[s].y?t[s].y:e,i=i0&&(n=Math.min(n,Math.abs(c[d-1].x-r))),a=s._getSafeDrawData(n,h,m);else{var g=d+(p[r].amount-p[r].resolved),v=d-(p[r].resolved+1);g0&&(n=Math.min(n,Math.abs(c[v].x-r))),a=s._getSafeDrawData(n,h,m),p[r].resolved+=1,"stack"==h.options.barChart.handleOverlap?(f=p[r].accumulated,p[r].accumulated+=h.zeroPosition-c[d].y):"sideBySide"==h.options.barChart.handleOverlap&&(a.width=a.width/p[r].amount,a.offset+=p[r].resolved*a.width-.5*a.width*(p[r].amount+1),"left"==h.options.barChart.align?a.offset-=.5*a.width:"right"==h.options.barChart.align&&(a.offset+=.5*a.width))}o.drawBar(c[d].x+a.offset,c[d].y-f,a.width,h.zeroPosition-c[d].y,h.className+" bar",i.svgElements,i.svg),1==h.options.drawPoints.enabled&&o.drawPoint(c[d].x+a.offset,c[d].y,h,i.svgElements,i.svg)}},s._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.getStackedBarYRange=function(t,e,i,o,n){if(t.length>0){t.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x});var r={};s._getDataIntersections(r,t),e[o]=s._getStackedBarYRange(r,t),e[o].yAxisOrientation=n,i.push(o)}},s._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=ot[j].y?t[j].y:e,i=is;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e){var i,s,o;!function(n,r){s=[],i=r,o="function"==typeof i?i.apply(e,s):i,!(void 0!==o&&(t.exports=o))}(this,function(){function t(t){var e,i=t&&t.preventDefault||!1,s={keydown:{},keyup:{}},o={};for(e=97;122>=e;e++)o[String.fromCharCode(e)]={code:65+(e-97),shift:!1};for(e=65;90>=e;e++)o[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;9>=e;e++)o[""+e]={code:48+e,shift:!1};for(e=1;12>=e;e++)o["F"+e]={code:111+e,shift:!1};for(e=0;9>=e;e++)o["num"+e]={code:96+e,shift:!1};o["num*"]={code:106,shift:!1},o["num+"]={code:107,shift:!1},o["num-"]={code:109,shift:!1},o["num/"]={code:111,shift:!1},o["num."]={code:110,shift:!1},o.left={code:37,shift:!1},o.up={code:38,shift:!1},o.right={code:39,shift:!1},o.down={code:40,shift:!1},o.space={code:32,shift:!1},o.enter={code:13,shift:!1},o.shift={code:16,shift:void 0},o.esc={code:27,shift:!1},o.backspace={code:8,shift:!1},o.tab={code:9,shift:!1},o.ctrl={code:17,shift:!1},o.alt={code:18,shift:!1},o["delete"]={code:46,shift:!1},o.pageup={code:33,shift:!1},o.pagedown={code:34,shift:!1},o["="]={code:187,shift:!1},o["-"]={code:189,shift:!1},o["]"]={code:221,shift:!1},o["["]={code:219,shift:!1};var n=function(t){a(t,"keydown")},r=function(t){a(t,"keyup")},a=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n0)for(i in He)s=He[i],o=e[s],"undefined"!=typeof o&&(t[s]=o);return t}function b(t){return 0>t?Math.ceil(t):Math.floor(t)}function _(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&k(t[s])!==k(e[s]))&&r++;return r+n}function T(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=mi[t]||fi[e]||e}return t}function O(t){var e,i,s={};for(i in t)a(t,i)&&(e=T(i),e&&(s[e]=t[i]));return s}function L(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}De[t]=function(s,o){var r,a,h=De._locale[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=De().utc().set(i,t);return h.call(De._locale,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function k(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function N(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function I(t,e,i){return pe(De([t,11,31+e-i]),e,i).week}function A(t){return z(t)?366:365}function z(t){return t%4===0&&t%100!==0||t%400===0}function P(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Ne]<0||t._a[Ne]>11?Ne:t._a[Ie]<1||t._a[Ie]>N(t._a[ke],t._a[Ne])?Ie:t._a[Ae]<0||t._a[Ae]>24||24===t._a[Ae]&&(0!==t._a[ze]||0!==t._a[Pe]||0!==t._a[Re])?Ae:t._a[ze]<0||t._a[ze]>59?ze:t._a[Pe]<0||t._a[Pe]>59?Pe:t._a[Re]<0||t._a[Re]>999?Re:-1,t._pf._overflowDayOfYear&&(ke>e||e>Ie)&&(e=Ie),t._pf.overflow=e)}function R(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length&&t._pf.bigHour===n)),t._isValid}function F(t){return t?t.toLowerCase().replace("_","-"):t}function H(t){for(var e,i,s,o,n=0;n0;){if(s=Y(o.slice(0,e).join("-")))return s;if(i&&i.length>=e&&E(o,i,!0)>=e-1)break;e--}n++}return null}function Y(t){var e=null;if(!Fe[t]&&Ye)try{e=De.locale(),!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),De.locale(e)}catch(i){}return Fe[t]}function W(t,e){var i,s;return e._isUTC?(i=e.clone(),s=(De.isMoment(t)||C(t)?+t:+De(t))-+i,i._d.setTime(+i._d+s),De.updateOffset(i,!1),i):De(t).local()}function B(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,i,s=t.match(je);for(e=0,i=s.length;i>e;e++)s[e]=_i[s[e]]?_i[s[e]]:B(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function j(t,e){return t.isValid()?(e=U(e,t.localeData()),gi[e]||(gi[e]=G(e)),gi[e](t)):t.localeData().invalidDate()}function U(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Ue.lastIndex=0;s>=0&&Ue.test(t);)t=t.replace(Ue,i),Ue.lastIndex=0,s-=1;return t}function V(t,e){var i,s=e._strict;switch(t){case"Q":return ii;case"DDDD":return oi;case"YYYY":case"GGGG":case"gggg":return s?ni:qe;case"Y":case"G":case"g":return ai;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?ri:Ze;case"S":if(s)return ii;case"SS":if(s)return si;case"SSS":if(s)return oi;case"DDD":return Xe;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Qe;case"a":case"A":return e._locale._meridiemParse;case"x":return ti;case"X":return ei;case"Z":case"ZZ":return $e;case"T":return Je;case"SSSS":return Ke;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?si:Ve;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ve;case"Do":return s?e._locale._ordinalParse:e._locale._ordinalParseLenient;default:return i=new RegExp(ee(te(t.replace("\\","")),"i"))}}function X(t){t=t||"";var e=t.match($e)||[],i=e[e.length-1]||[],s=(i+"").match(pi)||["-",0,0],o=+(60*s[1])+k(s[2]);return"+"===s[0]?-o:o}function q(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Ne]=3*(k(e)-1));break;case"M":case"MM":null!=e&&(o[Ne]=k(e)-1);break;case"MMM":case"MMMM":s=i._locale.monthsParse(e,t,i._strict),null!=s?o[Ne]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ie]=k(e));break;case"Do":null!=e&&(o[Ie]=k(parseInt(e.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=k(e));break;case"YY":o[ke]=De.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[ke]=k(e);break;case"a":case"A":i._isPm=i._locale.isPM(e);break;case"h":case"hh":i._pf.bigHour=!0;case"H":case"HH":o[Ae]=k(e);break;case"m":case"mm":o[ze]=k(e);break;case"s":case"ss":o[Pe]=k(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Re]=k(1e3*("0."+e));break;case"x":i._d=new Date(k(e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=X(e);break;case"dd":case"ddd":case"dddd":s=i._locale.weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=k(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=De.parseTwoDigitYear(e)}}function Z(t){var e,i,s,o,n,a,h;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[ke],pe(De(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(n=t._locale._week.dow,a=t._locale._week.doy,i=r(e.gg,t._a[ke],pe(De(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ue(i,s,o,a,n),t._a[ke]=h.year,t._dayOfYear=h.dayOfYear}function K(t){var e,i,s,o,n=[];if(!t._d){for(s=$(t),t._w&&null==t._a[Ie]&&null==t._a[Ne]&&Z(t),t._dayOfYear&&(o=r(t._a[ke],s[ke]),t._dayOfYear>A(o)&&(t._pf._overflowDayOfYear=!0),i=he(o,0,t._dayOfYear),t._a[Ne]=i.getUTCMonth(),t._a[Ie]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Ae]&&0===t._a[ze]&&0===t._a[Pe]&&0===t._a[Re]&&(t._nextDay=!0,t._a[Ae]=0),t._d=(t._useUTC?he:ae).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm),t._nextDay&&(t._a[Ae]=24)}}function Q(t){var e;t._d||(e=O(t._i),t._a=[e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],K(t))}function $(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function J(t){if(t._f===De.ISO_8601)return void se(t);t._a=[],t._pf.empty=!0;var e,i,s,o,r,a=""+t._i,h=a.length,d=0;for(s=U(t._f,t._locale).match(je)||[],e=0;e0&&t._pf.unusedInput.push(r),a=a.slice(a.indexOf(i)+i.length),d+=i.length),_i[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),q(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._pf.bigHour===!0&&t._a[Ae]<=12&&(t._pf.bigHour=n),t._isPm&&t._a[Ae]<12&&(t._a[Ae]+=12),t._isPm===!1&&12===t._a[Ae]&&(t._a[Ae]=0),K(t),P(t)}function te(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function ee(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ie(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));v(t,i||e)}function se(t){var e,i,s=t._i,o=hi.exec(s);if(o){for(t._pf.iso=!0,e=0,i=li.length;i>e;e++)if(li[e][1].exec(s)){t._f=li[e][0]+(o[6]||" ");break}for(e=0,i=ci.length;i>e;e++)if(ci[e][1].exec(s)){t._f+=ci[e][0];break}s.match($e)&&(t._f+="Z"),J(t)}else t._isValid=!1}function oe(t){se(t),t._isValid===!1&&(delete t._isValid,De.createFromInputFallback(t))}function ne(t,e){var i,s=[];for(i=0;it&&a.setFullYear(t),a}function he(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function de(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function le(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ce(t,e,i){var s=De.duration(t).abs(),o=Oe(s.as("s")),n=Oe(s.as("m")),r=Oe(s.as("h")),a=Oe(s.as("d")),h=Oe(s.as("M")),d=Oe(s.as("y")),l=o0,l[4]=i,le.apply({},l)}function pe(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=De(t).add(n,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ue(t,e,i,s,o){var n,r,a=he(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:A(t-1)+r}}function me(t){var e,i=t._i,s=t._f;return t._locale=t._locale||De.localeData(t._l),null===i||s===n&&""===i?De.invalid({nullInput:!0}):("string"==typeof i&&(t._i=i=t._locale.preparse(i)),De.isMoment(i)?new f(i,!0):(s?M(s)?ie(t):J(t):re(t),e=new f(t),e._nextDay&&(e.add(1,"d"),e._nextDay=n),e))}function fe(t,e){var i,s;if(1===e.length&&M(e[0])&&(e=e[0]),!e.length)return De();for(i=e[0],s=1;s=0?"+":"-";return e+_(Math.abs(t),6)},gg:function(){return _(this.weekYear()%100,2)},gggg:function(){return _(this.weekYear(),4)},ggggg:function(){return _(this.weekYear(),5)},GG:function(){return _(this.isoWeekYear()%100,2)},GGGG:function(){return _(this.isoWeekYear(),4)},GGGGG:function(){return _(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return k(this.milliseconds()/100)},SS:function(){return _(k(this.milliseconds()/10),2)},SSS:function(){return _(this.milliseconds(),3)},SSSS:function(){return _(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+":"+_(k(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+_(k(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},xi={},wi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];yi.length;)Ce=yi.pop(),_i[Ce+"o"]=u(_i[Ce],Ce);for(;bi.length;)Ce=bi.pop(),_i[Ce+Ce]=p(_i[Ce],2);_i.DDDD=p(_i.DDD,3),v(m.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t,e,i){var s,o,n;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;12>s;s++){if(o=De.utc([2e3,s]),i&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(o,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(o,"").replace(".","")+"$","i")),i||this._monthsParse[s]||(n="^"+this.months(o,"")+"|^"+this.monthsShort(o,""),this._monthsParse[s]=new RegExp(n.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[s].test(t))return s;if(i&&"MMM"===e&&this._shortMonthsParse[s].test(t))return s;if(!i&&this._monthsParse[s].test(t))return s}},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=De([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e,i){var s=this._calendar[t];return"function"==typeof s?s.apply(e,[i]):s},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",_ordinalParse:/\d{1,2}/,preparse:function(t){return t},postformat:function(t){return t},week:function(t){return pe(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),De=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=h(),me(o)},De.suppressDeprecationWarnings=!1,De.createFromInputFallback=l("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),De.min=function(){var t=[].slice.call(arguments,0);return fe("isBefore",t)},De.max=function(){var t=[].slice.call(arguments,0);return fe("isAfter",t)},De.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=h(),me(o).utc()},De.unix=function(t){return De(1e3*t)},De.duration=function(t,e){var i,s,o,n,r=t,h=null;return De.isDuration(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(h=Be.exec(t))?(i="-"===h[1]?-1:1,r={y:0,d:k(h[Ie])*i,h:k(h[Ae])*i,m:k(h[ze])*i,s:k(h[Pe])*i,ms:k(h[Re])*i}):(h=Ge.exec(t))?(i="-"===h[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},r={y:o(h[2]),M:o(h[3]),d:o(h[4]),h:o(h[5]),m:o(h[6]),s:o(h[7]),w:o(h[8])}):"object"==typeof r&&("from"in r||"to"in r)&&(n=w(De(r.from),De(r.to)),r={},r.ms=n.milliseconds,r.M=n.months),s=new g(r),De.isDuration(t)&&a(t,"_locale")&&(s._locale=t._locale),s},De.version=Ee,De.defaultFormat=di,De.ISO_8601=function(){},De.momentProperties=He,De.updateOffset=function(){},De.relativeTimeThreshold=function(t,e){return vi[t]===n?!1:e===n?vi[t]:(vi[t]=e,!0)},De.lang=l("moment.lang is deprecated. Use moment.locale instead.",function(t,e){return De.locale(t,e)}),De.locale=function(t,e){var i;return t&&(i="undefined"!=typeof e?De.defineLocale(t,e):De.localeData(t),i&&(De.duration._locale=De._locale=i)),De._locale._abbr},De.defineLocale=function(t,e){return null!==e?(e.abbr=t,Fe[t]||(Fe[t]=new m),Fe[t].set(e),De.locale(t),Fe[t]):(delete Fe[t],null)},De.langData=l("moment.langData is deprecated. Use moment.localeData instead.",function(t){return De.localeData(t)}),De.localeData=function(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return De._locale;if(!M(t)){if(e=Y(t))return e;t=[t]}return H(t)},De.isMoment=function(t){return t instanceof f||null!=t&&a(t,"_isAMomentObject")},De.isDuration=function(t){return t instanceof g};for(Ce=wi.length-1;Ce>=0;--Ce)L(wi[Ce]);De.normalizeUnits=function(t){return T(t)},De.invalid=function(t){var e=De.utc(0/0);return null!=t?v(e._pf,t):e._pf.userInvalidated=!0,e},De.parseZone=function(){return De.apply(null,arguments).parseZone()},De.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)},v(De.fn=f.prototype,{clone:function(){return De(this) +},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=De(this).utc();return 00:!1},parsingFlags:function(){return v({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(t){return this.zone(0,t)},local:function(t){return this._isUTC&&(this.zone(0,t),this._isUTC=!1,t&&this.add(this._dateTzOffset(),"m")),this},format:function(t){var e=j(this,t||De.defaultFormat);return this.localeData().postformat(e)},add:S(1,"add"),subtract:S(-1,"subtract"),diff:function(t,e,i){var s,o,n,r=W(t,this),a=6e4*(this.zone()-r.zone());return e=T(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+r.daysInMonth()),o=12*(this.year()-r.year())+(this.month()-r.month()),n=this-De(this).startOf("month")-(r-De(r).startOf("month")),n-=6e4*(this.zone()-De(this).startOf("month").zone()-(r.zone()-De(r).startOf("month").zone())),o+=n/s,"year"===e&&(o/=12)):(s=this-r,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),i?o:b(o)},from:function(t,e){return De.duration({to:this,from:t}).locale(this.locale()).humanize(!e)},fromNow:function(t){return this.from(De(),t)},calendar:function(t){var e=t||De(),i=W(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.localeData().calendar(o,this,De(e)))},isLeapYear:function(){return z(this.year())},isDST:function(){return this.zone()+t):(i=De.isMoment(t)?+t:+De(t),i<+this.clone().startOf(e))},isBefore:function(t,e){var i;return e=T("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=De.isMoment(t)?t:De(t),+t>+this):(i=De.isMoment(t)?+t:+De(t),+this.clone().endOf(e)t?this:t}),max:l("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=De.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i,s=this._offset||0;return null==t?this._isUTC?s:this._dateTzOffset():("string"==typeof t&&(t=X(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(i=this._dateTzOffset()),this._offset=t,this._isUTC=!0,null!=i&&this.subtract(i,"m"),s!==t&&(!e||this._changeInProgress?D(this,De.duration(s-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,De.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?De(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return N(this.year(),this.month())},dayOfYear:function(t){var e=Oe((De(this).startOf("day")-De(this).startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=pe(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==t?e:this.add(t-e,"y")},isoWeekYear:function(t){var e=pe(this,1,4).year;return null==t?e:this.add(t-e,"y")},week:function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},isoWeek:function(t){var e=pe(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},weekday:function(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return I(this.year(),1,4)},weeksInYear:function(){var t=this.localeData()._week;return I(this.year(),t.dow,t.doy)},get:function(t){return t=T(t),this[t]()},set:function(t,e){return t=T(t),"function"==typeof this[t]&&this[t](e),this},locale:function(t){var e;return t===n?this._locale._abbr:(e=De.localeData(t),null!=e&&(this._locale=e),this)},lang:l("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return t===n?this.localeData():this.locale(t)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),De.fn.millisecond=De.fn.milliseconds=be("Milliseconds",!1),De.fn.second=De.fn.seconds=be("Seconds",!1),De.fn.minute=De.fn.minutes=be("Minutes",!1),De.fn.hour=De.fn.hours=be("Hours",!0),De.fn.date=be("Date",!0),De.fn.dates=l("dates accessor is deprecated. Use date instead.",be("Date",!0)),De.fn.year=be("FullYear",!0),De.fn.years=l("years accessor is deprecated. Use year instead.",be("FullYear",!0)),De.fn.days=De.fn.day,De.fn.months=De.fn.month,De.fn.weeks=De.fn.week,De.fn.isoWeeks=De.fn.isoWeek,De.fn.quarters=De.fn.quarter,De.fn.toJSON=De.fn.toISOString,v(De.duration.fn=g.prototype,{_bubble:function(){var t,e,i,s=this._milliseconds,o=this._days,n=this._months,r=this._data,a=0;r.milliseconds=s%1e3,t=b(s/1e3),r.seconds=t%60,e=b(t/60),r.minutes=e%60,i=b(e/60),r.hours=i%24,o+=b(i/24),a=b(_e(o)),o-=b(xe(a)),n+=b(o/30),o%=30,a+=b(n/12),n%=12,r.days=o,r.months=n,r.years=a},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return b(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12)},humanize:function(t){var e=ce(this,!t,this.localeData());return t&&(e=this.localeData().pastFuture(+this,e)),this.localeData().postformat(e)},add:function(t,e){var i=De.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=De.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=T(t),this[t.toLowerCase()+"s"]()},as:function(t){var e,i;if(t=T(t),"month"===t||"year"===t)return e=this._days+this._milliseconds/864e5,i=this._months+12*_e(e),"month"===t?i:i/12;switch(e=this._days+Math.round(xe(this._months/12)),t){case"week":return e/7+this._milliseconds/6048e5;case"day":return e+this._milliseconds/864e5;case"hour":return 24*e+this._milliseconds/36e5;case"minute":return 24*e*60+this._milliseconds/6e4;case"second":return 24*e*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*e*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+t)}},lang:De.fn.lang,locale:De.fn.locale,toIsoString:l("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"},localeData:function(){return this._locale}}),De.duration.fn.toString=De.duration.fn.toISOString;for(Ce in ui)a(ui,Ce)&&we(Ce.toLowerCase());De.duration.fn.asMilliseconds=function(){return this.as("ms")},De.duration.fn.asSeconds=function(){return this.as("s")},De.duration.fn.asMinutes=function(){return this.as("m")},De.duration.fn.asHours=function(){return this.as("h")},De.duration.fn.asDays=function(){return this.as("d")},De.duration.fn.asWeeks=function(){return this.as("weeks")},De.duration.fn.asMonths=function(){return this.as("M")},De.duration.fn.asYears=function(){return this.as("y")},De.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ye?o.exports=De:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(Te.moment=Me),De}.call(e,i,e,o),!(s!==n&&(o.exports=s)),Se(!0))}).call(this)}).call(e,function(){return this}(),i(71)(t))},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){D.register(t)}),w.onTouch(a.DOCUMENT,v,D.detect),w.onTouch(a.DOCUMENT,y,D.detect),a.READY=!0)}var a=function M(t,e){return new M.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",m=a.POINTER_TOUCH="touch",f=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(D,d),a&&(d.changedLength=h,d.eventType=a,s.call(D,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(D,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=m;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(f,s)&&(o=f),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return D.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[m]=i===(e.MSPOINTER_TYPE_TOUCH||m),s[f]=i===(e.MSPOINTER_TYPE_PEN||f),s[t]},reset:function(){this.pointers={}}},D=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?D.startDetect(i,t):t.eventType==_&&D.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=D.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=D.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=D.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=D.current,h=D.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1),o=i(40);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new o({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](o[0],o[1]):this[t](e))}return this._loadLatestSector(),i},e._doInSupportSector=function(t,e){var i=!1;if(void 0===e)this._switchToSupportSector(),i=this[t]();else{this._switchToSupportSector();var s=Array.prototype.splice.call(arguments,1);i=s.length>1?this[t](s[0],s[1]):this[t](e)}return this._loadLatestSector(),i},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ei;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e,!0)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,!1,!0)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(40),n=i(37);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM={},this._manipulationReleaseOverload=function(){},delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode,this.controlNodesActive=!1},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=this.manipulationDiv,e=this.closeDiv,i=this.editModeDiv;1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,this.manipulationDOM={},1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM.addNodeSpan=document.createElement("span"),this.manipulationDOM.addNodeSpan.className="network-manipulationUI add",this.manipulationDOM.addNodeLabelSpan=document.createElement("span"),this.manipulationDOM.addNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addNodeLabelSpan.innerHTML=t.addNode,this.manipulationDOM.addNodeSpan.appendChild(this.manipulationDOM.addNodeLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.addEdgeSpan=document.createElement("span"),this.manipulationDOM.addEdgeSpan.className="network-manipulationUI connect",this.manipulationDOM.addEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.addEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addEdgeLabelSpan.innerHTML=t.addEdge,this.manipulationDOM.addEdgeSpan.appendChild(this.manipulationDOM.addEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.addNodeSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.addEdgeSpan),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?(this.manipulationDOM.seperatorLineDiv2=document.createElement("div"),this.manipulationDOM.seperatorLineDiv2.className="network-seperatorLine",this.manipulationDOM.editNodeSpan=document.createElement("span"),this.manipulationDOM.editNodeSpan.className="network-manipulationUI edit",this.manipulationDOM.editNodeLabelSpan=document.createElement("span"),this.manipulationDOM.editNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editNodeLabelSpan.innerHTML=t.editNode,this.manipulationDOM.editNodeSpan.appendChild(this.manipulationDOM.editNodeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv2),this.manipulationDiv.appendChild(this.manipulationDOM.editNodeSpan)):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.seperatorLineDiv3=document.createElement("div"),this.manipulationDOM.seperatorLineDiv3.className="network-seperatorLine",this.manipulationDOM.editEdgeSpan=document.createElement("span"),this.manipulationDOM.editEdgeSpan.className="network-manipulationUI edit",this.manipulationDOM.editEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.editEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editEdgeLabelSpan.innerHTML=t.editEdge,this.manipulationDOM.editEdgeSpan.appendChild(this.manipulationDOM.editEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv3),this.manipulationDiv.appendChild(this.manipulationDOM.editEdgeSpan)),0==this._selectionIsEmpty()&&(this.manipulationDOM.seperatorLineDiv4=document.createElement("div"),this.manipulationDOM.seperatorLineDiv4.className="network-seperatorLine",this.manipulationDOM.deleteSpan=document.createElement("span"),this.manipulationDOM.deleteSpan.className="network-manipulationUI delete",this.manipulationDOM.deleteLabelSpan=document.createElement("span"),this.manipulationDOM.deleteLabelSpan.className="network-manipulationLabel",this.manipulationDOM.deleteLabelSpan.innerHTML=t.del,this.manipulationDOM.deleteSpan.appendChild(this.manipulationDOM.deleteLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv4),this.manipulationDiv.appendChild(this.manipulationDOM.deleteSpan)),this.manipulationDOM.addNodeSpan.onclick=this._createAddNodeToolbar.bind(this),this.manipulationDOM.addEdgeSpan.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDOM.editNodeSpan.onclick=this._editNode.bind(this):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.editEdgeSpan.onclick=this._createEditEdgeToolbar.bind(this)),0==this._selectionIsEmpty()&&(this.manipulationDOM.deleteSpan.onclick=this._deleteSelected.bind(this)),this.closeDiv.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{for(;this.editModeDiv.hasChildNodes();)this.editModeDiv.removeChild(this.editModeDiv.firstChild);this.manipulationDOM.editModeSpan=document.createElement("span"),this.manipulationDOM.editModeSpan.className="network-manipulationUI edit editmode",this.manipulationDOM.editModeLabelSpan=document.createElement("span"),this.manipulationDOM.editModeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editModeLabelSpan.innerHTML=t.edit,this.manipulationDOM.editModeSpan.appendChild(this.manipulationDOM.editModeLabelSpan),this.editModeDiv.appendChild(this.manipulationDOM.editModeSpan),this.manipulationDOM.editModeSpan.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.addDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.edgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleDragEnd=this._handleDragEnd,this._handleTouch=this._handleConnect,this._manipulationReleaseOverload=function(){},this._handleDragStart=function(){},this._handleDragEnd=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.editEdgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._manipulationReleaseOverload=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);if(null!=e)if(e.clusterSize>1)alert(this.constants.locales[this.constants.locale].createEdgeError);else{this._selectObject(e,!1);var i=this.sectors.support.nodes;i.targetNode=new o({id:"targetNode"},{},{},this.constants);var s=i.targetNode;s.x=e.x,s.y=e.y,this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:s.id},this,this.constants);var r=this.edges.connectionEdge;r.from=e,r.connected=!0,r.options.smoothCurves={enabled:!0,dynamic:!1,type:"continuous",roundness:.5},r.selected=!0,r.to=s,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center),i=this.edges.connectionEdge;i.to.x=this._XconvertDOMtoCanvas(e.x),i.to.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()}}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){var e=this._getPointer(t.gesture.center);this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var i=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var s=this._getNodeAt(e);null!=s&&(s.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(i,s.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}}; +if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(45));e._cleanNavigation=function(){if(0!=this.navigationHammers.existing.length){for(var t=0;t0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,o.edges.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._setLevelDirected=function(t,e,i){this.nodes[i].hierarchyEnumerated=!0;for(var s=0;s1&&o.hierarchyEnumerated===!1&&this._setLevelDirected(o.level,o.edges,o.id)}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t){function e(t){throw new Error("Cannot find module '"+t+"'.")}e.keys=function(){return[]},e.resolve=e,t.exports=e,e.id=67},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,m=4/3,f=this.constants.physics.repulsion.nodeDistance,g=f;for(d=0;di&&(r=.5*g>i?1:v*i+m,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),m=.5*u,f=.5*(o+r),g=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:f-m,maxX:f+m,minY:g-m,maxY:g+m},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); //# sourceMappingURL=vis.map diff --git a/package.json b/package.json index 0497244a..126c46b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vis", - "version": "3.7.1-SNAPSHOT", + "version": "3.7.1", "description": "A dynamic, browser-based visualization library.", "homepage": "http://visjs.org/", "repository": { From d86a535c07a005d0e3a863c91b17efe9f3a293a8 Mon Sep 17 00:00:00 2001 From: jos Date: Fri, 28 Nov 2014 15:52:48 +0100 Subject: [PATCH 3/6] Bumped version number to 3.7.2-SNAPSHOT --- bower.json | 2 +- dist/vis.js | 2 +- dist/vis.min.js | 2 +- package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bower.json b/bower.json index 53e6868f..ed4dcd5b 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "vis", - "version": "3.7.1", + "version": "3.7.2-SNAPSHOT", "main": ["dist/vis.min.js", "dist/vis.min.css"], "description": "A dynamic, browser-based visualization library.", "homepage": "http://visjs.org/", diff --git a/dist/vis.js b/dist/vis.js index 367d9a21..3887dae3 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -4,7 +4,7 @@ * * A dynamic, browser-based visualization library. * - * @version 3.7.1 + * @version 3.7.2-SNAPSHOT * @date 2014-11-28 * * @license diff --git a/dist/vis.min.js b/dist/vis.min.js index 975a5b3c..64112341 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -4,7 +4,7 @@ * * A dynamic, browser-based visualization library. * - * @version 3.7.1 + * @version 3.7.2-SNAPSHOT * @date 2014-11-28 * * @license diff --git a/package.json b/package.json index 126c46b1..be443225 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vis", - "version": "3.7.1", + "version": "3.7.2-SNAPSHOT", "description": "A dynamic, browser-based visualization library.", "homepage": "http://visjs.org/", "repository": { From 8bd82ab84c5ac301dc0b3910926b72fb061527b9 Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Fri, 28 Nov 2014 15:18:05 +0000 Subject: [PATCH 4/6] updated histroy --- .gitignore | 1 + HISTORY.md | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c880df05..1c5cf83a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea +.git *.iml node_modules .project diff --git a/HISTORY.md b/HISTORY.md index 63211d5b..818c5454 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,6 +2,11 @@ http://visjs.org +## not yet released, version 3.7.2-SNAPSHOT + + + + ## 2014-11-28, version 3.7.1 ### Timeline @@ -21,12 +26,12 @@ http://visjs.org - Fixed docs - Fixed height increase on scrolling if only `graphHeight` is defined. - ### Network - dragEnd event now does not give the selected nodes if only the viewport has been dragged #453 - merged high DPI fix by @crubier, thanks! + ## 2014-11-14, version 3.7.0 ### Graph2D From b0b7c0b663489b643e138ef5405c174ec3e698dc Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Fri, 28 Nov 2014 15:24:02 +0000 Subject: [PATCH 5/6] updated .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1c5cf83a..6a5d9713 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .idea -.git +.c9 *.iml node_modules .project From 090383d462bbade96e4b15a599f5202b9062d3a3 Mon Sep 17 00:00:00 2001 From: jos Date: Tue, 2 Dec 2014 12:10:48 +0100 Subject: [PATCH 6/6] Fixes for ES5 strict mode --- dist/vis.js | 34 ++++++++++++++------------- dist/vis.map | 2 +- dist/vis.min.js | 28 +++++++++++----------- lib/graph3d/Camera.js | 4 ++-- lib/graph3d/Graph3d.js | 12 +++++----- lib/graph3d/Point2d.js | 4 ++-- lib/header.js | 2 ++ lib/network/Network.js | 2 +- lib/network/dotparser.js | 2 +- lib/network/mixins/NavigationMixin.js | 4 ++-- lib/timeline/Range.js | 2 +- 11 files changed, 50 insertions(+), 46 deletions(-) diff --git a/dist/vis.js b/dist/vis.js index 3887dae3..9143fa16 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -5,7 +5,7 @@ * A dynamic, browser-based visualization library. * * @version 3.7.2-SNAPSHOT - * @date 2014-11-28 + * @date 2014-12-02 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -23,6 +23,8 @@ * Vis.js may be distributed under either license. */ +"use strict"; + (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -3687,9 +3689,9 @@ return /******/ (function(modules) { // webpackBootstrap } } - function sortNumber(a, b) { + var sortNumber = function (a, b) { return a - b; - } + }; dataX.sort(sortNumber); dataY.sort(sortNumber); @@ -5422,20 +5424,20 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Event} event * @return {Number} mouse x */ - getMouseX = function(event) { + function getMouseX (event) { if ('clientX' in event) return event.clientX; return event.targetTouches[0] && event.targetTouches[0].clientX || 0; - }; + } /** * Get the vertical mouse position from a mouse event * @param {Event} event * @return {Number} mouse y */ - getMouseY = function(event) { + function getMouseY (event) { if ('clientY' in event) return event.clientY; return event.targetTouches[0] && event.targetTouches[0].clientY || 0; - }; + } module.exports = Graph3d; @@ -5456,7 +5458,7 @@ return /******/ (function(modules) { // webpackBootstrap * Documentation: * http://en.wikipedia.org/wiki/3D_projection */ - Camera = function () { + function Camera() { this.armLocation = new Point3d(); this.armRotation = {}; this.armRotation.horizontal = 0; @@ -5467,7 +5469,7 @@ return /******/ (function(modules) { // webpackBootstrap this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); this.calculateCameraOrientation(); - }; + } /** * Set the location (origin) of the arm @@ -5813,10 +5815,10 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Number} [x] * @param {Number} [y] */ - Point2d = function (x, y) { + function Point2d (x, y) { this.x = x !== undefined ? x : 0; this.y = y !== undefined ? y : 0; - }; + } module.exports = Point2d; @@ -7861,7 +7863,7 @@ return /******/ (function(modules) { // webpackBootstrap var initTime = new Date().valueOf(); var anyChanged = false; - function next() { + var next = function () { if (!me.props.touch.dragging) { var now = new Date().valueOf(); var time = now - initTime; @@ -15537,7 +15539,7 @@ return /******/ (function(modules) { // webpackBootstrap this.hoverObj = {nodes:{},edges:{}}; this.controlNodesActive = false; - this.navigationHammers = {existing:[], new: []}; + this.navigationHammers = {existing:[], _new: []}; // animation properties this.animationSpeed = 1/this.renderRefreshRate; @@ -21180,7 +21182,7 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Object} dotEdge * @returns {Object} graphEdge */ - function convertEdge(dotEdge) { + var convertEdge = function (dotEdge) { var graphEdge = { from: dotEdge.from, to: dotEdge.to @@ -32025,12 +32027,12 @@ return /******/ (function(modules) { // webpackBootstrap var hammer = Hammer(this.navigationDivs[navigationDivs[i]], {prevent_default: true}); hammer.on('touch', this[navigationDivActions[i]].bind(this)); - this.navigationHammers.new.push(hammer); + this.navigationHammers._new.push(hammer); } this._navigationReleaseOverload = this._stopMovement; - this.navigationHammers.existing = this.navigationHammers.new; + this.navigationHammers.existing = this.navigationHammers._new; }; diff --git a/dist/vis.map b/dist/vis.map index 32699511..9c4d0e18 100644 --- a/dist/vis.map +++ b/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DateUtil","DataStep","Range","stack","TimeStep","components","items","Item","BackgroundItem","BoxItem","PointItem","RangeItem","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","BackgroundGroup","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","cssUtil","cssText","styles","style","trim","parts","keys","map","addCssText","currentStyles","newStyles","removeCssText","removeStyles","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearchCustom","orderedItems","searchFunction","field","field2","maxIterations","iteration","low","high","middle","item","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easeInOutQuad","start","end","duration","change","easingFunctions","linear","easeInQuad","easeOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","insertBefore","createElement","drawPoint","x","y","group","point","drawPoints","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","setOptions","prototype","queue","_queue","destroy","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","col","cols","getValue","update","updatedIds","updatedData","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","args","fn","context","entry","clearTimeout","setTimeout","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","passValueFn","xValueLabel","yValueLabel","zValueLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","mouseX","mouseY","tooltipTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","log","LN10","step1","pow","step2","step5","toPrecision","getStep","groups","forthArgument","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","hiddenDates","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","range","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setGroups","setItems","Core","newDataSet","initialLoad","dataRange","_getDataRange","setWindow","animate","fit","setSelection","focus","getSelection","itemData","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","visibility","convertHiddenOptions","repeat","dateItem","updateHiddenDates","centerContainer","totalRange","pixelTime","startDate","endDate","_d","runUntil","clone","day","dayOfYear","year","dayOffset","date","month","console","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","startToFront","endToFront","_applyRange","safeDates","printDates","dates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","current","newValue","switchedYear","switchedMonth","switchedDay","time","conversion","getHiddenDurationBetween","correctTimeForHidden","hiddenDuration","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","getHiddenDurationBefore","timeOffset","requiredDuration","previousPoint","snapAwayFromHidden","direction","correctionEnabled","minimumStep","containerHeight","customRange","alignZeros","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","decimals","slice","exp","cnt","isMajor","now","hours","minutes","seconds","milliseconds","deltaDifference","scaleOffset","moveable","zoomable","zoomMin","zoomMax","touch","animateTimer","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","dragging","initTime","done","initStart","initEnd","changed","anyChanged","_cancelAnimation","newStart","newEnd","getRange","totalHidden","previousDelta","allowDragging","gesture","deltaX","deltaY","diffRange","safeStart","safeEnd","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","hiddenDurationBefore","hiddenDurationAfter","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","subgroups","newTop","subgroup","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","getLabelMinor","format","getLabelMajor","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","currentTimeTimer","setCurrentTime","getCurrentTime","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","stopPropagation","svg","linegraphOptions","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","zeroCrossing","lineOffset","master","svgElements","iconsRemoved","amountOfGroups","lineContainer","scrollTop","addGroup","graphOptions","updateGroup","removeGroup","hide","show","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","_cleanupIcons","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","_redrawTitle","amountOfSteps","stepDifference","zeroStepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","textTitle","measureCharTitle","titleCharWidth","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","Line","Bar","Points","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","getYRange","groupData","draw","framework","subgroupIndex","subgroupOrderer","subgroupOrder","visibleItems","byStart","byEnd","checkRangedItems","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","_calculateHeight","offsetTop","offsetLeft","ii","repositionY","resetSubgroups","labelSet","setParent","orderSubgroups","_checkIfVisible","sortArray","sortField","removeFromDataSet","removeItem","startArray","endArray","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","repositionX","initialPos","breakCondition","isVisible","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","onMoving","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","UNGROUPED","BACKGROUND","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","_order","getGroups","_getType","_removeItem","groupOptions","oldGroupId","oldGroup","_constructByEndArray","itemFromTarget","selected","dragLeftItem","dragRightItem","initialX","itemProps","newProps","initial","groupFromTarget","_updateItemProps","_moveToGroup","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","_getItemRange","_item","itemSetFromTarget","side","iconSize","iconSpacing","textArea","scrollableHeight","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","autoSizeSVG","lastStart","_updateGraph","BarGraphFunctions","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","rangePerPixelInv","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","dataContainer","guess","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedDataLeft","barCombinedDataRight","getStackedBarYRange","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","ignore","_toggleAxisVisiblity","drawIcons","axisUsed","datapoints","xValue","yValue","extractedData","svgHeight","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","_updateContents","template","_updateTitle","removeAttribute","_updateDataAttributes","dataAttributes","attributes","setAttribute","_updateStyle","emptyContent","baseClassName","onTop","itemSubgroup","itemSetHeight","marginLeft","maxWidth","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fontColor","fontSize","fontFace","fontFill","level","highlightColor","borderWidthSelected","edges","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","layout","freezeForStabilization","smoothCurves","dynamic","roundness","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","pixelRatio","hoverObj","controlNodesActive","navigationHammers","existing","new","animationSpeed","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","startedStabilization","stabilized","draggingNodes","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","keycharm","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","animationOptions","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","animation","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_resetLevels","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","pinch","_onTap","_onDoubleTap","_onMouseMoveTitle","hammerFrame","_onRelease","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","nodeIds","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","releaseNode","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleDragEnd","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","emitEvent","oldWidth","oldHeight","oldNodesData","_updateSelection","angle","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","changedData","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","dynamicEdges","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","mainMovingStatus","supportMovingStatus","_doInAllActiveSectors","mainMoving","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","iterations","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","storePositions","dataArray","allowedToMoveX","allowedToMoveY","getPositions","focusOnNode","nodePosition","lockedOnNode","easingFunction","animateView","locked","_transitionRedraw","viewCenter","distanceFromCenter","_classicRedraw","_lockedRedraw","active","getScale","getCenterCoordinates","networkConstants","fromId","toId","widthSelected","labelDimensions","yLine","dirtyLabel","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","lineCount","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","brokenUrl","img","Image","onload","onerror","imagelist","grouplist","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","hierarchyEnumerated","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","brokenImage","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_redrawTimer","listeners","events","scrollTopMin","redrawCount","_initAutoResize","component","_stopAutoResize","what","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","MAX_REDRAWS","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","_catmullRom","_linear","dFill","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","Bargraph","barCombinedData","coreDistance","drawData","combinedData","intersections","barPoints","_getDataIntersections","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","accumulated","groupLabel","_getStackedBarYRange","xpos","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_bound","keydown","keyup","_keys","fromCharCode","code","down","handleEvent","up","keyCode","bound","bindAll","getKey","newBindings","global","dfl","hasOwnProp","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","printMsg","msg","suppressDeprecationWarnings","warn","deprecate","firstTime","deprecateSimple","deprecations","padToken","func","leftZeroFill","ordinalizeToken","period","localeData","ordinal","Locale","Moment","config","skipOverflow","checkOverflow","copyConfig","Duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","weeks","week","days","hour","minute","second","millisecond","_milliseconds","_days","_months","_locale","_bubble","val","_isAMomentObject","_i","_f","_l","_strict","_tzm","_isUTC","_offset","_pf","momentProperties","absRound","number","targetLength","forceSign","output","positiveMomentsDifference","base","res","isAfter","momentsDifference","makeAs","isBefore","createAdder","dur","tmp","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","DATE","_overflowDayOfYear","isValid","_isValid","getTime","bigHour","normalizeLocale","chooseLocale","names","loadLocale","oldLocale","hasModule","model","local","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_meridiemParse","parseTokenOffsetMs","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","_ordinalParse","_ordinalParseLenient","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","_nextDay","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","getUTCFullYear","makeDateFromStringAndFormat","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","posNegDuration","relativeTimeThresholds","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","dayOfMonth","unit","makeAccessor","keepTime","daysToYears","yearsToDays","makeDurationGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","dd","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","zone","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_longMonthsParse","_shortMonthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LTS","LT","L","LL","LLL","LLLL","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","diffRes","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","defineLocale","_abbr","abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","keepLocalTime","_dateTzOffset","inputString","asFloat","daysAdjust","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","inputMs","isSame","localAdjust","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","newLocaleData","getTimezoneOffset","isoWeeks","toJSON","withSuffix","toIsoString","asSeconds","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","ordinalParse","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","returnValues","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","overrideSelectable","DOM","_manipulationReleaseOverload","_navigationReleaseOverload","getSelectedNodes","edgeIds","getSelectedEdges","idArray","selectNodes","RangeError","selectEdges","_clearManipulatorBar","manipulationDOM","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","_createAddNodeToolbar","_createAddEdgeToolbar","_editNode","_createEditEdgeToolbar","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","supportNodes","targetNode","connectionEdge","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","navigationDivs","navigationDivActions","_stopMovement","_zoomExtent","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","_determineLevelsDirected","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","_setLevelDirected","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","dynamicSmoothCurves","nameArray","webpackContext","req","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DateUtil","DataStep","Range","stack","TimeStep","components","items","Item","BackgroundItem","BoxItem","PointItem","RangeItem","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","BackgroundGroup","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","gephiParser","Graph","Error","moment","hammer","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","selectiveNotDeepExtend","indexOf","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","getBoundingClientRect","left","window","pageXOffset","getAbsoluteTop","top","pageYOffset","addClassName","className","classes","split","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","returnValue","getTarget","target","srcElement","nodeType","parentNode","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidRGB","rgb","substr","RGBToHex","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","e","f","r","g","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","cssUtil","cssText","styles","style","trim","parts","keys","map","addCssText","currentStyles","newStyles","removeCssText","removeStyles","HSVToRGB","q","t","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearchCustom","orderedItems","searchFunction","field","field2","maxIterations","iteration","low","high","middle","item","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easeInOutQuad","start","end","duration","change","easingFunctions","linear","easeInQuad","easeOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","insertBefore","createElement","drawPoint","x","y","group","point","drawPoints","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","setOptions","prototype","queue","_queue","destroy","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","col","cols","getValue","update","updatedIds","updatedData","addOrUpdate","_updateItem","get","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","_appendRow","result","getIds","getDataSet","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","args","fn","context","entry","clearTimeout","setTimeout","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","passValueFn","xValueLabel","yValueLabel","zValueLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","eye","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","getMouseX","clientX","targetTouches","getMouseY","clientY","Emitter","_setScale","scale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","obj","sortNumber","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","position","overflow","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","horizontal","vertical","setArmRotation","distance","setArmLength","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","next","textAlign","textBaseline","fillText","label","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","PI","j","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","startMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","mouseX","mouseY","tooltipTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","sub","sum","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","log","LN10","step1","pow","step2","step5","toPrecision","getStep","groups","forthArgument","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","body","domProps","emitter","bind","hiddenDates","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","range","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setGroups","setItems","Core","newDataSet","initialLoad","dataRange","_getDataRange","setWindow","animate","fit","setSelection","focus","getSelection","itemData","getItemRange","dataset","minItem","maxStartItem","maxEndItem","linegraph","getLegend","groupId","isGroupVisible","visibility","convertHiddenOptions","repeat","dateItem","updateHiddenDates","centerContainer","totalRange","pixelTime","startDate","endDate","_d","runUntil","clone","day","dayOfYear","year","dayOffset","date","month","console","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","startToFront","endToFront","_applyRange","safeDates","printDates","dates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","current","newValue","switchedYear","switchedMonth","switchedDay","time","conversion","getHiddenDurationBetween","correctTimeForHidden","hiddenDuration","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","getHiddenDurationBefore","timeOffset","requiredDuration","previousPoint","snapAwayFromHidden","direction","correctionEnabled","minimumStep","containerHeight","customRange","alignZeros","autoScale","stepIndex","marginStart","marginEnd","deadSpace","majorSteps","minorSteps","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","stepSize","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","decimals","slice","exp","cnt","isMajor","now","hours","minutes","seconds","milliseconds","deltaDifference","scaleOffset","moveable","zoomable","zoomMin","zoomMax","touch","animateTimer","_onDragStart","_onDrag","_onDragEnd","_onHold","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","pageX","pageY","hammerUtil","_cancelAnimation","initStart","initEnd","initTime","anyChanged","dragging","done","changed","newStart","newEnd","getRange","totalHidden","previousDelta","allowDragging","gesture","deltaX","deltaY","diffRange","safeStart","safeEnd","fakeGesture","pointer","pointerDate","_pointerToDate","zoom","touches","hiddenDurationBefore","hiddenDurationAfter","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","subgroups","newTop","subgroup","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","first","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","getLabelMinor","format","getLabelMajor","_isResized","resized","_previousWidth","_previousHeight","showCurrentTime","locales","locale","parent","backgroundVertical","title","currentTimeTimer","setCurrentTime","getCurrentTime","showCustomTime","eventParams","Hammer","drag","prevent_default","setCustomTime","getCustomTime","stopPropagation","svg","linegraphOptions","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","zeroCrossing","lineOffset","master","svgElements","iconsRemoved","amountOfGroups","lineContainer","scrollTop","addGroup","graphOptions","updateGroup","removeGroup","hide","show","display","_redrawGroupIcons","iconHeight","iconOffset","drawIcon","_cleanupIcons","backgroundHorizontal","changeCalled","activeGroups","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","_redrawTitle","amountOfSteps","stepDifference","zeroStepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","convertValue","invertedValue","convertedValue","characterHeight","largestWidth","majorCharWidth","minorCharWidth","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","textTitle","measureCharTitle","titleCharWidth","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","Line","Bar","Points","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","icon","yAxisOrientation","getYRange","groupData","draw","framework","subgroupIndex","subgroupOrderer","subgroupOrder","visibleItems","byStart","byEnd","checkRangedItems","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","_calculateHeight","offsetTop","offsetLeft","ii","repositionY","resetSubgroups","labelSet","setParent","orderSubgroups","_checkIfVisible","sortArray","sortField","removeFromDataSet","removeItem","startArray","endArray","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","repositionX","initialPos","breakCondition","isVisible","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","onMoving","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","UNGROUPED","BACKGROUND","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","Function","markDirty","unselect","select","getVisibleItems","rawVisibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","lastWidth","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","_order","getGroups","_getType","_removeItem","groupOptions","oldGroupId","oldGroup","_constructByEndArray","itemFromTarget","selected","dragLeftItem","dragRightItem","initialX","itemProps","newProps","initial","groupFromTarget","_updateItemProps","_moveToGroup","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","_getItemRange","_item","itemSetFromTarget","side","iconSize","iconSpacing","textArea","scrollableHeight","drawLegendIcons","getComputedStyle","paddingTop","defaultGroup","sampling","graphHeight","barChart","handleOverlap","dataAxis","legend","abortedGraphUpdate","autoSizeSVG","lastStart","_updateGraph","BarGraphFunctions","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","rangePerPixelInv","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","_convertYcoordinates","dataContainer","guess","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","sampledData","barCombinedDataLeft","barCombinedDataRight","getStackedBarYRange","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","ignore","_toggleAxisVisiblity","drawIcons","axisUsed","datapoints","xValue","yValue","extractedData","svgHeight","majorLines","majorTexts","minorLines","minorTexts","lineTop","lang","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","_updateContents","template","_updateTitle","removeAttribute","_updateDataAttributes","dataAttributes","attributes","setAttribute","_updateStyle","emptyContent","baseClassName","onTop","itemSubgroup","itemSetHeight","marginLeft","maxWidth","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","initializing","triggerFunctions","edit","editEdge","connect","del","nodes","mass","radiusMin","radiusMax","shape","image","fontColor","fontSize","fontFace","fontFill","level","highlightColor","borderWidthSelected","edges","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","layout","freezeForStabilization","smoothCurves","dynamic","roundness","maxVelocity","minVelocity","stabilize","stabilizationIterations","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","constants","pixelRatio","hoverObj","controlNodesActive","navigationHammers","existing","_new","animationSpeed","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","startedStabilization","stabilized","draggingNodes","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","keycharm","MixinLoader","Activator","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","animationOptions","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","animation","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","gephi","gephiData","parseGephi","_setNodes","_setEdges","_putDataInSector","_resetLevels","_stabilize","onEdit","onEditEdge","onConnect","onDelete","editMode","newColorObj","groupname","clickToUse","activator","_createKeyBinds","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","pinch","_onTap","_onDoubleTap","_onMouseMoveTitle","hammerFrame","_onRelease","reset","isActive","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","nodeIds","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","releaseNode","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleDragEnd","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","preScaleDragPointer","DOMtoCanvas","scaleFrac","tx","ty","updateClustersDefault","postScaleDragPointer","canvasToDOM","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","emitEvent","oldWidth","oldHeight","oldNodesData","_updateSelection","angle","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","changedData","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","dynamicEdges","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","_drawNodes","alwaysShow","setScaleAndPos","inArea","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","mainMovingStatus","supportMovingStatus","_doInAllActiveSectors","mainMoving","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","iterations","toggleFreeze","parentEdgeId","internalMultiplier","positionBezierNode","mixin","storePosition","storePositions","dataArray","allowedToMoveX","allowedToMoveY","getPositions","focusOnNode","nodePosition","lockedOnNode","easingFunction","animateView","locked","_transitionRedraw","viewCenter","distanceFromCenter","_classicRedraw","_lockedRedraw","active","getScale","getCenterCoordinates","networkConstants","fromId","toId","widthSelected","labelDimensions","yLine","dirtyLabel","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","lineCount","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","lastX","lastY","minDistance","_getDistanceToLine","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","brokenUrl","img","Image","onload","onerror","imagelist","grouplist","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","hierarchyEnumerated","fx","fy","vx","vy","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","brokenImage","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","velocity","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","graphData","dotNode","graphNode","convertEdge","dotEdge","graphEdge","subEdge","{","}","[","]",";","=",",","->","--","gephiJSON","allowedToMove","gEdges","gNodes","gEdge","source","gNode","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_redrawTimer","listeners","events","scrollTopMin","redrawCount","_initAutoResize","component","_stopAutoResize","what","getWindow","borderRootHeight","borderRootWidth","autoHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","MAX_REDRAWS","repaint","_startAutoResize","_onResize","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","eventType","getTouchList","collectEventData","custom","back","editNode","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","_catmullRom","_linear","dFill","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","Bargraph","barCombinedData","coreDistance","drawData","combinedData","intersections","barPoints","_getDataIntersections","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","accumulated","groupLabel","_getStackedBarYRange","xpos","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","manipulationDiv","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","overlay","_onTapOverlay","windowHammer","_hasParent","deactivate","escListener","activate","unbind","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_bound","keydown","keyup","_keys","fromCharCode","code","down","handleEvent","up","keyCode","bound","bindAll","getKey","newBindings","global","dfl","hasOwnProp","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","printMsg","msg","suppressDeprecationWarnings","warn","deprecate","firstTime","deprecateSimple","deprecations","padToken","func","leftZeroFill","ordinalizeToken","period","localeData","ordinal","Locale","Moment","config","skipOverflow","checkOverflow","copyConfig","Duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","weeks","week","days","hour","minute","second","millisecond","_milliseconds","_days","_months","_locale","_bubble","val","_isAMomentObject","_i","_f","_l","_strict","_tzm","_isUTC","_offset","_pf","momentProperties","absRound","number","targetLength","forceSign","output","positiveMomentsDifference","base","res","isAfter","momentsDifference","makeAs","isBefore","createAdder","dur","tmp","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","DATE","_overflowDayOfYear","isValid","_isValid","getTime","bigHour","normalizeLocale","chooseLocale","names","loadLocale","oldLocale","hasModule","model","local","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_meridiemParse","parseTokenOffsetMs","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","_ordinalParse","_ordinalParseLenient","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","_nextDay","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","getUTCFullYear","makeDateFromStringAndFormat","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","posNegDuration","relativeTimeThresholds","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","dayOfMonth","unit","makeAccessor","keepTime","daysToYears","yearsToDays","makeDurationGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","dd","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","zone","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_longMonthsParse","_shortMonthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LTS","LT","L","LL","LLL","LLLL","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","diffRes","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","defineLocale","_abbr","abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","keepLocalTime","_dateTzOffset","inputString","asFloat","daysAdjust","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","inputMs","isSame","localAdjust","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","newLocaleData","getTimezoneOffset","isoWeeks","toJSON","withSuffix","toIsoString","asSeconds","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","ordinalParse","require","noGlobal","setup","READY","Event","determineEventTypes","Utils","each","gestures","Detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","IS_MOBILE","NO_MOUSEEVENTS","CALCULATE_INTERVAL","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","EVENT_RELEASE","EVENT_TOUCH","plugins","utils","dest","handler","iterator","inStr","find","inArray","hasParent","getCenter","getVelocity","deltaTime","getAngle","touch1","touch2","getDirection","getRotation","isVertical","setPrefixedCss","toggle","prefixes","toCamelCase","toggleBehavior","falseFn","onselectstart","ondragstart","str","preventMouseEvents","started","shouldDetect","hook","onTouchHandler","ev","triggerType","srcType","isPointer","isMouse","buttons","PointerEvent","matchType","updatePointer","doDetect","touchList","touchListLength","triggerChange","trigger","changedLength","changedTouches","evData","identifiers","identifier","pointerType","timeStamp","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","pt","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","detection","stopped","startDetect","inst","eventData","startEvent","lastEvent","lastCalcEvent","futureCalcEvent","lastCalcData","extendEventData","instOptions","getCalculatedData","recalc","calcEv","calcData","velocityX","velocityY","interimAngle","interimDirection","startEv","lastEv","rotation","eventStartHandler","eventHandlers","createEvent","initEvent","dispatchEvent","state","dispose","eh","dragGesture","dragMaxTouches","triggered","dragMinDistance","startCenter","dragDistanceCorrection","dragLockToAxis","dragLockMinDistance","lastDirection","dragBlockVertical","dragBlockHorizontal","Drag","Gesture","holdGesture","holdTimeout","holdThreshold","Hold","Release","Swipe","swipeMinTouches","swipeMaxTouches","swipeVelocityX","swipeVelocityY","tapGesture","sincePrev","didDoubleTap","hasMoved","tapMaxDistance","tapMaxTime","doubleTapInterval","doubleTapDistance","tapAlways","Tap","Touch","preventMouse","transformGesture","scaleThreshold","rotationThreshold","transformMinScale","transformMinRotation","Transform","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","returnValues","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","overrideSelectable","DOM","_manipulationReleaseOverload","_navigationReleaseOverload","getSelectedNodes","edgeIds","getSelectedEdges","idArray","selectNodes","RangeError","selectEdges","_clearManipulatorBar","manipulationDOM","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","boundFunction","edgeBeingEdited","selectedControlNode","_createAddNodeToolbar","_createAddEdgeToolbar","_editNode","_createEditEdgeToolbar","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","supportNodes","targetNode","connectionEdge","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","navigationDivs","navigationDivActions","_stopMovement","_zoomExtent","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","_determineLevelsDirected","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","maxCount","_setLevel","_setLevelDirected","parentId","parentLevel","nodeMoved","_restoreNodes","graphToggleSmoothCurves","graph_toggleSmooth","getElementById","graphRepositionNodes","showValueOfRange","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","dynamicSmoothCurves","nameArray","webpackContext","req","resolve","repulsingForce","a_base","minimumDistance","steepness","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index 64112341..46ac02e2 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -5,7 +5,7 @@ * A dynamic, browser-based visualization library. * * @version 3.7.2-SNAPSHOT - * @date 2014-11-28 + * @date 2014-12-02 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -22,18 +22,18 @@ * * Vis.js may be distributed under either license. */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var o=i[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(2),e.DataSet=i(3),e.DataView=i(4),e.Queue=i(5),e.Graph3d=i(6),e.graph3d={Camera:i(7),Filter:i(8),Point2d:i(9),Point3d:i(10),Slider:i(11),StepNumber:i(12)},e.Timeline=i(13),e.Graph2d=i(14),e.timeline={DateUtil:i(15),DataStep:i(16),Range:i(17),stack:i(18),TimeStep:i(19),components:{items:{Item:i(31),BackgroundItem:i(32),BoxItem:i(33),PointItem:i(34),RangeItem:i(35)},Component:i(20),CurrentTime:i(21),CustomTime:i(22),DataAxis:i(23),GraphGroup:i(24),Group:i(25),BackgroundGroup:i(26),ItemSet:i(27),Legend:i(28),LineGraph:i(29),TimeAxis:i(30)}},e.Network=i(36),e.network={Edge:i(37),Groups:i(38),Images:i(39),Node:i(40),Popup:i(41),dotparser:i(42),gephiParser:i(43)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(44),e.hammer=i(45)},function(module,exports,__webpack_require__){var moment=__webpack_require__(44);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":Array.isArray(t)?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}};var cssUtil={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),s=i[0].trim(),o=i[1].trim();e[s]=o}}),e},join:function(t){return Object.keys(t).map(function(e){return e+": "+t[e]}).join("; ")}};exports.addCssText=function(t,e){var i=cssUtil.split(t.style.cssText),s=cssUtil.split(e),o=exports.extend(i,s);t.style.cssText=cssUtil.join(o)},exports.removeCssText=function(t,e){var i=cssUtil.split(t.style.cssText),s=cssUtil.split(e);for(var o in s)s.hasOwnProperty(o)&&delete i[o];t.style.cssText=cssUtil.join(i)},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;s=r&&o>n;){var h=Math.floor((r+a)/2),d=t[h],l=void 0===s?d[i]:d[i][s],c=e(l);if(0==c)return h;-1==c?r=h+1:a=h-1,n++}return-1},exports.binarySearchValue=function(t,e,i,s){for(var o,n,r,a,h=1e4,d=0,l=0,c=t.length-1;c>=l&&h>d;){if(a=Math.floor(.5*(c+l)),o=t[Math.max(0,a-1)][i],n=t[a][i],r=t[Math.min(t.length-1,a+1)][i],n==e)return a;if(e>o&&n>e)return"before"==s?Math.max(0,a-1):a;if(e>n&&r>e)return"before"==s?a:Math.min(t.length-1,a+1);e>n?l=a+1:c=a-1,d++}return-1},exports.easeInOutQuad=function(t,e,i,s){var o=i-e;return t/=s/2,1>t?o/2*t*t+e:(t--,-o/2*(t*(t-2)-1)+e)},exports.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return.5>t?2*t*t:-1+(4-2*t)*t},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return.5>t?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return.5>t?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return.5>t?16*t*t*t*t*t:1+16*--t*t*t*t*t}}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i,s){var o;return e.hasOwnProperty(t)?e[t].redundant.length>0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElement(t),void 0!==s?i.insertBefore(o,s):i.appendChild(o)):(o=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==s?i.insertBefore(o,s):i.appendChild(o)),e[t].used.push(o),o},e.drawPoint=function(t,i,s,o,n){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",o,n),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size)):(r=e.getSVGElement("rect",o,n),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size)),void 0!==s.options.drawPoints.styles&&r.setAttributeNS(null,"style",s.group.options.drawPoints.styles),r.setAttributeNS(null,"class",s.className+" point"),r},e.drawBar=function(t,i,s,o,n,r,a){if(0!=o){0>o&&(o*=-1,i-=o);var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",o),h.setAttributeNS(null,"class",n)}}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||o.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t),this.setOptions(e)}var o=i(1),n=i(5);s.prototype.setOptions=function(t){t&&void 0!==t.queue&&(t.queue===!1?this._queue&&(this._queue.destroy(),delete this._queue):(this._queue||(this._queue=n.extend(this,{replace:["add","update","remove"]})),"object"==typeof t.queue&&this._queue.setOptions(t.queue)))},s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var o=0;or;r++)i=n._addItem(t[r]),s.push(i);else if(o.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},p=0,u=h.length;u>p;p++){var m=h[p];c[m]=t.getValue(d,p)}i=n._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],n=[],r=this,a=r._fieldId,h=function(t){var e=t[a];r._data[e]?(e=r._updateItem(t),s.push(e),n.push(t)):(e=r._addItem(t),i.push(e))};if(Array.isArray(t))for(var d=0,l=t.length;l>d;d++)h(t[d]);else if(o.isDataTable(t))for(var c=this._getColumnNames(t),p=0,u=t.getNumberOfRows();u>p;p++){for(var m={},f=0,g=c.length;g>f;f++){var v=c[f];m[v]=t.getValue(p,f)}h(m)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");h(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s,data:n},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,n=this,r=o.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){var h=["DataTable","Array","Object"];if(a=-1==h.indexOf(i.returnType)?"Array":i.returnType,s&&a!=o.getType(s))throw new Error('Type of parameter "data" ('+o.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!o.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==o.getType(s)?"DataTable":"Array";var d,l,c,p,u=i&&i.type||this._options.type,m=i&&i.filter,f=[];if(void 0!=t)d=n._getItem(t,u),m&&!m(d)&&(d=null);else if(void 0!=e)for(c=0,p=e.length;p>c;c++)d=n._getItem(e[c],u),(!m||m(d))&&f.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=n._getItem(l,u),(!m||m(d))&&f.push(d));if(i&&i.order&&void 0==t&&this._sort(f,i.order),i&&i.fields){var g=i.fields;if(void 0!=t)d=this._filterFields(d,g);else for(c=0,p=f.length;p>c;c++)f[c]=this._filterFields(f[c],g)}if("DataTable"==a){var v=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,v,d);else for(c=0;cc;c++)s.push(f[c]);return s}return f},s.prototype.getIds=function(t){var e,i,s,o,n,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){n=[];for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&n.push(o));for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&l.push(o[this._fieldId]));else if(h){n=[];for(s in r)r.hasOwnProperty(s)&&n.push(r[s]);for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=r[s],l.push(o[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,o=e&&e.filter,n=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,n),(!o||o(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,o=e&&e.type||this._options.type,n=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,o),(!s||s(i))&&n.push(t(i,a)));return e&&e.order&&this._sort(n,e.order),n},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(o.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],o=e[i];return s>o?1:o>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,o,n=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)o=this._remove(t[i]),null!=o&&n.push(o);else o=this._remove(t),null!=o&&n.push(o);return n.length&&this._trigger("remove",{items:n},e),n},s.prototype._remove=function(t){if(o.isNumber(t)||o.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||r>s)&&(i=n,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||s>r)&&(i=n,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),o=0,n=e.length;n>o;o++){var r=e[o];t.setValue(s,o,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var o=i(1),n=i(3);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var o in this._ids)this._ids.hasOwnProperty(o)&&e.push(o);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)o=e[i],this._ids[o]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,n=o.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=o.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,o,n,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r&&(this._ids[n]=!0,d.push(n));break;case"update":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r?this._ids[n]?l.push(n):(this._ids[n]=!0,d.push(n)):this._ids[n]&&(delete this._ids[n],c.push(n));break;case"remove":for(s=0,o=a.length;o>s;s++)n=a[s],this._ids[n]&&(delete this._ids[n],c.push(n))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=n.prototype.on,s.prototype.off=n.prototype.off,s.prototype._trigger=n.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t){function e(t){this.delay=null,this.max=1/0,this._queue=[],this._timeout=null,this._extended=null,this.setOptions(t)}e.prototype.setOptions=function(t){t&&"undefined"!=typeof t.delay&&(this.delay=t.delay),t&&"undefined"!=typeof t.max&&(this.max=t.max),this._flushIfNeeded()},e.extend=function(t,i){var s=new e(i);if(void 0!==t.flush)throw new Error("Target object already has a property flush");t.flush=function(){s.flush()};var o=[{name:"flush",original:void 0}];if(i&&i.replace)for(var n=0;nthis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},e.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z";var o=function(t){return t};this.xValueLabel=o,this.yValueLabel=o,this.zValueLabel=o,this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new l,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}var o=i(56),n=i(3),r=i(4),a=i(1),h=i(10),d=i(9),l=i(7),c=i(8),p=i(11),u=i(12);o(s.prototype),s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var f=(t-p)/(m-p),g=240*f,v=this._hsv2rgb(g,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new u(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new h(x,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+this.xValueLabel(i.getCurrent())+" ",o.x,o.y),i.next()}for(g.lineWidth=1,s=void 0===this.defaultYStep,i=new u(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new h(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+this.yValueLabel(i.getCurrent())+" ",o.x,o.y),i.next();for(g.lineWidth=1,s=void 0===this.defaultZStep,i=new u(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(n,r,i.getCurrent())),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(t.x-b,t.y),g.stroke(),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(this.zValueLabel(i.getCurrent())+" ",t.x-5,t.y),i.next();g.lineWidth=1,t=this._convert3Dto2D(new h(n,r,this.zMin)),e=this._convert3Dto2D(new h(n,r,this.zMax)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),g.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(m.x,m.y),g.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(m.x,m.y),g.stroke(),g.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(l=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new h(n,r,this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(S,o.x,o.y));var D=this.zLabel;D.length>0&&(d=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new h(n,r,a)),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(D,o.x-d,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,d,l,c,p,u,m,f=this.frame.canvas,g=f.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(m=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(m-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/D/2,1),a=this._hsv2rgb(c,p,u),d=a):(u=1,a=this._hsv2rgb(c,p,u),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,g.lineWidth=l,g.fillStyle=a,g.strokeStyle=d,g.beginPath(),g.moveTo(t.screen.x,t.screen.y),g.lineTo(e.screen.x,e.screen.y),g.lineTo(o.screen.x,o.screen.y),g.lineTo(i.screen.x,i.screen.y),g.closePath(),g.fill(),g.stroke()}}else for(n=0;np&&(p=0);var u,m,f;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),m=this._hsv2rgb(u,1,1),f=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(m=this.colorDot,f=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),m=this._hsv2rgb(u,1,1),f=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=f,i.fillStyle=m,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},a.addEventListener(document,"mousemove",e.onmousemove),a.addEventListener(document,"mouseup",e.onmouseup),a.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,o=this.startArmRotation.vertical+i/200,n=4,r=Math.sin(n/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var l=n.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var p=l[c],u=p.corners,m=[u[0].screen,u[1].screen,u[2].screen],f=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,m)||this._insideTriangle(h,f))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t,e,i){var s=i(10);Camera=function(){this.armLocation=new s,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new s,this.cameraRotation=new s(.5*Math.PI,0,0),this.calculateCameraOrientation()},Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},Camera.prototype.getArmLength=function(){return this.armLength},Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=Camera},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column -},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i,r){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof n)&&i instanceof Object){var h=r;r=i,i=h}var u=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{snap:null,toScreen:u._toScreen.bind(u),toGlobalScreen:u._toGlobalScreen.bind(u),toTime:u._toTime.bind(u),toGlobalTime:u._toGlobalTime.bind(u)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,r&&this.setOptions(r),i&&this.setGroups(i),e?this.setItems(e):this.redraw()}var o=(i(56),i(45),i(1)),n=i(3),r=i(4),a=i(17),h=i(46),d=i(30),l=i(21),c=i(22),p=i(27);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){if(void 0==this.options.start||void 0==this.options.end)var s=this._getDataRange();var o=void 0!=this.options.start?this.options.start:s.start,a=void 0!=this.options.end?this.options.end:s.end;this.setWindow(o,a,{animate:!1})}else this.fit({animate:!1})},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],s=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),o=null,n=null;if(s.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===o||o>e)&&(o=e),(null===n||i>n)&&(n=i)}),null!==o&&null!==n){var r=(o+n)/2,a=Math.max(this.range.end-this.range.start,1.1*(n-o)),h=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(r-a/2,r+a/2,h)}}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){function s(t,e,i,s){if(!(Array.isArray(i)||i instanceof n)&&i instanceof Object){var r=s;s=i,i=r}var h=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{snap:null,toScreen:h._toScreen.bind(h),toGlobalScreen:h._toGlobalScreen.bind(h),toTime:h._toTime.bind(h),toGlobalTime:h._toGlobalTime.bind(h)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,s&&this.setOptions(s),i&&this.setGroups(i),e?this.setItems(e):this.redraw()}var o=(i(56),i(45),i(1)),n=i(3),r=i(4),a=i(17),h=i(46),d=i(30),l=i(21),c=i(22),p=i(29);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){var s=void 0!=this.options.start?this.options.start:null,o=void 0!=this.options.end?this.options.end:null;this.setWindow(s,o,{animate:!1})}else this.fit({animate:!1})},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.linegraph.options.groups.visibility[t]||1==this.linegraph.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t,e,i){var s=i(44);e.convertHiddenOptions=function(t,e){if(t.hiddenDates=[],e&&1==Array.isArray(e)){for(var i=0;i=4*a){var p=0,u=n.clone();switch(i[h].repeat){case"daily":d.day()!=l.day()&&(p=1),d.dayOfYear(o.dayOfYear()),d.year(o.year()),d.subtract(7,"days"),l.dayOfYear(o.dayOfYear()),l.year(o.year()),l.subtract(7-p,"days"),u.add(1,"weeks");break;case"weekly":var m=l.diff(d,"days"),f=d.day();d.date(o.date()),d.month(o.month()),d.year(o.year()),l=d.clone(),d.day(f),l.day(f),l.add(m,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),u.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(p=1),d.month(o.month()),d.year(o.year()),d.subtract(1,"months"),l.month(o.month()),l.year(o.year()),l.subtract(1,"months"),l.add(p,"months"),u.add(1,"months");break;case"yearly":d.year()!=l.year()&&(p=1),d.year(o.year()),d.subtract(1,"years"),l.year(o.year()),l.subtract(1,"years"),l.add(p,"years"),u.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}for(;u>d;)switch(t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),i[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(t);var g=e.isHidden(t.range.start,t.hiddenDates),v=e.isHidden(t.range.end,t.hiddenDates),y=t.range.start,b=t.range.end;1==g.hidden&&(y=1==t.range.startToFront?g.startDate-1:g.endDate+1),1==v.hidden&&(b=1==t.range.endToFront?v.startDate-1:v.endDate+1),(1==g.hidden||1==v.hidden)&&t.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],s=0;s=e[s].start&&e[o].end<=e[s].end?e[o].remove=!0:e[o].start>=e[s].start&&e[o].start<=e[s].end?(e[s].end=e[o].end,e[o].remove=!0):e[o].end>=e[s].start&&e[o].end<=e[s].end&&(e[s].start=e[o].start,e[o].remove=!0));for(var s=0;s=r&&a>o){i=!0;break}}if(1==i&&o=e&&i>r&&(s+=r-n)}return s},e.correctTimeForHidden=function(t,i,o){return o=s(o).toDate().valueOf(),o-=e.getHiddenDurationBefore(t,i,o)},e.getHiddenDurationBefore=function(t,e,i){var o=0;i=s(i).toDate().valueOf();for(var n=0;n=e.start&&a=a&&(o+=a-r)}return o},e.getAccumulatedHiddenDuration=function(t,e,i){for(var s=0,o=0,n=e.start,r=0;r=e.start&&h=i)break;s+=h-a}}return s},e.snapAwayFromHidden=function(t,i,s,o){var n=e.isHidden(i,t);return 1==n.hidden?0>s?1==o?n.startDate-(n.endDate-i)-1:n.startDate-1:1==o?n.endDate+(i-n.startDate)+1:n.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=s&&o>t)return{hidden:!0,startDate:s,endDate:o}}return{hidden:!1,startDate:s,endDate:o}}},function(t){function e(t,e,i,s,o,n){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.alignZeros=n,this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,this._start==this._end&&(this._start-=.75,this._end+=1),1==this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,1==this.alignZeros&&(this.marginEnd-this.marginStart)%this.step!=0&&(this.marginEnd+=this.marginEnd%this.step),this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(t){var e=""+Number(this.current).toPrecision(5);if(void 0===t||isNaN(Number(t))){if(-1!=e.indexOf(",")||-1!=e.indexOf("."))for(var i=e.length-1;i>0;i--){if("0"!=e[i]){if("."==e[i]||","==e[i]){e=e.slice(0,i);break}break}e=e.slice(0,i)}}else{var s="",o=e.indexOf("e");if(-1!=o&&(s=e.slice(o),e=e.slice(0,o)),o=Math.max(e.indexOf(","),e.indexOf(".")),-1===o?(0!==t&&(e+="."),o=e.length+t):0!==t&&(o+=t+1),o>e.length)for(var n=o-e.length;n>0;n--)e+="0";else e=e.slice(0,o);e+=s}return e},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add(-3,"days").valueOf(),this.end=i.clone().add(4,"days").valueOf(),this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.animateTimer=null,this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(47),h=i(44),d=i(20),l=i(15);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable","activate","hiddenDates"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e,i){function s(){if(!a.props.touch.dragging){var t=(new Date).valueOf(),e=t-p,i=e>c,f=i||null===o?o:r.easeInOutQuad(e,h,o,c),g=i||null===n?n:r.easeInOutQuad(e,d,n,c);m=a._applyRange(f,g),l.updateHiddenDates(a.body,a.options.hiddenDates),u=u||m,m&&a.body.emitter.emit("rangechange",{start:new Date(a.start),end:new Date(a.end)}),i?u&&a.body.emitter.emit("rangechanged",{start:new Date(a.start),end:new Date(a.end)}):a.animateTimer=setTimeout(s,20)}}var o=void 0!=t?r.convert(t,"Date").valueOf():null,n=void 0!=e?r.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),i){var a=this,h=this.start,d=this.end,c="number"==typeof i?i:500,p=(new Date).valueOf(),u=!1;return s()}var m=this._applyRange(o,n);if(l.updateHiddenDates(this.body,this.options.hiddenDates),m){var f={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",f),this.body.emitter.emit("rangechanged",f)}},s.prototype._cancelAnimation=function(){this.animateTimer&&(clearTimeout(this.animateTimer),this.animateTimer=null)},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return s>=this.start&&s<=this.end||o>=this.start&&o<=this.end||this.start>=s&&this.start<=o||this.end>=s&&this.end<=o||this.body.emitter.emit("checkRangedItems"),this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t,e){return s.conversion(this.start,this.end,t,e)},s.conversion=function(t,e,i,s){return void 0===s&&(s=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-s)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;o(e);var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY;i-=this.deltaDifference;var s=this.props.touch.end-this.props.touch.start,n=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);s-=n;var r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,a=-i/r*s,h=this.props.touch.start+a,d=this.props.touch.end+a,c=l.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0),p=l.snapAwayFromHidden(this.body.hiddenDates,d,this.previousDelta-i,!0);if(c!=h||p!=d)return this.deltaDifference+=i,this.props.touch.start=c,this.props.touch.end=p,void this._onDrag(t);this.previousDelta=i,this._applyRange(h,d),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r,e)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/(t.gesture.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),s=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),o=l.getHiddenDurationBefore(this.body.hiddenDates,this,i),r=s-o,a=i-o+(this.start-(i-o))*e,h=i+r+(this.end-(i+r))*e;this.startToFront=1-e>0?!1:!0,this.endToFront=e-1>0?!1:!0;var d=l.snapAwayFromHidden(this.body.hiddenDates,a,1-e,!0),c=l.snapAwayFromHidden(this.body.hiddenDates,h,e-1,!0);(d!=a||c!=h)&&(this.props.touch.start=d,this.props.touch.end=c,this.scaleOffset=1-t.gesture.scale,a=d,h=c),this.setRange(a,h),this.startToFront=!1,this.endToFront=!0}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var s=this.body.domProps.center.height;return e=this.conversion(s),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e,i){null==e&&(e=(this.start+this.end)/2);var s=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),o=l.getHiddenDurationBefore(this.body.hiddenDates,this,e),n=s-o,r=e-o+(this.start-(e-o))*t,a=e+n+(this.end-(e+n))*t;this.startToFront=i>0?!1:!0,this.endToFront=-i>0?!1:!0;var h=l.snapAwayFromHidden(this.body.hiddenDates,r,i,!0),d=l.snapAwayFromHidden(this.body.hiddenDates,a,-i,!0);(h!=r||d!=a)&&(r=h,a=d),this.setRange(r,a),this.startToFront=!1,this.endToFront=!0},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var o,n;if(s)for(o=0,n=t.length;n>o;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(r.stack&&null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&l.stack&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e,i){var s,o,n;for(s=0,o=t.length;o>s;s++)if(void 0!==t[s].data.subgroup){n=e.axis;for(var r in i)i.hasOwnProperty(r)&&1==i[r].visible&&i[r].indexe.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i,o){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,this.hiddenDates=o,void 0===o&&(this.hiddenDates=[])}var o=i(44),n=i(15);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step); -break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.switchedYear=!1,this.scale){case s.SCALE.YEAR:case s.SCALE.MONTH:case s.SCALE.WEEKDAY:case s.SCALE.DAY:case s.SCALE.HOUR:case s.SCALE.MINUTE:case s.SCALE.SECOND:case s.SCALE.MILLISECOND:return!0;default:return!1}else if(1==this.switchedMonth)switch(this.switchedMonth=!1,this.scale){case s.SCALE.WEEKDAY:case s.SCALE.DAY:case s.SCALE.HOUR:case s.SCALE.MINUTE:case s.SCALE.SECOND:case s.SCALE.MILLISECOND:return!0;default:return!1}else if(1==this.switchedDay)switch(this.switchedDay=!1,this.scale){case s.SCALE.MILLISECOND:case s.SCALE.SECOND:case s.SCALE.MINUTE:case s.SCALE.HOUR:return!0;default:return!1}switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var o=i(1),n=i(20),r=i(44),a=i(48);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},s.prototype.setCurrentTime=function(t){var e=o.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},s.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(20),a=i(44),h=i(48);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=n.convert(t,"Date"),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i,s){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}},title:{left:{text:void 0},right:{text:void 0}},format:{left:{decimals:void 0},right:{decimals:void 0}}},this.linegraphOptions=s,this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{},title:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.zeroCrossing=-1,this.lineOffset=0,this.master=!0,this.svgElements={},this.iconsRemoved=!1,this.groups={},this.amountOfGroups=0,this._create();var n=this;this.body.emitter.on("verticalDrag",function(){n.dom.lineContainer.style.top=n.body.domProps.scrollTop+"px"})}var o=i(1),n=i(2),r=i(20),a=i(16);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","customRange","title","format","alignZeros"];o.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.dom.lineContainer.style.position="relative",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){n.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,o=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&(1!=this.groups[r].visible||void 0!==this.linegraphOptions.visibility[r]&&1!=this.linegraphOptions.visibility[r]||(this.groups[r].drawIcon(t,o,this.svgElements,this.svg,e,i),o+=i+s));n.cleanupElements(this.svgElements),this.iconsRemoved=!1},s.prototype._cleanupIcons=function(){0==this.iconsRemoved&&(n.prepareElements(this.svgElements),n.cleanupElements(this.svgElements),this.iconsRemoved=!0)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){0==this.master&&1==this.options.alignZeros&&-1!=this.zeroCrossing&&t>0&&(t=0),this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1,e=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+"px";for(var i in this.groups)this.groups.hasOwnProperty(i)&&(1!=this.groups[i].visible||void 0!==this.linegraphOptions.visibility[i]&&1!=this.linegraphOptions.visibility[i]||e++);if(0==this.amountOfGroups||0==e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var s=this.props,o=this.dom.frame;o.className="dataaxis",this._calculateCharSize();var n=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=a?s.majorCharHeight:0,s.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,s.minorLineHeight=1,s.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,s.majorLineHeight=1,"left"==n?(o.style.top="0",o.style.left="0",o.style.bottom="",o.style.width=this.width+"px",o.style.height=this.height+"px"):(o.style.top="",o.style.bottom="0",o.style.left="0",o.style.width=this.width+"px",o.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(n)}return t},s.prototype._redrawLabels=function(){n.prepareElements(this.DOMelements.lines),n.prepareElements(this.DOMelements.labels);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation],0==this.master&&this.options.alignZeros);this.step=i;var s=(this.dom.frame.offsetHeight-i.deadSpace*(this.dom.frame.offsetHeight/i.marginRange))/((i.marginRange-i.deadSpace)/i.step);this.stepPixels=s;var o=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.dom.frame.offsetHeight/s-o);for(var h=0;.5*r>h;h++)i.previous();if(o=this.height/s,-1!=this.zeroCrossing&&1==this.options.alignZeros){var d=i.marginEnd/i.step-this.zeroCrossing;if(d>0)for(var h=0;d>h;h++)i.next();else if(0>d)for(var h=0;-d>h;h++)i.previous()}}else o+=.25;this.valueAtZero=i.marginEnd;var l,c=0,p=1;void 0!==this.options.format[t]&&(l=this.options.format[t].decimals),this.maxLabelSize=0;for(var u=0;p=0&&this._redrawLabel(u-2,i.getCurrent(l),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(u,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(u,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),1==this.master&&0==i.current&&(this.zeroCrossing=p),p++}this.conversionFactor=0==this.master?u/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var f=0;void 0!==this.options.title[t]&&void 0!==this.options.title[t].text&&(f=this.props.titleCharHeight);var g=1==this.options.icons?Math.max(this.options.iconWidth,f)+this.options.labelOffsetX+15:f+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-g&&1==this.options.visible?(this.width=this.maxLabelSize+g,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+g),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSized;d++){var c=this.visibleItems[d];c.repositionY(e)}return s},s.prototype._calculateHeight=function(t){var e,i=this.visibleItems;this.resetSubgroups();var s=this;if(i.length){var n=i[0].top,r=i[0].top+i[0].height;if(o.forEach(i,function(t){n=Math.min(n,t.top),r=Math.max(r,t.top+t.height),void 0!==t.data.subgroup&&(s.subgroups[t.data.subgroup].height=Math.max(s.subgroups[t.data.subgroup].height,t.height),s.subgroups[t.data.subgroup].visible=!0)}),n>t.axis){var a=n-t.axis;r-=a,o.forEach(i,function(t){t.top-=a})}e=r+t.item.vertical/2}else e=t.axis+t.item.vertical;return e=Math.max(e,this.props.label.height)},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),void 0!==t.data.subgroup&&(void 0===this.subgroups[t.data.subgroup]&&(this.subgroups[t.data.subgroup]={height:0,visible:!1,index:this.subgroupIndex,items:[]},this.subgroupIndex++),this.subgroups[t.data.subgroup].items.push(t)),this.orderSubgroups(),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t=[];if("string"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push({subgroup:e,sortField:this.subgroups[e].items[0].data[this.subgroupOrderer]});t.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push(this.subgroups[e].items[0].data);t.sort(this.subgroupOrderer)}if(t.length>0)for(var i=0;it?-1:l>=t?0:1};if(e.length>0)for(n=0;nl}),1==this.checkRangedItems)for(this.checkRangedItems=!1,n=0;nl})}for(n=0;n=0&&(n=e[r],!o(n));r--)void 0===s[n.id]&&(s[n.id]=!0,i.push(n));for(r=t+1;rs;s++){var n=this.visibleItems[s];n.repositionY(e)}return i},s.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={type:null,orientation:"bottom",align:"auto",stack:!0,groupOrder:null,selectable:!0,editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},onMoving:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5},this.options=n.extend({},this.defaultOptions),this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.stackDirty=!0,this.touchParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(3),a=i(4),h=i(20),d=i(25),l=i(26),c=i(33),p=i(34),u=i(35),m=i(32),f="__ungrouped__",g="__background__";s.prototype=new h,s.types={background:m,box:c,range:u,point:p},s.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var n=document.createElement("div");n.className="labelset",this.dom.labelSet=n,this._updateUngrouped();var r=new l(g,null,this);r.show(),this.groups[g]=r,this.hammer=o(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},s.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder","dataAttributes","template","hide"];n.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"==typeof t.margin&&(n.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"==typeof t.margin.item&&n.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&n.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove","onMoving"].forEach(i),this.markDirty()}},s.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},s.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},s.prototype.setSelection=function(t){var e,i,s,o;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;i>e;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=n.option.asSize,s=this.options,o=s.orientation,r=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,a.className="itemset"+(h?" editable":""),r=this._orderGroups()||r;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},m={item:t.item,axis:t.item.vertical/2},f=0,v=t.axis+t.item.vertical;return this.groups[g].redraw(e,m,c),n.forEach(this.groups,function(t){var i=t==p?u:m,s=t.redraw(e,i,c);r=s||r,f+=t.height}),f=Math.max(f,v),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",r=this._isResized()||r},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){{var t,e,i=this.groups[f];this.groups[g]}if(this.groupsData){if(i){i.hide(),delete this.groups[f];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var s=this._getGroupId(t.data),o=this.groups[s];o&&o.add(t)||t.hide()}}}else if(!i){var n=null,r=null;i=new d(n,r,this),this.groups[f]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(n.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;n.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(n.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;n.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change",{queue:!0})},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},s.prototype._getGroupId=function(t){var e=this._getType(t);return"background"==e&&void 0==t.group?g:this.groupsData?t.group:f},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=e._getType(i),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0})},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0}))},s.prototype._order=function(){n.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f||t==g)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);n.extend(o,{height:null}),s=new d(t,i,e),e.groups[t]=s;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change",{queue:!0})},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change",{queue:!0})},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!n.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.setData(e),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:a})}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var r=e.itemsData.get(o.id);this.options.onUpdate(r,function(t){t&&e.itemsData.getDataSet().update(t)})}else{var a=n.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData._fieldId]=n.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.getDataSet().add(t)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=t.gesture.touches[0]&&t.gesture.touches[0].shiftKey||!1;if(o){e.push(i.id);var n=s._getItemRange(this.itemsData.get(e,this.itemOptions));e=[];for(var r in this.items)if(this.items.hasOwnProperty(r)){var a=this.items[r],h=a.data.start,d=void 0!==a.data.end?a.data.end:h;h>=n.min&&d<=n.max&&e.push(a.id)}}else{var l=e.indexOf(i.id);-1==l?e.push(i.id):e.splice(l,1)}this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()})}}},s._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i,s){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.linegraphOptions=s,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(2),r=i(20);s.prototype=new r,s.prototype.clear=function(){this.groups={},this.amountOfGroups=0},s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.svg.style.height="100%",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||t++);if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{if(this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position)this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom="";else{var i=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+i+Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""}0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var s="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||(s+=this.groups[e].content+"
"));this.dom.textArea.innerHTML=s,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.autoSizeSVG=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(20),d=i(23),l=i(24),c=i(28),p=i(52),u="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height&&void 0!==this.body.domProps.centerContainer.height?this.autoSizeSVG=!0:void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={};for(this._getRelevantData(a,c,d,l),this._applySampling(a,c),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a=[],h=[];if(t.length>0){for(n=0;n0&&(o=this.groups[t[n]],"stack"==r.barChart.handleOverlap&&"bar"==r.style?"left"==r.yAxisOrientation?a=a.concat(o.getYRange(s)):h=h.concat(o.getYRange(s)):i[t[n]]=o.getYRange(s,t[n]));p.getStackedBarYRange(a,i,t,"__barchartLeft","left"),p.getStackedBarYRange(h,i,t,"__barchartRight","right")}},s.prototype._updateYAxis=function(t,e){var i,s,o=!1,n=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,this.yAxisRight.zeroCrossing=this.yAxisLeft.zeroCrossing,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._convertXcoordinates=function(t){for(var e,i,s=[],o=this.body.util.toScreen,n=0;nc;){c++;var p=h.getCurrent(),u=this.body.util.toScreen(p),m=h.isMajor();this.options.showMinorLabels&&this._repaintMinorText(u,h.getLabelMinor(),t),m&&this.options.showMajorLabels?(u>0&&(void 0==l&&(l=u),this._repaintMajorText(u,h.getLabelMajor(),t)),this._repaintMajorLine(u,t)):this._repaintMinorLine(u,t),h.next()}if(this.options.showMajorLabels){var f=this.body.util.toTime(0),g=h.getLabelMajor(f),v=g.length*(this.props.majorCharWidth||10)+10;(void 0==l||l>v)&&this._repaintMajorText(0,g,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text major measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(45),n=i(1);s.prototype.stack=!0,s.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setData=function(t){this.data=t,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},s.prototype._updateContents=function(t){var e;if(this.options.template){var i=this.parent.itemSet.itemsData.get(this.id);e=this.options.template(i)}else e=this.data.content;if(e!==this.content){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},s.prototype._updateTitle=function(t){null!=this.data.title?t.title=this.data.title||"":t.removeAttribute("title")},s.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=Object.keys(this.data)}for(var i=0;it.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=0,this.dirty=!1}},s.prototype.show=r.prototype.show,s.prototype.hide=r.prototype.hide,s.prototype.repositionX=r.prototype.repositionX,s.prototype.repositionY=function(t){var e="top"===this.options.orientation;this.dom.content.style.top=e?"":"0",this.dom.content.style.bottom=e?"0":"";var i;if(void 0!==this.data.subgroup){var s=this.data.subgroup,o=this.parent.subgroups,r=o[s].index;if(1==e){i=this.parent.subgroups[s].height+t.item.vertical,i+=0==r?t.axis-.5*t.item.vertical:0;var a=this.parent.top;for(var h in o)o.hasOwnProperty(h)&&1==o[h].visible&&o[h].indexr&&(a+=o[h].height+t.item.vertical);i=this.parent.subgroups[s].height+t.item.vertical,this.dom.box.style.top=a+"px",this.dom.box.style.bottom=""}}else this.parent instanceof n?(i=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.top=e?"0":"",this.dom.box.style.bottom=e?"":"0"):(i=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=i+"px"},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}{var o=i(31);i(1)}s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this,this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw item: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.box),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.dom.content.style.maxWidth="none",this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dom.content.style.maxWidth="",this.dirty=!1}this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end);-i>s&&(s=-i),o>2*i&&(o=2*i);var n=Math.max(o-s,1);switch(this.overflow?(this.left=s,this.width=n+this.props.content.width,e=this.props.content.width):(this.left=s,this.width=n,e=Math.min(o-s-2*this.options.padding,this.props.content.width)),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=n+"px",this.options.align){case"left":this.dom.content.style.left="0";break;case"right":this.dom.content.style.left=Math.max(n-e-2*this.options.padding,0)+"px";break;case"center":this.dom.content.style.left=Math.max((n-e-2*this.options.padding)/2,0)+"px";break;default:t=this.overflow?o>0?Math.max(-s,0):-e:0>s?Math.min(-s,o-s-e-2*this.options.padding):0,this.dom.content.style.left=t+"px"}},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fontColor:"black",fontSize:14,fontFace:"verdana",fontFill:void 0,level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1,borderWidthSelected:void 0},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD",layout:"hubsize"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.pixelRatio=1,this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1,this.navigationHammers={existing:[],"new":[]},this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=null,this.lockedOnNodeOffset=null;var o=this;this.groups=new u,this.images=new m,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.startedStabilization=!1,this.stabilized=!1,this.stabilizationIterations=null,this.draggingNodes=!1,this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items,e.data),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(void 0,!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(56),n=i(45),r=i(57),a=i(1),h=i(47),d=i(3),l=i(4),c=i(42),p=i(43),u=i(38),m=i(39),f=i(40),g=i(37),v=i(41),y=i(54),b=i(55),_=i(49);i(50),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(n+142.05338)+91444e-8:12.662/(n+7.4147)+.0964822:1==this.constants.clustering.enabled&&n>=this.constants.clustering.initialMaxNodes?77.5271985/(n+187.266146)+476710517e-13:30.5062972/(n+19.93597763)+.08413486;var r=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);s*=r}else{var a=1.1*Math.abs(o.maxX-o.minX),h=1.1*Math.abs(o.maxY-o.minY),d=this.frame.canvas.clientWidth/a,l=this.frame.canvas.clientHeight/h;s=l>=d?d:l}s>1&&(s=1);var c=this._findCenter(o);if(0==i){var p={position:c,scale:s,animation:t};this.moveTo(p),this.moving=!0,this.start()}else c.x*=s,c.y*=s,c.x-=.5*this.frame.canvas.clientWidth,c.y-=.5*this.frame.canvas.clientHeight,this._setScale(s),this._setTranslation(-c.x,-c.y)},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),this.initializing=!0,t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);this._putDataInSector(),0==e&&(1==this.constants.hierarchicalLayout.enabled?(this._resetLevels(),this._setupHierarchicalLayout()):this.constants.stabilize&&this._stabilize(),this.start()),this.initializing=!1},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1; -for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext){var t=this.frame.canvas.getContext("2d");this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.frame.canvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}var i=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",i._onTap.bind(i)),this.hammer.on("doubletap",i._onDoubleTap.bind(i)),this.hammer.on("hold",i._onHold.bind(i)),this.hammer.on("pinch",i._onPinch.bind(i)),this.hammer.on("touch",i._onTouch.bind(i)),this.hammer.on("dragstart",i._onDragStart.bind(i)),this.hammer.on("drag",i._onDrag.bind(i)),this.hammer.on("dragend",i._onDragEnd.bind(i)),this.hammer.on("mousewheel",i._onMouseWheel.bind(i)),this.hammer.on("DOMMouseScroll",i._onMouseWheel.bind(i)),this.hammer.on("mousemove",i._onMouseMoveTitle.bind(i)),this.hammerFrame=n(this.frame,{prevent_default:!0}),this.hammerFrame.on("release",i._onRelease.bind(i)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=r(),this.keycharm.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.keycharm.bind("up",this._moveUp.bind(t),"keydown"),this.keycharm.bind("up",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("down",this._moveDown.bind(t),"keydown"),this.keycharm.bind("down",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("left",this._moveLeft.bind(t),"keydown"),this.keycharm.bind("left",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("right",this._moveRight.bind(t),"keydown"),this.keycharm.bind("right",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("=",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("=",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num+",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("num+",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("num-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("[",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("[",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("]",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("]",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pageup",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("pageup",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.keycharm.bind("esc",this._createManipulatorBar.bind(t)),this.keycharm.bind("delete",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,this.draggingNodes=!1,null!=e&&1==this.constants.dragNodes){this.draggingNodes=!0,t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1),this.emit("dragStart",{nodeIds:this.getSelection().nodes});for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){this.releaseNode();var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(t){this._handleDragEnd(t)},s.prototype._handleDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw(),0==this.draggingNodes?this.emit("dragEnd",{nodeIds:[]}):this.emit("dragEnd",{nodeIds:this.getSelection().nodes})},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof f&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){var i=!1,s=this.frame.canvas.width,o=this.frame.canvas.height;t!=this.constants.width||e!=this.constants.height||this.frame.style.width!=t||this.frame.style.height!=e?(this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,this.constants.width=t,this.constants.height=e,i=!0):(this.frame.canvas.width!=this.frame.canvas.clientWidth*this.pixelRatio&&(this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,i=!0),this.frame.canvas.height!=this.frame.canvas.clientHeight*this.pixelRatio&&(this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,i=!0)),1==i&&this.emit("resize",{width:this.frame.canvas.width*this.pixelRatio,height:this.frame.canvas.height*this.pixelRatio,oldWidth:s*this.pixelRatio,oldHeight:o*this.pixelRatio})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(Array.isArray(t))this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new f(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t,e){for(var i=this.nodes,s=0,o=t.length;o>s;s++){var n=t[s],r=i[n],a=e[s];r?r.setProperties(a,this.constants):(r=new f(properties,this.images,this.groups,this.constants),i[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._updateValueRange(i)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(Array.isArray(t))this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),this._updateCalculationNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout())},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[],e[t].dynamicEdges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.frame.canvas.width*this.pixelRatio,i=this.frame.canvas.height*this.pixelRatio;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth*this.pixelRatio),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight*this.pixelRatio)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStepLimited(e,this.constants.maxVelocity),s=!0);else for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStep(e),s=!0);if(1==s){var o=this.constants.minVelocity/Math.max(this.scale,.05);return o>.5*this.constants.maxVelocity?!0:this._isMoving(o)}return!1},s.prototype._physicsTick=function(){if(!this.freezeSimulation&&1==this.moving){var t=!1,e=!1;this._doInAllActiveSectors("_initializeForceCalculation");var i=this._doInAllActiveSectors("_discreteStepNodes");1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&(e=this._doInSupportSector("_discreteStepNodes"));for(var s=0;s0){var i=this,s={iterations:i.stabilizationIterations};i.stabilizationIterations=0,i.startedStabilization=!1,setTimeout(function(){i.emit("stabilized",s)},0)}},s.prototype._handleNavigation=function(){if(0!=this.xIncrement||0!=this.yIncrement){var t=this._getTranslation();this._setTranslation(t.x+this.xIncrement,t.y+this.yIncrement)}if(0!=this.zoomIncrement){var e={x:this.frame.canvas.clientWidth/2,y:this.frame.canvas.clientHeight/2};this._zoom(this.scale*(1+this.zoomIncrement),e)}},s.prototype.toggleFreeze=function(){0==this.freezeSimulation?this.freezeSimulation=!0:(this.freezeSimulation=!1,this.start())},s.prototype._configureSmoothCurves=function(t){if(void 0===t&&(t=!0),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this._createBezierNodes();for(var e in this.sectors.support.nodes)this.sectors.support.nodes.hasOwnProperty(e)&&void 0===this.edges[this.sectors.support.nodes[e].parentEdgeId]&&delete this.sectors.support.nodes[e]}else{this.sectors.support.nodes={};for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.edges[i].via=null)}this._updateCalculationNodes(),t||(this.moving=!0,this.start())},s.prototype._createBezierNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic)for(var t in this.edges)if(this.edges.hasOwnProperty(t)){var e=this.edges[t];if(null==e.via){var i="edgeId:".concat(e.id);this.sectors.support.nodes[i]=new f({id:i,mass:1,shape:"circle",image:"",internalMultiplier:1},{},{},this.constants),e.via=this.sectors.support.nodes[i],e.via.parentEdgeId=e.id,e.positionBezierNode()}}},s.prototype._initializeMixinLoaders=function(){for(var t in y)y.hasOwnProperty(t)&&(s.prototype[t]=y[t])},s.prototype.storePosition=function(){console.log("storePosition is depricated: use .storePositions() from now on."),this.storePositions()},s.prototype.storePositions=function(){var t=[];for(var e in this.nodes)if(this.nodes.hasOwnProperty(e)){var i=this.nodes[e],s=!this.nodes.xFixed,o=!this.nodes.yFixed;(this.nodesData._data[e].x!=Math.round(i.x)||this.nodesData._data[e].y!=Math.round(i.y))&&t.push({id:e,x:Math.round(i.x),y:Math.round(i.y),allowedToMoveX:s,allowedToMoveY:o})}this.nodesData.update(t)},s.prototype.getPositions=function(t){var e={};if(void 0!==t){if(1==Array.isArray(t)){for(var i=0;i=1&&(this.easingTime=0,this._redraw=null!=this.lockedOnNodeId?this._lockedRedraw:this._classicRedraw,this.emit("animationFinished"))},s.prototype._classicRedraw=function(){},s.prototype.isActive=function(){return!this.activator||this.activator.active},s.prototype.setScale=function(){return this._setScale()},s.prototype.getScale=function(){return this._getScale()},s.prototype.getCenterCoordinates=function(){return this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight})},t.exports=s},function(t,e,i){function s(t,e,i){if(!e)throw"No network provided";var s=["edges","physics"],n=o.selectiveBridgeObject(s,i);this.options=n.edges,this.physics=n.physics,this.options.smoothCurves=i.smoothCurves,this.network=e,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.title=void 0,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.value=void 0,this.selected=!1,this.hover=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.dirtyLabel=!0,this.from=null,this.to=null,this.via=null,this.originalFromId=[],this.originalToId=[],this.connected=!1,this.widthFixed=!1,this.lengthFixed=!1,this.setProperties(t),this.controlNodesEnabled=!1,this.controlNodes={from:null,to:null,positions:{}},this.connectedNode=null}var o=i(1),n=i(40);s.prototype.setProperties=function(t){if(t){var e=["style","fontSize","fontFace","fontColor","fontFill","width","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","inheritColor"];switch(o.selectiveDeepExtend(e,this.options,t),void 0!==t.from&&(this.fromId=t.from),void 0!==t.to&&(this.toId=t.to),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.dirtyLabel=!0),void 0!==t.title&&(this.title=t.title),void 0!==t.value&&(this.value=t.value),void 0!==t.length&&(this.physics.springLength=t.length),void 0!==t.color&&(this.options.inheritColor=!1,o.isString(t.color)?(this.options.color.color=t.color,this.options.color.highlight=t.color):(void 0!==t.color.color&&(this.options.color.color=t.color.color),void 0!==t.color.highlight&&(this.options.color.highlight=t.color.highlight),void 0!==t.color.hover&&(this.options.color.hover=t.color.hover))),this.connect(),this.widthFixed=this.widthFixed||void 0!==t.width,this.lengthFixed=this.lengthFixed||void 0!==t.length,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.options.style){case"line":this.draw=this._drawLine;break;case"arrow":this.draw=this._drawArrow;break;case"arrow-center":this.draw=this._drawArrowCenter;break;case"dash-line":this.draw=this._drawDashLine;break;default:this.draw=this._drawLine}}},s.prototype.connect=function(){this.disconnect(),this.from=this.network.nodes[this.fromId]||null,this.to=this.network.nodes[this.toId]||null,this.connected=this.from&&this.to,this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this))},s.prototype.disconnect=function(){this.from&&(this.from.detachEdge(this),this.from=null),this.to&&(this.to.detachEdge(this),this.to=null),this.connected=!1},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.getValue=function(){return this.value},s.prototype.setValueRange=function(t,e){if(!this.widthFixed&&void 0!==this.value){var i=(this.options.widthMax-this.options.widthMin)/(e-t);this.options.width=(this.value-t)*i+this.options.widthMin,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier}},s.prototype.draw=function(){throw"Method draw not initialized in edge"},s.prototype.isOverlappingWith=function(t){if(this.connected){var e=10,i=this.from.x,s=this.from.y,o=this.to.x,n=this.to.y,r=t.left,a=t.top,h=this._getDistanceToEdge(i,s,o,n,r,a);return e>h}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t); -if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.max(Math.min(this.widthSelected,this.options.widthMax),.3*this.networkScaleInv):1==this.hover?Math.max(Math.min(this.options.hoverWidth,this.options.widthMax),.3*this.networkScaleInv):Math.max(this.options.width,.3*this.networkScaleInv)},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yd;d++){var l=t.measureText(n[d]).width;h=l>h?l:h}var c=this.options.fontSize*r,p=i-h/2,u=s-c/2;this.labelDimensions={top:u,left:p,width:h,height:c,yLine:o}}void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(this.labelDimensions.left,this.labelDimensions.top,this.labelDimensions.width,this.labelDimensions.height)),t.fillStyle=this.options.fontColor||"black",t.textAlign="center",t.textBaseline="middle",o=this.labelDimensions.yLine;for(var d=0;r>d;d++)t.fillText(n[d],i,o),o+=a}},s.prototype._drawDashLine=function(t){t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth();var e=null;if(void 0!==t.mozDash||void 0!==t.setLineDash){var i=[0];i=void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?[this.options.dash.length,this.options.dash.gap]:[5,5],"undefined"!=typeof t.setLineDash?(t.setLineDash(i),t.lineDashOffset=0):(t.mozDash=i,t.mozDashOffset=0),e=this._line(t),"undefined"!=typeof t.setLineDash?(t.setLineDash([0]),t.lineDashOffset=0):(t.mozDash=[0],t.mozDashOffset=0)}else t.beginPath(),t.lineCap="round",void 0!==this.options.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]):void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke();if(this.label){var s;if(1==this.options.smoothCurves.enabled&&null!=e){var o=.5*(.5*(this.from.x+e.x)+.5*(this.to.x+e.x)),n=.5*(.5*(this.from.y+e.y)+.5*(this.to.y+e.y));s={x:o,y:n}}else s=this._pointOnLine(.5);this._label(t,this.label,s.x,s.y)}},s.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},s.prototype._pointOnCircle=function(t,e,i,s){var o=2*(s-3/8)*Math.PI;return{x:t+i*Math.cos(o),y:e-i*Math.sin(o)}},s.prototype._drawArrowCenter=function(t){var e;if(t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth(),this.from!=this.to){var i=this._line(t),s=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),o=(10+5*this.options.width)*this.options.arrowScaleFactor;if(1==this.options.smoothCurves.enabled&&null!=i){var n=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),r=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:n,y:r}}else e=this._pointOnLine(.5);t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&this._label(t,this.label,e.x,e.y)}else{var a,h,d=.25*Math.max(100,this.physics.springLength),l=this.from;l.width||l.resize(t),l.width>l.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),m=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-m)*s.x+m*this.to.x,p=(1-m)*s.y+m*this.to.y):(c=(1-m)*this.from.x+m*this.to.x,p=(1-m)*this.from.y+m*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var f;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));f={x:g,y:v}}else f=this._pointOnLine(.5);this._label(t,this.label,f.x,f.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(f=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,f.x,f.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){var r=0;if(this.from!=this.to)if(1==this.options.smoothCurves.enabled){var a,h;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)a=this.via.x,h=this.via.y;else{var d=this._getViaCoordinates();a=d.x,h=d.y}var l,c,p,u,m,f,g,v=1e9;for(c=0;10>c;c++)p=.1*c,u=Math.pow(1-p,2)*t+2*p*(1-p)*a+Math.pow(p,2)*i,m=Math.pow(1-p,2)*e+2*p*(1-p)*h+Math.pow(p,2)*s,c>0&&(l=this._getDistanceToLine(f,g,u,m,o,n),v=v>l?l:v),f=u,g=m;r=v}else r=this._getDistanceToLine(t,e,i,s,o,n);else{var u,m,y,b,_=.25*this.physics.springLength,x=this.from;x.width>x.height?(u=x.x+.5*x.width,m=x.y-_):(u=x.x+_,m=x.y-.5*x.height),y=u-o,b=m-n,r=Math.abs(Math.sqrt(y*y+b*b)-_)}return this.labelDimensions.lefto&&this.labelDimensions.topn?0:r},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t,e){var i=this.images[t];if(void 0==i){var s=this;i=new Image,this.images[t]=i,i.onload=function(){s.callback&&s.callback(this)},i.onerror=function(){this.src=e,s.callback&&s.callback(this)},i.src=t}return i},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.allowedToMoveX=!1,this.allowedToMoveY=!1,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.hierarchyEnumerated=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1),e=this.dynamicEdges.indexOf(t),-1!=e&&this.dynamicEdges.splice(e,1),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","brokenImage","radius","fontColor","fontSize","fontFace","fontFill","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage)}switch(void 0!==t.allowedToMoveX?(this.xFixed=!t.allowedToMoveX,this.allowedToMoveX=t.allowedToMoveX):void 0!==t.x&&0==this.allowedToMoveX&&(this.xFixed=!0),void 0!==t.allowedToMoveY?(this.yFixed=!t.allowedToMoveY,this.allowedToMoveY=t.allowedToMoveY):void 0!==t.y&&0==this.allowedToMoveY&&(this.yFixed=!0),this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(this.xFixed)this.fx=0,this.vx=0;else{var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0,this.vx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y) -},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=t.measureText(a[0]).width,p=1;h>p;p++){var u=t.measureText(a[p]).width;c=u>c?u:c}var m=this.options.fontSize*h,f=i-c/2,g=s-m/2;"top"==n&&(g+=.5*d),this.labelDimensions={top:g,left:f,width:c,height:m,yLine:l},void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(f,g,c,m)),t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";for(var p=0;h>p;p++)t.fillText(a[p],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=M.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==E.charAt(e)||" "==E.charAt(e);)e--;if("\n"==E.charAt(e)||""==E.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=M.DELIMITER);var i=O+n();if(C[i])return k=M.DELIMITER,L=i,o(),void o();if(C[O])return k=M.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=M.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=M.IDENTIFIER)}for(k=M.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==M.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)f(t),";"==L&&p()}function f(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=M.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=M.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==M.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=M.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=M.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=M.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),o={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),o.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);o.edges.push(i)}),S(i,s,function(i,s){var n=c(o,i.id,s.id,t.type,t.attr),r=e(n);o.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);o.edges.push(i)})}),s.attr&&(o.options=s.attr),o}var M={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},C={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},E="",T=0,O="",L="",k=M.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=D},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}return{start:e,end:i}},s.prototype.setWindow=function(t,e,i){var s=i&&void 0!==i.animate?i.animate:!0;if(1==arguments.length){var o=arguments[0];this.range.setRange(o.start,o.end,s)}else this.range.setRange(t,e,s)},s.prototype.moveTo=function(t,e){var i=this.range.end-this.range.start,s=r.convert(t,"Date").valueOf(),o=s-i/2,n=s+i/2,a=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(o,n,a)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){h.updateHiddenDates(this.body,this.options.hiddenDates),"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;0===s.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===s.root.clientHeight&&(n=o),i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),d=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,d+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var l=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=l,i.leftContainer.height=l,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var c=i.root.width-i.left.width-i.right.width-n;i.center.width=c,i.centerContainer.width=c,i.top.width=c,i.bottom.width=c,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+i.border.left+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var p=this.props.scrollTop;"bottom"==e.orientation&&(p+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=p+"px",s.left.style.left="0",s.left.style.top=p+"px",s.right.style.left="0",s.right.style.top=p+"px";var u=0==this.props.scrollTop?"hidden":"",m=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";if(s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=m,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=m,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=m,this.components.forEach(function(e){t=e.redraw()||t}),t){var f=2;this.redrawCount0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,m=e+(s-r/2),f=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,m),this.bezierCurveTo(l,m+d,p+h,f,p,f),this.bezierCurveTo(p-h,f,t,m+d,t,m),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){function s(t,e){this.groupId=t,this.options=e}var o=i(2),n=i(53);s.prototype.getYRange=function(t){var e=t[0].y,i=t[0].y;for(j=0;jt[j].y?t[j].y:e,i=i0){var r,a,h=Number(i.svg.style.height.replace("px",""));if(r=o.getSVGElement("path",i.svgElements,i.svg),r.setAttributeNS(null,"class",e.className),void 0!==e.style&&r.setAttributeNS(null,"style",e.style),a=1==e.options.catmullRom.enabled?s._catmullRom(t,e):s._linear(t),1==e.options.shaded.enabled){var d,l=o.getSVGElement("path",i.svgElements,i.svg);d="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+a+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+h+" "+a+"L"+t[t.length-1].x+","+h,l.setAttributeNS(null,"class",e.className+" fill"),void 0!==e.options.shaded.style&&l.setAttributeNS(null,"style",e.options.shaded.style),l.setAttributeNS(null,"d",d)}r.setAttributeNS(null,"d","M"+a),1==e.options.drawPoints.enabled&&n.draw(t,e,i)}},s._catmullRomUniform=function(t){for(var e,i,s,o,n,r,a=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",h=1/6,d=t.length,l=0;d-1>l;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,m,f,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,D=0;S-1>D;D++)s=0==D?t[0]:t[D-1],o=t[D],n=t[D+1],r=S>D+2?t[D+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,m=3*x*(x+v),m>0&&(m=1/m),f=3*g*(g+v),f>0&&(f=1/f),a={x:(-b*s.x+p*o.x+_*n.x)*m,y:(-b*s.y+p*o.y+_*n.y)*m},h={x:(y*o.x+u*n.x-b*r.x)*f,y:(y*o.y+u*n.y-b*r.y)*f},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s._linear=function(t){for(var e="",i=0;it[s].y?t[s].y:e,i=i0&&(n=Math.min(n,Math.abs(c[d-1].x-r))),a=s._getSafeDrawData(n,h,m);else{var g=d+(p[r].amount-p[r].resolved),v=d-(p[r].resolved+1);g0&&(n=Math.min(n,Math.abs(c[v].x-r))),a=s._getSafeDrawData(n,h,m),p[r].resolved+=1,"stack"==h.options.barChart.handleOverlap?(f=p[r].accumulated,p[r].accumulated+=h.zeroPosition-c[d].y):"sideBySide"==h.options.barChart.handleOverlap&&(a.width=a.width/p[r].amount,a.offset+=p[r].resolved*a.width-.5*a.width*(p[r].amount+1),"left"==h.options.barChart.align?a.offset-=.5*a.width:"right"==h.options.barChart.align&&(a.offset+=.5*a.width))}o.drawBar(c[d].x+a.offset,c[d].y-f,a.width,h.zeroPosition-c[d].y,h.className+" bar",i.svgElements,i.svg),1==h.options.drawPoints.enabled&&o.drawPoint(c[d].x+a.offset,c[d].y,h,i.svgElements,i.svg)}},s._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.getStackedBarYRange=function(t,e,i,o,n){if(t.length>0){t.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x});var r={};s._getDataIntersections(r,t),e[o]=s._getStackedBarYRange(r,t),e[o].yAxisOrientation=n,i.push(o)}},s._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=ot[j].y?t[j].y:e,i=is;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e){var i,s,o;!function(n,r){s=[],i=r,o="function"==typeof i?i.apply(e,s):i,!(void 0!==o&&(t.exports=o))}(this,function(){function t(t){var e,i=t&&t.preventDefault||!1,s={keydown:{},keyup:{}},o={};for(e=97;122>=e;e++)o[String.fromCharCode(e)]={code:65+(e-97),shift:!1};for(e=65;90>=e;e++)o[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;9>=e;e++)o[""+e]={code:48+e,shift:!1};for(e=1;12>=e;e++)o["F"+e]={code:111+e,shift:!1};for(e=0;9>=e;e++)o["num"+e]={code:96+e,shift:!1};o["num*"]={code:106,shift:!1},o["num+"]={code:107,shift:!1},o["num-"]={code:109,shift:!1},o["num/"]={code:111,shift:!1},o["num."]={code:110,shift:!1},o.left={code:37,shift:!1},o.up={code:38,shift:!1},o.right={code:39,shift:!1},o.down={code:40,shift:!1},o.space={code:32,shift:!1},o.enter={code:13,shift:!1},o.shift={code:16,shift:void 0},o.esc={code:27,shift:!1},o.backspace={code:8,shift:!1},o.tab={code:9,shift:!1},o.ctrl={code:17,shift:!1},o.alt={code:18,shift:!1},o["delete"]={code:46,shift:!1},o.pageup={code:33,shift:!1},o.pagedown={code:34,shift:!1},o["="]={code:187,shift:!1},o["-"]={code:189,shift:!1},o["]"]={code:221,shift:!1},o["["]={code:219,shift:!1};var n=function(t){a(t,"keydown")},r=function(t){a(t,"keyup")},a=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n0)for(i in He)s=He[i],o=e[s],"undefined"!=typeof o&&(t[s]=o);return t}function b(t){return 0>t?Math.ceil(t):Math.floor(t)}function _(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&k(t[s])!==k(e[s]))&&r++;return r+n}function T(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=mi[t]||fi[e]||e}return t}function O(t){var e,i,s={};for(i in t)a(t,i)&&(e=T(i),e&&(s[e]=t[i]));return s}function L(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}De[t]=function(s,o){var r,a,h=De._locale[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=De().utc().set(i,t);return h.call(De._locale,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function k(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function N(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function I(t,e,i){return pe(De([t,11,31+e-i]),e,i).week}function A(t){return z(t)?366:365}function z(t){return t%4===0&&t%100!==0||t%400===0}function P(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Ne]<0||t._a[Ne]>11?Ne:t._a[Ie]<1||t._a[Ie]>N(t._a[ke],t._a[Ne])?Ie:t._a[Ae]<0||t._a[Ae]>24||24===t._a[Ae]&&(0!==t._a[ze]||0!==t._a[Pe]||0!==t._a[Re])?Ae:t._a[ze]<0||t._a[ze]>59?ze:t._a[Pe]<0||t._a[Pe]>59?Pe:t._a[Re]<0||t._a[Re]>999?Re:-1,t._pf._overflowDayOfYear&&(ke>e||e>Ie)&&(e=Ie),t._pf.overflow=e)}function R(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length&&t._pf.bigHour===n)),t._isValid}function F(t){return t?t.toLowerCase().replace("_","-"):t}function H(t){for(var e,i,s,o,n=0;n0;){if(s=Y(o.slice(0,e).join("-")))return s;if(i&&i.length>=e&&E(o,i,!0)>=e-1)break;e--}n++}return null}function Y(t){var e=null;if(!Fe[t]&&Ye)try{e=De.locale(),!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),De.locale(e)}catch(i){}return Fe[t]}function W(t,e){var i,s;return e._isUTC?(i=e.clone(),s=(De.isMoment(t)||C(t)?+t:+De(t))-+i,i._d.setTime(+i._d+s),De.updateOffset(i,!1),i):De(t).local()}function B(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,i,s=t.match(je);for(e=0,i=s.length;i>e;e++)s[e]=_i[s[e]]?_i[s[e]]:B(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function j(t,e){return t.isValid()?(e=U(e,t.localeData()),gi[e]||(gi[e]=G(e)),gi[e](t)):t.localeData().invalidDate()}function U(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Ue.lastIndex=0;s>=0&&Ue.test(t);)t=t.replace(Ue,i),Ue.lastIndex=0,s-=1;return t}function V(t,e){var i,s=e._strict;switch(t){case"Q":return ii;case"DDDD":return oi;case"YYYY":case"GGGG":case"gggg":return s?ni:qe;case"Y":case"G":case"g":return ai;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?ri:Ze;case"S":if(s)return ii;case"SS":if(s)return si;case"SSS":if(s)return oi;case"DDD":return Xe;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Qe;case"a":case"A":return e._locale._meridiemParse;case"x":return ti;case"X":return ei;case"Z":case"ZZ":return $e;case"T":return Je;case"SSSS":return Ke;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?si:Ve;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ve;case"Do":return s?e._locale._ordinalParse:e._locale._ordinalParseLenient;default:return i=new RegExp(ee(te(t.replace("\\","")),"i"))}}function X(t){t=t||"";var e=t.match($e)||[],i=e[e.length-1]||[],s=(i+"").match(pi)||["-",0,0],o=+(60*s[1])+k(s[2]);return"+"===s[0]?-o:o}function q(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Ne]=3*(k(e)-1));break;case"M":case"MM":null!=e&&(o[Ne]=k(e)-1);break;case"MMM":case"MMMM":s=i._locale.monthsParse(e,t,i._strict),null!=s?o[Ne]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ie]=k(e));break;case"Do":null!=e&&(o[Ie]=k(parseInt(e.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=k(e));break;case"YY":o[ke]=De.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[ke]=k(e);break;case"a":case"A":i._isPm=i._locale.isPM(e);break;case"h":case"hh":i._pf.bigHour=!0;case"H":case"HH":o[Ae]=k(e);break;case"m":case"mm":o[ze]=k(e);break;case"s":case"ss":o[Pe]=k(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Re]=k(1e3*("0."+e));break;case"x":i._d=new Date(k(e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=X(e);break;case"dd":case"ddd":case"dddd":s=i._locale.weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=k(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=De.parseTwoDigitYear(e)}}function Z(t){var e,i,s,o,n,a,h;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[ke],pe(De(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(n=t._locale._week.dow,a=t._locale._week.doy,i=r(e.gg,t._a[ke],pe(De(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ue(i,s,o,a,n),t._a[ke]=h.year,t._dayOfYear=h.dayOfYear}function K(t){var e,i,s,o,n=[];if(!t._d){for(s=$(t),t._w&&null==t._a[Ie]&&null==t._a[Ne]&&Z(t),t._dayOfYear&&(o=r(t._a[ke],s[ke]),t._dayOfYear>A(o)&&(t._pf._overflowDayOfYear=!0),i=he(o,0,t._dayOfYear),t._a[Ne]=i.getUTCMonth(),t._a[Ie]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Ae]&&0===t._a[ze]&&0===t._a[Pe]&&0===t._a[Re]&&(t._nextDay=!0,t._a[Ae]=0),t._d=(t._useUTC?he:ae).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm),t._nextDay&&(t._a[Ae]=24)}}function Q(t){var e;t._d||(e=O(t._i),t._a=[e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],K(t))}function $(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function J(t){if(t._f===De.ISO_8601)return void se(t);t._a=[],t._pf.empty=!0;var e,i,s,o,r,a=""+t._i,h=a.length,d=0;for(s=U(t._f,t._locale).match(je)||[],e=0;e0&&t._pf.unusedInput.push(r),a=a.slice(a.indexOf(i)+i.length),d+=i.length),_i[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),q(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._pf.bigHour===!0&&t._a[Ae]<=12&&(t._pf.bigHour=n),t._isPm&&t._a[Ae]<12&&(t._a[Ae]+=12),t._isPm===!1&&12===t._a[Ae]&&(t._a[Ae]=0),K(t),P(t)}function te(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function ee(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ie(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));v(t,i||e)}function se(t){var e,i,s=t._i,o=hi.exec(s);if(o){for(t._pf.iso=!0,e=0,i=li.length;i>e;e++)if(li[e][1].exec(s)){t._f=li[e][0]+(o[6]||" ");break}for(e=0,i=ci.length;i>e;e++)if(ci[e][1].exec(s)){t._f+=ci[e][0];break}s.match($e)&&(t._f+="Z"),J(t)}else t._isValid=!1}function oe(t){se(t),t._isValid===!1&&(delete t._isValid,De.createFromInputFallback(t))}function ne(t,e){var i,s=[];for(i=0;it&&a.setFullYear(t),a}function he(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function de(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function le(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ce(t,e,i){var s=De.duration(t).abs(),o=Oe(s.as("s")),n=Oe(s.as("m")),r=Oe(s.as("h")),a=Oe(s.as("d")),h=Oe(s.as("M")),d=Oe(s.as("y")),l=o0,l[4]=i,le.apply({},l)}function pe(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=De(t).add(n,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ue(t,e,i,s,o){var n,r,a=he(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:A(t-1)+r}}function me(t){var e,i=t._i,s=t._f;return t._locale=t._locale||De.localeData(t._l),null===i||s===n&&""===i?De.invalid({nullInput:!0}):("string"==typeof i&&(t._i=i=t._locale.preparse(i)),De.isMoment(i)?new f(i,!0):(s?M(s)?ie(t):J(t):re(t),e=new f(t),e._nextDay&&(e.add(1,"d"),e._nextDay=n),e))}function fe(t,e){var i,s;if(1===e.length&&M(e[0])&&(e=e[0]),!e.length)return De();for(i=e[0],s=1;s=0?"+":"-";return e+_(Math.abs(t),6)},gg:function(){return _(this.weekYear()%100,2)},gggg:function(){return _(this.weekYear(),4)},ggggg:function(){return _(this.weekYear(),5)},GG:function(){return _(this.isoWeekYear()%100,2)},GGGG:function(){return _(this.isoWeekYear(),4)},GGGGG:function(){return _(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return k(this.milliseconds()/100)},SS:function(){return _(k(this.milliseconds()/10),2)},SSS:function(){return _(this.milliseconds(),3)},SSSS:function(){return _(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+":"+_(k(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+_(k(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},xi={},wi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];yi.length;)Ce=yi.pop(),_i[Ce+"o"]=u(_i[Ce],Ce);for(;bi.length;)Ce=bi.pop(),_i[Ce+Ce]=p(_i[Ce],2);_i.DDDD=p(_i.DDD,3),v(m.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t,e,i){var s,o,n;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;12>s;s++){if(o=De.utc([2e3,s]),i&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(o,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(o,"").replace(".","")+"$","i")),i||this._monthsParse[s]||(n="^"+this.months(o,"")+"|^"+this.monthsShort(o,""),this._monthsParse[s]=new RegExp(n.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[s].test(t))return s;if(i&&"MMM"===e&&this._shortMonthsParse[s].test(t))return s;if(!i&&this._monthsParse[s].test(t))return s}},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=De([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e,i){var s=this._calendar[t];return"function"==typeof s?s.apply(e,[i]):s},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",_ordinalParse:/\d{1,2}/,preparse:function(t){return t},postformat:function(t){return t},week:function(t){return pe(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),De=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=h(),me(o)},De.suppressDeprecationWarnings=!1,De.createFromInputFallback=l("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),De.min=function(){var t=[].slice.call(arguments,0);return fe("isBefore",t)},De.max=function(){var t=[].slice.call(arguments,0);return fe("isAfter",t)},De.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=h(),me(o).utc()},De.unix=function(t){return De(1e3*t)},De.duration=function(t,e){var i,s,o,n,r=t,h=null;return De.isDuration(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(h=Be.exec(t))?(i="-"===h[1]?-1:1,r={y:0,d:k(h[Ie])*i,h:k(h[Ae])*i,m:k(h[ze])*i,s:k(h[Pe])*i,ms:k(h[Re])*i}):(h=Ge.exec(t))?(i="-"===h[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},r={y:o(h[2]),M:o(h[3]),d:o(h[4]),h:o(h[5]),m:o(h[6]),s:o(h[7]),w:o(h[8])}):"object"==typeof r&&("from"in r||"to"in r)&&(n=w(De(r.from),De(r.to)),r={},r.ms=n.milliseconds,r.M=n.months),s=new g(r),De.isDuration(t)&&a(t,"_locale")&&(s._locale=t._locale),s},De.version=Ee,De.defaultFormat=di,De.ISO_8601=function(){},De.momentProperties=He,De.updateOffset=function(){},De.relativeTimeThreshold=function(t,e){return vi[t]===n?!1:e===n?vi[t]:(vi[t]=e,!0)},De.lang=l("moment.lang is deprecated. Use moment.locale instead.",function(t,e){return De.locale(t,e)}),De.locale=function(t,e){var i;return t&&(i="undefined"!=typeof e?De.defineLocale(t,e):De.localeData(t),i&&(De.duration._locale=De._locale=i)),De._locale._abbr},De.defineLocale=function(t,e){return null!==e?(e.abbr=t,Fe[t]||(Fe[t]=new m),Fe[t].set(e),De.locale(t),Fe[t]):(delete Fe[t],null)},De.langData=l("moment.langData is deprecated. Use moment.localeData instead.",function(t){return De.localeData(t)}),De.localeData=function(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return De._locale;if(!M(t)){if(e=Y(t))return e;t=[t]}return H(t)},De.isMoment=function(t){return t instanceof f||null!=t&&a(t,"_isAMomentObject")},De.isDuration=function(t){return t instanceof g};for(Ce=wi.length-1;Ce>=0;--Ce)L(wi[Ce]);De.normalizeUnits=function(t){return T(t)},De.invalid=function(t){var e=De.utc(0/0);return null!=t?v(e._pf,t):e._pf.userInvalidated=!0,e},De.parseZone=function(){return De.apply(null,arguments).parseZone()},De.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)},v(De.fn=f.prototype,{clone:function(){return De(this) -},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=De(this).utc();return 00:!1},parsingFlags:function(){return v({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(t){return this.zone(0,t)},local:function(t){return this._isUTC&&(this.zone(0,t),this._isUTC=!1,t&&this.add(this._dateTzOffset(),"m")),this},format:function(t){var e=j(this,t||De.defaultFormat);return this.localeData().postformat(e)},add:S(1,"add"),subtract:S(-1,"subtract"),diff:function(t,e,i){var s,o,n,r=W(t,this),a=6e4*(this.zone()-r.zone());return e=T(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+r.daysInMonth()),o=12*(this.year()-r.year())+(this.month()-r.month()),n=this-De(this).startOf("month")-(r-De(r).startOf("month")),n-=6e4*(this.zone()-De(this).startOf("month").zone()-(r.zone()-De(r).startOf("month").zone())),o+=n/s,"year"===e&&(o/=12)):(s=this-r,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),i?o:b(o)},from:function(t,e){return De.duration({to:this,from:t}).locale(this.locale()).humanize(!e)},fromNow:function(t){return this.from(De(),t)},calendar:function(t){var e=t||De(),i=W(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.localeData().calendar(o,this,De(e)))},isLeapYear:function(){return z(this.year())},isDST:function(){return this.zone()+t):(i=De.isMoment(t)?+t:+De(t),i<+this.clone().startOf(e))},isBefore:function(t,e){var i;return e=T("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=De.isMoment(t)?t:De(t),+t>+this):(i=De.isMoment(t)?+t:+De(t),+this.clone().endOf(e)t?this:t}),max:l("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=De.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i,s=this._offset||0;return null==t?this._isUTC?s:this._dateTzOffset():("string"==typeof t&&(t=X(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(i=this._dateTzOffset()),this._offset=t,this._isUTC=!0,null!=i&&this.subtract(i,"m"),s!==t&&(!e||this._changeInProgress?D(this,De.duration(s-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,De.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?De(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return N(this.year(),this.month())},dayOfYear:function(t){var e=Oe((De(this).startOf("day")-De(this).startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=pe(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==t?e:this.add(t-e,"y")},isoWeekYear:function(t){var e=pe(this,1,4).year;return null==t?e:this.add(t-e,"y")},week:function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},isoWeek:function(t){var e=pe(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},weekday:function(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return I(this.year(),1,4)},weeksInYear:function(){var t=this.localeData()._week;return I(this.year(),t.dow,t.doy)},get:function(t){return t=T(t),this[t]()},set:function(t,e){return t=T(t),"function"==typeof this[t]&&this[t](e),this},locale:function(t){var e;return t===n?this._locale._abbr:(e=De.localeData(t),null!=e&&(this._locale=e),this)},lang:l("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return t===n?this.localeData():this.locale(t)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),De.fn.millisecond=De.fn.milliseconds=be("Milliseconds",!1),De.fn.second=De.fn.seconds=be("Seconds",!1),De.fn.minute=De.fn.minutes=be("Minutes",!1),De.fn.hour=De.fn.hours=be("Hours",!0),De.fn.date=be("Date",!0),De.fn.dates=l("dates accessor is deprecated. Use date instead.",be("Date",!0)),De.fn.year=be("FullYear",!0),De.fn.years=l("years accessor is deprecated. Use year instead.",be("FullYear",!0)),De.fn.days=De.fn.day,De.fn.months=De.fn.month,De.fn.weeks=De.fn.week,De.fn.isoWeeks=De.fn.isoWeek,De.fn.quarters=De.fn.quarter,De.fn.toJSON=De.fn.toISOString,v(De.duration.fn=g.prototype,{_bubble:function(){var t,e,i,s=this._milliseconds,o=this._days,n=this._months,r=this._data,a=0;r.milliseconds=s%1e3,t=b(s/1e3),r.seconds=t%60,e=b(t/60),r.minutes=e%60,i=b(e/60),r.hours=i%24,o+=b(i/24),a=b(_e(o)),o-=b(xe(a)),n+=b(o/30),o%=30,a+=b(n/12),n%=12,r.days=o,r.months=n,r.years=a},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return b(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12)},humanize:function(t){var e=ce(this,!t,this.localeData());return t&&(e=this.localeData().pastFuture(+this,e)),this.localeData().postformat(e)},add:function(t,e){var i=De.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=De.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=T(t),this[t.toLowerCase()+"s"]()},as:function(t){var e,i;if(t=T(t),"month"===t||"year"===t)return e=this._days+this._milliseconds/864e5,i=this._months+12*_e(e),"month"===t?i:i/12;switch(e=this._days+Math.round(xe(this._months/12)),t){case"week":return e/7+this._milliseconds/6048e5;case"day":return e+this._milliseconds/864e5;case"hour":return 24*e+this._milliseconds/36e5;case"minute":return 24*e*60+this._milliseconds/6e4;case"second":return 24*e*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*e*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+t)}},lang:De.fn.lang,locale:De.fn.locale,toIsoString:l("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"},localeData:function(){return this._locale}}),De.duration.fn.toString=De.duration.fn.toISOString;for(Ce in ui)a(ui,Ce)&&we(Ce.toLowerCase());De.duration.fn.asMilliseconds=function(){return this.as("ms")},De.duration.fn.asSeconds=function(){return this.as("s")},De.duration.fn.asMinutes=function(){return this.as("m")},De.duration.fn.asHours=function(){return this.as("h")},De.duration.fn.asDays=function(){return this.as("d")},De.duration.fn.asWeeks=function(){return this.as("weeks")},De.duration.fn.asMonths=function(){return this.as("M")},De.duration.fn.asYears=function(){return this.as("y")},De.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ye?o.exports=De:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(Te.moment=Me),De}.call(e,i,e,o),!(s!==n&&(o.exports=s)),Se(!0))}).call(this)}).call(e,function(){return this}(),i(71)(t))},function(t,e,i){var s;!function(o,n){"use strict";function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){D.register(t)}),w.onTouch(a.DOCUMENT,v,D.detect),w.onTouch(a.DOCUMENT,y,D.detect),a.READY=!0)}var a=function M(t,e){return new M.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",m=a.POINTER_TOUCH="touch",f=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(D,d),a&&(d.changedLength=h,d.eventType=a,s.call(D,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(D,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=m;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(f,s)&&(o=f),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return D.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[m]=i===(e.MSPOINTER_TYPE_TOUCH||m),s[f]=i===(e.MSPOINTER_TYPE_PEN||f),s[t]},reset:function(){this.pointers={}}},D=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?D.startDetect(i,t):t.eventType==_&&D.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=D.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=D.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=D.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=D.current,h=D.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1),o=i(40);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new o({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](o[0],o[1]):this[t](e))}return this._loadLatestSector(),i},e._doInSupportSector=function(t,e){var i=!1;if(void 0===e)this._switchToSupportSector(),i=this[t]();else{this._switchToSupportSector();var s=Array.prototype.splice.call(arguments,1);i=s.length>1?this[t](s[0],s[1]):this[t](e)}return this._loadLatestSector(),i},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ei;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e,!0)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,!1,!0)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(40),n=i(37);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM={},this._manipulationReleaseOverload=function(){},delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode,this.controlNodesActive=!1},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=this.manipulationDiv,e=this.closeDiv,i=this.editModeDiv;1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,this.manipulationDOM={},1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM.addNodeSpan=document.createElement("span"),this.manipulationDOM.addNodeSpan.className="network-manipulationUI add",this.manipulationDOM.addNodeLabelSpan=document.createElement("span"),this.manipulationDOM.addNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addNodeLabelSpan.innerHTML=t.addNode,this.manipulationDOM.addNodeSpan.appendChild(this.manipulationDOM.addNodeLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.addEdgeSpan=document.createElement("span"),this.manipulationDOM.addEdgeSpan.className="network-manipulationUI connect",this.manipulationDOM.addEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.addEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addEdgeLabelSpan.innerHTML=t.addEdge,this.manipulationDOM.addEdgeSpan.appendChild(this.manipulationDOM.addEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.addNodeSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.addEdgeSpan),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?(this.manipulationDOM.seperatorLineDiv2=document.createElement("div"),this.manipulationDOM.seperatorLineDiv2.className="network-seperatorLine",this.manipulationDOM.editNodeSpan=document.createElement("span"),this.manipulationDOM.editNodeSpan.className="network-manipulationUI edit",this.manipulationDOM.editNodeLabelSpan=document.createElement("span"),this.manipulationDOM.editNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editNodeLabelSpan.innerHTML=t.editNode,this.manipulationDOM.editNodeSpan.appendChild(this.manipulationDOM.editNodeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv2),this.manipulationDiv.appendChild(this.manipulationDOM.editNodeSpan)):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.seperatorLineDiv3=document.createElement("div"),this.manipulationDOM.seperatorLineDiv3.className="network-seperatorLine",this.manipulationDOM.editEdgeSpan=document.createElement("span"),this.manipulationDOM.editEdgeSpan.className="network-manipulationUI edit",this.manipulationDOM.editEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.editEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editEdgeLabelSpan.innerHTML=t.editEdge,this.manipulationDOM.editEdgeSpan.appendChild(this.manipulationDOM.editEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv3),this.manipulationDiv.appendChild(this.manipulationDOM.editEdgeSpan)),0==this._selectionIsEmpty()&&(this.manipulationDOM.seperatorLineDiv4=document.createElement("div"),this.manipulationDOM.seperatorLineDiv4.className="network-seperatorLine",this.manipulationDOM.deleteSpan=document.createElement("span"),this.manipulationDOM.deleteSpan.className="network-manipulationUI delete",this.manipulationDOM.deleteLabelSpan=document.createElement("span"),this.manipulationDOM.deleteLabelSpan.className="network-manipulationLabel",this.manipulationDOM.deleteLabelSpan.innerHTML=t.del,this.manipulationDOM.deleteSpan.appendChild(this.manipulationDOM.deleteLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv4),this.manipulationDiv.appendChild(this.manipulationDOM.deleteSpan)),this.manipulationDOM.addNodeSpan.onclick=this._createAddNodeToolbar.bind(this),this.manipulationDOM.addEdgeSpan.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDOM.editNodeSpan.onclick=this._editNode.bind(this):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.editEdgeSpan.onclick=this._createEditEdgeToolbar.bind(this)),0==this._selectionIsEmpty()&&(this.manipulationDOM.deleteSpan.onclick=this._deleteSelected.bind(this)),this.closeDiv.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{for(;this.editModeDiv.hasChildNodes();)this.editModeDiv.removeChild(this.editModeDiv.firstChild);this.manipulationDOM.editModeSpan=document.createElement("span"),this.manipulationDOM.editModeSpan.className="network-manipulationUI edit editmode",this.manipulationDOM.editModeLabelSpan=document.createElement("span"),this.manipulationDOM.editModeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editModeLabelSpan.innerHTML=t.edit,this.manipulationDOM.editModeSpan.appendChild(this.manipulationDOM.editModeLabelSpan),this.editModeDiv.appendChild(this.manipulationDOM.editModeSpan),this.manipulationDOM.editModeSpan.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.addDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.edgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleDragEnd=this._handleDragEnd,this._handleTouch=this._handleConnect,this._manipulationReleaseOverload=function(){},this._handleDragStart=function(){},this._handleDragEnd=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.editEdgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._manipulationReleaseOverload=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);if(null!=e)if(e.clusterSize>1)alert(this.constants.locales[this.constants.locale].createEdgeError);else{this._selectObject(e,!1);var i=this.sectors.support.nodes;i.targetNode=new o({id:"targetNode"},{},{},this.constants);var s=i.targetNode;s.x=e.x,s.y=e.y,this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:s.id},this,this.constants);var r=this.edges.connectionEdge;r.from=e,r.connected=!0,r.options.smoothCurves={enabled:!0,dynamic:!1,type:"continuous",roundness:.5},r.selected=!0,r.to=s,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center),i=this.edges.connectionEdge;i.to.x=this._XconvertDOMtoCanvas(e.x),i.to.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()}}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){var e=this._getPointer(t.gesture.center);this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var i=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var s=this._getNodeAt(e);null!=s&&(s.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(i,s.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}}; -if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(45));e._cleanNavigation=function(){if(0!=this.navigationHammers.existing.length){for(var t=0;t0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,o.edges.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._setLevelDirected=function(t,e,i){this.nodes[i].hierarchyEnumerated=!0;for(var s=0;s1&&o.hierarchyEnumerated===!1&&this._setLevelDirected(o.level,o.edges,o.id)}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t){function e(t){throw new Error("Cannot find module '"+t+"'.")}e.keys=function(){return[]},e.resolve=e,t.exports=e,e.id=67},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,m=4/3,f=this.constants.physics.repulsion.nodeDistance,g=f;for(d=0;di&&(r=.5*g>i?1:v*i+m,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pe;e++){var s=arguments[e];for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":Array.isArray(t)?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left+window.pageXOffset},exports.getAbsoluteTop=function(t){return t.getBoundingClientRect().top+window.pageYOffset},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t)){if(exports.isValidRGB(t)){var i=t.substr(4).substr(0,t.length-5).split(",");t=exports.RGBToHex(i[0],i[1],i[2])}if(exports.isValidHex(t)){var s=exports.hexToHSV(t),o={h:s.h,s:.45*s.s,v:Math.min(1,1.05*s.v)},n={h:s.h,s:Math.min(1,1.25*s.v),v:.6*s.v},r=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(o.h,o.s,o.v);e={background:t,border:r,highlight:{background:a,border:r},hover:{background:a,border:r}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),o=exports.GiveDec(t.substring(3,4)),n=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+o,i=16*n+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),o=exports.GiveHex(t%16),n=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+o+n+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),o=Math.max(t,Math.max(e,i));if(s==o)return{h:0,s:0,v:s};var n=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-n/(o-s))/360,h=(o-s)/o,d=o;return{h:a,s:h,v:d}};var cssUtil={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),s=i[0].trim(),o=i[1].trim();e[s]=o}}),e},join:function(t){return Object.keys(t).map(function(e){return e+": "+t[e]}).join("; ")}};exports.addCssText=function(t,e){var i=cssUtil.split(t.style.cssText),s=cssUtil.split(e),o=exports.extend(i,s);t.style.cssText=cssUtil.join(o)},exports.removeCssText=function(t,e){var i=cssUtil.split(t.style.cssText),s=cssUtil.split(e);for(var o in s)s.hasOwnProperty(o)&&delete i[o];t.style.cssText=cssUtil.join(i)},exports.HSVToRGB=function(t,e,i){var s,o,n,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,o=l,n=h;break;case 1:s=d,o=i,n=h;break;case 2:s=h,o=i,n=l;break;case 3:s=h,o=d,n=i;break;case 4:s=l,o=h,n=i;break;case 5:s=i,o=h,n=d}return{r:Math.floor(255*s),g:Math.floor(255*o),b:Math.floor(255*n)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;s=r&&o>n;){var h=Math.floor((r+a)/2),d=t[h],l=void 0===s?d[i]:d[i][s],c=e(l);if(0==c)return h;-1==c?r=h+1:a=h-1,n++}return-1},exports.binarySearchValue=function(t,e,i,s){for(var o,n,r,a,h=1e4,d=0,l=0,c=t.length-1;c>=l&&h>d;){if(a=Math.floor(.5*(c+l)),o=t[Math.max(0,a-1)][i],n=t[a][i],r=t[Math.min(t.length-1,a+1)][i],n==e)return a;if(e>o&&n>e)return"before"==s?Math.max(0,a-1):a;if(e>n&&r>e)return"before"==s?a:Math.min(t.length-1,a+1);e>n?l=a+1:c=a-1,d++}return-1},exports.easeInOutQuad=function(t,e,i,s){var o=i-e;return t/=s/2,1>t?o/2*t*t+e:(t--,-o/2*(t*(t-2)-1)+e)},exports.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return.5>t?2*t*t:-1+(4-2*t)*t},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return.5>t?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return.5>t?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return.5>t?16*t*t*t*t*t:1+16*--t*t*t*t*t}}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i,s){var o;return e.hasOwnProperty(t)?e[t].redundant.length>0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElement(t),void 0!==s?i.insertBefore(o,s):i.appendChild(o)):(o=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==s?i.insertBefore(o,s):i.appendChild(o)),e[t].used.push(o),o},e.drawPoint=function(t,i,s,o,n){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",o,n),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size)):(r=e.getSVGElement("rect",o,n),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size)),void 0!==s.options.drawPoints.styles&&r.setAttributeNS(null,"style",s.group.options.drawPoints.styles),r.setAttributeNS(null,"class",s.className+" point"),r},e.drawBar=function(t,i,s,o,n,r,a){if(0!=o){0>o&&(o*=-1,i-=o);var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",o),h.setAttributeNS(null,"class",n)}}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||o.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t),this.setOptions(e)}var o=i(1),n=i(5);s.prototype.setOptions=function(t){t&&void 0!==t.queue&&(t.queue===!1?this._queue&&(this._queue.destroy(),delete this._queue):(this._queue||(this._queue=n.extend(this,{replace:["add","update","remove"]})),"object"==typeof t.queue&&this._queue.setOptions(t.queue)))},s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var o=0;or;r++)i=n._addItem(t[r]),s.push(i);else if(o.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},p=0,u=h.length;u>p;p++){var m=h[p];c[m]=t.getValue(d,p)}i=n._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],n=[],r=this,a=r._fieldId,h=function(t){var e=t[a];r._data[e]?(e=r._updateItem(t),s.push(e),n.push(t)):(e=r._addItem(t),i.push(e))};if(Array.isArray(t))for(var d=0,l=t.length;l>d;d++)h(t[d]);else if(o.isDataTable(t))for(var c=this._getColumnNames(t),p=0,u=t.getNumberOfRows();u>p;p++){for(var m={},f=0,g=c.length;g>f;f++){var v=c[f];m[v]=t.getValue(p,f)}h(m)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");h(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s,data:n},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,n=this,r=o.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){var h=["DataTable","Array","Object"];if(a=-1==h.indexOf(i.returnType)?"Array":i.returnType,s&&a!=o.getType(s))throw new Error('Type of parameter "data" ('+o.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!o.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==o.getType(s)?"DataTable":"Array";var d,l,c,p,u=i&&i.type||this._options.type,m=i&&i.filter,f=[];if(void 0!=t)d=n._getItem(t,u),m&&!m(d)&&(d=null);else if(void 0!=e)for(c=0,p=e.length;p>c;c++)d=n._getItem(e[c],u),(!m||m(d))&&f.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=n._getItem(l,u),(!m||m(d))&&f.push(d));if(i&&i.order&&void 0==t&&this._sort(f,i.order),i&&i.fields){var g=i.fields;if(void 0!=t)d=this._filterFields(d,g);else for(c=0,p=f.length;p>c;c++)f[c]=this._filterFields(f[c],g)}if("DataTable"==a){var v=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,v,d);else for(c=0;cc;c++)s.push(f[c]);return s}return f},s.prototype.getIds=function(t){var e,i,s,o,n,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){n=[];for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&n.push(o));for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=this._getItem(s,d),a(o)&&l.push(o[this._fieldId]));else if(h){n=[];for(s in r)r.hasOwnProperty(s)&&n.push(r[s]);for(this._sort(n,h),e=0,i=n.length;i>e;e++)l[e]=n[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(o=r[s],l.push(o[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,o=e&&e.filter,n=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,n),(!o||o(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,o=e&&e.type||this._options.type,n=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,o),(!s||s(i))&&n.push(t(i,a)));return e&&e.order&&this._sort(n,e.order),n},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(o.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],o=e[i];return s>o?1:o>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,o,n=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)o=this._remove(t[i]),null!=o&&n.push(o);else o=this._remove(t),null!=o&&n.push(o);return n.length&&this._trigger("remove",{items:n},e),n},s.prototype._remove=function(t){if(o.isNumber(t)||o.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||r>s)&&(i=n,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],r=n[t];null!=r&&(!i||s>r)&&(i=n,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),o=0,n=e.length;n>o;o++){var r=e[o];t.setValue(s,o,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var o=i(1),n=i(3);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var o in this._ids)this._ids.hasOwnProperty(o)&&e.push(o);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)o=e[i],this._ids[o]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,n=o.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=o.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,o,n,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r&&(this._ids[n]=!0,d.push(n));break;case"update":for(s=0,o=a.length;o>s;s++)n=a[s],r=this.get(n),r?this._ids[n]?l.push(n):(this._ids[n]=!0,d.push(n)):this._ids[n]&&(delete this._ids[n],c.push(n));break;case"remove":for(s=0,o=a.length;o>s;s++)n=a[s],this._ids[n]&&(delete this._ids[n],c.push(n))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=n.prototype.on,s.prototype.off=n.prototype.off,s.prototype._trigger=n.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t){function e(t){this.delay=null,this.max=1/0,this._queue=[],this._timeout=null,this._extended=null,this.setOptions(t)}e.prototype.setOptions=function(t){t&&"undefined"!=typeof t.delay&&(this.delay=t.delay),t&&"undefined"!=typeof t.max&&(this.max=t.max),this._flushIfNeeded()},e.extend=function(t,i){var s=new e(i);if(void 0!==t.flush)throw new Error("Target object already has a property flush");t.flush=function(){s.flush()};var o=[{name:"flush",original:void 0}];if(i&&i.replace)for(var n=0;nthis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},e.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=e},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z";var o=function(t){return t};this.xValueLabel=o,this.yValueLabel=o,this.zValueLabel=o,this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new p,this.eye=new l(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}function o(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function n(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(56),a=i(3),h=i(4),d=i(1),l=i(10),c=i(9),p=i(7),u=i(8),m=i(11),f=i(12);r(s.prototype),s.prototype._setScale=function(){this.scale=new l(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var m=(t-p)/(u-p),g=240*m,v=this._hsv2rgb(g,1,1);c.strokeStyle=v,c.beginPath(),c.moveTo(h,r+t),c.lineTo(a,r+t),c.stroke()}c.strokeStyle=this.colorAxis,c.strokeRect(h,r,i,n)}if(this.style===s.STYLE.DOTSIZE&&(c.strokeStyle=this.colorAxis,c.fillStyle=this.colorDot,c.beginPath(),c.moveTo(h,r),c.lineTo(a,r),c.lineTo(a-i+e,d),c.lineTo(h,d),c.closePath(),c.fill(),c.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,b=new f(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,o=this._convert3Dto2D(new l(x,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+this.xValueLabel(i.getCurrent())+" ",o.x,o.y),i.next()}for(g.lineWidth=1,s=void 0===this.defaultYStep,i=new f(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,o=this._convert3Dto2D(new l(n,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top",o.y+=b):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(" "+this.yValueLabel(i.getCurrent())+" ",o.x,o.y),i.next();for(g.lineWidth=1,s=void 0===this.defaultZStep,i=new f(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new l(n,r,i.getCurrent())),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(t.x-b,t.y),g.stroke(),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(this.zValueLabel(i.getCurrent())+" ",t.x-5,t.y),i.next();g.lineWidth=1,t=this._convert3Dto2D(new l(n,r,this.zMin)),e=this._convert3Dto2D(new l(n,r,this.zMax)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),g.lineWidth=1,p=this._convert3Dto2D(new l(this.xMin,this.yMin,this.zMin)),u=this._convert3Dto2D(new l(this.xMax,this.yMin,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(u.x,u.y),g.stroke(),p=this._convert3Dto2D(new l(this.xMin,this.yMax,this.zMin)),u=this._convert3Dto2D(new l(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(p.x,p.y),g.lineTo(u.x,u.y),g.stroke(),g.lineWidth=1,t=this._convert3Dto2D(new l(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new l(this.xMin,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke(),t=this._convert3Dto2D(new l(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new l(this.xMax,this.yMax,this.zMin)),g.strokeStyle=this.colorAxis,g.beginPath(),g.moveTo(t.x,t.y),g.lineTo(e.x,e.y),g.stroke();var w=this.xLabel;w.length>0&&(c=.1/this.scale.y,n=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-c:this.yMax+c,o=this._convert3Dto2D(new l(n,r,this.zMin)),Math.cos(2*_)>0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)<0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(w,o.x,o.y));var S=this.yLabel;S.length>0&&(d=.1/this.scale.x,n=Math.sin(_)>0?this.xMin-d:this.xMax+d,r=(this.yMin+this.yMax)/2,o=this._convert3Dto2D(new l(n,r,this.zMin)),Math.cos(2*_)<0?(g.textAlign="center",g.textBaseline="top"):Math.sin(2*_)>0?(g.textAlign="right",g.textBaseline="middle"):(g.textAlign="left",g.textBaseline="middle"),g.fillStyle=this.colorAxis,g.fillText(S,o.x,o.y));var D=this.zLabel;D.length>0&&(h=30,n=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,o=this._convert3Dto2D(new l(n,r,a)),g.textAlign="right",g.textBaseline="middle",g.fillStyle=this.colorAxis,g.fillText(D,o.x-h,o.y))},s.prototype._hsv2rgb=function(t,e,i){var s,o,n,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,o=h,n=0;break;case 1:s=h,o=r,n=0;break;case 2:s=0,o=r,n=h;break;case 3:s=0,o=h,n=r;break;case 4:s=h,o=0,n=r;break;case 5:s=r,o=0,n=h;break;default:s=0,o=0,n=0}return"RGB("+parseInt(255*s)+","+parseInt(255*o)+","+parseInt(255*n)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,o,n,r,a,h,d,c,p,u,m,f=this.frame.canvas,g=f.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else r=!0;r?(m=(t.point.z+e.point.z+i.point.z+o.point.z)/4,c=240*(1-(m-this.zMin)*this.scale.z/this.verticalRatio),p=1,this.showShadow?(u=Math.min(1+S.x/D/2,1),a=this._hsv2rgb(c,p,u),h=a):(u=1,a=this._hsv2rgb(c,p,u),h=this.colorAxis)):(a="gray",h=this.colorAxis),d=.5,g.lineWidth=d,g.fillStyle=a,g.strokeStyle=h,g.beginPath(),g.moveTo(t.screen.x,t.screen.y),g.lineTo(e.screen.x,e.screen.y),g.lineTo(o.screen.x,o.screen.y),g.lineTo(i.screen.x,i.screen.y),g.closePath(),g.fill(),g.stroke()}}else for(n=0;np&&(p=0);var u,m,f;this.style===s.STYLE.DOTCOLOR?(u=240*(1-(d.point.value-this.valueMin)*this.scale.value),m=this._hsv2rgb(u,1,1),f=this._hsv2rgb(u,1,.8)):this.style===s.STYLE.DOTSIZE?(m=this.colorDot,f=this.colorDotBorder):(u=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),m=this._hsv2rgb(u,1,1),f=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=f,i.fillStyle=m,i.beginPath(),i.arc(d.screen.x,d.screen.y,p,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,o,n=this.frame.canvas,r=n.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=o(t),this.startMouseY=n(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},d.addEventListener(document,"mousemove",e.onmousemove),d.addEventListener(document,"mouseup",e.onmouseup),d.preventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(o(t))-this.startMouseX,i=parseFloat(n(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,r=this.startArmRotation.vertical+i/200,a=4,h=Math.sin(a/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],o=e[1],n=e[2],r=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x)),a=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),h=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,o=100,n=null,r=null,a=null,h=new c(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var d=n.surfaces;if(d)for(var l=d.length-1;l>=0;l--){var p=d[l],u=p.corners,m=[u[0].screen,u[1].screen,u[2].screen],f=[u[2].screen,u[3].screen,u[0].screen];if(this._insideTriangle(h,m)||this._insideTriangle(h,f))return n}}else for(i=0;ib)&&o>b&&(a=b,r=n)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var o=e.offsetWidth,n=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-o/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-o),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-n+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},t.exports=s},function(t,e,i){function s(){this.armLocation=new o,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new o,this.cameraRotation=new o(.5*Math.PI,0,0),this.calculateCameraOrientation()}var o=i(10);s.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},s.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},s.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},s.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},s.prototype.getArmLength=function(){return this.armLength},s.prototype.getCameraLocation=function(){return this.cameraLocation},s.prototype.getCameraRotation=function(){return this.cameraRotation},s.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=s},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var o=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index] +},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new o(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},s.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},s.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},s.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},s.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),o.preventDefault()},s.prototype._onMouseUp=function(){this.frame.style.cursor="auto",o.removeEventListener(document,"mousemove",this.onmousemove),o.removeEventListener(document,"mouseup",this.onmouseup),o.preventDefault()},t.exports=s},function(t){function e(t,e,i,s){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,s)}e.prototype.setRange=function(t,e,i,s){this._start=t?t:0,this._end=e?e:0,this.setStep(i,s)},e.prototype.setStep=function(t,i){void 0===t||0>=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),o=5*Math.pow(10,Math.round(e(t/5))),n=i;return Math.abs(s-t)<=Math.abs(n-t)&&(n=s),Math.abs(o-t)<=Math.abs(n-t)&&(n=o),0>=n&&(n=1),n},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(t,e,i){function s(t,e,i,r){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof n)&&i instanceof Object){var h=r;r=i,i=h}var u=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{snap:null,toScreen:u._toScreen.bind(u),toGlobalScreen:u._toGlobalScreen.bind(u),toTime:u._toTime.bind(u),toGlobalTime:u._toGlobalTime.bind(u)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,r&&this.setOptions(r),i&&this.setGroups(i),e?this.setItems(e):this.redraw()}var o=(i(56),i(45),i(1)),n=i(3),r=i(4),a=i(17),h=i(46),d=i(30),l=i(21),c=i(22),p=i(27);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){if(void 0==this.options.start||void 0==this.options.end)var s=this._getDataRange();var o=void 0!=this.options.start?this.options.start:s.start,a=void 0!=this.options.end?this.options.end:s.end;this.setWindow(o,a,{animate:!1})}else this.fit({animate:!1})},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],s=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),o=null,n=null;if(s.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===o||o>e)&&(o=e),(null===n||i>n)&&(n=i)}),null!==o&&null!==n){var r=(o+n)/2,a=Math.max(this.range.end-this.range.start,1.1*(n-o)),h=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(r-a/2,r+a/2,h)}}},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?o.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=o.convert(n.start,"Date").valueOf());var r=t.max("end");r&&(i=null==i?o.convert(r.end,"Date").valueOf():Math.max(i,o.convert(r.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},t.exports=s},function(t,e,i){function s(t,e,i,s){if(!(Array.isArray(i)||i instanceof n)&&i instanceof Object){var r=s;s=i,i=r}var h=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=o.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{snap:null,toScreen:h._toScreen.bind(h),toGlobalScreen:h._toGlobalScreen.bind(h),toTime:h._toTime.bind(h),toGlobalTime:h._toGlobalTime.bind(h)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.customTime=new c(this.body),this.components.push(this.customTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,s&&this.setOptions(s),i&&this.setGroups(i),e?this.setItems(e):this.redraw()}var o=(i(56),i(45),i(1)),n=i(3),r=i(4),a=i(17),h=i(46),d=i(30),l=i(21),c=i(22),p=i(29);s.prototype=new h,s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof n||t instanceof r?t:new n(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){var s=void 0!=this.options.start?this.options.start:null,o=void 0!=this.options.end?this.options.end:null;this.setWindow(s,o,{animate:!1})}else this.fit({animate:!1})},s.prototype.setGroups=function(t){var e;e=t?t instanceof n||t instanceof r?t:new n(t):null,this.groupsData=e,this.linegraph.setGroups(e)},s.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:"+t},s.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].visible&&(void 0===this.linegraph.options.groups.visibility[t]||1==this.linegraph.options.groups.visibility[t]):!1},s.prototype.getItemRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},t.exports=s},function(t,e,i){var s=i(44);e.convertHiddenOptions=function(t,e){if(t.hiddenDates=[],e&&1==Array.isArray(e)){for(var i=0;i=4*a){var p=0,u=n.clone();switch(i[h].repeat){case"daily":d.day()!=l.day()&&(p=1),d.dayOfYear(o.dayOfYear()),d.year(o.year()),d.subtract(7,"days"),l.dayOfYear(o.dayOfYear()),l.year(o.year()),l.subtract(7-p,"days"),u.add(1,"weeks");break;case"weekly":var m=l.diff(d,"days"),f=d.day();d.date(o.date()),d.month(o.month()),d.year(o.year()),l=d.clone(),d.day(f),l.day(f),l.add(m,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),u.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(p=1),d.month(o.month()),d.year(o.year()),d.subtract(1,"months"),l.month(o.month()),l.year(o.year()),l.subtract(1,"months"),l.add(p,"months"),u.add(1,"months");break;case"yearly":d.year()!=l.year()&&(p=1),d.year(o.year()),d.subtract(1,"years"),l.year(o.year()),l.subtract(1,"years"),l.add(p,"years"),u.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}for(;u>d;)switch(t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),i[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(t);var g=e.isHidden(t.range.start,t.hiddenDates),v=e.isHidden(t.range.end,t.hiddenDates),y=t.range.start,b=t.range.end;1==g.hidden&&(y=1==t.range.startToFront?g.startDate-1:g.endDate+1),1==v.hidden&&(b=1==t.range.endToFront?v.startDate-1:v.endDate+1),(1==g.hidden||1==v.hidden)&&t.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],s=0;s=e[s].start&&e[o].end<=e[s].end?e[o].remove=!0:e[o].start>=e[s].start&&e[o].start<=e[s].end?(e[s].end=e[o].end,e[o].remove=!0):e[o].end>=e[s].start&&e[o].end<=e[s].end&&(e[s].start=e[o].start,e[o].remove=!0));for(var s=0;s=r&&a>o){i=!0;break}}if(1==i&&o=e&&i>r&&(s+=r-n)}return s},e.correctTimeForHidden=function(t,i,o){return o=s(o).toDate().valueOf(),o-=e.getHiddenDurationBefore(t,i,o)},e.getHiddenDurationBefore=function(t,e,i){var o=0;i=s(i).toDate().valueOf();for(var n=0;n=e.start&&a=a&&(o+=a-r)}return o},e.getAccumulatedHiddenDuration=function(t,e,i){for(var s=0,o=0,n=e.start,r=0;r=e.start&&h=i)break;s+=h-a}}return s},e.snapAwayFromHidden=function(t,i,s,o){var n=e.isHidden(i,t);return 1==n.hidden?0>s?1==o?n.startDate-(n.endDate-i)-1:n.startDate-1:1==o?n.endDate+(i-n.startDate)+1:n.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=s&&o>t)return{hidden:!0,startDate:s,endDate:o}}return{hidden:!1,startDate:s,endDate:o}}},function(t){function e(t,e,i,s,o,n){this.current=0,this.autoScale=!0,this.stepIndex=0,this.step=1,this.scale=1,this.marginStart,this.marginEnd,this.deadSpace=0,this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.alignZeros=n,this.setRange(t,e,i,s,o)}e.prototype.setRange=function(t,e,i,s,o){this._start=void 0===o.min?t:o.min,this._end=void 0===o.max?e:o.max,this._start==this._end&&(this._start-=.75,this._end+=1),1==this.autoScale&&this.setMinimumStep(i,s),this.setFirst(o)},e.prototype.setMinimumStep=function(t,e){var i=this._end-this._start,s=1.2*i,o=t*(s/e),n=Math.round(Math.log(s)/Math.LN10),r=-1,a=Math.pow(10,n),h=0;0>n&&(h=n);for(var d=!1,l=h;Math.abs(l)<=Math.abs(n);l++){a=Math.pow(10,l);for(var c=0;c=o){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,1==this.alignZeros&&(this.marginEnd-this.marginStart)%this.step!=0&&(this.marginEnd+=this.marginEnd%this.step),this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(t){var e=""+Number(this.current).toPrecision(5);if(void 0===t||isNaN(Number(t))){if(-1!=e.indexOf(",")||-1!=e.indexOf("."))for(var i=e.length-1;i>0;i--){if("0"!=e[i]){if("."==e[i]||","==e[i]){e=e.slice(0,i);break}break}e=e.slice(0,i)}}else{var s="",o=e.indexOf("e");if(-1!=o&&(s=e.slice(o),e=e.slice(0,o)),o=Math.max(e.indexOf(","),e.indexOf(".")),-1===o?(0!==t&&(e+="."),o=e.length+t):0!==t&&(o+=t+1),o>e.length)for(var n=o-e.length;n>0;n--)e+="0";else e=e.slice(0,o);e+=s}return e},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=h().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add(-3,"days").valueOf(),this.end=i.clone().add(4,"days").valueOf(),this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.animateTimer=null,this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function o(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function n(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)}}var r=i(1),a=i(47),h=i(44),d=i(20),l=i(15);s.prototype=new d,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable","activate","hiddenDates"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e,i){var s=void 0!=t?r.convert(t,"Date").valueOf():null,o=void 0!=e?r.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),i){var n=this,a=this.start,h=this.end,d="number"==typeof i?i:500,c=(new Date).valueOf(),p=!1,u=function(){if(!n.props.touch.dragging){var t=(new Date).valueOf(),e=t-c,i=e>d,f=i||null===s?s:r.easeInOutQuad(e,a,s,d),g=i||null===o?o:r.easeInOutQuad(e,h,o,d);m=n._applyRange(f,g),l.updateHiddenDates(n.body,n.options.hiddenDates),p=p||m,m&&n.body.emitter.emit("rangechange",{start:new Date(n.start),end:new Date(n.end)}),i?p&&n.body.emitter.emit("rangechanged",{start:new Date(n.start),end:new Date(n.end)}):n.animateTimer=setTimeout(u,20)}};return u()}var m=this._applyRange(s,o);if(l.updateHiddenDates(this.body,this.options.hiddenDates),m){var f={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",f),this.body.emitter.emit("rangechanged",f)}},s.prototype._cancelAnimation=function(){this.animateTimer&&(clearTimeout(this.animateTimer),this.animateTimer=null)},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,o=null!=e?r.convert(e,"Date").valueOf():this.end,n=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(o)||null===o)throw new Error('Invalid end "'+e+'"');if(s>o&&(o=s),null!==a&&a>s&&(i=a-s,s+=i,o+=i,null!=n&&o>n&&(o=n)),null!==n&&o>n&&(i=o-n,s-=i,o-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>o-s&&(this.end-this.start===h?(s=this.start,o=this.end):(i=h-(o-s),s-=i/2,o+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),o-s>d&&(this.end-this.start===d?(s=this.start,o=this.end):(i=o-s-d,s+=i/2,o-=i/2))}var l=this.start!=s||this.end!=o;return s>=this.start&&s<=this.end||o>=this.start&&o<=this.end||this.start>=s&&this.start<=o||this.end>=s&&this.end<=o||this.body.emitter.emit("checkRangedItems"),this.start=s,this.end=o,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t,e){return s.conversion(this.start,this.end,t,e)},s.conversion=function(t,e,i,s){return void 0===s&&(s=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-s)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;o(e);var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY;i-=this.deltaDifference;var s=this.props.touch.end-this.props.touch.start,n=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);s-=n;var r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,a=-i/r*s,h=this.props.touch.start+a,d=this.props.touch.end+a,c=l.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0),p=l.snapAwayFromHidden(this.body.hiddenDates,d,this.previousDelta-i,!0);if(c!=h||p!=d)return this.deltaDifference+=i,this.props.touch.start=c,this.props.touch.end=p,void this._onDrag(t);this.previousDelta=i,this._applyRange(h,d),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),o=n(s.center,this.body.dom.center),r=this._pointerToDate(o);this.zoom(i,r,e)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=n(t.gesture.center,this.body.dom.center));var e=1/(t.gesture.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),s=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),o=l.getHiddenDurationBefore(this.body.hiddenDates,this,i),r=s-o,a=i-o+(this.start-(i-o))*e,h=i+r+(this.end-(i+r))*e;this.startToFront=1-e>0?!1:!0,this.endToFront=e-1>0?!1:!0;var d=l.snapAwayFromHidden(this.body.hiddenDates,a,1-e,!0),c=l.snapAwayFromHidden(this.body.hiddenDates,h,e-1,!0);(d!=a||c!=h)&&(this.props.touch.start=d,this.props.touch.end=c,this.scaleOffset=1-t.gesture.scale,a=d,h=c),this.setRange(a,h),this.startToFront=!1,this.endToFront=!0}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(o(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var s=this.body.domProps.center.height;return e=this.conversion(s),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e,i){null==e&&(e=(this.start+this.end)/2);var s=l.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),o=l.getHiddenDurationBefore(this.body.hiddenDates,this,e),n=s-o,r=e-o+(this.start-(e-o))*t,a=e+n+(this.end-(e+n))*t;this.startToFront=i>0?!1:!0,this.endToFront=-i>0?!1:!0;var h=l.snapAwayFromHidden(this.body.hiddenDates,r,i,!0),d=l.snapAwayFromHidden(this.body.hiddenDates,a,-i,!0);(h!=r||d!=a)&&(r=h,a=d),this.setRange(r,a),this.startToFront=!1,this.endToFront=!0},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,o=this.end-i;this.setRange(s,o)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var o,n;if(s)for(o=0,n=t.length;n>o;o++)t[o].top=null;for(o=0,n=t.length;n>o;o++){var r=t[o];if(r.stack&&null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&l.stack&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e,i){var s,o,n;for(s=0,o=t.length;o>s;s++)if(void 0!==t[s].data.subgroup){n=e.axis;for(var r in i)i.hasOwnProperty(r)&&1==i[r].visible&&i[r].indexe.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i,o){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,this.hiddenDates=o,void 0===o&&(this.hiddenDates=[])}var o=i(44),n=i(15);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step); +break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*o>t&&(this.scale=s.SCALE.DAY,this.step=5),2*o>t&&(this.scale=s.SCALE.DAY,this.step=2),o>t&&(this.scale=s.SCALE.DAY,this.step=1),o/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=s.SCALE.HOUR,this.step=4),n>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var o=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/o)*o)}return e},s.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.switchedYear=!1,this.scale){case s.SCALE.YEAR:case s.SCALE.MONTH:case s.SCALE.WEEKDAY:case s.SCALE.DAY:case s.SCALE.HOUR:case s.SCALE.MINUTE:case s.SCALE.SECOND:case s.SCALE.MILLISECOND:return!0;default:return!1}else if(1==this.switchedMonth)switch(this.switchedMonth=!1,this.scale){case s.SCALE.WEEKDAY:case s.SCALE.DAY:case s.SCALE.HOUR:case s.SCALE.MINUTE:case s.SCALE.SECOND:case s.SCALE.MILLISECOND:return!0;default:return!1}else if(1==this.switchedDay)switch(this.switchedDay=!1,this.scale){case s.SCALE.MILLISECOND:case s.SCALE.SECOND:case s.SCALE.MINUTE:case s.SCALE.HOUR:return!0;default:return!1}switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("SSS");case s.SCALE.SECOND:return o(t).format("s");case s.SCALE.MINUTE:return o(t).format("HH:mm");case s.SCALE.HOUR:return o(t).format("HH:mm");case s.SCALE.WEEKDAY:return o(t).format("ddd D");case s.SCALE.DAY:return o(t).format("D");case s.SCALE.MONTH:return o(t).format("MMM");case s.SCALE.YEAR:return o(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return o(t).format("HH:mm:ss");case s.SCALE.SECOND:return o(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return o(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return o(t).format("MMMM YYYY");case s.SCALE.MONTH:return o(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=o.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var o=i(1),n=i(20),r=i(44),a=i(48);s.prototype=new n,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),s=this.options.locales[this.options.locale],o=s.current+" "+s.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");o=o.charAt(0).toUpperCase()+o.substring(1),this.bar.style.left=i+"px",this.bar.title=o}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},s.prototype.setCurrentTime=function(t){var e=o.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},s.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1,locales:h,locale:"en"},this.options=n.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(20),a=i(44),h=i(48);s.prototype=new r,s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCustomTime","locale","locales"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=o(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale],s=i.time+": "+a(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss");s=s.charAt(0).toUpperCase()+s.substring(1),this.bar.style.left=e+"px",this.bar.title=s}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=n.convert(t,"Date"),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i,s){this.id=o.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}},title:{left:{text:void 0},right:{text:void 0}},format:{left:{decimals:void 0},right:{decimals:void 0}}},this.linegraphOptions=s,this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{},title:{}},this.dom={},this.range={start:0,end:0},this.options=o.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.zeroCrossing=-1,this.lineOffset=0,this.master=!0,this.svgElements={},this.iconsRemoved=!1,this.groups={},this.amountOfGroups=0,this._create();var n=this;this.body.emitter.on("verticalDrag",function(){n.dom.lineContainer.style.top=n.body.domProps.scrollTop+"px"})}var o=i(1),n=i(2),r=i(20),a=i(16);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","customRange","title","format","alignZeros"];o.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.dom.lineContainer.style.position="relative",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){n.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,o=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&(1!=this.groups[r].visible||void 0!==this.linegraphOptions.visibility[r]&&1!=this.linegraphOptions.visibility[r]||(this.groups[r].drawIcon(t,o,this.svgElements,this.svg,e,i),o+=i+s));n.cleanupElements(this.svgElements),this.iconsRemoved=!1},s.prototype._cleanupIcons=function(){0==this.iconsRemoved&&(n.prepareElements(this.svgElements),n.cleanupElements(this.svgElements),this.iconsRemoved=!0)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){0==this.master&&1==this.options.alignZeros&&-1!=this.zeroCrossing&&t>0&&(t=0),this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1,e=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+"px";for(var i in this.groups)this.groups.hasOwnProperty(i)&&(1!=this.groups[i].visible||void 0!==this.linegraphOptions.visibility[i]&&1!=this.linegraphOptions.visibility[i]||e++);if(0==this.amountOfGroups||0==e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var s=this.props,o=this.dom.frame;o.className="dataaxis",this._calculateCharSize();var n=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=a?s.majorCharHeight:0,s.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,s.minorLineHeight=1,s.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,s.majorLineHeight=1,"left"==n?(o.style.top="0",o.style.left="0",o.style.bottom="",o.style.width=this.width+"px",o.style.height=this.height+"px"):(o.style.top="",o.style.bottom="0",o.style.left="0",o.style.width=this.width+"px",o.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(n)}return t},s.prototype._redrawLabels=function(){n.prepareElements(this.DOMelements.lines),n.prepareElements(this.DOMelements.labels);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation],0==this.master&&this.options.alignZeros);this.step=i;var s=(this.dom.frame.offsetHeight-i.deadSpace*(this.dom.frame.offsetHeight/i.marginRange))/((i.marginRange-i.deadSpace)/i.step);this.stepPixels=s;var o=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.dom.frame.offsetHeight/s-o);for(var h=0;.5*r>h;h++)i.previous();if(o=this.height/s,-1!=this.zeroCrossing&&1==this.options.alignZeros){var d=i.marginEnd/i.step-this.zeroCrossing;if(d>0)for(var h=0;d>h;h++)i.next();else if(0>d)for(var h=0;-d>h;h++)i.previous()}}else o+=.25;this.valueAtZero=i.marginEnd;var l,c=0,p=1;void 0!==this.options.format[t]&&(l=this.options.format[t].decimals),this.maxLabelSize=0;for(var u=0;p=0&&this._redrawLabel(u-2,i.getCurrent(l),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(u,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(u,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),1==this.master&&0==i.current&&(this.zeroCrossing=p),p++}this.conversionFactor=0==this.master?u/(this.valueAtZero-i.current):this.dom.frame.offsetHeight/i.marginRange;var f=0;void 0!==this.options.title[t]&&void 0!==this.options.title[t].text&&(f=this.props.titleCharHeight);var g=1==this.options.icons?Math.max(this.options.iconWidth,f)+this.options.labelOffsetX+15:f+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-g&&1==this.options.visible?(this.width=this.maxLabelSize+g,this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+g),this.options.width=this.width+"px",n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),this.redraw(),!0):(n.cleanupElements(this.DOMelements.lines),n.cleanupElements(this.DOMelements.labels),!1)},s.prototype.convertValue=function(t){var e=this.valueAtZero-t,i=e*this.conversionFactor;return i},s.prototype._redrawLabel=function(t,e,i,s,o){var r=n.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*o+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSized;d++){var c=this.visibleItems[d];c.repositionY(e)}return s},s.prototype._calculateHeight=function(t){var e,i=this.visibleItems;this.resetSubgroups();var s=this;if(i.length){var n=i[0].top,r=i[0].top+i[0].height;if(o.forEach(i,function(t){n=Math.min(n,t.top),r=Math.max(r,t.top+t.height),void 0!==t.data.subgroup&&(s.subgroups[t.data.subgroup].height=Math.max(s.subgroups[t.data.subgroup].height,t.height),s.subgroups[t.data.subgroup].visible=!0)}),n>t.axis){var a=n-t.axis;r-=a,o.forEach(i,function(t){t.top-=a})}e=r+t.item.vertical/2}else e=t.axis+t.item.vertical;return e=Math.max(e,this.props.label.height)},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),void 0!==t.data.subgroup&&(void 0===this.subgroups[t.data.subgroup]&&(this.subgroups[t.data.subgroup]={height:0,visible:!1,index:this.subgroupIndex,items:[]},this.subgroupIndex++),this.subgroups[t.data.subgroup].items.push(t)),this.orderSubgroups(),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t=[];if("string"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push({subgroup:e,sortField:this.subgroups[e].items[0].data[this.subgroupOrderer]});t.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push(this.subgroups[e].items[0].data);t.sort(this.subgroupOrderer)}if(t.length>0)for(var i=0;it?-1:l>=t?0:1};if(e.length>0)for(n=0;nl}),1==this.checkRangedItems)for(this.checkRangedItems=!1,n=0;nl})}for(n=0;n=0&&(n=e[r],!o(n));r--)void 0===s[n.id]&&(s[n.id]=!0,i.push(n));for(r=t+1;rs;s++){var n=this.visibleItems[s];n.repositionY(e)}return i},s.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={type:null,orientation:"bottom",align:"auto",stack:!0,groupOrder:null,selectable:!0,editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},onMoving:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5},this.options=n.extend({},this.defaultOptions),this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.stackDirty=!0,this.touchParams={},this._create(),this.setOptions(e)}var o=i(45),n=i(1),r=i(3),a=i(4),h=i(20),d=i(25),l=i(26),c=i(33),p=i(34),u=i(35),m=i(32),f="__ungrouped__",g="__background__";s.prototype=new h,s.types={background:m,box:c,range:u,point:p},s.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var n=document.createElement("div");n.className="labelset",this.dom.labelSet=n,this._updateUngrouped();var r=new l(g,null,this);r.show(),this.groups[g]=r,this.hammer=o(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},s.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder","dataAttributes","template","hide"];n.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"==typeof t.margin&&(n.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"==typeof t.margin.item&&n.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&n.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove","onMoving"].forEach(i),this.markDirty()}},s.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},s.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},s.prototype.setSelection=function(t){var e,i,s,o;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;i>e;e++)s=this.selection[e],o=this.items[s],o&&o.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],o=this.items[s],o&&(this.selection.push(s),o.select())},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),s=[];for(var o in this.groups)if(this.groups.hasOwnProperty(o))for(var n=this.groups[o],r=n.visibleItems,a=0;ae&&s.push(h.id)}return s},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=n.option.asSize,s=this.options,o=s.orientation,r=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,a.className="itemset"+(h?" editable":""),r=this._orderGroups()||r;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,p=this._firstGroup(),u={item:t.item,axis:t.axis},m={item:t.item,axis:t.item.vertical/2},f=0,v=t.axis+t.item.vertical;return this.groups[g].redraw(e,m,c),n.forEach(this.groups,function(t){var i=t==p?u:m,s=t.redraw(e,i,c);r=s||r,f+=t.height}),f=Math.max(f,v),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==o?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",r=this._isResized()||r},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[f];return i||null},s.prototype._updateUngrouped=function(){{var t,e,i=this.groups[f];this.groups[g]}if(this.groupsData){if(i){i.hide(),delete this.groups[f];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var s=this._getGroupId(t.data),o=this.groups[s];o&&o.add(t)||t.hide()}}}else if(!i){var n=null,r=null;i=new d(n,r,this),this.groups[f]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(n.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;n.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(n.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;n.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change",{queue:!0})},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},s.prototype._getGroupId=function(t){var e=this._getType(t);return"background"==e&&void 0==t.group?g:this.groupsData?t.group:f},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),o=e.items[t],n=e._getType(i),r=s.types[n];if(o&&(r&&o instanceof r?e._updateItem(o,i):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError("rangeoverflow"==n?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+n+'"');o=new r(i,e.conversion,e.options),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0})},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0}))},s.prototype._order=function(){n.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==f||t==g)throw new Error("Illegal group id. "+t+" is a reserved id.");var o=Object.create(e.options);n.extend(o,{height:null}),s=new d(t,i,e),e.groups[t]=s;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change",{queue:!0})},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change",{queue:!0})},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!n.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.setData(e),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:a})}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,o=s.itemFromTarget(t);if(o){var r=e.itemsData.get(o.id);this.options.onUpdate(r,function(t){t&&e.itemsData.getDataSet().update(t)})}else{var a=n.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData._fieldId]=n.randomUUID();var p=s.groupFromTarget(t);p&&(l.group=p.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.getDataSet().add(t)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var o=t.gesture.touches[0]&&t.gesture.touches[0].shiftKey||!1;if(o){e.push(i.id);var n=s._getItemRange(this.itemsData.get(e,this.itemOptions));e=[];for(var r in this.items)if(this.items.hasOwnProperty(r)){var a=this.items[r],h=a.data.start,d=void 0!==a.data.end?a.data.end:h;h>=n.min&&d<=n.max&&e.push(a.id)}}else{var l=e.indexOf(i.id);-1==l?e.push(i.id):e.splice(l,1)}this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()})}}},s._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i,s){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=o.extend({},this.defaultOptions),this.linegraphOptions=s,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var o=i(1),n=i(2),r=i(20);s.prototype=new r,s.prototype.clear=function(){this.groups={},this.amountOfGroups=0},s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.svg.style.height="100%",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];o.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){var t=0;for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||t++);if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{if(this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position)this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom="";else{var i=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+i+Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""}0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var s="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(1!=this.groups[e].visible||void 0!==this.linegraphOptions.visibility[e]&&1!=this.linegraphOptions.visibility[e]||(s+=this.groups[e].content+"
"));this.dom.textArea.innerHTML=s,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){n.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,o=.75*this.options.iconSize,r=e+.5*o+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(1!=this.groups[a].visible||void 0!==this.linegraphOptions.visibility[a]&&1!=this.linegraphOptions.visibility[a]||(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,o),r+=o+this.options.iconSpacing));n.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=o.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,handleOverlap:"overlap",align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,alignZeros:!0,customRange:{left:{min:void 0,max:void 0},right:{min:void 0,max:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=o.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.autoSizeSVG=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=o.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.body.emitter.emit("change")}var o=i(1),n=i(2),r=i(3),a=i(4),h=i(20),d=i(23),l=i(24),c=i(28),p=i(52),u="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new c(this.body,this.options.legend,"right",this.options.groups),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height&&void 0!==this.body.domProps.centerContainer.height?this.autoSizeSVG=!0:void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),c={}; +for(this._getRelevantData(a,c,d,l),this._applySampling(a,c),e=0;e0)for(r=0;rs){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var s=0;s0){var n=1,r=o.length,a=this.body.util.toGlobalScreen(o[o.length-1].x)-this.body.util.toGlobalScreen(o[0].x),h=r/a;n=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=n)d.push(o[l]);e[t[s]]=d}}},s.prototype._getYRanges=function(t,e,i){var s,o,n,r,a=[],h=[];if(t.length>0){for(n=0;n0&&(o=this.groups[t[n]],"stack"==r.barChart.handleOverlap&&"bar"==r.style?"left"==r.yAxisOrientation?a=a.concat(o.getYRange(s)):h=h.concat(o.getYRange(s)):i[t[n]]=o.getYRange(s,t[n]));p.getStackedBarYRange(a,i,t,"__barchartLeft","left"),p.getStackedBarYRange(h,i,t,"__barchartRight","right")}},s.prototype._updateYAxis=function(t,e){var i,s,o=!1,n=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var c=0;ci?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l));1==n&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return o=this._toggleAxisVisiblity(n,this.yAxisLeft)||o,o=this._toggleAxisVisiblity(r,this.yAxisRight)||o,1==r&&1==n?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!n,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,o=this.yAxisLeft.redraw()||o,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,this.yAxisRight.zeroCrossing=this.yAxisLeft.zeroCrossing,o=this.yAxisRight.redraw()||o):o=this.yAxisRight.redraw()||o,-1!=t.indexOf("__barchartLeft")&&t.splice(t.indexOf("__barchartLeft"),1),-1!=t.indexOf("__barchartRight")&&t.splice(t.indexOf("__barchartRight"),1),o},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._convertXcoordinates=function(t){for(var e,i,s=[],o=this.body.util.toScreen,n=0;nc;){c++;var p=h.getCurrent(),u=this.body.util.toScreen(p),m=h.isMajor();this.options.showMinorLabels&&this._repaintMinorText(u,h.getLabelMinor(),t),m&&this.options.showMajorLabels?(u>0&&(void 0==l&&(l=u),this._repaintMajorText(u,h.getLabelMajor(),t)),this._repaintMajorLine(u,t)):this._repaintMinorLine(u,t),h.next()}if(this.options.showMajorLabels){var f=this.body.util.toTime(0),g=h.getLabelMajor(f),v=g.length*(this.props.majorCharWidth||10)+10;(void 0==l||l>v)&&this._repaintMajorText(0,g,t)}o.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var o=document.createTextNode("");s=document.createElement("div"),s.appendChild(o),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var o=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(o),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text major measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var o=i(45),n=i(1);s.prototype.stack=!0,s.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setData=function(t){this.data=t,this.dirty=!0,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",o(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},s.prototype._updateContents=function(t){var e;if(this.options.template){var i=this.parent.itemSet.itemsData.get(this.id);e=this.options.template(i)}else e=this.data.content;if(e!==this.content){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},s.prototype._updateTitle=function(t){null!=this.data.title?t.title=this.data.title||"":t.removeAttribute("title")},s.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=Object.keys(this.data)}for(var i=0;it.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=0,this.dirty=!1}},s.prototype.show=r.prototype.show,s.prototype.hide=r.prototype.hide,s.prototype.repositionX=r.prototype.repositionX,s.prototype.repositionY=function(t){var e="top"===this.options.orientation;this.dom.content.style.top=e?"":"0",this.dom.content.style.bottom=e?"0":"";var i;if(void 0!==this.data.subgroup){var s=this.data.subgroup,o=this.parent.subgroups,r=o[s].index;if(1==e){i=this.parent.subgroups[s].height+t.item.vertical,i+=0==r?t.axis-.5*t.item.vertical:0;var a=this.parent.top;for(var h in o)o.hasOwnProperty(h)&&1==o[h].visible&&o[h].indexr&&(a+=o[h].height+t.item.vertical);i=this.parent.subgroups[s].height+t.item.vertical,this.dom.box.style.top=a+"px",this.dom.box.style.bottom=""}}else this.parent instanceof n?(i=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.top=e?"0":"",this.dom.box.style.bottom=e?"":"0"):(i=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=i+"px"},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);o.call(this,t,e,i)}{var o=i(31);i(1)}s.prototype=new o(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this,this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw item: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.box),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.dom.content.style.maxWidth="none",this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dom.content.style.maxWidth="",this.dirty=!1}this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e,i=this.parent.width,s=this.conversion.toScreen(this.data.start),o=this.conversion.toScreen(this.data.end);-i>s&&(s=-i),o>2*i&&(o=2*i);var n=Math.max(o-s,1);switch(this.overflow?(this.left=s,this.width=n+this.props.content.width,e=this.props.content.width):(this.left=s,this.width=n,e=Math.min(o-s-2*this.options.padding,this.props.content.width)),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=n+"px",this.options.align){case"left":this.dom.content.style.left="0";break;case"right":this.dom.content.style.left=Math.max(n-e-2*this.options.padding,0)+"px";break;case"center":this.dom.content.style.left=Math.max((n-e-2*this.options.padding)/2,0)+"px";break;default:t=this.overflow?o>0?Math.max(-s,0):-e:0>s?Math.min(-s,o-s-e-2*this.options.padding):0,this.dom.content.style.left=t+"px"}},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,o(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.defaultOptions={nodes:{mass:1,radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fontColor:"black",fontSize:14,fontFace:"verdana",fontFill:void 0,level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0,borderWidth:1,borderWidthSelected:void 0},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:"from"},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD",layout:"hubsize"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},maxVelocity:30,minVelocity:.1,stabilize:!0,stabilizationIterations:1e3,locale:"en",locales:_,tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,width:"100%",height:"100%",selectable:!0},this.constants=a.extend({},this.defaultOptions),this.pixelRatio=1,this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1,this.navigationHammers={existing:[],_new:[]},this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=null,this.lockedOnNodeOffset=null;var o=this;this.groups=new u,this.images=new m,this.images.setOnloadCallback(function(){o._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.startedStabilization=!1,this.stabilized=!1,this.stabilizationIterations=null,this.draggingNodes=!1,this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){o._addNodes(e.items),o.start()},update:function(t,e){o._updateNodes(e.items,e.data),o.start()},remove:function(t,e){o._removeNodes(e.items),o.start()}},this.edgesListeners={add:function(t,e){o._addEdges(e.items),o.start()},update:function(t,e){o._updateEdges(e.items),o.start()},remove:function(t,e){o._removeEdges(e.items),o.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.constants.stabilize&&this.zoomExtent(void 0,!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var o=i(56),n=i(45),r=i(57),a=i(1),h=i(47),d=i(3),l=i(4),c=i(42),p=i(43),u=i(38),m=i(39),f=i(40),g=i(37),v=i(41),y=i(54),b=i(55),_=i(49);i(50),o(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),ot.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(n+142.05338)+91444e-8:12.662/(n+7.4147)+.0964822:1==this.constants.clustering.enabled&&n>=this.constants.clustering.initialMaxNodes?77.5271985/(n+187.266146)+476710517e-13:30.5062972/(n+19.93597763)+.08413486;var r=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);s*=r}else{var a=1.1*Math.abs(o.maxX-o.minX),h=1.1*Math.abs(o.maxY-o.minY),d=this.frame.canvas.clientWidth/a,l=this.frame.canvas.clientHeight/h;s=l>=d?d:l}s>1&&(s=1);var c=this._findCenter(o);if(0==i){var p={position:c,scale:s,animation:t};this.moveTo(p),this.moving=!0,this.start()}else c.x*=s,c.y*=s,c.x-=.5*this.frame.canvas.clientWidth,c.y-=.5*this.frame.canvas.clientHeight,this._setScale(s),this._setTranslation(-c.x,-c.y)},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),this.initializing=!0,t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=c.DOTToGraph(t.dot);return void this.setData(i)}}else if(t&&t.gephi){if(t&&t.gephi){var s=p.parseGephi(t.gephi);return void this.setData(s)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);this._putDataInSector(),0==e&&(1==this.constants.hierarchicalLayout.enabled?(this._resetLevels(),this._setupHierarchicalLayout()):this.constants.stabilize&&this._stabilize(),this.start()),this.initializing=!1},s.prototype.setOptions=function(t){if(t){var e,i=["nodes","edges","smoothCurves","hierarchicalLayout","clustering","navigation","keyboard","dataManipulation","onAdd","onEdit","onEditEdge","onConnect","onDelete","clickToUse"];if(a.selectiveNotDeepExtend(i,this.constants,t),a.selectiveNotDeepExtend(["color"],this.constants.nodes,t.nodes),a.selectiveNotDeepExtend(["color","length"],this.constants.edges,t.edges),t.physics&&(a.mergeOptions(this.constants.physics,t.physics,"barnesHut"),a.mergeOptions(this.constants.physics,t.physics,"repulsion"),t.physics.hierarchicalRepulsion)){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e]) +}if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),a.mergeOptions(this.constants,t,"smoothCurves"),a.mergeOptions(this.constants,t,"hierarchicalLayout"),a.mergeOptions(this.constants,t,"clustering"),a.mergeOptions(this.constants,t,"navigation"),a.mergeOptions(this.constants,t,"keyboard"),a.mergeOptions(this.constants,t,"dataManipulation"),t.dataManipulation&&(this.editMode=this.constants.dataManipulation.initiallyVisible),t.edges&&(void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color))),t.nodes&&t.nodes.color){var s=a.parseColor(t.nodes.color);this.constants.nodes.color.background=s.background,this.constants.nodes.color.border=s.border,this.constants.nodes.color.highlight.background=s.highlight.background,this.constants.nodes.color.highlight.border=s.highlight.border,this.constants.nodes.color.hover.background=s.hover.background,this.constants.nodes.color.hover.border=s.hover.border}if(t.groups)for(var o in t.groups)if(t.groups.hasOwnProperty(o)){var n=t.groups[o];this.groups.add(o,n)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}if("clickToUse"in t&&(t.clickToUse?(this.activator=new b(this.frame),this.activator.on("change",this._createKeyBinds.bind(this))):this.activator&&(this.activator.destroy(),delete this.activator)),t.labels)throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.')}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.constants.width,this.constants.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext){var t=this.frame.canvas.getContext("2d");this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.frame.canvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}var i=this;this.drag={},this.pinch={},this.hammer=n(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",i._onTap.bind(i)),this.hammer.on("doubletap",i._onDoubleTap.bind(i)),this.hammer.on("hold",i._onHold.bind(i)),this.hammer.on("pinch",i._onPinch.bind(i)),this.hammer.on("touch",i._onTouch.bind(i)),this.hammer.on("dragstart",i._onDragStart.bind(i)),this.hammer.on("drag",i._onDrag.bind(i)),this.hammer.on("dragend",i._onDragEnd.bind(i)),this.hammer.on("mousewheel",i._onMouseWheel.bind(i)),this.hammer.on("DOMMouseScroll",i._onMouseWheel.bind(i)),this.hammer.on("mousemove",i._onMouseMoveTitle.bind(i)),this.hammerFrame=n(this.frame,{prevent_default:!0}),this.hammerFrame.on("release",i._onRelease.bind(i)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=r(),this.keycharm.reset(),this.constants.keyboard.enabled&&this.isActive()&&(this.keycharm.bind("up",this._moveUp.bind(t),"keydown"),this.keycharm.bind("up",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("down",this._moveDown.bind(t),"keydown"),this.keycharm.bind("down",this._yStopMoving.bind(t),"keyup"),this.keycharm.bind("left",this._moveLeft.bind(t),"keydown"),this.keycharm.bind("left",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("right",this._moveRight.bind(t),"keydown"),this.keycharm.bind("right",this._xStopMoving.bind(t),"keyup"),this.keycharm.bind("=",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("=",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num+",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("num+",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("num-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("num-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("-",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("-",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("[",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("[",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("]",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("]",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pageup",this._zoomIn.bind(t),"keydown"),this.keycharm.bind("pageup",this._stopZoom.bind(t),"keyup"),this.keycharm.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.keycharm.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.keycharm.bind("esc",this._createManipulatorBar.bind(t)),this.keycharm.bind("delete",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,this.draggingNodes=!1,null!=e&&1==this.constants.dragNodes){this.draggingNodes=!0,t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1),this.emit("dragStart",{nodeIds:this.getSelection().nodes});for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],o={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(o)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){this.releaseNode();var e=this._getPointer(t.gesture.center),i=this,s=this.drag,o=s.selection;if(o&&o.length&&1==this.constants.dragNodes){var n=e.x-s.pointer.x,r=e.y-s.pointer.y;o.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+n)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(t){this._handleDragEnd(t)},s.prototype._handleDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.length?(t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this.moving=!0,this.start()):this._redraw(),0==this.draggingNodes?this.emit("dragEnd",{nodeIds:[]}):this.emit("dragEnd",{nodeIds:this.getSelection().nodes})},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=null;void 0!==this.drag&&1==this.drag.dragging&&(s=this.DOMtoCanvas(this.drag.pointer));var o=this._getTranslation(),n=t/i,r=(1-n)*e.x+o.x*n,a=(1-n)*e.y+o.y*n;if(this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(r,a),this.updateClustersDefault(),null!=s){var h=this.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}return this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var o=h.fakeGesture(this,t),n=this._getPointer(o.center);this._zoom(i,n)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=h.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,o=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(o,this.constants.tooltip.delay)),1==this.constants.hover){for(var n in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(n)&&(this.hoverObj.edges[n].hover=!1,delete this.hoverObj.edges[n]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof f&&r.id!=a||r instanceof g||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var o=this.nodes;for(e in o)if(o.hasOwnProperty(e)){var n=o[e];if(void 0!==n.getTitle()&&n.isOverlappingWith(i)){this.popupObj=n;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new v(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){var i=!1,s=this.frame.canvas.width,o=this.frame.canvas.height;t!=this.constants.width||e!=this.constants.height||this.frame.style.width!=t||this.frame.style.height!=e?(this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,this.constants.width=t,this.constants.height=e,i=!0):(this.frame.canvas.width!=this.frame.canvas.clientWidth*this.pixelRatio&&(this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio,i=!0),this.frame.canvas.height!=this.frame.canvas.clientHeight*this.pixelRatio&&(this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio,i=!0)),1==i&&this.emit("resize",{width:this.frame.canvas.width*this.pixelRatio,height:this.frame.canvas.height*this.pixelRatio,oldWidth:s*this.pixelRatio,oldHeight:o*this.pixelRatio})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof d||t instanceof l)this.nodesData=t;else if(Array.isArray(t))this.nodesData=new d,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new d}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var o=this.nodesData.get(e),n=new f(o,this.images,this.groups,this.constants);if(this.nodes[e]=n,!(0!=n.xFixed&&0!=n.yFixed||null!==n.x&&null!==n.y)){var r=1*t.length+10,a=2*Math.PI*Math.random();0==n.xFixed&&(n.x=r*Math.cos(a)),0==n.yFixed&&(n.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t,e){for(var i=this.nodes,s=0,o=t.length;o>s;s++){var n=t[s],r=i[n],a=e[s];r?r.setProperties(a,this.constants):(r=new f(properties,this.images,this.groups,this.constants),i[n]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._updateValueRange(i)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var o=t[i];delete e[o]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof d||t instanceof l)this.edgesData=t;else if(Array.isArray(t))this.edgesData=new d,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new d}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=e[n];r&&r.disconnect();var a=i.get(n,{showInternalIds:!0});e[n]=new g(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),this._updateCalculationNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout())},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,o=t.length;o>s;s++){var n=t[s],r=i.get(n),a=e[n];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new g(r,this,this.constants),this.edges[n]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var o=t[i],n=e[o];n&&(null!=n.via&&delete this.sectors.support.nodes[n.via.id],n.disconnect(),delete e[o])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[],e[t].dynamicEdges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var o=t[e].getValue();void 0!==o&&(i=void 0===i?o:Math.min(o,i),s=void 0===s?o:Math.max(o,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.frame.canvas.width*this.pixelRatio,i=this.frame.canvas.height*this.pixelRatio;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth*this.pixelRatio),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight*this.pixelRatio)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var o in i)i.hasOwnProperty(o)&&(i[o].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[o].isSelected()?s.push(o):(i[o].inArea()||e)&&i[o].draw(t));for(var n=0,r=s.length;r>n;n++)(i[s[n]].inArea()||e)&&i[s[n]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStepLimited(e,this.constants.maxVelocity),s=!0);else for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStep(e),s=!0);if(1==s){var o=this.constants.minVelocity/Math.max(this.scale,.05);return o>.5*this.constants.maxVelocity?!0:this._isMoving(o)}return!1},s.prototype._physicsTick=function(){if(!this.freezeSimulation&&1==this.moving){var t=!1,e=!1;this._doInAllActiveSectors("_initializeForceCalculation");var i=this._doInAllActiveSectors("_discreteStepNodes");1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic&&(e=this._doInSupportSector("_discreteStepNodes"));for(var s=0;s0){var i=this,s={iterations:i.stabilizationIterations};i.stabilizationIterations=0,i.startedStabilization=!1,setTimeout(function(){i.emit("stabilized",s)},0)}},s.prototype._handleNavigation=function(){if(0!=this.xIncrement||0!=this.yIncrement){var t=this._getTranslation();this._setTranslation(t.x+this.xIncrement,t.y+this.yIncrement)}if(0!=this.zoomIncrement){var e={x:this.frame.canvas.clientWidth/2,y:this.frame.canvas.clientHeight/2};this._zoom(this.scale*(1+this.zoomIncrement),e)}},s.prototype.toggleFreeze=function(){0==this.freezeSimulation?this.freezeSimulation=!0:(this.freezeSimulation=!1,this.start())},s.prototype._configureSmoothCurves=function(t){if(void 0===t&&(t=!0),1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this._createBezierNodes();for(var e in this.sectors.support.nodes)this.sectors.support.nodes.hasOwnProperty(e)&&void 0===this.edges[this.sectors.support.nodes[e].parentEdgeId]&&delete this.sectors.support.nodes[e]}else{this.sectors.support.nodes={};for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.edges[i].via=null)}this._updateCalculationNodes(),t||(this.moving=!0,this.start())},s.prototype._createBezierNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic)for(var t in this.edges)if(this.edges.hasOwnProperty(t)){var e=this.edges[t];if(null==e.via){var i="edgeId:".concat(e.id);this.sectors.support.nodes[i]=new f({id:i,mass:1,shape:"circle",image:"",internalMultiplier:1},{},{},this.constants),e.via=this.sectors.support.nodes[i],e.via.parentEdgeId=e.id,e.positionBezierNode()}}},s.prototype._initializeMixinLoaders=function(){for(var t in y)y.hasOwnProperty(t)&&(s.prototype[t]=y[t])},s.prototype.storePosition=function(){console.log("storePosition is depricated: use .storePositions() from now on."),this.storePositions()},s.prototype.storePositions=function(){var t=[];for(var e in this.nodes)if(this.nodes.hasOwnProperty(e)){var i=this.nodes[e],s=!this.nodes.xFixed,o=!this.nodes.yFixed;(this.nodesData._data[e].x!=Math.round(i.x)||this.nodesData._data[e].y!=Math.round(i.y))&&t.push({id:e,x:Math.round(i.x),y:Math.round(i.y),allowedToMoveX:s,allowedToMoveY:o})}this.nodesData.update(t)},s.prototype.getPositions=function(t){var e={};if(void 0!==t){if(1==Array.isArray(t)){for(var i=0;i=1&&(this.easingTime=0,this._redraw=null!=this.lockedOnNodeId?this._lockedRedraw:this._classicRedraw,this.emit("animationFinished"))},s.prototype._classicRedraw=function(){},s.prototype.isActive=function(){return!this.activator||this.activator.active},s.prototype.setScale=function(){return this._setScale()},s.prototype.getScale=function(){return this._getScale()},s.prototype.getCenterCoordinates=function(){return this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight})},t.exports=s},function(t,e,i){function s(t,e,i){if(!e)throw"No network provided";var s=["edges","physics"],n=o.selectiveBridgeObject(s,i);this.options=n.edges,this.physics=n.physics,this.options.smoothCurves=i.smoothCurves,this.network=e,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.title=void 0,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.value=void 0,this.selected=!1,this.hover=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.dirtyLabel=!0,this.from=null,this.to=null,this.via=null,this.originalFromId=[],this.originalToId=[],this.connected=!1,this.widthFixed=!1,this.lengthFixed=!1,this.setProperties(t),this.controlNodesEnabled=!1,this.controlNodes={from:null,to:null,positions:{}},this.connectedNode=null}var o=i(1),n=i(40);s.prototype.setProperties=function(t){if(t){var e=["style","fontSize","fontFace","fontColor","fontFill","width","widthSelectionMultiplier","hoverWidth","arrowScaleFactor","dash","inheritColor"];switch(o.selectiveDeepExtend(e,this.options,t),void 0!==t.from&&(this.fromId=t.from),void 0!==t.to&&(this.toId=t.to),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.dirtyLabel=!0),void 0!==t.title&&(this.title=t.title),void 0!==t.value&&(this.value=t.value),void 0!==t.length&&(this.physics.springLength=t.length),void 0!==t.color&&(this.options.inheritColor=!1,o.isString(t.color)?(this.options.color.color=t.color,this.options.color.highlight=t.color):(void 0!==t.color.color&&(this.options.color.color=t.color.color),void 0!==t.color.highlight&&(this.options.color.highlight=t.color.highlight),void 0!==t.color.hover&&(this.options.color.hover=t.color.hover))),this.connect(),this.widthFixed=this.widthFixed||void 0!==t.width,this.lengthFixed=this.lengthFixed||void 0!==t.length,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier,this.options.style){case"line":this.draw=this._drawLine;break;case"arrow":this.draw=this._drawArrow;break;case"arrow-center":this.draw=this._drawArrowCenter;break;case"dash-line":this.draw=this._drawDashLine;break;default:this.draw=this._drawLine}}},s.prototype.connect=function(){this.disconnect(),this.from=this.network.nodes[this.fromId]||null,this.to=this.network.nodes[this.toId]||null,this.connected=this.from&&this.to,this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this))},s.prototype.disconnect=function(){this.from&&(this.from.detachEdge(this),this.from=null),this.to&&(this.to.detachEdge(this),this.to=null),this.connected=!1},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.getValue=function(){return this.value},s.prototype.setValueRange=function(t,e){if(!this.widthFixed&&void 0!==this.value){var i=(this.options.widthMax-this.options.widthMin)/(e-t);this.options.width=(this.value-t)*i+this.options.widthMin,this.widthSelected=this.options.width*this.options.widthSelectionMultiplier}},s.prototype.draw=function(){throw"Method draw not initialized in edge"},s.prototype.isOverlappingWith=function(t){if(this.connected){var e=10,i=this.from.x,s=this.from.y,o=this.to.x,n=this.to.y,r=t.left,a=t.top,h=this._getDistanceToEdge(i,s,o,n,r,a);return e>h}return!1},s.prototype._getColor=function(){var t=this.options.color;return"to"==this.options.inheritColor?t={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:this.to.options.color.border}:("from"==this.options.inheritColor||1==this.options.inheritColor)&&(t={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:this.from.options.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.options.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),o=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y)); +e={x:s,y:o}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,r,a=this.physics.springLength/4,h=this.from;h.width||h.resize(t),h.width>h.height?(n=h.x+h.width/2,r=h.y-a):(n=h.x+a,r=h.y-h.height/2),this._circle(t,n,r,a),e=this._pointOnCircle(n,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.max(Math.min(this.widthSelected,this.options.widthMax),.3*this.networkScaleInv):1==this.hover?Math.max(Math.min(this.options.hoverWidth,this.options.widthMax),.3*this.networkScaleInv):Math.max(this.options.width,.3*this.networkScaleInv)},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.options.smoothCurves.roundness,s=this.options.smoothCurves.type,o=Math.abs(this.from.x-this.to.x),n=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(t=i*n>o?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(e=i*o>n?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.from.xthis.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,e=this.to.yd;d++){var l=t.measureText(n[d]).width;h=l>h?l:h}var c=this.options.fontSize*r,p=i-h/2,u=s-c/2;this.labelDimensions={top:u,left:p,width:h,height:c,yLine:o}}void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(this.labelDimensions.left,this.labelDimensions.top,this.labelDimensions.width,this.labelDimensions.height)),t.fillStyle=this.options.fontColor||"black",t.textAlign="center",t.textBaseline="middle",o=this.labelDimensions.yLine;for(var d=0;r>d;d++)t.fillText(n[d],i,o),o+=a}},s.prototype._drawDashLine=function(t){t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth();var e=null;if(void 0!==t.mozDash||void 0!==t.setLineDash){var i=[0];i=void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?[this.options.dash.length,this.options.dash.gap]:[5,5],"undefined"!=typeof t.setLineDash?(t.setLineDash(i),t.lineDashOffset=0):(t.mozDash=i,t.mozDashOffset=0),e=this._line(t),"undefined"!=typeof t.setLineDash?(t.setLineDash([0]),t.lineDashOffset=0):(t.mozDash=[0],t.mozDashOffset=0)}else t.beginPath(),t.lineCap="round",void 0!==this.options.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]):void 0!==this.options.dash.length&&void 0!==this.options.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke();if(this.label){var s;if(1==this.options.smoothCurves.enabled&&null!=e){var o=.5*(.5*(this.from.x+e.x)+.5*(this.to.x+e.x)),n=.5*(.5*(this.from.y+e.y)+.5*(this.to.y+e.y));s={x:o,y:n}}else s=this._pointOnLine(.5);this._label(t,this.label,s.x,s.y)}},s.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},s.prototype._pointOnCircle=function(t,e,i,s){var o=2*(s-3/8)*Math.PI;return{x:t+i*Math.cos(o),y:e-i*Math.sin(o)}},s.prototype._drawArrowCenter=function(t){var e;if(t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth(),this.from!=this.to){var i=this._line(t),s=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),o=(10+5*this.options.width)*this.options.arrowScaleFactor;if(1==this.options.smoothCurves.enabled&&null!=i){var n=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),r=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:n,y:r}}else e=this._pointOnLine(.5);t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&this._label(t,this.label,e.x,e.y)}else{var a,h,d=.25*Math.max(100,this.physics.springLength),l=this.from;l.width||l.resize(t),l.width>l.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,o=(10+5*this.options.width)*this.options.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,o),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){t.strokeStyle=this._getColor(),t.fillStyle=t.strokeStyle,t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,o=this.to.x-this.from.x,n=this.to.y-this.from.y,r=Math.sqrt(o*o+n*n),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?s=this.via:1==this.options.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),o=this.to.x-s.x,n=this.to.y-s.y,r=Math.sqrt(o*o+n*n));var c,p,u=this.to.distanceToBorder(t,e),m=(r-u)/r;if(1==this.options.smoothCurves.enabled&&null!=s.x?(c=(1-m)*s.x+m*this.to.x,p=(1-m)*s.y+m*this.to.y):(c=(1-m)*this.from.x+m*this.to.x,p=(1-m)*this.from.y+m*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.options.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,p):t.lineTo(c,p),t.stroke(),i=(10+5*this.options.width)*this.options.arrowScaleFactor,t.arrow(c,p,e,i),t.fill(),t.stroke(),this.label){var f;if(1==this.options.smoothCurves.enabled&&null!=s){var g=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),v=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));f={x:g,y:v}}else f=this._pointOnLine(.5);this._label(t,this.label,f.x,f.y)}}else{var y,b,_,x=this.from,w=.25*Math.max(100,this.physics.springLength);x.width||x.resize(t),x.width>x.height?(y=x.x+.5*x.width,b=x.y-w,_={x:y,y:x.y,angle:.9*Math.PI}):(y=x.x+w,b=x.y-.5*x.height,_={x:x.x,y:b,angle:.6*Math.PI}),t.beginPath(),t.arc(y,b,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.options.width)*this.options.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(f=this._pointOnCircle(y,b,w,.5),this._label(t,this.label,f.x,f.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,o,n){var r=0;if(this.from!=this.to)if(1==this.options.smoothCurves.enabled){var a,h;if(1==this.options.smoothCurves.enabled&&1==this.options.smoothCurves.dynamic)a=this.via.x,h=this.via.y;else{var d=this._getViaCoordinates();a=d.x,h=d.y}var l,c,p,u,m,f,g,v=1e9;for(c=0;10>c;c++)p=.1*c,u=Math.pow(1-p,2)*t+2*p*(1-p)*a+Math.pow(p,2)*i,m=Math.pow(1-p,2)*e+2*p*(1-p)*h+Math.pow(p,2)*s,c>0&&(l=this._getDistanceToLine(f,g,u,m,o,n),v=v>l?l:v),f=u,g=m;r=v}else r=this._getDistanceToLine(t,e,i,s,o,n);else{var u,m,y,b,_=.25*this.physics.springLength,x=this.from;x.width>x.height?(u=x.x+.5*x.width,m=x.y-_):(u=x.x+_,m=x.y-.5*x.height),y=u-o,b=m-n,r=Math.abs(Math.sqrt(y*y+b*b)-_)}return this.labelDimensions.lefto&&this.labelDimensions.topn?0:r},s.prototype._getDistanceToLine=function(t,e,i,s,o,n){var r=i-t,a=s-e,h=r*r+a*a,d=((o-t)*r+(n-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,c=e+d*a,p=l-o,u=c-n;return Math.sqrt(p*p+u*u)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&null!==this.from&&null!==this.to&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new n({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new n({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),o=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>o?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,o=this.to.y-this.from.y,n=Math.sqrt(s*s+o*o),r=this.from.distanceToBorder(t,i+Math.PI),a=(n-r)/n,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.options.smoothCurves.dynamic&&1==this.options.smoothCurves.enabled?e=this.via:1==this.options.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.options.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,o=this.to.y-e.y,n=Math.sqrt(s*s+o*o));var l,c,p=this.to.distanceToBorder(t,i),u=(n-p)/n;return 1==this.options.smoothCurves.enabled&&null!=e.x?(l=(1-u)*e.x+u*this.to.x,c=(1-u)*e.y+u*this.to.y):(l=(1-u)*this.from.x+u*this.to.x,c=(1-u)*this.from.y+u*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var o=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=o.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t,e){var i=this.images[t];if(void 0==i){var s=this;i=new Image,this.images[t]=i,i.onload=function(){s.callback&&s.callback(this)},i.onerror=function(){this.src=e,s.callback&&s.callback(this)},i.src=t}return i},t.exports=e},function(t,e,i){function s(t,e,i,s){var n=o.selectiveBridgeObject(["nodes"],s);this.options=n.nodes,this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.fontDrawThreshold=3,this.id=void 0,this.x=null,this.y=null,this.allowedToMoveX=!1,this.allowedToMoveY=!1,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.level=-1,this.preassignedLevel=!1,this.hierarchyEnumerated=!1,this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0},this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.damping=s.physics.damping,this.fixedData={x:null,y:null},this.setProperties(t,n),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var o=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1),e=this.dynamicEdges.indexOf(t),-1!=e&&this.dynamicEdges.splice(e,1),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){var i=["borderWidth","borderWidthSelected","shape","image","brokenImage","radius","fontColor","fontSize","fontFace","fontFill","group","mass"];if(o.selectiveDeepExtend(i,this.options,t),void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if("number"==typeof this.options.group||"string"==typeof this.options.group&&""!=this.options.group){var s=this.grouplist.get(this.options.group);for(var n in s)s.hasOwnProperty(n)&&(this.options[n]=s[n])}if(void 0!==t.radius&&(this.baseRadiusValue=this.options.radius),void 0!==t.color&&(this.options.color=o.parseColor(t.color)),void 0!==this.options.image&&""!=this.options.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage)}switch(void 0!==t.allowedToMoveX?(this.xFixed=!t.allowedToMoveX,this.allowedToMoveX=t.allowedToMoveX):void 0!==t.x&&0==this.allowedToMoveX&&(this.xFixed=!0),void 0!==t.allowedToMoveY?(this.yFixed=!t.allowedToMoveY,this.allowedToMoveY=t.allowedToMoveY):void 0!==t.y&&0==this.allowedToMoveY&&(this.yFixed=!0),this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.options.shape&&(this.options.radiusMin=e.nodes.widthMin,this.options.radiusMax=e.nodes.widthMax),this.options.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.options.shape){case"circle":case"dot":return this.options.radius+i;case"ellipse":var s=this.width/2,o=this.height/2,n=Math.sin(e)*s,r=Math.cos(e)*o;return s*o/Math.sqrt(n*n+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(this.xFixed)this.fx=0,this.vx=0;else{var e=this.damping*this.vx,i=(this.fx-e)/this.options.mass;this.vx+=i*t,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var s=this.damping*this.vy,o=(this.fy-s)/this.options.mass;this.vy+=o*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0,this.vx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.options.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0,this.vy=0;else{var o=this.damping*this.vy,n=(this.fy-o)/this.options.mass;this.vy+=n*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){var e=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return e>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.options.radius=(this.options.radiusMin+this.options.radiusMax)/2;else{var i=(this.options.radiusMax-this.options.radiusMin)/(e-t);this.options.radius=(this.value-t)*i+this.options.radiusMin}this.baseRadiusValue=this.options.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.options.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.options.radius||this.imageObj.width,e=this.options.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.options.radius),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.options.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.options.radius=s/2,this.width=s,this.height=s,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.options.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=this.options.borderWidth,s=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.circle(this.x,this.y,this.options.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.circle(this.x,this.y,this.options.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:i)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.options.radius=this.baseRadiusValue;var t=2*this.options.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=this.options.borderWidth,o=this.options.borderWidthSelected||2*this.options.borderWidth,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t[e](this.x,this.y,this.options.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?o:s)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background,t[e](this.x,this.y,this.options.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,o,n,r){if(e&&Number(this.options.fontSize)*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace; +var a=e.split("\n"),h=a.length,d=Number(this.options.fontSize)+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=t.measureText(a[0]).width,p=1;h>p;p++){var u=t.measureText(a[p]).width;c=u>c?u:c}var m=this.options.fontSize*h,f=i-c/2,g=s-m/2;"top"==n&&(g+=.5*d),this.labelDimensions={top:g,left:f,width:c,height:m,yLine:l},void 0!==this.options.fontFill&&null!==this.options.fontFill&&"none"!==this.options.fontFill&&(t.fillStyle=this.options.fontFill,t.fillRect(f,g,c,m)),t.fillStyle=this.options.fontColor||"black",t.textAlign=o||"center",t.textBaseline=n||"middle";for(var p=0;h>p;p++)t.fillText(a[p],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.options.fontSize+"px "+this.options.fontFace;for(var e=this.label.split("\n"),i=(Number(this.options.fontSize)+4)*e.length,s=0,o=0,n=e.length;n>o;o++)s=Math.max(s,t.measureText(e[o]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(n=s-e-this.padding),no&&(r=o-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){o=r.nodes[i];break}for(o||(o={id:e.id},t.node&&(o.attr=a(o.attr,t.node))),i=n.length-1;i>=0;i--){var h=n[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(o)&&h.nodes.push(o)}e.attr&&(o.attr=a(o.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,o){var n={from:e,to:i,type:s};return t.edge&&(n.attr=a({},t.edge)),n.attr=a(n.attr||{},o),n}function p(){for(k=M.NULL,L="";" "==O||" "==O||"\n"==O||"\r"==O;)o();do{var t=!1;if("#"==O){for(var e=T-1;" "==E.charAt(e)||" "==E.charAt(e);)e--;if("\n"==E.charAt(e)||""==E.charAt(e)){for(;""!=O&&"\n"!=O;)o();t=!0}}if("/"==O&&"/"==n()){for(;""!=O&&"\n"!=O;)o();t=!0}if("/"==O&&"*"==n()){for(;""!=O;){if("*"==O&&"/"==n()){o(),o();break}o()}t=!0}for(;" "==O||" "==O||"\n"==O||"\r"==O;)o()}while(t);if(""==O)return void(k=M.DELIMITER);var i=O+n();if(C[i])return k=M.DELIMITER,L=i,o(),void o();if(C[O])return k=M.DELIMITER,L=O,void o();if(r(O)||"-"==O){for(L+=O,o();r(O);)L+=O,o();return"false"==L?L=!1:"true"==L?L=!0:isNaN(Number(L))||(L=Number(L)),void(k=M.IDENTIFIER)}if('"'==O){for(o();""!=O&&('"'!=O||'"'==O&&'"'==n());)L+=O,'"'==O&&o(),o();if('"'!=O)throw x('End of string " expected');return o(),void(k=M.IDENTIFIER)}for(k=M.UNKNOWN;""!=O;)L+=O,o();throw new SyntaxError('Syntax error in part "'+w(L,30)+'"')}function u(){var t={};if(s(),p(),"strict"==L&&(t.strict=!0,p()),("graph"==L||"digraph"==L)&&(t.type=L,p()),k==M.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)f(t),";"==L&&p()}function f(t){var e=g(t);if(e)return void b(t,e);var i=v(t);if(!i){if(k!=M.IDENTIFIER)throw x("Identifier expected");var s=L;if(p(),"="==L){if(p(),k!=M.IDENTIFIER)throw x("Identifier expected");t[s]=L,p()}else y(t,s)}}function g(t){var e=null;if("subgraph"==L&&(e={},e.type="subgraph",p(),k==M.IDENTIFIER&&(e.id=L,p())),"{"==L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function v(t){return"node"==L?(p(),t.node=_(),"node"):"edge"==L?(p(),t.edge=_(),"edge"):"graph"==L?(p(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},s=_();s&&(i.attr=s),d(t,i),b(t,e)}function b(t,e){for(;"->"==L||"--"==L;){var i,s=L;p();var o=g(t);if(o)i=o;else{if(k!=M.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,d(t,{id:i}),p()}var n=_(),r=c(t,e,i,s,n);l(t,r),e=i}}function _(){for(var t=null;"["==L;){for(p(),t={};""!==L&&"]"!=L;){if(k!=M.IDENTIFIER)throw x("Attribute name expected");var e=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),k!=M.IDENTIFIER)throw x("Attribute value expected");var i=L;h(t,e,i),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+w(L,30)+'" (char '+T+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t){var e=i(t),s={nodes:[],edges:[],options:{}};if(e.nodes&&e.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),s.nodes.push(e)}),e.edges){var o=function(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e};e.edges.forEach(function(t){var e,i;e=t.from instanceof Object?t.from.nodes:{id:t.from},i=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var e=o(t);s.edges.push(e)}),S(e,i,function(e,i){var n=c(s,e.id,i.id,t.type,t.attr),r=o(n);s.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=o(t);s.edges.push(e)})})}return e.attr&&(s.options=e.attr),s}var M={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},C={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},E="",T=0,O="",L="",k=M.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=D},function(t,e){function i(t,e){var i=[],s=[];this.options={edges:{inheritColor:!0},nodes:{allowedToMove:!1,parseColor:!1}},void 0!==e&&(this.options.nodes.allowedToMove=e.allowedToMove|!1,this.options.nodes.parseColor=e.parseColor|!1,this.options.edges.inheritColor=e.inheritColor|!0);for(var o=t.edges,n=t.nodes,r=0;r=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}return{start:e,end:i}},s.prototype.setWindow=function(t,e,i){var s=i&&void 0!==i.animate?i.animate:!0;if(1==arguments.length){var o=arguments[0];this.range.setRange(o.start,o.end,s)}else this.range.setRange(t,e,s)},s.prototype.moveTo=function(t,e){var i=this.range.end-this.range.start,s=r.convert(t,"Date").valueOf(),o=s-i/2,n=s+i/2,a=e&&void 0!==e.animate?e.animate:!0;this.range.setRange(o,n,a)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){h.updateHiddenDates(this.body,this.options.hiddenDates),"top"==e.orientation?(r.addClassName(s.root,"top"),r.removeClassName(s.root,"bottom")):(r.removeClassName(s.root,"top"),r.addClassName(s.root,"bottom")),s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var o=s.root.offsetHeight-s.root.clientHeight,n=s.root.offsetWidth-s.root.clientWidth;0===s.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===s.root.clientHeight&&(n=o),i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),d=i.top.height+a+i.bottom.height+o+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,d+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-o;var l=i.root.height-i.top.height-i.bottom.height-o;i.centerContainer.height=l,i.leftContainer.height=l,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-n,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var c=i.root.width-i.left.width-i.right.width-n;i.center.width=c,i.centerContainer.width=c,i.top.width=c,i.bottom.width=c,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+i.border.left+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var p=this.props.scrollTop;"bottom"==e.orientation&&(p+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=p+"px",s.left.style.left="0",s.left.style.top=p+"px",s.right.style.left="0",s.right.style.top=p+"px";var u=0==this.props.scrollTop?"hidden":"",m=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";if(s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=m,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=m,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=m,this.components.forEach(function(e){t=e.redraw()||t}),t){var f=2;this.redrawCount0&&(this.props.scrollTop=0),this.props.scrollTops;s++){var o=s%2===0?1.3*i:.5*i;this.lineTo(t+o*Math.sin(2*s*Math.PI/10),e-o*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,o){var n=Math.PI/180;0>i-2*o&&(o=i/2),0>s-2*o&&(o=s/2),this.beginPath(),this.moveTo(t+o,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,270*n,360*n,!1),this.lineTo(t+i,e+s-o),this.arc(t+i-o,e+s-o,o,0,90*n,!1),this.lineTo(t+o,e+s),this.arc(t+o,e+s-o,o,90*n,180*n,!1),this.lineTo(t,e+o),this.arc(t+o,e+o,o,180*n,270*n,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var o=.5522848,n=i/2*o,r=s/2*o,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-n,e,d,e),this.bezierCurveTo(d+n,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+n,h,d,h),this.bezierCurveTo(d-n,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var o=1/3,n=i,r=s*o,a=.5522848,h=n/2*a,d=r/2*a,l=t+n,c=e+r,p=t+n/2,u=e+r/2,m=e+(s-r/2),f=e+s;this.beginPath(),this.moveTo(l,u),this.bezierCurveTo(l,u+d,p+h,c,p,c),this.bezierCurveTo(p-h,c,t,u+d,t,u),this.bezierCurveTo(t,u-d,p-h,e,p,e),this.bezierCurveTo(p+h,e,l,u-d,l,u),this.lineTo(l,m),this.bezierCurveTo(l,m+d,p+h,f,p,f),this.bezierCurveTo(p-h,f,t,m+d,t,m),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var o=t-s*Math.cos(i),n=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=o+s/3*Math.cos(i+.5*Math.PI),d=n+s/3*Math.sin(i+.5*Math.PI),l=o+s/3*Math.cos(i-.5*Math.PI),c=n+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,o){o||(o=[10,5]),0==p&&(p=.001);var n=o.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var p=o[l++%n];p>d&&(p=d);var u=Math.sqrt(p*p/(1+h*h));0>r&&(u=-u),t+=u,e+=h*u,this[c?"lineTo":"moveTo"](t,e),d-=p,c=!c}})},function(t,e,i){function s(t,e){this.groupId=t,this.options=e}var o=i(2),n=i(53);s.prototype.getYRange=function(t){var e=t[0].y,i=t[0].y;for(j=0;jt[j].y?t[j].y:e,i=i0){var r,a,h=Number(i.svg.style.height.replace("px",""));if(r=o.getSVGElement("path",i.svgElements,i.svg),r.setAttributeNS(null,"class",e.className),void 0!==e.style&&r.setAttributeNS(null,"style",e.style),a=1==e.options.catmullRom.enabled?s._catmullRom(t,e):s._linear(t),1==e.options.shaded.enabled){var d,l=o.getSVGElement("path",i.svgElements,i.svg);d="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+a+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+h+" "+a+"L"+t[t.length-1].x+","+h,l.setAttributeNS(null,"class",e.className+" fill"),void 0!==e.options.shaded.style&&l.setAttributeNS(null,"style",e.options.shaded.style),l.setAttributeNS(null,"d",d)}r.setAttributeNS(null,"d","M"+a),1==e.options.drawPoints.enabled&&n.draw(t,e,i)}},s._catmullRomUniform=function(t){for(var e,i,s,o,n,r,a=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",h=1/6,d=t.length,l=0;d-1>l;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],o=d>l+2?t[l+2]:s,n={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-o.x)*h,y:(i.y+6*s.y-o.y)*h},a+="C"+n.x+","+n.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,o,n,r,a,h,d,l,c,p,u,m,f,g,v,y,b,_,x,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",S=t.length,D=0;S-1>D;D++)s=0==D?t[0]:t[D-1],o=t[D],n=t[D+1],r=S>D+2?t[D+2]:n,d=Math.sqrt(Math.pow(s.x-o.x,2)+Math.pow(s.y-o.y,2)),l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),c=Math.sqrt(Math.pow(n.x-r.x,2)+Math.pow(n.y-r.y,2)),g=Math.pow(c,i),y=Math.pow(c,2*i),v=Math.pow(l,i),b=Math.pow(l,2*i),x=Math.pow(d,i),_=Math.pow(d,2*i),p=2*_+3*x*v+b,u=2*y+3*g*v+b,m=3*x*(x+v),m>0&&(m=1/m),f=3*g*(g+v),f>0&&(f=1/f),a={x:(-b*s.x+p*o.x+_*n.x)*m,y:(-b*s.y+p*o.y+_*n.y)*m},h={x:(y*o.x+u*n.x-b*r.x)*f,y:(y*o.y+u*n.y-b*r.y)*f},0==a.x&&0==a.y&&(a=o),0==h.x&&0==h.y&&(h=n),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+n.x+","+n.y+" ";return w},s._linear=function(t){for(var e="",i=0;it[s].y?t[s].y:e,i=i0&&(n=Math.min(n,Math.abs(c[d-1].x-r))),a=s._getSafeDrawData(n,h,m);else{var g=d+(p[r].amount-p[r].resolved),v=d-(p[r].resolved+1);g0&&(n=Math.min(n,Math.abs(c[v].x-r))),a=s._getSafeDrawData(n,h,m),p[r].resolved+=1,"stack"==h.options.barChart.handleOverlap?(f=p[r].accumulated,p[r].accumulated+=h.zeroPosition-c[d].y):"sideBySide"==h.options.barChart.handleOverlap&&(a.width=a.width/p[r].amount,a.offset+=p[r].resolved*a.width-.5*a.width*(p[r].amount+1),"left"==h.options.barChart.align?a.offset-=.5*a.width:"right"==h.options.barChart.align&&(a.offset+=.5*a.width))}o.drawBar(c[d].x+a.offset,c[d].y-f,a.width,h.zeroPosition-c[d].y,h.className+" bar",i.svgElements,i.svg),1==h.options.drawPoints.enabled&&o.drawPoint(c[d].x+a.offset,c[d].y,h,i.svgElements,i.svg)}},s._getDataIntersections=function(t,e){for(var i,s=0;s0&&(i=Math.min(i,Math.abs(e[s-1].x-e[s].x))),0==i&&(void 0===t[e[s].x]&&(t[e[s].x]={amount:0,resolved:0,accumulated:0}),t[e[s].x].amount+=1)},s._getSafeDrawData=function(t,e,i){var s,o;return t0?(s=i>t?i:t,o=0,"left"==e.options.barChart.align?o-=.5*t:"right"==e.options.barChart.align&&(o+=.5*t)):(s=e.options.barChart.width,o=0,"left"==e.options.barChart.align?o-=.5*e.options.barChart.width:"right"==e.options.barChart.align&&(o+=.5*e.options.barChart.width)),{width:s,offset:o}},s.getStackedBarYRange=function(t,e,i,o,n){if(t.length>0){t.sort(function(t,e){return t.x==e.x?t.groupId-e.groupId:t.x-e.x});var r={};s._getDataIntersections(r,t),e[o]=s._getStackedBarYRange(r,t),e[o].yAxisOrientation=n,i.push(o)}},s._getStackedBarYRange=function(t,e){for(var i,s=e[0].y,o=e[0].y,n=0;ne[n].y?e[n].y:s,o=ot[r].accumulated?t[r].accumulated:s,o=ot[j].y?t[j].y:e,i=is;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e){var i,s,o;!function(n,r){s=[],i=r,o="function"==typeof i?i.apply(e,s):i,!(void 0!==o&&(t.exports=o))}(this,function(){function t(t){var e,i=t&&t.preventDefault||!1,s={keydown:{},keyup:{}},o={};for(e=97;122>=e;e++)o[String.fromCharCode(e)]={code:65+(e-97),shift:!1};for(e=65;90>=e;e++)o[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;9>=e;e++)o[""+e]={code:48+e,shift:!1};for(e=1;12>=e;e++)o["F"+e]={code:111+e,shift:!1};for(e=0;9>=e;e++)o["num"+e]={code:96+e,shift:!1};o["num*"]={code:106,shift:!1},o["num+"]={code:107,shift:!1},o["num-"]={code:109,shift:!1},o["num/"]={code:111,shift:!1},o["num."]={code:110,shift:!1},o.left={code:37,shift:!1},o.up={code:38,shift:!1},o.right={code:39,shift:!1},o.down={code:40,shift:!1},o.space={code:32,shift:!1},o.enter={code:13,shift:!1},o.shift={code:16,shift:void 0},o.esc={code:27,shift:!1},o.backspace={code:8,shift:!1},o.tab={code:9,shift:!1},o.ctrl={code:17,shift:!1},o.alt={code:18,shift:!1},o["delete"]={code:46,shift:!1},o.pageup={code:33,shift:!1},o.pagedown={code:34,shift:!1},o["="]={code:187,shift:!1},o["-"]={code:189,shift:!1},o["]"]={code:221,shift:!1},o["["]={code:219,shift:!1};var n=function(t){a(t,"keydown")},r=function(t){a(t,"keyup")},a=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n0)for(i in He)s=He[i],o=e[s],"undefined"!=typeof o&&(t[s]=o);return t}function b(t){return 0>t?Math.ceil(t):Math.floor(t)}function _(t,e,i){for(var s=""+Math.abs(t),o=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&k(t[s])!==k(e[s]))&&r++;return r+n}function T(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=mi[t]||fi[e]||e}return t}function O(t){var e,i,s={};for(i in t)a(t,i)&&(e=T(i),e&&(s[e]=t[i]));return s}function L(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}De[t]=function(s,o){var r,a,h=De._locale[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=De().utc().set(i,t);return h.call(De._locale,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function k(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function N(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function I(t,e,i){return pe(De([t,11,31+e-i]),e,i).week}function A(t){return z(t)?366:365}function z(t){return t%4===0&&t%100!==0||t%400===0}function P(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[Ne]<0||t._a[Ne]>11?Ne:t._a[Ie]<1||t._a[Ie]>N(t._a[ke],t._a[Ne])?Ie:t._a[Ae]<0||t._a[Ae]>24||24===t._a[Ae]&&(0!==t._a[ze]||0!==t._a[Pe]||0!==t._a[Re])?Ae:t._a[ze]<0||t._a[ze]>59?ze:t._a[Pe]<0||t._a[Pe]>59?Pe:t._a[Re]<0||t._a[Re]>999?Re:-1,t._pf._overflowDayOfYear&&(ke>e||e>Ie)&&(e=Ie),t._pf.overflow=e)}function R(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length&&t._pf.bigHour===n)),t._isValid}function F(t){return t?t.toLowerCase().replace("_","-"):t}function H(t){for(var e,i,s,o,n=0;n0;){if(s=Y(o.slice(0,e).join("-")))return s;if(i&&i.length>=e&&E(o,i,!0)>=e-1)break;e--}n++}return null}function Y(t){var e=null;if(!Fe[t]&&Ye)try{e=De.locale(),!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),De.locale(e)}catch(i){}return Fe[t]}function W(t,e){var i,s;return e._isUTC?(i=e.clone(),s=(De.isMoment(t)||C(t)?+t:+De(t))-+i,i._d.setTime(+i._d+s),De.updateOffset(i,!1),i):De(t).local()}function B(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,i,s=t.match(je);for(e=0,i=s.length;i>e;e++)s[e]=_i[s[e]]?_i[s[e]]:B(s[e]);return function(o){var n="";for(e=0;i>e;e++)n+=s[e]instanceof Function?s[e].call(o,t):s[e];return n}}function j(t,e){return t.isValid()?(e=U(e,t.localeData()),gi[e]||(gi[e]=G(e)),gi[e](t)):t.localeData().invalidDate()}function U(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Ue.lastIndex=0;s>=0&&Ue.test(t);)t=t.replace(Ue,i),Ue.lastIndex=0,s-=1;return t}function V(t,e){var i,s=e._strict;switch(t){case"Q":return ii;case"DDDD":return oi;case"YYYY":case"GGGG":case"gggg":return s?ni:qe;case"Y":case"G":case"g":return ai;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?ri:Ze;case"S":if(s)return ii;case"SS":if(s)return si;case"SSS":if(s)return oi;case"DDD":return Xe;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Qe;case"a":case"A":return e._locale._meridiemParse;case"x":return ti;case"X":return ei;case"Z":case"ZZ":return $e;case"T":return Je;case"SSSS":return Ke;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?si:Ve;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ve;case"Do":return s?e._locale._ordinalParse:e._locale._ordinalParseLenient;default:return i=new RegExp(ee(te(t.replace("\\","")),"i"))}}function X(t){t=t||"";var e=t.match($e)||[],i=e[e.length-1]||[],s=(i+"").match(pi)||["-",0,0],o=+(60*s[1])+k(s[2]);return"+"===s[0]?-o:o}function q(t,e,i){var s,o=i._a;switch(t){case"Q":null!=e&&(o[Ne]=3*(k(e)-1));break;case"M":case"MM":null!=e&&(o[Ne]=k(e)-1);break;case"MMM":case"MMMM":s=i._locale.monthsParse(e,t,i._strict),null!=s?o[Ne]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(o[Ie]=k(e));break;case"Do":null!=e&&(o[Ie]=k(parseInt(e.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=k(e));break;case"YY":o[ke]=De.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":o[ke]=k(e);break;case"a":case"A":i._isPm=i._locale.isPM(e);break;case"h":case"hh":i._pf.bigHour=!0;case"H":case"HH":o[Ae]=k(e);break;case"m":case"mm":o[ze]=k(e);break;case"s":case"ss":o[Pe]=k(e);break;case"S":case"SS":case"SSS":case"SSSS":o[Re]=k(1e3*("0."+e));break;case"x":i._d=new Date(k(e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=X(e);break;case"dd":case"ddd":case"dddd":s=i._locale.weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=k(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=De.parseTwoDigitYear(e)}}function Z(t){var e,i,s,o,n,a,h;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(n=1,a=4,i=r(e.GG,t._a[ke],pe(De(),1,4).year),s=r(e.W,1),o=r(e.E,1)):(n=t._locale._week.dow,a=t._locale._week.doy,i=r(e.gg,t._a[ke],pe(De(),n,a).year),s=r(e.w,1),null!=e.d?(o=e.d,n>o&&++s):o=null!=e.e?e.e+n:n),h=ue(i,s,o,a,n),t._a[ke]=h.year,t._dayOfYear=h.dayOfYear}function K(t){var e,i,s,o,n=[];if(!t._d){for(s=$(t),t._w&&null==t._a[Ie]&&null==t._a[Ne]&&Z(t),t._dayOfYear&&(o=r(t._a[ke],s[ke]),t._dayOfYear>A(o)&&(t._pf._overflowDayOfYear=!0),i=he(o,0,t._dayOfYear),t._a[Ne]=i.getUTCMonth(),t._a[Ie]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=n[e]=s[e];for(;7>e;e++)t._a[e]=n[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Ae]&&0===t._a[ze]&&0===t._a[Pe]&&0===t._a[Re]&&(t._nextDay=!0,t._a[Ae]=0),t._d=(t._useUTC?he:ae).apply(null,n),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm),t._nextDay&&(t._a[Ae]=24)}}function Q(t){var e;t._d||(e=O(t._i),t._a=[e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],K(t))}function $(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function J(t){if(t._f===De.ISO_8601)return void se(t);t._a=[],t._pf.empty=!0;var e,i,s,o,r,a=""+t._i,h=a.length,d=0;for(s=U(t._f,t._locale).match(je)||[],e=0;e0&&t._pf.unusedInput.push(r),a=a.slice(a.indexOf(i)+i.length),d+=i.length),_i[o]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(o),q(o,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(o);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._pf.bigHour===!0&&t._a[Ae]<=12&&(t._pf.bigHour=n),t._isPm&&t._a[Ae]<12&&(t._a[Ae]+=12),t._isPm===!1&&12===t._a[Ae]&&(t._a[Ae]=0),K(t),P(t)}function te(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,o){return e||i||s||o})}function ee(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ie(t){var e,i,s,o,n;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;on)&&(s=n,i=e));v(t,i||e)}function se(t){var e,i,s=t._i,o=hi.exec(s);if(o){for(t._pf.iso=!0,e=0,i=li.length;i>e;e++)if(li[e][1].exec(s)){t._f=li[e][0]+(o[6]||" ");break}for(e=0,i=ci.length;i>e;e++)if(ci[e][1].exec(s)){t._f+=ci[e][0];break}s.match($e)&&(t._f+="Z"),J(t)}else t._isValid=!1}function oe(t){se(t),t._isValid===!1&&(delete t._isValid,De.createFromInputFallback(t))}function ne(t,e){var i,s=[];for(i=0;it&&a.setFullYear(t),a}function he(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function de(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function le(t,e,i,s,o){return o.relativeTime(e||1,!!i,t,s)}function ce(t,e,i){var s=De.duration(t).abs(),o=Oe(s.as("s")),n=Oe(s.as("m")),r=Oe(s.as("h")),a=Oe(s.as("d")),h=Oe(s.as("M")),d=Oe(s.as("y")),l=o0,l[4]=i,le.apply({},l)}function pe(t,e,i){var s,o=i-e,n=i-t.day();return n>o&&(n-=7),o-7>n&&(n+=7),s=De(t).add(n,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ue(t,e,i,s,o){var n,r,a=he(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:o,n=o-a+(a>s?7:0)-(o>a?7:0),r=7*(e-1)+(i-o)+n+1,{year:r>0?t:t-1,dayOfYear:r>0?r:A(t-1)+r}}function me(t){var e,i=t._i,s=t._f;return t._locale=t._locale||De.localeData(t._l),null===i||s===n&&""===i?De.invalid({nullInput:!0}):("string"==typeof i&&(t._i=i=t._locale.preparse(i)),De.isMoment(i)?new f(i,!0):(s?M(s)?ie(t):J(t):re(t),e=new f(t),e._nextDay&&(e.add(1,"d"),e._nextDay=n),e))}function fe(t,e){var i,s;if(1===e.length&&M(e[0])&&(e=e[0]),!e.length)return De();for(i=e[0],s=1;s=0?"+":"-";return e+_(Math.abs(t),6)},gg:function(){return _(this.weekYear()%100,2)},gggg:function(){return _(this.weekYear(),4)},ggggg:function(){return _(this.weekYear(),5)},GG:function(){return _(this.isoWeekYear()%100,2)},GGGG:function(){return _(this.isoWeekYear(),4)},GGGGG:function(){return _(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return k(this.milliseconds()/100)},SS:function(){return _(k(this.milliseconds()/10),2)},SSS:function(){return _(this.milliseconds(),3)},SSSS:function(){return _(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+":"+_(k(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+_(k(t/60),2)+_(k(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},xi={},wi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];yi.length;)Ce=yi.pop(),_i[Ce+"o"]=u(_i[Ce],Ce);for(;bi.length;)Ce=bi.pop(),_i[Ce+Ce]=p(_i[Ce],2);_i.DDDD=p(_i.DDD,3),v(m.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t,e,i){var s,o,n;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;12>s;s++){if(o=De.utc([2e3,s]),i&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(o,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(o,"").replace(".","")+"$","i")),i||this._monthsParse[s]||(n="^"+this.months(o,"")+"|^"+this.monthsShort(o,""),this._monthsParse[s]=new RegExp(n.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[s].test(t))return s;if(i&&"MMM"===e&&this._shortMonthsParse[s].test(t))return s;if(!i&&this._monthsParse[s].test(t))return s}},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=De([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e,i){var s=this._calendar[t];return"function"==typeof s?s.apply(e,[i]):s},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var o=this._relativeTime[i];return"function"==typeof o?o(t,e,i,s):o.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",_ordinalParse:/\d{1,2}/,preparse:function(t){return t},postformat:function(t){return t},week:function(t){return pe(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),De=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._i=t,o._f=e,o._l=i,o._strict=s,o._isUTC=!1,o._pf=h(),me(o)},De.suppressDeprecationWarnings=!1,De.createFromInputFallback=l("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),De.min=function(){var t=[].slice.call(arguments,0);return fe("isBefore",t)},De.max=function(){var t=[].slice.call(arguments,0);return fe("isAfter",t)},De.utc=function(t,e,i,s){var o;return"boolean"==typeof i&&(s=i,i=n),o={},o._isAMomentObject=!0,o._useUTC=!0,o._isUTC=!0,o._l=i,o._i=t,o._f=e,o._strict=s,o._pf=h(),me(o).utc()},De.unix=function(t){return De(1e3*t)},De.duration=function(t,e){var i,s,o,n,r=t,h=null;return De.isDuration(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(h=Be.exec(t))?(i="-"===h[1]?-1:1,r={y:0,d:k(h[Ie])*i,h:k(h[Ae])*i,m:k(h[ze])*i,s:k(h[Pe])*i,ms:k(h[Re])*i}):(h=Ge.exec(t))?(i="-"===h[1]?-1:1,o=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},r={y:o(h[2]),M:o(h[3]),d:o(h[4]),h:o(h[5]),m:o(h[6]),s:o(h[7]),w:o(h[8])}):"object"==typeof r&&("from"in r||"to"in r)&&(n=w(De(r.from),De(r.to)),r={},r.ms=n.milliseconds,r.M=n.months),s=new g(r),De.isDuration(t)&&a(t,"_locale")&&(s._locale=t._locale),s},De.version=Ee,De.defaultFormat=di,De.ISO_8601=function(){},De.momentProperties=He,De.updateOffset=function(){},De.relativeTimeThreshold=function(t,e){return vi[t]===n?!1:e===n?vi[t]:(vi[t]=e,!0)},De.lang=l("moment.lang is deprecated. Use moment.locale instead.",function(t,e){return De.locale(t,e)}),De.locale=function(t,e){var i;return t&&(i="undefined"!=typeof e?De.defineLocale(t,e):De.localeData(t),i&&(De.duration._locale=De._locale=i)),De._locale._abbr},De.defineLocale=function(t,e){return null!==e?(e.abbr=t,Fe[t]||(Fe[t]=new m),Fe[t].set(e),De.locale(t),Fe[t]):(delete Fe[t],null)},De.langData=l("moment.langData is deprecated. Use moment.localeData instead.",function(t){return De.localeData(t)}),De.localeData=function(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return De._locale;if(!M(t)){if(e=Y(t))return e;t=[t]}return H(t)},De.isMoment=function(t){return t instanceof f||null!=t&&a(t,"_isAMomentObject")},De.isDuration=function(t){return t instanceof g};for(Ce=wi.length-1;Ce>=0;--Ce)L(wi[Ce]);De.normalizeUnits=function(t){return T(t)},De.invalid=function(t){var e=De.utc(0/0);return null!=t?v(e._pf,t):e._pf.userInvalidated=!0,e},De.parseZone=function(){return De.apply(null,arguments).parseZone()},De.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)},v(De.fn=f.prototype,{clone:function(){return De(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ") +},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=De(this).utc();return 00:!1},parsingFlags:function(){return v({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(t){return this.zone(0,t)},local:function(t){return this._isUTC&&(this.zone(0,t),this._isUTC=!1,t&&this.add(this._dateTzOffset(),"m")),this},format:function(t){var e=j(this,t||De.defaultFormat);return this.localeData().postformat(e)},add:S(1,"add"),subtract:S(-1,"subtract"),diff:function(t,e,i){var s,o,n,r=W(t,this),a=6e4*(this.zone()-r.zone());return e=T(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+r.daysInMonth()),o=12*(this.year()-r.year())+(this.month()-r.month()),n=this-De(this).startOf("month")-(r-De(r).startOf("month")),n-=6e4*(this.zone()-De(this).startOf("month").zone()-(r.zone()-De(r).startOf("month").zone())),o+=n/s,"year"===e&&(o/=12)):(s=this-r,o="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),i?o:b(o)},from:function(t,e){return De.duration({to:this,from:t}).locale(this.locale()).humanize(!e)},fromNow:function(t){return this.from(De(),t)},calendar:function(t){var e=t||De(),i=W(e,this).startOf("day"),s=this.diff(i,"days",!0),o=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.localeData().calendar(o,this,De(e)))},isLeapYear:function(){return z(this.year())},isDST:function(){return this.zone()+t):(i=De.isMoment(t)?+t:+De(t),i<+this.clone().startOf(e))},isBefore:function(t,e){var i;return e=T("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=De.isMoment(t)?t:De(t),+t>+this):(i=De.isMoment(t)?+t:+De(t),+this.clone().endOf(e)t?this:t}),max:l("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=De.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i,s=this._offset||0;return null==t?this._isUTC?s:this._dateTzOffset():("string"==typeof t&&(t=X(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(i=this._dateTzOffset()),this._offset=t,this._isUTC=!0,null!=i&&this.subtract(i,"m"),s!==t&&(!e||this._changeInProgress?D(this,De.duration(s-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,De.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?De(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return N(this.year(),this.month())},dayOfYear:function(t){var e=Oe((De(this).startOf("day")-De(this).startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=pe(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==t?e:this.add(t-e,"y")},isoWeekYear:function(t){var e=pe(this,1,4).year;return null==t?e:this.add(t-e,"y")},week:function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},isoWeek:function(t){var e=pe(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},weekday:function(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return I(this.year(),1,4)},weeksInYear:function(){var t=this.localeData()._week;return I(this.year(),t.dow,t.doy)},get:function(t){return t=T(t),this[t]()},set:function(t,e){return t=T(t),"function"==typeof this[t]&&this[t](e),this},locale:function(t){var e;return t===n?this._locale._abbr:(e=De.localeData(t),null!=e&&(this._locale=e),this)},lang:l("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return t===n?this.localeData():this.locale(t)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),De.fn.millisecond=De.fn.milliseconds=be("Milliseconds",!1),De.fn.second=De.fn.seconds=be("Seconds",!1),De.fn.minute=De.fn.minutes=be("Minutes",!1),De.fn.hour=De.fn.hours=be("Hours",!0),De.fn.date=be("Date",!0),De.fn.dates=l("dates accessor is deprecated. Use date instead.",be("Date",!0)),De.fn.year=be("FullYear",!0),De.fn.years=l("years accessor is deprecated. Use year instead.",be("FullYear",!0)),De.fn.days=De.fn.day,De.fn.months=De.fn.month,De.fn.weeks=De.fn.week,De.fn.isoWeeks=De.fn.isoWeek,De.fn.quarters=De.fn.quarter,De.fn.toJSON=De.fn.toISOString,v(De.duration.fn=g.prototype,{_bubble:function(){var t,e,i,s=this._milliseconds,o=this._days,n=this._months,r=this._data,a=0;r.milliseconds=s%1e3,t=b(s/1e3),r.seconds=t%60,e=b(t/60),r.minutes=e%60,i=b(e/60),r.hours=i%24,o+=b(i/24),a=b(_e(o)),o-=b(xe(a)),n+=b(o/30),o%=30,a+=b(n/12),n%=12,r.days=o,r.months=n,r.years=a},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return b(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12)},humanize:function(t){var e=ce(this,!t,this.localeData());return t&&(e=this.localeData().pastFuture(+this,e)),this.localeData().postformat(e)},add:function(t,e){var i=De.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=De.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=T(t),this[t.toLowerCase()+"s"]()},as:function(t){var e,i;if(t=T(t),"month"===t||"year"===t)return e=this._days+this._milliseconds/864e5,i=this._months+12*_e(e),"month"===t?i:i/12;switch(e=this._days+Math.round(xe(this._months/12)),t){case"week":return e/7+this._milliseconds/6048e5;case"day":return e+this._milliseconds/864e5;case"hour":return 24*e+this._milliseconds/36e5;case"minute":return 24*e*60+this._milliseconds/6e4;case"second":return 24*e*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*e*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+t)}},lang:De.fn.lang,locale:De.fn.locale,toIsoString:l("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),o=Math.abs(this.minutes()),n=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||o||n?"T":"")+(s?s+"H":"")+(o?o+"M":"")+(n?n+"S":""):"P0D"},localeData:function(){return this._locale}}),De.duration.fn.toString=De.duration.fn.toISOString;for(Ce in ui)a(ui,Ce)&&we(Ce.toLowerCase());De.duration.fn.asMilliseconds=function(){return this.as("ms")},De.duration.fn.asSeconds=function(){return this.as("s")},De.duration.fn.asMinutes=function(){return this.as("m")},De.duration.fn.asHours=function(){return this.as("h")},De.duration.fn.asDays=function(){return this.as("d")},De.duration.fn.asWeeks=function(){return this.as("weeks")},De.duration.fn.asMonths=function(){return this.as("M")},De.duration.fn.asYears=function(){return this.as("y")},De.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ye?o.exports=De:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(Te.moment=Me),De}.call(e,i,e,o),!(s!==n&&(o.exports=s)),Se(!0))}).call(this)}).call(e,function(){return this}(),i(71)(t))},function(t,e,i){var s;!function(o,n){function r(){a.READY||(w.determineEventTypes(),x.each(a.gestures,function(t){D.register(t)}),w.onTouch(a.DOCUMENT,v,D.detect),w.onTouch(a.DOCUMENT,y,D.detect),a.READY=!0)}var a=function M(t,e){return new M.Instance(t,e||{})};a.VERSION="1.1.3",a.defaults={behavior:{userSelect:"none",touchAction:"pan-y",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.DOCUMENT=document,a.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,a.HAS_TOUCHEVENTS="ontouchstart"in o,a.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent),a.NO_MOUSEEVENTS=a.HAS_TOUCHEVENTS&&a.IS_MOBILE||a.HAS_POINTEREVENTS,a.CALCULATE_INTERVAL=25;var h={},d=a.DIRECTION_DOWN="down",l=a.DIRECTION_LEFT="left",c=a.DIRECTION_UP="up",p=a.DIRECTION_RIGHT="right",u=a.POINTER_MOUSE="mouse",m=a.POINTER_TOUCH="touch",f=a.POINTER_PEN="pen",g=a.EVENT_START="start",v=a.EVENT_MOVE="move",y=a.EVENT_END="end",b=a.EVENT_RELEASE="release",_=a.EVENT_TOUCH="touch";a.READY=!1,a.plugins=a.plugins||{},a.gestures=a.gestures||{};var x=a.utils={extend:function(t,e,i){for(var s in e)!e.hasOwnProperty(s)||t[s]!==n&&i||(t[s]=e[s]);return t},on:function(t,e,i){t.addEventListener(e,i,!1)},off:function(t,e,i){t.removeEventListener(e,i,!1)},each:function(t,e,i){var s,o;if("forEach"in t)t.forEach(e,i);else if(t.length!==n){for(s=0,o=t.length;o>s;s++)if(e.call(i,t[s],s,t)===!1)return}else for(s in t)if(t.hasOwnProperty(s)&&e.call(i,t[s],s,t)===!1)return},inStr:function(t,e){return t.indexOf(e)>-1},inArray:function(t,e){if(t.indexOf){var i=t.indexOf(e);return-1===i?!1:i}for(var s=0,o=t.length;o>s;s++)if(t[s]===e)return s;return!1},toArray:function(t){return Array.prototype.slice.call(t,0)},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){var e=[],i=[],s=[],o=[],n=Math.min,r=Math.max;return 1===t.length?{pageX:t[0].pageX,pageY:t[0].pageY,clientX:t[0].clientX,clientY:t[0].clientY}:(x.each(t,function(t){e.push(t.pageX),i.push(t.pageY),s.push(t.clientX),o.push(t.clientY)}),{pageX:(n.apply(Math,e)+r.apply(Math,e))/2,pageY:(n.apply(Math,i)+r.apply(Math,i))/2,clientX:(n.apply(Math,s)+r.apply(Math,s))/2,clientY:(n.apply(Math,o)+r.apply(Math,o))/2})},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return 180*Math.atan2(s,i)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.clientX-e.clientX),s=Math.abs(t.clientY-e.clientY);return i>=s?t.clientX-e.clientX>0?l:p:t.clientY-e.clientY>0?c:d},getDistance:function(t,e){var i=e.clientX-t.clientX,s=e.clientY-t.clientY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==c||t==d},setPrefixedCss:function(t,e,i,s){var o=["","Webkit","Moz","O","ms"];e=x.toCamelCase(e);for(var n=0;n0&&this.started&&(r=v),this.started=!0;var d=this.collectEventData(i,r,o,t);return e!=y&&s.call(D,d),a&&(d.changedLength=h,d.eventType=a,s.call(D,d),d.eventType=r,delete d.changedLength),r==y&&(s.call(D,d),this.started=!1),r},determineEventTypes:function(){var t;return t=a.HAS_POINTEREVENTS?o.PointerEvent?["pointerdown","pointermove","pointerup pointercancel lostpointercapture"]:["MSPointerDown","MSPointerMove","MSPointerUp MSPointerCancel MSLostPointerCapture"]:a.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],h[g]=t[0],h[v]=t[1],h[y]=t[2],h},getTouchList:function(t,e){if(a.HAS_POINTEREVENTS)return S.getTouchList();if(t.touches){if(e==v)return t.touches;var i=[],s=[].concat(x.toArray(t.touches),x.toArray(t.changedTouches)),o=[];return x.each(s,function(t){x.inArray(i,t.identifier)===!1&&o.push(t),i.push(t.identifier)}),o}return t.identifier=1,[t]},collectEventData:function(t,e,i,s){var o=m;return x.inStr(s.type,"mouse")||S.matchType(u,s)?o=u:S.matchType(f,s)&&(o=f),{center:x.getCenter(i),timeStamp:Date.now(),target:s.target,touches:i,eventType:e,pointerType:o,srcEvent:s,preventDefault:function(){var t=this.srcEvent;t.preventManipulation&&t.preventManipulation(),t.preventDefault&&t.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return D.stopDetect()}}}},S=a.PointerEvent={pointers:{},getTouchList:function(){var t=[];return x.each(this.pointers,function(e){t.push(e)}),t},updatePointer:function(t,e){t==y||t!=y&&1!==e.buttons?delete this.pointers[e.pointerId]:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e)},matchType:function(t,e){if(!e.pointerType)return!1;var i=e.pointerType,s={};return s[u]=i===(e.MSPOINTER_TYPE_MOUSE||u),s[m]=i===(e.MSPOINTER_TYPE_TOUCH||m),s[f]=i===(e.MSPOINTER_TYPE_PEN||f),s[t]},reset:function(){this.pointers={}}},D=a.detection={gestures:[],current:null,previous:null,stopped:!1,startDetect:function(t,e){this.current||(this.stopped=!1,this.current={inst:t,startEvent:x.extend({},e),lastEvent:!1,lastCalcEvent:!1,futureCalcEvent:!1,lastCalcData:{},name:""},this.detect(e))},detect:function(t){if(this.current&&!this.stopped){t=this.extendEventData(t);var e=this.current.inst,i=e.options;return x.each(this.gestures,function(s){!this.stopped&&e.enabled&&i[s.name]&&s.handler.call(s,t,e)},this),this.current&&(this.current.lastEvent=t),t.eventType==y&&this.stopDetect(),t}},stopDetect:function(){this.previous=x.extend({},this.current),this.current=null,this.stopped=!0},getCalculatedData:function(t,e,i,s,o){var n=this.current,r=!1,h=n.lastCalcEvent,d=n.lastCalcData;h&&t.timeStamp-h.timeStamp>a.CALCULATE_INTERVAL&&(e=h.center,i=t.timeStamp-h.timeStamp,s=t.center.clientX-h.center.clientX,o=t.center.clientY-h.center.clientY,r=!0),(t.eventType==_||t.eventType==b)&&(n.futureCalcEvent=t),(!n.lastCalcEvent||r)&&(d.velocity=x.getVelocity(i,s,o),d.angle=x.getAngle(e,t.center),d.direction=x.getDirection(e,t.center),n.lastCalcEvent=n.futureCalcEvent||t,n.futureCalcEvent=t),t.velocityX=d.velocity.x,t.velocityY=d.velocity.y,t.interimAngle=d.angle,t.interimDirection=d.direction},extendEventData:function(t){var e=this.current,i=e.startEvent,s=e.lastEvent||i;(t.eventType==_||t.eventType==b)&&(i.touches=[],x.each(t.touches,function(t){i.touches.push({clientX:t.clientX,clientY:t.clientY})}));var o=t.timeStamp-i.timeStamp,n=t.center.clientX-i.center.clientX,r=t.center.clientY-i.center.clientY;return this.getCalculatedData(t,s.center,o,n,r),x.extend(t,{startEvent:i,deltaTime:o,deltaX:n,deltaY:r,distance:x.getDistance(i.center,t.center),angle:x.getAngle(i.center,t.center),direction:x.getDirection(i.center,t.center),scale:x.getScale(i.touches,t.touches),rotation:x.getRotation(i.touches,t.touches)}),t},register:function(t){var e=t.defaults||{};return e[t.name]===n&&(e[t.name]=!0),x.extend(a.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}};a.Instance=function(t,e){var i=this;r(),this.element=t,this.enabled=!0,x.each(e,function(t,i){delete e[i],e[x.toCamelCase(i)]=t}),this.options=x.extend(x.extend({},a.defaults),e||{}),this.options.behavior&&x.toggleBehavior(this.element,this.options.behavior,!0),this.eventStartHandler=w.onTouch(t,g,function(t){i.enabled&&t.eventType==g?D.startDetect(i,t):t.eventType==_&&D.detect(t)}),this.eventHandlers=[]},a.Instance.prototype={on:function(t,e){var i=this;return w.on(i.element,t,e,function(t){i.eventHandlers.push({gesture:t,handler:e})}),i},off:function(t,e){var i=this;return w.off(i.element,t,e,function(t){var s=x.inArray({gesture:t,handler:e});s!==!1&&i.eventHandlers.splice(s,1)}),i},trigger:function(t,e){e||(e={});var i=a.DOCUMENT.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e;var s=this.element;return x.hasParent(e.target,s)&&(s=e.target),s.dispatchEvent(i),this},enable:function(t){return this.enabled=t,this},dispose:function(){var t,e;for(x.toggleBehavior(this.element,this.options.behavior,!1),t=-1;e=this.eventHandlers[++t];)x.off(this.element,e.gesture,e.handler);return this.eventHandlers=[],w.off(this.element,h[g],this.eventStartHandler),null}},function(t){function e(e,s){var o=D.current;if(!(s.options.dragMaxTouches>0&&e.touches.length>s.options.dragMaxTouches))switch(e.eventType){case g:i=!1;break;case v:if(e.distance0)){var r=Math.abs(s.options.dragMinDistance/e.distance);n.pageX+=e.deltaX*r,n.pageY+=e.deltaY*r,n.clientX+=e.deltaX*r,n.clientY+=e.deltaY*r,e=D.extendEventData(e)}(o.lastEvent.dragLockToAxis||s.options.dragLockToAxis&&s.options.dragLockMinDistance<=e.distance)&&(e.dragLockToAxis=!0);var a=o.lastEvent.direction;e.dragLockToAxis&&a!==e.direction&&(e.direction=x.isVertical(a)?e.deltaY<0?c:d:e.deltaX<0?l:p),i||(s.trigger(t+"start",e),i=!0),s.trigger(t,e),s.trigger(t+e.direction,e);var h=x.isVertical(e.direction);(s.options.dragBlockVertical&&h||s.options.dragBlockHorizontal&&!h)&&e.preventDefault();break;case b:i&&e.changedLength<=s.options.dragMaxTouches&&(s.trigger(t+"end",e),i=!1);break;case y:i=!1}}var i=!1;a.gestures.Drag={name:t,index:50,handler:e,defaults:{dragMinDistance:10,dragDistanceCorrection:!0,dragMaxTouches:1,dragBlockHorizontal:!1,dragBlockVertical:!1,dragLockToAxis:!1,dragLockMinDistance:25}}}("drag"),a.gestures.Gesture={name:"gesture",index:1337,handler:function(t,e){e.trigger(this.name,t)}},function(t){function e(e,s){var o=s.options,n=D.current;switch(e.eventType){case g:clearTimeout(i),n.name=t,i=setTimeout(function(){n&&n.name==t&&s.trigger(t,e)},o.holdTimeout);break;case v:e.distance>o.holdThreshold&&clearTimeout(i);break;case b:clearTimeout(i)}}var i;a.gestures.Hold={name:t,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:e}}("hold"),a.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==b&&e.trigger(this.name,t)}},a.gestures.Swipe={name:"swipe",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function(t,e){if(t.eventType==b){var i=t.touches.length,s=e.options;if(is.swipeMaxTouches)return;(t.velocityX>s.swipeVelocityX||t.velocityY>s.swipeVelocityY)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},function(t){function e(e,s){var o,n,r=s.options,a=D.current,h=D.previous;switch(e.eventType){case g:i=!1;break;case v:i=i||e.distance>r.tapMaxDistance;break;case y:!x.inStr(e.srcEvent.type,"cancel")&&e.deltaTimes.options.transformMinRotation&&s.trigger("rotate",e),o>s.options.transformMinScale&&(s.trigger("pinch",e),s.trigger("pinch"+(e.scale<1?"in":"out"),e));break;case b:i&&e.changedLength<2&&(s.trigger(t+"end",e),i=!1)}}var i=!1;a.gestures.Transform={name:t,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:e}}("transform"),s=function(){return a}.call(e,i,e,t),!(s!==n&&(t.exports=s))}(window)},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,o=0;i>t&&s>o;)o%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,o+=1;o>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var o=this.moving,n=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=n.from,a=n.to;n.to.options.mass>n.from.options.mass&&(r=n.to,a=n.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.options.mass>e.options.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;so.clusterSessions.length&&(e=o.clusterSessions.length,i=o)}null!=o&&void 0!==this.nodes[o.id]&&this._addToCluster(o,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var o,n,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var p=this.edges[d[c]];if(void 0!==p&&p.connected&&p.toId!=p.fromId&&(o=p.to.x-p.from.x,n=p.to.y-p.from.y,r=Math.sqrt(o*o+n*n),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(p=this.edges[d[c]],void 0!==p){var u=this.nodes[p.fromId==t.id?p.toId:p.fromId];u.dynamicEdges.length<=this.hubThreshold+s&&u.id!=t.id&&this._addToCluster(t,u,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var o=this.nodeIndices.length,n=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=n.dynamicEdgesLength),t+=n.dynamicEdgesLength,e+=Math.pow(n.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1),o=i(40);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new o({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](o[0],o[1]):this[t](e))}return this._loadLatestSector(),i},e._doInSupportSector=function(t,e){var i=!1;if(void 0===e)this._switchToSupportSector(),i=this[t]();else{this._switchToSupportSector();var s=Array.prototype.splice.call(arguments,1);i=s.length>1?this[t](s[0],s[1]):this[t](e)}return this._loadLatestSector(),i},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,o=-1e9,n=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,o=-1e9,n=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),n>i.x-.5*i.width&&(n=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),o0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ei;i++){o=t[i];var n=this.nodes[o];if(!n)throw new RangeError('Node with id "'+o+'" not found');this._selectObject(n,!0,!0,e,!0)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var o=this.edges[s];if(!o)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(o,!0,!0,!1,!0)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),o=i(40),n=i(37);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM={},this._manipulationReleaseOverload=function(){},delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode,this.controlNodesActive=!1},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=this.manipulationDiv,e=this.closeDiv,i=this.editModeDiv;1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];if(void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,this.manipulationDOM={},1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDOM.addNodeSpan=document.createElement("span"),this.manipulationDOM.addNodeSpan.className="network-manipulationUI add",this.manipulationDOM.addNodeLabelSpan=document.createElement("span"),this.manipulationDOM.addNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addNodeLabelSpan.innerHTML=t.addNode,this.manipulationDOM.addNodeSpan.appendChild(this.manipulationDOM.addNodeLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.addEdgeSpan=document.createElement("span"),this.manipulationDOM.addEdgeSpan.className="network-manipulationUI connect",this.manipulationDOM.addEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.addEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.addEdgeLabelSpan.innerHTML=t.addEdge,this.manipulationDOM.addEdgeSpan.appendChild(this.manipulationDOM.addEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.addNodeSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.addEdgeSpan),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?(this.manipulationDOM.seperatorLineDiv2=document.createElement("div"),this.manipulationDOM.seperatorLineDiv2.className="network-seperatorLine",this.manipulationDOM.editNodeSpan=document.createElement("span"),this.manipulationDOM.editNodeSpan.className="network-manipulationUI edit",this.manipulationDOM.editNodeLabelSpan=document.createElement("span"),this.manipulationDOM.editNodeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editNodeLabelSpan.innerHTML=t.editNode,this.manipulationDOM.editNodeSpan.appendChild(this.manipulationDOM.editNodeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv2),this.manipulationDiv.appendChild(this.manipulationDOM.editNodeSpan)):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.seperatorLineDiv3=document.createElement("div"),this.manipulationDOM.seperatorLineDiv3.className="network-seperatorLine",this.manipulationDOM.editEdgeSpan=document.createElement("span"),this.manipulationDOM.editEdgeSpan.className="network-manipulationUI edit",this.manipulationDOM.editEdgeLabelSpan=document.createElement("span"),this.manipulationDOM.editEdgeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editEdgeLabelSpan.innerHTML=t.editEdge,this.manipulationDOM.editEdgeSpan.appendChild(this.manipulationDOM.editEdgeLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv3),this.manipulationDiv.appendChild(this.manipulationDOM.editEdgeSpan)),0==this._selectionIsEmpty()&&(this.manipulationDOM.seperatorLineDiv4=document.createElement("div"),this.manipulationDOM.seperatorLineDiv4.className="network-seperatorLine",this.manipulationDOM.deleteSpan=document.createElement("span"),this.manipulationDOM.deleteSpan.className="network-manipulationUI delete",this.manipulationDOM.deleteLabelSpan=document.createElement("span"),this.manipulationDOM.deleteLabelSpan.className="network-manipulationLabel",this.manipulationDOM.deleteLabelSpan.innerHTML=t.del,this.manipulationDOM.deleteSpan.appendChild(this.manipulationDOM.deleteLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv4),this.manipulationDiv.appendChild(this.manipulationDOM.deleteSpan)),this.manipulationDOM.addNodeSpan.onclick=this._createAddNodeToolbar.bind(this),this.manipulationDOM.addEdgeSpan.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDOM.editNodeSpan.onclick=this._editNode.bind(this):1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDOM.editEdgeSpan.onclick=this._createEditEdgeToolbar.bind(this)),0==this._selectionIsEmpty()&&(this.manipulationDOM.deleteSpan.onclick=this._deleteSelected.bind(this)),this.closeDiv.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{for(;this.editModeDiv.hasChildNodes();)this.editModeDiv.removeChild(this.editModeDiv.firstChild);this.manipulationDOM.editModeSpan=document.createElement("span"),this.manipulationDOM.editModeSpan.className="network-manipulationUI edit editmode",this.manipulationDOM.editModeLabelSpan=document.createElement("span"),this.manipulationDOM.editModeLabelSpan.className="network-manipulationLabel",this.manipulationDOM.editModeLabelSpan.innerHTML=t.edit,this.manipulationDOM.editModeSpan.appendChild(this.manipulationDOM.editModeLabelSpan),this.editModeDiv.appendChild(this.manipulationDOM.editModeSpan),this.manipulationDOM.editModeSpan.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction);var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.addDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0;var t=this.constants.locales[this.constants.locale];this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.edgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleDragEnd=this._handleDragEnd,this._handleTouch=this._handleConnect,this._manipulationReleaseOverload=function(){},this._handleDragStart=function(){},this._handleDragEnd=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes();var t=this.constants.locales[this.constants.locale];this.manipulationDOM={},this.manipulationDOM.backSpan=document.createElement("span"),this.manipulationDOM.backSpan.className="network-manipulationUI back",this.manipulationDOM.backLabelSpan=document.createElement("span"),this.manipulationDOM.backLabelSpan.className="network-manipulationLabel",this.manipulationDOM.backLabelSpan.innerHTML=t.back,this.manipulationDOM.backSpan.appendChild(this.manipulationDOM.backLabelSpan),this.manipulationDOM.seperatorLineDiv1=document.createElement("div"),this.manipulationDOM.seperatorLineDiv1.className="network-seperatorLine",this.manipulationDOM.descriptionSpan=document.createElement("span"),this.manipulationDOM.descriptionSpan.className="network-manipulationUI none",this.manipulationDOM.descriptionLabelSpan=document.createElement("span"),this.manipulationDOM.descriptionLabelSpan.className="network-manipulationLabel",this.manipulationDOM.descriptionLabelSpan.innerHTML=t.editEdgeDescription,this.manipulationDOM.descriptionSpan.appendChild(this.manipulationDOM.descriptionLabelSpan),this.manipulationDiv.appendChild(this.manipulationDOM.backSpan),this.manipulationDiv.appendChild(this.manipulationDOM.seperatorLineDiv1),this.manipulationDiv.appendChild(this.manipulationDOM.descriptionSpan),this.manipulationDOM.backSpan.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._manipulationReleaseOverload=this._manipulationReleaseOverload,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._manipulationReleaseOverload=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);if(null!=e)if(e.clusterSize>1)alert(this.constants.locales[this.constants.locale].createEdgeError);else{this._selectObject(e,!1);var i=this.sectors.support.nodes;i.targetNode=new o({id:"targetNode"},{},{},this.constants);var s=i.targetNode;s.x=e.x,s.y=e.y,this.edges.connectionEdge=new n({id:"connectionEdge",from:e.id,to:s.id},this,this.constants);var r=this.edges.connectionEdge;r.from=e,r.connected=!0,r.options.smoothCurves={enabled:!0,dynamic:!1,type:"continuous",roundness:.5},r.selected=!0,r.to=s,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center),i=this.edges.connectionEdge;i.to.x=this._XconvertDOMtoCanvas(e.x),i.to.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()}}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){var e=this._getPointer(t.gesture.center);this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var i=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var s=this._getNodeAt(e);null!=s&&(s.clusterSize>1?alert(this.constants.locales[this.constants.locale].createEdgeError):(this._createEdge(i,s.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add){if(2!=this.triggerFunctions.add.length)throw new Error("The function for add does not support two arguments (data,callback)");var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect){if(2!=this.triggerFunctions.connect.length)throw new Error("The function for connect does not support two arguments (data,callback)");var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge){if(2!=this.triggerFunctions.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(!this.triggerFunctions.edit||1!=this.editMode)throw new Error("No edit function has been bound to this button");var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.options.group,shape:t.options.shape,color:{background:t.options.color.background,border:t.options.color.border,highlight:{background:t.options.color.highlight.background,border:t.options.color.highlight.border}}}; +if(2!=this.triggerFunctions.edit.length)throw new Error("The function for edit does not support two arguments (data, callback)");var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.locales[this.constants.locale].deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};if(!(this.triggerFunctions.del.length=2))throw new Error("The function for delete does not support two arguments (data, callback)");this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()})}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e,i){var s=(i(1),i(45));e._cleanNavigation=function(){if(0!=this.navigationHammers.existing.length){for(var t=0;t0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,o=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:o=!0,is&&(n.xFixed=!1,n.x=i[n.level].minPos,r=!0):n.yFixed&&n.level>s&&(n.yFixed=!1,n.y=i[n.level].minPos,r=!0),1==r&&(i[n.level].minPos+=i[n.level].nodeSpacing,n.edges.length>1&&this._placeBranchNodes(n.edges,n.id,i,n.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(o.level=t,o.edges.length>1&&this._setLevel(t+1,o.edges,o.id))}},e._setLevelDirected=function(t,e,i){this.nodes[i].hierarchyEnumerated=!0;for(var s=0;s1&&o.hierarchyEnumerated===!1&&this._setLevelDirected(o.level,o.edges,o.id)}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function o(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?(this._setupHierarchicalLayout(),a.call(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),a.call(this,"graph_H_cg",1,"physics_centralGravity"),a.call(this,"graph_H_sc",1,"physics_springConstant"),a.call(this,"graph_H_sl",1,"physics_springLength"),a.call(this,"graph_H_damp",1,"physics_damping")):this.repositionNodes(),this.moving=!0,this.start()}function n(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var o=0;othis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.physics.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,o,n=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(o=0;oSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),p=document.getElementById("graph_repositionNodes"),u=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),p.onclick=o.bind(this),u.onclick=n.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t){function e(t){throw new Error("Cannot find module '"+t+"'.")}e.keys=function(){return[]},e.resolve=e,t.exports=e,e.id=67},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l,c=this.calculationNodes,p=this.calculationNodeIndices,u=-2/3,m=4/3,f=this.constants.physics.repulsion.nodeDistance,g=f;for(d=0;di&&(r=.5*g>i?1:v*i+m,r*=0==n?1:1+n*this.constants.clustering.forceAmplification,r/=i,s=t*r,o=e*r,a.fx-=s,a.fy-=o,h.fx+=s,h.fy+=o)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,o,n,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,p=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(h=0;hi?-Math.pow(u*i,2)+Math.pow(u*p,2):0,0==i?i=.01:n/=i,s=t*n,o=e*n,r.fx-=s,r.fy-=o,a.fx+=s,a.fy+=o}},e._calculateHierarchicalSpringForces=function(){for(var t,e,i,s,o,n,r,a,h,d=this.edges,l=this.calculationNodes,c=this.calculationNodeIndices,p=0;pn;n++)t=e[i[n]],t.options.mass>0&&(this._getForceContribution(o.root.children.NW,t),this._getForceContribution(o.root.children.NE,t),this._getForceContribution(o.root.children.SW,t),this._getForceContribution(o.root.children.SE,t))}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,o;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,o=Math.sqrt(i*i+s*s),o*t.calcSize>this.constants.physics.barnesHut.theta){0==o&&(o=.1*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==o&&(o=.5*Math.random(),i=o);var n=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.options.mass/(o*o*o),r=i*n,a=s*n;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,o=Number.MAX_VALUE,n=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(o>d&&(o=d),d>r&&(r=d),n>l&&(n=l),l>a&&(a=l))}var c=Math.abs(r-o)-Math.abs(a-n);c>0?(n-=.5*c,a+=.5*c):(o+=.5*c,r-=.5*c);var p=1e-5,u=Math.max(p,Math.abs(r-o)),m=.5*u,f=.5*(o+r),g=.5*(n+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:f-m,maxX:f+m,minY:g-m,maxY:g+m},size:u,calcSize:1/u,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(v.root,i);this.barnesHutTree=v},e._updateBranchMass=function(t,e){var i=t.mass+e.options.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=s,t.mass=i;var o=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,o,n,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY,n=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY,n=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,o=t.range.minY+r,n=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,o=t.range.minY+r,n=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:n},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); //# sourceMappingURL=vis.map diff --git a/lib/graph3d/Camera.js b/lib/graph3d/Camera.js index d758f6fc..1468370e 100644 --- a/lib/graph3d/Camera.js +++ b/lib/graph3d/Camera.js @@ -10,7 +10,7 @@ var Point3d = require('./Point3d'); * Documentation: * http://en.wikipedia.org/wiki/3D_projection */ -Camera = function () { +function Camera() { this.armLocation = new Point3d(); this.armRotation = {}; this.armRotation.horizontal = 0; @@ -21,7 +21,7 @@ Camera = function () { this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); this.calculateCameraOrientation(); -}; +} /** * Set the location (origin) of the arm diff --git a/lib/graph3d/Graph3d.js b/lib/graph3d/Graph3d.js index 9031aeaf..a94b89b0 100644 --- a/lib/graph3d/Graph3d.js +++ b/lib/graph3d/Graph3d.js @@ -525,9 +525,9 @@ Graph3d.prototype._getDataPoints = function (data) { } } - function sortNumber(a, b) { + var sortNumber = function (a, b) { return a - b; - } + }; dataX.sort(sortNumber); dataY.sort(sortNumber); @@ -2260,19 +2260,19 @@ Graph3d.prototype._hideTooltip = function () { * @param {Event} event * @return {Number} mouse x */ -getMouseX = function(event) { +function getMouseX (event) { if ('clientX' in event) return event.clientX; return event.targetTouches[0] && event.targetTouches[0].clientX || 0; -}; +} /** * Get the vertical mouse position from a mouse event * @param {Event} event * @return {Number} mouse y */ -getMouseY = function(event) { +function getMouseY (event) { if ('clientY' in event) return event.clientY; return event.targetTouches[0] && event.targetTouches[0].clientY || 0; -}; +} module.exports = Graph3d; diff --git a/lib/graph3d/Point2d.js b/lib/graph3d/Point2d.js index feec858e..c247e020 100644 --- a/lib/graph3d/Point2d.js +++ b/lib/graph3d/Point2d.js @@ -3,9 +3,9 @@ * @param {Number} [x] * @param {Number} [y] */ -Point2d = function (x, y) { +function Point2d (x, y) { this.x = x !== undefined ? x : 0; this.y = y !== undefined ? y : 0; -}; +} module.exports = Point2d; diff --git a/lib/header.js b/lib/header.js index 3d03a1a6..2c8a3431 100644 --- a/lib/header.js +++ b/lib/header.js @@ -22,3 +22,5 @@ * * Vis.js may be distributed under either license. */ + +"use strict"; diff --git a/lib/network/Network.js b/lib/network/Network.js index 7cef953f..90f02f79 100644 --- a/lib/network/Network.js +++ b/lib/network/Network.js @@ -219,7 +219,7 @@ function Network (container, data, options) { this.hoverObj = {nodes:{},edges:{}}; this.controlNodesActive = false; - this.navigationHammers = {existing:[], new: []}; + this.navigationHammers = {existing:[], _new: []}; // animation properties this.animationSpeed = 1/this.renderRefreshRate; diff --git a/lib/network/dotparser.js b/lib/network/dotparser.js index af8439c6..9dd5bc14 100644 --- a/lib/network/dotparser.js +++ b/lib/network/dotparser.js @@ -761,7 +761,7 @@ function DOTToGraph (data) { * @param {Object} dotEdge * @returns {Object} graphEdge */ - function convertEdge(dotEdge) { + var convertEdge = function (dotEdge) { var graphEdge = { from: dotEdge.from, to: dotEdge.to diff --git a/lib/network/mixins/NavigationMixin.js b/lib/network/mixins/NavigationMixin.js index 4736f2a0..01d92b51 100644 --- a/lib/network/mixins/NavigationMixin.js +++ b/lib/network/mixins/NavigationMixin.js @@ -43,12 +43,12 @@ exports._loadNavigationElements = function() { var hammer = Hammer(this.navigationDivs[navigationDivs[i]], {prevent_default: true}); hammer.on('touch', this[navigationDivActions[i]].bind(this)); - this.navigationHammers.new.push(hammer); + this.navigationHammers._new.push(hammer); } this._navigationReleaseOverload = this._stopMovement; - this.navigationHammers.existing = this.navigationHammers.new; + this.navigationHammers.existing = this.navigationHammers._new; }; diff --git a/lib/timeline/Range.js b/lib/timeline/Range.js index 40157a0f..5a6bbb00 100644 --- a/lib/timeline/Range.js +++ b/lib/timeline/Range.js @@ -127,7 +127,7 @@ Range.prototype.setRange = function(start, end, animate) { var initTime = new Date().valueOf(); var anyChanged = false; - function next() { + var next = function () { if (!me.props.touch.dragging) { var now = new Date().valueOf(); var time = now - initTime;