diff --git a/config/custom_components/neerslag/__init__.py b/config/custom_components/neerslag/__init__.py new file mode 100644 index 0000000..2e9642d --- /dev/null +++ b/config/custom_components/neerslag/__init__.py @@ -0,0 +1,81 @@ +"""The Neerslag Sensor (Buienalarm / Buienradar) integration.""" +import asyncio +from .load_frontend import setup_view +import logging + +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant + +from .const import DOMAIN + +# TODO List the platforms that you want to support. +# For your initial PR, limit it to 1 platform. +PLATFORMS = ["sensor"] + +_LOGGER = logging.getLogger(__name__) + + +async def options_update_listener(hass: HomeAssistant, config_entry: ConfigEntry): + """Handle options update.""" + + _LOGGER.info("----------------This is being executed-------options_update_listener----------------") + # await hass.config_entries.async_remove(config_entry.entry_id) + # rr = hass.config_entries.async_entries(DOMAIN) + # hass.config_entries.async_update_entry(config_entry, data=config_entry.options) + # await hass.config_entries.async_reload(config_entry.entry_id) + hass.config_entries.async_update_entry(config_entry, data=config_entry.options) + + +async def async_setup(hass: HomeAssistant, config_entry: dict): + """Set up the Neerslag Sensor (Buienalarm / Buienradar) component.""" + hass.data.setdefault(DOMAIN, {}) + setup_view(hass) + + return True + + +async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry): + """Set up Neerslag Sensor (Buienalarm / Buienradar) from a config entry.""" + + # hass.states.async_set("neerslag_sensor.useBuienalarm", ConfigEntry.) + + # TODO Store an API object for your platforms to access + # hass.data[DOMAIN][entry.entry_id] = MyApi(...) + hass.data[DOMAIN][config_entry.entry_id] = {} + + hass_data = dict(config_entry.data) + # Registers update listener to update config entry when options are updated. + unsub_options_update_listener = config_entry.add_update_listener(options_update_listener) + # Store a reference to the unsubscribe function to cleanup if an entry is unloaded. + hass_data["unsub_options_update_listener"] = unsub_options_update_listener + hass.data[DOMAIN][config_entry.entry_id] = hass_data + + for platform in PLATFORMS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(config_entry, platform) + ) + + return True + + +async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry): + # Remove options_update_listener. + + _LOGGER.info("REMOVE ><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") + + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(config_entry, platform) + for platform in PLATFORMS + ] + ) + ) + + hass.data[DOMAIN][config_entry.entry_id]["unsub_options_update_listener"]() + + if unload_ok: + hass.data[DOMAIN].pop(config_entry.entry_id) + + return unload_ok diff --git a/config/custom_components/neerslag/__pycache__/__init__.cpython-38.pyc b/config/custom_components/neerslag/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..f8c7f7b Binary files /dev/null and b/config/custom_components/neerslag/__pycache__/__init__.cpython-38.pyc differ diff --git a/config/custom_components/neerslag/__pycache__/config_flow.cpython-38.pyc b/config/custom_components/neerslag/__pycache__/config_flow.cpython-38.pyc new file mode 100644 index 0000000..b04d954 Binary files /dev/null and b/config/custom_components/neerslag/__pycache__/config_flow.cpython-38.pyc differ diff --git a/config/custom_components/neerslag/__pycache__/const.cpython-38.pyc b/config/custom_components/neerslag/__pycache__/const.cpython-38.pyc new file mode 100644 index 0000000..42f38d0 Binary files /dev/null and b/config/custom_components/neerslag/__pycache__/const.cpython-38.pyc differ diff --git a/config/custom_components/neerslag/__pycache__/load_frontend.cpython-38.pyc b/config/custom_components/neerslag/__pycache__/load_frontend.cpython-38.pyc new file mode 100644 index 0000000..62e1f1e Binary files /dev/null and b/config/custom_components/neerslag/__pycache__/load_frontend.cpython-38.pyc differ diff --git a/config/custom_components/neerslag/__pycache__/sensor.cpython-38.pyc b/config/custom_components/neerslag/__pycache__/sensor.cpython-38.pyc new file mode 100644 index 0000000..d736d4b Binary files /dev/null and b/config/custom_components/neerslag/__pycache__/sensor.cpython-38.pyc differ diff --git a/config/custom_components/neerslag/config_flow.py b/config/custom_components/neerslag/config_flow.py new file mode 100644 index 0000000..c7096ae --- /dev/null +++ b/config/custom_components/neerslag/config_flow.py @@ -0,0 +1,144 @@ +"""Config flow for Neerslag Sensor (Buienalarm / Buienradar) integration.""" +import logging +from typing import Optional + +import voluptuous as vol +from homeassistant.core import callback + +from homeassistant import config_entries, core, exceptions + +from .const import DOMAIN # pylint:disable=unused-import + +_LOGGER = logging.getLogger(__name__) + +# TODO adjust the data schema to the data that you need +STEP_USER_DATA_SCHEMA = vol.Schema({vol.Optional("buienalarm", default=False): bool, + vol.Optional("buienalarmLatitude", description={"suggested_value": "55.000"}): str, + vol.Optional("buienalarmLongitude", description={"suggested_value": "5.000"}): str, + vol.Optional("buienradar", default=False): bool, + vol.Optional("buienradarLatitude", description={"suggested_value": "55.00"}): str, + vol.Optional("buienradarLongitude", description={"suggested_value": "5.00"}): str, + vol.Optional("NeerslagSensorUseHAforLocation", default=True): bool + }) + + +async def validate_input(hass: core.HomeAssistant, data): + """Validate the user input allows us to connect. + + Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user. + """ + # TODO validate the data can be used to set up a connection. + + # If your PyPI package is not built with async, pass your methods + # to the executor: + # await hass.async_add_executor_job( + # your_validate_func, data["username"], data["password"] + # ) + + # hub = PlaceholderHub(data["host"]) + + # if not await hub.authenticate(data["username"], data["password"]): + # raise InvalidAuth + + # If you cannot connect: + # throw CannotConnect + # If the authentication is wrong: + # InvalidAuth + + # Return info that you want to store in the config entry. + return {"title": "Neerslag"} + + +class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow for Neerslag Sensor (Buienalarm / Buienradar).""" + + VERSION = 1 + # TODO pick one of the available connection classes in homeassistant/config_entries.py + CONNECTION_CLASS = config_entries.CONN_CLASS_UNKNOWN + + async def async_step_user(self, user_input=None): + """Handle the initial step.""" + + if self._async_current_entries(): + return self.async_abort(reason="single_instance_allowed") + if self.hass.data.get(DOMAIN): + return self.async_abort(reason="single_instance_allowed") + + if user_input is None: + return self.async_show_form( + step_id="user", data_schema=STEP_USER_DATA_SCHEMA + ) + + errors = {} + + try: + # info = await validate_input(self.hass, user_input) + title = "Neerslag App" + data = user_input + # _LOGGER.info("Dit wordt nu uitgevoerd...........") + # _LOGGER.info(data) + + except CannotConnect: + errors["base"] = "cannot_connect" + except InvalidAuth: + errors["base"] = "invalid_auth" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + else: + return self.async_create_entry(title=title, data=data) + + return self.async_show_form( + step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors + ) + + @staticmethod + @callback + def async_get_options_flow(config_entry): + """Get the options flow for this handler.""" + return OptionsFlowHandler(config_entry) + + +class OptionsFlowHandler(config_entries.OptionsFlow): + + def __init__(self, config_entry: config_entries.ConfigEntry) -> None: + self.config_entry = config_entry + + async def async_step_init(self, user_input=None): + + # _LOGGER.info("HIER>>>") + # _LOGGER.info(self.config_entry.data.get("buienalarmLatitude")) + # _LOGGER.info(self.config_entry.data.get("buienalarm")) + # _LOGGER.info(self.config_entry.data.get("NeerslagSensorUseHAforLocation")) + testtest = vol.Schema({vol.Optional("buienalarm", default=self.config_entry.data.get("buienalarm")): bool, + vol.Optional("buienalarmLatitude", default=self.config_entry.data.get("buienalarmLatitude")): str, + vol.Optional("buienalarmLongitude", default=self.config_entry.data.get("buienalarmLongitude")): str, + vol.Optional("buienradar", default=self.config_entry.data.get("buienradar")): bool, + vol.Optional("buienradarLatitude", default=self.config_entry.data.get("buienradarLatitude")): str, + vol.Optional("buienradarLongitude", default=self.config_entry.data.get("buienradarLongitude")): str, + vol.Optional("NeerslagSensorUseHAforLocation", default=self.config_entry.data.get("NeerslagSensorUseHAforLocation")): bool + }) + + # _LOGGER.info("----->>>>---------------") + # _LOGGER.info(self.config_entry.options) + # _LOGGER.info(self.config_entry.data) + # _LOGGER.info("------<<<<--------------") + """Manage the options.""" + if user_input is not None: + # _LOGGER.info(user_input) + # _LOGGER.info("<><><><><><><><><><>") + # self.config_entry.data = user_input + return self.async_create_entry(title="", data=user_input) + + return self.async_show_form( + step_id="init", + data_schema=testtest, + ) + + +class CannotConnect(exceptions.HomeAssistantError): + """Error to indicate we cannot connect.""" + + +class InvalidAuth(exceptions.HomeAssistantError): + """Error to indicate there is invalid auth.""" diff --git a/config/custom_components/neerslag/const.py b/config/custom_components/neerslag/const.py new file mode 100644 index 0000000..d3af6ae --- /dev/null +++ b/config/custom_components/neerslag/const.py @@ -0,0 +1,7 @@ +"""Constants for the Neerslag Sensor (Buienalarm / Buienradar) integration.""" + +DOMAIN = "neerslag" + + +FRONTEND_SCRIPT_URL = "/neerslag-card.js" +DATA_EXTRA_MODULE_URL = 'frontend_extra_module_url' diff --git a/config/custom_components/neerslag/home-assistant-neerslag-card/neerslag-card.js b/config/custom_components/neerslag/home-assistant-neerslag-card/neerslag-card.js new file mode 100644 index 0000000..12679ec --- /dev/null +++ b/config/custom_components/neerslag/home-assistant-neerslag-card/neerslag-card.js @@ -0,0 +1,721 @@ +customElements.whenDefined("home-assistant-main").then(() => { + // All your code goes here + + + const LitElement = customElements.get("home-assistant-main") + ? Object.getPrototypeOf(customElements.get("home-assistant-main")) + : Object.getPrototypeOf(customElements.get("hui-view")); + const html = LitElement.prototype.html; + const css = LitElement.prototype.css; + + // class CombiCardEditor extends LitElement { + + // setConfig(config) { + // this._config = config; + // } + + // configChanged(newConfig) { + // const event = new Event("config-changed", { + // bubbles: true, + // composed: true + // }); + // event.detail = {config: newConfig}; + // this.dispatchEvent(event); + // } + // } + + setTimeout(function(){ + + class CombiCard extends LitElement { + + static get properties() { + return { + hass: {}, + _config: {}, + myChart: {} + }; + } + + static getStubConfig() { + return { + entity: "sensor.neerslag_buienalarm_regen_data", + title: "Neerslag" + } + } + + // static getConfigElement() { + // return document.createElement("combi-card-editor"); + // } + + static get styles() { + return css` + ha-card { + position: relative; + } + ha-icon { + position: absolute; + top: 30px; + right: 40px; + } + #plotGraphCard { + padding: 0px 16px 16px 16px; + } + `; + } + + setConfig(config) { + + //console.log("setConfig"); + if (!config.entity && !config.entities) { + throw new Error('You need to define an entity or entities list'); + } + this._config = config; + } + + getCardSize() { + return 2; + } + + render() { + + if (!this._config || !this.hass) { + return html``; + } + + let stateObj; + const stateMultiObj = []; + + if (this._config.entity) { + stateObj = this.hass.states[this._config.entity]; + } + if (this._config.entities) { + this._config.entities.forEach(value => { + stateMultiObj.push(this.hass.states[value]); + }) + } + + // Display "No Entity or Entities found card" + if (!stateObj && !stateMultiObj) { + return html` + + +

${this._config.title}

+ +
+ Entity or Entities not available. +
+ +
+ `; + } + + /* + // Display "No Sensor Data card" + if (!stateObj && !stateMultiObj) { + if(this.hass.states[this._config.entity].attributes.data === "") { + this.dontMakeGraph = true + return html` + +

${this._config.title}

+ + +
+
+
No sensor data available
+
+
+ +
+ ` + } + } + */ + + this.dontMakeGraph = false; + // Display "Plot a graph card" + return html` + + +

${this._config.title}

+ +
+
+ +
+
+ + +
+ `; + } + + firstUpdated(changedProperties) { + + // changedProperties.forEach((oldValue, propName) => { + // console.log(`${propName} changed. oldValue: ${oldValue}`); + // }); + this.makeGraph(); + if (this.myChart.width === 0) { + //console.log("firstUpdated: chart is niet zichtbaar!"); + this.myChart.resize(); + } + + //document.addEventListener('resize',this.test()); + + } + + test() { + //console.log("jaa wordt afgevuurd"); + } + + updated(changedProperties) { + //console.log(changedProperties) + if (this.myChart) { + if (this.myChart.width === 0) { + //console.log("updated(): chart is no visible!"); + this.myChart.resize(); + } + } + + changedProperties.forEach((oldValue, propName) => { + //console.log(propName) + if (propName == "hass") { + + // when using single entity + if (this._config.entity) { + //console.log(this._config.entity); + if (this.hass.states[this._config.entity].attributes.data !== oldValue.states[this._config.entity].attributes.data) { + + //console.log("data has changed, lets update") + this.updateGrafiek() + } + } + + //when using multiple entities + if (this._config.entities) { + for (const entity of this._config.entities) { + //console.log(entity) + if (this.hass.states[entity].attributes.data !== oldValue.states[entity].attributes.data) { + + //console.log("data has changed, lets update") + this.updateGrafiek() + } + } + } + } + }); + } + + makeGraph() { + + // console.log("makeGraph"); + + if (this.dontMakeGraph) { + this.dontMakeGraph = false; + return; + } + + if (!this.myChart) { + let ctx; + if (this.shadowRoot) { + ctx = this.shadowRoot.getElementById("aChart").getContext('2d'); + //ctx = this.shadowRoot.querySelector("#aChart").getContext('2d'); + } + + if (ctx) { + + Chart.defaults.global.animation.duration = 0; + Chart.defaults.global.animation.easing = "easeOutCirc"; + + var originalLineDraw = Chart.controllers.line.prototype.draw; + Chart.helpers.extend(Chart.controllers.line.prototype, { + draw: function () { + originalLineDraw.apply(this, arguments); + + var chart = this.chart; + ctx = chart.chart.ctx; + + if (this.chart.tooltip._active && this.chart.tooltip._active.length) { + var activePoint = this.chart.tooltip._active[0]; + var ctx = this.chart.ctx; + var x = activePoint.tooltipPosition().x; + var topY = this.chart.scales['y-axis-0'].top; + var bottomY = this.chart.scales['y-axis-0'].bottom; + + // draw line + ctx.save(); + ctx.beginPath(); + ctx.moveTo(x, topY); + ctx.lineTo(x, bottomY); + ctx.lineWidth = 0.5; + ctx.strokeStyle = '#eeeeee'; + ctx.stroke(); + ctx.restore(); + } + } + }); + + this.myChart = new Chart(ctx, { + type: 'line', + data: { + labels: this.prepareChartDataSets().getChartsDataAlsArray()[0][0], + datasets: this.prepareChartDataSets().getChartDatasets() + }, + options: { + tooltipTemplate: "<%if (label){%><%=label %>: <%}%><%= value + ' %' %>", + tooltips: { + axis: 'x', + intersect: false, + custom: function (tooltip) { + if (!tooltip) return; + // disable displaying the color box; + tooltip.displayColors = false; + }, + callbacks: { + label: function (tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + label += tooltipItem.yLabel.toFixed(2) + " mm/u"; + return label; + } + } + }, + responsive: true, + maintainAspectRatio: true, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + }, + legend: { + display: false + }, + elements: { + point: { + radius: 0 + } + }, + scales: { + xAxes: [{ + scaleLabel: { + display: true, + labelString: 'Regenval voorspelling' + }, + gridLines: { + display: true + }, + ticks: { + autoSkip: true, + maxTicksLimit: 12, + display: "top", + mirror: true, + } + }], + yAxes: [{ + scaleLabel: { + display: true, + labelString: 'Regen (mm / uur)' + }, + gridLines: { + display: true + }, + afterTickToLabelConversion: function (scaleInstance) { + // set the first and last tick to null so it does not display + // note, ticks[0] is the last tick and ticks[length - 1] is the first + scaleInstance.ticks[scaleInstance.ticks.length - 1] = null; + // need to do the same thing for this similiar array which is used internally + scaleInstance.ticksAsNumbers[scaleInstance.ticksAsNumbers.length - 1] = null; + }, + ticks: { + suggestedMax: 0.5, + suggestedMin: 0.0, + beginAtZero: true, + stepSize: 1, + mirror: false, + } + }] + }, + annotation: { + drawTime: 'beforeDatasetsDraw', + annotations: [{ + type: 'line', + mode: 'horizontal', + scaleID: 'y-axis-0', + value: 5, + borderColor: 'grey', + borderWidth: 1, + //borderDash: [2, 2], + label: { + enabled: true, + content: 'Zwaar', + position: 'right', + fontSize: 10, + xPadding: 3, + yPadding: 3, + yAdjust: 10 + } + }, { + type: 'line', + mode: 'horizontal', + scaleID: 'y-axis-0', + value: 2.0, + borderColor: 'grey', + borderWidth: 1, + //borderDash: [2, 2], + label: { + enabled: true, + content: 'Matig', + position: 'right', + fontSize: 10, + xPadding: 3, + yPadding: 3, + yAdjust: -11 + } + }, { + type: 'line', + mode: 'horizontal', + scaleID: 'y-axis-0', + value: 0.4, + borderColor: 'grey', + borderWidth: 1, + //borderDash: [20, 5], + label: { + enabled: true, + content: 'Licht', + position: 'right', + fontSize: 10, + xPadding: 3, + yPadding: 3, + yAdjust: -11 + }, + + }] + } + } + }); + } + } + } + + + /** + * + * @param {*} data = array + * @param {*} vlabel = defineer de label van de dataset (NAAM) + */ + generateDatasetObject(data, vlabel = "Regen") { + + // entities in card moet object worden + // dan is het - entity: + // https://www.home-assistant.io/lovelace/entities/ + // waardoor je zelf de naam kan opgeven + + if (vlabel.includes("arm")) { + vlabel = "Buienalarm"; + } + if (vlabel.includes("dar")) { + vlabel = "Buienradar"; + } + + return { + label: vlabel, + data: data, + backgroundColor: [ + 'rgba(89, 160, 238, 0.2)' + ], + borderColor: [ + 'rgba(89, 160, 238, 1)' + ], + borderWidth: 2 + } + } + + //sync buienradar en buienalarm + //beide zijn objecten dus wanneer deze worden aangepast, dan wijzigt het ook meteen + combineTwoArray(array1, array2) { + + // fix - if only 1 entity is used + if(!array1 || !array2) { + return; + } + + //console.log(array1[0]) + //console.log(array2[0]) + + if (!array2[0] || !array1[0]) { + return; + } + + /** + * wanneer buienalarm achterloopt in zijn geheel + * werkt het onderstaande prima + */ + + // fix dataset van array 2 + for (const data of array1[0]) { + if (!array2[0].includes(data)) { + // console.log("1 waarde niet gevonden: " + data); + + let index = array1[0].indexOf(data) + // console.log("1 waarde heeft index: " + index); + // console.log(array2[0]) + + array2[0].splice(index, 0, array1[0][index]) + array2[1].splice(index, 0, '0') + } + } + + // geen idee of dit gaat werken + // fix dataset van array 1 + for (const data of array2[0]) { + if (!array1[0].includes(data)) { + // console.log("2 waarde niet gevonden: " + data); + + let index = array2[0].indexOf(data) + // console.log("2 waarde heeft index: " + index); + // console.log(array1[0]) + + array1[0].splice(index, 0, array2[0][index]) + array1[1].splice(index, 0, '0') + } + } + } + + /** + * Make modifications to active objects. + * Does not return a value, but activily modifies values + */ + prepareChartDataSets() { + + let chartData + let chartsDataAlsArray = [] + let chartDatasets = [] + if (this._config.entity) { + if (this.hass.states[this._config.entity].attributes.data) { + chartData = this.prepareData(this.hass.states[this._config.entity].attributes.data, this._config.entity); + chartsDataAlsArray.push(chartData); + chartDatasets.push(this.generateDatasetObject(chartData[1])) + } + } else { + for (const entity of this._config.entities) { + chartData = this.prepareData(this.hass.states[entity].attributes.data, entity); + + // potential fix for when one of the services does not contain data + // the dataset becomes invalid and the graph doesnt load correctly + if( chartData.length > 0 ) { + chartsDataAlsArray.push(chartData); + chartDatasets.push(this.generateDatasetObject(chartData[1], entity)) + } + } + + this.combineTwoArray(chartsDataAlsArray[0], chartsDataAlsArray[1]); + } + + return { + getChartsDataAlsArray : function() { + return chartsDataAlsArray; + }, + getChartDatasets : function() { + return chartDatasets; + } + + } + } + + prepareData(data, entity) { + + //console.log(this._config.entity); + if (!data || data.length === 0) { + return html``; + } + + // data can be buienalarm or buienradar + if (entity == "sensor.neerslag_buienradar_regen_data") { + return this.formatBuienradarData(data); + } + + if (entity == "sensor.neerslag_buienalarm_regen_data_oud") { + return this.formatBuienalarmData(data); + } + + if (entity == "sensor.neerslag_buienalarm_regen_data") { + return this.formatBuienalarmDataAndere(data); + } + } + + /** + * Op basis van gpsgadget.buienradar.nl/data/raintext + * params: lat + * long + * + * @param {string} data text blob + * - each entry on a new line + * - format per new line: 000|00:00 + * @return - data[0] = array[value, value] = time + * - data[1] = array[value, value] = preciption + */ + formatBuienradarData(data) { + const dataArray = data.trim().split(' '); + + let tijd = []; + let rain = []; + + for (const defaultElement of dataArray) { + + let num = Math.pow(10, ((parseInt(defaultElement.split('|')[0] - 109) / 32))); + let value = Math.round(num * 100) / 100 + + rain.push(value); // regen + tijd.push(defaultElement.split('|')[1]); // tijd + } + + let returnData = []; + returnData[0] = tijd; + returnData[1] = rain; + return returnData + } + + /* + * Op basis van www.buienalarm.nl/api/weather/splash? + */ + formatBuienalarmData(data) { + + // https://www.w3schools.com/jsref/jsref_getHours.asp + // Met JavaScript Date naar uren/minuten getallen kleiner dan 10 zijn 1 decimaal + function addZero(i) { + if (i < 10) { + i = "0" + i; + } + return i; + } + + let rain = []; + let tijd = [] + + //rain + data.forEach(function (item, index) { + rain.push(item.rain) + }); + + //tijd + data.forEach(function (item, index) { + let d = new Date(item.date); + tijd.push(addZero(d.getHours()) + ":" + addZero(d.getMinutes())); + }); + + + + let returnData = []; + returnData[0] = tijd; + returnData[1] = rain; + + return returnData + } + + /* + * Op basis van https://cdn-secure.buienalarm.nl/api/3.4/forecast.php + */ + formatBuienalarmDataAndere(data) { + + // https://www.w3schools.com/jsref/jsref_getHours.asp + // Met JavaScript Date naar uren/minuten getallen kleiner dan 10 zijn 1 decimaal + function addZero(i) { + if (i < 10) { + i = "0" + i; + } + return i; + } + + // console.log(data) + let tijd = [] + let rain = []; + + data.precip.forEach(function (item, index) { + rain.push(item) + }); + + + data.precip.forEach(function (item, index) { + let nieuweWaarde = index * data.delta + let nieuweTimestamp = data.start + nieuweWaarde + var d = new Date(0); // The 0 there is the key, which sets the date to the epoch + d.setUTCSeconds(nieuweTimestamp); + tijd.push(addZero(d.getHours()) + ":" + addZero(d.getMinutes())); + }); + + // console.log(tijd) + // console.log(rain); + + let returnData = []; + returnData[0] = tijd; + returnData[1] = rain; + + return returnData + } + + updateGrafiek() { + + let chartData + let chartsDataAlsArray = [] + let chartDatasets = [] + + if (this.dontMakeGraph === true) { + return; + } + this.myChart.data.labels = this.prepareChartDataSets().getChartsDataAlsArray()[0][0]; + this.myChart.data.datasets = this.prepareChartDataSets().getChartDatasets(); + this.myChart.update(); + } + } + + // customElements.define("combi-card-editor", CombiCardEditor); + customElements.define('neerslag-card', CombiCard); + + window.customCards = window.customCards || []; + window.customCards.push({ + type: "neerslag-card", //name of the card + name: "Neerslag Card", + preview: true, // Optional - defaults to false + description: "Display rain forecast using BuienAlarm and/or BuienRadar data." // Optional + }); + + console.info( + `%c NEERSLAG-CARD %c 2021.04.12.0`, + "Color: white; font-weight: bold; background: red;", + "" + ); + + + /*! + * Chart.js v2.9.4 + * https://www.chartjs.org + * (c) 2020 Chart.js Contributors + * Released under the MIT License + */ + !function (t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = t || self).Chart = e() }(this, (function () { "use strict"; "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self && self; function t() { throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs") } function e(t, e) { return t(e = { exports: {} }, e.exports), e.exports } var n = { aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], aqua: [0, 255, 255], aquamarine: [127, 255, 212], azure: [240, 255, 255], beige: [245, 245, 220], bisque: [255, 228, 196], black: [0, 0, 0], blanchedalmond: [255, 235, 205], blue: [0, 0, 255], blueviolet: [138, 43, 226], brown: [165, 42, 42], burlywood: [222, 184, 135], cadetblue: [95, 158, 160], chartreuse: [127, 255, 0], chocolate: [210, 105, 30], coral: [255, 127, 80], cornflowerblue: [100, 149, 237], cornsilk: [255, 248, 220], crimson: [220, 20, 60], cyan: [0, 255, 255], darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgoldenrod: [184, 134, 11], darkgray: [169, 169, 169], darkgreen: [0, 100, 0], darkgrey: [169, 169, 169], darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47], darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0], darksalmon: [233, 150, 122], darkseagreen: [143, 188, 143], darkslateblue: [72, 61, 139], darkslategray: [47, 79, 79], darkslategrey: [47, 79, 79], darkturquoise: [0, 206, 209], darkviolet: [148, 0, 211], deeppink: [255, 20, 147], deepskyblue: [0, 191, 255], dimgray: [105, 105, 105], dimgrey: [105, 105, 105], dodgerblue: [30, 144, 255], firebrick: [178, 34, 34], floralwhite: [255, 250, 240], forestgreen: [34, 139, 34], fuchsia: [255, 0, 255], gainsboro: [220, 220, 220], ghostwhite: [248, 248, 255], gold: [255, 215, 0], goldenrod: [218, 165, 32], gray: [128, 128, 128], green: [0, 128, 0], greenyellow: [173, 255, 47], grey: [128, 128, 128], honeydew: [240, 255, 240], hotpink: [255, 105, 180], indianred: [205, 92, 92], indigo: [75, 0, 130], ivory: [255, 255, 240], khaki: [240, 230, 140], lavender: [230, 230, 250], lavenderblush: [255, 240, 245], lawngreen: [124, 252, 0], lemonchiffon: [255, 250, 205], lightblue: [173, 216, 230], lightcoral: [240, 128, 128], lightcyan: [224, 255, 255], lightgoldenrodyellow: [250, 250, 210], lightgray: [211, 211, 211], lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193], lightsalmon: [255, 160, 122], lightseagreen: [32, 178, 170], lightskyblue: [135, 206, 250], lightslategray: [119, 136, 153], lightslategrey: [119, 136, 153], lightsteelblue: [176, 196, 222], lightyellow: [255, 255, 224], lime: [0, 255, 0], limegreen: [50, 205, 50], linen: [250, 240, 230], magenta: [255, 0, 255], maroon: [128, 0, 0], mediumaquamarine: [102, 205, 170], mediumblue: [0, 0, 205], mediumorchid: [186, 85, 211], mediumpurple: [147, 112, 219], mediumseagreen: [60, 179, 113], mediumslateblue: [123, 104, 238], mediumspringgreen: [0, 250, 154], mediumturquoise: [72, 209, 204], mediumvioletred: [199, 21, 133], midnightblue: [25, 25, 112], mintcream: [245, 255, 250], mistyrose: [255, 228, 225], moccasin: [255, 228, 181], navajowhite: [255, 222, 173], navy: [0, 0, 128], oldlace: [253, 245, 230], olive: [128, 128, 0], olivedrab: [107, 142, 35], orange: [255, 165, 0], orangered: [255, 69, 0], orchid: [218, 112, 214], palegoldenrod: [238, 232, 170], palegreen: [152, 251, 152], paleturquoise: [175, 238, 238], palevioletred: [219, 112, 147], papayawhip: [255, 239, 213], peachpuff: [255, 218, 185], peru: [205, 133, 63], pink: [255, 192, 203], plum: [221, 160, 221], powderblue: [176, 224, 230], purple: [128, 0, 128], rebeccapurple: [102, 51, 153], red: [255, 0, 0], rosybrown: [188, 143, 143], royalblue: [65, 105, 225], saddlebrown: [139, 69, 19], salmon: [250, 128, 114], sandybrown: [244, 164, 96], seagreen: [46, 139, 87], seashell: [255, 245, 238], sienna: [160, 82, 45], silver: [192, 192, 192], skyblue: [135, 206, 235], slateblue: [106, 90, 205], slategray: [112, 128, 144], slategrey: [112, 128, 144], snow: [255, 250, 250], springgreen: [0, 255, 127], steelblue: [70, 130, 180], tan: [210, 180, 140], teal: [0, 128, 128], thistle: [216, 191, 216], tomato: [255, 99, 71], turquoise: [64, 224, 208], violet: [238, 130, 238], wheat: [245, 222, 179], white: [255, 255, 255], whitesmoke: [245, 245, 245], yellow: [255, 255, 0], yellowgreen: [154, 205, 50] }, i = e((function (t) { var e = {}; for (var i in n) n.hasOwnProperty(i) && (e[n[i]] = i); var a = t.exports = { rgb: { channels: 3, labels: "rgb" }, hsl: { channels: 3, labels: "hsl" }, hsv: { channels: 3, labels: "hsv" }, hwb: { channels: 3, labels: "hwb" }, cmyk: { channels: 4, labels: "cmyk" }, xyz: { channels: 3, labels: "xyz" }, lab: { channels: 3, labels: "lab" }, lch: { channels: 3, labels: "lch" }, hex: { channels: 1, labels: ["hex"] }, keyword: { channels: 1, labels: ["keyword"] }, ansi16: { channels: 1, labels: ["ansi16"] }, ansi256: { channels: 1, labels: ["ansi256"] }, hcg: { channels: 3, labels: ["h", "c", "g"] }, apple: { channels: 3, labels: ["r16", "g16", "b16"] }, gray: { channels: 1, labels: ["gray"] } }; for (var r in a) if (a.hasOwnProperty(r)) { if (!("channels" in a[r])) throw new Error("missing channels property: " + r); if (!("labels" in a[r])) throw new Error("missing channel labels property: " + r); if (a[r].labels.length !== a[r].channels) throw new Error("channel and label counts mismatch: " + r); var o = a[r].channels, s = a[r].labels; delete a[r].channels, delete a[r].labels, Object.defineProperty(a[r], "channels", { value: o }), Object.defineProperty(a[r], "labels", { value: s }) } a.rgb.hsl = function (t) { var e, n, i = t[0] / 255, a = t[1] / 255, r = t[2] / 255, o = Math.min(i, a, r), s = Math.max(i, a, r), l = s - o; return s === o ? e = 0 : i === s ? e = (a - r) / l : a === s ? e = 2 + (r - i) / l : r === s && (e = 4 + (i - a) / l), (e = Math.min(60 * e, 360)) < 0 && (e += 360), n = (o + s) / 2, [e, 100 * (s === o ? 0 : n <= .5 ? l / (s + o) : l / (2 - s - o)), 100 * n] }, a.rgb.hsv = function (t) { var e, n, i, a, r, o = t[0] / 255, s = t[1] / 255, l = t[2] / 255, u = Math.max(o, s, l), d = u - Math.min(o, s, l), h = function (t) { return (u - t) / 6 / d + .5 }; return 0 === d ? a = r = 0 : (r = d / u, e = h(o), n = h(s), i = h(l), o === u ? a = i - n : s === u ? a = 1 / 3 + e - i : l === u && (a = 2 / 3 + n - e), a < 0 ? a += 1 : a > 1 && (a -= 1)), [360 * a, 100 * r, 100 * u] }, a.rgb.hwb = function (t) { var e = t[0], n = t[1], i = t[2]; return [a.rgb.hsl(t)[0], 100 * (1 / 255 * Math.min(e, Math.min(n, i))), 100 * (i = 1 - 1 / 255 * Math.max(e, Math.max(n, i)))] }, a.rgb.cmyk = function (t) { var e, n = t[0] / 255, i = t[1] / 255, a = t[2] / 255; return [100 * ((1 - n - (e = Math.min(1 - n, 1 - i, 1 - a))) / (1 - e) || 0), 100 * ((1 - i - e) / (1 - e) || 0), 100 * ((1 - a - e) / (1 - e) || 0), 100 * e] }, a.rgb.keyword = function (t) { var i = e[t]; if (i) return i; var a, r, o, s = 1 / 0; for (var l in n) if (n.hasOwnProperty(l)) { var u = n[l], d = (r = t, o = u, Math.pow(r[0] - o[0], 2) + Math.pow(r[1] - o[1], 2) + Math.pow(r[2] - o[2], 2)); d < s && (s = d, a = l) } return a }, a.keyword.rgb = function (t) { return n[t] }, a.rgb.xyz = function (t) { var e = t[0] / 255, n = t[1] / 255, i = t[2] / 255; return [100 * (.4124 * (e = e > .04045 ? Math.pow((e + .055) / 1.055, 2.4) : e / 12.92) + .3576 * (n = n > .04045 ? Math.pow((n + .055) / 1.055, 2.4) : n / 12.92) + .1805 * (i = i > .04045 ? Math.pow((i + .055) / 1.055, 2.4) : i / 12.92)), 100 * (.2126 * e + .7152 * n + .0722 * i), 100 * (.0193 * e + .1192 * n + .9505 * i)] }, a.rgb.lab = function (t) { var e = a.rgb.xyz(t), n = e[0], i = e[1], r = e[2]; return i /= 100, r /= 108.883, n = (n /= 95.047) > .008856 ? Math.pow(n, 1 / 3) : 7.787 * n + 16 / 116, [116 * (i = i > .008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116) - 16, 500 * (n - i), 200 * (i - (r = r > .008856 ? Math.pow(r, 1 / 3) : 7.787 * r + 16 / 116))] }, a.hsl.rgb = function (t) { var e, n, i, a, r, o = t[0] / 360, s = t[1] / 100, l = t[2] / 100; if (0 === s) return [r = 255 * l, r, r]; e = 2 * l - (n = l < .5 ? l * (1 + s) : l + s - l * s), a = [0, 0, 0]; for (var u = 0; u < 3; u++)(i = o + 1 / 3 * -(u - 1)) < 0 && i++, i > 1 && i--, r = 6 * i < 1 ? e + 6 * (n - e) * i : 2 * i < 1 ? n : 3 * i < 2 ? e + (n - e) * (2 / 3 - i) * 6 : e, a[u] = 255 * r; return a }, a.hsl.hsv = function (t) { var e = t[0], n = t[1] / 100, i = t[2] / 100, a = n, r = Math.max(i, .01); return n *= (i *= 2) <= 1 ? i : 2 - i, a *= r <= 1 ? r : 2 - r, [e, 100 * (0 === i ? 2 * a / (r + a) : 2 * n / (i + n)), 100 * ((i + n) / 2)] }, a.hsv.rgb = function (t) { var e = t[0] / 60, n = t[1] / 100, i = t[2] / 100, a = Math.floor(e) % 6, r = e - Math.floor(e), o = 255 * i * (1 - n), s = 255 * i * (1 - n * r), l = 255 * i * (1 - n * (1 - r)); switch (i *= 255, a) { case 0: return [i, l, o]; case 1: return [s, i, o]; case 2: return [o, i, l]; case 3: return [o, s, i]; case 4: return [l, o, i]; case 5: return [i, o, s] } }, a.hsv.hsl = function (t) { var e, n, i, a = t[0], r = t[1] / 100, o = t[2] / 100, s = Math.max(o, .01); return i = (2 - r) * o, n = r * s, [a, 100 * (n = (n /= (e = (2 - r) * s) <= 1 ? e : 2 - e) || 0), 100 * (i /= 2)] }, a.hwb.rgb = function (t) { var e, n, i, a, r, o, s, l = t[0] / 360, u = t[1] / 100, d = t[2] / 100, h = u + d; switch (h > 1 && (u /= h, d /= h), i = 6 * l - (e = Math.floor(6 * l)), 0 != (1 & e) && (i = 1 - i), a = u + i * ((n = 1 - d) - u), e) { default: case 6: case 0: r = n, o = a, s = u; break; case 1: r = a, o = n, s = u; break; case 2: r = u, o = n, s = a; break; case 3: r = u, o = a, s = n; break; case 4: r = a, o = u, s = n; break; case 5: r = n, o = u, s = a }return [255 * r, 255 * o, 255 * s] }, a.cmyk.rgb = function (t) { var e = t[0] / 100, n = t[1] / 100, i = t[2] / 100, a = t[3] / 100; return [255 * (1 - Math.min(1, e * (1 - a) + a)), 255 * (1 - Math.min(1, n * (1 - a) + a)), 255 * (1 - Math.min(1, i * (1 - a) + a))] }, a.xyz.rgb = function (t) { var e, n, i, a = t[0] / 100, r = t[1] / 100, o = t[2] / 100; return n = -.9689 * a + 1.8758 * r + .0415 * o, i = .0557 * a + -.204 * r + 1.057 * o, e = (e = 3.2406 * a + -1.5372 * r + -.4986 * o) > .0031308 ? 1.055 * Math.pow(e, 1 / 2.4) - .055 : 12.92 * e, n = n > .0031308 ? 1.055 * Math.pow(n, 1 / 2.4) - .055 : 12.92 * n, i = i > .0031308 ? 1.055 * Math.pow(i, 1 / 2.4) - .055 : 12.92 * i, [255 * (e = Math.min(Math.max(0, e), 1)), 255 * (n = Math.min(Math.max(0, n), 1)), 255 * (i = Math.min(Math.max(0, i), 1))] }, a.xyz.lab = function (t) { var e = t[0], n = t[1], i = t[2]; return n /= 100, i /= 108.883, e = (e /= 95.047) > .008856 ? Math.pow(e, 1 / 3) : 7.787 * e + 16 / 116, [116 * (n = n > .008856 ? Math.pow(n, 1 / 3) : 7.787 * n + 16 / 116) - 16, 500 * (e - n), 200 * (n - (i = i > .008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116))] }, a.lab.xyz = function (t) { var e, n, i, a = t[0]; e = t[1] / 500 + (n = (a + 16) / 116), i = n - t[2] / 200; var r = Math.pow(n, 3), o = Math.pow(e, 3), s = Math.pow(i, 3); return n = r > .008856 ? r : (n - 16 / 116) / 7.787, e = o > .008856 ? o : (e - 16 / 116) / 7.787, i = s > .008856 ? s : (i - 16 / 116) / 7.787, [e *= 95.047, n *= 100, i *= 108.883] }, a.lab.lch = function (t) { var e, n = t[0], i = t[1], a = t[2]; return (e = 360 * Math.atan2(a, i) / 2 / Math.PI) < 0 && (e += 360), [n, Math.sqrt(i * i + a * a), e] }, a.lch.lab = function (t) { var e, n = t[0], i = t[1]; return e = t[2] / 360 * 2 * Math.PI, [n, i * Math.cos(e), i * Math.sin(e)] }, a.rgb.ansi16 = function (t) { var e = t[0], n = t[1], i = t[2], r = 1 in arguments ? arguments[1] : a.rgb.hsv(t)[2]; if (0 === (r = Math.round(r / 50))) return 30; var o = 30 + (Math.round(i / 255) << 2 | Math.round(n / 255) << 1 | Math.round(e / 255)); return 2 === r && (o += 60), o }, a.hsv.ansi16 = function (t) { return a.rgb.ansi16(a.hsv.rgb(t), t[2]) }, a.rgb.ansi256 = function (t) { var e = t[0], n = t[1], i = t[2]; return e === n && n === i ? e < 8 ? 16 : e > 248 ? 231 : Math.round((e - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(e / 255 * 5) + 6 * Math.round(n / 255 * 5) + Math.round(i / 255 * 5) }, a.ansi16.rgb = function (t) { var e = t % 10; if (0 === e || 7 === e) return t > 50 && (e += 3.5), [e = e / 10.5 * 255, e, e]; var n = .5 * (1 + ~~(t > 50)); return [(1 & e) * n * 255, (e >> 1 & 1) * n * 255, (e >> 2 & 1) * n * 255] }, a.ansi256.rgb = function (t) { if (t >= 232) { var e = 10 * (t - 232) + 8; return [e, e, e] } var n; return t -= 16, [Math.floor(t / 36) / 5 * 255, Math.floor((n = t % 36) / 6) / 5 * 255, n % 6 / 5 * 255] }, a.rgb.hex = function (t) { var e = (((255 & Math.round(t[0])) << 16) + ((255 & Math.round(t[1])) << 8) + (255 & Math.round(t[2]))).toString(16).toUpperCase(); return "000000".substring(e.length) + e }, a.hex.rgb = function (t) { var e = t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); if (!e) return [0, 0, 0]; var n = e[0]; 3 === e[0].length && (n = n.split("").map((function (t) { return t + t })).join("")); var i = parseInt(n, 16); return [i >> 16 & 255, i >> 8 & 255, 255 & i] }, a.rgb.hcg = function (t) { var e, n = t[0] / 255, i = t[1] / 255, a = t[2] / 255, r = Math.max(Math.max(n, i), a), o = Math.min(Math.min(n, i), a), s = r - o; return e = s <= 0 ? 0 : r === n ? (i - a) / s % 6 : r === i ? 2 + (a - n) / s : 4 + (n - i) / s + 4, e /= 6, [360 * (e %= 1), 100 * s, 100 * (s < 1 ? o / (1 - s) : 0)] }, a.hsl.hcg = function (t) { var e = t[1] / 100, n = t[2] / 100, i = 1, a = 0; return (i = n < .5 ? 2 * e * n : 2 * e * (1 - n)) < 1 && (a = (n - .5 * i) / (1 - i)), [t[0], 100 * i, 100 * a] }, a.hsv.hcg = function (t) { var e = t[1] / 100, n = t[2] / 100, i = e * n, a = 0; return i < 1 && (a = (n - i) / (1 - i)), [t[0], 100 * i, 100 * a] }, a.hcg.rgb = function (t) { var e = t[0] / 360, n = t[1] / 100, i = t[2] / 100; if (0 === n) return [255 * i, 255 * i, 255 * i]; var a, r = [0, 0, 0], o = e % 1 * 6, s = o % 1, l = 1 - s; switch (Math.floor(o)) { case 0: r[0] = 1, r[1] = s, r[2] = 0; break; case 1: r[0] = l, r[1] = 1, r[2] = 0; break; case 2: r[0] = 0, r[1] = 1, r[2] = s; break; case 3: r[0] = 0, r[1] = l, r[2] = 1; break; case 4: r[0] = s, r[1] = 0, r[2] = 1; break; default: r[0] = 1, r[1] = 0, r[2] = l }return a = (1 - n) * i, [255 * (n * r[0] + a), 255 * (n * r[1] + a), 255 * (n * r[2] + a)] }, a.hcg.hsv = function (t) { var e = t[1] / 100, n = e + t[2] / 100 * (1 - e), i = 0; return n > 0 && (i = e / n), [t[0], 100 * i, 100 * n] }, a.hcg.hsl = function (t) { var e = t[1] / 100, n = t[2] / 100 * (1 - e) + .5 * e, i = 0; return n > 0 && n < .5 ? i = e / (2 * n) : n >= .5 && n < 1 && (i = e / (2 * (1 - n))), [t[0], 100 * i, 100 * n] }, a.hcg.hwb = function (t) { var e = t[1] / 100, n = e + t[2] / 100 * (1 - e); return [t[0], 100 * (n - e), 100 * (1 - n)] }, a.hwb.hcg = function (t) { var e = t[1] / 100, n = 1 - t[2] / 100, i = n - e, a = 0; return i < 1 && (a = (n - i) / (1 - i)), [t[0], 100 * i, 100 * a] }, a.apple.rgb = function (t) { return [t[0] / 65535 * 255, t[1] / 65535 * 255, t[2] / 65535 * 255] }, a.rgb.apple = function (t) { return [t[0] / 255 * 65535, t[1] / 255 * 65535, t[2] / 255 * 65535] }, a.gray.rgb = function (t) { return [t[0] / 100 * 255, t[0] / 100 * 255, t[0] / 100 * 255] }, a.gray.hsl = a.gray.hsv = function (t) { return [0, 0, t[0]] }, a.gray.hwb = function (t) { return [0, 100, t[0]] }, a.gray.cmyk = function (t) { return [0, 0, 0, t[0]] }, a.gray.lab = function (t) { return [t[0], 0, 0] }, a.gray.hex = function (t) { var e = 255 & Math.round(t[0] / 100 * 255), n = ((e << 16) + (e << 8) + e).toString(16).toUpperCase(); return "000000".substring(n.length) + n }, a.rgb.gray = function (t) { return [(t[0] + t[1] + t[2]) / 3 / 255 * 100] } })); i.rgb, i.hsl, i.hsv, i.hwb, i.cmyk, i.xyz, i.lab, i.lch, i.hex, i.keyword, i.ansi16, i.ansi256, i.hcg, i.apple, i.gray; function a(t) { var e = function () { for (var t = {}, e = Object.keys(i), n = e.length, a = 0; a < n; a++)t[e[a]] = { distance: -1, parent: null }; return t }(), n = [t]; for (e[t].distance = 0; n.length;)for (var a = n.pop(), r = Object.keys(i[a]), o = r.length, s = 0; s < o; s++) { var l = r[s], u = e[l]; -1 === u.distance && (u.distance = e[a].distance + 1, u.parent = a, n.unshift(l)) } return e } function r(t, e) { return function (n) { return e(t(n)) } } function o(t, e) { for (var n = [e[t].parent, t], a = i[e[t].parent][t], o = e[t].parent; e[o].parent;)n.unshift(e[o].parent), a = r(i[e[o].parent][o], a), o = e[o].parent; return a.conversion = n, a } var s = {}; Object.keys(i).forEach((function (t) { s[t] = {}, Object.defineProperty(s[t], "channels", { value: i[t].channels }), Object.defineProperty(s[t], "labels", { value: i[t].labels }); var e = function (t) { for (var e = a(t), n = {}, i = Object.keys(e), r = i.length, s = 0; s < r; s++) { var l = i[s]; null !== e[l].parent && (n[l] = o(l, e)) } return n }(t); Object.keys(e).forEach((function (n) { var i = e[n]; s[t][n] = function (t) { var e = function (e) { if (null == e) return e; arguments.length > 1 && (e = Array.prototype.slice.call(arguments)); var n = t(e); if ("object" == typeof n) for (var i = n.length, a = 0; a < i; a++)n[a] = Math.round(n[a]); return n }; return "conversion" in t && (e.conversion = t.conversion), e }(i), s[t][n].raw = function (t) { var e = function (e) { return null == e ? e : (arguments.length > 1 && (e = Array.prototype.slice.call(arguments)), t(e)) }; return "conversion" in t && (e.conversion = t.conversion), e }(i) })) })); var l = s, u = { aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], aqua: [0, 255, 255], aquamarine: [127, 255, 212], azure: [240, 255, 255], beige: [245, 245, 220], bisque: [255, 228, 196], black: [0, 0, 0], blanchedalmond: [255, 235, 205], blue: [0, 0, 255], blueviolet: [138, 43, 226], brown: [165, 42, 42], burlywood: [222, 184, 135], cadetblue: [95, 158, 160], chartreuse: [127, 255, 0], chocolate: [210, 105, 30], coral: [255, 127, 80], cornflowerblue: [100, 149, 237], cornsilk: [255, 248, 220], crimson: [220, 20, 60], cyan: [0, 255, 255], darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgoldenrod: [184, 134, 11], darkgray: [169, 169, 169], darkgreen: [0, 100, 0], darkgrey: [169, 169, 169], darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47], darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0], darksalmon: [233, 150, 122], darkseagreen: [143, 188, 143], darkslateblue: [72, 61, 139], darkslategray: [47, 79, 79], darkslategrey: [47, 79, 79], darkturquoise: [0, 206, 209], darkviolet: [148, 0, 211], deeppink: [255, 20, 147], deepskyblue: [0, 191, 255], dimgray: [105, 105, 105], dimgrey: [105, 105, 105], dodgerblue: [30, 144, 255], firebrick: [178, 34, 34], floralwhite: [255, 250, 240], forestgreen: [34, 139, 34], fuchsia: [255, 0, 255], gainsboro: [220, 220, 220], ghostwhite: [248, 248, 255], gold: [255, 215, 0], goldenrod: [218, 165, 32], gray: [128, 128, 128], green: [0, 128, 0], greenyellow: [173, 255, 47], grey: [128, 128, 128], honeydew: [240, 255, 240], hotpink: [255, 105, 180], indianred: [205, 92, 92], indigo: [75, 0, 130], ivory: [255, 255, 240], khaki: [240, 230, 140], lavender: [230, 230, 250], lavenderblush: [255, 240, 245], lawngreen: [124, 252, 0], lemonchiffon: [255, 250, 205], lightblue: [173, 216, 230], lightcoral: [240, 128, 128], lightcyan: [224, 255, 255], lightgoldenrodyellow: [250, 250, 210], lightgray: [211, 211, 211], lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193], lightsalmon: [255, 160, 122], lightseagreen: [32, 178, 170], lightskyblue: [135, 206, 250], lightslategray: [119, 136, 153], lightslategrey: [119, 136, 153], lightsteelblue: [176, 196, 222], lightyellow: [255, 255, 224], lime: [0, 255, 0], limegreen: [50, 205, 50], linen: [250, 240, 230], magenta: [255, 0, 255], maroon: [128, 0, 0], mediumaquamarine: [102, 205, 170], mediumblue: [0, 0, 205], mediumorchid: [186, 85, 211], mediumpurple: [147, 112, 219], mediumseagreen: [60, 179, 113], mediumslateblue: [123, 104, 238], mediumspringgreen: [0, 250, 154], mediumturquoise: [72, 209, 204], mediumvioletred: [199, 21, 133], midnightblue: [25, 25, 112], mintcream: [245, 255, 250], mistyrose: [255, 228, 225], moccasin: [255, 228, 181], navajowhite: [255, 222, 173], navy: [0, 0, 128], oldlace: [253, 245, 230], olive: [128, 128, 0], olivedrab: [107, 142, 35], orange: [255, 165, 0], orangered: [255, 69, 0], orchid: [218, 112, 214], palegoldenrod: [238, 232, 170], palegreen: [152, 251, 152], paleturquoise: [175, 238, 238], palevioletred: [219, 112, 147], papayawhip: [255, 239, 213], peachpuff: [255, 218, 185], peru: [205, 133, 63], pink: [255, 192, 203], plum: [221, 160, 221], powderblue: [176, 224, 230], purple: [128, 0, 128], rebeccapurple: [102, 51, 153], red: [255, 0, 0], rosybrown: [188, 143, 143], royalblue: [65, 105, 225], saddlebrown: [139, 69, 19], salmon: [250, 128, 114], sandybrown: [244, 164, 96], seagreen: [46, 139, 87], seashell: [255, 245, 238], sienna: [160, 82, 45], silver: [192, 192, 192], skyblue: [135, 206, 235], slateblue: [106, 90, 205], slategray: [112, 128, 144], slategrey: [112, 128, 144], snow: [255, 250, 250], springgreen: [0, 255, 127], steelblue: [70, 130, 180], tan: [210, 180, 140], teal: [0, 128, 128], thistle: [216, 191, 216], tomato: [255, 99, 71], turquoise: [64, 224, 208], violet: [238, 130, 238], wheat: [245, 222, 179], white: [255, 255, 255], whitesmoke: [245, 245, 245], yellow: [255, 255, 0], yellowgreen: [154, 205, 50] }, d = { getRgba: h, getHsla: c, getRgb: function (t) { var e = h(t); return e && e.slice(0, 3) }, getHsl: function (t) { var e = c(t); return e && e.slice(0, 3) }, getHwb: f, getAlpha: function (t) { var e = h(t); if (e) return e[3]; if (e = c(t)) return e[3]; if (e = f(t)) return e[3] }, hexString: function (t, e) { e = void 0 !== e && 3 === t.length ? e : t[3]; return "#" + b(t[0]) + b(t[1]) + b(t[2]) + (e >= 0 && e < 1 ? b(Math.round(255 * e)) : "") }, rgbString: function (t, e) { if (e < 1 || t[3] && t[3] < 1) return g(t, e); return "rgb(" + t[0] + ", " + t[1] + ", " + t[2] + ")" }, rgbaString: g, percentString: function (t, e) { if (e < 1 || t[3] && t[3] < 1) return m(t, e); var n = Math.round(t[0] / 255 * 100), i = Math.round(t[1] / 255 * 100), a = Math.round(t[2] / 255 * 100); return "rgb(" + n + "%, " + i + "%, " + a + "%)" }, percentaString: m, hslString: function (t, e) { if (e < 1 || t[3] && t[3] < 1) return p(t, e); return "hsl(" + t[0] + ", " + t[1] + "%, " + t[2] + "%)" }, hslaString: p, hwbString: function (t, e) { void 0 === e && (e = void 0 !== t[3] ? t[3] : 1); return "hwb(" + t[0] + ", " + t[1] + "%, " + t[2] + "%" + (void 0 !== e && 1 !== e ? ", " + e : "") + ")" }, keyword: function (t) { return y[t.slice(0, 3)] } }; function h(t) { if (t) { var e = [0, 0, 0], n = 1, i = t.match(/^#([a-fA-F0-9]{3,4})$/i), a = ""; if (i) { a = (i = i[1])[3]; for (var r = 0; r < e.length; r++)e[r] = parseInt(i[r] + i[r], 16); a && (n = Math.round(parseInt(a + a, 16) / 255 * 100) / 100) } else if (i = t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)) { a = i[2], i = i[1]; for (r = 0; r < e.length; r++)e[r] = parseInt(i.slice(2 * r, 2 * r + 2), 16); a && (n = Math.round(parseInt(a, 16) / 255 * 100) / 100) } else if (i = t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)) { for (r = 0; r < e.length; r++)e[r] = parseInt(i[r + 1]); n = parseFloat(i[4]) } else if (i = t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)) { for (r = 0; r < e.length; r++)e[r] = Math.round(2.55 * parseFloat(i[r + 1])); n = parseFloat(i[4]) } else if (i = t.match(/(\w+)/)) { if ("transparent" == i[1]) return [0, 0, 0, 0]; if (!(e = u[i[1]])) return } for (r = 0; r < e.length; r++)e[r] = v(e[r], 0, 255); return n = n || 0 == n ? v(n, 0, 1) : 1, e[3] = n, e } } function c(t) { if (t) { var e = t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/); if (e) { var n = parseFloat(e[4]); return [v(parseInt(e[1]), 0, 360), v(parseFloat(e[2]), 0, 100), v(parseFloat(e[3]), 0, 100), v(isNaN(n) ? 1 : n, 0, 1)] } } } function f(t) { if (t) { var e = t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/); if (e) { var n = parseFloat(e[4]); return [v(parseInt(e[1]), 0, 360), v(parseFloat(e[2]), 0, 100), v(parseFloat(e[3]), 0, 100), v(isNaN(n) ? 1 : n, 0, 1)] } } } function g(t, e) { return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "rgba(" + t[0] + ", " + t[1] + ", " + t[2] + ", " + e + ")" } function m(t, e) { return "rgba(" + Math.round(t[0] / 255 * 100) + "%, " + Math.round(t[1] / 255 * 100) + "%, " + Math.round(t[2] / 255 * 100) + "%, " + (e || t[3] || 1) + ")" } function p(t, e) { return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "hsla(" + t[0] + ", " + t[1] + "%, " + t[2] + "%, " + e + ")" } function v(t, e, n) { return Math.min(Math.max(e, t), n) } function b(t) { var e = t.toString(16).toUpperCase(); return e.length < 2 ? "0" + e : e } var y = {}; for (var x in u) y[u[x]] = x; var _ = function (t) { return t instanceof _ ? t : this instanceof _ ? (this.valid = !1, this.values = { rgb: [0, 0, 0], hsl: [0, 0, 0], hsv: [0, 0, 0], hwb: [0, 0, 0], cmyk: [0, 0, 0, 0], alpha: 1 }, void ("string" == typeof t ? (e = d.getRgba(t)) ? this.setValues("rgb", e) : (e = d.getHsla(t)) ? this.setValues("hsl", e) : (e = d.getHwb(t)) && this.setValues("hwb", e) : "object" == typeof t && (void 0 !== (e = t).r || void 0 !== e.red ? this.setValues("rgb", e) : void 0 !== e.l || void 0 !== e.lightness ? this.setValues("hsl", e) : void 0 !== e.v || void 0 !== e.value ? this.setValues("hsv", e) : void 0 !== e.w || void 0 !== e.whiteness ? this.setValues("hwb", e) : void 0 === e.c && void 0 === e.cyan || this.setValues("cmyk", e)))) : new _(t); var e }; _.prototype = { isValid: function () { return this.valid }, rgb: function () { return this.setSpace("rgb", arguments) }, hsl: function () { return this.setSpace("hsl", arguments) }, hsv: function () { return this.setSpace("hsv", arguments) }, hwb: function () { return this.setSpace("hwb", arguments) }, cmyk: function () { return this.setSpace("cmyk", arguments) }, rgbArray: function () { return this.values.rgb }, hslArray: function () { return this.values.hsl }, hsvArray: function () { return this.values.hsv }, hwbArray: function () { var t = this.values; return 1 !== t.alpha ? t.hwb.concat([t.alpha]) : t.hwb }, cmykArray: function () { return this.values.cmyk }, rgbaArray: function () { var t = this.values; return t.rgb.concat([t.alpha]) }, hslaArray: function () { var t = this.values; return t.hsl.concat([t.alpha]) }, alpha: function (t) { return void 0 === t ? this.values.alpha : (this.setValues("alpha", t), this) }, red: function (t) { return this.setChannel("rgb", 0, t) }, green: function (t) { return this.setChannel("rgb", 1, t) }, blue: function (t) { return this.setChannel("rgb", 2, t) }, hue: function (t) { return t && (t = (t %= 360) < 0 ? 360 + t : t), this.setChannel("hsl", 0, t) }, saturation: function (t) { return this.setChannel("hsl", 1, t) }, lightness: function (t) { return this.setChannel("hsl", 2, t) }, saturationv: function (t) { return this.setChannel("hsv", 1, t) }, whiteness: function (t) { return this.setChannel("hwb", 1, t) }, blackness: function (t) { return this.setChannel("hwb", 2, t) }, value: function (t) { return this.setChannel("hsv", 2, t) }, cyan: function (t) { return this.setChannel("cmyk", 0, t) }, magenta: function (t) { return this.setChannel("cmyk", 1, t) }, yellow: function (t) { return this.setChannel("cmyk", 2, t) }, black: function (t) { return this.setChannel("cmyk", 3, t) }, hexString: function () { return d.hexString(this.values.rgb) }, rgbString: function () { return d.rgbString(this.values.rgb, this.values.alpha) }, rgbaString: function () { return d.rgbaString(this.values.rgb, this.values.alpha) }, percentString: function () { return d.percentString(this.values.rgb, this.values.alpha) }, hslString: function () { return d.hslString(this.values.hsl, this.values.alpha) }, hslaString: function () { return d.hslaString(this.values.hsl, this.values.alpha) }, hwbString: function () { return d.hwbString(this.values.hwb, this.values.alpha) }, keyword: function () { return d.keyword(this.values.rgb, this.values.alpha) }, rgbNumber: function () { var t = this.values.rgb; return t[0] << 16 | t[1] << 8 | t[2] }, luminosity: function () { for (var t = this.values.rgb, e = [], n = 0; n < t.length; n++) { var i = t[n] / 255; e[n] = i <= .03928 ? i / 12.92 : Math.pow((i + .055) / 1.055, 2.4) } return .2126 * e[0] + .7152 * e[1] + .0722 * e[2] }, contrast: function (t) { var e = this.luminosity(), n = t.luminosity(); return e > n ? (e + .05) / (n + .05) : (n + .05) / (e + .05) }, level: function (t) { var e = this.contrast(t); return e >= 7.1 ? "AAA" : e >= 4.5 ? "AA" : "" }, dark: function () { var t = this.values.rgb; return (299 * t[0] + 587 * t[1] + 114 * t[2]) / 1e3 < 128 }, light: function () { return !this.dark() }, negate: function () { for (var t = [], e = 0; e < 3; e++)t[e] = 255 - this.values.rgb[e]; return this.setValues("rgb", t), this }, lighten: function (t) { var e = this.values.hsl; return e[2] += e[2] * t, this.setValues("hsl", e), this }, darken: function (t) { var e = this.values.hsl; return e[2] -= e[2] * t, this.setValues("hsl", e), this }, saturate: function (t) { var e = this.values.hsl; return e[1] += e[1] * t, this.setValues("hsl", e), this }, desaturate: function (t) { var e = this.values.hsl; return e[1] -= e[1] * t, this.setValues("hsl", e), this }, whiten: function (t) { var e = this.values.hwb; return e[1] += e[1] * t, this.setValues("hwb", e), this }, blacken: function (t) { var e = this.values.hwb; return e[2] += e[2] * t, this.setValues("hwb", e), this }, greyscale: function () { var t = this.values.rgb, e = .3 * t[0] + .59 * t[1] + .11 * t[2]; return this.setValues("rgb", [e, e, e]), this }, clearer: function (t) { var e = this.values.alpha; return this.setValues("alpha", e - e * t), this }, opaquer: function (t) { var e = this.values.alpha; return this.setValues("alpha", e + e * t), this }, rotate: function (t) { var e = this.values.hsl, n = (e[0] + t) % 360; return e[0] = n < 0 ? 360 + n : n, this.setValues("hsl", e), this }, mix: function (t, e) { var n = t, i = void 0 === e ? .5 : e, a = 2 * i - 1, r = this.alpha() - n.alpha(), o = ((a * r == -1 ? a : (a + r) / (1 + a * r)) + 1) / 2, s = 1 - o; return this.rgb(o * this.red() + s * n.red(), o * this.green() + s * n.green(), o * this.blue() + s * n.blue()).alpha(this.alpha() * i + n.alpha() * (1 - i)) }, toJSON: function () { return this.rgb() }, clone: function () { var t, e, n = new _, i = this.values, a = n.values; for (var r in i) i.hasOwnProperty(r) && (t = i[r], "[object Array]" === (e = {}.toString.call(t)) ? a[r] = t.slice(0) : "[object Number]" === e ? a[r] = t : console.error("unexpected color value:", t)); return n } }, _.prototype.spaces = { rgb: ["red", "green", "blue"], hsl: ["hue", "saturation", "lightness"], hsv: ["hue", "saturation", "value"], hwb: ["hue", "whiteness", "blackness"], cmyk: ["cyan", "magenta", "yellow", "black"] }, _.prototype.maxes = { rgb: [255, 255, 255], hsl: [360, 100, 100], hsv: [360, 100, 100], hwb: [360, 100, 100], cmyk: [100, 100, 100, 100] }, _.prototype.getValues = function (t) { for (var e = this.values, n = {}, i = 0; i < t.length; i++)n[t.charAt(i)] = e[t][i]; return 1 !== e.alpha && (n.a = e.alpha), n }, _.prototype.setValues = function (t, e) { var n, i, a = this.values, r = this.spaces, o = this.maxes, s = 1; if (this.valid = !0, "alpha" === t) s = e; else if (e.length) a[t] = e.slice(0, t.length), s = e[t.length]; else if (void 0 !== e[t.charAt(0)]) { for (n = 0; n < t.length; n++)a[t][n] = e[t.charAt(n)]; s = e.a } else if (void 0 !== e[r[t][0]]) { var u = r[t]; for (n = 0; n < t.length; n++)a[t][n] = e[u[n]]; s = e.alpha } if (a.alpha = Math.max(0, Math.min(1, void 0 === s ? a.alpha : s)), "alpha" === t) return !1; for (n = 0; n < t.length; n++)i = Math.max(0, Math.min(o[t][n], a[t][n])), a[t][n] = Math.round(i); for (var d in r) d !== t && (a[d] = l[t][d](a[t])); return !0 }, _.prototype.setSpace = function (t, e) { var n = e[0]; return void 0 === n ? this.getValues(t) : ("number" == typeof n && (n = Array.prototype.slice.call(e)), this.setValues(t, n), this) }, _.prototype.setChannel = function (t, e, n) { var i = this.values[t]; return void 0 === n ? i[e] : n === i[e] ? this : (i[e] = n, this.setValues(t, i), this) }, "undefined" != typeof window && (window.Color = _); var w = _; function k(t) { return -1 === ["__proto__", "prototype", "constructor"].indexOf(t) } var M, S = { noop: function () { }, uid: (M = 0, function () { return M++ }), isNullOrUndef: function (t) { return null == t }, isArray: function (t) { if (Array.isArray && Array.isArray(t)) return !0; var e = Object.prototype.toString.call(t); return "[object" === e.substr(0, 7) && "Array]" === e.substr(-6) }, isObject: function (t) { return null !== t && "[object Object]" === Object.prototype.toString.call(t) }, isFinite: function (t) { return ("number" == typeof t || t instanceof Number) && isFinite(t) }, valueOrDefault: function (t, e) { return void 0 === t ? e : t }, valueAtIndexOrDefault: function (t, e, n) { return S.valueOrDefault(S.isArray(t) ? t[e] : t, n) }, callback: function (t, e, n) { if (t && "function" == typeof t.call) return t.apply(n, e) }, each: function (t, e, n, i) { var a, r, o; if (S.isArray(t)) if (r = t.length, i) for (a = r - 1; a >= 0; a--)e.call(n, t[a], a); else for (a = 0; a < r; a++)e.call(n, t[a], a); else if (S.isObject(t)) for (r = (o = Object.keys(t)).length, a = 0; a < r; a++)e.call(n, t[o[a]], o[a]) }, arrayEquals: function (t, e) { var n, i, a, r; if (!t || !e || t.length !== e.length) return !1; for (n = 0, i = t.length; n < i; ++n)if (a = t[n], r = e[n], a instanceof Array && r instanceof Array) { if (!S.arrayEquals(a, r)) return !1 } else if (a !== r) return !1; return !0 }, clone: function (t) { if (S.isArray(t)) return t.map(S.clone); if (S.isObject(t)) { for (var e = Object.create(t), n = Object.keys(t), i = n.length, a = 0; a < i; ++a)e[n[a]] = S.clone(t[n[a]]); return e } return t }, _merger: function (t, e, n, i) { if (k(t)) { var a = e[t], r = n[t]; S.isObject(a) && S.isObject(r) ? S.merge(a, r, i) : e[t] = S.clone(r) } }, _mergerIf: function (t, e, n) { if (k(t)) { var i = e[t], a = n[t]; S.isObject(i) && S.isObject(a) ? S.mergeIf(i, a) : e.hasOwnProperty(t) || (e[t] = S.clone(a)) } }, merge: function (t, e, n) { var i, a, r, o, s, l = S.isArray(e) ? e : [e], u = l.length; if (!S.isObject(t)) return t; for (i = (n = n || {}).merger || S._merger, a = 0; a < u; ++a)if (e = l[a], S.isObject(e)) for (s = 0, o = (r = Object.keys(e)).length; s < o; ++s)i(r[s], t, e, n); return t }, mergeIf: function (t, e) { return S.merge(t, e, { merger: S._mergerIf }) }, extend: Object.assign || function (t) { return S.merge(t, [].slice.call(arguments, 1), { merger: function (t, e, n) { e[t] = n[t] } }) }, inherits: function (t) { var e = this, n = t && t.hasOwnProperty("constructor") ? t.constructor : function () { return e.apply(this, arguments) }, i = function () { this.constructor = n }; return i.prototype = e.prototype, n.prototype = new i, n.extend = S.inherits, t && S.extend(n.prototype, t), n.__super__ = e.prototype, n }, _deprecated: function (t, e, n, i) { void 0 !== e && console.warn(t + ': "' + n + '" is deprecated. Please use "' + i + '" instead') } }, D = S; S.callCallback = S.callback, S.indexOf = function (t, e, n) { return Array.prototype.indexOf.call(t, e, n) }, S.getValueOrDefault = S.valueOrDefault, S.getValueAtIndexOrDefault = S.valueAtIndexOrDefault; var C = { linear: function (t) { return t }, easeInQuad: function (t) { return t * t }, easeOutQuad: function (t) { return -t * (t - 2) }, easeInOutQuad: function (t) { return (t /= .5) < 1 ? .5 * t * t : -.5 * (--t * (t - 2) - 1) }, easeInCubic: function (t) { return t * t * t }, easeOutCubic: function (t) { return (t -= 1) * t * t + 1 }, easeInOutCubic: function (t) { return (t /= .5) < 1 ? .5 * t * t * t : .5 * ((t -= 2) * t * t + 2) }, easeInQuart: function (t) { return t * t * t * t }, easeOutQuart: function (t) { return -((t -= 1) * t * t * t - 1) }, easeInOutQuart: function (t) { return (t /= .5) < 1 ? .5 * t * t * t * t : -.5 * ((t -= 2) * t * t * t - 2) }, easeInQuint: function (t) { return t * t * t * t * t }, easeOutQuint: function (t) { return (t -= 1) * t * t * t * t + 1 }, easeInOutQuint: function (t) { return (t /= .5) < 1 ? .5 * t * t * t * t * t : .5 * ((t -= 2) * t * t * t * t + 2) }, easeInSine: function (t) { return 1 - Math.cos(t * (Math.PI / 2)) }, easeOutSine: function (t) { return Math.sin(t * (Math.PI / 2)) }, easeInOutSine: function (t) { return -.5 * (Math.cos(Math.PI * t) - 1) }, easeInExpo: function (t) { return 0 === t ? 0 : Math.pow(2, 10 * (t - 1)) }, easeOutExpo: function (t) { return 1 === t ? 1 : 1 - Math.pow(2, -10 * t) }, easeInOutExpo: function (t) { return 0 === t ? 0 : 1 === t ? 1 : (t /= .5) < 1 ? .5 * Math.pow(2, 10 * (t - 1)) : .5 * (2 - Math.pow(2, -10 * --t)) }, easeInCirc: function (t) { return t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1) }, easeOutCirc: function (t) { return Math.sqrt(1 - (t -= 1) * t) }, easeInOutCirc: function (t) { return (t /= .5) < 1 ? -.5 * (Math.sqrt(1 - t * t) - 1) : .5 * (Math.sqrt(1 - (t -= 2) * t) + 1) }, easeInElastic: function (t) { var e = 1.70158, n = 0, i = 1; return 0 === t ? 0 : 1 === t ? 1 : (n || (n = .3), i < 1 ? (i = 1, e = n / 4) : e = n / (2 * Math.PI) * Math.asin(1 / i), -i * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / n)) }, easeOutElastic: function (t) { var e = 1.70158, n = 0, i = 1; return 0 === t ? 0 : 1 === t ? 1 : (n || (n = .3), i < 1 ? (i = 1, e = n / 4) : e = n / (2 * Math.PI) * Math.asin(1 / i), i * Math.pow(2, -10 * t) * Math.sin((t - e) * (2 * Math.PI) / n) + 1) }, easeInOutElastic: function (t) { var e = 1.70158, n = 0, i = 1; return 0 === t ? 0 : 2 == (t /= .5) ? 1 : (n || (n = .45), i < 1 ? (i = 1, e = n / 4) : e = n / (2 * Math.PI) * Math.asin(1 / i), t < 1 ? i * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / n) * -.5 : i * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / n) * .5 + 1) }, easeInBack: function (t) { var e = 1.70158; return t * t * ((e + 1) * t - e) }, easeOutBack: function (t) { var e = 1.70158; return (t -= 1) * t * ((e + 1) * t + e) + 1 }, easeInOutBack: function (t) { var e = 1.70158; return (t /= .5) < 1 ? t * t * ((1 + (e *= 1.525)) * t - e) * .5 : .5 * ((t -= 2) * t * ((1 + (e *= 1.525)) * t + e) + 2) }, easeInBounce: function (t) { return 1 - C.easeOutBounce(1 - t) }, easeOutBounce: function (t) { return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375 }, easeInOutBounce: function (t) { return t < .5 ? .5 * C.easeInBounce(2 * t) : .5 * C.easeOutBounce(2 * t - 1) + .5 } }, P = { effects: C }; D.easingEffects = C; var T = Math.PI, O = T / 180, A = 2 * T, F = T / 2, I = T / 4, L = 2 * T / 3, R = { clear: function (t) { t.ctx.clearRect(0, 0, t.width, t.height) }, roundedRect: function (t, e, n, i, a, r) { if (r) { var o = Math.min(r, a / 2, i / 2), s = e + o, l = n + o, u = e + i - o, d = n + a - o; t.moveTo(e, l), s < u && l < d ? (t.arc(s, l, o, -T, -F), t.arc(u, l, o, -F, 0), t.arc(u, d, o, 0, F), t.arc(s, d, o, F, T)) : s < u ? (t.moveTo(s, n), t.arc(u, l, o, -F, F), t.arc(s, l, o, F, T + F)) : l < d ? (t.arc(s, l, o, -T, 0), t.arc(s, d, o, 0, T)) : t.arc(s, l, o, -T, T), t.closePath(), t.moveTo(e, n) } else t.rect(e, n, i, a) }, drawPoint: function (t, e, n, i, a, r) { var o, s, l, u, d, h = (r || 0) * O; if (e && "object" == typeof e && ("[object HTMLImageElement]" === (o = e.toString()) || "[object HTMLCanvasElement]" === o)) return t.save(), t.translate(i, a), t.rotate(h), t.drawImage(e, -e.width / 2, -e.height / 2, e.width, e.height), void t.restore(); if (!(isNaN(n) || n <= 0)) { switch (t.beginPath(), e) { default: t.arc(i, a, n, 0, A), t.closePath(); break; case "triangle": t.moveTo(i + Math.sin(h) * n, a - Math.cos(h) * n), h += L, t.lineTo(i + Math.sin(h) * n, a - Math.cos(h) * n), h += L, t.lineTo(i + Math.sin(h) * n, a - Math.cos(h) * n), t.closePath(); break; case "rectRounded": u = n - (d = .516 * n), s = Math.cos(h + I) * u, l = Math.sin(h + I) * u, t.arc(i - s, a - l, d, h - T, h - F), t.arc(i + l, a - s, d, h - F, h), t.arc(i + s, a + l, d, h, h + F), t.arc(i - l, a + s, d, h + F, h + T), t.closePath(); break; case "rect": if (!r) { u = Math.SQRT1_2 * n, t.rect(i - u, a - u, 2 * u, 2 * u); break } h += I; case "rectRot": s = Math.cos(h) * n, l = Math.sin(h) * n, t.moveTo(i - s, a - l), t.lineTo(i + l, a - s), t.lineTo(i + s, a + l), t.lineTo(i - l, a + s), t.closePath(); break; case "crossRot": h += I; case "cross": s = Math.cos(h) * n, l = Math.sin(h) * n, t.moveTo(i - s, a - l), t.lineTo(i + s, a + l), t.moveTo(i + l, a - s), t.lineTo(i - l, a + s); break; case "star": s = Math.cos(h) * n, l = Math.sin(h) * n, t.moveTo(i - s, a - l), t.lineTo(i + s, a + l), t.moveTo(i + l, a - s), t.lineTo(i - l, a + s), h += I, s = Math.cos(h) * n, l = Math.sin(h) * n, t.moveTo(i - s, a - l), t.lineTo(i + s, a + l), t.moveTo(i + l, a - s), t.lineTo(i - l, a + s); break; case "line": s = Math.cos(h) * n, l = Math.sin(h) * n, t.moveTo(i - s, a - l), t.lineTo(i + s, a + l); break; case "dash": t.moveTo(i, a), t.lineTo(i + Math.cos(h) * n, a + Math.sin(h) * n) }t.fill(), t.stroke() } }, _isPointInArea: function (t, e) { return t.x > e.left - 1e-6 && t.x < e.right + 1e-6 && t.y > e.top - 1e-6 && t.y < e.bottom + 1e-6 }, clipArea: function (t, e) { t.save(), t.beginPath(), t.rect(e.left, e.top, e.right - e.left, e.bottom - e.top), t.clip() }, unclipArea: function (t) { t.restore() }, lineTo: function (t, e, n, i) { var a = n.steppedLine; if (a) { if ("middle" === a) { var r = (e.x + n.x) / 2; t.lineTo(r, i ? n.y : e.y), t.lineTo(r, i ? e.y : n.y) } else "after" === a && !i || "after" !== a && i ? t.lineTo(e.x, n.y) : t.lineTo(n.x, e.y); t.lineTo(n.x, n.y) } else n.tension ? t.bezierCurveTo(i ? e.controlPointPreviousX : e.controlPointNextX, i ? e.controlPointPreviousY : e.controlPointNextY, i ? n.controlPointNextX : n.controlPointPreviousX, i ? n.controlPointNextY : n.controlPointPreviousY, n.x, n.y) : t.lineTo(n.x, n.y) } }, N = R; D.clear = R.clear, D.drawRoundedRectangle = function (t) { t.beginPath(), R.roundedRect.apply(R, arguments) }; var W = { _set: function (t, e) { return D.merge(this[t] || (this[t] = {}), e) } }; W._set("global", { defaultColor: "rgba(0,0,0,0.1)", defaultFontColor: "#666", defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", defaultFontSize: 12, defaultFontStyle: "normal", defaultLineHeight: 1.2, showLines: !0 }); var Y = W, z = D.valueOrDefault; var E = { toLineHeight: function (t, e) { var n = ("" + t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); if (!n || "normal" === n[1]) return 1.2 * e; switch (t = +n[2], n[3]) { case "px": return t; case "%": t /= 100 }return e * t }, toPadding: function (t) { var e, n, i, a; return D.isObject(t) ? (e = +t.top || 0, n = +t.right || 0, i = +t.bottom || 0, a = +t.left || 0) : e = n = i = a = +t || 0, { top: e, right: n, bottom: i, left: a, height: e + i, width: a + n } }, _parseFont: function (t) { var e = Y.global, n = z(t.fontSize, e.defaultFontSize), i = { family: z(t.fontFamily, e.defaultFontFamily), lineHeight: D.options.toLineHeight(z(t.lineHeight, e.defaultLineHeight), n), size: n, style: z(t.fontStyle, e.defaultFontStyle), weight: null, string: "" }; return i.string = function (t) { return !t || D.isNullOrUndef(t.size) || D.isNullOrUndef(t.family) ? null : (t.style ? t.style + " " : "") + (t.weight ? t.weight + " " : "") + t.size + "px " + t.family }(i), i }, resolve: function (t, e, n, i) { var a, r, o, s = !0; for (a = 0, r = t.length; a < r; ++a)if (void 0 !== (o = t[a]) && (void 0 !== e && "function" == typeof o && (o = o(e), s = !1), void 0 !== n && D.isArray(o) && (o = o[n], s = !1), void 0 !== o)) return i && !s && (i.cacheable = !1), o } }, V = { _factorize: function (t) { var e, n = [], i = Math.sqrt(t); for (e = 1; e < i; e++)t % e == 0 && (n.push(e), n.push(t / e)); return i === (0 | i) && n.push(i), n.sort((function (t, e) { return t - e })).pop(), n }, log10: Math.log10 || function (t) { var e = Math.log(t) * Math.LOG10E, n = Math.round(e); return t === Math.pow(10, n) ? n : e } }, H = V; D.log10 = V.log10; var B = D, j = P, U = N, G = E, q = H, Z = { getRtlAdapter: function (t, e, n) { return t ? function (t, e) { return { x: function (n) { return t + t + e - n }, setWidth: function (t) { e = t }, textAlign: function (t) { return "center" === t ? t : "right" === t ? "left" : "right" }, xPlus: function (t, e) { return t - e }, leftForLtr: function (t, e) { return t - e } } }(e, n) : { x: function (t) { return t }, setWidth: function (t) { }, textAlign: function (t) { return t }, xPlus: function (t, e) { return t + e }, leftForLtr: function (t, e) { return t } } }, overrideTextDirection: function (t, e) { var n, i; "ltr" !== e && "rtl" !== e || (i = [(n = t.canvas.style).getPropertyValue("direction"), n.getPropertyPriority("direction")], n.setProperty("direction", e, "important"), t.prevTextDirection = i) }, restoreTextDirection: function (t) { var e = t.prevTextDirection; void 0 !== e && (delete t.prevTextDirection, t.canvas.style.setProperty("direction", e[0], e[1])) } }; B.easing = j, B.canvas = U, B.options = G, B.math = q, B.rtl = Z; var $ = function (t) { B.extend(this, t), this.initialize.apply(this, arguments) }; B.extend($.prototype, { _type: void 0, initialize: function () { this.hidden = !1 }, pivot: function () { var t = this; return t._view || (t._view = B.extend({}, t._model)), t._start = {}, t }, transition: function (t) { var e = this, n = e._model, i = e._start, a = e._view; return n && 1 !== t ? (a || (a = e._view = {}), i || (i = e._start = {}), function (t, e, n, i) { var a, r, o, s, l, u, d, h, c, f = Object.keys(n); for (a = 0, r = f.length; a < r; ++a)if (u = n[o = f[a]], e.hasOwnProperty(o) || (e[o] = u), (s = e[o]) !== u && "_" !== o[0]) { if (t.hasOwnProperty(o) || (t[o] = s), (d = typeof u) === typeof (l = t[o])) if ("string" === d) { if ((h = w(l)).valid && (c = w(u)).valid) { e[o] = c.mix(h, i).rgbString(); continue } } else if (B.isFinite(l) && B.isFinite(u)) { e[o] = l + (u - l) * i; continue } e[o] = u } }(i, a, n, t), e) : (e._view = B.extend({}, n), e._start = null, e) }, tooltipPosition: function () { return { x: this._model.x, y: this._model.y } }, hasValue: function () { return B.isNumber(this._model.x) && B.isNumber(this._model.y) } }), $.extend = B.inherits; var X = $, K = X.extend({ chart: null, currentStep: 0, numSteps: 60, easing: "", render: null, onAnimationProgress: null, onAnimationComplete: null }), J = K; Object.defineProperty(K.prototype, "animationObject", { get: function () { return this } }), Object.defineProperty(K.prototype, "chartInstance", { get: function () { return this.chart }, set: function (t) { this.chart = t } }), Y._set("global", { animation: { duration: 1e3, easing: "easeOutQuart", onProgress: B.noop, onComplete: B.noop } }); var Q = { animations: [], request: null, addAnimation: function (t, e, n, i) { var a, r, o = this.animations; for (e.chart = t, e.startTime = Date.now(), e.duration = n, i || (t.animating = !0), a = 0, r = o.length; a < r; ++a)if (o[a].chart === t) return void (o[a] = e); o.push(e), 1 === o.length && this.requestAnimationFrame() }, cancelAnimation: function (t) { var e = B.findIndex(this.animations, (function (e) { return e.chart === t })); -1 !== e && (this.animations.splice(e, 1), t.animating = !1) }, requestAnimationFrame: function () { var t = this; null === t.request && (t.request = B.requestAnimFrame.call(window, (function () { t.request = null, t.startDigest() }))) }, startDigest: function () { this.advance(), this.animations.length > 0 && this.requestAnimationFrame() }, advance: function () { for (var t, e, n, i, a = this.animations, r = 0; r < a.length;)e = (t = a[r]).chart, n = t.numSteps, i = Math.floor((Date.now() - t.startTime) / t.duration * n) + 1, t.currentStep = Math.min(i, n), B.callback(t.render, [e, t], e), B.callback(t.onAnimationProgress, [t], e), t.currentStep >= n ? (B.callback(t.onAnimationComplete, [t], e), e.animating = !1, a.splice(r, 1)) : ++r } }, tt = B.options.resolve, et = ["push", "pop", "shift", "splice", "unshift"]; function nt(t, e) { var n = t._chartjs; if (n) { var i = n.listeners, a = i.indexOf(e); -1 !== a && i.splice(a, 1), i.length > 0 || (et.forEach((function (e) { delete t[e] })), delete t._chartjs) } } var it = function (t, e) { this.initialize(t, e) }; B.extend(it.prototype, { datasetElementType: null, dataElementType: null, _datasetElementOptions: ["backgroundColor", "borderCapStyle", "borderColor", "borderDash", "borderDashOffset", "borderJoinStyle", "borderWidth"], _dataElementOptions: ["backgroundColor", "borderColor", "borderWidth", "pointStyle"], initialize: function (t, e) { var n = this; n.chart = t, n.index = e, n.linkScales(), n.addElements(), n._type = n.getMeta().type }, updateIndex: function (t) { this.index = t }, linkScales: function () { var t = this.getMeta(), e = this.chart, n = e.scales, i = this.getDataset(), a = e.options.scales; null !== t.xAxisID && t.xAxisID in n && !i.xAxisID || (t.xAxisID = i.xAxisID || a.xAxes[0].id), null !== t.yAxisID && t.yAxisID in n && !i.yAxisID || (t.yAxisID = i.yAxisID || a.yAxes[0].id) }, getDataset: function () { return this.chart.data.datasets[this.index] }, getMeta: function () { return this.chart.getDatasetMeta(this.index) }, getScaleForId: function (t) { return this.chart.scales[t] }, _getValueScaleId: function () { return this.getMeta().yAxisID }, _getIndexScaleId: function () { return this.getMeta().xAxisID }, _getValueScale: function () { return this.getScaleForId(this._getValueScaleId()) }, _getIndexScale: function () { return this.getScaleForId(this._getIndexScaleId()) }, reset: function () { this._update(!0) }, destroy: function () { this._data && nt(this._data, this) }, createMetaDataset: function () { var t = this.datasetElementType; return t && new t({ _chart: this.chart, _datasetIndex: this.index }) }, createMetaData: function (t) { var e = this.dataElementType; return e && new e({ _chart: this.chart, _datasetIndex: this.index, _index: t }) }, addElements: function () { var t, e, n = this.getMeta(), i = this.getDataset().data || [], a = n.data; for (t = 0, e = i.length; t < e; ++t)a[t] = a[t] || this.createMetaData(t); n.dataset = n.dataset || this.createMetaDataset() }, addElementAndReset: function (t) { var e = this.createMetaData(t); this.getMeta().data.splice(t, 0, e), this.updateElement(e, t, !0) }, buildOrUpdateElements: function () { var t, e, n = this, i = n.getDataset(), a = i.data || (i.data = []); n._data !== a && (n._data && nt(n._data, n), a && Object.isExtensible(a) && (e = n, (t = a)._chartjs ? t._chartjs.listeners.push(e) : (Object.defineProperty(t, "_chartjs", { configurable: !0, enumerable: !1, value: { listeners: [e] } }), et.forEach((function (e) { var n = "onData" + e.charAt(0).toUpperCase() + e.slice(1), i = t[e]; Object.defineProperty(t, e, { configurable: !0, enumerable: !1, value: function () { var e = Array.prototype.slice.call(arguments), a = i.apply(this, e); return B.each(t._chartjs.listeners, (function (t) { "function" == typeof t[n] && t[n].apply(t, e) })), a } }) })))), n._data = a), n.resyncElements() }, _configure: function () { this._config = B.merge(Object.create(null), [this.chart.options.datasets[this._type], this.getDataset()], { merger: function (t, e, n) { "_meta" !== t && "data" !== t && B._merger(t, e, n) } }) }, _update: function (t) { this._configure(), this._cachedDataOpts = null, this.update(t) }, update: B.noop, transition: function (t) { for (var e = this.getMeta(), n = e.data || [], i = n.length, a = 0; a < i; ++a)n[a].transition(t); e.dataset && e.dataset.transition(t) }, draw: function () { var t = this.getMeta(), e = t.data || [], n = e.length, i = 0; for (t.dataset && t.dataset.draw(); i < n; ++i)e[i].draw() }, getStyle: function (t) { var e, n = this.getMeta(), i = n.dataset; return this._configure(), i && void 0 === t ? e = this._resolveDatasetElementOptions(i || {}) : (t = t || 0, e = this._resolveDataElementOptions(n.data[t] || {}, t)), !1 !== e.fill && null !== e.fill || (e.backgroundColor = e.borderColor), e }, _resolveDatasetElementOptions: function (t, e) { var n, i, a, r, o = this, s = o.chart, l = o._config, u = t.custom || {}, d = s.options.elements[o.datasetElementType.prototype._type] || {}, h = o._datasetElementOptions, c = {}, f = { chart: s, dataset: o.getDataset(), datasetIndex: o.index, hover: e }; for (n = 0, i = h.length; n < i; ++n)a = h[n], r = e ? "hover" + a.charAt(0).toUpperCase() + a.slice(1) : a, c[a] = tt([u[r], l[r], d[r]], f); return c }, _resolveDataElementOptions: function (t, e) { var n = this, i = t && t.custom, a = n._cachedDataOpts; if (a && !i) return a; var r, o, s, l, u = n.chart, d = n._config, h = u.options.elements[n.dataElementType.prototype._type] || {}, c = n._dataElementOptions, f = {}, g = { chart: u, dataIndex: e, dataset: n.getDataset(), datasetIndex: n.index }, m = { cacheable: !i }; if (i = i || {}, B.isArray(c)) for (o = 0, s = c.length; o < s; ++o)f[l = c[o]] = tt([i[l], d[l], h[l]], g, e, m); else for (o = 0, s = (r = Object.keys(c)).length; o < s; ++o)f[l = r[o]] = tt([i[l], d[c[l]], d[l], h[l]], g, e, m); return m.cacheable && (n._cachedDataOpts = Object.freeze(f)), f }, removeHoverStyle: function (t) { B.merge(t._model, t.$previousStyle || {}), delete t.$previousStyle }, setHoverStyle: function (t) { var e = this.chart.data.datasets[t._datasetIndex], n = t._index, i = t.custom || {}, a = t._model, r = B.getHoverColor; t.$previousStyle = { backgroundColor: a.backgroundColor, borderColor: a.borderColor, borderWidth: a.borderWidth }, a.backgroundColor = tt([i.hoverBackgroundColor, e.hoverBackgroundColor, r(a.backgroundColor)], void 0, n), a.borderColor = tt([i.hoverBorderColor, e.hoverBorderColor, r(a.borderColor)], void 0, n), a.borderWidth = tt([i.hoverBorderWidth, e.hoverBorderWidth, a.borderWidth], void 0, n) }, _removeDatasetHoverStyle: function () { var t = this.getMeta().dataset; t && this.removeHoverStyle(t) }, _setDatasetHoverStyle: function () { var t, e, n, i, a, r, o = this.getMeta().dataset, s = {}; if (o) { for (r = o._model, a = this._resolveDatasetElementOptions(o, !0), t = 0, e = (i = Object.keys(a)).length; t < e; ++t)s[n = i[t]] = r[n], r[n] = a[n]; o.$previousStyle = s } }, resyncElements: function () { var t = this.getMeta(), e = this.getDataset().data, n = t.data.length, i = e.length; i < n ? t.data.splice(i, n - i) : i > n && this.insertElements(n, i - n) }, insertElements: function (t, e) { for (var n = 0; n < e; ++n)this.addElementAndReset(t + n) }, onDataPush: function () { var t = arguments.length; this.insertElements(this.getDataset().data.length - t, t) }, onDataPop: function () { this.getMeta().data.pop() }, onDataShift: function () { this.getMeta().data.shift() }, onDataSplice: function (t, e) { this.getMeta().data.splice(t, e), this.insertElements(t, arguments.length - 2) }, onDataUnshift: function () { this.insertElements(0, arguments.length) } }), it.extend = B.inherits; var at = it, rt = 2 * Math.PI; function ot(t, e) { var n = e.startAngle, i = e.endAngle, a = e.pixelMargin, r = a / e.outerRadius, o = e.x, s = e.y; t.beginPath(), t.arc(o, s, e.outerRadius, n - r, i + r), e.innerRadius > a ? (r = a / e.innerRadius, t.arc(o, s, e.innerRadius - a, i + r, n - r, !0)) : t.arc(o, s, a, i + Math.PI / 2, n - Math.PI / 2), t.closePath(), t.clip() } function st(t, e, n) { var i = "inner" === e.borderAlign; i ? (t.lineWidth = 2 * e.borderWidth, t.lineJoin = "round") : (t.lineWidth = e.borderWidth, t.lineJoin = "bevel"), n.fullCircles && function (t, e, n, i) { var a, r = n.endAngle; for (i && (n.endAngle = n.startAngle + rt, ot(t, n), n.endAngle = r, n.endAngle === n.startAngle && n.fullCircles && (n.endAngle += rt, n.fullCircles--)), t.beginPath(), t.arc(n.x, n.y, n.innerRadius, n.startAngle + rt, n.startAngle, !0), a = 0; a < n.fullCircles; ++a)t.stroke(); for (t.beginPath(), t.arc(n.x, n.y, e.outerRadius, n.startAngle, n.startAngle + rt), a = 0; a < n.fullCircles; ++a)t.stroke() }(t, e, n, i), i && ot(t, n), t.beginPath(), t.arc(n.x, n.y, e.outerRadius, n.startAngle, n.endAngle), t.arc(n.x, n.y, n.innerRadius, n.endAngle, n.startAngle, !0), t.closePath(), t.stroke() } Y._set("global", { elements: { arc: { backgroundColor: Y.global.defaultColor, borderColor: "#fff", borderWidth: 2, borderAlign: "center" } } }); var lt = X.extend({ _type: "arc", inLabelRange: function (t) { var e = this._view; return !!e && Math.pow(t - e.x, 2) < Math.pow(e.radius + e.hoverRadius, 2) }, inRange: function (t, e) { var n = this._view; if (n) { for (var i = B.getAngleFromPoint(n, { x: t, y: e }), a = i.angle, r = i.distance, o = n.startAngle, s = n.endAngle; s < o;)s += rt; for (; a > s;)a -= rt; for (; a < o;)a += rt; var l = a >= o && a <= s, u = r >= n.innerRadius && r <= n.outerRadius; return l && u } return !1 }, getCenterPoint: function () { var t = this._view, e = (t.startAngle + t.endAngle) / 2, n = (t.innerRadius + t.outerRadius) / 2; return { x: t.x + Math.cos(e) * n, y: t.y + Math.sin(e) * n } }, getArea: function () { var t = this._view; return Math.PI * ((t.endAngle - t.startAngle) / (2 * Math.PI)) * (Math.pow(t.outerRadius, 2) - Math.pow(t.innerRadius, 2)) }, tooltipPosition: function () { var t = this._view, e = t.startAngle + (t.endAngle - t.startAngle) / 2, n = (t.outerRadius - t.innerRadius) / 2 + t.innerRadius; return { x: t.x + Math.cos(e) * n, y: t.y + Math.sin(e) * n } }, draw: function () { var t, e = this._chart.ctx, n = this._view, i = "inner" === n.borderAlign ? .33 : 0, a = { x: n.x, y: n.y, innerRadius: n.innerRadius, outerRadius: Math.max(n.outerRadius - i, 0), pixelMargin: i, startAngle: n.startAngle, endAngle: n.endAngle, fullCircles: Math.floor(n.circumference / rt) }; if (e.save(), e.fillStyle = n.backgroundColor, e.strokeStyle = n.borderColor, a.fullCircles) { for (a.endAngle = a.startAngle + rt, e.beginPath(), e.arc(a.x, a.y, a.outerRadius, a.startAngle, a.endAngle), e.arc(a.x, a.y, a.innerRadius, a.endAngle, a.startAngle, !0), e.closePath(), t = 0; t < a.fullCircles; ++t)e.fill(); a.endAngle = a.startAngle + n.circumference % rt } e.beginPath(), e.arc(a.x, a.y, a.outerRadius, a.startAngle, a.endAngle), e.arc(a.x, a.y, a.innerRadius, a.endAngle, a.startAngle, !0), e.closePath(), e.fill(), n.borderWidth && st(e, n, a), e.restore() } }), ut = B.valueOrDefault, dt = Y.global.defaultColor; Y._set("global", { elements: { line: { tension: .4, backgroundColor: dt, borderWidth: 3, borderColor: dt, borderCapStyle: "butt", borderDash: [], borderDashOffset: 0, borderJoinStyle: "miter", capBezierPoints: !0, fill: !0 } } }); var ht = X.extend({ _type: "line", draw: function () { var t, e, n, i = this, a = i._view, r = i._chart.ctx, o = a.spanGaps, s = i._children.slice(), l = Y.global, u = l.elements.line, d = -1, h = i._loop; if (s.length) { if (i._loop) { for (t = 0; t < s.length; ++t)if (e = B.previousItem(s, t), !s[t]._view.skip && e._view.skip) { s = s.slice(t).concat(s.slice(0, t)), h = o; break } h && s.push(s[0]) } for (r.save(), r.lineCap = a.borderCapStyle || u.borderCapStyle, r.setLineDash && r.setLineDash(a.borderDash || u.borderDash), r.lineDashOffset = ut(a.borderDashOffset, u.borderDashOffset), r.lineJoin = a.borderJoinStyle || u.borderJoinStyle, r.lineWidth = ut(a.borderWidth, u.borderWidth), r.strokeStyle = a.borderColor || l.defaultColor, r.beginPath(), (n = s[0]._view).skip || (r.moveTo(n.x, n.y), d = 0), t = 1; t < s.length; ++t)n = s[t]._view, e = -1 === d ? B.previousItem(s, t) : s[d], n.skip || (d !== t - 1 && !o || -1 === d ? r.moveTo(n.x, n.y) : B.canvas.lineTo(r, e._view, n), d = t); h && r.closePath(), r.stroke(), r.restore() } } }), ct = B.valueOrDefault, ft = Y.global.defaultColor; function gt(t) { var e = this._view; return !!e && Math.abs(t - e.x) < e.radius + e.hitRadius } Y._set("global", { elements: { point: { radius: 3, pointStyle: "circle", backgroundColor: ft, borderColor: ft, borderWidth: 1, hitRadius: 1, hoverRadius: 4, hoverBorderWidth: 1 } } }); var mt = X.extend({ _type: "point", inRange: function (t, e) { var n = this._view; return !!n && Math.pow(t - n.x, 2) + Math.pow(e - n.y, 2) < Math.pow(n.hitRadius + n.radius, 2) }, inLabelRange: gt, inXRange: gt, inYRange: function (t) { var e = this._view; return !!e && Math.abs(t - e.y) < e.radius + e.hitRadius }, getCenterPoint: function () { var t = this._view; return { x: t.x, y: t.y } }, getArea: function () { return Math.PI * Math.pow(this._view.radius, 2) }, tooltipPosition: function () { var t = this._view; return { x: t.x, y: t.y, padding: t.radius + t.borderWidth } }, draw: function (t) { var e = this._view, n = this._chart.ctx, i = e.pointStyle, a = e.rotation, r = e.radius, o = e.x, s = e.y, l = Y.global, u = l.defaultColor; e.skip || (void 0 === t || B.canvas._isPointInArea(e, t)) && (n.strokeStyle = e.borderColor || u, n.lineWidth = ct(e.borderWidth, l.elements.point.borderWidth), n.fillStyle = e.backgroundColor || u, B.canvas.drawPoint(n, i, r, o, s, a)) } }), pt = Y.global.defaultColor; function vt(t) { return t && void 0 !== t.width } function bt(t) { var e, n, i, a, r; return vt(t) ? (r = t.width / 2, e = t.x - r, n = t.x + r, i = Math.min(t.y, t.base), a = Math.max(t.y, t.base)) : (r = t.height / 2, e = Math.min(t.x, t.base), n = Math.max(t.x, t.base), i = t.y - r, a = t.y + r), { left: e, top: i, right: n, bottom: a } } function yt(t, e, n) { return t === e ? n : t === n ? e : t } function xt(t, e, n) { var i, a, r, o, s = t.borderWidth, l = function (t) { var e = t.borderSkipped, n = {}; return e ? (t.horizontal ? t.base > t.x && (e = yt(e, "left", "right")) : t.base < t.y && (e = yt(e, "bottom", "top")), n[e] = !0, n) : n }(t); return B.isObject(s) ? (i = +s.top || 0, a = +s.right || 0, r = +s.bottom || 0, o = +s.left || 0) : i = a = r = o = +s || 0, { t: l.top || i < 0 ? 0 : i > n ? n : i, r: l.right || a < 0 ? 0 : a > e ? e : a, b: l.bottom || r < 0 ? 0 : r > n ? n : r, l: l.left || o < 0 ? 0 : o > e ? e : o } } function _t(t, e, n) { var i = null === e, a = null === n, r = !(!t || i && a) && bt(t); return r && (i || e >= r.left && e <= r.right) && (a || n >= r.top && n <= r.bottom) } Y._set("global", { elements: { rectangle: { backgroundColor: pt, borderColor: pt, borderSkipped: "bottom", borderWidth: 0 } } }); var wt = X.extend({ _type: "rectangle", draw: function () { var t = this._chart.ctx, e = this._view, n = function (t) { var e = bt(t), n = e.right - e.left, i = e.bottom - e.top, a = xt(t, n / 2, i / 2); return { outer: { x: e.left, y: e.top, w: n, h: i }, inner: { x: e.left + a.l, y: e.top + a.t, w: n - a.l - a.r, h: i - a.t - a.b } } }(e), i = n.outer, a = n.inner; t.fillStyle = e.backgroundColor, t.fillRect(i.x, i.y, i.w, i.h), i.w === a.w && i.h === a.h || (t.save(), t.beginPath(), t.rect(i.x, i.y, i.w, i.h), t.clip(), t.fillStyle = e.borderColor, t.rect(a.x, a.y, a.w, a.h), t.fill("evenodd"), t.restore()) }, height: function () { var t = this._view; return t.base - t.y }, inRange: function (t, e) { return _t(this._view, t, e) }, inLabelRange: function (t, e) { var n = this._view; return vt(n) ? _t(n, t, null) : _t(n, null, e) }, inXRange: function (t) { return _t(this._view, t, null) }, inYRange: function (t) { return _t(this._view, null, t) }, getCenterPoint: function () { var t, e, n = this._view; return vt(n) ? (t = n.x, e = (n.y + n.base) / 2) : (t = (n.x + n.base) / 2, e = n.y), { x: t, y: e } }, getArea: function () { var t = this._view; return vt(t) ? t.width * Math.abs(t.y - t.base) : t.height * Math.abs(t.x - t.base) }, tooltipPosition: function () { var t = this._view; return { x: t.x, y: t.y } } }), kt = {}, Mt = lt, St = ht, Dt = mt, Ct = wt; kt.Arc = Mt, kt.Line = St, kt.Point = Dt, kt.Rectangle = Ct; var Pt = B._deprecated, Tt = B.valueOrDefault; function Ot(t, e, n) { var i, a, r = n.barThickness, o = e.stackCount, s = e.pixels[t], l = B.isNullOrUndef(r) ? function (t, e) { var n, i, a, r, o = t._length; for (a = 1, r = e.length; a < r; ++a)o = Math.min(o, Math.abs(e[a] - e[a - 1])); for (a = 0, r = t.getTicks().length; a < r; ++a)i = t.getPixelForTick(a), o = a > 0 ? Math.min(o, Math.abs(i - n)) : o, n = i; return o }(e.scale, e.pixels) : -1; return B.isNullOrUndef(r) ? (i = l * n.categoryPercentage, a = n.barPercentage) : (i = r * o, a = 1), { chunk: i / o, ratio: a, start: s - i / 2 } } Y._set("bar", { hover: { mode: "label" }, scales: { xAxes: [{ type: "category", offset: !0, gridLines: { offsetGridLines: !0 } }], yAxes: [{ type: "linear" }] } }), Y._set("global", { datasets: { bar: { categoryPercentage: .8, barPercentage: .9 } } }); var At = at.extend({ dataElementType: kt.Rectangle, _dataElementOptions: ["backgroundColor", "borderColor", "borderSkipped", "borderWidth", "barPercentage", "barThickness", "categoryPercentage", "maxBarThickness", "minBarLength"], initialize: function () { var t, e, n = this; at.prototype.initialize.apply(n, arguments), (t = n.getMeta()).stack = n.getDataset().stack, t.bar = !0, e = n._getIndexScale().options, Pt("bar chart", e.barPercentage, "scales.[x/y]Axes.barPercentage", "dataset.barPercentage"), Pt("bar chart", e.barThickness, "scales.[x/y]Axes.barThickness", "dataset.barThickness"), Pt("bar chart", e.categoryPercentage, "scales.[x/y]Axes.categoryPercentage", "dataset.categoryPercentage"), Pt("bar chart", n._getValueScale().options.minBarLength, "scales.[x/y]Axes.minBarLength", "dataset.minBarLength"), Pt("bar chart", e.maxBarThickness, "scales.[x/y]Axes.maxBarThickness", "dataset.maxBarThickness") }, update: function (t) { var e, n, i = this.getMeta().data; for (this._ruler = this.getRuler(), e = 0, n = i.length; e < n; ++e)this.updateElement(i[e], e, t) }, updateElement: function (t, e, n) { var i = this, a = i.getMeta(), r = i.getDataset(), o = i._resolveDataElementOptions(t, e); t._xScale = i.getScaleForId(a.xAxisID), t._yScale = i.getScaleForId(a.yAxisID), t._datasetIndex = i.index, t._index = e, t._model = { backgroundColor: o.backgroundColor, borderColor: o.borderColor, borderSkipped: o.borderSkipped, borderWidth: o.borderWidth, datasetLabel: r.label, label: i.chart.data.labels[e] }, B.isArray(r.data[e]) && (t._model.borderSkipped = null), i._updateElementGeometry(t, e, n, o), t.pivot() }, _updateElementGeometry: function (t, e, n, i) { var a = this, r = t._model, o = a._getValueScale(), s = o.getBasePixel(), l = o.isHorizontal(), u = a._ruler || a.getRuler(), d = a.calculateBarValuePixels(a.index, e, i), h = a.calculateBarIndexPixels(a.index, e, u, i); r.horizontal = l, r.base = n ? s : d.base, r.x = l ? n ? s : d.head : h.center, r.y = l ? h.center : n ? s : d.head, r.height = l ? h.size : void 0, r.width = l ? void 0 : h.size }, _getStacks: function (t) { var e, n, i = this._getIndexScale(), a = i._getMatchingVisibleMetas(this._type), r = i.options.stacked, o = a.length, s = []; for (e = 0; e < o && (n = a[e], (!1 === r || -1 === s.indexOf(n.stack) || void 0 === r && void 0 === n.stack) && s.push(n.stack), n.index !== t); ++e); return s }, getStackCount: function () { return this._getStacks().length }, getStackIndex: function (t, e) { var n = this._getStacks(t), i = void 0 !== e ? n.indexOf(e) : -1; return -1 === i ? n.length - 1 : i }, getRuler: function () { var t, e, n = this._getIndexScale(), i = []; for (t = 0, e = this.getMeta().data.length; t < e; ++t)i.push(n.getPixelForValue(null, t, this.index)); return { pixels: i, start: n._startPixel, end: n._endPixel, stackCount: this.getStackCount(), scale: n } }, calculateBarValuePixels: function (t, e, n) { var i, a, r, o, s, l, u, d = this.chart, h = this._getValueScale(), c = h.isHorizontal(), f = d.data.datasets, g = h._getMatchingVisibleMetas(this._type), m = h._parseValue(f[t].data[e]), p = n.minBarLength, v = h.options.stacked, b = this.getMeta().stack, y = void 0 === m.start ? 0 : m.max >= 0 && m.min >= 0 ? m.min : m.max, x = void 0 === m.start ? m.end : m.max >= 0 && m.min >= 0 ? m.max - m.min : m.min - m.max, _ = g.length; if (v || void 0 === v && void 0 !== b) for (i = 0; i < _ && (a = g[i]).index !== t; ++i)a.stack === b && (r = void 0 === (u = h._parseValue(f[a.index].data[e])).start ? u.end : u.min >= 0 && u.max >= 0 ? u.max : u.min, (m.min < 0 && r < 0 || m.max >= 0 && r > 0) && (y += r)); return o = h.getPixelForValue(y), l = (s = h.getPixelForValue(y + x)) - o, void 0 !== p && Math.abs(l) < p && (l = p, s = x >= 0 && !c || x < 0 && c ? o - p : o + p), { size: l, base: o, head: s, center: s + l / 2 } }, calculateBarIndexPixels: function (t, e, n, i) { var a = "flex" === i.barThickness ? function (t, e, n) { var i, a = e.pixels, r = a[t], o = t > 0 ? a[t - 1] : null, s = t < a.length - 1 ? a[t + 1] : null, l = n.categoryPercentage; return null === o && (o = r - (null === s ? e.end - e.start : s - r)), null === s && (s = r + r - o), i = r - (r - Math.min(o, s)) / 2 * l, { chunk: Math.abs(s - o) / 2 * l / e.stackCount, ratio: n.barPercentage, start: i } }(e, n, i) : Ot(e, n, i), r = this.getStackIndex(t, this.getMeta().stack), o = a.start + a.chunk * r + a.chunk / 2, s = Math.min(Tt(i.maxBarThickness, 1 / 0), a.chunk * a.ratio); return { base: o - s / 2, head: o + s / 2, center: o, size: s } }, draw: function () { var t = this.chart, e = this._getValueScale(), n = this.getMeta().data, i = this.getDataset(), a = n.length, r = 0; for (B.canvas.clipArea(t.ctx, t.chartArea); r < a; ++r) { var o = e._parseValue(i.data[r]); isNaN(o.min) || isNaN(o.max) || n[r].draw() } B.canvas.unclipArea(t.ctx) }, _resolveDataElementOptions: function () { var t = this, e = B.extend({}, at.prototype._resolveDataElementOptions.apply(t, arguments)), n = t._getIndexScale().options, i = t._getValueScale().options; return e.barPercentage = Tt(n.barPercentage, e.barPercentage), e.barThickness = Tt(n.barThickness, e.barThickness), e.categoryPercentage = Tt(n.categoryPercentage, e.categoryPercentage), e.maxBarThickness = Tt(n.maxBarThickness, e.maxBarThickness), e.minBarLength = Tt(i.minBarLength, e.minBarLength), e } }), Ft = B.valueOrDefault, It = B.options.resolve; Y._set("bubble", { hover: { mode: "single" }, scales: { xAxes: [{ type: "linear", position: "bottom", id: "x-axis-0" }], yAxes: [{ type: "linear", position: "left", id: "y-axis-0" }] }, tooltips: { callbacks: { title: function () { return "" }, label: function (t, e) { var n = e.datasets[t.datasetIndex].label || "", i = e.datasets[t.datasetIndex].data[t.index]; return n + ": (" + t.xLabel + ", " + t.yLabel + ", " + i.r + ")" } } } }); var Lt = at.extend({ dataElementType: kt.Point, _dataElementOptions: ["backgroundColor", "borderColor", "borderWidth", "hoverBackgroundColor", "hoverBorderColor", "hoverBorderWidth", "hoverRadius", "hitRadius", "pointStyle", "rotation"], update: function (t) { var e = this, n = e.getMeta().data; B.each(n, (function (n, i) { e.updateElement(n, i, t) })) }, updateElement: function (t, e, n) { var i = this, a = i.getMeta(), r = t.custom || {}, o = i.getScaleForId(a.xAxisID), s = i.getScaleForId(a.yAxisID), l = i._resolveDataElementOptions(t, e), u = i.getDataset().data[e], d = i.index, h = n ? o.getPixelForDecimal(.5) : o.getPixelForValue("object" == typeof u ? u : NaN, e, d), c = n ? s.getBasePixel() : s.getPixelForValue(u, e, d); t._xScale = o, t._yScale = s, t._options = l, t._datasetIndex = d, t._index = e, t._model = { backgroundColor: l.backgroundColor, borderColor: l.borderColor, borderWidth: l.borderWidth, hitRadius: l.hitRadius, pointStyle: l.pointStyle, rotation: l.rotation, radius: n ? 0 : l.radius, skip: r.skip || isNaN(h) || isNaN(c), x: h, y: c }, t.pivot() }, setHoverStyle: function (t) { var e = t._model, n = t._options, i = B.getHoverColor; t.$previousStyle = { backgroundColor: e.backgroundColor, borderColor: e.borderColor, borderWidth: e.borderWidth, radius: e.radius }, e.backgroundColor = Ft(n.hoverBackgroundColor, i(n.backgroundColor)), e.borderColor = Ft(n.hoverBorderColor, i(n.borderColor)), e.borderWidth = Ft(n.hoverBorderWidth, n.borderWidth), e.radius = n.radius + n.hoverRadius }, _resolveDataElementOptions: function (t, e) { var n = this, i = n.chart, a = n.getDataset(), r = t.custom || {}, o = a.data[e] || {}, s = at.prototype._resolveDataElementOptions.apply(n, arguments), l = { chart: i, dataIndex: e, dataset: a, datasetIndex: n.index }; return n._cachedDataOpts === s && (s = B.extend({}, s)), s.radius = It([r.radius, o.r, n._config.radius, i.options.elements.point.radius], l, e), s } }), Rt = B.valueOrDefault, Nt = Math.PI, Wt = 2 * Nt, Yt = Nt / 2; Y._set("doughnut", { animation: { animateRotate: !0, animateScale: !1 }, hover: { mode: "single" }, legendCallback: function (t) { var e, n, i, a = document.createElement("ul"), r = t.data, o = r.datasets, s = r.labels; if (a.setAttribute("class", t.id + "-legend"), o.length) for (e = 0, n = o[0].data.length; e < n; ++e)(i = a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor = o[0].backgroundColor[e], s[e] && i.appendChild(document.createTextNode(s[e])); return a.outerHTML }, legend: { labels: { generateLabels: function (t) { var e = t.data; return e.labels.length && e.datasets.length ? e.labels.map((function (n, i) { var a = t.getDatasetMeta(0), r = a.controller.getStyle(i); return { text: n, fillStyle: r.backgroundColor, strokeStyle: r.borderColor, lineWidth: r.borderWidth, hidden: isNaN(e.datasets[0].data[i]) || a.data[i].hidden, index: i } })) : [] } }, onClick: function (t, e) { var n, i, a, r = e.index, o = this.chart; for (n = 0, i = (o.data.datasets || []).length; n < i; ++n)(a = o.getDatasetMeta(n)).data[r] && (a.data[r].hidden = !a.data[r].hidden); o.update() } }, cutoutPercentage: 50, rotation: -Yt, circumference: Wt, tooltips: { callbacks: { title: function () { return "" }, label: function (t, e) { var n = e.labels[t.index], i = ": " + e.datasets[t.datasetIndex].data[t.index]; return B.isArray(n) ? (n = n.slice())[0] += i : n += i, n } } } }); var zt = at.extend({ dataElementType: kt.Arc, linkScales: B.noop, _dataElementOptions: ["backgroundColor", "borderColor", "borderWidth", "borderAlign", "hoverBackgroundColor", "hoverBorderColor", "hoverBorderWidth"], getRingIndex: function (t) { for (var e = 0, n = 0; n < t; ++n)this.chart.isDatasetVisible(n) && ++e; return e }, update: function (t) { var e, n, i, a, r = this, o = r.chart, s = o.chartArea, l = o.options, u = 1, d = 1, h = 0, c = 0, f = r.getMeta(), g = f.data, m = l.cutoutPercentage / 100 || 0, p = l.circumference, v = r._getRingWeight(r.index); if (p < Wt) { var b = l.rotation % Wt, y = (b += b >= Nt ? -Wt : b < -Nt ? Wt : 0) + p, x = Math.cos(b), _ = Math.sin(b), w = Math.cos(y), k = Math.sin(y), M = b <= 0 && y >= 0 || y >= Wt, S = b <= Yt && y >= Yt || y >= Wt + Yt, D = b <= -Yt && y >= -Yt || y >= Nt + Yt, C = b === -Nt || y >= Nt ? -1 : Math.min(x, x * m, w, w * m), P = D ? -1 : Math.min(_, _ * m, k, k * m), T = M ? 1 : Math.max(x, x * m, w, w * m), O = S ? 1 : Math.max(_, _ * m, k, k * m); u = (T - C) / 2, d = (O - P) / 2, h = -(T + C) / 2, c = -(O + P) / 2 } for (i = 0, a = g.length; i < a; ++i)g[i]._options = r._resolveDataElementOptions(g[i], i); for (o.borderWidth = r.getMaxBorderWidth(), e = (s.right - s.left - o.borderWidth) / u, n = (s.bottom - s.top - o.borderWidth) / d, o.outerRadius = Math.max(Math.min(e, n) / 2, 0), o.innerRadius = Math.max(o.outerRadius * m, 0), o.radiusLength = (o.outerRadius - o.innerRadius) / (r._getVisibleDatasetWeightTotal() || 1), o.offsetX = h * o.outerRadius, o.offsetY = c * o.outerRadius, f.total = r.calculateTotal(), r.outerRadius = o.outerRadius - o.radiusLength * r._getRingWeightOffset(r.index), r.innerRadius = Math.max(r.outerRadius - o.radiusLength * v, 0), i = 0, a = g.length; i < a; ++i)r.updateElement(g[i], i, t) }, updateElement: function (t, e, n) { var i = this, a = i.chart, r = a.chartArea, o = a.options, s = o.animation, l = (r.left + r.right) / 2, u = (r.top + r.bottom) / 2, d = o.rotation, h = o.rotation, c = i.getDataset(), f = n && s.animateRotate ? 0 : t.hidden ? 0 : i.calculateCircumference(c.data[e]) * (o.circumference / Wt), g = n && s.animateScale ? 0 : i.innerRadius, m = n && s.animateScale ? 0 : i.outerRadius, p = t._options || {}; B.extend(t, { _datasetIndex: i.index, _index: e, _model: { backgroundColor: p.backgroundColor, borderColor: p.borderColor, borderWidth: p.borderWidth, borderAlign: p.borderAlign, x: l + a.offsetX, y: u + a.offsetY, startAngle: d, endAngle: h, circumference: f, outerRadius: m, innerRadius: g, label: B.valueAtIndexOrDefault(c.label, e, a.data.labels[e]) } }); var v = t._model; n && s.animateRotate || (v.startAngle = 0 === e ? o.rotation : i.getMeta().data[e - 1]._model.endAngle, v.endAngle = v.startAngle + v.circumference), t.pivot() }, calculateTotal: function () { var t, e = this.getDataset(), n = this.getMeta(), i = 0; return B.each(n.data, (function (n, a) { t = e.data[a], isNaN(t) || n.hidden || (i += Math.abs(t)) })), i }, calculateCircumference: function (t) { var e = this.getMeta().total; return e > 0 && !isNaN(t) ? Wt * (Math.abs(t) / e) : 0 }, getMaxBorderWidth: function (t) { var e, n, i, a, r, o, s, l, u = 0, d = this.chart; if (!t) for (e = 0, n = d.data.datasets.length; e < n; ++e)if (d.isDatasetVisible(e)) { t = (i = d.getDatasetMeta(e)).data, e !== this.index && (r = i.controller); break } if (!t) return 0; for (e = 0, n = t.length; e < n; ++e)a = t[e], r ? (r._configure(), o = r._resolveDataElementOptions(a, e)) : o = a._options, "inner" !== o.borderAlign && (s = o.borderWidth, u = (l = o.hoverBorderWidth) > (u = s > u ? s : u) ? l : u); return u }, setHoverStyle: function (t) { var e = t._model, n = t._options, i = B.getHoverColor; t.$previousStyle = { backgroundColor: e.backgroundColor, borderColor: e.borderColor, borderWidth: e.borderWidth }, e.backgroundColor = Rt(n.hoverBackgroundColor, i(n.backgroundColor)), e.borderColor = Rt(n.hoverBorderColor, i(n.borderColor)), e.borderWidth = Rt(n.hoverBorderWidth, n.borderWidth) }, _getRingWeightOffset: function (t) { for (var e = 0, n = 0; n < t; ++n)this.chart.isDatasetVisible(n) && (e += this._getRingWeight(n)); return e }, _getRingWeight: function (t) { return Math.max(Rt(this.chart.data.datasets[t].weight, 1), 0) }, _getVisibleDatasetWeightTotal: function () { return this._getRingWeightOffset(this.chart.data.datasets.length) } }); Y._set("horizontalBar", { hover: { mode: "index", axis: "y" }, scales: { xAxes: [{ type: "linear", position: "bottom" }], yAxes: [{ type: "category", position: "left", offset: !0, gridLines: { offsetGridLines: !0 } }] }, elements: { rectangle: { borderSkipped: "left" } }, tooltips: { mode: "index", axis: "y" } }), Y._set("global", { datasets: { horizontalBar: { categoryPercentage: .8, barPercentage: .9 } } }); var Et = At.extend({ _getValueScaleId: function () { return this.getMeta().xAxisID }, _getIndexScaleId: function () { return this.getMeta().yAxisID } }), Vt = B.valueOrDefault, Ht = B.options.resolve, Bt = B.canvas._isPointInArea; function jt(t, e) { var n = t && t.options.ticks || {}, i = n.reverse, a = void 0 === n.min ? e : 0, r = void 0 === n.max ? e : 0; return { start: i ? r : a, end: i ? a : r } } function Ut(t, e, n) { var i = n / 2, a = jt(t, i), r = jt(e, i); return { top: r.end, right: a.end, bottom: r.start, left: a.start } } function Gt(t) { var e, n, i, a; return B.isObject(t) ? (e = t.top, n = t.right, i = t.bottom, a = t.left) : e = n = i = a = t, { top: e, right: n, bottom: i, left: a } } Y._set("line", { showLines: !0, spanGaps: !1, hover: { mode: "label" }, scales: { xAxes: [{ type: "category", id: "x-axis-0" }], yAxes: [{ type: "linear", id: "y-axis-0" }] } }); var qt = at.extend({ datasetElementType: kt.Line, dataElementType: kt.Point, _datasetElementOptions: ["backgroundColor", "borderCapStyle", "borderColor", "borderDash", "borderDashOffset", "borderJoinStyle", "borderWidth", "cubicInterpolationMode", "fill"], _dataElementOptions: { backgroundColor: "pointBackgroundColor", borderColor: "pointBorderColor", borderWidth: "pointBorderWidth", hitRadius: "pointHitRadius", hoverBackgroundColor: "pointHoverBackgroundColor", hoverBorderColor: "pointHoverBorderColor", hoverBorderWidth: "pointHoverBorderWidth", hoverRadius: "pointHoverRadius", pointStyle: "pointStyle", radius: "pointRadius", rotation: "pointRotation" }, update: function (t) { var e, n, i = this, a = i.getMeta(), r = a.dataset, o = a.data || [], s = i.chart.options, l = i._config, u = i._showLine = Vt(l.showLine, s.showLines); for (i._xScale = i.getScaleForId(a.xAxisID), i._yScale = i.getScaleForId(a.yAxisID), u && (void 0 !== l.tension && void 0 === l.lineTension && (l.lineTension = l.tension), r._scale = i._yScale, r._datasetIndex = i.index, r._children = o, r._model = i._resolveDatasetElementOptions(r), r.pivot()), e = 0, n = o.length; e < n; ++e)i.updateElement(o[e], e, t); for (u && 0 !== r._model.tension && i.updateBezierControlPoints(), e = 0, n = o.length; e < n; ++e)o[e].pivot() }, updateElement: function (t, e, n) { var i, a, r = this, o = r.getMeta(), s = t.custom || {}, l = r.getDataset(), u = r.index, d = l.data[e], h = r._xScale, c = r._yScale, f = o.dataset._model, g = r._resolveDataElementOptions(t, e); i = h.getPixelForValue("object" == typeof d ? d : NaN, e, u), a = n ? c.getBasePixel() : r.calculatePointY(d, e, u), t._xScale = h, t._yScale = c, t._options = g, t._datasetIndex = u, t._index = e, t._model = { x: i, y: a, skip: s.skip || isNaN(i) || isNaN(a), radius: g.radius, pointStyle: g.pointStyle, rotation: g.rotation, backgroundColor: g.backgroundColor, borderColor: g.borderColor, borderWidth: g.borderWidth, tension: Vt(s.tension, f ? f.tension : 0), steppedLine: !!f && f.steppedLine, hitRadius: g.hitRadius } }, _resolveDatasetElementOptions: function (t) { var e = this, n = e._config, i = t.custom || {}, a = e.chart.options, r = a.elements.line, o = at.prototype._resolveDatasetElementOptions.apply(e, arguments); return o.spanGaps = Vt(n.spanGaps, a.spanGaps), o.tension = Vt(n.lineTension, r.tension), o.steppedLine = Ht([i.steppedLine, n.steppedLine, r.stepped]), o.clip = Gt(Vt(n.clip, Ut(e._xScale, e._yScale, o.borderWidth))), o }, calculatePointY: function (t, e, n) { var i, a, r, o, s, l, u, d = this.chart, h = this._yScale, c = 0, f = 0; if (h.options.stacked) { for (s = +h.getRightValue(t), u = (l = d._getSortedVisibleDatasetMetas()).length, i = 0; i < u && (r = l[i]).index !== n; ++i)a = d.data.datasets[r.index], "line" === r.type && r.yAxisID === h.id && ((o = +h.getRightValue(a.data[e])) < 0 ? f += o || 0 : c += o || 0); return s < 0 ? h.getPixelForValue(f + s) : h.getPixelForValue(c + s) } return h.getPixelForValue(t) }, updateBezierControlPoints: function () { var t, e, n, i, a = this.chart, r = this.getMeta(), o = r.dataset._model, s = a.chartArea, l = r.data || []; function u(t, e, n) { return Math.max(Math.min(t, n), e) } if (o.spanGaps && (l = l.filter((function (t) { return !t._model.skip }))), "monotone" === o.cubicInterpolationMode) B.splineCurveMonotone(l); else for (t = 0, e = l.length; t < e; ++t)n = l[t]._model, i = B.splineCurve(B.previousItem(l, t)._model, n, B.nextItem(l, t)._model, o.tension), n.controlPointPreviousX = i.previous.x, n.controlPointPreviousY = i.previous.y, n.controlPointNextX = i.next.x, n.controlPointNextY = i.next.y; if (a.options.elements.line.capBezierPoints) for (t = 0, e = l.length; t < e; ++t)n = l[t]._model, Bt(n, s) && (t > 0 && Bt(l[t - 1]._model, s) && (n.controlPointPreviousX = u(n.controlPointPreviousX, s.left, s.right), n.controlPointPreviousY = u(n.controlPointPreviousY, s.top, s.bottom)), t < l.length - 1 && Bt(l[t + 1]._model, s) && (n.controlPointNextX = u(n.controlPointNextX, s.left, s.right), n.controlPointNextY = u(n.controlPointNextY, s.top, s.bottom))) }, draw: function () { var t, e = this.chart, n = this.getMeta(), i = n.data || [], a = e.chartArea, r = e.canvas, o = 0, s = i.length; for (this._showLine && (t = n.dataset._model.clip, B.canvas.clipArea(e.ctx, { left: !1 === t.left ? 0 : a.left - t.left, right: !1 === t.right ? r.width : a.right + t.right, top: !1 === t.top ? 0 : a.top - t.top, bottom: !1 === t.bottom ? r.height : a.bottom + t.bottom }), n.dataset.draw(), B.canvas.unclipArea(e.ctx)); o < s; ++o)i[o].draw(a) }, setHoverStyle: function (t) { var e = t._model, n = t._options, i = B.getHoverColor; t.$previousStyle = { backgroundColor: e.backgroundColor, borderColor: e.borderColor, borderWidth: e.borderWidth, radius: e.radius }, e.backgroundColor = Vt(n.hoverBackgroundColor, i(n.backgroundColor)), e.borderColor = Vt(n.hoverBorderColor, i(n.borderColor)), e.borderWidth = Vt(n.hoverBorderWidth, n.borderWidth), e.radius = Vt(n.hoverRadius, n.radius) } }), Zt = B.options.resolve; Y._set("polarArea", { scale: { type: "radialLinear", angleLines: { display: !1 }, gridLines: { circular: !0 }, pointLabels: { display: !1 }, ticks: { beginAtZero: !0 } }, animation: { animateRotate: !0, animateScale: !0 }, startAngle: -.5 * Math.PI, legendCallback: function (t) { var e, n, i, a = document.createElement("ul"), r = t.data, o = r.datasets, s = r.labels; if (a.setAttribute("class", t.id + "-legend"), o.length) for (e = 0, n = o[0].data.length; e < n; ++e)(i = a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor = o[0].backgroundColor[e], s[e] && i.appendChild(document.createTextNode(s[e])); return a.outerHTML }, legend: { labels: { generateLabels: function (t) { var e = t.data; return e.labels.length && e.datasets.length ? e.labels.map((function (n, i) { var a = t.getDatasetMeta(0), r = a.controller.getStyle(i); return { text: n, fillStyle: r.backgroundColor, strokeStyle: r.borderColor, lineWidth: r.borderWidth, hidden: isNaN(e.datasets[0].data[i]) || a.data[i].hidden, index: i } })) : [] } }, onClick: function (t, e) { var n, i, a, r = e.index, o = this.chart; for (n = 0, i = (o.data.datasets || []).length; n < i; ++n)(a = o.getDatasetMeta(n)).data[r].hidden = !a.data[r].hidden; o.update() } }, tooltips: { callbacks: { title: function () { return "" }, label: function (t, e) { return e.labels[t.index] + ": " + t.yLabel } } } }); var $t = at.extend({ dataElementType: kt.Arc, linkScales: B.noop, _dataElementOptions: ["backgroundColor", "borderColor", "borderWidth", "borderAlign", "hoverBackgroundColor", "hoverBorderColor", "hoverBorderWidth"], _getIndexScaleId: function () { return this.chart.scale.id }, _getValueScaleId: function () { return this.chart.scale.id }, update: function (t) { var e, n, i, a = this, r = a.getDataset(), o = a.getMeta(), s = a.chart.options.startAngle || 0, l = a._starts = [], u = a._angles = [], d = o.data; for (a._updateRadius(), o.count = a.countVisibleElements(), e = 0, n = r.data.length; e < n; e++)l[e] = s, i = a._computeAngle(e), u[e] = i, s += i; for (e = 0, n = d.length; e < n; ++e)d[e]._options = a._resolveDataElementOptions(d[e], e), a.updateElement(d[e], e, t) }, _updateRadius: function () { var t = this, e = t.chart, n = e.chartArea, i = e.options, a = Math.min(n.right - n.left, n.bottom - n.top); e.outerRadius = Math.max(a / 2, 0), e.innerRadius = Math.max(i.cutoutPercentage ? e.outerRadius / 100 * i.cutoutPercentage : 1, 0), e.radiusLength = (e.outerRadius - e.innerRadius) / e.getVisibleDatasetCount(), t.outerRadius = e.outerRadius - e.radiusLength * t.index, t.innerRadius = t.outerRadius - e.radiusLength }, updateElement: function (t, e, n) { var i = this, a = i.chart, r = i.getDataset(), o = a.options, s = o.animation, l = a.scale, u = a.data.labels, d = l.xCenter, h = l.yCenter, c = o.startAngle, f = t.hidden ? 0 : l.getDistanceFromCenterForValue(r.data[e]), g = i._starts[e], m = g + (t.hidden ? 0 : i._angles[e]), p = s.animateScale ? 0 : l.getDistanceFromCenterForValue(r.data[e]), v = t._options || {}; B.extend(t, { _datasetIndex: i.index, _index: e, _scale: l, _model: { backgroundColor: v.backgroundColor, borderColor: v.borderColor, borderWidth: v.borderWidth, borderAlign: v.borderAlign, x: d, y: h, innerRadius: 0, outerRadius: n ? p : f, startAngle: n && s.animateRotate ? c : g, endAngle: n && s.animateRotate ? c : m, label: B.valueAtIndexOrDefault(u, e, u[e]) } }), t.pivot() }, countVisibleElements: function () { var t = this.getDataset(), e = this.getMeta(), n = 0; return B.each(e.data, (function (e, i) { isNaN(t.data[i]) || e.hidden || n++ })), n }, setHoverStyle: function (t) { var e = t._model, n = t._options, i = B.getHoverColor, a = B.valueOrDefault; t.$previousStyle = { backgroundColor: e.backgroundColor, borderColor: e.borderColor, borderWidth: e.borderWidth }, e.backgroundColor = a(n.hoverBackgroundColor, i(n.backgroundColor)), e.borderColor = a(n.hoverBorderColor, i(n.borderColor)), e.borderWidth = a(n.hoverBorderWidth, n.borderWidth) }, _computeAngle: function (t) { var e = this, n = this.getMeta().count, i = e.getDataset(), a = e.getMeta(); if (isNaN(i.data[t]) || a.data[t].hidden) return 0; var r = { chart: e.chart, dataIndex: t, dataset: i, datasetIndex: e.index }; return Zt([e.chart.options.elements.arc.angle, 2 * Math.PI / n], r, t) } }); Y._set("pie", B.clone(Y.doughnut)), Y._set("pie", { cutoutPercentage: 0 }); var Xt = zt, Kt = B.valueOrDefault; Y._set("radar", { spanGaps: !1, scale: { type: "radialLinear" }, elements: { line: { fill: "start", tension: 0 } } }); var Jt = at.extend({ datasetElementType: kt.Line, dataElementType: kt.Point, linkScales: B.noop, _datasetElementOptions: ["backgroundColor", "borderWidth", "borderColor", "borderCapStyle", "borderDash", "borderDashOffset", "borderJoinStyle", "fill"], _dataElementOptions: { backgroundColor: "pointBackgroundColor", borderColor: "pointBorderColor", borderWidth: "pointBorderWidth", hitRadius: "pointHitRadius", hoverBackgroundColor: "pointHoverBackgroundColor", hoverBorderColor: "pointHoverBorderColor", hoverBorderWidth: "pointHoverBorderWidth", hoverRadius: "pointHoverRadius", pointStyle: "pointStyle", radius: "pointRadius", rotation: "pointRotation" }, _getIndexScaleId: function () { return this.chart.scale.id }, _getValueScaleId: function () { return this.chart.scale.id }, update: function (t) { var e, n, i = this, a = i.getMeta(), r = a.dataset, o = a.data || [], s = i.chart.scale, l = i._config; for (void 0 !== l.tension && void 0 === l.lineTension && (l.lineTension = l.tension), r._scale = s, r._datasetIndex = i.index, r._children = o, r._loop = !0, r._model = i._resolveDatasetElementOptions(r), r.pivot(), e = 0, n = o.length; e < n; ++e)i.updateElement(o[e], e, t); for (i.updateBezierControlPoints(), e = 0, n = o.length; e < n; ++e)o[e].pivot() }, updateElement: function (t, e, n) { var i = this, a = t.custom || {}, r = i.getDataset(), o = i.chart.scale, s = o.getPointPositionForValue(e, r.data[e]), l = i._resolveDataElementOptions(t, e), u = i.getMeta().dataset._model, d = n ? o.xCenter : s.x, h = n ? o.yCenter : s.y; t._scale = o, t._options = l, t._datasetIndex = i.index, t._index = e, t._model = { x: d, y: h, skip: a.skip || isNaN(d) || isNaN(h), radius: l.radius, pointStyle: l.pointStyle, rotation: l.rotation, backgroundColor: l.backgroundColor, borderColor: l.borderColor, borderWidth: l.borderWidth, tension: Kt(a.tension, u ? u.tension : 0), hitRadius: l.hitRadius } }, _resolveDatasetElementOptions: function () { var t = this, e = t._config, n = t.chart.options, i = at.prototype._resolveDatasetElementOptions.apply(t, arguments); return i.spanGaps = Kt(e.spanGaps, n.spanGaps), i.tension = Kt(e.lineTension, n.elements.line.tension), i }, updateBezierControlPoints: function () { var t, e, n, i, a = this.getMeta(), r = this.chart.chartArea, o = a.data || []; function s(t, e, n) { return Math.max(Math.min(t, n), e) } for (a.dataset._model.spanGaps && (o = o.filter((function (t) { return !t._model.skip }))), t = 0, e = o.length; t < e; ++t)n = o[t]._model, i = B.splineCurve(B.previousItem(o, t, !0)._model, n, B.nextItem(o, t, !0)._model, n.tension), n.controlPointPreviousX = s(i.previous.x, r.left, r.right), n.controlPointPreviousY = s(i.previous.y, r.top, r.bottom), n.controlPointNextX = s(i.next.x, r.left, r.right), n.controlPointNextY = s(i.next.y, r.top, r.bottom) }, setHoverStyle: function (t) { var e = t._model, n = t._options, i = B.getHoverColor; t.$previousStyle = { backgroundColor: e.backgroundColor, borderColor: e.borderColor, borderWidth: e.borderWidth, radius: e.radius }, e.backgroundColor = Kt(n.hoverBackgroundColor, i(n.backgroundColor)), e.borderColor = Kt(n.hoverBorderColor, i(n.borderColor)), e.borderWidth = Kt(n.hoverBorderWidth, n.borderWidth), e.radius = Kt(n.hoverRadius, n.radius) } }); Y._set("scatter", { hover: { mode: "single" }, scales: { xAxes: [{ id: "x-axis-1", type: "linear", position: "bottom" }], yAxes: [{ id: "y-axis-1", type: "linear", position: "left" }] }, tooltips: { callbacks: { title: function () { return "" }, label: function (t) { return "(" + t.xLabel + ", " + t.yLabel + ")" } } } }), Y._set("global", { datasets: { scatter: { showLine: !1 } } }); var Qt = { bar: At, bubble: Lt, doughnut: zt, horizontalBar: Et, line: qt, polarArea: $t, pie: Xt, radar: Jt, scatter: qt }; function te(t, e) { return t.native ? { x: t.x, y: t.y } : B.getRelativePosition(t, e) } function ee(t, e) { var n, i, a, r, o, s, l = t._getSortedVisibleDatasetMetas(); for (i = 0, r = l.length; i < r; ++i)for (a = 0, o = (n = l[i].data).length; a < o; ++a)(s = n[a])._view.skip || e(s) } function ne(t, e) { var n = []; return ee(t, (function (t) { t.inRange(e.x, e.y) && n.push(t) })), n } function ie(t, e, n, i) { var a = Number.POSITIVE_INFINITY, r = []; return ee(t, (function (t) { if (!n || t.inRange(e.x, e.y)) { var o = t.getCenterPoint(), s = i(e, o); s < a ? (r = [t], a = s) : s === a && r.push(t) } })), r } function ae(t) { var e = -1 !== t.indexOf("x"), n = -1 !== t.indexOf("y"); return function (t, i) { var a = e ? Math.abs(t.x - i.x) : 0, r = n ? Math.abs(t.y - i.y) : 0; return Math.sqrt(Math.pow(a, 2) + Math.pow(r, 2)) } } function re(t, e, n) { var i = te(e, t); n.axis = n.axis || "x"; var a = ae(n.axis), r = n.intersect ? ne(t, i) : ie(t, i, !1, a), o = []; return r.length ? (t._getSortedVisibleDatasetMetas().forEach((function (t) { var e = t.data[r[0]._index]; e && !e._view.skip && o.push(e) })), o) : [] } var oe = { modes: { single: function (t, e) { var n = te(e, t), i = []; return ee(t, (function (t) { if (t.inRange(n.x, n.y)) return i.push(t), i })), i.slice(0, 1) }, label: re, index: re, dataset: function (t, e, n) { var i = te(e, t); n.axis = n.axis || "xy"; var a = ae(n.axis), r = n.intersect ? ne(t, i) : ie(t, i, !1, a); return r.length > 0 && (r = t.getDatasetMeta(r[0]._datasetIndex).data), r }, "x-axis": function (t, e) { return re(t, e, { intersect: !1 }) }, point: function (t, e) { return ne(t, te(e, t)) }, nearest: function (t, e, n) { var i = te(e, t); n.axis = n.axis || "xy"; var a = ae(n.axis); return ie(t, i, n.intersect, a) }, x: function (t, e, n) { var i = te(e, t), a = [], r = !1; return ee(t, (function (t) { t.inXRange(i.x) && a.push(t), t.inRange(i.x, i.y) && (r = !0) })), n.intersect && !r && (a = []), a }, y: function (t, e, n) { var i = te(e, t), a = [], r = !1; return ee(t, (function (t) { t.inYRange(i.y) && a.push(t), t.inRange(i.x, i.y) && (r = !0) })), n.intersect && !r && (a = []), a } } }, se = B.extend; function le(t, e) { return B.where(t, (function (t) { return t.pos === e })) } function ue(t, e) { return t.sort((function (t, n) { var i = e ? n : t, a = e ? t : n; return i.weight === a.weight ? i.index - a.index : i.weight - a.weight })) } function de(t, e, n, i) { return Math.max(t[n], e[n]) + Math.max(t[i], e[i]) } function he(t, e, n) { var i, a, r = n.box, o = t.maxPadding; if (n.size && (t[n.pos] -= n.size), n.size = n.horizontal ? r.height : r.width, t[n.pos] += n.size, r.getPadding) { var s = r.getPadding(); o.top = Math.max(o.top, s.top), o.left = Math.max(o.left, s.left), o.bottom = Math.max(o.bottom, s.bottom), o.right = Math.max(o.right, s.right) } if (i = e.outerWidth - de(o, t, "left", "right"), a = e.outerHeight - de(o, t, "top", "bottom"), i !== t.w || a !== t.h) { t.w = i, t.h = a; var l = n.horizontal ? [i, t.w] : [a, t.h]; return !(l[0] === l[1] || isNaN(l[0]) && isNaN(l[1])) } } function ce(t, e) { var n = e.maxPadding; function i(t) { var i = { left: 0, top: 0, right: 0, bottom: 0 }; return t.forEach((function (t) { i[t] = Math.max(e[t], n[t]) })), i } return i(t ? ["left", "right"] : ["top", "bottom"]) } function fe(t, e, n) { var i, a, r, o, s, l, u = []; for (i = 0, a = t.length; i < a; ++i)(o = (r = t[i]).box).update(r.width || e.w, r.height || e.h, ce(r.horizontal, e)), he(e, n, r) && (l = !0, u.length && (s = !0)), o.fullWidth || u.push(r); return s && fe(u, e, n) || l } function ge(t, e, n) { var i, a, r, o, s = n.padding, l = e.x, u = e.y; for (i = 0, a = t.length; i < a; ++i)o = (r = t[i]).box, r.horizontal ? (o.left = o.fullWidth ? s.left : e.left, o.right = o.fullWidth ? n.outerWidth - s.right : e.left + e.w, o.top = u, o.bottom = u + o.height, o.width = o.right - o.left, u = o.bottom) : (o.left = l, o.right = l + o.width, o.top = e.top, o.bottom = e.top + e.h, o.height = o.bottom - o.top, l = o.right); e.x = l, e.y = u } Y._set("global", { layout: { padding: { top: 0, right: 0, bottom: 0, left: 0 } } }); var me, pe = { defaults: {}, addBox: function (t, e) { t.boxes || (t.boxes = []), e.fullWidth = e.fullWidth || !1, e.position = e.position || "top", e.weight = e.weight || 0, e._layers = e._layers || function () { return [{ z: 0, draw: function () { e.draw.apply(e, arguments) } }] }, t.boxes.push(e) }, removeBox: function (t, e) { var n = t.boxes ? t.boxes.indexOf(e) : -1; -1 !== n && t.boxes.splice(n, 1) }, configure: function (t, e, n) { for (var i, a = ["fullWidth", "position", "weight"], r = a.length, o = 0; o < r; ++o)i = a[o], n.hasOwnProperty(i) && (e[i] = n[i]) }, update: function (t, e, n) { if (t) { var i = t.options.layout || {}, a = B.options.toPadding(i.padding), r = e - a.width, o = n - a.height, s = function (t) { var e = function (t) { var e, n, i, a = []; for (e = 0, n = (t || []).length; e < n; ++e)i = t[e], a.push({ index: e, box: i, pos: i.position, horizontal: i.isHorizontal(), weight: i.weight }); return a }(t), n = ue(le(e, "left"), !0), i = ue(le(e, "right")), a = ue(le(e, "top"), !0), r = ue(le(e, "bottom")); return { leftAndTop: n.concat(a), rightAndBottom: i.concat(r), chartArea: le(e, "chartArea"), vertical: n.concat(i), horizontal: a.concat(r) } }(t.boxes), l = s.vertical, u = s.horizontal, d = Object.freeze({ outerWidth: e, outerHeight: n, padding: a, availableWidth: r, vBoxMaxWidth: r / 2 / l.length, hBoxMaxHeight: o / 2 }), h = se({ maxPadding: se({}, a), w: r, h: o, x: a.left, y: a.top }, a); !function (t, e) { var n, i, a; for (n = 0, i = t.length; n < i; ++n)(a = t[n]).width = a.horizontal ? a.box.fullWidth && e.availableWidth : e.vBoxMaxWidth, a.height = a.horizontal && e.hBoxMaxHeight }(l.concat(u), d), fe(l, h, d), fe(u, h, d) && fe(l, h, d), function (t) { var e = t.maxPadding; function n(n) { var i = Math.max(e[n] - t[n], 0); return t[n] += i, i } t.y += n("top"), t.x += n("left"), n("right"), n("bottom") }(h), ge(s.leftAndTop, h, d), h.x += h.w, h.y += h.h, ge(s.rightAndBottom, h, d), t.chartArea = { left: h.left, top: h.top, right: h.left + h.w, bottom: h.top + h.h }, B.each(s.chartArea, (function (e) { var n = e.box; se(n, t.chartArea), n.update(h.w, h.h) })) } } }, ve = (me = Object.freeze({ __proto__: null, default: "@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}" })) && me.default || me, be = "$chartjs", ye = "chartjs-size-monitor", xe = "chartjs-render-monitor", _e = "chartjs-render-animation", we = ["animationstart", "webkitAnimationStart"], ke = { touchstart: "mousedown", touchmove: "mousemove", touchend: "mouseup", pointerenter: "mouseenter", pointerdown: "mousedown", pointermove: "mousemove", pointerup: "mouseup", pointerleave: "mouseout", pointerout: "mouseout" }; function Me(t, e) { var n = B.getStyle(t, e), i = n && n.match(/^(\d+)(\.\d+)?px$/); return i ? Number(i[1]) : void 0 } var Se = !!function () { var t = !1; try { var e = Object.defineProperty({}, "passive", { get: function () { t = !0 } }); window.addEventListener("e", null, e) } catch (t) { } return t }() && { passive: !0 }; function De(t, e, n) { t.addEventListener(e, n, Se) } function Ce(t, e, n) { t.removeEventListener(e, n, Se) } function Pe(t, e, n, i, a) { return { type: t, chart: e, native: a || null, x: void 0 !== n ? n : null, y: void 0 !== i ? i : null } } function Te(t) { var e = document.createElement("div"); return e.className = t || "", e } function Oe(t, e, n) { var i, a, r, o, s = t[be] || (t[be] = {}), l = s.resizer = function (t) { var e = Te(ye), n = Te(ye + "-expand"), i = Te(ye + "-shrink"); n.appendChild(Te()), i.appendChild(Te()), e.appendChild(n), e.appendChild(i), e._reset = function () { n.scrollLeft = 1e6, n.scrollTop = 1e6, i.scrollLeft = 1e6, i.scrollTop = 1e6 }; var a = function () { e._reset(), t() }; return De(n, "scroll", a.bind(n, "expand")), De(i, "scroll", a.bind(i, "shrink")), e }((i = function () { if (s.resizer) { var i = n.options.maintainAspectRatio && t.parentNode, a = i ? i.clientWidth : 0; e(Pe("resize", n)), i && i.clientWidth < a && n.canvas && e(Pe("resize", n)) } }, r = !1, o = [], function () { o = Array.prototype.slice.call(arguments), a = a || this, r || (r = !0, B.requestAnimFrame.call(window, (function () { r = !1, i.apply(a, o) }))) })); !function (t, e) { var n = t[be] || (t[be] = {}), i = n.renderProxy = function (t) { t.animationName === _e && e() }; B.each(we, (function (e) { De(t, e, i) })), n.reflow = !!t.offsetParent, t.classList.add(xe) }(t, (function () { if (s.resizer) { var e = t.parentNode; e && e !== l.parentNode && e.insertBefore(l, e.firstChild), l._reset() } })) } function Ae(t) { var e = t[be] || {}, n = e.resizer; delete e.resizer, function (t) { var e = t[be] || {}, n = e.renderProxy; n && (B.each(we, (function (e) { Ce(t, e, n) })), delete e.renderProxy), t.classList.remove(xe) }(t), n && n.parentNode && n.parentNode.removeChild(n) } var Fe = { disableCSSInjection: !1, _enabled: "undefined" != typeof window && "undefined" != typeof document, _ensureLoaded: function (t) { if (!this.disableCSSInjection) { var e = t.getRootNode ? t.getRootNode() : document; !function (t, e) { var n = t[be] || (t[be] = {}); if (!n.containsStyles) { n.containsStyles = !0, e = "/* Chart.js */\n" + e; var i = document.createElement("style"); i.setAttribute("type", "text/css"), i.appendChild(document.createTextNode(e)), t.appendChild(i) } }(e.host ? e : document.head, ve) } }, acquireContext: function (t, e) { "string" == typeof t ? t = document.getElementById(t) : t.length && (t = t[0]), t && t.canvas && (t = t.canvas); var n = t && t.getContext && t.getContext("2d"); return n && n.canvas === t ? (this._ensureLoaded(t), function (t, e) { var n = t.style, i = t.getAttribute("height"), a = t.getAttribute("width"); if (t[be] = { initial: { height: i, width: a, style: { display: n.display, height: n.height, width: n.width } } }, n.display = n.display || "block", null === a || "" === a) { var r = Me(t, "width"); void 0 !== r && (t.width = r) } if (null === i || "" === i) if ("" === t.style.height) t.height = t.width / (e.options.aspectRatio || 2); else { var o = Me(t, "height"); void 0 !== r && (t.height = o) } }(t, e), n) : null }, releaseContext: function (t) { var e = t.canvas; if (e[be]) { var n = e[be].initial;["height", "width"].forEach((function (t) { var i = n[t]; B.isNullOrUndef(i) ? e.removeAttribute(t) : e.setAttribute(t, i) })), B.each(n.style || {}, (function (t, n) { e.style[n] = t })), e.width = e.width, delete e[be] } }, addEventListener: function (t, e, n) { var i = t.canvas; if ("resize" !== e) { var a = n[be] || (n[be] = {}); De(i, e, (a.proxies || (a.proxies = {}))[t.id + "_" + e] = function (e) { n(function (t, e) { var n = ke[t.type] || t.type, i = B.getRelativePosition(t, e); return Pe(n, e, i.x, i.y, t) }(e, t)) }) } else Oe(i, n, t) }, removeEventListener: function (t, e, n) { var i = t.canvas; if ("resize" !== e) { var a = ((n[be] || {}).proxies || {})[t.id + "_" + e]; a && Ce(i, e, a) } else Ae(i) } }; B.addEvent = De, B.removeEvent = Ce; var Ie = Fe._enabled ? Fe : { acquireContext: function (t) { return t && t.canvas && (t = t.canvas), t && t.getContext("2d") || null } }, Le = B.extend({ initialize: function () { }, acquireContext: function () { }, releaseContext: function () { }, addEventListener: function () { }, removeEventListener: function () { } }, Ie); Y._set("global", { plugins: {} }); var Re = { _plugins: [], _cacheId: 0, register: function (t) { var e = this._plugins;[].concat(t).forEach((function (t) { -1 === e.indexOf(t) && e.push(t) })), this._cacheId++ }, unregister: function (t) { var e = this._plugins;[].concat(t).forEach((function (t) { var n = e.indexOf(t); -1 !== n && e.splice(n, 1) })), this._cacheId++ }, clear: function () { this._plugins = [], this._cacheId++ }, count: function () { return this._plugins.length }, getAll: function () { return this._plugins }, notify: function (t, e, n) { var i, a, r, o, s, l = this.descriptors(t), u = l.length; for (i = 0; i < u; ++i)if ("function" == typeof (s = (r = (a = l[i]).plugin)[e]) && ((o = [t].concat(n || [])).push(a.options), !1 === s.apply(r, o))) return !1; return !0 }, descriptors: function (t) { var e = t.$plugins || (t.$plugins = {}); if (e.id === this._cacheId) return e.descriptors; var n = [], i = [], a = t && t.config || {}, r = a.options && a.options.plugins || {}; return this._plugins.concat(a.plugins || []).forEach((function (t) { if (-1 === n.indexOf(t)) { var e = t.id, a = r[e]; !1 !== a && (!0 === a && (a = B.clone(Y.global.plugins[e])), n.push(t), i.push({ plugin: t, options: a || {} })) } })), e.descriptors = i, e.id = this._cacheId, i }, _invalidate: function (t) { delete t.$plugins } }, Ne = { constructors: {}, defaults: {}, registerScaleType: function (t, e, n) { this.constructors[t] = e, this.defaults[t] = B.clone(n) }, getScaleConstructor: function (t) { return this.constructors.hasOwnProperty(t) ? this.constructors[t] : void 0 }, getScaleDefaults: function (t) { return this.defaults.hasOwnProperty(t) ? B.merge(Object.create(null), [Y.scale, this.defaults[t]]) : {} }, updateScaleDefaults: function (t, e) { this.defaults.hasOwnProperty(t) && (this.defaults[t] = B.extend(this.defaults[t], e)) }, addScalesToLayout: function (t) { B.each(t.scales, (function (e) { e.fullWidth = e.options.fullWidth, e.position = e.options.position, e.weight = e.options.weight, pe.addBox(t, e) })) } }, We = B.valueOrDefault, Ye = B.rtl.getRtlAdapter; Y._set("global", { tooltips: { enabled: !0, custom: null, mode: "nearest", position: "average", intersect: !0, backgroundColor: "rgba(0,0,0,0.8)", titleFontStyle: "bold", titleSpacing: 2, titleMarginBottom: 6, titleFontColor: "#fff", titleAlign: "left", bodySpacing: 2, bodyFontColor: "#fff", bodyAlign: "left", footerFontStyle: "bold", footerSpacing: 2, footerMarginTop: 6, footerFontColor: "#fff", footerAlign: "left", yPadding: 6, xPadding: 6, caretPadding: 2, caretSize: 5, cornerRadius: 6, multiKeyBackground: "#fff", displayColors: !0, borderColor: "rgba(0,0,0,0)", borderWidth: 0, callbacks: { beforeTitle: B.noop, title: function (t, e) { var n = "", i = e.labels, a = i ? i.length : 0; if (t.length > 0) { var r = t[0]; r.label ? n = r.label : r.xLabel ? n = r.xLabel : a > 0 && r.index < a && (n = i[r.index]) } return n }, afterTitle: B.noop, beforeBody: B.noop, beforeLabel: B.noop, label: function (t, e) { var n = e.datasets[t.datasetIndex].label || ""; return n && (n += ": "), B.isNullOrUndef(t.value) ? n += t.yLabel : n += t.value, n }, labelColor: function (t, e) { var n = e.getDatasetMeta(t.datasetIndex).data[t.index]._view; return { borderColor: n.borderColor, backgroundColor: n.backgroundColor } }, labelTextColor: function () { return this._options.bodyFontColor }, afterLabel: B.noop, afterBody: B.noop, beforeFooter: B.noop, footer: B.noop, afterFooter: B.noop } } }); var ze = { average: function (t) { if (!t.length) return !1; var e, n, i = 0, a = 0, r = 0; for (e = 0, n = t.length; e < n; ++e) { var o = t[e]; if (o && o.hasValue()) { var s = o.tooltipPosition(); i += s.x, a += s.y, ++r } } return { x: i / r, y: a / r } }, nearest: function (t, e) { var n, i, a, r = e.x, o = e.y, s = Number.POSITIVE_INFINITY; for (n = 0, i = t.length; n < i; ++n) { var l = t[n]; if (l && l.hasValue()) { var u = l.getCenterPoint(), d = B.distanceBetweenPoints(e, u); d < s && (s = d, a = l) } } if (a) { var h = a.tooltipPosition(); r = h.x, o = h.y } return { x: r, y: o } } }; function Ee(t, e) { return e && (B.isArray(e) ? Array.prototype.push.apply(t, e) : t.push(e)), t } function Ve(t) { return ("string" == typeof t || t instanceof String) && t.indexOf("\n") > -1 ? t.split("\n") : t } function He(t) { var e = Y.global; return { xPadding: t.xPadding, yPadding: t.yPadding, xAlign: t.xAlign, yAlign: t.yAlign, rtl: t.rtl, textDirection: t.textDirection, bodyFontColor: t.bodyFontColor, _bodyFontFamily: We(t.bodyFontFamily, e.defaultFontFamily), _bodyFontStyle: We(t.bodyFontStyle, e.defaultFontStyle), _bodyAlign: t.bodyAlign, bodyFontSize: We(t.bodyFontSize, e.defaultFontSize), bodySpacing: t.bodySpacing, titleFontColor: t.titleFontColor, _titleFontFamily: We(t.titleFontFamily, e.defaultFontFamily), _titleFontStyle: We(t.titleFontStyle, e.defaultFontStyle), titleFontSize: We(t.titleFontSize, e.defaultFontSize), _titleAlign: t.titleAlign, titleSpacing: t.titleSpacing, titleMarginBottom: t.titleMarginBottom, footerFontColor: t.footerFontColor, _footerFontFamily: We(t.footerFontFamily, e.defaultFontFamily), _footerFontStyle: We(t.footerFontStyle, e.defaultFontStyle), footerFontSize: We(t.footerFontSize, e.defaultFontSize), _footerAlign: t.footerAlign, footerSpacing: t.footerSpacing, footerMarginTop: t.footerMarginTop, caretSize: t.caretSize, cornerRadius: t.cornerRadius, backgroundColor: t.backgroundColor, opacity: 0, legendColorBackground: t.multiKeyBackground, displayColors: t.displayColors, borderColor: t.borderColor, borderWidth: t.borderWidth } } function Be(t, e) { return "center" === e ? t.x + t.width / 2 : "right" === e ? t.x + t.width - t.xPadding : t.x + t.xPadding } function je(t) { return Ee([], Ve(t)) } var Ue = X.extend({ initialize: function () { this._model = He(this._options), this._lastActive = [] }, getTitle: function () { var t = this, e = t._options, n = e.callbacks, i = n.beforeTitle.apply(t, arguments), a = n.title.apply(t, arguments), r = n.afterTitle.apply(t, arguments), o = []; return o = Ee(o, Ve(i)), o = Ee(o, Ve(a)), o = Ee(o, Ve(r)) }, getBeforeBody: function () { return je(this._options.callbacks.beforeBody.apply(this, arguments)) }, getBody: function (t, e) { var n = this, i = n._options.callbacks, a = []; return B.each(t, (function (t) { var r = { before: [], lines: [], after: [] }; Ee(r.before, Ve(i.beforeLabel.call(n, t, e))), Ee(r.lines, i.label.call(n, t, e)), Ee(r.after, Ve(i.afterLabel.call(n, t, e))), a.push(r) })), a }, getAfterBody: function () { return je(this._options.callbacks.afterBody.apply(this, arguments)) }, getFooter: function () { var t = this, e = t._options.callbacks, n = e.beforeFooter.apply(t, arguments), i = e.footer.apply(t, arguments), a = e.afterFooter.apply(t, arguments), r = []; return r = Ee(r, Ve(n)), r = Ee(r, Ve(i)), r = Ee(r, Ve(a)) }, update: function (t) { var e, n, i, a, r, o, s, l, u, d, h = this, c = h._options, f = h._model, g = h._model = He(c), m = h._active, p = h._data, v = { xAlign: f.xAlign, yAlign: f.yAlign }, b = { x: f.x, y: f.y }, y = { width: f.width, height: f.height }, x = { x: f.caretX, y: f.caretY }; if (m.length) { g.opacity = 1; var _ = [], w = []; x = ze[c.position].call(h, m, h._eventPosition); var k = []; for (e = 0, n = m.length; e < n; ++e)k.push((i = m[e], a = void 0, r = void 0, o = void 0, s = void 0, l = void 0, u = void 0, d = void 0, a = i._xScale, r = i._yScale || i._scale, o = i._index, s = i._datasetIndex, l = i._chart.getDatasetMeta(s).controller, u = l._getIndexScale(), d = l._getValueScale(), { xLabel: a ? a.getLabelForIndex(o, s) : "", yLabel: r ? r.getLabelForIndex(o, s) : "", label: u ? "" + u.getLabelForIndex(o, s) : "", value: d ? "" + d.getLabelForIndex(o, s) : "", index: o, datasetIndex: s, x: i._model.x, y: i._model.y })); c.filter && (k = k.filter((function (t) { return c.filter(t, p) }))), c.itemSort && (k = k.sort((function (t, e) { return c.itemSort(t, e, p) }))), B.each(k, (function (t) { _.push(c.callbacks.labelColor.call(h, t, h._chart)), w.push(c.callbacks.labelTextColor.call(h, t, h._chart)) })), g.title = h.getTitle(k, p), g.beforeBody = h.getBeforeBody(k, p), g.body = h.getBody(k, p), g.afterBody = h.getAfterBody(k, p), g.footer = h.getFooter(k, p), g.x = x.x, g.y = x.y, g.caretPadding = c.caretPadding, g.labelColors = _, g.labelTextColors = w, g.dataPoints = k, y = function (t, e) { var n = t._chart.ctx, i = 2 * e.yPadding, a = 0, r = e.body, o = r.reduce((function (t, e) { return t + e.before.length + e.lines.length + e.after.length }), 0); o += e.beforeBody.length + e.afterBody.length; var s = e.title.length, l = e.footer.length, u = e.titleFontSize, d = e.bodyFontSize, h = e.footerFontSize; i += s * u, i += s ? (s - 1) * e.titleSpacing : 0, i += s ? e.titleMarginBottom : 0, i += o * d, i += o ? (o - 1) * e.bodySpacing : 0, i += l ? e.footerMarginTop : 0, i += l * h, i += l ? (l - 1) * e.footerSpacing : 0; var c = 0, f = function (t) { a = Math.max(a, n.measureText(t).width + c) }; return n.font = B.fontString(u, e._titleFontStyle, e._titleFontFamily), B.each(e.title, f), n.font = B.fontString(d, e._bodyFontStyle, e._bodyFontFamily), B.each(e.beforeBody.concat(e.afterBody), f), c = e.displayColors ? d + 2 : 0, B.each(r, (function (t) { B.each(t.before, f), B.each(t.lines, f), B.each(t.after, f) })), c = 0, n.font = B.fontString(h, e._footerFontStyle, e._footerFontFamily), B.each(e.footer, f), { width: a += 2 * e.xPadding, height: i } }(this, g), b = function (t, e, n, i) { var a = t.x, r = t.y, o = t.caretSize, s = t.caretPadding, l = t.cornerRadius, u = n.xAlign, d = n.yAlign, h = o + s, c = l + s; return "right" === u ? a -= e.width : "center" === u && ((a -= e.width / 2) + e.width > i.width && (a = i.width - e.width), a < 0 && (a = 0)), "top" === d ? r += h : r -= "bottom" === d ? e.height + h : e.height / 2, "center" === d ? "left" === u ? a += h : "right" === u && (a -= h) : "left" === u ? a -= c : "right" === u && (a += c), { x: a, y: r } }(g, y, v = function (t, e) { var n, i, a, r, o, s = t._model, l = t._chart, u = t._chart.chartArea, d = "center", h = "center"; s.y < e.height ? h = "top" : s.y > l.height - e.height && (h = "bottom"); var c = (u.left + u.right) / 2, f = (u.top + u.bottom) / 2; "center" === h ? (n = function (t) { return t <= c }, i = function (t) { return t > c }) : (n = function (t) { return t <= e.width / 2 }, i = function (t) { return t >= l.width - e.width / 2 }), a = function (t) { return t + e.width + s.caretSize + s.caretPadding > l.width }, r = function (t) { return t - e.width - s.caretSize - s.caretPadding < 0 }, o = function (t) { return t <= f ? "top" : "bottom" }, n(s.x) ? (d = "left", a(s.x) && (d = "center", h = o(s.y))) : i(s.x) && (d = "right", r(s.x) && (d = "center", h = o(s.y))); var g = t._options; return { xAlign: g.xAlign ? g.xAlign : d, yAlign: g.yAlign ? g.yAlign : h } }(this, y), h._chart) } else g.opacity = 0; return g.xAlign = v.xAlign, g.yAlign = v.yAlign, g.x = b.x, g.y = b.y, g.width = y.width, g.height = y.height, g.caretX = x.x, g.caretY = x.y, h._model = g, t && c.custom && c.custom.call(h, g), h }, drawCaret: function (t, e) { var n = this._chart.ctx, i = this._view, a = this.getCaretPosition(t, e, i); n.lineTo(a.x1, a.y1), n.lineTo(a.x2, a.y2), n.lineTo(a.x3, a.y3) }, getCaretPosition: function (t, e, n) { var i, a, r, o, s, l, u = n.caretSize, d = n.cornerRadius, h = n.xAlign, c = n.yAlign, f = t.x, g = t.y, m = e.width, p = e.height; if ("center" === c) s = g + p / 2, "left" === h ? (a = (i = f) - u, r = i, o = s + u, l = s - u) : (a = (i = f + m) + u, r = i, o = s - u, l = s + u); else if ("left" === h ? (i = (a = f + d + u) - u, r = a + u) : "right" === h ? (i = (a = f + m - d - u) - u, r = a + u) : (i = (a = n.caretX) - u, r = a + u), "top" === c) s = (o = g) - u, l = o; else { s = (o = g + p) + u, l = o; var v = r; r = i, i = v } return { x1: i, x2: a, x3: r, y1: o, y2: s, y3: l } }, drawTitle: function (t, e, n) { var i, a, r, o = e.title, s = o.length; if (s) { var l = Ye(e.rtl, e.x, e.width); for (t.x = Be(e, e._titleAlign), n.textAlign = l.textAlign(e._titleAlign), n.textBaseline = "middle", i = e.titleFontSize, a = e.titleSpacing, n.fillStyle = e.titleFontColor, n.font = B.fontString(i, e._titleFontStyle, e._titleFontFamily), r = 0; r < s; ++r)n.fillText(o[r], l.x(t.x), t.y + i / 2), t.y += i + a, r + 1 === s && (t.y += e.titleMarginBottom - a) } }, drawBody: function (t, e, n) { var i, a, r, o, s, l, u, d, h = e.bodyFontSize, c = e.bodySpacing, f = e._bodyAlign, g = e.body, m = e.displayColors, p = 0, v = m ? Be(e, "left") : 0, b = Ye(e.rtl, e.x, e.width), y = function (e) { n.fillText(e, b.x(t.x + p), t.y + h / 2), t.y += h + c }, x = b.textAlign(f); for (n.textAlign = f, n.textBaseline = "middle", n.font = B.fontString(h, e._bodyFontStyle, e._bodyFontFamily), t.x = Be(e, x), n.fillStyle = e.bodyFontColor, B.each(e.beforeBody, y), p = m && "right" !== x ? "center" === f ? h / 2 + 1 : h + 2 : 0, s = 0, u = g.length; s < u; ++s) { for (i = g[s], a = e.labelTextColors[s], r = e.labelColors[s], n.fillStyle = a, B.each(i.before, y), l = 0, d = (o = i.lines).length; l < d; ++l) { if (m) { var _ = b.x(v); n.fillStyle = e.legendColorBackground, n.fillRect(b.leftForLtr(_, h), t.y, h, h), n.lineWidth = 1, n.strokeStyle = r.borderColor, n.strokeRect(b.leftForLtr(_, h), t.y, h, h), n.fillStyle = r.backgroundColor, n.fillRect(b.leftForLtr(b.xPlus(_, 1), h - 2), t.y + 1, h - 2, h - 2), n.fillStyle = a } y(o[l]) } B.each(i.after, y) } p = 0, B.each(e.afterBody, y), t.y -= c }, drawFooter: function (t, e, n) { var i, a, r = e.footer, o = r.length; if (o) { var s = Ye(e.rtl, e.x, e.width); for (t.x = Be(e, e._footerAlign), t.y += e.footerMarginTop, n.textAlign = s.textAlign(e._footerAlign), n.textBaseline = "middle", i = e.footerFontSize, n.fillStyle = e.footerFontColor, n.font = B.fontString(i, e._footerFontStyle, e._footerFontFamily), a = 0; a < o; ++a)n.fillText(r[a], s.x(t.x), t.y + i / 2), t.y += i + e.footerSpacing } }, drawBackground: function (t, e, n, i) { n.fillStyle = e.backgroundColor, n.strokeStyle = e.borderColor, n.lineWidth = e.borderWidth; var a = e.xAlign, r = e.yAlign, o = t.x, s = t.y, l = i.width, u = i.height, d = e.cornerRadius; n.beginPath(), n.moveTo(o + d, s), "top" === r && this.drawCaret(t, i), n.lineTo(o + l - d, s), n.quadraticCurveTo(o + l, s, o + l, s + d), "center" === r && "right" === a && this.drawCaret(t, i), n.lineTo(o + l, s + u - d), n.quadraticCurveTo(o + l, s + u, o + l - d, s + u), "bottom" === r && this.drawCaret(t, i), n.lineTo(o + d, s + u), n.quadraticCurveTo(o, s + u, o, s + u - d), "center" === r && "left" === a && this.drawCaret(t, i), n.lineTo(o, s + d), n.quadraticCurveTo(o, s, o + d, s), n.closePath(), n.fill(), e.borderWidth > 0 && n.stroke() }, draw: function () { var t = this._chart.ctx, e = this._view; if (0 !== e.opacity) { var n = { width: e.width, height: e.height }, i = { x: e.x, y: e.y }, a = Math.abs(e.opacity < .001) ? 0 : e.opacity, r = e.title.length || e.beforeBody.length || e.body.length || e.afterBody.length || e.footer.length; this._options.enabled && r && (t.save(), t.globalAlpha = a, this.drawBackground(i, e, t, n), i.y += e.yPadding, B.rtl.overrideTextDirection(t, e.textDirection), this.drawTitle(i, e, t), this.drawBody(i, e, t), this.drawFooter(i, e, t), B.rtl.restoreTextDirection(t, e.textDirection), t.restore()) } }, handleEvent: function (t) { var e, n = this, i = n._options; return n._lastActive = n._lastActive || [], "mouseout" === t.type ? n._active = [] : (n._active = n._chart.getElementsAtEventForMode(t, i.mode, i), i.reverse && n._active.reverse()), (e = !B.arrayEquals(n._active, n._lastActive)) && (n._lastActive = n._active, (i.enabled || i.custom) && (n._eventPosition = { x: t.x, y: t.y }, n.update(!0), n.pivot())), e } }), Ge = ze, qe = Ue; qe.positioners = Ge; var Ze = B.valueOrDefault; function $e() { return B.merge(Object.create(null), [].slice.call(arguments), { merger: function (t, e, n, i) { if ("xAxes" === t || "yAxes" === t) { var a, r, o, s = n[t].length; for (e[t] || (e[t] = []), a = 0; a < s; ++a)o = n[t][a], r = Ze(o.type, "xAxes" === t ? "category" : "linear"), a >= e[t].length && e[t].push({}), !e[t][a].type || o.type && o.type !== e[t][a].type ? B.merge(e[t][a], [Ne.getScaleDefaults(r), o]) : B.merge(e[t][a], o) } else B._merger(t, e, n, i) } }) } function Xe() { return B.merge(Object.create(null), [].slice.call(arguments), { merger: function (t, e, n, i) { var a = e[t] || Object.create(null), r = n[t]; "scales" === t ? e[t] = $e(a, r) : "scale" === t ? e[t] = B.merge(a, [Ne.getScaleDefaults(r.type), r]) : B._merger(t, e, n, i) } }) } function Ke(t) { var e = t.options; B.each(t.scales, (function (e) { pe.removeBox(t, e) })), e = Xe(Y.global, Y[t.config.type], e), t.options = t.config.options = e, t.ensureScalesHaveIDs(), t.buildOrUpdateScales(), t.tooltip._options = e.tooltips, t.tooltip.initialize() } function Je(t, e, n) { var i, a = function (t) { return t.id === i }; do { i = e + n++ } while (B.findIndex(t, a) >= 0); return i } function Qe(t) { return "top" === t || "bottom" === t } function tn(t, e) { return function (n, i) { return n[t] === i[t] ? n[e] - i[e] : n[t] - i[t] } } Y._set("global", { elements: {}, events: ["mousemove", "mouseout", "click", "touchstart", "touchmove"], hover: { onHover: null, mode: "nearest", intersect: !0, animationDuration: 400 }, onClick: null, maintainAspectRatio: !0, responsive: !0, responsiveAnimationDuration: 0 }); var en = function (t, e) { return this.construct(t, e), this }; B.extend(en.prototype, { construct: function (t, e) { var n = this; e = function (t) { var e = (t = t || Object.create(null)).data = t.data || {}; return e.datasets = e.datasets || [], e.labels = e.labels || [], t.options = Xe(Y.global, Y[t.type], t.options || {}), t }(e); var i = Le.acquireContext(t, e), a = i && i.canvas, r = a && a.height, o = a && a.width; n.id = B.uid(), n.ctx = i, n.canvas = a, n.config = e, n.width = o, n.height = r, n.aspectRatio = r ? o / r : null, n.options = e.options, n._bufferedRender = !1, n._layers = [], n.chart = n, n.controller = n, en.instances[n.id] = n, Object.defineProperty(n, "data", { get: function () { return n.config.data }, set: function (t) { n.config.data = t } }), i && a ? (n.initialize(), n.update()) : console.error("Failed to create chart: can't acquire context from the given item") }, initialize: function () { var t = this; return Re.notify(t, "beforeInit"), B.retinaScale(t, t.options.devicePixelRatio), t.bindEvents(), t.options.responsive && t.resize(!0), t.initToolTip(), Re.notify(t, "afterInit"), t }, clear: function () { return B.canvas.clear(this), this }, stop: function () { return Q.cancelAnimation(this), this }, resize: function (t) { var e = this, n = e.options, i = e.canvas, a = n.maintainAspectRatio && e.aspectRatio || null, r = Math.max(0, Math.floor(B.getMaximumWidth(i))), o = Math.max(0, Math.floor(a ? r / a : B.getMaximumHeight(i))); if ((e.width !== r || e.height !== o) && (i.width = e.width = r, i.height = e.height = o, i.style.width = r + "px", i.style.height = o + "px", B.retinaScale(e, n.devicePixelRatio), !t)) { var s = { width: r, height: o }; Re.notify(e, "resize", [s]), n.onResize && n.onResize(e, s), e.stop(), e.update({ duration: n.responsiveAnimationDuration }) } }, ensureScalesHaveIDs: function () { var t = this.options, e = t.scales || {}, n = t.scale; B.each(e.xAxes, (function (t, n) { t.id || (t.id = Je(e.xAxes, "x-axis-", n)) })), B.each(e.yAxes, (function (t, n) { t.id || (t.id = Je(e.yAxes, "y-axis-", n)) })), n && (n.id = n.id || "scale") }, buildOrUpdateScales: function () { var t = this, e = t.options, n = t.scales || {}, i = [], a = Object.keys(n).reduce((function (t, e) { return t[e] = !1, t }), {}); e.scales && (i = i.concat((e.scales.xAxes || []).map((function (t) { return { options: t, dtype: "category", dposition: "bottom" } })), (e.scales.yAxes || []).map((function (t) { return { options: t, dtype: "linear", dposition: "left" } })))), e.scale && i.push({ options: e.scale, dtype: "radialLinear", isDefault: !0, dposition: "chartArea" }), B.each(i, (function (e) { var i = e.options, r = i.id, o = Ze(i.type, e.dtype); Qe(i.position) !== Qe(e.dposition) && (i.position = e.dposition), a[r] = !0; var s = null; if (r in n && n[r].type === o) (s = n[r]).options = i, s.ctx = t.ctx, s.chart = t; else { var l = Ne.getScaleConstructor(o); if (!l) return; s = new l({ id: r, type: o, options: i, ctx: t.ctx, chart: t }), n[s.id] = s } s.mergeTicksOptions(), e.isDefault && (t.scale = s) })), B.each(a, (function (t, e) { t || delete n[e] })), t.scales = n, Ne.addScalesToLayout(this) }, buildOrUpdateControllers: function () { var t, e, n = this, i = [], a = n.data.datasets; for (t = 0, e = a.length; t < e; t++) { var r = a[t], o = n.getDatasetMeta(t), s = r.type || n.config.type; if (o.type && o.type !== s && (n.destroyDatasetMeta(t), o = n.getDatasetMeta(t)), o.type = s, o.order = r.order || 0, o.index = t, o.controller) o.controller.updateIndex(t), o.controller.linkScales(); else { var l = Qt[o.type]; if (void 0 === l) throw new Error('"' + o.type + '" is not a chart type.'); o.controller = new l(n, t), i.push(o.controller) } } return i }, resetElements: function () { var t = this; B.each(t.data.datasets, (function (e, n) { t.getDatasetMeta(n).controller.reset() }), t) }, reset: function () { this.resetElements(), this.tooltip.initialize() }, update: function (t) { var e, n, i = this; if (t && "object" == typeof t || (t = { duration: t, lazy: arguments[1] }), Ke(i), Re._invalidate(i), !1 !== Re.notify(i, "beforeUpdate")) { i.tooltip._data = i.data; var a = i.buildOrUpdateControllers(); for (e = 0, n = i.data.datasets.length; e < n; e++)i.getDatasetMeta(e).controller.buildOrUpdateElements(); i.updateLayout(), i.options.animation && i.options.animation.duration && B.each(a, (function (t) { t.reset() })), i.updateDatasets(), i.tooltip.initialize(), i.lastActive = [], Re.notify(i, "afterUpdate"), i._layers.sort(tn("z", "_idx")), i._bufferedRender ? i._bufferedRequest = { duration: t.duration, easing: t.easing, lazy: t.lazy } : i.render(t) } }, updateLayout: function () { var t = this; !1 !== Re.notify(t, "beforeLayout") && (pe.update(this, this.width, this.height), t._layers = [], B.each(t.boxes, (function (e) { e._configure && e._configure(), t._layers.push.apply(t._layers, e._layers()) }), t), t._layers.forEach((function (t, e) { t._idx = e })), Re.notify(t, "afterScaleUpdate"), Re.notify(t, "afterLayout")) }, updateDatasets: function () { if (!1 !== Re.notify(this, "beforeDatasetsUpdate")) { for (var t = 0, e = this.data.datasets.length; t < e; ++t)this.updateDataset(t); Re.notify(this, "afterDatasetsUpdate") } }, updateDataset: function (t) { var e = this.getDatasetMeta(t), n = { meta: e, index: t }; !1 !== Re.notify(this, "beforeDatasetUpdate", [n]) && (e.controller._update(), Re.notify(this, "afterDatasetUpdate", [n])) }, render: function (t) { var e = this; t && "object" == typeof t || (t = { duration: t, lazy: arguments[1] }); var n = e.options.animation, i = Ze(t.duration, n && n.duration), a = t.lazy; if (!1 !== Re.notify(e, "beforeRender")) { var r = function (t) { Re.notify(e, "afterRender"), B.callback(n && n.onComplete, [t], e) }; if (n && i) { var o = new J({ numSteps: i / 16.66, easing: t.easing || n.easing, render: function (t, e) { var n = B.easing.effects[e.easing], i = e.currentStep, a = i / e.numSteps; t.draw(n(a), a, i) }, onAnimationProgress: n.onProgress, onAnimationComplete: r }); Q.addAnimation(e, o, i, a) } else e.draw(), r(new J({ numSteps: 0, chart: e })); return e } }, draw: function (t) { var e, n, i = this; if (i.clear(), B.isNullOrUndef(t) && (t = 1), i.transition(t), !(i.width <= 0 || i.height <= 0) && !1 !== Re.notify(i, "beforeDraw", [t])) { for (n = i._layers, e = 0; e < n.length && n[e].z <= 0; ++e)n[e].draw(i.chartArea); for (i.drawDatasets(t); e < n.length; ++e)n[e].draw(i.chartArea); i._drawTooltip(t), Re.notify(i, "afterDraw", [t]) } }, transition: function (t) { for (var e = 0, n = (this.data.datasets || []).length; e < n; ++e)this.isDatasetVisible(e) && this.getDatasetMeta(e).controller.transition(t); this.tooltip.transition(t) }, _getSortedDatasetMetas: function (t) { var e, n, i = []; for (e = 0, n = (this.data.datasets || []).length; e < n; ++e)t && !this.isDatasetVisible(e) || i.push(this.getDatasetMeta(e)); return i.sort(tn("order", "index")), i }, _getSortedVisibleDatasetMetas: function () { return this._getSortedDatasetMetas(!0) }, drawDatasets: function (t) { var e, n; if (!1 !== Re.notify(this, "beforeDatasetsDraw", [t])) { for (n = (e = this._getSortedVisibleDatasetMetas()).length - 1; n >= 0; --n)this.drawDataset(e[n], t); Re.notify(this, "afterDatasetsDraw", [t]) } }, drawDataset: function (t, e) { var n = { meta: t, index: t.index, easingValue: e }; !1 !== Re.notify(this, "beforeDatasetDraw", [n]) && (t.controller.draw(e), Re.notify(this, "afterDatasetDraw", [n])) }, _drawTooltip: function (t) { var e = this.tooltip, n = { tooltip: e, easingValue: t }; !1 !== Re.notify(this, "beforeTooltipDraw", [n]) && (e.draw(), Re.notify(this, "afterTooltipDraw", [n])) }, getElementAtEvent: function (t) { return oe.modes.single(this, t) }, getElementsAtEvent: function (t) { return oe.modes.label(this, t, { intersect: !0 }) }, getElementsAtXAxis: function (t) { return oe.modes["x-axis"](this, t, { intersect: !0 }) }, getElementsAtEventForMode: function (t, e, n) { var i = oe.modes[e]; return "function" == typeof i ? i(this, t, n) : [] }, getDatasetAtEvent: function (t) { return oe.modes.dataset(this, t, { intersect: !0 }) }, getDatasetMeta: function (t) { var e = this.data.datasets[t]; e._meta || (e._meta = {}); var n = e._meta[this.id]; return n || (n = e._meta[this.id] = { type: null, data: [], dataset: null, controller: null, hidden: null, xAxisID: null, yAxisID: null, order: e.order || 0, index: t }), n }, getVisibleDatasetCount: function () { for (var t = 0, e = 0, n = this.data.datasets.length; e < n; ++e)this.isDatasetVisible(e) && t++; return t }, isDatasetVisible: function (t) { var e = this.getDatasetMeta(t); return "boolean" == typeof e.hidden ? !e.hidden : !this.data.datasets[t].hidden }, generateLegend: function () { return this.options.legendCallback(this) }, destroyDatasetMeta: function (t) { var e = this.id, n = this.data.datasets[t], i = n._meta && n._meta[e]; i && (i.controller.destroy(), delete n._meta[e]) }, destroy: function () { var t, e, n = this, i = n.canvas; for (n.stop(), t = 0, e = n.data.datasets.length; t < e; ++t)n.destroyDatasetMeta(t); i && (n.unbindEvents(), B.canvas.clear(n), Le.releaseContext(n.ctx), n.canvas = null, n.ctx = null), Re.notify(n, "destroy"), delete en.instances[n.id] }, toBase64Image: function () { return this.canvas.toDataURL.apply(this.canvas, arguments) }, initToolTip: function () { var t = this; t.tooltip = new qe({ _chart: t, _chartInstance: t, _data: t.data, _options: t.options.tooltips }, t) }, bindEvents: function () { var t = this, e = t._listeners = {}, n = function () { t.eventHandler.apply(t, arguments) }; B.each(t.options.events, (function (i) { Le.addEventListener(t, i, n), e[i] = n })), t.options.responsive && (n = function () { t.resize() }, Le.addEventListener(t, "resize", n), e.resize = n) }, unbindEvents: function () { var t = this, e = t._listeners; e && (delete t._listeners, B.each(e, (function (e, n) { Le.removeEventListener(t, n, e) }))) }, updateHoverStyle: function (t, e, n) { var i, a, r, o = n ? "set" : "remove"; for (a = 0, r = t.length; a < r; ++a)(i = t[a]) && this.getDatasetMeta(i._datasetIndex).controller[o + "HoverStyle"](i); "dataset" === e && this.getDatasetMeta(t[0]._datasetIndex).controller["_" + o + "DatasetHoverStyle"]() }, eventHandler: function (t) { var e = this, n = e.tooltip; if (!1 !== Re.notify(e, "beforeEvent", [t])) { e._bufferedRender = !0, e._bufferedRequest = null; var i = e.handleEvent(t); n && (i = n._start ? n.handleEvent(t) : i | n.handleEvent(t)), Re.notify(e, "afterEvent", [t]); var a = e._bufferedRequest; return a ? e.render(a) : i && !e.animating && (e.stop(), e.render({ duration: e.options.hover.animationDuration, lazy: !0 })), e._bufferedRender = !1, e._bufferedRequest = null, e } }, handleEvent: function (t) { var e, n = this, i = n.options || {}, a = i.hover; return n.lastActive = n.lastActive || [], "mouseout" === t.type ? n.active = [] : n.active = n.getElementsAtEventForMode(t, a.mode, a), B.callback(i.onHover || i.hover.onHover, [t.native, n.active], n), "mouseup" !== t.type && "click" !== t.type || i.onClick && i.onClick.call(n, t.native, n.active), n.lastActive.length && n.updateHoverStyle(n.lastActive, a.mode, !1), n.active.length && a.mode && n.updateHoverStyle(n.active, a.mode, !0), e = !B.arrayEquals(n.active, n.lastActive), n.lastActive = n.active, e } }), en.instances = {}; var nn = en; en.Controller = en, en.types = {}, B.configMerge = Xe, B.scaleMerge = $e; function an() { throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.") } function rn(t) { this.options = t || {} } B.extend(rn.prototype, { formats: an, parse: an, format: an, add: an, diff: an, startOf: an, endOf: an, _create: function (t) { return t } }), rn.override = function (t) { B.extend(rn.prototype, t) }; var on = { _date: rn }, sn = { formatters: { values: function (t) { return B.isArray(t) ? t : "" + t }, linear: function (t, e, n) { var i = n.length > 3 ? n[2] - n[1] : n[1] - n[0]; Math.abs(i) > 1 && t !== Math.floor(t) && (i = t - Math.floor(t)); var a = B.log10(Math.abs(i)), r = ""; if (0 !== t) if (Math.max(Math.abs(n[0]), Math.abs(n[n.length - 1])) < 1e-4) { var o = B.log10(Math.abs(t)), s = Math.floor(o) - Math.floor(a); s = Math.max(Math.min(s, 20), 0), r = t.toExponential(s) } else { var l = -1 * Math.floor(a); l = Math.max(Math.min(l, 20), 0), r = t.toFixed(l) } else r = "0"; return r }, logarithmic: function (t, e, n) { var i = t / Math.pow(10, Math.floor(B.log10(t))); return 0 === t ? "0" : 1 === i || 2 === i || 5 === i || 0 === e || e === n.length - 1 ? t.toExponential() : "" } } }, ln = B.isArray, un = B.isNullOrUndef, dn = B.valueOrDefault, hn = B.valueAtIndexOrDefault; function cn(t, e, n) { var i, a = t.getTicks().length, r = Math.min(e, a - 1), o = t.getPixelForTick(r), s = t._startPixel, l = t._endPixel; if (!(n && (i = 1 === a ? Math.max(o - s, l - o) : 0 === e ? (t.getPixelForTick(1) - o) / 2 : (o - t.getPixelForTick(r - 1)) / 2, (o += r < e ? i : -i) < s - 1e-6 || o > l + 1e-6))) return o } function fn(t, e, n, i) { var a, r, o, s, l, u, d, h, c, f, g, m, p, v = n.length, b = [], y = [], x = [], _ = 0, w = 0; for (a = 0; a < v; ++a) { if (s = n[a].label, l = n[a].major ? e.major : e.minor, t.font = u = l.string, d = i[u] = i[u] || { data: {}, gc: [] }, h = l.lineHeight, c = f = 0, un(s) || ln(s)) { if (ln(s)) for (r = 0, o = s.length; r < o; ++r)g = s[r], un(g) || ln(g) || (c = B.measureText(t, d.data, d.gc, c, g), f += h) } else c = B.measureText(t, d.data, d.gc, c, s), f = h; b.push(c), y.push(f), x.push(h / 2), _ = Math.max(c, _), w = Math.max(f, w) } function k(t) { return { width: b[t] || 0, height: y[t] || 0, offset: x[t] || 0 } } return function (t, e) { B.each(t, (function (t) { var n, i = t.gc, a = i.length / 2; if (a > e) { for (n = 0; n < a; ++n)delete t.data[i[n]]; i.splice(0, a) } })) }(i, v), m = b.indexOf(_), p = y.indexOf(w), { first: k(0), last: k(v - 1), widest: k(m), highest: k(p) } } function gn(t) { return t.drawTicks ? t.tickMarkLength : 0 } function mn(t) { var e, n; return t.display ? (e = B.options._parseFont(t), n = B.options.toPadding(t.padding), e.lineHeight + n.height) : 0 } function pn(t, e) { return B.extend(B.options._parseFont({ fontFamily: dn(e.fontFamily, t.fontFamily), fontSize: dn(e.fontSize, t.fontSize), fontStyle: dn(e.fontStyle, t.fontStyle), lineHeight: dn(e.lineHeight, t.lineHeight) }), { color: B.options.resolve([e.fontColor, t.fontColor, Y.global.defaultFontColor]) }) } function vn(t) { var e = pn(t, t.minor); return { minor: e, major: t.major.enabled ? pn(t, t.major) : e } } function bn(t) { var e, n, i, a = []; for (n = 0, i = t.length; n < i; ++n)void 0 !== (e = t[n])._index && a.push(e); return a } function yn(t, e, n, i) { var a, r, o, s, l = dn(n, 0), u = Math.min(dn(i, t.length), t.length), d = 0; for (e = Math.ceil(e), i && (e = (a = i - n) / Math.floor(a / e)), s = l; s < 0;)d++, s = Math.round(l + d * e); for (r = Math.max(l, 0); r < u; r++)o = t[r], r === s ? (o._index = r, d++, s = Math.round(l + d * e)) : delete o.label } Y._set("scale", { display: !0, position: "left", offset: !1, gridLines: { display: !0, color: "rgba(0,0,0,0.1)", lineWidth: 1, drawBorder: !0, drawOnChartArea: !0, drawTicks: !0, tickMarkLength: 10, zeroLineWidth: 1, zeroLineColor: "rgba(0,0,0,0.25)", zeroLineBorderDash: [], zeroLineBorderDashOffset: 0, offsetGridLines: !1, borderDash: [], borderDashOffset: 0 }, scaleLabel: { display: !1, labelString: "", padding: { top: 4, bottom: 4 } }, ticks: { beginAtZero: !1, minRotation: 0, maxRotation: 50, mirror: !1, padding: 0, reverse: !1, display: !0, autoSkip: !0, autoSkipPadding: 0, labelOffset: 0, callback: sn.formatters.values, minor: {}, major: {} } }); var xn = X.extend({ zeroLineIndex: 0, getPadding: function () { return { left: this.paddingLeft || 0, top: this.paddingTop || 0, right: this.paddingRight || 0, bottom: this.paddingBottom || 0 } }, getTicks: function () { return this._ticks }, _getLabels: function () { var t = this.chart.data; return this.options.labels || (this.isHorizontal() ? t.xLabels : t.yLabels) || t.labels || [] }, mergeTicksOptions: function () { }, beforeUpdate: function () { B.callback(this.options.beforeUpdate, [this]) }, update: function (t, e, n) { var i, a, r, o, s, l = this, u = l.options.ticks, d = u.sampleSize; if (l.beforeUpdate(), l.maxWidth = t, l.maxHeight = e, l.margins = B.extend({ left: 0, right: 0, top: 0, bottom: 0 }, n), l._ticks = null, l.ticks = null, l._labelSizes = null, l._maxLabelLines = 0, l.longestLabelWidth = 0, l.longestTextCache = l.longestTextCache || {}, l._gridLineItems = null, l._labelItems = null, l.beforeSetDimensions(), l.setDimensions(), l.afterSetDimensions(), l.beforeDataLimits(), l.determineDataLimits(), l.afterDataLimits(), l.beforeBuildTicks(), o = l.buildTicks() || [], (!(o = l.afterBuildTicks(o) || o) || !o.length) && l.ticks) for (o = [], i = 0, a = l.ticks.length; i < a; ++i)o.push({ value: l.ticks[i], major: !1 }); return l._ticks = o, s = d < o.length, r = l._convertTicksToLabels(s ? function (t, e) { for (var n = [], i = t.length / e, a = 0, r = t.length; a < r; a += i)n.push(t[Math.floor(a)]); return n }(o, d) : o), l._configure(), l.beforeCalculateTickRotation(), l.calculateTickRotation(), l.afterCalculateTickRotation(), l.beforeFit(), l.fit(), l.afterFit(), l._ticksToDraw = u.display && (u.autoSkip || "auto" === u.source) ? l._autoSkip(o) : o, s && (r = l._convertTicksToLabels(l._ticksToDraw)), l.ticks = r, l.afterUpdate(), l.minSize }, _configure: function () { var t, e, n = this, i = n.options.ticks.reverse; n.isHorizontal() ? (t = n.left, e = n.right) : (t = n.top, e = n.bottom, i = !i), n._startPixel = t, n._endPixel = e, n._reversePixels = i, n._length = e - t }, afterUpdate: function () { B.callback(this.options.afterUpdate, [this]) }, beforeSetDimensions: function () { B.callback(this.options.beforeSetDimensions, [this]) }, setDimensions: function () { var t = this; t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0 }, afterSetDimensions: function () { B.callback(this.options.afterSetDimensions, [this]) }, beforeDataLimits: function () { B.callback(this.options.beforeDataLimits, [this]) }, determineDataLimits: B.noop, afterDataLimits: function () { B.callback(this.options.afterDataLimits, [this]) }, beforeBuildTicks: function () { B.callback(this.options.beforeBuildTicks, [this]) }, buildTicks: B.noop, afterBuildTicks: function (t) { var e = this; return ln(t) && t.length ? B.callback(e.options.afterBuildTicks, [e, t]) : (e.ticks = B.callback(e.options.afterBuildTicks, [e, e.ticks]) || e.ticks, t) }, beforeTickToLabelConversion: function () { B.callback(this.options.beforeTickToLabelConversion, [this]) }, convertTicksToLabels: function () { var t = this.options.ticks; this.ticks = this.ticks.map(t.userCallback || t.callback, this) }, afterTickToLabelConversion: function () { B.callback(this.options.afterTickToLabelConversion, [this]) }, beforeCalculateTickRotation: function () { B.callback(this.options.beforeCalculateTickRotation, [this]) }, calculateTickRotation: function () { var t, e, n, i, a, r, o, s = this, l = s.options, u = l.ticks, d = s.getTicks().length, h = u.minRotation || 0, c = u.maxRotation, f = h; !s._isVisible() || !u.display || h >= c || d <= 1 || !s.isHorizontal() ? s.labelRotation = h : (e = (t = s._getLabelSizes()).widest.width, n = t.highest.height - t.highest.offset, i = Math.min(s.maxWidth, s.chart.width - e), e + 6 > (a = l.offset ? s.maxWidth / d : i / (d - 1)) && (a = i / (d - (l.offset ? .5 : 1)), r = s.maxHeight - gn(l.gridLines) - u.padding - mn(l.scaleLabel), o = Math.sqrt(e * e + n * n), f = B.toDegrees(Math.min(Math.asin(Math.min((t.highest.height + 6) / a, 1)), Math.asin(Math.min(r / o, 1)) - Math.asin(n / o))), f = Math.max(h, Math.min(c, f))), s.labelRotation = f) }, afterCalculateTickRotation: function () { B.callback(this.options.afterCalculateTickRotation, [this]) }, beforeFit: function () { B.callback(this.options.beforeFit, [this]) }, fit: function () { var t = this, e = t.minSize = { width: 0, height: 0 }, n = t.chart, i = t.options, a = i.ticks, r = i.scaleLabel, o = i.gridLines, s = t._isVisible(), l = "bottom" === i.position, u = t.isHorizontal(); if (u ? e.width = t.maxWidth : s && (e.width = gn(o) + mn(r)), u ? s && (e.height = gn(o) + mn(r)) : e.height = t.maxHeight, a.display && s) { var d = vn(a), h = t._getLabelSizes(), c = h.first, f = h.last, g = h.widest, m = h.highest, p = .4 * d.minor.lineHeight, v = a.padding; if (u) { var b = 0 !== t.labelRotation, y = B.toRadians(t.labelRotation), x = Math.cos(y), _ = Math.sin(y), w = _ * g.width + x * (m.height - (b ? m.offset : 0)) + (b ? 0 : p); e.height = Math.min(t.maxHeight, e.height + w + v); var k, M, S = t.getPixelForTick(0) - t.left, D = t.right - t.getPixelForTick(t.getTicks().length - 1); b ? (k = l ? x * c.width + _ * c.offset : _ * (c.height - c.offset), M = l ? _ * (f.height - f.offset) : x * f.width + _ * f.offset) : (k = c.width / 2, M = f.width / 2), t.paddingLeft = Math.max((k - S) * t.width / (t.width - S), 0) + 3, t.paddingRight = Math.max((M - D) * t.width / (t.width - D), 0) + 3 } else { var C = a.mirror ? 0 : g.width + v + p; e.width = Math.min(t.maxWidth, e.width + C), t.paddingTop = c.height / 2, t.paddingBottom = f.height / 2 } } t.handleMargins(), u ? (t.width = t._length = n.width - t.margins.left - t.margins.right, t.height = e.height) : (t.width = e.width, t.height = t._length = n.height - t.margins.top - t.margins.bottom) }, handleMargins: function () { var t = this; t.margins && (t.margins.left = Math.max(t.paddingLeft, t.margins.left), t.margins.top = Math.max(t.paddingTop, t.margins.top), t.margins.right = Math.max(t.paddingRight, t.margins.right), t.margins.bottom = Math.max(t.paddingBottom, t.margins.bottom)) }, afterFit: function () { B.callback(this.options.afterFit, [this]) }, isHorizontal: function () { var t = this.options.position; return "top" === t || "bottom" === t }, isFullWidth: function () { return this.options.fullWidth }, getRightValue: function (t) { if (un(t)) return NaN; if (("number" == typeof t || t instanceof Number) && !isFinite(t)) return NaN; if (t) if (this.isHorizontal()) { if (void 0 !== t.x) return this.getRightValue(t.x) } else if (void 0 !== t.y) return this.getRightValue(t.y); return t }, _convertTicksToLabels: function (t) { var e, n, i, a = this; for (a.ticks = t.map((function (t) { return t.value })), a.beforeTickToLabelConversion(), e = a.convertTicksToLabels(t) || a.ticks, a.afterTickToLabelConversion(), n = 0, i = t.length; n < i; ++n)t[n].label = e[n]; return e }, _getLabelSizes: function () { var t = this, e = t._labelSizes; return e || (t._labelSizes = e = fn(t.ctx, vn(t.options.ticks), t.getTicks(), t.longestTextCache), t.longestLabelWidth = e.widest.width), e }, _parseValue: function (t) { var e, n, i, a; return ln(t) ? (e = +this.getRightValue(t[0]), n = +this.getRightValue(t[1]), i = Math.min(e, n), a = Math.max(e, n)) : (e = void 0, n = t = +this.getRightValue(t), i = t, a = t), { min: i, max: a, start: e, end: n } }, _getScaleLabel: function (t) { var e = this._parseValue(t); return void 0 !== e.start ? "[" + e.start + ", " + e.end + "]" : +this.getRightValue(t) }, getLabelForIndex: B.noop, getPixelForValue: B.noop, getValueForPixel: B.noop, getPixelForTick: function (t) { var e = this.options.offset, n = this._ticks.length, i = 1 / Math.max(n - (e ? 0 : 1), 1); return t < 0 || t > n - 1 ? null : this.getPixelForDecimal(t * i + (e ? i / 2 : 0)) }, getPixelForDecimal: function (t) { return this._reversePixels && (t = 1 - t), this._startPixel + t * this._length }, getDecimalForPixel: function (t) { var e = (t - this._startPixel) / this._length; return this._reversePixels ? 1 - e : e }, getBasePixel: function () { return this.getPixelForValue(this.getBaseValue()) }, getBaseValue: function () { var t = this.min, e = this.max; return this.beginAtZero ? 0 : t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0 }, _autoSkip: function (t) { var e, n, i, a, r = this.options.ticks, o = this._length, s = r.maxTicksLimit || o / this._tickSize() + 1, l = r.major.enabled ? function (t) { var e, n, i = []; for (e = 0, n = t.length; e < n; e++)t[e].major && i.push(e); return i }(t) : [], u = l.length, d = l[0], h = l[u - 1]; if (u > s) return function (t, e, n) { var i, a, r = 0, o = e[0]; for (n = Math.ceil(n), i = 0; i < t.length; i++)a = t[i], i === o ? (a._index = i, o = e[++r * n]) : delete a.label }(t, l, u / s), bn(t); if (i = function (t, e, n, i) { var a, r, o, s, l = function (t) { var e, n, i = t.length; if (i < 2) return !1; for (n = t[0], e = 1; e < i; ++e)if (t[e] - t[e - 1] !== n) return !1; return n }(t), u = (e.length - 1) / i; if (!l) return Math.max(u, 1); for (o = 0, s = (a = B.math._factorize(l)).length - 1; o < s; o++)if ((r = a[o]) > u) return r; return Math.max(u, 1) }(l, t, 0, s), u > 0) { for (e = 0, n = u - 1; e < n; e++)yn(t, i, l[e], l[e + 1]); return a = u > 1 ? (h - d) / (u - 1) : null, yn(t, i, B.isNullOrUndef(a) ? 0 : d - a, d), yn(t, i, h, B.isNullOrUndef(a) ? t.length : h + a), bn(t) } return yn(t, i), bn(t) }, _tickSize: function () { var t = this.options.ticks, e = B.toRadians(this.labelRotation), n = Math.abs(Math.cos(e)), i = Math.abs(Math.sin(e)), a = this._getLabelSizes(), r = t.autoSkipPadding || 0, o = a ? a.widest.width + r : 0, s = a ? a.highest.height + r : 0; return this.isHorizontal() ? s * n > o * i ? o / n : s / i : s * i < o * n ? s / n : o / i }, _isVisible: function () { var t, e, n, i = this.chart, a = this.options.display; if ("auto" !== a) return !!a; for (t = 0, e = i.data.datasets.length; t < e; ++t)if (i.isDatasetVisible(t) && ((n = i.getDatasetMeta(t)).xAxisID === this.id || n.yAxisID === this.id)) return !0; return !1 }, _computeGridLineItems: function (t) { var e, n, i, a, r, o, s, l, u, d, h, c, f, g, m, p, v, b = this, y = b.chart, x = b.options, _ = x.gridLines, w = x.position, k = _.offsetGridLines, M = b.isHorizontal(), S = b._ticksToDraw, D = S.length + (k ? 1 : 0), C = gn(_), P = [], T = _.drawBorder ? hn(_.lineWidth, 0, 0) : 0, O = T / 2, A = B._alignPixel, F = function (t) { return A(y, t, T) }; for ("top" === w ? (e = F(b.bottom), s = b.bottom - C, u = e - O, h = F(t.top) + O, f = t.bottom) : "bottom" === w ? (e = F(b.top), h = t.top, f = F(t.bottom) - O, s = e + O, u = b.top + C) : "left" === w ? (e = F(b.right), o = b.right - C, l = e - O, d = F(t.left) + O, c = t.right) : (e = F(b.left), d = t.left, c = F(t.right) - O, o = e + O, l = b.left + C), n = 0; n < D; ++n)i = S[n] || {}, un(i.label) && n < S.length || (n === b.zeroLineIndex && x.offset === k ? (g = _.zeroLineWidth, m = _.zeroLineColor, p = _.zeroLineBorderDash || [], v = _.zeroLineBorderDashOffset || 0) : (g = hn(_.lineWidth, n, 1), m = hn(_.color, n, "rgba(0,0,0,0.1)"), p = _.borderDash || [], v = _.borderDashOffset || 0), void 0 !== (a = cn(b, i._index || n, k)) && (r = A(y, a, g), M ? o = l = d = c = r : s = u = h = f = r, P.push({ tx1: o, ty1: s, tx2: l, ty2: u, x1: d, y1: h, x2: c, y2: f, width: g, color: m, borderDash: p, borderDashOffset: v }))); return P.ticksLength = D, P.borderValue = e, P }, _computeLabelItems: function () { var t, e, n, i, a, r, o, s, l, u, d, h, c = this, f = c.options, g = f.ticks, m = f.position, p = g.mirror, v = c.isHorizontal(), b = c._ticksToDraw, y = vn(g), x = g.padding, _ = gn(f.gridLines), w = -B.toRadians(c.labelRotation), k = []; for ("top" === m ? (r = c.bottom - _ - x, o = w ? "left" : "center") : "bottom" === m ? (r = c.top + _ + x, o = w ? "right" : "center") : "left" === m ? (a = c.right - (p ? 0 : _) - x, o = p ? "left" : "right") : (a = c.left + (p ? 0 : _) + x, o = p ? "right" : "left"), t = 0, e = b.length; t < e; ++t)i = (n = b[t]).label, un(i) || (s = c.getPixelForTick(n._index || t) + g.labelOffset, u = (l = n.major ? y.major : y.minor).lineHeight, d = ln(i) ? i.length : 1, v ? (a = s, h = "top" === m ? ((w ? 1 : .5) - d) * u : (w ? 0 : .5) * u) : (r = s, h = (1 - d) * u / 2), k.push({ x: a, y: r, rotation: w, label: i, font: l, textOffset: h, textAlign: o })); return k }, _drawGrid: function (t) { var e = this, n = e.options.gridLines; if (n.display) { var i, a, r, o, s, l = e.ctx, u = e.chart, d = B._alignPixel, h = n.drawBorder ? hn(n.lineWidth, 0, 0) : 0, c = e._gridLineItems || (e._gridLineItems = e._computeGridLineItems(t)); for (r = 0, o = c.length; r < o; ++r)i = (s = c[r]).width, a = s.color, i && a && (l.save(), l.lineWidth = i, l.strokeStyle = a, l.setLineDash && (l.setLineDash(s.borderDash), l.lineDashOffset = s.borderDashOffset), l.beginPath(), n.drawTicks && (l.moveTo(s.tx1, s.ty1), l.lineTo(s.tx2, s.ty2)), n.drawOnChartArea && (l.moveTo(s.x1, s.y1), l.lineTo(s.x2, s.y2)), l.stroke(), l.restore()); if (h) { var f, g, m, p, v = h, b = hn(n.lineWidth, c.ticksLength - 1, 1), y = c.borderValue; e.isHorizontal() ? (f = d(u, e.left, v) - v / 2, g = d(u, e.right, b) + b / 2, m = p = y) : (m = d(u, e.top, v) - v / 2, p = d(u, e.bottom, b) + b / 2, f = g = y), l.lineWidth = h, l.strokeStyle = hn(n.color, 0), l.beginPath(), l.moveTo(f, m), l.lineTo(g, p), l.stroke() } } }, _drawLabels: function () { var t = this; if (t.options.ticks.display) { var e, n, i, a, r, o, s, l, u = t.ctx, d = t._labelItems || (t._labelItems = t._computeLabelItems()); for (e = 0, i = d.length; e < i; ++e) { if (o = (r = d[e]).font, u.save(), u.translate(r.x, r.y), u.rotate(r.rotation), u.font = o.string, u.fillStyle = o.color, u.textBaseline = "middle", u.textAlign = r.textAlign, s = r.label, l = r.textOffset, ln(s)) for (n = 0, a = s.length; n < a; ++n)u.fillText("" + s[n], 0, l), l += o.lineHeight; else u.fillText(s, 0, l); u.restore() } } }, _drawTitle: function () { var t = this, e = t.ctx, n = t.options, i = n.scaleLabel; if (i.display) { var a, r, o = dn(i.fontColor, Y.global.defaultFontColor), s = B.options._parseFont(i), l = B.options.toPadding(i.padding), u = s.lineHeight / 2, d = n.position, h = 0; if (t.isHorizontal()) a = t.left + t.width / 2, r = "bottom" === d ? t.bottom - u - l.bottom : t.top + u + l.top; else { var c = "left" === d; a = c ? t.left + u + l.top : t.right - u - l.top, r = t.top + t.height / 2, h = c ? -.5 * Math.PI : .5 * Math.PI } e.save(), e.translate(a, r), e.rotate(h), e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = o, e.font = s.string, e.fillText(i.labelString, 0, 0), e.restore() } }, draw: function (t) { this._isVisible() && (this._drawGrid(t), this._drawTitle(), this._drawLabels()) }, _layers: function () { var t = this, e = t.options, n = e.ticks && e.ticks.z || 0, i = e.gridLines && e.gridLines.z || 0; return t._isVisible() && n !== i && t.draw === t._draw ? [{ z: i, draw: function () { t._drawGrid.apply(t, arguments), t._drawTitle.apply(t, arguments) } }, { z: n, draw: function () { t._drawLabels.apply(t, arguments) } }] : [{ z: n, draw: function () { t.draw.apply(t, arguments) } }] }, _getMatchingVisibleMetas: function (t) { var e = this, n = e.isHorizontal(); return e.chart._getSortedVisibleDatasetMetas().filter((function (i) { return (!t || i.type === t) && (n ? i.xAxisID === e.id : i.yAxisID === e.id) })) } }); xn.prototype._draw = xn.prototype.draw; var _n = xn, wn = B.isNullOrUndef, kn = _n.extend({ determineDataLimits: function () { var t, e = this, n = e._getLabels(), i = e.options.ticks, a = i.min, r = i.max, o = 0, s = n.length - 1; void 0 !== a && (t = n.indexOf(a)) >= 0 && (o = t), void 0 !== r && (t = n.indexOf(r)) >= 0 && (s = t), e.minIndex = o, e.maxIndex = s, e.min = n[o], e.max = n[s] }, buildTicks: function () { var t = this._getLabels(), e = this.minIndex, n = this.maxIndex; this.ticks = 0 === e && n === t.length - 1 ? t : t.slice(e, n + 1) }, getLabelForIndex: function (t, e) { var n = this.chart; return n.getDatasetMeta(e).controller._getValueScaleId() === this.id ? this.getRightValue(n.data.datasets[e].data[t]) : this._getLabels()[t] }, _configure: function () { var t = this, e = t.options.offset, n = t.ticks; _n.prototype._configure.call(t), t.isHorizontal() || (t._reversePixels = !t._reversePixels), n && (t._startValue = t.minIndex - (e ? .5 : 0), t._valueRange = Math.max(n.length - (e ? 0 : 1), 1)) }, getPixelForValue: function (t, e, n) { var i, a, r, o = this; return wn(e) || wn(n) || (t = o.chart.data.datasets[n].data[e]), wn(t) || (i = o.isHorizontal() ? t.x : t.y), (void 0 !== i || void 0 !== t && isNaN(e)) && (a = o._getLabels(), t = B.valueOrDefault(i, t), e = -1 !== (r = a.indexOf(t)) ? r : e, isNaN(e) && (e = t)), o.getPixelForDecimal((e - o._startValue) / o._valueRange) }, getPixelForTick: function (t) { var e = this.ticks; return t < 0 || t > e.length - 1 ? null : this.getPixelForValue(e[t], t + this.minIndex) }, getValueForPixel: function (t) { var e = Math.round(this._startValue + this.getDecimalForPixel(t) * this._valueRange); return Math.min(Math.max(e, 0), this.ticks.length - 1) }, getBasePixel: function () { return this.bottom } }), Mn = { position: "bottom" }; kn._defaults = Mn; var Sn = B.noop, Dn = B.isNullOrUndef; var Cn = _n.extend({ getRightValue: function (t) { return "string" == typeof t ? +t : _n.prototype.getRightValue.call(this, t) }, handleTickRangeOptions: function () { var t = this, e = t.options.ticks; if (e.beginAtZero) { var n = B.sign(t.min), i = B.sign(t.max); n < 0 && i < 0 ? t.max = 0 : n > 0 && i > 0 && (t.min = 0) } var a = void 0 !== e.min || void 0 !== e.suggestedMin, r = void 0 !== e.max || void 0 !== e.suggestedMax; void 0 !== e.min ? t.min = e.min : void 0 !== e.suggestedMin && (null === t.min ? t.min = e.suggestedMin : t.min = Math.min(t.min, e.suggestedMin)), void 0 !== e.max ? t.max = e.max : void 0 !== e.suggestedMax && (null === t.max ? t.max = e.suggestedMax : t.max = Math.max(t.max, e.suggestedMax)), a !== r && t.min >= t.max && (a ? t.max = t.min + 1 : t.min = t.max - 1), t.min === t.max && (t.max++, e.beginAtZero || t.min--) }, getTickLimit: function () { var t, e = this.options.ticks, n = e.stepSize, i = e.maxTicksLimit; return n ? t = Math.ceil(this.max / n) - Math.floor(this.min / n) + 1 : (t = this._computeTickLimit(), i = i || 11), i && (t = Math.min(i, t)), t }, _computeTickLimit: function () { return Number.POSITIVE_INFINITY }, handleDirectionalChanges: Sn, buildTicks: function () { var t = this, e = t.options.ticks, n = t.getTickLimit(), i = { maxTicks: n = Math.max(2, n), min: e.min, max: e.max, precision: e.precision, stepSize: B.valueOrDefault(e.fixedStepSize, e.stepSize) }, a = t.ticks = function (t, e) { var n, i, a, r, o = [], s = t.stepSize, l = s || 1, u = t.maxTicks - 1, d = t.min, h = t.max, c = t.precision, f = e.min, g = e.max, m = B.niceNum((g - f) / u / l) * l; if (m < 1e-14 && Dn(d) && Dn(h)) return [f, g]; (r = Math.ceil(g / m) - Math.floor(f / m)) > u && (m = B.niceNum(r * m / u / l) * l), s || Dn(c) ? n = Math.pow(10, B._decimalPlaces(m)) : (n = Math.pow(10, c), m = Math.ceil(m * n) / n), i = Math.floor(f / m) * m, a = Math.ceil(g / m) * m, s && (!Dn(d) && B.almostWhole(d / m, m / 1e3) && (i = d), !Dn(h) && B.almostWhole(h / m, m / 1e3) && (a = h)), r = (a - i) / m, r = B.almostEquals(r, Math.round(r), m / 1e3) ? Math.round(r) : Math.ceil(r), i = Math.round(i * n) / n, a = Math.round(a * n) / n, o.push(Dn(d) ? i : d); for (var p = 1; p < r; ++p)o.push(Math.round((i + p * m) * n) / n); return o.push(Dn(h) ? a : h), o }(i, t); t.handleDirectionalChanges(), t.max = B.max(a), t.min = B.min(a), e.reverse ? (a.reverse(), t.start = t.max, t.end = t.min) : (t.start = t.min, t.end = t.max) }, convertTicksToLabels: function () { var t = this; t.ticksAsNumbers = t.ticks.slice(), t.zeroLineIndex = t.ticks.indexOf(0), _n.prototype.convertTicksToLabels.call(t) }, _configure: function () { var t, e = this, n = e.getTicks(), i = e.min, a = e.max; _n.prototype._configure.call(e), e.options.offset && n.length && (i -= t = (a - i) / Math.max(n.length - 1, 1) / 2, a += t), e._startValue = i, e._endValue = a, e._valueRange = a - i } }), Pn = { position: "left", ticks: { callback: sn.formatters.linear } }; function Tn(t, e, n, i) { var a, r, o = t.options, s = function (t, e, n) { var i = [n.type, void 0 === e && void 0 === n.stack ? n.index : "", n.stack].join("."); return void 0 === t[i] && (t[i] = { pos: [], neg: [] }), t[i] }(e, o.stacked, n), l = s.pos, u = s.neg, d = i.length; for (a = 0; a < d; ++a)r = t._parseValue(i[a]), isNaN(r.min) || isNaN(r.max) || n.data[a].hidden || (l[a] = l[a] || 0, u[a] = u[a] || 0, o.relativePoints ? l[a] = 100 : r.min < 0 || r.max < 0 ? u[a] += r.min : l[a] += r.max) } function On(t, e, n) { var i, a, r = n.length; for (i = 0; i < r; ++i)a = t._parseValue(n[i]), isNaN(a.min) || isNaN(a.max) || e.data[i].hidden || (t.min = Math.min(t.min, a.min), t.max = Math.max(t.max, a.max)) } var An = Cn.extend({ determineDataLimits: function () { var t, e, n, i, a = this, r = a.options, o = a.chart.data.datasets, s = a._getMatchingVisibleMetas(), l = r.stacked, u = {}, d = s.length; if (a.min = Number.POSITIVE_INFINITY, a.max = Number.NEGATIVE_INFINITY, void 0 === l) for (t = 0; !l && t < d; ++t)l = void 0 !== (e = s[t]).stack; for (t = 0; t < d; ++t)n = o[(e = s[t]).index].data, l ? Tn(a, u, e, n) : On(a, e, n); B.each(u, (function (t) { i = t.pos.concat(t.neg), a.min = Math.min(a.min, B.min(i)), a.max = Math.max(a.max, B.max(i)) })), a.min = B.isFinite(a.min) && !isNaN(a.min) ? a.min : 0, a.max = B.isFinite(a.max) && !isNaN(a.max) ? a.max : 1, a.handleTickRangeOptions() }, _computeTickLimit: function () { var t; return this.isHorizontal() ? Math.ceil(this.width / 40) : (t = B.options._parseFont(this.options.ticks), Math.ceil(this.height / t.lineHeight)) }, handleDirectionalChanges: function () { this.isHorizontal() || this.ticks.reverse() }, getLabelForIndex: function (t, e) { return this._getScaleLabel(this.chart.data.datasets[e].data[t]) }, getPixelForValue: function (t) { return this.getPixelForDecimal((+this.getRightValue(t) - this._startValue) / this._valueRange) }, getValueForPixel: function (t) { return this._startValue + this.getDecimalForPixel(t) * this._valueRange }, getPixelForTick: function (t) { var e = this.ticksAsNumbers; return t < 0 || t > e.length - 1 ? null : this.getPixelForValue(e[t]) } }), Fn = Pn; An._defaults = Fn; var In = B.valueOrDefault, Ln = B.math.log10; var Rn = { position: "left", ticks: { callback: sn.formatters.logarithmic } }; function Nn(t, e) { return B.isFinite(t) && t >= 0 ? t : e } var Wn = _n.extend({ determineDataLimits: function () { var t, e, n, i, a, r, o = this, s = o.options, l = o.chart, u = l.data.datasets, d = o.isHorizontal(); function h(t) { return d ? t.xAxisID === o.id : t.yAxisID === o.id } o.min = Number.POSITIVE_INFINITY, o.max = Number.NEGATIVE_INFINITY, o.minNotZero = Number.POSITIVE_INFINITY; var c = s.stacked; if (void 0 === c) for (t = 0; t < u.length; t++)if (e = l.getDatasetMeta(t), l.isDatasetVisible(t) && h(e) && void 0 !== e.stack) { c = !0; break } if (s.stacked || c) { var f = {}; for (t = 0; t < u.length; t++) { var g = [(e = l.getDatasetMeta(t)).type, void 0 === s.stacked && void 0 === e.stack ? t : "", e.stack].join("."); if (l.isDatasetVisible(t) && h(e)) for (void 0 === f[g] && (f[g] = []), a = 0, r = (i = u[t].data).length; a < r; a++) { var m = f[g]; n = o._parseValue(i[a]), isNaN(n.min) || isNaN(n.max) || e.data[a].hidden || n.min < 0 || n.max < 0 || (m[a] = m[a] || 0, m[a] += n.max) } } B.each(f, (function (t) { if (t.length > 0) { var e = B.min(t), n = B.max(t); o.min = Math.min(o.min, e), o.max = Math.max(o.max, n) } })) } else for (t = 0; t < u.length; t++)if (e = l.getDatasetMeta(t), l.isDatasetVisible(t) && h(e)) for (a = 0, r = (i = u[t].data).length; a < r; a++)n = o._parseValue(i[a]), isNaN(n.min) || isNaN(n.max) || e.data[a].hidden || n.min < 0 || n.max < 0 || (o.min = Math.min(n.min, o.min), o.max = Math.max(n.max, o.max), 0 !== n.min && (o.minNotZero = Math.min(n.min, o.minNotZero))); o.min = B.isFinite(o.min) ? o.min : null, o.max = B.isFinite(o.max) ? o.max : null, o.minNotZero = B.isFinite(o.minNotZero) ? o.minNotZero : null, this.handleTickRangeOptions() }, handleTickRangeOptions: function () { var t = this, e = t.options.ticks; t.min = Nn(e.min, t.min), t.max = Nn(e.max, t.max), t.min === t.max && (0 !== t.min && null !== t.min ? (t.min = Math.pow(10, Math.floor(Ln(t.min)) - 1), t.max = Math.pow(10, Math.floor(Ln(t.max)) + 1)) : (t.min = 1, t.max = 10)), null === t.min && (t.min = Math.pow(10, Math.floor(Ln(t.max)) - 1)), null === t.max && (t.max = 0 !== t.min ? Math.pow(10, Math.floor(Ln(t.min)) + 1) : 10), null === t.minNotZero && (t.min > 0 ? t.minNotZero = t.min : t.max < 1 ? t.minNotZero = Math.pow(10, Math.floor(Ln(t.max))) : t.minNotZero = 1) }, buildTicks: function () { var t = this, e = t.options.ticks, n = !t.isHorizontal(), i = { min: Nn(e.min), max: Nn(e.max) }, a = t.ticks = function (t, e) { var n, i, a = [], r = In(t.min, Math.pow(10, Math.floor(Ln(e.min)))), o = Math.floor(Ln(e.max)), s = Math.ceil(e.max / Math.pow(10, o)); 0 === r ? (n = Math.floor(Ln(e.minNotZero)), i = Math.floor(e.minNotZero / Math.pow(10, n)), a.push(r), r = i * Math.pow(10, n)) : (n = Math.floor(Ln(r)), i = Math.floor(r / Math.pow(10, n))); var l = n < 0 ? Math.pow(10, Math.abs(n)) : 1; do { a.push(r), 10 === ++i && (i = 1, l = ++n >= 0 ? 1 : l), r = Math.round(i * Math.pow(10, n) * l) / l } while (n < o || n === o && i < s); var u = In(t.max, r); return a.push(u), a }(i, t); t.max = B.max(a), t.min = B.min(a), e.reverse ? (n = !n, t.start = t.max, t.end = t.min) : (t.start = t.min, t.end = t.max), n && a.reverse() }, convertTicksToLabels: function () { this.tickValues = this.ticks.slice(), _n.prototype.convertTicksToLabels.call(this) }, getLabelForIndex: function (t, e) { return this._getScaleLabel(this.chart.data.datasets[e].data[t]) }, getPixelForTick: function (t) { var e = this.tickValues; return t < 0 || t > e.length - 1 ? null : this.getPixelForValue(e[t]) }, _getFirstTickValue: function (t) { var e = Math.floor(Ln(t)); return Math.floor(t / Math.pow(10, e)) * Math.pow(10, e) }, _configure: function () { var t = this, e = t.min, n = 0; _n.prototype._configure.call(t), 0 === e && (e = t._getFirstTickValue(t.minNotZero), n = In(t.options.ticks.fontSize, Y.global.defaultFontSize) / t._length), t._startValue = Ln(e), t._valueOffset = n, t._valueRange = (Ln(t.max) - Ln(e)) / (1 - n) }, getPixelForValue: function (t) { var e = this, n = 0; return (t = +e.getRightValue(t)) > e.min && t > 0 && (n = (Ln(t) - e._startValue) / e._valueRange + e._valueOffset), e.getPixelForDecimal(n) }, getValueForPixel: function (t) { var e = this, n = e.getDecimalForPixel(t); return 0 === n && 0 === e.min ? 0 : Math.pow(10, e._startValue + (n - e._valueOffset) * e._valueRange) } }), Yn = Rn; Wn._defaults = Yn; var zn = B.valueOrDefault, En = B.valueAtIndexOrDefault, Vn = B.options.resolve, Hn = { display: !0, animate: !0, position: "chartArea", angleLines: { display: !0, color: "rgba(0,0,0,0.1)", lineWidth: 1, borderDash: [], borderDashOffset: 0 }, gridLines: { circular: !1 }, ticks: { showLabelBackdrop: !0, backdropColor: "rgba(255,255,255,0.75)", backdropPaddingY: 2, backdropPaddingX: 2, callback: sn.formatters.linear }, pointLabels: { display: !0, fontSize: 10, callback: function (t) { return t } } }; function Bn(t) { var e = t.ticks; return e.display && t.display ? zn(e.fontSize, Y.global.defaultFontSize) + 2 * e.backdropPaddingY : 0 } function jn(t, e, n, i, a) { return t === i || t === a ? { start: e - n / 2, end: e + n / 2 } : t < i || t > a ? { start: e - n, end: e } : { start: e, end: e + n } } function Un(t) { return 0 === t || 180 === t ? "center" : t < 180 ? "left" : "right" } function Gn(t, e, n, i) { var a, r, o = n.y + i / 2; if (B.isArray(e)) for (a = 0, r = e.length; a < r; ++a)t.fillText(e[a], n.x, o), o += i; else t.fillText(e, n.x, o) } function qn(t, e, n) { 90 === t || 270 === t ? n.y -= e.h / 2 : (t > 270 || t < 90) && (n.y -= e.h) } function Zn(t) { return B.isNumber(t) ? t : 0 } var $n = Cn.extend({ setDimensions: function () { var t = this; t.width = t.maxWidth, t.height = t.maxHeight, t.paddingTop = Bn(t.options) / 2, t.xCenter = Math.floor(t.width / 2), t.yCenter = Math.floor((t.height - t.paddingTop) / 2), t.drawingArea = Math.min(t.height - t.paddingTop, t.width) / 2 }, determineDataLimits: function () { var t = this, e = t.chart, n = Number.POSITIVE_INFINITY, i = Number.NEGATIVE_INFINITY; B.each(e.data.datasets, (function (a, r) { if (e.isDatasetVisible(r)) { var o = e.getDatasetMeta(r); B.each(a.data, (function (e, a) { var r = +t.getRightValue(e); isNaN(r) || o.data[a].hidden || (n = Math.min(r, n), i = Math.max(r, i)) })) } })), t.min = n === Number.POSITIVE_INFINITY ? 0 : n, t.max = i === Number.NEGATIVE_INFINITY ? 0 : i, t.handleTickRangeOptions() }, _computeTickLimit: function () { return Math.ceil(this.drawingArea / Bn(this.options)) }, convertTicksToLabels: function () { var t = this; Cn.prototype.convertTicksToLabels.call(t), t.pointLabels = t.chart.data.labels.map((function () { var e = B.callback(t.options.pointLabels.callback, arguments, t); return e || 0 === e ? e : "" })) }, getLabelForIndex: function (t, e) { return +this.getRightValue(this.chart.data.datasets[e].data[t]) }, fit: function () { var t = this.options; t.display && t.pointLabels.display ? function (t) { var e, n, i, a = B.options._parseFont(t.options.pointLabels), r = { l: 0, r: t.width, t: 0, b: t.height - t.paddingTop }, o = {}; t.ctx.font = a.string, t._pointLabelSizes = []; var s, l, u, d = t.chart.data.labels.length; for (e = 0; e < d; e++) { i = t.getPointPosition(e, t.drawingArea + 5), s = t.ctx, l = a.lineHeight, u = t.pointLabels[e], n = B.isArray(u) ? { w: B.longestText(s, s.font, u), h: u.length * l } : { w: s.measureText(u).width, h: l }, t._pointLabelSizes[e] = n; var h = t.getIndexAngle(e), c = B.toDegrees(h) % 360, f = jn(c, i.x, n.w, 0, 180), g = jn(c, i.y, n.h, 90, 270); f.start < r.l && (r.l = f.start, o.l = h), f.end > r.r && (r.r = f.end, o.r = h), g.start < r.t && (r.t = g.start, o.t = h), g.end > r.b && (r.b = g.end, o.b = h) } t.setReductions(t.drawingArea, r, o) }(this) : this.setCenterPoint(0, 0, 0, 0) }, setReductions: function (t, e, n) { var i = this, a = e.l / Math.sin(n.l), r = Math.max(e.r - i.width, 0) / Math.sin(n.r), o = -e.t / Math.cos(n.t), s = -Math.max(e.b - (i.height - i.paddingTop), 0) / Math.cos(n.b); a = Zn(a), r = Zn(r), o = Zn(o), s = Zn(s), i.drawingArea = Math.min(Math.floor(t - (a + r) / 2), Math.floor(t - (o + s) / 2)), i.setCenterPoint(a, r, o, s) }, setCenterPoint: function (t, e, n, i) { var a = this, r = a.width - e - a.drawingArea, o = t + a.drawingArea, s = n + a.drawingArea, l = a.height - a.paddingTop - i - a.drawingArea; a.xCenter = Math.floor((o + r) / 2 + a.left), a.yCenter = Math.floor((s + l) / 2 + a.top + a.paddingTop) }, getIndexAngle: function (t) { var e = this.chart, n = (t * (360 / e.data.labels.length) + ((e.options || {}).startAngle || 0)) % 360; return (n < 0 ? n + 360 : n) * Math.PI * 2 / 360 }, getDistanceFromCenterForValue: function (t) { var e = this; if (B.isNullOrUndef(t)) return NaN; var n = e.drawingArea / (e.max - e.min); return e.options.ticks.reverse ? (e.max - t) * n : (t - e.min) * n }, getPointPosition: function (t, e) { var n = this.getIndexAngle(t) - Math.PI / 2; return { x: Math.cos(n) * e + this.xCenter, y: Math.sin(n) * e + this.yCenter } }, getPointPositionForValue: function (t, e) { return this.getPointPosition(t, this.getDistanceFromCenterForValue(e)) }, getBasePosition: function (t) { var e = this.min, n = this.max; return this.getPointPositionForValue(t || 0, this.beginAtZero ? 0 : e < 0 && n < 0 ? n : e > 0 && n > 0 ? e : 0) }, _drawGrid: function () { var t, e, n, i = this, a = i.ctx, r = i.options, o = r.gridLines, s = r.angleLines, l = zn(s.lineWidth, o.lineWidth), u = zn(s.color, o.color); if (r.pointLabels.display && function (t) { var e = t.ctx, n = t.options, i = n.pointLabels, a = Bn(n), r = t.getDistanceFromCenterForValue(n.ticks.reverse ? t.min : t.max), o = B.options._parseFont(i); e.save(), e.font = o.string, e.textBaseline = "middle"; for (var s = t.chart.data.labels.length - 1; s >= 0; s--) { var l = 0 === s ? a / 2 : 0, u = t.getPointPosition(s, r + l + 5), d = En(i.fontColor, s, Y.global.defaultFontColor); e.fillStyle = d; var h = t.getIndexAngle(s), c = B.toDegrees(h); e.textAlign = Un(c), qn(c, t._pointLabelSizes[s], u), Gn(e, t.pointLabels[s], u, o.lineHeight) } e.restore() }(i), o.display && B.each(i.ticks, (function (t, n) { 0 !== n && (e = i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]), function (t, e, n, i) { var a, r = t.ctx, o = e.circular, s = t.chart.data.labels.length, l = En(e.color, i - 1), u = En(e.lineWidth, i - 1); if ((o || s) && l && u) { if (r.save(), r.strokeStyle = l, r.lineWidth = u, r.setLineDash && (r.setLineDash(e.borderDash || []), r.lineDashOffset = e.borderDashOffset || 0), r.beginPath(), o) r.arc(t.xCenter, t.yCenter, n, 0, 2 * Math.PI); else { a = t.getPointPosition(0, n), r.moveTo(a.x, a.y); for (var d = 1; d < s; d++)a = t.getPointPosition(d, n), r.lineTo(a.x, a.y) } r.closePath(), r.stroke(), r.restore() } }(i, o, e, n)) })), s.display && l && u) { for (a.save(), a.lineWidth = l, a.strokeStyle = u, a.setLineDash && (a.setLineDash(Vn([s.borderDash, o.borderDash, []])), a.lineDashOffset = Vn([s.borderDashOffset, o.borderDashOffset, 0])), t = i.chart.data.labels.length - 1; t >= 0; t--)e = i.getDistanceFromCenterForValue(r.ticks.reverse ? i.min : i.max), n = i.getPointPosition(t, e), a.beginPath(), a.moveTo(i.xCenter, i.yCenter), a.lineTo(n.x, n.y), a.stroke(); a.restore() } }, _drawLabels: function () { var t = this, e = t.ctx, n = t.options.ticks; if (n.display) { var i, a, r = t.getIndexAngle(0), o = B.options._parseFont(n), s = zn(n.fontColor, Y.global.defaultFontColor); e.save(), e.font = o.string, e.translate(t.xCenter, t.yCenter), e.rotate(r), e.textAlign = "center", e.textBaseline = "middle", B.each(t.ticks, (function (r, l) { (0 !== l || n.reverse) && (i = t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]), n.showLabelBackdrop && (a = e.measureText(r).width, e.fillStyle = n.backdropColor, e.fillRect(-a / 2 - n.backdropPaddingX, -i - o.size / 2 - n.backdropPaddingY, a + 2 * n.backdropPaddingX, o.size + 2 * n.backdropPaddingY)), e.fillStyle = s, e.fillText(r, 0, -i)) })), e.restore() } }, _drawTitle: B.noop }), Xn = Hn; $n._defaults = Xn; var Kn = B._deprecated, Jn = B.options.resolve, Qn = B.valueOrDefault, ti = Number.MIN_SAFE_INTEGER || -9007199254740991, ei = Number.MAX_SAFE_INTEGER || 9007199254740991, ni = { millisecond: { common: !0, size: 1, steps: 1e3 }, second: { common: !0, size: 1e3, steps: 60 }, minute: { common: !0, size: 6e4, steps: 60 }, hour: { common: !0, size: 36e5, steps: 24 }, day: { common: !0, size: 864e5, steps: 30 }, week: { common: !1, size: 6048e5, steps: 4 }, month: { common: !0, size: 2628e6, steps: 12 }, quarter: { common: !1, size: 7884e6, steps: 4 }, year: { common: !0, size: 3154e7 } }, ii = Object.keys(ni); function ai(t, e) { return t - e } function ri(t) { return B.valueOrDefault(t.time.min, t.ticks.min) } function oi(t) { return B.valueOrDefault(t.time.max, t.ticks.max) } function si(t, e, n, i) { var a = function (t, e, n) { for (var i, a, r, o = 0, s = t.length - 1; o >= 0 && o <= s;) { if (a = t[(i = o + s >> 1) - 1] || null, r = t[i], !a) return { lo: null, hi: r }; if (r[e] < n) o = i + 1; else { if (!(a[e] > n)) return { lo: a, hi: r }; s = i - 1 } } return { lo: r, hi: null } }(t, e, n), r = a.lo ? a.hi ? a.lo : t[t.length - 2] : t[0], o = a.lo ? a.hi ? a.hi : t[t.length - 1] : t[1], s = o[e] - r[e], l = s ? (n - r[e]) / s : 0, u = (o[i] - r[i]) * l; return r[i] + u } function li(t, e) { var n = t._adapter, i = t.options.time, a = i.parser, r = a || i.format, o = e; return "function" == typeof a && (o = a(o)), B.isFinite(o) || (o = "string" == typeof r ? n.parse(o, r) : n.parse(o)), null !== o ? +o : (a || "function" != typeof r || (o = r(e), B.isFinite(o) || (o = n.parse(o))), o) } function ui(t, e) { if (B.isNullOrUndef(e)) return null; var n = t.options.time, i = li(t, t.getRightValue(e)); return null === i ? i : (n.round && (i = +t._adapter.startOf(i, n.round)), i) } function di(t, e, n, i) { var a, r, o, s = ii.length; for (a = ii.indexOf(t); a < s - 1; ++a)if (o = (r = ni[ii[a]]).steps ? r.steps : ei, r.common && Math.ceil((n - e) / (o * r.size)) <= i) return ii[a]; return ii[s - 1] } function hi(t, e, n) { var i, a, r = [], o = {}, s = e.length; for (i = 0; i < s; ++i)o[a = e[i]] = i, r.push({ value: a, major: !1 }); return 0 !== s && n ? function (t, e, n, i) { var a, r, o = t._adapter, s = +o.startOf(e[0].value, i), l = e[e.length - 1].value; for (a = s; a <= l; a = +o.add(a, 1, i))(r = n[a]) >= 0 && (e[r].major = !0); return e }(t, r, o, n) : r } var ci = _n.extend({ initialize: function () { this.mergeTicksOptions(), _n.prototype.initialize.call(this) }, update: function () { var t = this, e = t.options, n = e.time || (e.time = {}), i = t._adapter = new on._date(e.adapters.date); return Kn("time scale", n.format, "time.format", "time.parser"), Kn("time scale", n.min, "time.min", "ticks.min"), Kn("time scale", n.max, "time.max", "ticks.max"), B.mergeIf(n.displayFormats, i.formats()), _n.prototype.update.apply(t, arguments) }, getRightValue: function (t) { return t && void 0 !== t.t && (t = t.t), _n.prototype.getRightValue.call(this, t) }, determineDataLimits: function () { var t, e, n, i, a, r, o, s = this, l = s.chart, u = s._adapter, d = s.options, h = d.time.unit || "day", c = ei, f = ti, g = [], m = [], p = [], v = s._getLabels(); for (t = 0, n = v.length; t < n; ++t)p.push(ui(s, v[t])); for (t = 0, n = (l.data.datasets || []).length; t < n; ++t)if (l.isDatasetVisible(t)) if (a = l.data.datasets[t].data, B.isObject(a[0])) for (m[t] = [], e = 0, i = a.length; e < i; ++e)r = ui(s, a[e]), g.push(r), m[t][e] = r; else m[t] = p.slice(0), o || (g = g.concat(p), o = !0); else m[t] = []; p.length && (c = Math.min(c, p[0]), f = Math.max(f, p[p.length - 1])), g.length && (g = n > 1 ? function (t) { var e, n, i, a = {}, r = []; for (e = 0, n = t.length; e < n; ++e)a[i = t[e]] || (a[i] = !0, r.push(i)); return r }(g).sort(ai) : g.sort(ai), c = Math.min(c, g[0]), f = Math.max(f, g[g.length - 1])), c = ui(s, ri(d)) || c, f = ui(s, oi(d)) || f, c = c === ei ? +u.startOf(Date.now(), h) : c, f = f === ti ? +u.endOf(Date.now(), h) + 1 : f, s.min = Math.min(c, f), s.max = Math.max(c + 1, f), s._table = [], s._timestamps = { data: g, datasets: m, labels: p } }, buildTicks: function () { var t, e, n, i = this, a = i.min, r = i.max, o = i.options, s = o.ticks, l = o.time, u = i._timestamps, d = [], h = i.getLabelCapacity(a), c = s.source, f = o.distribution; for (u = "data" === c || "auto" === c && "series" === f ? u.data : "labels" === c ? u.labels : function (t, e, n, i) { var a, r = t._adapter, o = t.options, s = o.time, l = s.unit || di(s.minUnit, e, n, i), u = Jn([s.stepSize, s.unitStepSize, 1]), d = "week" === l && s.isoWeekday, h = e, c = []; if (d && (h = +r.startOf(h, "isoWeek", d)), h = +r.startOf(h, d ? "day" : l), r.diff(n, e, l) > 1e5 * u) throw e + " and " + n + " are too far apart with stepSize of " + u + " " + l; for (a = h; a < n; a = +r.add(a, u, l))c.push(a); return a !== n && "ticks" !== o.bounds || c.push(a), c }(i, a, r, h), "ticks" === o.bounds && u.length && (a = u[0], r = u[u.length - 1]), a = ui(i, ri(o)) || a, r = ui(i, oi(o)) || r, t = 0, e = u.length; t < e; ++t)(n = u[t]) >= a && n <= r && d.push(n); return i.min = a, i.max = r, i._unit = l.unit || (s.autoSkip ? di(l.minUnit, i.min, i.max, h) : function (t, e, n, i, a) { var r, o; for (r = ii.length - 1; r >= ii.indexOf(n); r--)if (o = ii[r], ni[o].common && t._adapter.diff(a, i, o) >= e - 1) return o; return ii[n ? ii.indexOf(n) : 0] }(i, d.length, l.minUnit, i.min, i.max)), i._majorUnit = s.major.enabled && "year" !== i._unit ? function (t) { for (var e = ii.indexOf(t) + 1, n = ii.length; e < n; ++e)if (ni[ii[e]].common) return ii[e] }(i._unit) : void 0, i._table = function (t, e, n, i) { if ("linear" === i || !t.length) return [{ time: e, pos: 0 }, { time: n, pos: 1 }]; var a, r, o, s, l, u = [], d = [e]; for (a = 0, r = t.length; a < r; ++a)(s = t[a]) > e && s < n && d.push(s); for (d.push(n), a = 0, r = d.length; a < r; ++a)l = d[a + 1], o = d[a - 1], s = d[a], void 0 !== o && void 0 !== l && Math.round((l + o) / 2) === s || u.push({ time: s, pos: a / (r - 1) }); return u }(i._timestamps.data, a, r, f), i._offsets = function (t, e, n, i, a) { var r, o, s = 0, l = 0; return a.offset && e.length && (r = si(t, "time", e[0], "pos"), s = 1 === e.length ? 1 - r : (si(t, "time", e[1], "pos") - r) / 2, o = si(t, "time", e[e.length - 1], "pos"), l = 1 === e.length ? o : (o - si(t, "time", e[e.length - 2], "pos")) / 2), { start: s, end: l, factor: 1 / (s + 1 + l) } }(i._table, d, 0, 0, o), s.reverse && d.reverse(), hi(i, d, i._majorUnit) }, getLabelForIndex: function (t, e) { var n = this, i = n._adapter, a = n.chart.data, r = n.options.time, o = a.labels && t < a.labels.length ? a.labels[t] : "", s = a.datasets[e].data[t]; return B.isObject(s) && (o = n.getRightValue(s)), r.tooltipFormat ? i.format(li(n, o), r.tooltipFormat) : "string" == typeof o ? o : i.format(li(n, o), r.displayFormats.datetime) }, tickFormatFunction: function (t, e, n, i) { var a = this._adapter, r = this.options, o = r.time.displayFormats, s = o[this._unit], l = this._majorUnit, u = o[l], d = n[e], h = r.ticks, c = l && u && d && d.major, f = a.format(t, i || (c ? u : s)), g = c ? h.major : h.minor, m = Jn([g.callback, g.userCallback, h.callback, h.userCallback]); return m ? m(f, e, n) : f }, convertTicksToLabels: function (t) { var e, n, i = []; for (e = 0, n = t.length; e < n; ++e)i.push(this.tickFormatFunction(t[e].value, e, t)); return i }, getPixelForOffset: function (t) { var e = this._offsets, n = si(this._table, "time", t, "pos"); return this.getPixelForDecimal((e.start + n) * e.factor) }, getPixelForValue: function (t, e, n) { var i = null; if (void 0 !== e && void 0 !== n && (i = this._timestamps.datasets[n][e]), null === i && (i = ui(this, t)), null !== i) return this.getPixelForOffset(i) }, getPixelForTick: function (t) { var e = this.getTicks(); return t >= 0 && t < e.length ? this.getPixelForOffset(e[t].value) : null }, getValueForPixel: function (t) { var e = this._offsets, n = this.getDecimalForPixel(t) / e.factor - e.end, i = si(this._table, "pos", n, "time"); return this._adapter._create(i) }, _getLabelSize: function (t) { var e = this.options.ticks, n = this.ctx.measureText(t).width, i = B.toRadians(this.isHorizontal() ? e.maxRotation : e.minRotation), a = Math.cos(i), r = Math.sin(i), o = Qn(e.fontSize, Y.global.defaultFontSize); return { w: n * a + o * r, h: n * r + o * a } }, getLabelWidth: function (t) { return this._getLabelSize(t).w }, getLabelCapacity: function (t) { var e = this, n = e.options.time, i = n.displayFormats, a = i[n.unit] || i.millisecond, r = e.tickFormatFunction(t, 0, hi(e, [t], e._majorUnit), a), o = e._getLabelSize(r), s = Math.floor(e.isHorizontal() ? e.width / o.w : e.height / o.h); return e.options.offset && s--, s > 0 ? s : 1 } }), fi = { position: "bottom", distribution: "linear", bounds: "data", adapters: {}, time: { parser: !1, unit: !1, round: !1, displayFormat: !1, isoWeekday: !1, minUnit: "millisecond", displayFormats: {} }, ticks: { autoSkip: !1, source: "auto", major: { enabled: !1 } } }; ci._defaults = fi; var gi = { category: kn, linear: An, logarithmic: Wn, radialLinear: $n, time: ci }, mi = e((function (e, n) { e.exports = function () { var n, i; function a() { return n.apply(null, arguments) } function r(t) { return t instanceof Array || "[object Array]" === Object.prototype.toString.call(t) } function o(t) { return null != t && "[object Object]" === Object.prototype.toString.call(t) } function s(t) { return void 0 === t } function l(t) { return "number" == typeof t || "[object Number]" === Object.prototype.toString.call(t) } function u(t) { return t instanceof Date || "[object Date]" === Object.prototype.toString.call(t) } function d(t, e) { var n, i = []; for (n = 0; n < t.length; ++n)i.push(e(t[n], n)); return i } function h(t, e) { return Object.prototype.hasOwnProperty.call(t, e) } function c(t, e) { for (var n in e) h(e, n) && (t[n] = e[n]); return h(e, "toString") && (t.toString = e.toString), h(e, "valueOf") && (t.valueOf = e.valueOf), t } function f(t, e, n, i) { return Ie(t, e, n, i, !0).utc() } function g(t) { return null == t._pf && (t._pf = { empty: !1, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: !1, invalidMonth: null, invalidFormat: !1, userInvalidated: !1, iso: !1, parsedDateParts: [], meridiem: null, rfc2822: !1, weekdayMismatch: !1 }), t._pf } function m(t) { if (null == t._isValid) { var e = g(t), n = i.call(e.parsedDateParts, (function (t) { return null != t })), a = !isNaN(t._d.getTime()) && e.overflow < 0 && !e.empty && !e.invalidMonth && !e.invalidWeekday && !e.weekdayMismatch && !e.nullInput && !e.invalidFormat && !e.userInvalidated && (!e.meridiem || e.meridiem && n); if (t._strict && (a = a && 0 === e.charsLeftOver && 0 === e.unusedTokens.length && void 0 === e.bigHour), null != Object.isFrozen && Object.isFrozen(t)) return a; t._isValid = a } return t._isValid } function p(t) { var e = f(NaN); return null != t ? c(g(e), t) : g(e).userInvalidated = !0, e } i = Array.prototype.some ? Array.prototype.some : function (t) { for (var e = Object(this), n = e.length >>> 0, i = 0; i < n; i++)if (i in e && t.call(this, e[i], i, e)) return !0; return !1 }; var v = a.momentProperties = []; function b(t, e) { var n, i, a; if (s(e._isAMomentObject) || (t._isAMomentObject = e._isAMomentObject), s(e._i) || (t._i = e._i), s(e._f) || (t._f = e._f), s(e._l) || (t._l = e._l), s(e._strict) || (t._strict = e._strict), s(e._tzm) || (t._tzm = e._tzm), s(e._isUTC) || (t._isUTC = e._isUTC), s(e._offset) || (t._offset = e._offset), s(e._pf) || (t._pf = g(e)), s(e._locale) || (t._locale = e._locale), v.length > 0) for (n = 0; n < v.length; n++)s(a = e[i = v[n]]) || (t[i] = a); return t } var y = !1; function x(t) { b(this, t), this._d = new Date(null != t._d ? t._d.getTime() : NaN), this.isValid() || (this._d = new Date(NaN)), !1 === y && (y = !0, a.updateOffset(this), y = !1) } function _(t) { return t instanceof x || null != t && null != t._isAMomentObject } function w(t) { return t < 0 ? Math.ceil(t) || 0 : Math.floor(t) } function k(t) { var e = +t, n = 0; return 0 !== e && isFinite(e) && (n = w(e)), n } function M(t, e, n) { var i, a = Math.min(t.length, e.length), r = Math.abs(t.length - e.length), o = 0; for (i = 0; i < a; i++)(n && t[i] !== e[i] || !n && k(t[i]) !== k(e[i])) && o++; return o + r } function S(t) { !1 === a.suppressDeprecationWarnings && "undefined" != typeof console && console.warn && console.warn("Deprecation warning: " + t) } function D(t, e) { var n = !0; return c((function () { if (null != a.deprecationHandler && a.deprecationHandler(null, t), n) { for (var i, r = [], o = 0; o < arguments.length; o++) { if (i = "", "object" == typeof arguments[o]) { for (var s in i += "\n[" + o + "] ", arguments[0]) i += s + ": " + arguments[0][s] + ", "; i = i.slice(0, -2) } else i = arguments[o]; r.push(i) } S(t + "\nArguments: " + Array.prototype.slice.call(r).join("") + "\n" + (new Error).stack), n = !1 } return e.apply(this, arguments) }), e) } var C, P = {}; function T(t, e) { null != a.deprecationHandler && a.deprecationHandler(t, e), P[t] || (S(e), P[t] = !0) } function O(t) { return t instanceof Function || "[object Function]" === Object.prototype.toString.call(t) } function A(t, e) { var n, i = c({}, t); for (n in e) h(e, n) && (o(t[n]) && o(e[n]) ? (i[n] = {}, c(i[n], t[n]), c(i[n], e[n])) : null != e[n] ? i[n] = e[n] : delete i[n]); for (n in t) h(t, n) && !h(e, n) && o(t[n]) && (i[n] = c({}, i[n])); return i } function F(t) { null != t && this.set(t) } a.suppressDeprecationWarnings = !1, a.deprecationHandler = null, C = Object.keys ? Object.keys : function (t) { var e, n = []; for (e in t) h(t, e) && n.push(e); return n }; var I = {}; function L(t, e) { var n = t.toLowerCase(); I[n] = I[n + "s"] = I[e] = t } function R(t) { return "string" == typeof t ? I[t] || I[t.toLowerCase()] : void 0 } function N(t) { var e, n, i = {}; for (n in t) h(t, n) && (e = R(n)) && (i[e] = t[n]); return i } var W = {}; function Y(t, e) { W[t] = e } function z(t, e, n) { var i = "" + Math.abs(t), a = e - i.length; return (t >= 0 ? n ? "+" : "" : "-") + Math.pow(10, Math.max(0, a)).toString().substr(1) + i } var E = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, V = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, H = {}, B = {}; function j(t, e, n, i) { var a = i; "string" == typeof i && (a = function () { return this[i]() }), t && (B[t] = a), e && (B[e[0]] = function () { return z(a.apply(this, arguments), e[1], e[2]) }), n && (B[n] = function () { return this.localeData().ordinal(a.apply(this, arguments), t) }) } function U(t, e) { return t.isValid() ? (e = G(e, t.localeData()), H[e] = H[e] || function (t) { var e, n, i, a = t.match(E); for (e = 0, n = a.length; e < n; e++)B[a[e]] ? a[e] = B[a[e]] : a[e] = (i = a[e]).match(/\[[\s\S]/) ? i.replace(/^\[|\]$/g, "") : i.replace(/\\/g, ""); return function (e) { var i, r = ""; for (i = 0; i < n; i++)r += O(a[i]) ? a[i].call(e, t) : a[i]; return r } }(e), H[e](t)) : t.localeData().invalidDate() } function G(t, e) { var n = 5; function i(t) { return e.longDateFormat(t) || t } for (V.lastIndex = 0; n >= 0 && V.test(t);)t = t.replace(V, i), V.lastIndex = 0, n -= 1; return t } var q = /\d/, Z = /\d\d/, $ = /\d{3}/, X = /\d{4}/, K = /[+-]?\d{6}/, J = /\d\d?/, Q = /\d\d\d\d?/, tt = /\d\d\d\d\d\d?/, et = /\d{1,3}/, nt = /\d{1,4}/, it = /[+-]?\d{1,6}/, at = /\d+/, rt = /[+-]?\d+/, ot = /Z|[+-]\d\d:?\d\d/gi, st = /Z|[+-]\d\d(?::?\d\d)?/gi, lt = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, ut = {}; function dt(t, e, n) { ut[t] = O(e) ? e : function (t, i) { return t && n ? n : e } } function ht(t, e) { return h(ut, t) ? ut[t](e._strict, e._locale) : new RegExp(ct(t.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, (function (t, e, n, i, a) { return e || n || i || a })))) } function ct(t) { return t.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") } var ft = {}; function gt(t, e) { var n, i = e; for ("string" == typeof t && (t = [t]), l(e) && (i = function (t, n) { n[e] = k(t) }), n = 0; n < t.length; n++)ft[t[n]] = i } function mt(t, e) { gt(t, (function (t, n, i, a) { i._w = i._w || {}, e(t, i._w, i, a) })) } function pt(t, e, n) { null != e && h(ft, t) && ft[t](e, n._a, n, t) } var vt = 0, bt = 1, yt = 2, xt = 3, _t = 4, wt = 5, kt = 6, Mt = 7, St = 8; function Dt(t) { return Ct(t) ? 366 : 365 } function Ct(t) { return t % 4 == 0 && t % 100 != 0 || t % 400 == 0 } j("Y", 0, 0, (function () { var t = this.year(); return t <= 9999 ? "" + t : "+" + t })), j(0, ["YY", 2], 0, (function () { return this.year() % 100 })), j(0, ["YYYY", 4], 0, "year"), j(0, ["YYYYY", 5], 0, "year"), j(0, ["YYYYYY", 6, !0], 0, "year"), L("year", "y"), Y("year", 1), dt("Y", rt), dt("YY", J, Z), dt("YYYY", nt, X), dt("YYYYY", it, K), dt("YYYYYY", it, K), gt(["YYYYY", "YYYYYY"], vt), gt("YYYY", (function (t, e) { e[vt] = 2 === t.length ? a.parseTwoDigitYear(t) : k(t) })), gt("YY", (function (t, e) { e[vt] = a.parseTwoDigitYear(t) })), gt("Y", (function (t, e) { e[vt] = parseInt(t, 10) })), a.parseTwoDigitYear = function (t) { return k(t) + (k(t) > 68 ? 1900 : 2e3) }; var Pt, Tt = Ot("FullYear", !0); function Ot(t, e) { return function (n) { return null != n ? (Ft(this, t, n), a.updateOffset(this, e), this) : At(this, t) } } function At(t, e) { return t.isValid() ? t._d["get" + (t._isUTC ? "UTC" : "") + e]() : NaN } function Ft(t, e, n) { t.isValid() && !isNaN(n) && ("FullYear" === e && Ct(t.year()) && 1 === t.month() && 29 === t.date() ? t._d["set" + (t._isUTC ? "UTC" : "") + e](n, t.month(), It(n, t.month())) : t._d["set" + (t._isUTC ? "UTC" : "") + e](n)) } function It(t, e) { if (isNaN(t) || isNaN(e)) return NaN; var n = function (t, e) { return (t % e + e) % e }(e, 12); return t += (e - n) / 12, 1 === n ? Ct(t) ? 29 : 28 : 31 - n % 7 % 2 } Pt = Array.prototype.indexOf ? Array.prototype.indexOf : function (t) { var e; for (e = 0; e < this.length; ++e)if (this[e] === t) return e; return -1 }, j("M", ["MM", 2], "Mo", (function () { return this.month() + 1 })), j("MMM", 0, 0, (function (t) { return this.localeData().monthsShort(this, t) })), j("MMMM", 0, 0, (function (t) { return this.localeData().months(this, t) })), L("month", "M"), Y("month", 8), dt("M", J), dt("MM", J, Z), dt("MMM", (function (t, e) { return e.monthsShortRegex(t) })), dt("MMMM", (function (t, e) { return e.monthsRegex(t) })), gt(["M", "MM"], (function (t, e) { e[bt] = k(t) - 1 })), gt(["MMM", "MMMM"], (function (t, e, n, i) { var a = n._locale.monthsParse(t, i, n._strict); null != a ? e[bt] = a : g(n).invalidMonth = t })); var Lt = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, Rt = "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), Nt = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"); function Wt(t, e, n) { var i, a, r, o = t.toLocaleLowerCase(); if (!this._monthsParse) for (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = [], i = 0; i < 12; ++i)r = f([2e3, i]), this._shortMonthsParse[i] = this.monthsShort(r, "").toLocaleLowerCase(), this._longMonthsParse[i] = this.months(r, "").toLocaleLowerCase(); return n ? "MMM" === e ? -1 !== (a = Pt.call(this._shortMonthsParse, o)) ? a : null : -1 !== (a = Pt.call(this._longMonthsParse, o)) ? a : null : "MMM" === e ? -1 !== (a = Pt.call(this._shortMonthsParse, o)) ? a : -1 !== (a = Pt.call(this._longMonthsParse, o)) ? a : null : -1 !== (a = Pt.call(this._longMonthsParse, o)) ? a : -1 !== (a = Pt.call(this._shortMonthsParse, o)) ? a : null } function Yt(t, e) { var n; if (!t.isValid()) return t; if ("string" == typeof e) if (/^\d+$/.test(e)) e = k(e); else if (!l(e = t.localeData().monthsParse(e))) return t; return n = Math.min(t.date(), It(t.year(), e)), t._d["set" + (t._isUTC ? "UTC" : "") + "Month"](e, n), t } function zt(t) { return null != t ? (Yt(this, t), a.updateOffset(this, !0), this) : At(this, "Month") } var Et = lt, Vt = lt; function Ht() { function t(t, e) { return e.length - t.length } var e, n, i = [], a = [], r = []; for (e = 0; e < 12; e++)n = f([2e3, e]), i.push(this.monthsShort(n, "")), a.push(this.months(n, "")), r.push(this.months(n, "")), r.push(this.monthsShort(n, "")); for (i.sort(t), a.sort(t), r.sort(t), e = 0; e < 12; e++)i[e] = ct(i[e]), a[e] = ct(a[e]); for (e = 0; e < 24; e++)r[e] = ct(r[e]); this._monthsRegex = new RegExp("^(" + r.join("|") + ")", "i"), this._monthsShortRegex = this._monthsRegex, this._monthsStrictRegex = new RegExp("^(" + a.join("|") + ")", "i"), this._monthsShortStrictRegex = new RegExp("^(" + i.join("|") + ")", "i") } function Bt(t, e, n, i, a, r, o) { var s; return t < 100 && t >= 0 ? (s = new Date(t + 400, e, n, i, a, r, o), isFinite(s.getFullYear()) && s.setFullYear(t)) : s = new Date(t, e, n, i, a, r, o), s } function jt(t) { var e; if (t < 100 && t >= 0) { var n = Array.prototype.slice.call(arguments); n[0] = t + 400, e = new Date(Date.UTC.apply(null, n)), isFinite(e.getUTCFullYear()) && e.setUTCFullYear(t) } else e = new Date(Date.UTC.apply(null, arguments)); return e } function Ut(t, e, n) { var i = 7 + e - n; return -(7 + jt(t, 0, i).getUTCDay() - e) % 7 + i - 1 } function Gt(t, e, n, i, a) { var r, o, s = 1 + 7 * (e - 1) + (7 + n - i) % 7 + Ut(t, i, a); return s <= 0 ? o = Dt(r = t - 1) + s : s > Dt(t) ? (r = t + 1, o = s - Dt(t)) : (r = t, o = s), { year: r, dayOfYear: o } } function qt(t, e, n) { var i, a, r = Ut(t.year(), e, n), o = Math.floor((t.dayOfYear() - r - 1) / 7) + 1; return o < 1 ? i = o + Zt(a = t.year() - 1, e, n) : o > Zt(t.year(), e, n) ? (i = o - Zt(t.year(), e, n), a = t.year() + 1) : (a = t.year(), i = o), { week: i, year: a } } function Zt(t, e, n) { var i = Ut(t, e, n), a = Ut(t + 1, e, n); return (Dt(t) - i + a) / 7 } function $t(t, e) { return t.slice(e, 7).concat(t.slice(0, e)) } j("w", ["ww", 2], "wo", "week"), j("W", ["WW", 2], "Wo", "isoWeek"), L("week", "w"), L("isoWeek", "W"), Y("week", 5), Y("isoWeek", 5), dt("w", J), dt("ww", J, Z), dt("W", J), dt("WW", J, Z), mt(["w", "ww", "W", "WW"], (function (t, e, n, i) { e[i.substr(0, 1)] = k(t) })), j("d", 0, "do", "day"), j("dd", 0, 0, (function (t) { return this.localeData().weekdaysMin(this, t) })), j("ddd", 0, 0, (function (t) { return this.localeData().weekdaysShort(this, t) })), j("dddd", 0, 0, (function (t) { return this.localeData().weekdays(this, t) })), j("e", 0, 0, "weekday"), j("E", 0, 0, "isoWeekday"), L("day", "d"), L("weekday", "e"), L("isoWeekday", "E"), Y("day", 11), Y("weekday", 11), Y("isoWeekday", 11), dt("d", J), dt("e", J), dt("E", J), dt("dd", (function (t, e) { return e.weekdaysMinRegex(t) })), dt("ddd", (function (t, e) { return e.weekdaysShortRegex(t) })), dt("dddd", (function (t, e) { return e.weekdaysRegex(t) })), mt(["dd", "ddd", "dddd"], (function (t, e, n, i) { var a = n._locale.weekdaysParse(t, i, n._strict); null != a ? e.d = a : g(n).invalidWeekday = t })), mt(["d", "e", "E"], (function (t, e, n, i) { e[i] = k(t) })); var Xt = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), Kt = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), Jt = "Su_Mo_Tu_We_Th_Fr_Sa".split("_"); function Qt(t, e, n) { var i, a, r, o = t.toLocaleLowerCase(); if (!this._weekdaysParse) for (this._weekdaysParse = [], this._shortWeekdaysParse = [], this._minWeekdaysParse = [], i = 0; i < 7; ++i)r = f([2e3, 1]).day(i), this._minWeekdaysParse[i] = this.weekdaysMin(r, "").toLocaleLowerCase(), this._shortWeekdaysParse[i] = this.weekdaysShort(r, "").toLocaleLowerCase(), this._weekdaysParse[i] = this.weekdays(r, "").toLocaleLowerCase(); return n ? "dddd" === e ? -1 !== (a = Pt.call(this._weekdaysParse, o)) ? a : null : "ddd" === e ? -1 !== (a = Pt.call(this._shortWeekdaysParse, o)) ? a : null : -1 !== (a = Pt.call(this._minWeekdaysParse, o)) ? a : null : "dddd" === e ? -1 !== (a = Pt.call(this._weekdaysParse, o)) ? a : -1 !== (a = Pt.call(this._shortWeekdaysParse, o)) ? a : -1 !== (a = Pt.call(this._minWeekdaysParse, o)) ? a : null : "ddd" === e ? -1 !== (a = Pt.call(this._shortWeekdaysParse, o)) ? a : -1 !== (a = Pt.call(this._weekdaysParse, o)) ? a : -1 !== (a = Pt.call(this._minWeekdaysParse, o)) ? a : null : -1 !== (a = Pt.call(this._minWeekdaysParse, o)) ? a : -1 !== (a = Pt.call(this._weekdaysParse, o)) ? a : -1 !== (a = Pt.call(this._shortWeekdaysParse, o)) ? a : null } var te = lt, ee = lt, ne = lt; function ie() { function t(t, e) { return e.length - t.length } var e, n, i, a, r, o = [], s = [], l = [], u = []; for (e = 0; e < 7; e++)n = f([2e3, 1]).day(e), i = this.weekdaysMin(n, ""), a = this.weekdaysShort(n, ""), r = this.weekdays(n, ""), o.push(i), s.push(a), l.push(r), u.push(i), u.push(a), u.push(r); for (o.sort(t), s.sort(t), l.sort(t), u.sort(t), e = 0; e < 7; e++)s[e] = ct(s[e]), l[e] = ct(l[e]), u[e] = ct(u[e]); this._weekdaysRegex = new RegExp("^(" + u.join("|") + ")", "i"), this._weekdaysShortRegex = this._weekdaysRegex, this._weekdaysMinRegex = this._weekdaysRegex, this._weekdaysStrictRegex = new RegExp("^(" + l.join("|") + ")", "i"), this._weekdaysShortStrictRegex = new RegExp("^(" + s.join("|") + ")", "i"), this._weekdaysMinStrictRegex = new RegExp("^(" + o.join("|") + ")", "i") } function ae() { return this.hours() % 12 || 12 } function re(t, e) { j(t, 0, 0, (function () { return this.localeData().meridiem(this.hours(), this.minutes(), e) })) } function oe(t, e) { return e._meridiemParse } j("H", ["HH", 2], 0, "hour"), j("h", ["hh", 2], 0, ae), j("k", ["kk", 2], 0, (function () { return this.hours() || 24 })), j("hmm", 0, 0, (function () { return "" + ae.apply(this) + z(this.minutes(), 2) })), j("hmmss", 0, 0, (function () { return "" + ae.apply(this) + z(this.minutes(), 2) + z(this.seconds(), 2) })), j("Hmm", 0, 0, (function () { return "" + this.hours() + z(this.minutes(), 2) })), j("Hmmss", 0, 0, (function () { return "" + this.hours() + z(this.minutes(), 2) + z(this.seconds(), 2) })), re("a", !0), re("A", !1), L("hour", "h"), Y("hour", 13), dt("a", oe), dt("A", oe), dt("H", J), dt("h", J), dt("k", J), dt("HH", J, Z), dt("hh", J, Z), dt("kk", J, Z), dt("hmm", Q), dt("hmmss", tt), dt("Hmm", Q), dt("Hmmss", tt), gt(["H", "HH"], xt), gt(["k", "kk"], (function (t, e, n) { var i = k(t); e[xt] = 24 === i ? 0 : i })), gt(["a", "A"], (function (t, e, n) { n._isPm = n._locale.isPM(t), n._meridiem = t })), gt(["h", "hh"], (function (t, e, n) { e[xt] = k(t), g(n).bigHour = !0 })), gt("hmm", (function (t, e, n) { var i = t.length - 2; e[xt] = k(t.substr(0, i)), e[_t] = k(t.substr(i)), g(n).bigHour = !0 })), gt("hmmss", (function (t, e, n) { var i = t.length - 4, a = t.length - 2; e[xt] = k(t.substr(0, i)), e[_t] = k(t.substr(i, 2)), e[wt] = k(t.substr(a)), g(n).bigHour = !0 })), gt("Hmm", (function (t, e, n) { var i = t.length - 2; e[xt] = k(t.substr(0, i)), e[_t] = k(t.substr(i)) })), gt("Hmmss", (function (t, e, n) { var i = t.length - 4, a = t.length - 2; e[xt] = k(t.substr(0, i)), e[_t] = k(t.substr(i, 2)), e[wt] = k(t.substr(a)) })); var se, le = Ot("Hours", !0), ue = { calendar: { sameDay: "[Today at] LT", nextDay: "[Tomorrow at] LT", nextWeek: "dddd [at] LT", lastDay: "[Yesterday at] LT", lastWeek: "[Last] dddd [at] LT", sameElse: "L" }, longDateFormat: { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" }, invalidDate: "Invalid date", ordinal: "%d", dayOfMonthOrdinalParse: /\d{1,2}/, relativeTime: { future: "in %s", past: "%s ago", s: "a few seconds", ss: "%d 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" }, months: Rt, monthsShort: Nt, week: { dow: 0, doy: 6 }, weekdays: Xt, weekdaysMin: Jt, weekdaysShort: Kt, meridiemParse: /[ap]\.?m?\.?/i }, de = {}, he = {}; function ce(t) { return t ? t.toLowerCase().replace("_", "-") : t } function fe(n) { var i = null; if (!de[n] && e && e.exports) try { i = se._abbr, t(), ge(i) } catch (t) { } return de[n] } function ge(t, e) { var n; return t && ((n = s(e) ? pe(t) : me(t, e)) ? se = n : "undefined" != typeof console && console.warn && console.warn("Locale " + t + " not found. Did you forget to load it?")), se._abbr } function me(t, e) { if (null !== e) { var n, i = ue; if (e.abbr = t, null != de[t]) T("defineLocaleOverride", "use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."), i = de[t]._config; else if (null != e.parentLocale) if (null != de[e.parentLocale]) i = de[e.parentLocale]._config; else { if (null == (n = fe(e.parentLocale))) return he[e.parentLocale] || (he[e.parentLocale] = []), he[e.parentLocale].push({ name: t, config: e }), null; i = n._config } return de[t] = new F(A(i, e)), he[t] && he[t].forEach((function (t) { me(t.name, t.config) })), ge(t), de[t] } return delete de[t], null } function pe(t) { var e; if (t && t._locale && t._locale._abbr && (t = t._locale._abbr), !t) return se; if (!r(t)) { if (e = fe(t)) return e; t = [t] } return function (t) { for (var e, n, i, a, r = 0; r < t.length;) { for (e = (a = ce(t[r]).split("-")).length, n = (n = ce(t[r + 1])) ? n.split("-") : null; e > 0;) { if (i = fe(a.slice(0, e).join("-"))) return i; if (n && n.length >= e && M(a, n, !0) >= e - 1) break; e-- } r++ } return se }(t) } function ve(t) { var e, n = t._a; return n && -2 === g(t).overflow && (e = n[bt] < 0 || n[bt] > 11 ? bt : n[yt] < 1 || n[yt] > It(n[vt], n[bt]) ? yt : n[xt] < 0 || n[xt] > 24 || 24 === n[xt] && (0 !== n[_t] || 0 !== n[wt] || 0 !== n[kt]) ? xt : n[_t] < 0 || n[_t] > 59 ? _t : n[wt] < 0 || n[wt] > 59 ? wt : n[kt] < 0 || n[kt] > 999 ? kt : -1, g(t)._overflowDayOfYear && (e < vt || e > yt) && (e = yt), g(t)._overflowWeeks && -1 === e && (e = Mt), g(t)._overflowWeekday && -1 === e && (e = St), g(t).overflow = e), t } function be(t, e, n) { return null != t ? t : null != e ? e : n } function ye(t) { var e, n, i, r, o, s = []; if (!t._d) { for (i = function (t) { var e = new Date(a.now()); return t._useUTC ? [e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate()] : [e.getFullYear(), e.getMonth(), e.getDate()] }(t), t._w && null == t._a[yt] && null == t._a[bt] && function (t) { var e, n, i, a, r, o, s, l; if (null != (e = t._w).GG || null != e.W || null != e.E) r = 1, o = 4, n = be(e.GG, t._a[vt], qt(Le(), 1, 4).year), i = be(e.W, 1), ((a = be(e.E, 1)) < 1 || a > 7) && (l = !0); else { r = t._locale._week.dow, o = t._locale._week.doy; var u = qt(Le(), r, o); n = be(e.gg, t._a[vt], u.year), i = be(e.w, u.week), null != e.d ? ((a = e.d) < 0 || a > 6) && (l = !0) : null != e.e ? (a = e.e + r, (e.e < 0 || e.e > 6) && (l = !0)) : a = r } i < 1 || i > Zt(n, r, o) ? g(t)._overflowWeeks = !0 : null != l ? g(t)._overflowWeekday = !0 : (s = Gt(n, i, a, r, o), t._a[vt] = s.year, t._dayOfYear = s.dayOfYear) }(t), null != t._dayOfYear && (o = be(t._a[vt], i[vt]), (t._dayOfYear > Dt(o) || 0 === t._dayOfYear) && (g(t)._overflowDayOfYear = !0), n = jt(o, 0, t._dayOfYear), t._a[bt] = n.getUTCMonth(), t._a[yt] = n.getUTCDate()), e = 0; e < 3 && null == t._a[e]; ++e)t._a[e] = s[e] = i[e]; for (; e < 7; e++)t._a[e] = s[e] = null == t._a[e] ? 2 === e ? 1 : 0 : t._a[e]; 24 === t._a[xt] && 0 === t._a[_t] && 0 === t._a[wt] && 0 === t._a[kt] && (t._nextDay = !0, t._a[xt] = 0), t._d = (t._useUTC ? jt : Bt).apply(null, s), r = t._useUTC ? t._d.getUTCDay() : t._d.getDay(), null != t._tzm && t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm), t._nextDay && (t._a[xt] = 24), t._w && void 0 !== t._w.d && t._w.d !== r && (g(t).weekdayMismatch = !0) } } var xe = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, _e = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, we = /Z|[+-]\d\d(?::?\d\d)?/, ke = [["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], ["GGGG-[W]WW", /\d{4}-W\d\d/, !1], ["YYYY-DDD", /\d{4}-\d{3}/], ["YYYY-MM", /\d{4}-\d\d/, !1], ["YYYYYYMMDD", /[+-]\d{10}/], ["YYYYMMDD", /\d{8}/], ["GGGG[W]WWE", /\d{4}W\d{3}/], ["GGGG[W]WW", /\d{4}W\d{2}/, !1], ["YYYYDDD", /\d{7}/]], Me = [["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], ["HH:mm:ss", /\d\d:\d\d:\d\d/], ["HH:mm", /\d\d:\d\d/], ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], ["HHmmss", /\d\d\d\d\d\d/], ["HHmm", /\d\d\d\d/], ["HH", /\d\d/]], Se = /^\/?Date\((\-?\d+)/i; function De(t) { var e, n, i, a, r, o, s = t._i, l = xe.exec(s) || _e.exec(s); if (l) { for (g(t).iso = !0, e = 0, n = ke.length; e < n; e++)if (ke[e][1].exec(l[1])) { a = ke[e][0], i = !1 !== ke[e][2]; break } if (null == a) return void (t._isValid = !1); if (l[3]) { for (e = 0, n = Me.length; e < n; e++)if (Me[e][1].exec(l[3])) { r = (l[2] || " ") + Me[e][0]; break } if (null == r) return void (t._isValid = !1) } if (!i && null != r) return void (t._isValid = !1); if (l[4]) { if (!we.exec(l[4])) return void (t._isValid = !1); o = "Z" } t._f = a + (r || "") + (o || ""), Ae(t) } else t._isValid = !1 } var Ce = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; function Pe(t) { var e = parseInt(t, 10); return e <= 49 ? 2e3 + e : e <= 999 ? 1900 + e : e } var Te = { UT: 0, GMT: 0, EDT: -240, EST: -300, CDT: -300, CST: -360, MDT: -360, MST: -420, PDT: -420, PST: -480 }; function Oe(t) { var e, n, i, a, r, o, s, l = Ce.exec(t._i.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").replace(/^\s\s*/, "").replace(/\s\s*$/, "")); if (l) { var u = (e = l[4], n = l[3], i = l[2], a = l[5], r = l[6], o = l[7], s = [Pe(e), Nt.indexOf(n), parseInt(i, 10), parseInt(a, 10), parseInt(r, 10)], o && s.push(parseInt(o, 10)), s); if (!function (t, e, n) { return !t || Kt.indexOf(t) === new Date(e[0], e[1], e[2]).getDay() || (g(n).weekdayMismatch = !0, n._isValid = !1, !1) }(l[1], u, t)) return; t._a = u, t._tzm = function (t, e, n) { if (t) return Te[t]; if (e) return 0; var i = parseInt(n, 10), a = i % 100; return (i - a) / 100 * 60 + a }(l[8], l[9], l[10]), t._d = jt.apply(null, t._a), t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm), g(t).rfc2822 = !0 } else t._isValid = !1 } function Ae(t) { if (t._f !== a.ISO_8601) if (t._f !== a.RFC_2822) { t._a = [], g(t).empty = !0; var e, n, i, r, o, s = "" + t._i, l = s.length, u = 0; for (i = G(t._f, t._locale).match(E) || [], e = 0; e < i.length; e++)r = i[e], (n = (s.match(ht(r, t)) || [])[0]) && ((o = s.substr(0, s.indexOf(n))).length > 0 && g(t).unusedInput.push(o), s = s.slice(s.indexOf(n) + n.length), u += n.length), B[r] ? (n ? g(t).empty = !1 : g(t).unusedTokens.push(r), pt(r, n, t)) : t._strict && !n && g(t).unusedTokens.push(r); g(t).charsLeftOver = l - u, s.length > 0 && g(t).unusedInput.push(s), t._a[xt] <= 12 && !0 === g(t).bigHour && t._a[xt] > 0 && (g(t).bigHour = void 0), g(t).parsedDateParts = t._a.slice(0), g(t).meridiem = t._meridiem, t._a[xt] = function (t, e, n) { var i; return null == n ? e : null != t.meridiemHour ? t.meridiemHour(e, n) : null != t.isPM ? ((i = t.isPM(n)) && e < 12 && (e += 12), i || 12 !== e || (e = 0), e) : e }(t._locale, t._a[xt], t._meridiem), ye(t), ve(t) } else Oe(t); else De(t) } function Fe(t) { var e = t._i, n = t._f; return t._locale = t._locale || pe(t._l), null === e || void 0 === n && "" === e ? p({ nullInput: !0 }) : ("string" == typeof e && (t._i = e = t._locale.preparse(e)), _(e) ? new x(ve(e)) : (u(e) ? t._d = e : r(n) ? function (t) { var e, n, i, a, r; if (0 === t._f.length) return g(t).invalidFormat = !0, void (t._d = new Date(NaN)); for (a = 0; a < t._f.length; a++)r = 0, e = b({}, t), null != t._useUTC && (e._useUTC = t._useUTC), e._f = t._f[a], Ae(e), m(e) && (r += g(e).charsLeftOver, r += 10 * g(e).unusedTokens.length, g(e).score = r, (null == i || r < i) && (i = r, n = e)); c(t, n || e) }(t) : n ? Ae(t) : function (t) { var e = t._i; s(e) ? t._d = new Date(a.now()) : u(e) ? t._d = new Date(e.valueOf()) : "string" == typeof e ? function (t) { var e = Se.exec(t._i); null === e ? (De(t), !1 === t._isValid && (delete t._isValid, Oe(t), !1 === t._isValid && (delete t._isValid, a.createFromInputFallback(t)))) : t._d = new Date(+e[1]) }(t) : r(e) ? (t._a = d(e.slice(0), (function (t) { return parseInt(t, 10) })), ye(t)) : o(e) ? function (t) { if (!t._d) { var e = N(t._i); t._a = d([e.year, e.month, e.day || e.date, e.hour, e.minute, e.second, e.millisecond], (function (t) { return t && parseInt(t, 10) })), ye(t) } }(t) : l(e) ? t._d = new Date(e) : a.createFromInputFallback(t) }(t), m(t) || (t._d = null), t)) } function Ie(t, e, n, i, a) { var s, l = {}; return !0 !== n && !1 !== n || (i = n, n = void 0), (o(t) && function (t) { if (Object.getOwnPropertyNames) return 0 === Object.getOwnPropertyNames(t).length; var e; for (e in t) if (t.hasOwnProperty(e)) return !1; return !0 }(t) || r(t) && 0 === t.length) && (t = void 0), l._isAMomentObject = !0, l._useUTC = l._isUTC = a, l._l = n, l._i = t, l._f = e, l._strict = i, (s = new x(ve(Fe(l))))._nextDay && (s.add(1, "d"), s._nextDay = void 0), s } function Le(t, e, n, i) { return Ie(t, e, n, i, !1) } a.createFromInputFallback = D("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", (function (t) { t._d = new Date(t._i + (t._useUTC ? " UTC" : "")) })), a.ISO_8601 = function () { }, a.RFC_2822 = function () { }; var Re = D("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", (function () { var t = Le.apply(null, arguments); return this.isValid() && t.isValid() ? t < this ? this : t : p() })), Ne = D("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", (function () { var t = Le.apply(null, arguments); return this.isValid() && t.isValid() ? t > this ? this : t : p() })); function We(t, e) { var n, i; if (1 === e.length && r(e[0]) && (e = e[0]), !e.length) return Le(); for (n = e[0], i = 1; i < e.length; ++i)e[i].isValid() && !e[i][t](n) || (n = e[i]); return n } var Ye = ["year", "quarter", "month", "week", "day", "hour", "minute", "second", "millisecond"]; function ze(t) { var e = N(t), n = e.year || 0, i = e.quarter || 0, a = e.month || 0, r = e.week || e.isoWeek || 0, o = e.day || 0, s = e.hour || 0, l = e.minute || 0, u = e.second || 0, d = e.millisecond || 0; this._isValid = function (t) { for (var e in t) if (-1 === Pt.call(Ye, e) || null != t[e] && isNaN(t[e])) return !1; for (var n = !1, i = 0; i < Ye.length; ++i)if (t[Ye[i]]) { if (n) return !1; parseFloat(t[Ye[i]]) !== k(t[Ye[i]]) && (n = !0) } return !0 }(e), this._milliseconds = +d + 1e3 * u + 6e4 * l + 1e3 * s * 60 * 60, this._days = +o + 7 * r, this._months = +a + 3 * i + 12 * n, this._data = {}, this._locale = pe(), this._bubble() } function Ee(t) { return t instanceof ze } function Ve(t) { return t < 0 ? -1 * Math.round(-1 * t) : Math.round(t) } function He(t, e) { j(t, 0, 0, (function () { var t = this.utcOffset(), n = "+"; return t < 0 && (t = -t, n = "-"), n + z(~~(t / 60), 2) + e + z(~~t % 60, 2) })) } He("Z", ":"), He("ZZ", ""), dt("Z", st), dt("ZZ", st), gt(["Z", "ZZ"], (function (t, e, n) { n._useUTC = !0, n._tzm = je(st, t) })); var Be = /([\+\-]|\d\d)/gi; function je(t, e) { var n = (e || "").match(t); if (null === n) return null; var i = ((n[n.length - 1] || []) + "").match(Be) || ["-", 0, 0], a = 60 * i[1] + k(i[2]); return 0 === a ? 0 : "+" === i[0] ? a : -a } function Ue(t, e) { var n, i; return e._isUTC ? (n = e.clone(), i = (_(t) || u(t) ? t.valueOf() : Le(t).valueOf()) - n.valueOf(), n._d.setTime(n._d.valueOf() + i), a.updateOffset(n, !1), n) : Le(t).local() } function Ge(t) { return 15 * -Math.round(t._d.getTimezoneOffset() / 15) } function qe() { return !!this.isValid() && this._isUTC && 0 === this._offset } a.updateOffset = function () { }; var Ze = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/, $e = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function Xe(t, e) { var n, i, a, r, o, s, u = t, d = null; return Ee(t) ? u = { ms: t._milliseconds, d: t._days, M: t._months } : l(t) ? (u = {}, e ? u[e] = t : u.milliseconds = t) : (d = Ze.exec(t)) ? (n = "-" === d[1] ? -1 : 1, u = { y: 0, d: k(d[yt]) * n, h: k(d[xt]) * n, m: k(d[_t]) * n, s: k(d[wt]) * n, ms: k(Ve(1e3 * d[kt])) * n }) : (d = $e.exec(t)) ? (n = "-" === d[1] ? -1 : 1, u = { y: Ke(d[2], n), M: Ke(d[3], n), w: Ke(d[4], n), d: Ke(d[5], n), h: Ke(d[6], n), m: Ke(d[7], n), s: Ke(d[8], n) }) : null == u ? u = {} : "object" == typeof u && ("from" in u || "to" in u) && (r = Le(u.from), o = Le(u.to), a = r.isValid() && o.isValid() ? (o = Ue(o, r), r.isBefore(o) ? s = Je(r, o) : ((s = Je(o, r)).milliseconds = -s.milliseconds, s.months = -s.months), s) : { milliseconds: 0, months: 0 }, (u = {}).ms = a.milliseconds, u.M = a.months), i = new ze(u), Ee(t) && h(t, "_locale") && (i._locale = t._locale), i } function Ke(t, e) { var n = t && parseFloat(t.replace(",", ".")); return (isNaN(n) ? 0 : n) * e } function Je(t, e) { var n = {}; return n.months = e.month() - t.month() + 12 * (e.year() - t.year()), t.clone().add(n.months, "M").isAfter(e) && --n.months, n.milliseconds = +e - +t.clone().add(n.months, "M"), n } function Qe(t, e) { return function (n, i) { var a; return null === i || isNaN(+i) || (T(e, "moment()." + e + "(period, number) is deprecated. Please use moment()." + e + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."), a = n, n = i, i = a), tn(this, Xe(n = "string" == typeof n ? +n : n, i), t), this } } function tn(t, e, n, i) { var r = e._milliseconds, o = Ve(e._days), s = Ve(e._months); t.isValid() && (i = null == i || i, s && Yt(t, At(t, "Month") + s * n), o && Ft(t, "Date", At(t, "Date") + o * n), r && t._d.setTime(t._d.valueOf() + r * n), i && a.updateOffset(t, o || s)) } Xe.fn = ze.prototype, Xe.invalid = function () { return Xe(NaN) }; var en = Qe(1, "add"), nn = Qe(-1, "subtract"); function an(t, e) { var n = 12 * (e.year() - t.year()) + (e.month() - t.month()), i = t.clone().add(n, "months"); return -(n + (e - i < 0 ? (e - i) / (i - t.clone().add(n - 1, "months")) : (e - i) / (t.clone().add(n + 1, "months") - i))) || 0 } function rn(t) { var e; return void 0 === t ? this._locale._abbr : (null != (e = pe(t)) && (this._locale = e), this) } a.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ", a.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]"; var on = D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", (function (t) { return void 0 === t ? this.localeData() : this.locale(t) })); function sn() { return this._locale } var ln = 1e3, un = 60 * ln, dn = 60 * un, hn = 3506328 * dn; function cn(t, e) { return (t % e + e) % e } function fn(t, e, n) { return t < 100 && t >= 0 ? new Date(t + 400, e, n) - hn : new Date(t, e, n).valueOf() } function gn(t, e, n) { return t < 100 && t >= 0 ? Date.UTC(t + 400, e, n) - hn : Date.UTC(t, e, n) } function mn(t, e) { j(0, [t, t.length], 0, e) } function pn(t, e, n, i, a) { var r; return null == t ? qt(this, i, a).year : (e > (r = Zt(t, i, a)) && (e = r), vn.call(this, t, e, n, i, a)) } function vn(t, e, n, i, a) { var r = Gt(t, e, n, i, a), o = jt(r.year, 0, r.dayOfYear); return this.year(o.getUTCFullYear()), this.month(o.getUTCMonth()), this.date(o.getUTCDate()), this } j(0, ["gg", 2], 0, (function () { return this.weekYear() % 100 })), j(0, ["GG", 2], 0, (function () { return this.isoWeekYear() % 100 })), mn("gggg", "weekYear"), mn("ggggg", "weekYear"), mn("GGGG", "isoWeekYear"), mn("GGGGG", "isoWeekYear"), L("weekYear", "gg"), L("isoWeekYear", "GG"), Y("weekYear", 1), Y("isoWeekYear", 1), dt("G", rt), dt("g", rt), dt("GG", J, Z), dt("gg", J, Z), dt("GGGG", nt, X), dt("gggg", nt, X), dt("GGGGG", it, K), dt("ggggg", it, K), mt(["gggg", "ggggg", "GGGG", "GGGGG"], (function (t, e, n, i) { e[i.substr(0, 2)] = k(t) })), mt(["gg", "GG"], (function (t, e, n, i) { e[i] = a.parseTwoDigitYear(t) })), j("Q", 0, "Qo", "quarter"), L("quarter", "Q"), Y("quarter", 7), dt("Q", q), gt("Q", (function (t, e) { e[bt] = 3 * (k(t) - 1) })), j("D", ["DD", 2], "Do", "date"), L("date", "D"), Y("date", 9), dt("D", J), dt("DD", J, Z), dt("Do", (function (t, e) { return t ? e._dayOfMonthOrdinalParse || e._ordinalParse : e._dayOfMonthOrdinalParseLenient })), gt(["D", "DD"], yt), gt("Do", (function (t, e) { e[yt] = k(t.match(J)[0]) })); var bn = Ot("Date", !0); j("DDD", ["DDDD", 3], "DDDo", "dayOfYear"), L("dayOfYear", "DDD"), Y("dayOfYear", 4), dt("DDD", et), dt("DDDD", $), gt(["DDD", "DDDD"], (function (t, e, n) { n._dayOfYear = k(t) })), j("m", ["mm", 2], 0, "minute"), L("minute", "m"), Y("minute", 14), dt("m", J), dt("mm", J, Z), gt(["m", "mm"], _t); var yn = Ot("Minutes", !1); j("s", ["ss", 2], 0, "second"), L("second", "s"), Y("second", 15), dt("s", J), dt("ss", J, Z), gt(["s", "ss"], wt); var xn, _n = Ot("Seconds", !1); for (j("S", 0, 0, (function () { return ~~(this.millisecond() / 100) })), j(0, ["SS", 2], 0, (function () { return ~~(this.millisecond() / 10) })), j(0, ["SSS", 3], 0, "millisecond"), j(0, ["SSSS", 4], 0, (function () { return 10 * this.millisecond() })), j(0, ["SSSSS", 5], 0, (function () { return 100 * this.millisecond() })), j(0, ["SSSSSS", 6], 0, (function () { return 1e3 * this.millisecond() })), j(0, ["SSSSSSS", 7], 0, (function () { return 1e4 * this.millisecond() })), j(0, ["SSSSSSSS", 8], 0, (function () { return 1e5 * this.millisecond() })), j(0, ["SSSSSSSSS", 9], 0, (function () { return 1e6 * this.millisecond() })), L("millisecond", "ms"), Y("millisecond", 16), dt("S", et, q), dt("SS", et, Z), dt("SSS", et, $), xn = "SSSS"; xn.length <= 9; xn += "S")dt(xn, at); function wn(t, e) { e[kt] = k(1e3 * ("0." + t)) } for (xn = "S"; xn.length <= 9; xn += "S")gt(xn, wn); var kn = Ot("Milliseconds", !1); j("z", 0, 0, "zoneAbbr"), j("zz", 0, 0, "zoneName"); var Mn = x.prototype; function Sn(t) { return t } Mn.add = en, Mn.calendar = function (t, e) { var n = t || Le(), i = Ue(n, this).startOf("day"), r = a.calendarFormat(this, i) || "sameElse", o = e && (O(e[r]) ? e[r].call(this, n) : e[r]); return this.format(o || this.localeData().calendar(r, this, Le(n))) }, Mn.clone = function () { return new x(this) }, Mn.diff = function (t, e, n) { var i, a, r; if (!this.isValid()) return NaN; if (!(i = Ue(t, this)).isValid()) return NaN; switch (a = 6e4 * (i.utcOffset() - this.utcOffset()), e = R(e)) { case "year": r = an(this, i) / 12; break; case "month": r = an(this, i); break; case "quarter": r = an(this, i) / 3; break; case "second": r = (this - i) / 1e3; break; case "minute": r = (this - i) / 6e4; break; case "hour": r = (this - i) / 36e5; break; case "day": r = (this - i - a) / 864e5; break; case "week": r = (this - i - a) / 6048e5; break; default: r = this - i }return n ? r : w(r) }, Mn.endOf = function (t) { var e; if (void 0 === (t = R(t)) || "millisecond" === t || !this.isValid()) return this; var n = this._isUTC ? gn : fn; switch (t) { case "year": e = n(this.year() + 1, 0, 1) - 1; break; case "quarter": e = n(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; break; case "month": e = n(this.year(), this.month() + 1, 1) - 1; break; case "week": e = n(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; break; case "isoWeek": e = n(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; break; case "day": case "date": e = n(this.year(), this.month(), this.date() + 1) - 1; break; case "hour": e = this._d.valueOf(), e += dn - cn(e + (this._isUTC ? 0 : this.utcOffset() * un), dn) - 1; break; case "minute": e = this._d.valueOf(), e += un - cn(e, un) - 1; break; case "second": e = this._d.valueOf(), e += ln - cn(e, ln) - 1 }return this._d.setTime(e), a.updateOffset(this, !0), this }, Mn.format = function (t) { t || (t = this.isUtc() ? a.defaultFormatUtc : a.defaultFormat); var e = U(this, t); return this.localeData().postformat(e) }, Mn.from = function (t, e) { return this.isValid() && (_(t) && t.isValid() || Le(t).isValid()) ? Xe({ to: this, from: t }).locale(this.locale()).humanize(!e) : this.localeData().invalidDate() }, Mn.fromNow = function (t) { return this.from(Le(), t) }, Mn.to = function (t, e) { return this.isValid() && (_(t) && t.isValid() || Le(t).isValid()) ? Xe({ from: this, to: t }).locale(this.locale()).humanize(!e) : this.localeData().invalidDate() }, Mn.toNow = function (t) { return this.to(Le(), t) }, Mn.get = function (t) { return O(this[t = R(t)]) ? this[t]() : this }, Mn.invalidAt = function () { return g(this).overflow }, Mn.isAfter = function (t, e) { var n = _(t) ? t : Le(t); return !(!this.isValid() || !n.isValid()) && ("millisecond" === (e = R(e) || "millisecond") ? this.valueOf() > n.valueOf() : n.valueOf() < this.clone().startOf(e).valueOf()) }, Mn.isBefore = function (t, e) { var n = _(t) ? t : Le(t); return !(!this.isValid() || !n.isValid()) && ("millisecond" === (e = R(e) || "millisecond") ? this.valueOf() < n.valueOf() : this.clone().endOf(e).valueOf() < n.valueOf()) }, Mn.isBetween = function (t, e, n, i) { var a = _(t) ? t : Le(t), r = _(e) ? e : Le(e); return !!(this.isValid() && a.isValid() && r.isValid()) && ("(" === (i = i || "()")[0] ? this.isAfter(a, n) : !this.isBefore(a, n)) && (")" === i[1] ? this.isBefore(r, n) : !this.isAfter(r, n)) }, Mn.isSame = function (t, e) { var n, i = _(t) ? t : Le(t); return !(!this.isValid() || !i.isValid()) && ("millisecond" === (e = R(e) || "millisecond") ? this.valueOf() === i.valueOf() : (n = i.valueOf(), this.clone().startOf(e).valueOf() <= n && n <= this.clone().endOf(e).valueOf())) }, Mn.isSameOrAfter = function (t, e) { return this.isSame(t, e) || this.isAfter(t, e) }, Mn.isSameOrBefore = function (t, e) { return this.isSame(t, e) || this.isBefore(t, e) }, Mn.isValid = function () { return m(this) }, Mn.lang = on, Mn.locale = rn, Mn.localeData = sn, Mn.max = Ne, Mn.min = Re, Mn.parsingFlags = function () { return c({}, g(this)) }, Mn.set = function (t, e) { if ("object" == typeof t) for (var n = function (t) { var e = []; for (var n in t) e.push({ unit: n, priority: W[n] }); return e.sort((function (t, e) { return t.priority - e.priority })), e }(t = N(t)), i = 0; i < n.length; i++)this[n[i].unit](t[n[i].unit]); else if (O(this[t = R(t)])) return this[t](e); return this }, Mn.startOf = function (t) { var e; if (void 0 === (t = R(t)) || "millisecond" === t || !this.isValid()) return this; var n = this._isUTC ? gn : fn; switch (t) { case "year": e = n(this.year(), 0, 1); break; case "quarter": e = n(this.year(), this.month() - this.month() % 3, 1); break; case "month": e = n(this.year(), this.month(), 1); break; case "week": e = n(this.year(), this.month(), this.date() - this.weekday()); break; case "isoWeek": e = n(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); break; case "day": case "date": e = n(this.year(), this.month(), this.date()); break; case "hour": e = this._d.valueOf(), e -= cn(e + (this._isUTC ? 0 : this.utcOffset() * un), dn); break; case "minute": e = this._d.valueOf(), e -= cn(e, un); break; case "second": e = this._d.valueOf(), e -= cn(e, ln) }return this._d.setTime(e), a.updateOffset(this, !0), this }, Mn.subtract = nn, Mn.toArray = function () { var t = this; return [t.year(), t.month(), t.date(), t.hour(), t.minute(), t.second(), t.millisecond()] }, Mn.toObject = function () { var t = this; return { years: t.year(), months: t.month(), date: t.date(), hours: t.hours(), minutes: t.minutes(), seconds: t.seconds(), milliseconds: t.milliseconds() } }, Mn.toDate = function () { return new Date(this.valueOf()) }, Mn.toISOString = function (t) { if (!this.isValid()) return null; var e = !0 !== t, n = e ? this.clone().utc() : this; return n.year() < 0 || n.year() > 9999 ? U(n, e ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ") : O(Date.prototype.toISOString) ? e ? this.toDate().toISOString() : new Date(this.valueOf() + 60 * this.utcOffset() * 1e3).toISOString().replace("Z", U(n, "Z")) : U(n, e ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ") }, Mn.inspect = function () { if (!this.isValid()) return "moment.invalid(/* " + this._i + " */)"; var t = "moment", e = ""; this.isLocal() || (t = 0 === this.utcOffset() ? "moment.utc" : "moment.parseZone", e = "Z"); var n = "[" + t + '("]', i = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY", a = e + '[")]'; return this.format(n + i + "-MM-DD[T]HH:mm:ss.SSS" + a) }, Mn.toJSON = function () { return this.isValid() ? this.toISOString() : null }, Mn.toString = function () { return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ") }, Mn.unix = function () { return Math.floor(this.valueOf() / 1e3) }, Mn.valueOf = function () { return this._d.valueOf() - 6e4 * (this._offset || 0) }, Mn.creationData = function () { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict } }, Mn.year = Tt, Mn.isLeapYear = function () { return Ct(this.year()) }, Mn.weekYear = function (t) { return pn.call(this, t, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy) }, Mn.isoWeekYear = function (t) { return pn.call(this, t, this.isoWeek(), this.isoWeekday(), 1, 4) }, Mn.quarter = Mn.quarters = function (t) { return null == t ? Math.ceil((this.month() + 1) / 3) : this.month(3 * (t - 1) + this.month() % 3) }, Mn.month = zt, Mn.daysInMonth = function () { return It(this.year(), this.month()) }, Mn.week = Mn.weeks = function (t) { var e = this.localeData().week(this); return null == t ? e : this.add(7 * (t - e), "d") }, Mn.isoWeek = Mn.isoWeeks = function (t) { var e = qt(this, 1, 4).week; return null == t ? e : this.add(7 * (t - e), "d") }, Mn.weeksInYear = function () { var t = this.localeData()._week; return Zt(this.year(), t.dow, t.doy) }, Mn.isoWeeksInYear = function () { return Zt(this.year(), 1, 4) }, Mn.date = bn, Mn.day = Mn.days = function (t) { if (!this.isValid()) return null != t ? this : NaN; var e = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); return null != t ? (t = function (t, e) { return "string" != typeof t ? t : isNaN(t) ? "number" == typeof (t = e.weekdaysParse(t)) ? t : null : parseInt(t, 10) }(t, this.localeData()), this.add(t - e, "d")) : e }, Mn.weekday = function (t) { if (!this.isValid()) return null != t ? this : NaN; var e = (this.day() + 7 - this.localeData()._week.dow) % 7; return null == t ? e : this.add(t - e, "d") }, Mn.isoWeekday = function (t) { if (!this.isValid()) return null != t ? this : NaN; if (null != t) { var e = function (t, e) { return "string" == typeof t ? e.weekdaysParse(t) % 7 || 7 : isNaN(t) ? null : t }(t, this.localeData()); return this.day(this.day() % 7 ? e : e - 7) } return this.day() || 7 }, Mn.dayOfYear = function (t) { var e = Math.round((this.clone().startOf("day") - this.clone().startOf("year")) / 864e5) + 1; return null == t ? e : this.add(t - e, "d") }, Mn.hour = Mn.hours = le, Mn.minute = Mn.minutes = yn, Mn.second = Mn.seconds = _n, Mn.millisecond = Mn.milliseconds = kn, Mn.utcOffset = function (t, e, n) { var i, r = this._offset || 0; if (!this.isValid()) return null != t ? this : NaN; if (null != t) { if ("string" == typeof t) { if (null === (t = je(st, t))) return this } else Math.abs(t) < 16 && !n && (t *= 60); return !this._isUTC && e && (i = Ge(this)), this._offset = t, this._isUTC = !0, null != i && this.add(i, "m"), r !== t && (!e || this._changeInProgress ? tn(this, Xe(t - r, "m"), 1, !1) : this._changeInProgress || (this._changeInProgress = !0, a.updateOffset(this, !0), this._changeInProgress = null)), this } return this._isUTC ? r : Ge(this) }, Mn.utc = function (t) { return this.utcOffset(0, t) }, Mn.local = function (t) { return this._isUTC && (this.utcOffset(0, t), this._isUTC = !1, t && this.subtract(Ge(this), "m")), this }, Mn.parseZone = function () { if (null != this._tzm) this.utcOffset(this._tzm, !1, !0); else if ("string" == typeof this._i) { var t = je(ot, this._i); null != t ? this.utcOffset(t) : this.utcOffset(0, !0) } return this }, Mn.hasAlignedHourOffset = function (t) { return !!this.isValid() && (t = t ? Le(t).utcOffset() : 0, (this.utcOffset() - t) % 60 == 0) }, Mn.isDST = function () { return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() }, Mn.isLocal = function () { return !!this.isValid() && !this._isUTC }, Mn.isUtcOffset = function () { return !!this.isValid() && this._isUTC }, Mn.isUtc = qe, Mn.isUTC = qe, Mn.zoneAbbr = function () { return this._isUTC ? "UTC" : "" }, Mn.zoneName = function () { return this._isUTC ? "Coordinated Universal Time" : "" }, Mn.dates = D("dates accessor is deprecated. Use date instead.", bn), Mn.months = D("months accessor is deprecated. Use month instead", zt), Mn.years = D("years accessor is deprecated. Use year instead", Tt), Mn.zone = D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", (function (t, e) { return null != t ? ("string" != typeof t && (t = -t), this.utcOffset(t, e), this) : -this.utcOffset() })), Mn.isDSTShifted = D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", (function () { if (!s(this._isDSTShifted)) return this._isDSTShifted; var t = {}; if (b(t, this), (t = Fe(t))._a) { var e = t._isUTC ? f(t._a) : Le(t._a); this._isDSTShifted = this.isValid() && M(t._a, e.toArray()) > 0 } else this._isDSTShifted = !1; return this._isDSTShifted })); var Dn = F.prototype; function Cn(t, e, n, i) { var a = pe(), r = f().set(i, e); return a[n](r, t) } function Pn(t, e, n) { if (l(t) && (e = t, t = void 0), t = t || "", null != e) return Cn(t, e, n, "month"); var i, a = []; for (i = 0; i < 12; i++)a[i] = Cn(t, i, n, "month"); return a } function Tn(t, e, n, i) { "boolean" == typeof t ? (l(e) && (n = e, e = void 0), e = e || "") : (n = e = t, t = !1, l(e) && (n = e, e = void 0), e = e || ""); var a, r = pe(), o = t ? r._week.dow : 0; if (null != n) return Cn(e, (n + o) % 7, i, "day"); var s = []; for (a = 0; a < 7; a++)s[a] = Cn(e, (a + o) % 7, i, "day"); return s } Dn.calendar = function (t, e, n) { var i = this._calendar[t] || this._calendar.sameElse; return O(i) ? i.call(e, n) : i }, Dn.longDateFormat = function (t) { var e = this._longDateFormat[t], n = this._longDateFormat[t.toUpperCase()]; return e || !n ? e : (this._longDateFormat[t] = n.replace(/MMMM|MM|DD|dddd/g, (function (t) { return t.slice(1) })), this._longDateFormat[t]) }, Dn.invalidDate = function () { return this._invalidDate }, Dn.ordinal = function (t) { return this._ordinal.replace("%d", t) }, Dn.preparse = Sn, Dn.postformat = Sn, Dn.relativeTime = function (t, e, n, i) { var a = this._relativeTime[n]; return O(a) ? a(t, e, n, i) : a.replace(/%d/i, t) }, Dn.pastFuture = function (t, e) { var n = this._relativeTime[t > 0 ? "future" : "past"]; return O(n) ? n(e) : n.replace(/%s/i, e) }, Dn.set = function (t) { var e, n; for (n in t) O(e = t[n]) ? this[n] = e : this["_" + n] = e; this._config = t, this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source) }, Dn.months = function (t, e) { return t ? r(this._months) ? this._months[t.month()] : this._months[(this._months.isFormat || Lt).test(e) ? "format" : "standalone"][t.month()] : r(this._months) ? this._months : this._months.standalone }, Dn.monthsShort = function (t, e) { return t ? r(this._monthsShort) ? this._monthsShort[t.month()] : this._monthsShort[Lt.test(e) ? "format" : "standalone"][t.month()] : r(this._monthsShort) ? this._monthsShort : this._monthsShort.standalone }, Dn.monthsParse = function (t, e, n) { var i, a, r; if (this._monthsParseExact) return Wt.call(this, t, e, n); for (this._monthsParse || (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = []), i = 0; i < 12; i++) { if (a = f([2e3, i]), n && !this._longMonthsParse[i] && (this._longMonthsParse[i] = new RegExp("^" + this.months(a, "").replace(".", "") + "$", "i"), this._shortMonthsParse[i] = new RegExp("^" + this.monthsShort(a, "").replace(".", "") + "$", "i")), n || this._monthsParse[i] || (r = "^" + this.months(a, "") + "|^" + this.monthsShort(a, ""), this._monthsParse[i] = new RegExp(r.replace(".", ""), "i")), n && "MMMM" === e && this._longMonthsParse[i].test(t)) return i; if (n && "MMM" === e && this._shortMonthsParse[i].test(t)) return i; if (!n && this._monthsParse[i].test(t)) return i } }, Dn.monthsRegex = function (t) { return this._monthsParseExact ? (h(this, "_monthsRegex") || Ht.call(this), t ? this._monthsStrictRegex : this._monthsRegex) : (h(this, "_monthsRegex") || (this._monthsRegex = Vt), this._monthsStrictRegex && t ? this._monthsStrictRegex : this._monthsRegex) }, Dn.monthsShortRegex = function (t) { return this._monthsParseExact ? (h(this, "_monthsRegex") || Ht.call(this), t ? this._monthsShortStrictRegex : this._monthsShortRegex) : (h(this, "_monthsShortRegex") || (this._monthsShortRegex = Et), this._monthsShortStrictRegex && t ? this._monthsShortStrictRegex : this._monthsShortRegex) }, Dn.week = function (t) { return qt(t, this._week.dow, this._week.doy).week }, Dn.firstDayOfYear = function () { return this._week.doy }, Dn.firstDayOfWeek = function () { return this._week.dow }, Dn.weekdays = function (t, e) { var n = r(this._weekdays) ? this._weekdays : this._weekdays[t && !0 !== t && this._weekdays.isFormat.test(e) ? "format" : "standalone"]; return !0 === t ? $t(n, this._week.dow) : t ? n[t.day()] : n }, Dn.weekdaysMin = function (t) { return !0 === t ? $t(this._weekdaysMin, this._week.dow) : t ? this._weekdaysMin[t.day()] : this._weekdaysMin }, Dn.weekdaysShort = function (t) { return !0 === t ? $t(this._weekdaysShort, this._week.dow) : t ? this._weekdaysShort[t.day()] : this._weekdaysShort }, Dn.weekdaysParse = function (t, e, n) { var i, a, r; if (this._weekdaysParseExact) return Qt.call(this, t, e, n); for (this._weekdaysParse || (this._weekdaysParse = [], this._minWeekdaysParse = [], this._shortWeekdaysParse = [], this._fullWeekdaysParse = []), i = 0; i < 7; i++) { if (a = f([2e3, 1]).day(i), n && !this._fullWeekdaysParse[i] && (this._fullWeekdaysParse[i] = new RegExp("^" + this.weekdays(a, "").replace(".", "\\.?") + "$", "i"), this._shortWeekdaysParse[i] = new RegExp("^" + this.weekdaysShort(a, "").replace(".", "\\.?") + "$", "i"), this._minWeekdaysParse[i] = new RegExp("^" + this.weekdaysMin(a, "").replace(".", "\\.?") + "$", "i")), this._weekdaysParse[i] || (r = "^" + this.weekdays(a, "") + "|^" + this.weekdaysShort(a, "") + "|^" + this.weekdaysMin(a, ""), this._weekdaysParse[i] = new RegExp(r.replace(".", ""), "i")), n && "dddd" === e && this._fullWeekdaysParse[i].test(t)) return i; if (n && "ddd" === e && this._shortWeekdaysParse[i].test(t)) return i; if (n && "dd" === e && this._minWeekdaysParse[i].test(t)) return i; if (!n && this._weekdaysParse[i].test(t)) return i } }, Dn.weekdaysRegex = function (t) { return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || ie.call(this), t ? this._weekdaysStrictRegex : this._weekdaysRegex) : (h(this, "_weekdaysRegex") || (this._weekdaysRegex = te), this._weekdaysStrictRegex && t ? this._weekdaysStrictRegex : this._weekdaysRegex) }, Dn.weekdaysShortRegex = function (t) { return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || ie.call(this), t ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex) : (h(this, "_weekdaysShortRegex") || (this._weekdaysShortRegex = ee), this._weekdaysShortStrictRegex && t ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex) }, Dn.weekdaysMinRegex = function (t) { return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || ie.call(this), t ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex) : (h(this, "_weekdaysMinRegex") || (this._weekdaysMinRegex = ne), this._weekdaysMinStrictRegex && t ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex) }, Dn.isPM = function (t) { return "p" === (t + "").toLowerCase().charAt(0) }, Dn.meridiem = function (t, e, n) { return t > 11 ? n ? "pm" : "PM" : n ? "am" : "AM" }, ge("en", { dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (t) { var e = t % 10; return t + (1 === k(t % 100 / 10) ? "th" : 1 === e ? "st" : 2 === e ? "nd" : 3 === e ? "rd" : "th") } }), a.lang = D("moment.lang is deprecated. Use moment.locale instead.", ge), a.langData = D("moment.langData is deprecated. Use moment.localeData instead.", pe); var On = Math.abs; function An(t, e, n, i) { var a = Xe(e, n); return t._milliseconds += i * a._milliseconds, t._days += i * a._days, t._months += i * a._months, t._bubble() } function Fn(t) { return t < 0 ? Math.floor(t) : Math.ceil(t) } function In(t) { return 4800 * t / 146097 } function Ln(t) { return 146097 * t / 4800 } function Rn(t) { return function () { return this.as(t) } } var Nn = Rn("ms"), Wn = Rn("s"), Yn = Rn("m"), zn = Rn("h"), En = Rn("d"), Vn = Rn("w"), Hn = Rn("M"), Bn = Rn("Q"), jn = Rn("y"); function Un(t) { return function () { return this.isValid() ? this._data[t] : NaN } } var Gn = Un("milliseconds"), qn = Un("seconds"), Zn = Un("minutes"), $n = Un("hours"), Xn = Un("days"), Kn = Un("months"), Jn = Un("years"), Qn = Math.round, ti = { ss: 44, s: 45, m: 45, h: 22, d: 26, M: 11 }; function ei(t, e, n, i, a) { return a.relativeTime(e || 1, !!n, t, i) } var ni = Math.abs; function ii(t) { return (t > 0) - (t < 0) || +t } function ai() { if (!this.isValid()) return this.localeData().invalidDate(); var t, e, n = ni(this._milliseconds) / 1e3, i = ni(this._days), a = ni(this._months); t = w(n / 60), e = w(t / 60), n %= 60, t %= 60; var r = w(a / 12), o = a %= 12, s = i, l = e, u = t, d = n ? n.toFixed(3).replace(/\.?0+$/, "") : "", h = this.asSeconds(); if (!h) return "P0D"; var c = h < 0 ? "-" : "", f = ii(this._months) !== ii(h) ? "-" : "", g = ii(this._days) !== ii(h) ? "-" : "", m = ii(this._milliseconds) !== ii(h) ? "-" : ""; return c + "P" + (r ? f + r + "Y" : "") + (o ? f + o + "M" : "") + (s ? g + s + "D" : "") + (l || u || d ? "T" : "") + (l ? m + l + "H" : "") + (u ? m + u + "M" : "") + (d ? m + d + "S" : "") } var ri = ze.prototype; return ri.isValid = function () { return this._isValid }, ri.abs = function () { var t = this._data; return this._milliseconds = On(this._milliseconds), this._days = On(this._days), this._months = On(this._months), t.milliseconds = On(t.milliseconds), t.seconds = On(t.seconds), t.minutes = On(t.minutes), t.hours = On(t.hours), t.months = On(t.months), t.years = On(t.years), this }, ri.add = function (t, e) { return An(this, t, e, 1) }, ri.subtract = function (t, e) { return An(this, t, e, -1) }, ri.as = function (t) { if (!this.isValid()) return NaN; var e, n, i = this._milliseconds; if ("month" === (t = R(t)) || "quarter" === t || "year" === t) switch (e = this._days + i / 864e5, n = this._months + In(e), t) { case "month": return n; case "quarter": return n / 3; case "year": return n / 12 } else switch (e = this._days + Math.round(Ln(this._months)), t) { case "week": return e / 7 + i / 6048e5; case "day": return e + i / 864e5; case "hour": return 24 * e + i / 36e5; case "minute": return 1440 * e + i / 6e4; case "second": return 86400 * e + i / 1e3; case "millisecond": return Math.floor(864e5 * e) + i; default: throw new Error("Unknown unit " + t) } }, ri.asMilliseconds = Nn, ri.asSeconds = Wn, ri.asMinutes = Yn, ri.asHours = zn, ri.asDays = En, ri.asWeeks = Vn, ri.asMonths = Hn, ri.asQuarters = Bn, ri.asYears = jn, ri.valueOf = function () { return this.isValid() ? this._milliseconds + 864e5 * this._days + this._months % 12 * 2592e6 + 31536e6 * k(this._months / 12) : NaN }, ri._bubble = function () { var t, e, n, i, a, r = this._milliseconds, o = this._days, s = this._months, l = this._data; return r >= 0 && o >= 0 && s >= 0 || r <= 0 && o <= 0 && s <= 0 || (r += 864e5 * Fn(Ln(s) + o), o = 0, s = 0), l.milliseconds = r % 1e3, t = w(r / 1e3), l.seconds = t % 60, e = w(t / 60), l.minutes = e % 60, n = w(e / 60), l.hours = n % 24, o += w(n / 24), a = w(In(o)), s += a, o -= Fn(Ln(a)), i = w(s / 12), s %= 12, l.days = o, l.months = s, l.years = i, this }, ri.clone = function () { return Xe(this) }, ri.get = function (t) { return t = R(t), this.isValid() ? this[t + "s"]() : NaN }, ri.milliseconds = Gn, ri.seconds = qn, ri.minutes = Zn, ri.hours = $n, ri.days = Xn, ri.weeks = function () { return w(this.days() / 7) }, ri.months = Kn, ri.years = Jn, ri.humanize = function (t) { if (!this.isValid()) return this.localeData().invalidDate(); var e = this.localeData(), n = function (t, e, n) { var i = Xe(t).abs(), a = Qn(i.as("s")), r = Qn(i.as("m")), o = Qn(i.as("h")), s = Qn(i.as("d")), l = Qn(i.as("M")), u = Qn(i.as("y")), d = a <= ti.ss && ["s", a] || a < ti.s && ["ss", a] || r <= 1 && ["m"] || r < ti.m && ["mm", r] || o <= 1 && ["h"] || o < ti.h && ["hh", o] || s <= 1 && ["d"] || s < ti.d && ["dd", s] || l <= 1 && ["M"] || l < ti.M && ["MM", l] || u <= 1 && ["y"] || ["yy", u]; return d[2] = e, d[3] = +t > 0, d[4] = n, ei.apply(null, d) }(this, !t, e); return t && (n = e.pastFuture(+this, n)), e.postformat(n) }, ri.toISOString = ai, ri.toString = ai, ri.toJSON = ai, ri.locale = rn, ri.localeData = sn, ri.toIsoString = D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", ai), ri.lang = on, j("X", 0, 0, "unix"), j("x", 0, 0, "valueOf"), dt("x", rt), dt("X", /[+-]?\d+(\.\d{1,3})?/), gt("X", (function (t, e, n) { n._d = new Date(1e3 * parseFloat(t, 10)) })), gt("x", (function (t, e, n) { n._d = new Date(k(t)) })), a.version = "2.24.0", n = Le, a.fn = Mn, a.min = function () { return We("isBefore", [].slice.call(arguments, 0)) }, a.max = function () { return We("isAfter", [].slice.call(arguments, 0)) }, a.now = function () { return Date.now ? Date.now() : +new Date }, a.utc = f, a.unix = function (t) { return Le(1e3 * t) }, a.months = function (t, e) { return Pn(t, e, "months") }, a.isDate = u, a.locale = ge, a.invalid = p, a.duration = Xe, a.isMoment = _, a.weekdays = function (t, e, n) { return Tn(t, e, n, "weekdays") }, a.parseZone = function () { return Le.apply(null, arguments).parseZone() }, a.localeData = pe, a.isDuration = Ee, a.monthsShort = function (t, e) { return Pn(t, e, "monthsShort") }, a.weekdaysMin = function (t, e, n) { return Tn(t, e, n, "weekdaysMin") }, a.defineLocale = me, a.updateLocale = function (t, e) { if (null != e) { var n, i, a = ue; null != (i = fe(t)) && (a = i._config), e = A(a, e), (n = new F(e)).parentLocale = de[t], de[t] = n, ge(t) } else null != de[t] && (null != de[t].parentLocale ? de[t] = de[t].parentLocale : null != de[t] && delete de[t]); return de[t] }, a.locales = function () { return C(de) }, a.weekdaysShort = function (t, e, n) { return Tn(t, e, n, "weekdaysShort") }, a.normalizeUnits = R, a.relativeTimeRounding = function (t) { return void 0 === t ? Qn : "function" == typeof t && (Qn = t, !0) }, a.relativeTimeThreshold = function (t, e) { return void 0 !== ti[t] && (void 0 === e ? ti[t] : (ti[t] = e, "s" === t && (ti.ss = e - 1), !0)) }, a.calendarFormat = function (t, e) { var n = t.diff(e, "days", !0); return n < -6 ? "sameElse" : n < -1 ? "lastWeek" : n < 0 ? "lastDay" : n < 1 ? "sameDay" : n < 2 ? "nextDay" : n < 7 ? "nextWeek" : "sameElse" }, a.prototype = Mn, a.HTML5_FMT = { DATETIME_LOCAL: "YYYY-MM-DDTHH:mm", DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss", DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS", DATE: "YYYY-MM-DD", TIME: "HH:mm", TIME_SECONDS: "HH:mm:ss", TIME_MS: "HH:mm:ss.SSS", WEEK: "GGGG-[W]WW", MONTH: "YYYY-MM" }, a }() })), pi = { datetime: "MMM D, YYYY, h:mm:ss a", millisecond: "h:mm:ss.SSS a", second: "h:mm:ss a", minute: "h:mm a", hour: "hA", day: "MMM D", week: "ll", month: "MMM YYYY", quarter: "[Q]Q - YYYY", year: "YYYY" }; on._date.override("function" == typeof mi ? { _id: "moment", formats: function () { return pi }, parse: function (t, e) { return "string" == typeof t && "string" == typeof e ? t = mi(t, e) : t instanceof mi || (t = mi(t)), t.isValid() ? t.valueOf() : null }, format: function (t, e) { return mi(t).format(e) }, add: function (t, e, n) { return mi(t).add(e, n).valueOf() }, diff: function (t, e, n) { return mi(t).diff(mi(e), n) }, startOf: function (t, e, n) { return t = mi(t), "isoWeek" === e ? t.isoWeekday(n).valueOf() : t.startOf(e).valueOf() }, endOf: function (t, e) { return mi(t).endOf(e).valueOf() }, _create: function (t) { return mi(t) } } : {}), Y._set("global", { plugins: { filler: { propagate: !0 } } }); var vi = { dataset: function (t) { var e = t.fill, n = t.chart, i = n.getDatasetMeta(e), a = i && n.isDatasetVisible(e) && i.dataset._children || [], r = a.length || 0; return r ? function (t, e) { return e < r && a[e]._view || null } : null }, boundary: function (t) { var e = t.boundary, n = e ? e.x : null, i = e ? e.y : null; return B.isArray(e) ? function (t, n) { return e[n] } : function (t) { return { x: null === n ? t.x : n, y: null === i ? t.y : i } } } }; function bi(t, e, n) { var i, a = t._model || {}, r = a.fill; if (void 0 === r && (r = !!a.backgroundColor), !1 === r || null === r) return !1; if (!0 === r) return "origin"; if (i = parseFloat(r, 10), isFinite(i) && Math.floor(i) === i) return "-" !== r[0] && "+" !== r[0] || (i = e + i), !(i === e || i < 0 || i >= n) && i; switch (r) { case "bottom": return "start"; case "top": return "end"; case "zero": return "origin"; case "origin": case "start": case "end": return r; default: return !1 } } function yi(t) { return (t.el._scale || {}).getPointPositionForValue ? function (t) { var e, n, i, a, r, o = t.el._scale, s = o.options, l = o.chart.data.labels.length, u = t.fill, d = []; if (!l) return null; for (e = s.ticks.reverse ? o.max : o.min, n = s.ticks.reverse ? o.min : o.max, i = o.getPointPositionForValue(0, e), a = 0; a < l; ++a)r = "start" === u || "end" === u ? o.getPointPositionForValue(a, "start" === u ? e : n) : o.getBasePosition(a), s.gridLines.circular && (r.cx = i.x, r.cy = i.y, r.angle = o.getIndexAngle(a) - Math.PI / 2), d.push(r); return d }(t) : function (t) { var e, n = t.el._model || {}, i = t.el._scale || {}, a = t.fill, r = null; if (isFinite(a)) return null; if ("start" === a ? r = void 0 === n.scaleBottom ? i.bottom : n.scaleBottom : "end" === a ? r = void 0 === n.scaleTop ? i.top : n.scaleTop : void 0 !== n.scaleZero ? r = n.scaleZero : i.getBasePixel && (r = i.getBasePixel()), null != r) { if (void 0 !== r.x && void 0 !== r.y) return r; if (B.isFinite(r)) return { x: (e = i.isHorizontal()) ? r : null, y: e ? null : r } } return null }(t) } function xi(t, e, n) { var i, a = t[e].fill, r = [e]; if (!n) return a; for (; !1 !== a && -1 === r.indexOf(a);) { if (!isFinite(a)) return a; if (!(i = t[a])) return !1; if (i.visible) return a; r.push(a), a = i.fill } return !1 } function _i(t) { var e = t.fill, n = "dataset"; return !1 === e ? null : (isFinite(e) || (n = "boundary"), vi[n](t)) } function wi(t) { return t && !t.skip } function ki(t, e, n, i, a) { var r, o, s, l; if (i && a) { for (t.moveTo(e[0].x, e[0].y), r = 1; r < i; ++r)B.canvas.lineTo(t, e[r - 1], e[r]); if (void 0 === n[0].angle) for (t.lineTo(n[a - 1].x, n[a - 1].y), r = a - 1; r > 0; --r)B.canvas.lineTo(t, n[r], n[r - 1], !0); else for (o = n[0].cx, s = n[0].cy, l = Math.sqrt(Math.pow(n[0].x - o, 2) + Math.pow(n[0].y - s, 2)), r = a - 1; r > 0; --r)t.arc(o, s, l, n[r].angle, n[r - 1].angle, !0) } } function Mi(t, e, n, i, a, r) { var o, s, l, u, d, h, c, f, g = e.length, m = i.spanGaps, p = [], v = [], b = 0, y = 0; for (t.beginPath(), o = 0, s = g; o < s; ++o)d = n(u = e[l = o % g]._view, l, i), h = wi(u), c = wi(d), r && void 0 === f && h && (s = g + (f = o + 1)), h && c ? (b = p.push(u), y = v.push(d)) : b && y && (m ? (h && p.push(u), c && v.push(d)) : (ki(t, p, v, b, y), b = y = 0, p = [], v = [])); ki(t, p, v, b, y), t.closePath(), t.fillStyle = a, t.fill() } var Si = { id: "filler", afterDatasetsUpdate: function (t, e) { var n, i, a, r, o = (t.data.datasets || []).length, s = e.propagate, l = []; for (i = 0; i < o; ++i)r = null, (a = (n = t.getDatasetMeta(i)).dataset) && a._model && a instanceof kt.Line && (r = { visible: t.isDatasetVisible(i), fill: bi(a, i, o), chart: t, el: a }), n.$filler = r, l.push(r); for (i = 0; i < o; ++i)(r = l[i]) && (r.fill = xi(l, i, s), r.boundary = yi(r), r.mapper = _i(r)) }, beforeDatasetsDraw: function (t) { var e, n, i, a, r, o, s, l = t._getSortedVisibleDatasetMetas(), u = t.ctx; for (n = l.length - 1; n >= 0; --n)(e = l[n].$filler) && e.visible && (a = (i = e.el)._view, r = i._children || [], o = e.mapper, s = a.backgroundColor || Y.global.defaultColor, o && s && r.length && (B.canvas.clipArea(u, t.chartArea), Mi(u, r, o, a, s, i._loop), B.canvas.unclipArea(u))) } }, Di = B.rtl.getRtlAdapter, Ci = B.noop, Pi = B.valueOrDefault; function Ti(t, e) { return t.usePointStyle && t.boxWidth > e ? e : t.boxWidth } Y._set("global", { legend: { display: !0, position: "top", align: "center", fullWidth: !0, reverse: !1, weight: 1e3, onClick: function (t, e) { var n = e.datasetIndex, i = this.chart, a = i.getDatasetMeta(n); a.hidden = null === a.hidden ? !i.data.datasets[n].hidden : null, i.update() }, onHover: null, onLeave: null, labels: { boxWidth: 40, padding: 10, generateLabels: function (t) { var e = t.data.datasets, n = t.options.legend || {}, i = n.labels && n.labels.usePointStyle; return t._getSortedDatasetMetas().map((function (n) { var a = n.controller.getStyle(i ? 0 : void 0); return { text: e[n.index].label, fillStyle: a.backgroundColor, hidden: !t.isDatasetVisible(n.index), lineCap: a.borderCapStyle, lineDash: a.borderDash, lineDashOffset: a.borderDashOffset, lineJoin: a.borderJoinStyle, lineWidth: a.borderWidth, strokeStyle: a.borderColor, pointStyle: a.pointStyle, rotation: a.rotation, datasetIndex: n.index } }), this) } } }, legendCallback: function (t) { var e, n, i, a = document.createElement("ul"), r = t.data.datasets; for (a.setAttribute("class", t.id + "-legend"), e = 0, n = r.length; e < n; e++)(i = a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor = r[e].backgroundColor, r[e].label && i.appendChild(document.createTextNode(r[e].label)); return a.outerHTML } }); var Oi = X.extend({ initialize: function (t) { B.extend(this, t), this.legendHitBoxes = [], this._hoveredItem = null, this.doughnutMode = !1 }, beforeUpdate: Ci, update: function (t, e, n) { var i = this; return i.beforeUpdate(), i.maxWidth = t, i.maxHeight = e, i.margins = n, i.beforeSetDimensions(), i.setDimensions(), i.afterSetDimensions(), i.beforeBuildLabels(), i.buildLabels(), i.afterBuildLabels(), i.beforeFit(), i.fit(), i.afterFit(), i.afterUpdate(), i.minSize }, afterUpdate: Ci, beforeSetDimensions: Ci, setDimensions: function () { var t = this; t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0, t.minSize = { width: 0, height: 0 } }, afterSetDimensions: Ci, beforeBuildLabels: Ci, buildLabels: function () { var t = this, e = t.options.labels || {}, n = B.callback(e.generateLabels, [t.chart], t) || []; e.filter && (n = n.filter((function (n) { return e.filter(n, t.chart.data) }))), t.options.reverse && n.reverse(), t.legendItems = n }, afterBuildLabels: Ci, beforeFit: Ci, fit: function () { var t = this, e = t.options, n = e.labels, i = e.display, a = t.ctx, r = B.options._parseFont(n), o = r.size, s = t.legendHitBoxes = [], l = t.minSize, u = t.isHorizontal(); if (u ? (l.width = t.maxWidth, l.height = i ? 10 : 0) : (l.width = i ? 10 : 0, l.height = t.maxHeight), i) { if (a.font = r.string, u) { var d = t.lineWidths = [0], h = 0; a.textAlign = "left", a.textBaseline = "middle", B.each(t.legendItems, (function (t, e) { var i = Ti(n, o) + o / 2 + a.measureText(t.text).width; (0 === e || d[d.length - 1] + i + 2 * n.padding > l.width) && (h += o + n.padding, d[d.length - (e > 0 ? 0 : 1)] = 0), s[e] = { left: 0, top: 0, width: i, height: o }, d[d.length - 1] += i + n.padding })), l.height += h } else { var c = n.padding, f = t.columnWidths = [], g = t.columnHeights = [], m = n.padding, p = 0, v = 0; B.each(t.legendItems, (function (t, e) { var i = Ti(n, o) + o / 2 + a.measureText(t.text).width; e > 0 && v + o + 2 * c > l.height && (m += p + n.padding, f.push(p), g.push(v), p = 0, v = 0), p = Math.max(p, i), v += o + c, s[e] = { left: 0, top: 0, width: i, height: o } })), m += p, f.push(p), g.push(v), l.width += m } t.width = l.width, t.height = l.height } else t.width = l.width = t.height = l.height = 0 }, afterFit: Ci, isHorizontal: function () { return "top" === this.options.position || "bottom" === this.options.position }, draw: function () { var t = this, e = t.options, n = e.labels, i = Y.global, a = i.defaultColor, r = i.elements.line, o = t.height, s = t.columnHeights, l = t.width, u = t.lineWidths; if (e.display) { var d, h = Di(e.rtl, t.left, t.minSize.width), c = t.ctx, f = Pi(n.fontColor, i.defaultFontColor), g = B.options._parseFont(n), m = g.size; c.textAlign = h.textAlign("left"), c.textBaseline = "middle", c.lineWidth = .5, c.strokeStyle = f, c.fillStyle = f, c.font = g.string; var p = Ti(n, m), v = t.legendHitBoxes, b = function (t, i) { switch (e.align) { case "start": return n.padding; case "end": return t - i; default: return (t - i + n.padding) / 2 } }, y = t.isHorizontal(); d = y ? { x: t.left + b(l, u[0]), y: t.top + n.padding, line: 0 } : { x: t.left + n.padding, y: t.top + b(o, s[0]), line: 0 }, B.rtl.overrideTextDirection(t.ctx, e.textDirection); var x = m + n.padding; B.each(t.legendItems, (function (e, i) { var f = c.measureText(e.text).width, g = p + m / 2 + f, _ = d.x, w = d.y; h.setWidth(t.minSize.width), y ? i > 0 && _ + g + n.padding > t.left + t.minSize.width && (w = d.y += x, d.line++, _ = d.x = t.left + b(l, u[d.line])) : i > 0 && w + x > t.top + t.minSize.height && (_ = d.x = _ + t.columnWidths[d.line] + n.padding, d.line++, w = d.y = t.top + b(o, s[d.line])); var k = h.x(_); !function (t, e, i) { if (!(isNaN(p) || p <= 0)) { c.save(); var o = Pi(i.lineWidth, r.borderWidth); if (c.fillStyle = Pi(i.fillStyle, a), c.lineCap = Pi(i.lineCap, r.borderCapStyle), c.lineDashOffset = Pi(i.lineDashOffset, r.borderDashOffset), c.lineJoin = Pi(i.lineJoin, r.borderJoinStyle), c.lineWidth = o, c.strokeStyle = Pi(i.strokeStyle, a), c.setLineDash && c.setLineDash(Pi(i.lineDash, r.borderDash)), n && n.usePointStyle) { var s = p * Math.SQRT2 / 2, l = h.xPlus(t, p / 2), u = e + m / 2; B.canvas.drawPoint(c, i.pointStyle, s, l, u, i.rotation) } else c.fillRect(h.leftForLtr(t, p), e, p, m), 0 !== o && c.strokeRect(h.leftForLtr(t, p), e, p, m); c.restore() } }(k, w, e), v[i].left = h.leftForLtr(k, v[i].width), v[i].top = w, function (t, e, n, i) { var a = m / 2, r = h.xPlus(t, p + a), o = e + a; c.fillText(n.text, r, o), n.hidden && (c.beginPath(), c.lineWidth = 2, c.moveTo(r, o), c.lineTo(h.xPlus(r, i), o), c.stroke()) }(k, w, e, f), y ? d.x += g + n.padding : d.y += x })), B.rtl.restoreTextDirection(t.ctx, e.textDirection) } }, _getLegendItemAt: function (t, e) { var n, i, a, r = this; if (t >= r.left && t <= r.right && e >= r.top && e <= r.bottom) for (a = r.legendHitBoxes, n = 0; n < a.length; ++n)if (t >= (i = a[n]).left && t <= i.left + i.width && e >= i.top && e <= i.top + i.height) return r.legendItems[n]; return null }, handleEvent: function (t) { var e, n = this, i = n.options, a = "mouseup" === t.type ? "click" : t.type; if ("mousemove" === a) { if (!i.onHover && !i.onLeave) return } else { if ("click" !== a) return; if (!i.onClick) return } e = n._getLegendItemAt(t.x, t.y), "click" === a ? e && i.onClick && i.onClick.call(n, t.native, e) : (i.onLeave && e !== n._hoveredItem && (n._hoveredItem && i.onLeave.call(n, t.native, n._hoveredItem), n._hoveredItem = e), i.onHover && e && i.onHover.call(n, t.native, e)) } }); function Ai(t, e) { var n = new Oi({ ctx: t.ctx, options: e, chart: t }); pe.configure(t, n, e), pe.addBox(t, n), t.legend = n } var Fi = { id: "legend", _element: Oi, beforeInit: function (t) { var e = t.options.legend; e && Ai(t, e) }, beforeUpdate: function (t) { var e = t.options.legend, n = t.legend; e ? (B.mergeIf(e, Y.global.legend), n ? (pe.configure(t, n, e), n.options = e) : Ai(t, e)) : n && (pe.removeBox(t, n), delete t.legend) }, afterEvent: function (t, e) { var n = t.legend; n && n.handleEvent(e) } }, Ii = B.noop; Y._set("global", { title: { display: !1, fontStyle: "bold", fullWidth: !0, padding: 10, position: "top", text: "", weight: 2e3 } }); var Li = X.extend({ initialize: function (t) { B.extend(this, t), this.legendHitBoxes = [] }, beforeUpdate: Ii, update: function (t, e, n) { var i = this; return i.beforeUpdate(), i.maxWidth = t, i.maxHeight = e, i.margins = n, i.beforeSetDimensions(), i.setDimensions(), i.afterSetDimensions(), i.beforeBuildLabels(), i.buildLabels(), i.afterBuildLabels(), i.beforeFit(), i.fit(), i.afterFit(), i.afterUpdate(), i.minSize }, afterUpdate: Ii, beforeSetDimensions: Ii, setDimensions: function () { var t = this; t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0, t.minSize = { width: 0, height: 0 } }, afterSetDimensions: Ii, beforeBuildLabels: Ii, buildLabels: Ii, afterBuildLabels: Ii, beforeFit: Ii, fit: function () { var t, e = this, n = e.options, i = e.minSize = {}, a = e.isHorizontal(); n.display ? (t = (B.isArray(n.text) ? n.text.length : 1) * B.options._parseFont(n).lineHeight + 2 * n.padding, e.width = i.width = a ? e.maxWidth : t, e.height = i.height = a ? t : e.maxHeight) : e.width = i.width = e.height = i.height = 0 }, afterFit: Ii, isHorizontal: function () { var t = this.options.position; return "top" === t || "bottom" === t }, draw: function () { var t = this, e = t.ctx, n = t.options; if (n.display) { var i, a, r, o = B.options._parseFont(n), s = o.lineHeight, l = s / 2 + n.padding, u = 0, d = t.top, h = t.left, c = t.bottom, f = t.right; e.fillStyle = B.valueOrDefault(n.fontColor, Y.global.defaultFontColor), e.font = o.string, t.isHorizontal() ? (a = h + (f - h) / 2, r = d + l, i = f - h) : (a = "left" === n.position ? h + l : f - l, r = d + (c - d) / 2, i = c - d, u = Math.PI * ("left" === n.position ? -.5 : .5)), e.save(), e.translate(a, r), e.rotate(u), e.textAlign = "center", e.textBaseline = "middle"; var g = n.text; if (B.isArray(g)) for (var m = 0, p = 0; p < g.length; ++p)e.fillText(g[p], 0, m, i), m += s; else e.fillText(g, 0, 0, i); e.restore() } } }); function Ri(t, e) { var n = new Li({ ctx: t.ctx, options: e, chart: t }); pe.configure(t, n, e), pe.addBox(t, n), t.titleBlock = n } var Ni = {}, Wi = Si, Yi = Fi, zi = { id: "title", _element: Li, beforeInit: function (t) { var e = t.options.title; e && Ri(t, e) }, beforeUpdate: function (t) { var e = t.options.title, n = t.titleBlock; e ? (B.mergeIf(e, Y.global.title), n ? (pe.configure(t, n, e), n.options = e) : Ri(t, e)) : n && (pe.removeBox(t, n), delete t.titleBlock) } }; for (var Ei in Ni.filler = Wi, Ni.legend = Yi, Ni.title = zi, nn.helpers = B, function () { function t(t, e, n) { var i; return "string" == typeof t ? (i = parseInt(t, 10), -1 !== t.indexOf("%") && (i = i / 100 * e.parentNode[n])) : i = t, i } function e(t) { return null != t && "none" !== t } function n(n, i, a) { var r = document.defaultView, o = B._getParentNode(n), s = r.getComputedStyle(n)[i], l = r.getComputedStyle(o)[i], u = e(s), d = e(l), h = Number.POSITIVE_INFINITY; return u || d ? Math.min(u ? t(s, n, a) : h, d ? t(l, o, a) : h) : "none" } B.where = function (t, e) { if (B.isArray(t) && Array.prototype.filter) return t.filter(e); var n = []; return B.each(t, (function (t) { e(t) && n.push(t) })), n }, B.findIndex = Array.prototype.findIndex ? function (t, e, n) { return t.findIndex(e, n) } : function (t, e, n) { n = void 0 === n ? t : n; for (var i = 0, a = t.length; i < a; ++i)if (e.call(n, t[i], i, t)) return i; return -1 }, B.findNextWhere = function (t, e, n) { B.isNullOrUndef(n) && (n = -1); for (var i = n + 1; i < t.length; i++) { var a = t[i]; if (e(a)) return a } }, B.findPreviousWhere = function (t, e, n) { B.isNullOrUndef(n) && (n = t.length); for (var i = n - 1; i >= 0; i--) { var a = t[i]; if (e(a)) return a } }, B.isNumber = function (t) { return !isNaN(parseFloat(t)) && isFinite(t) }, B.almostEquals = function (t, e, n) { return Math.abs(t - e) < n }, B.almostWhole = function (t, e) { var n = Math.round(t); return n - e <= t && n + e >= t }, B.max = function (t) { return t.reduce((function (t, e) { return isNaN(e) ? t : Math.max(t, e) }), Number.NEGATIVE_INFINITY) }, B.min = function (t) { return t.reduce((function (t, e) { return isNaN(e) ? t : Math.min(t, e) }), Number.POSITIVE_INFINITY) }, B.sign = Math.sign ? function (t) { return Math.sign(t) } : function (t) { return 0 === (t = +t) || isNaN(t) ? t : t > 0 ? 1 : -1 }, B.toRadians = function (t) { return t * (Math.PI / 180) }, B.toDegrees = function (t) { return t * (180 / Math.PI) }, B._decimalPlaces = function (t) { if (B.isFinite(t)) { for (var e = 1, n = 0; Math.round(t * e) / e !== t;)e *= 10, n++; return n } }, B.getAngleFromPoint = function (t, e) { var n = e.x - t.x, i = e.y - t.y, a = Math.sqrt(n * n + i * i), r = Math.atan2(i, n); return r < -.5 * Math.PI && (r += 2 * Math.PI), { angle: r, distance: a } }, B.distanceBetweenPoints = function (t, e) { return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2)) }, B.aliasPixel = function (t) { return t % 2 == 0 ? 0 : .5 }, B._alignPixel = function (t, e, n) { var i = t.currentDevicePixelRatio, a = n / 2; return Math.round((e - a) * i) / i + a }, B.splineCurve = function (t, e, n, i) { var a = t.skip ? e : t, r = e, o = n.skip ? e : n, s = Math.sqrt(Math.pow(r.x - a.x, 2) + Math.pow(r.y - a.y, 2)), l = Math.sqrt(Math.pow(o.x - r.x, 2) + Math.pow(o.y - r.y, 2)), u = s / (s + l), d = l / (s + l), h = i * (u = isNaN(u) ? 0 : u), c = i * (d = isNaN(d) ? 0 : d); return { previous: { x: r.x - h * (o.x - a.x), y: r.y - h * (o.y - a.y) }, next: { x: r.x + c * (o.x - a.x), y: r.y + c * (o.y - a.y) } } }, B.EPSILON = Number.EPSILON || 1e-14, B.splineCurveMonotone = function (t) { var e, n, i, a, r, o, s, l, u, d = (t || []).map((function (t) { return { model: t._model, deltaK: 0, mK: 0 } })), h = d.length; for (e = 0; e < h; ++e)if (!(i = d[e]).model.skip) { if (n = e > 0 ? d[e - 1] : null, (a = e < h - 1 ? d[e + 1] : null) && !a.model.skip) { var c = a.model.x - i.model.x; i.deltaK = 0 !== c ? (a.model.y - i.model.y) / c : 0 } !n || n.model.skip ? i.mK = i.deltaK : !a || a.model.skip ? i.mK = n.deltaK : this.sign(n.deltaK) !== this.sign(i.deltaK) ? i.mK = 0 : i.mK = (n.deltaK + i.deltaK) / 2 } for (e = 0; e < h - 1; ++e)i = d[e], a = d[e + 1], i.model.skip || a.model.skip || (B.almostEquals(i.deltaK, 0, this.EPSILON) ? i.mK = a.mK = 0 : (r = i.mK / i.deltaK, o = a.mK / i.deltaK, (l = Math.pow(r, 2) + Math.pow(o, 2)) <= 9 || (s = 3 / Math.sqrt(l), i.mK = r * s * i.deltaK, a.mK = o * s * i.deltaK))); for (e = 0; e < h; ++e)(i = d[e]).model.skip || (n = e > 0 ? d[e - 1] : null, a = e < h - 1 ? d[e + 1] : null, n && !n.model.skip && (u = (i.model.x - n.model.x) / 3, i.model.controlPointPreviousX = i.model.x - u, i.model.controlPointPreviousY = i.model.y - u * i.mK), a && !a.model.skip && (u = (a.model.x - i.model.x) / 3, i.model.controlPointNextX = i.model.x + u, i.model.controlPointNextY = i.model.y + u * i.mK)) }, B.nextItem = function (t, e, n) { return n ? e >= t.length - 1 ? t[0] : t[e + 1] : e >= t.length - 1 ? t[t.length - 1] : t[e + 1] }, B.previousItem = function (t, e, n) { return n ? e <= 0 ? t[t.length - 1] : t[e - 1] : e <= 0 ? t[0] : t[e - 1] }, B.niceNum = function (t, e) { var n = Math.floor(B.log10(t)), i = t / Math.pow(10, n); return (e ? i < 1.5 ? 1 : i < 3 ? 2 : i < 7 ? 5 : 10 : i <= 1 ? 1 : i <= 2 ? 2 : i <= 5 ? 5 : 10) * Math.pow(10, n) }, B.requestAnimFrame = "undefined" == typeof window ? function (t) { t() } : window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (t) { return window.setTimeout(t, 1e3 / 60) }, B.getRelativePosition = function (t, e) { var n, i, a = t.originalEvent || t, r = t.target || t.srcElement, o = r.getBoundingClientRect(), s = a.touches; s && s.length > 0 ? (n = s[0].clientX, i = s[0].clientY) : (n = a.clientX, i = a.clientY); var l = parseFloat(B.getStyle(r, "padding-left")), u = parseFloat(B.getStyle(r, "padding-top")), d = parseFloat(B.getStyle(r, "padding-right")), h = parseFloat(B.getStyle(r, "padding-bottom")), c = o.right - o.left - l - d, f = o.bottom - o.top - u - h; return { x: n = Math.round((n - o.left - l) / c * r.width / e.currentDevicePixelRatio), y: i = Math.round((i - o.top - u) / f * r.height / e.currentDevicePixelRatio) } }, B.getConstraintWidth = function (t) { return n(t, "max-width", "clientWidth") }, B.getConstraintHeight = function (t) { return n(t, "max-height", "clientHeight") }, B._calculatePadding = function (t, e, n) { return (e = B.getStyle(t, e)).indexOf("%") > -1 ? n * parseInt(e, 10) / 100 : parseInt(e, 10) }, B._getParentNode = function (t) { var e = t.parentNode; return e && "[object ShadowRoot]" === e.toString() && (e = e.host), e }, B.getMaximumWidth = function (t) { var e = B._getParentNode(t); if (!e) return t.clientWidth; var n = e.clientWidth, i = n - B._calculatePadding(e, "padding-left", n) - B._calculatePadding(e, "padding-right", n), a = B.getConstraintWidth(t); return isNaN(a) ? i : Math.min(i, a) }, B.getMaximumHeight = function (t) { var e = B._getParentNode(t); if (!e) return t.clientHeight; var n = e.clientHeight, i = n - B._calculatePadding(e, "padding-top", n) - B._calculatePadding(e, "padding-bottom", n), a = B.getConstraintHeight(t); return isNaN(a) ? i : Math.min(i, a) }, B.getStyle = function (t, e) { return t.currentStyle ? t.currentStyle[e] : document.defaultView.getComputedStyle(t, null).getPropertyValue(e) }, B.retinaScale = function (t, e) { var n = t.currentDevicePixelRatio = e || "undefined" != typeof window && window.devicePixelRatio || 1; if (1 !== n) { var i = t.canvas, a = t.height, r = t.width; i.height = a * n, i.width = r * n, t.ctx.scale(n, n), i.style.height || i.style.width || (i.style.height = a + "px", i.style.width = r + "px") } }, B.fontString = function (t, e, n) { return e + " " + t + "px " + n }, B.longestText = function (t, e, n, i) { var a = (i = i || {}).data = i.data || {}, r = i.garbageCollect = i.garbageCollect || []; i.font !== e && (a = i.data = {}, r = i.garbageCollect = [], i.font = e), t.font = e; var o, s, l, u, d, h = 0, c = n.length; for (o = 0; o < c; o++)if (null != (u = n[o]) && !0 !== B.isArray(u)) h = B.measureText(t, a, r, h, u); else if (B.isArray(u)) for (s = 0, l = u.length; s < l; s++)null == (d = u[s]) || B.isArray(d) || (h = B.measureText(t, a, r, h, d)); var f = r.length / 2; if (f > n.length) { for (o = 0; o < f; o++)delete a[r[o]]; r.splice(0, f) } return h }, B.measureText = function (t, e, n, i, a) { var r = e[a]; return r || (r = e[a] = t.measureText(a).width, n.push(a)), r > i && (i = r), i }, B.numberOfLabelLines = function (t) { var e = 1; return B.each(t, (function (t) { B.isArray(t) && t.length > e && (e = t.length) })), e }, B.color = w ? function (t) { return t instanceof CanvasGradient && (t = Y.global.defaultColor), w(t) } : function (t) { return console.error("Color.js not found!"), t }, B.getHoverColor = function (t) { return t instanceof CanvasPattern || t instanceof CanvasGradient ? t : B.color(t).saturate(.5).darken(.1).rgbString() } }(), nn._adapters = on, nn.Animation = J, nn.animationService = Q, nn.controllers = Qt, nn.DatasetController = at, nn.defaults = Y, nn.Element = X, nn.elements = kt, nn.Interaction = oe, nn.layouts = pe, nn.platform = Le, nn.plugins = Re, nn.Scale = _n, nn.scaleService = Ne, nn.Ticks = sn, nn.Tooltip = qe, nn.helpers.each(gi, (function (t, e) { nn.scaleService.registerScaleType(e, t, t._defaults) })), Ni) Ni.hasOwnProperty(Ei) && nn.plugins.register(Ni[Ei]); nn.platform.initialize(); var Vi = nn; return "undefined" != typeof window && (window.Chart = nn), nn.Chart = nn, nn.Legend = Ni.legend._element, nn.Title = Ni.title._element, nn.pluginService = nn.plugins, nn.PluginBase = nn.Element.extend({}), nn.canvasHelpers = nn.helpers.canvas, nn.layoutService = nn.layouts, nn.LinearScaleBase = Cn, nn.helpers.each(["Bar", "Bubble", "Doughnut", "Line", "PolarArea", "Radar", "Scatter"], (function (t) { nn[t] = function (e, n) { return new nn(e, nn.helpers.merge(n || {}, { type: t.charAt(0).toLowerCase() + t.slice(1) })) } })), Vi })); + + + /*! + * chartjs-plugin-annotation.js + * http://chartjs.org/ + * Version: 0.5.7 + * + * Copyright 2016 Evert Timberg + * Released under the MIT license + * https://github.com/chartjs/Chart.Annotation.js/blob/master/LICENSE.md + */ + !function e(t,n,i){function o(r,l){if(!n[r]){if(!t[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(a)return a(r,!0);var c=new Error("Cannot find module '"+r+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[r]={exports:{}};t[r][0].call(u.exports,function(e){var n=t[r][1][e];return o(n?n:e)},u,u.exports,e,t,n,i)}return n[r].exports}for(var a="function"==typeof require&&require,r=0;r0){var n=e.chart.canvas,i=r.dispatcher.bind(e);r.collapseHoverEvents(t).forEach(function(t){o.addEvent(n,t,i),e.annotation.onDestroy.push(function(){o.removeEvent(n,t,i)})})}},destroy:function(e){for(var t=e.annotation.onDestroy;t.length>0;)t.pop()()}}}},{"./events.js":4,"./helpers.js":5}],3:[function(e,t,n){t.exports=function(e){var t=e.helpers,n=e.Element.extend({initialize:function(){this.hidden=!1,this.hovering=!1,this._model=t.clone(this._model)||{},this.setDataLimits()},destroy:function(){},setDataLimits:function(){},configure:function(){},inRange:function(){},getCenterPoint:function(){},getWidth:function(){},getHeight:function(){},getArea:function(){},draw:function(){}});return n}},{}],4:[function(e,t,n){t.exports=function(t){function n(e){var t=!1,n=e.filter(function(e){switch(e){case"mouseenter":case"mouseover":case"mouseout":case"mouseleave":return t=!0,!1;default:return!0}});return t&&n.indexOf("mousemove")===-1&&n.push("mousemove"),n}function i(e){var t=this.annotation,i=a.elements(this),r=o.getRelativePosition(e,this.chart),l=a.getNearestItems(i,r),s=n(t.options.events),c=t.options.dblClickSpeed,u=[],f=a.getEventHandlerName(e.type),d=(l||{}).options;if("mousemove"===e.type&&(l&&!l.hovering?["mouseenter","mouseover"].forEach(function(t){var n=a.getEventHandlerName(t),i=a.createMouseEvent(t,e);l.hovering=!0,"function"==typeof d[n]&&u.push([d[n],i,l])}):l||i.forEach(function(t){if(t.hovering){t.hovering=!1;var n=t.options;["mouseout","mouseleave"].forEach(function(i){var o=a.getEventHandlerName(i),r=a.createMouseEvent(i,e);"function"==typeof n[o]&&u.push([n[o],r,t])})}})),l&&s.indexOf("dblclick")>-1&&"function"==typeof d.onDblclick){if("click"===e.type&&"function"==typeof d.onClick)return clearTimeout(l.clickTimeout),l.clickTimeout=setTimeout(function(){delete l.clickTimeout,d.onClick.call(l,e)},c),e.stopImmediatePropagation(),void e.preventDefault();"dblclick"===e.type&&l.clickTimeout&&(clearTimeout(l.clickTimeout),delete l.clickTimeout)}l&&"function"==typeof d[f]&&0===u.length&&u.push([d[f],e,l]),u.length>0&&(e.stopImmediatePropagation(),e.preventDefault(),u.forEach(function(e){e[0].call(e[2],e[1])}))}var o=t.helpers,a=e("./helpers.js")(t);return{dispatcher:i,collapseHoverEvents:n}}},{"./helpers.js":5}],5:[function(e,t,n){function i(){}function o(e){var t=e.annotation.elements;return Object.keys(t).map(function(e){return t[e]})}function a(){return Math.random().toString(36).substr(2,6)}function r(e){return null!==e&&"undefined"!=typeof e&&("number"==typeof e?isFinite(e):!!e)}function l(e,t,n){var i="$";e[i+t]||(e[t]?(e[i+t]=e[t].bind(e),e[t]=function(){var o=[e[i+t]].concat(Array.prototype.slice.call(arguments));return n.apply(e,o)}):e[t]=function(){var t=[void 0].concat(Array.prototype.slice.call(arguments));return n.apply(e,t)})}function s(e,t){e.forEach(function(e){(t?e[t]:e)()})}function c(e){return"on"+e[0].toUpperCase()+e.substring(1)}function u(e,t){try{return new MouseEvent(e,t)}catch(n){try{var i=document.createEvent("MouseEvent");return i.initMouseEvent(e,t.canBubble,t.cancelable,t.view,t.detail,t.screenX,t.screenY,t.clientX,t.clientY,t.ctrlKey,t.altKey,t.shiftKey,t.metaKey,t.button,t.relatedTarget),i}catch(o){var a=document.createEvent("Event");return a.initEvent(e,t.canBubble,t.cancelable),a}}}t.exports=function(e){function t(t){return t=h.configMerge(e.Annotation.defaults,t),h.isArray(t.annotations)&&t.annotations.forEach(function(t){t.label=h.configMerge(e.Annotation.labelDefaults,t.label)}),t}function n(e,t,n,i){var o=t.filter(function(t){return!!t._model.ranges[e]}).map(function(t){return t._model.ranges[e]}),a=o.map(function(e){return Number(e.min)}).reduce(function(e,t){return isFinite(t)&&!isNaN(t)&&te?t:e},i);return{min:a,max:r}}function f(e){var t=n(e.id,o(e.chart),e.min,e.max);"undefined"==typeof e.options.ticks.min&&"undefined"==typeof e.options.ticks.suggestedMin&&(e.min=t.min),"undefined"==typeof e.options.ticks.max&&"undefined"==typeof e.options.ticks.suggestedMax&&(e.max=t.max),e.handleTickRangeOptions&&e.handleTickRangeOptions()}function d(e,t){var n=Number.POSITIVE_INFINITY;return e.filter(function(e){return e.inRange(t.x,t.y)}).reduce(function(e,i){var o=i.getCenterPoint(),a=h.distanceBetweenPoints(t,o);return ai||n=n.left&&e<=n.right&&t>=n.top&&t<=n.bottom},getCenterPoint:function(){var e=this._model;return{x:(e.right+e.left)/2,y:(e.bottom+e.top)/2}},getWidth:function(){var e=this._model;return Math.abs(e.right-e.left)},getHeight:function(){var e=this._model;return Math.abs(e.bottom-e.top)},getArea:function(){return this.getWidth()*this.getHeight()},draw:function(){var e=this._view,t=this.chartInstance.chart.ctx;t.save(),t.beginPath(),t.rect(e.clip.x1,e.clip.y1,e.clip.x2-e.clip.x1,e.clip.y2-e.clip.y1),t.clip(),t.lineWidth=e.borderWidth,t.strokeStyle=e.borderColor,t.fillStyle=e.backgroundColor;var n=e.right-e.left,i=e.bottom-e.top;t.fillRect(e.left,e.top,n,i),t.strokeRect(e.left,e.top,n,i),t.restore()}});return i}},{"../helpers.js":5}],8:[function(e,t,n){t.exports=function(t){function n(e){var t=(e.x2-e.x1)/(e.y2-e.y1),n=e.x1||0;this.m=t,this.b=n,this.getX=function(i){return t*(i-e.y1)+n},this.getY=function(i){return(i-n)/t+e.y1},this.intersects=function(e,t,n){n=n||.001;var i=this.getY(e),o=this.getX(t);return(!isFinite(i)||Math.abs(t-i)=n.labelX&&e<=n.labelX+n.labelWidth&&t>=n.labelY&&t<=n.labelY+n.labelHeight},getCenterPoint:function(){return{x:(this._model.x2+this._model.x1)/2,y:(this._model.y2+this._model.y1)/2}},getWidth:function(){return Math.abs(this._model.right-this._model.left)},getHeight:function(){return this._model.borderWidth||1},getArea:function(){return Math.sqrt(Math.pow(this.getWidth(),2)+Math.pow(this.getHeight(),2))},draw:function(){var e=this._view,t=this.chartInstance.chart.ctx;e.clip&&(t.save(),t.beginPath(),t.rect(e.clip.x1,e.clip.y1,e.clip.x2-e.clip.x1,e.clip.y2-e.clip.y1),t.clip(),t.lineWidth=e.borderWidth,t.strokeStyle=e.borderColor,t.setLineDash&&t.setLineDash(e.borderDash),t.lineDashOffset=e.borderDashOffset,t.beginPath(),t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.stroke(),e.labelEnabled&&e.labelContent&&(t.beginPath(),t.rect(e.clip.x1,e.clip.y1,e.clip.x2-e.clip.x1,e.clip.y2-e.clip.y1),t.clip(),t.fillStyle=e.labelBackgroundColor,o.drawRoundedRectangle(t,e.labelX,e.labelY,e.labelWidth,e.labelHeight,e.labelCornerRadius),t.fill(),t.font=o.fontString(e.labelFontSize,e.labelFontStyle,e.labelFontFamily),t.fillStyle=e.labelFontColor,t.textAlign="center",t.textBaseline="middle",t.fillText(e.labelContent,e.labelX+e.labelWidth/2,e.labelY+e.labelHeight/2)),t.restore())}});return s}},{"../helpers.js":5}]},{},[6]); + + }, 2000); +}); \ No newline at end of file diff --git a/config/custom_components/neerslag/home-assistant-neerslag-card/neerslag-card.js.gz b/config/custom_components/neerslag/home-assistant-neerslag-card/neerslag-card.js.gz new file mode 100644 index 0000000..3fce3e9 Binary files /dev/null and b/config/custom_components/neerslag/home-assistant-neerslag-card/neerslag-card.js.gz differ diff --git a/config/custom_components/neerslag/load_frontend.py b/config/custom_components/neerslag/load_frontend.py new file mode 100644 index 0000000..48a6214 --- /dev/null +++ b/config/custom_components/neerslag/load_frontend.py @@ -0,0 +1,17 @@ +from homeassistant.core import HomeAssistant +from homeassistant.components.frontend import add_extra_js_url +from aiohttp import web +import logging +import os +from .const import FRONTEND_SCRIPT_URL, DATA_EXTRA_MODULE_URL + +_LOGGER = logging.getLogger(__name__) + + +def setup_view(hass: HomeAssistant): + dir_path = os.path.dirname(os.path.realpath(__file__)) + path_to_file = "{}/home-assistant-neerslag-card/neerslag-card.js".format(dir_path) + should_cache = False + + hass.http.register_static_path(FRONTEND_SCRIPT_URL , str(path_to_file), should_cache) + add_extra_js_url(hass, FRONTEND_SCRIPT_URL, es5=False) diff --git a/config/custom_components/neerslag/manifest.json b/config/custom_components/neerslag/manifest.json new file mode 100644 index 0000000..597f616 --- /dev/null +++ b/config/custom_components/neerslag/manifest.json @@ -0,0 +1,17 @@ +{ + "domain": "neerslag", + "name": "Neerslag App (Buienalarm / Buienradar)", + "config_flow": true, + "documentation": "https://github.com/aex351/home-assistant-neerslag-app", + "requirements": [], + "ssdp": [], + "zeroconf": [], + "homekit": {}, + "dependencies": [], + "issue_tracker": "https://github.com/aex351/home-assistant-neerslag-app/issues", + "codeowners": [ + "@aex351" + ], + "iot_class" : "cloud_polling", + "version": "2021.05.04.0" +} \ No newline at end of file diff --git a/config/custom_components/neerslag/sensor.py b/config/custom_components/neerslag/sensor.py new file mode 100644 index 0000000..03cacd4 --- /dev/null +++ b/config/custom_components/neerslag/sensor.py @@ -0,0 +1,344 @@ +from homeassistant.block_async_io import enable +from homeassistant.helpers.entity_platform import EntityPlatform +import logging +from os import truncate +import aiohttp + +from random import random +import random as rand + +import json +from homeassistant.helpers.entity import Entity +from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, CONF_SOURCE +from datetime import timedelta +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import EntityPlatform, async_get_platforms + + +from homeassistant.helpers.entity_registry import ( + async_entries_for_config_entry, + async_entries_for_device, +) + + +_LOGGER = logging.getLogger(__name__) + +SCAN_INTERVAL = timedelta(seconds=180) + + +async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities): + """Set up sensor entity.""" + + # if config_entry.data.get("buienalarm") == True: + # async_add_entities([NeerslagSensorBuienalarm(hass, config_entry)], update_before_add=True) + + # if config_entry.data.get("buienradar") == True: + # async_add_entities([NeerslagSensorBuienradar(hass, config_entry)], update_before_add=True) + # # async_add_entities([NeerslagSensor(hass, config_entry)]) + + # entity_registry_obj = await hass.helpers.entity_registry.async_get_registry() + # registry_entry = entity_registry_obj.async_get(config_entry.unique_id) + + dev_reg = await hass.helpers.device_registry.async_get_registry() + ent_reg = await hass.helpers.entity_registry.async_get_registry() + + # dds = async_get_platforms(hass, "neerslag") + # _LOGGER.info(len(dds)) + # async_reset + + # _LOGGER.info("----------->>>") + # _LOGGER.info(dev_reg.devices) + # _LOGGER.info(ent_reg.entities) + + # xx = "neerslag_DummyABC" + # aa = ent_reg.async_get("sensor.neerslag_dummyabc") + + # _LOGGER.info("<<1aa<<<<<<<<<<<<<<<<<----------->>>") + # _LOGGER.info(aa) + # _LOGGER.info("<<>>") + + # bb = ent_reg.async_get_entity_id(domain='sensor', platform='neerslag', unique_id='neerslag-sensor-DummyABC') + # _LOGGER.info(bb) + # _LOGGER.info("<<>>") + + # cc = async_entries_for_config_entry(ent_reg, config_entry.entry_id) + # _LOGGER.info(cc) + # _LOGGER.info("<<>>") + + # ent_reg = hass.helpers.entity_registry.async_get_registry() + # aaa = ent_reg.async_get_entity_id("neerslag", "sensor", self._unique_id) + + # _LOGGER.info(aaa) + + # _LOGGER.info(config_entry.entry_id) + # _LOGGER.info(config_entry.unique_id) + + # rr = await config_entry.ConfigEntries.async_reload(config_entry.entry_id) + # _LOGGER.info(rr) + + # async_add_entities([DummyABC(hass, config_entry)], update_before_add=True) + # async_add_entities([DummyABC(hass, config_entry)], update_before_add=True) + + # if config_entry.data.get("buienalarm") == True: + # _LOGGER.info("<><><><>----------------<><<><>") + # async_add_entities([DummyABC(hass, config_entry, True)], update_before_add=True) + + # if config_entry.data.get("buienalarm") == False: + # async_add_entities([DummyABC(hass, config_entry, False)], update_before_add=False) + + # if config_entry.data.get("buienradar") == True: + # async_add_entities([DummyDEF(hass, config_entry, True)], update_before_add=True) + + # if config_entry.data.get("buienradar") == False: + # async_add_entities([DummyDEF(hass, config_entry, False)], update_before_add=False) + + if config_entry.data.get("buienalarm") == True: + async_add_entities([NeerslagSensorBuienalarm(hass, config_entry, True)], update_before_add=True) + + if config_entry.data.get("buienalarm") == False: + async_add_entities([NeerslagSensorBuienalarm(hass, config_entry, False)], update_before_add=False) + + if config_entry.data.get("buienradar") == True: + async_add_entities([NeerslagSensorBuienradar(hass, config_entry, True)], update_before_add=True) + + if config_entry.data.get("buienradar") == False: + async_add_entities([NeerslagSensorBuienradar(hass, config_entry, False)], update_before_add=False) + + # async_add_entities([NeerslagSensor(hass, config_entry)]) + + # device_registry = await hass.helpers.device_registry.async_get_registry() + # device_registry.async_get_or_create( + # config_entry_id=config_entry.entry_id, + # default_manufacturer="dummy data", + # default_model="dummy data", + # default_name="dummy data") + + +class mijnBasis(Entity): + _enabled = None + _unique_id = None + _name = None + + def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry, enabled: bool): + _LOGGER.info("--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>--->>>>>>>>>>>>>>>>>>>>>>>>") + # self._enabled = enabled + # config_entry.add_update_listener(self.mine_update_listener) + + async def mine_update_listener(self, hass: HomeAssistant, config_entry: ConfigEntry, pp=None): + """Handle options update.""" + + # if(self._name == "neerslag_DummyABC"): + # self._enabled = config_entry.data.get("buienalarm") + + # if(self._name == "neerslag_DummyDEF"): + # self._enabled = config_entry.data.get("buienradar") + + if(self._name == "neerslag_buienalarm_regen_data"): + self._enabled = config_entry.data.get("buienalarm") + + if(self._name == "neerslag_buienradar_regen_data"): + self._enabled = config_entry.data.get("buienradar") + + # self._enabled = config_entry.data.get(enabled) + # await hass.config_entries.async_remove(config_entry.entry_id) + # rr = hass.config_entries.async_entries(DOMAIN) + # hass.config_entries.async_update_entry(config_entry, data=config_entry.options) + # await hass.config_entries.async_reload(config_entry.entry_id) + + @property + def device_info(self): + return { + "identifiers": { + # Serial numbers are unique identifiers within a specific domain + ("neerslag", "neerslag-device") + }, + "name": "Neerslag App", + "manufacturer": "aex351", + "model": "All-in-one package", + "sw_version": "", + "via_device": ("neerslag", "abcd"), + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._enabled + + @ property + def state(self): + return self._state + + @ property + def name(self): + return self._name + + @ property + def unique_id(self): + """Return unique ID.""" + return self._unique_id + + async def async_update(self): + self._state = random() + return True + + +class DummyABC(mijnBasis): + def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry, enabled: bool): + super().__init__(hass=hass, config_entry=config_entry, enabled=enabled) + self._name = "neerslag_DummyABC" + self._state = "working" # None + self._attrs = ["data empty"] + self._unique_id = "neerslag-sensor-DummyABC" + + self._enabled = enabled + config_entry.add_update_listener(self.mine_update_listener) + + +class DummyDEF(mijnBasis): + def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry, enabled: bool): + super().__init__(hass=hass, config_entry=config_entry, enabled=enabled) + self._name = "neerslag_DummyDEF" + self._state = "working" # None + self._attrs = ["data empty"] + self._unique_id = "neerslag-sensor-DummyDEF" + + # _LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>") + # _LOGGER.info(config_entry.entry_id) + # _LOGGER.info(config_entry.unique_id) + + self._enabled = enabled + config_entry.add_update_listener(self.mine_update_listener) + + +class NeerslagSensorBuienalarm(mijnBasis): + def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry, enabled: bool): + super().__init__(hass=hass, config_entry=config_entry, enabled=enabled) + self._name = "neerslag_buienalarm_regen_data" + self._state = "working" # None + self._attrs = ["data empty"] + self._unique_id = "neerslag-sensor-buienalarm-1" + + self._enabled = enabled + config_entry.add_update_listener(self.mine_update_listener) + + if config_entry.data.get("NeerslagSensorUseHAforLocation") == True: + self._lat = hass.config.latitude + self._lon = hass.config.longitude + + else: + self._lat = config_entry.data.get("buienalarmLatitude") + self._lon = config_entry.data.get("buienalarmLongitude") + + # format values, enforce 3 decimals + self._lat = f'{float(self._lat):.3f}' + self._lon = f'{float(self._lon):.3f}' + + # self._entity_picture = "https://www.buienalarm.nl/assets/img/social.png" + self._icon = "mdi:weather-cloudy" + + @ property + def icon(self): + return self._icon + + @ property + def state_attributes(self): + if not len(self._attrs): + return + return self._attrs + # return {"data": self._attrs} + + async def async_update(self): + if(self._enabled == True): + self._state = random() + self._attrs = await self.getBuienalarmData() + return True + + async def getBuienalarmData(self) -> str: + data = json.loads('{"data":""}') + # return data + try: + timeout = aiohttp.ClientTimeout(total=5) + async with aiohttp.ClientSession() as session: + url = 'https://cdn-secure.buienalarm.nl/api/3.4/forecast.php?lat=' + self._lat + '&lon=' + self._lon + '®ion=nl&unit=mm%2Fu&c=' + str(rand.randint(0, 999999999999999)) + async with session.get(url, timeout=timeout) as response: + html = await response.text() + dataRequest = html.replace('\r\n', ' ') + if dataRequest == "" : + dataRequest = "" + data = json.loads('{"data":' + dataRequest + '}') + # _LOGGER.info(data) + await session.close() + except: + _LOGGER.info("getBuienalarmData - timeout") + pass + + return data + + +class NeerslagSensorBuienradar(mijnBasis): + def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry, enabled: bool): + super().__init__(hass=hass, config_entry=config_entry, enabled=enabled) + + self._name = "neerslag_buienradar_regen_data" + self._state = "working" # None + self._attrs = ["data empty"] + self._unique_id = "neerslag-sensor-buienradar-1" + + self._enabled = enabled + config_entry.add_update_listener(self.mine_update_listener) + + if config_entry.data.get("NeerslagSensorUseHAforLocation") == True: + self._lat = hass.config.latitude + self._lon = hass.config.longitude + + else: + self._lat = config_entry.data.get("buienradarLatitude") + self._lon = config_entry.data.get("buienradarLongitude") + + # format values, enforce 2 decimals + self._lat = f'{float(self._lat):.2f}' + self._lon = f'{float(self._lon):.2f}' + + # self._entity_picture = "https://cdn.buienradar.nl/resources/images/br-logo-square.png" + self._icon = "mdi:weather-cloudy" + + @ property + def icon(self): + return self._icon + + @ property + def state_attributes(self): + if not len(self._attrs): + return + return self._attrs + # return {"data": self._attrs} + + async def async_update(self): + if(self._enabled == True): + self._state = random() + self._attrs = await self.getBuienradarData() + return True + + async def getBuienradarData(self) -> str: + data = json.loads('{"data":""}') + # return data + try: + timeout = aiohttp.ClientTimeout(total=5) + async with aiohttp.ClientSession() as session: + # https://www.buienradar.nl/overbuienradar/gratis-weerdata + url = 'https://gps.buienradar.nl/getrr.php?lat=' + self._lat + '&lon=' + self._lon + '&c=' + str(rand.randint(0, 999999999999999)) + # _LOGGER.info(url) + async with session.get(url, timeout=timeout) as response: + html = await response.text() + dataRequest = html.replace('\r\n', ' ') + if dataRequest == "" : + dataRequest = "" + data = json.loads('{"data": "' + dataRequest + '"}') + # _LOGGER.info(data) + await session.close() + except: + _LOGGER.info("getBuienradarData - timeout") + pass + + return data diff --git a/config/custom_components/neerslag/strings.json b/config/custom_components/neerslag/strings.json new file mode 100644 index 0000000..ef15edd --- /dev/null +++ b/config/custom_components/neerslag/strings.json @@ -0,0 +1,51 @@ +{ + "title": "Neerslag App (Buienalarm / Buienradar)", + "config": { + "step": { + "user": { + "title" : "Neerslag App set-up", + "description" : "It can take a couple of minutes before the sensors to become active.", + "data": { + "host": "[%key:common::config_flow::data::host%]", + "username": "[%key:common::config_flow::data::username%]", + "password": "[%key:common::config_flow::data::password%]", + "buienradar": "Enable Buienradar", + "buienradarLatitude": "Latitude", + "buienradarLongitude": "Longitude", + "buienalarm": "Enable Buienalarm", + "buienalarmLatitude": "Latitude", + "buienalarmLongitude": "Longitude", + "NeerslagSensorUseHAforLocation" : "Use the location settings (latitude/longitude) of Home Assistant (Overrides all other location settings)" + } + } + }, + "error": { + "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", + "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", + "unknown": "[%key:common::config_flow::error::unknown%]" + }, + "abort": { + "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" + } + }, + "options":{ + "step": { + "init": { + "title" : "Neerslag App options", + "description" : "Changes (after clicking submit) take a couple of minutes to process.", + "data": { + "host": "[%key:common::config_flow::data::host%]", + "username": "[%key:common::config_flow::data::username%]", + "password": "[%key:common::config_flow::data::password%]", + "buienradar": "Enable Buienradar", + "buienradarLatitude": "Latitude", + "buienradarLongitude": "Longitude", + "buienalarm": "Enable Buienalarm", + "buienalarmLatitude": "Latitude", + "buienalarmLongitude": "Longitude", + "NeerslagSensorUseHAforLocation" : "Use the location settings (latitude/longitude) of Home Assistant (Overrides all other location settings)" + } + } + } + } +} \ No newline at end of file diff --git a/config/custom_components/neerslag/translations/en.json b/config/custom_components/neerslag/translations/en.json new file mode 100644 index 0000000..7d91f37 --- /dev/null +++ b/config/custom_components/neerslag/translations/en.json @@ -0,0 +1,51 @@ +{ + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "error": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "NeerslagSensorUseHAforLocation": "Use the location settings (latitude/longitude) of Home Assistant (Overrides all other location settings)", + "buienalarm": "Enable Buienalarm", + "buienalarmLatitude": "Latitude", + "buienalarmLongitude": "Longitude", + "buienradar": "Enable Buienradar", + "buienradarLatitude": "Latitude", + "buienradarLongitude": "Longitude", + "host": "Host", + "password": "Password", + "username": "Username" + }, + "description": "It can take a couple of minutes before the sensors to become active.", + "title": "Neerslag App set-up" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "NeerslagSensorUseHAforLocation": "Use the location settings (latitude/longitude) of Home Assistant (Overrides all other location settings)", + "buienalarm": "Enable Buienalarm", + "buienalarmLatitude": "Latitude", + "buienalarmLongitude": "Longitude", + "buienradar": "Enable Buienradar", + "buienradarLatitude": "Latitude", + "buienradarLongitude": "Longitude", + "host": "Host", + "password": "Password", + "username": "Username" + }, + "description": "Changes (after clicking submit) take a couple of minutes to process.", + "title": "Neerslag App options" + } + } + }, + "title": "Neerslag App (Buienalarm / Buienradar)" +} \ No newline at end of file diff --git a/config/custom_components/neerslag/translations/nl.json b/config/custom_components/neerslag/translations/nl.json new file mode 100644 index 0000000..119da9d --- /dev/null +++ b/config/custom_components/neerslag/translations/nl.json @@ -0,0 +1,51 @@ +{ + "config": { + "abort": { + "already_configured": "Het apparaat is al geconfigureerd" + }, + "error": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "NeerslagSensorUseHAforLocation": "Gebruik de locatie instellingen (latitude/longitude) van Home Assistant (deze optie overschrijft de andere locatie instellingen)", + "buienalarm": "Activeer Buienalarm", + "buienalarmLatitude": "Latitude", + "buienalarmLongitude": "Longitude", + "buienradar": "Activeer Buienradar", + "buienradarLatitude": "Latitude", + "buienradarLongitude": "Longitude", + "host": "Host", + "password": "Password", + "username": "Username" + }, + "description": "Het kan een paar minuten duren voordat de sensors geactiveerd zijn.", + "title": "Neerslag App set-up" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "NeerslagSensorUseHAforLocation": "Gebruik de locatie instellingen (latitude/longitude) van Home Assistant (deze optie overschrijft de andere locatie instellingen)", + "buienalarm": "Activeer Buienalarm", + "buienalarmLatitude": "Latitude", + "buienalarmLongitude": "Longitude", + "buienradar": "Activeer Buienradar", + "buienradarLatitude": "Latitude", + "buienradarLongitude": "Longitude", + "host": "Host", + "password": "Password", + "username": "Username" + }, + "description": "Het kan een paar minuten duren voordat de veranderingen verwerkt zijn.", + "title": "Neerslag App opties" + } + } + }, + "title": "Neerslag App (Buienalarm / Buienradar)" +} \ No newline at end of file