!function(t, e) { "object" == typeof exports && "object" == typeof module ? (t._Highcharts = e(), module.exports = t._Highcharts) : "function" == typeof define && define.amd ? define("highcharts/highcharts", [], e) : "object" == typeof exports ? (t._Highcharts = e(), exports.highcharts = t._Highcharts) : (t.Highcharts && t.Highcharts.error(16, !0), t.Highcharts = e()) }("undefined" == typeof window ? this : window, () => ( () => { "use strict"; let t, e; var i, s, o, r, a, n, h, l, d, c, p, g, u, f, m, x, y, b, v = {}; v.d = (t, e) => { for (var i in e) v.o(e, i) && !v.o(t, i) && Object.defineProperty(t, i, { enumerable: !0, get: e[i] }) } , v.o = (t, e) => Object.prototype.hasOwnProperty.call(t, e); var k = {}; v.d(k, { default: () => lE }), function(t) { t.SVG_NS = "http://www.w3.org/2000/svg", t.product = "Highcharts", t.version = "12.2.0", t.win = "undefined" != typeof window ? window : {}, t.doc = t.win.document, t.svg = !!t.doc?.createElementNS?.(t.SVG_NS, "svg")?.createSVGRect, t.pageLang = t.doc?.documentElement?.closest("[lang]")?.lang, t.userAgent = t.win.navigator?.userAgent || "", t.isChrome = t.win.chrome, t.isFirefox = -1 !== t.userAgent.indexOf("Firefox"), t.isMS = /(edge|msie|trident)/i.test(t.userAgent) && !t.win.opera, t.isSafari = !t.isChrome && -1 !== t.userAgent.indexOf("Safari"), t.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(t.userAgent), t.isWebKit = -1 !== t.userAgent.indexOf("AppleWebKit"), t.deg2rad = 2 * Math.PI / 360, t.marginNames = ["plotTop", "marginRight", "marginBottom", "plotLeft"], t.noop = function() {} , t.supportsPassiveEvents = function() { let e = !1; if (!t.isMS) { let i = Object.defineProperty({}, "passive", { get: function() { e = !0 } }); t.win.addEventListener && t.win.removeEventListener && (t.win.addEventListener("testPassive", t.noop, i), t.win.removeEventListener("testPassive", t.noop, i)) } return e }(), t.charts = [], t.composed = [], t.dateFormats = {}, t.seriesTypes = {}, t.symbolSizes = {}, t.chartCount = 0 }(i || (i = {})); let w = i , {charts: M, doc: S, win: T} = w; function C(t, e, i, s) { let o = e ? "Highcharts error" : "Highcharts warning"; 32 === t && (t = `${o}: Deprecated member`); let r = D(t) , a = r ? `${o} #${t}: www.highcharts.com/errors/${t}/` : t.toString(); if (void 0 !== s) { let t = ""; r && (a += "?"), j(s, function(e, i) { t += ` - ${i}: ${e}`, r && (a += encodeURI(i) + "=" + encodeURI(e)) }), a += t } U(w, "displayError", { chart: i, code: t, message: a, params: s }, function() { if (e) throw Error(a); T.console && -1 === C.messages.indexOf(a) && console.warn(a) }), C.messages.push(a) } function A(t, e) { return parseInt(t, e || 10) } function P(t) { return "string" == typeof t } function L(t) { let e = Object.prototype.toString.call(t); return "[object Array]" === e || "[object Array Iterator]" === e } function O(t, e) { return !!t && "object" == typeof t && (!e || !L(t)) } function E(t) { return O(t) && "number" == typeof t.nodeType } function I(t) { let e = t?.constructor; return !!(O(t, !0) && !E(t) && e?.name && "Object" !== e.name) } function D(t) { return "number" == typeof t && !isNaN(t) && t < 1 / 0 && t > -1 / 0 } function B(t) { return null != t } function N(t, e, i) { let s, o = P(e) && !B(i), r = (e, i) => { B(e) ? t.setAttribute(i, e) : o ? (s = t.getAttribute(i)) || "class" !== i || (s = t.getAttribute(i + "Name")) : t.removeAttribute(i) } ; return P(e) ? r(i, e) : j(e, r), s } function z(t) { return L(t) ? t : [t] } function R(t, e) { let i; for (i in t || (t = {}), e) t[i] = e[i]; return t } function W() { let t = arguments , e = t.length; for (let i = 0; i < e; i++) { let e = t[i]; if (null != e) return e } } function H(t, e) { R(t.style, e) } function F(t) { return Math.pow(10, Math.floor(Math.log(t) / Math.LN10)) } function X(t, e) { return t > 1e14 ? t : parseFloat(t.toPrecision(e || 14)) } (C || (C = {})).messages = [], Math.easeInOutSine = function(t) { return -.5 * (Math.cos(Math.PI * t) - 1) } ; let G = Array.prototype.find ? function(t, e) { return t.find(e) } : function(t, e) { let i, s = t.length; for (i = 0; i < s; i++) if (e(t[i], i)) return t[i] } ; function j(t, e, i) { for (let s in t) Object.hasOwnProperty.call(t, s) && e.call(i || t[s], t[s], s, t) } function Y(t, e, i) { function s(e, i) { let s = t.removeEventListener; s && s.call(t, e, i, !1) } function o(i) { let o, r; t.nodeName && (e ? (o = {})[e] = !0 : o = i, j(o, function(t, e) { if (i[e]) for (r = i[e].length; r--; ) s(e, i[e][r].fn) })) } let r = "function" == typeof t && t.prototype || t; if (Object.hasOwnProperty.call(r, "hcEvents")) { let t = r.hcEvents; if (e) { let r = t[e] || []; i ? (t[e] = r.filter(function(t) { return i !== t.fn }), s(e, i)) : (o(t), t[e] = []) } else o(t), delete r.hcEvents } } function U(t, e, i, s) { if (i = i || {}, S?.createEvent && (t.dispatchEvent || t.fireEvent && t !== w)) { let s = S.createEvent("Events"); s.initEvent(e, !0, !0), i = R(s, i), t.dispatchEvent ? t.dispatchEvent(i) : t.fireEvent(e, i) } else if (t.hcEvents) { i.target || R(i, { preventDefault: function() { i.defaultPrevented = !0 }, target: t, type: e }); let s = [] , o = t , r = !1; for (; o.hcEvents; ) Object.hasOwnProperty.call(o, "hcEvents") && o.hcEvents[e] && (s.length && (r = !0), s.unshift.apply(s, o.hcEvents[e])), o = Object.getPrototypeOf(o); r && s.sort( (t, e) => t.order - e.order), s.forEach(e => { !1 === e.fn.call(t, i) && i.preventDefault() } ) } s && !i.defaultPrevented && s.call(t, i) } let $ = function() { let e = Math.random().toString(36).substring(2, 9) + "-" , i = 0; return function() { return "highcharts-" + (t ? "" : e) + i++ } }(); T.jQuery && (T.jQuery.fn.highcharts = function() { let t = [].slice.call(arguments); if (this[0]) return t[0] ? (new w[P(t[0]) ? t.shift() : "Chart"](this[0],t[0],t[1]), this) : M[N(this[0], "data-highcharts-chart")] } ); let V = { addEvent: function(t, e, i, s={}) { let o = "function" == typeof t && t.prototype || t; Object.hasOwnProperty.call(o, "hcEvents") || (o.hcEvents = {}); let r = o.hcEvents; w.Point && t instanceof w.Point && t.series && t.series.chart && (t.series.chart.runTrackerClick = !0); let a = t.addEventListener; a && a.call(t, e, i, !!w.supportsPassiveEvents && { passive: void 0 === s.passive ? -1 !== e.indexOf("touch") : s.passive, capture: !1 }), r[e] || (r[e] = []); let n = { fn: i, order: "number" == typeof s.order ? s.order : 1 / 0 }; return r[e].push(n), r[e].sort( (t, e) => t.order - e.order), function() { Y(t, e, i) } }, arrayMax: function(t) { let e = t.length , i = t[0]; for (; e--; ) t[e] > i && (i = t[e]); return i }, arrayMin: function(t) { let e = t.length , i = t[0]; for (; e--; ) t[e] < i && (i = t[e]); return i }, attr: N, clamp: function(t, e, i) { return t > e ? t < i ? t : i : e }, clearTimeout: function(t) { B(t) && clearTimeout(t) }, correctFloat: X, createElement: function(t, e, i, s, o) { let r = S.createElement(t); return e && R(r, e), o && H(r, { padding: "0", border: "none", margin: "0" }), i && H(r, i), s && s.appendChild(r), r }, crisp: function(t, e=0, i) { let s = e % 2 / 2 , o = i ? -1 : 1; return (Math.round(t * o - s) + s) * o }, css: H, defined: B, destroyObjectProperties: function(t, e, i) { j(t, function(s, o) { s !== e && s?.destroy && s.destroy(), (s?.destroy || !i) && delete t[o] }) }, diffObjects: function(t, e, i, s) { let o = {}; return !function t(e, o, r, a) { let n = i ? o : e; j(e, function(i, h) { if (!a && s && s.indexOf(h) > -1 && o[h]) { i = z(i), r[h] = []; for (let e = 0; e < Math.max(i.length, o[h].length); e++) o[h][e] && (void 0 === i[e] ? r[h][e] = o[h][e] : (r[h][e] = {}, t(i[e], o[h][e], r[h][e], a + 1))) } else O(i, !0) && !i.nodeType ? (r[h] = L(i) ? [] : {}, t(i, o[h] || {}, r[h], a + 1), 0 === Object.keys(r[h]).length && ("colorAxis" !== h || 0 !== a) && delete r[h]) : (e[h] !== o[h] || h in e && !(h in o)) && "__proto__" !== h && "constructor" !== h && (r[h] = n[h]) }) }(t, e, o, 0), o }, discardElement: function(t) { t?.parentElement?.removeChild(t) }, erase: function(t, e) { let i = t.length; for (; i--; ) if (t[i] === e) { t.splice(i, 1); break } }, error: C, extend: R, extendClass: function(t, e) { let i = function() {}; return i.prototype = new t, R(i.prototype, e), i }, find: G, fireEvent: U, getAlignFactor: (t="") => ({ center: .5, right: 1, middle: .5, bottom: 1 })[t] || 0, getClosestDistance: function(t, e) { let i, s, o, r, a = !e; return t.forEach(t => { if (t.length > 1) for (r = s = t.length - 1; r > 0; r--) (o = t[r] - t[r - 1]) < 0 && !a ? (e?.(), e = void 0) : o && (void 0 === i || o < i) && (i = o) } ), i }, getMagnitude: F, getNestedProperty: function(t, e) { let i = t.split("."); for (; i.length && B(e); ) { let t = i.shift(); if (void 0 === t || "__proto__" === t) return; if ("this" === t) { let t; return O(e) && (t = e["@this"]), t ?? e } let s = e[t.replace(/[\\'"]/g, "")]; if (!B(s) || "function" == typeof s || "number" == typeof s.nodeType || s === T) return; e = s } return e }, getStyle: function t(e, i, s) { let o; if ("width" === i) { let i = Math.min(e.offsetWidth, e.scrollWidth) , s = e.getBoundingClientRect?.().width; return s < i && s >= i - 1 && (i = Math.floor(s)), Math.max(0, i - (t(e, "padding-left", !0) || 0) - (t(e, "padding-right", !0) || 0)) } if ("height" === i) return Math.max(0, Math.min(e.offsetHeight, e.scrollHeight) - (t(e, "padding-top", !0) || 0) - (t(e, "padding-bottom", !0) || 0)); let r = T.getComputedStyle(e, void 0); return r && (o = r.getPropertyValue(i), W(s, "opacity" !== i) && (o = A(o))), o }, insertItem: function(t, e) { let i, s = t.options.index, o = e.length; for (i = t.options.isInternal ? o : 0; i < o + 1; i++) if (!e[i] || D(s) && s < W(e[i].options.index, e[i]._i) || e[i].options.isInternal) { e.splice(i, 0, t); break } return i }, isArray: L, isClass: I, isDOMElement: E, isFunction: function(t) { return "function" == typeof t }, isNumber: D, isObject: O, isString: P, merge: function(t, ...e) { let i, s = [t, ...e], o = {}, r = function(t, e) { return "object" != typeof t && (t = {}), j(e, function(i, s) { "__proto__" !== s && "constructor" !== s && (!O(i, !0) || I(i) || E(i) ? t[s] = e[s] : t[s] = r(t[s] || {}, i)) }), t }; !0 === t && (o = s[1], s = Array.prototype.slice.call(s, 2)); let a = s.length; for (i = 0; i < a; i++) o = r(o, s[i]); return o }, normalizeTickInterval: function(t, e, i, s, o) { let r, a = t; i = W(i, F(t)); let n = t / i; for (!e && (e = o ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === s && (1 === i ? e = e.filter(function(t) { return t % 1 == 0 }) : i <= .1 && (e = [1 / i]))), r = 0; r < e.length && (a = e[r], (!o || !(a * i >= t)) && (o || !(n <= (e[r] + (e[r + 1] || e[r])) / 2))); r++) ; return X(a * i, -Math.round(Math.log(.001) / Math.LN10)) }, objectEach: j, offset: function(t) { let e = S.documentElement , i = t.parentElement || t.parentNode ? t.getBoundingClientRect() : { top: 0, left: 0, width: 0, height: 0 }; return { top: i.top + (T.pageYOffset || e.scrollTop) - (e.clientTop || 0), left: i.left + (T.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), width: i.width, height: i.height } }, pad: function(t, e, i) { return Array((e || 2) + 1 - String(t).replace("-", "").length).join(i || "0") + t }, pick: W, pInt: A, pushUnique: function(t, e) { return 0 > t.indexOf(e) && !!t.push(e) }, relativeLength: function(t, e, i) { return /%$/.test(t) ? e * parseFloat(t) / 100 + (i || 0) : parseFloat(t) }, removeEvent: Y, replaceNested: function(t, ...e) { let i, s; do for (s of (i = t, e)) t = t.replace(s[0], s[1]); while (t !== i); return t }, splat: z, stableSort: function(t, e) { let i, s, o = t.length; for (s = 0; s < o; s++) t[s].safeI = s; for (t.sort(function(t, s) { return 0 === (i = e(t, s)) ? t.safeI - s.safeI : i }), s = 0; s < o; s++) delete t[s].safeI }, syncTimeout: function(t, e, i) { return e > 0 ? setTimeout(t, e, i) : (t.call(0, i), -1) }, timeUnits: { millisecond: 1, second: 1e3, minute: 6e4, hour: 36e5, day: 864e5, week: 6048e5, month: 24192e5, year: 314496e5 }, ucfirst: function(t) { return P(t) ? t.substring(0, 1).toUpperCase() + t.substring(1) : String(t) }, uniqueKey: $, useSerialIds: function(e) { return t = W(e, t) }, wrap: function(t, e, i) { let s = t[e]; t[e] = function() { let t = arguments , e = this; return i.apply(this, [function() { return s.apply(e, arguments.length ? arguments : t) } ].concat([].slice.call(arguments))) } } } , {pageLang: Z, win: _} = w , {defined: q, error: K, extend: J, isNumber: Q, isObject: tt, isString: te, merge: ti, objectEach: ts, pad: to, splat: tr, timeUnits: ta, ucfirst: tn} = V , th = w.isSafari && _.Intl && !_.Intl.DateTimeFormat.prototype.formatRange , tl = t => void 0 === t.main , td = class { constructor(t, e) { this.options = { timezone: "UTC" }, this.variableTimezone = !1, this.Date = _.Date, this.update(t), this.lang = e } update(t={}) { this.dTLCache = {}, this.options = t = ti(!0, this.options, t); let {timezoneOffset: e, useUTC: i} = t; this.Date = t.Date || _.Date || Date; let s = t.timezone; q(i) && (s = i ? "UTC" : void 0), e && e % 60 == 0 && (s = "Etc/GMT" + (e > 0 ? "+" : "") + e / 60), this.variableTimezone = "UTC" !== s && s?.indexOf("Etc/GMT") !== 0, this.timezone = s, ["months", "shortMonths", "weekdays", "shortWeekdays"].forEach(t => { let e = /months/i.test(t) , i = /short/.test(t) , s = { timeZone: "UTC" }; s[e ? "month" : "weekday"] = i ? "short" : "long", this[t] = (e ? [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] : [3, 4, 5, 6, 7, 8, 9]).map(t => this.dateFormat(s, (e ? 31 : 1) * 24 * 36e5 * t)) } ) } toParts(t) { let[e,i,s,o,r,a,n] = this.dateTimeFormat({ weekday: "narrow", day: "numeric", month: "numeric", year: "numeric", hour: "numeric", minute: "numeric", second: "numeric" }, t, "es").split(/(?:, | |\/|:)/g); return [o, +s - 1, i, r, a, n, Math.floor(Number(t) || 0) % 1e3, "DLMXJVS".indexOf(e)].map(Number) } dateTimeFormat(t, e, i=this.options.locale || Z) { let s = JSON.stringify(t) + i; te(t) && (t = this.str2dtf(t)); let o = this.dTLCache[s]; if (!o) { t.timeZone ?? (t.timeZone = this.timezone); try { o = new Intl.DateTimeFormat(i,t) } catch (e) { /Invalid time zone/i.test(e.message) ? (K(34), t.timeZone = "UTC", o = new Intl.DateTimeFormat(i,t)) : K(e.message, !1) } } return this.dTLCache[s] = o, o?.format(e) || "" } str2dtf(t, e={}) { let i = { L: { fractionalSecondDigits: 3 }, S: { second: "2-digit" }, M: { minute: "numeric" }, H: { hour: "2-digit" }, k: { hour: "numeric" }, E: { weekday: "narrow" }, a: { weekday: "short" }, A: { weekday: "long" }, d: { day: "2-digit" }, e: { day: "numeric" }, b: { month: "short" }, B: { month: "long" }, m: { month: "2-digit" }, o: { month: "numeric" }, y: { year: "2-digit" }, Y: { year: "numeric" } }; return Object.keys(i).forEach(s => { -1 !== t.indexOf(s) && J(e, i[s]) } ), e } makeTime(t, e, i=1, s=0, o, r, a) { let n = this.Date.UTC(t, e, i, s, o || 0, r || 0, a || 0); if ("UTC" !== this.timezone) { let t = this.getTimezoneOffset(n); if (n += t, -1 !== [2, 3, 8, 9, 10, 11].indexOf(e) && (s < 5 || s > 20)) { let e = this.getTimezoneOffset(n); t !== e ? n += e - t : t - 36e5 !== this.getTimezoneOffset(n - 36e5) || th || (n -= 36e5) } } return n } parse(t) { if (!te(t)) return t ?? void 0; let e = (t = t.replace(/\//g, "-").replace(/(GMT|UTC)/, "")).indexOf("Z") > -1 || /([+-][0-9]{2}):?[0-9]{2}$/.test(t) , i = /^[0-9]{4}-[0-9]{2}(-[0-9]{2}|)$/.test(t); e || i || (t += "Z"); let s = Date.parse(t); if (Q(s)) return s + (!e || i ? this.getTimezoneOffset(s) : 0) } getTimezoneOffset(t) { if ("UTC" !== this.timezone) { let[e,i,s,o,r=0] = this.dateTimeFormat({ timeZoneName: "shortOffset" }, t, "en").split(/(GMT|:)/).map(Number) , a = -(36e5 * (s + r / 60)); if (Q(a)) return a } return 0 } dateFormat(t, e, i) { let s = this.lang; if (!q(e) || isNaN(e)) return s?.invalidDate || ""; if (te(t = t ?? "%Y-%m-%d %H:%M:%S")) { let i, o = /%\[([a-zA-Z]+)\]/g; for (; i = o.exec(t); ) t = t.replace(i[0], this.dateTimeFormat(i[1], e, s?.locale)) } if (te(t) && -1 !== t.indexOf("%")) { let i = this , [o,r,a,n,h,l,d,c] = this.toParts(e) , p = s?.weekdays || this.weekdays , g = s?.shortWeekdays || this.shortWeekdays , u = s?.months || this.months , f = s?.shortMonths || this.shortMonths; ts(J({ a: g ? g[c] : p[c].substr(0, 3), A: p[c], d: to(a), e: to(a, 2, " "), w: c, v: s?.weekFrom ?? "", b: f[r], B: u[r], m: to(r + 1), o: r + 1, y: o.toString().substr(2, 2), Y: o, H: to(n), k: n, I: to(n % 12 || 12), l: n % 12 || 12, M: to(h), p: n < 12 ? "AM" : "PM", P: n < 12 ? "am" : "pm", S: to(l), L: to(d, 3) }, w.dateFormats), function(s, o) { if (te(t)) for (; -1 !== t.indexOf("%" + o); ) t = t.replace("%" + o, "function" == typeof s ? s.call(i, e) : s) }) } else if (tt(t)) { let i = (this.getTimezoneOffset(e) || 0) / 36e5 , s = this.timezone || "Etc/GMT" + (i >= 0 ? "+" : "") + i , {prefix: o="", suffix: r=""} = t; t = o + this.dateTimeFormat(J({ timeZone: s }, t), e) + r } return i ? tn(t) : t } resolveDTLFormat(t) { return tt(t, !0) ? tt(t, !0) && tl(t) ? { main: t } : t : { main: (t = tr(t))[0], from: t[1], to: t[2] } } getDateFormat(t, e, i, s) { let o = this.dateFormat("%m-%d %H:%M:%S.%L", e) , r = "01-01 00:00:00.000" , a = { millisecond: 15, second: 12, minute: 9, hour: 6, day: 3 } , n = "millisecond" , h = n; for (n in ta) { if (t && t === ta.week && +this.dateFormat("%w", e) === i && o.substr(6) === r.substr(6)) { n = "week"; break } if (t && ta[n] > t) { n = h; break } if (a[n] && o.substr(a[n]) !== r.substr(a[n])) break; "week" !== n && (h = n) } return this.resolveDTLFormat(s[n]).main } } , {defined: tc, extend: tp, timeUnits: tg} = V , tu = class extends td { getTimeTicks(t, e, i, s) { let o = this, r = [], a = {}, {count: n=1, unitRange: h} = t, [l,d,c,p,g,u] = o.toParts(e), f = (e || 0) % 1e3, m; if (s ?? (s = 1), tc(e)) { if (f = h >= tg.second ? 0 : n * Math.floor(f / n), h >= tg.second && (u = h >= tg.minute ? 0 : n * Math.floor(u / n)), h >= tg.minute && (g = h >= tg.hour ? 0 : n * Math.floor(g / n)), h >= tg.hour && (p = h >= tg.day ? 0 : n * Math.floor(p / n)), h >= tg.day && (c = h >= tg.month ? 1 : Math.max(1, n * Math.floor(c / n))), h >= tg.month && (d = h >= tg.year ? 0 : n * Math.floor(d / n)), h >= tg.year && (l -= l % n), h === tg.week) { n && (e = o.makeTime(l, d, c, p, g, u, f)); let t = this.dateTimeFormat({ timeZone: this.timezone, weekday: "narrow" }, e, "es") , i = "DLMXJVS".indexOf(t); c += -i + s + (i < s ? -7 : 0) } e = o.makeTime(l, d, c, p, g, u, f), o.variableTimezone && tc(i) && (m = i - e > 4 * tg.month || o.getTimezoneOffset(e) !== o.getTimezoneOffset(i)); let t = e , x = 1; for (; t < i; ) r.push(t), h === tg.year ? t = o.makeTime(l + x * n, 0) : h === tg.month ? t = o.makeTime(l, d + x * n) : m && (h === tg.day || h === tg.week) ? t = o.makeTime(l, d, c + x * n * (h === tg.day ? 1 : 7)) : m && h === tg.hour && n > 1 ? t = o.makeTime(l, d, c, p + x * n) : t += h * n, x++; r.push(t), h <= tg.hour && r.length < 1e4 && r.forEach(t => { t % 18e5 == 0 && "000000000" === o.dateFormat("%H%M%S%L", t) && (a[t] = "day") } ) } return r.info = tp(t, { higherRanks: a, totalRange: h * n }), r } } , {isTouchDevice: tf} = w , {fireEvent: tm, merge: tx} = V , ty = { colors: ["#2caffe", "#544fc5", "#00e272", "#fe6a35", "#6b8abc", "#d568fb", "#2ee0ca", "#fa4b42", "#feb56a", "#91e8e1"], symbols: ["circle", "diamond", "square", "triangle", "triangle-down"], lang: { weekFrom: "week from", chartTitle: "Chart title", locale: void 0, loading: "Loading...", months: void 0, seriesName: "Series {add index 1}", shortMonths: void 0, weekdays: void 0, numericSymbols: ["k", "M", "G", "T", "P", "E"], pieSliceName: "Slice", resetZoom: "Reset zoom", yAxisTitle: "Values", resetZoomTitle: "Reset zoom level 1:1" }, global: { buttonTheme: { fill: "#f7f7f7", padding: 8, r: 2, stroke: "#cccccc", "stroke-width": 1, style: { color: "#333333", cursor: "pointer", fontSize: "0.8em", fontWeight: "normal" }, states: { hover: { fill: "#e6e6e6" }, select: { fill: "#e6e9ff", style: { color: "#000000", fontWeight: "bold" } }, disabled: { style: { color: "#cccccc" } } } } }, time: { Date: void 0, timezone: "UTC", timezoneOffset: 0, useUTC: void 0 }, chart: { alignThresholds: !1, panning: { enabled: !1, type: "x" }, styledMode: !1, borderRadius: 0, colorCount: 10, allowMutatingData: !0, ignoreHiddenSeries: !0, spacing: [10, 10, 15, 10], resetZoomButton: { theme: {}, position: {} }, reflow: !0, type: "line", zooming: { singleTouch: !1, resetButton: { theme: { zIndex: 6 }, position: { align: "right", x: -10, y: 10 } } }, width: null, height: null, borderColor: "#334eff", backgroundColor: "#ffffff", plotBorderColor: "#cccccc" }, title: { style: { color: "#333333", fontWeight: "bold" }, text: "Chart title", margin: 15, minScale: .67 }, subtitle: { style: { color: "#666666", fontSize: "0.8em" }, text: "" }, caption: { margin: 15, style: { color: "#666666", fontSize: "0.8em" }, text: "", align: "left", verticalAlign: "bottom" }, plotOptions: {}, legend: { enabled: !0, align: "center", alignColumns: !0, className: "highcharts-no-tooltip", events: {}, layout: "horizontal", itemMarginBottom: 2, itemMarginTop: 2, labelFormatter: function() { return this.name }, borderColor: "#999999", borderRadius: 0, navigation: { style: { fontSize: "0.8em" }, activeColor: "#0022ff", inactiveColor: "#cccccc" }, itemStyle: { color: "#333333", cursor: "pointer", fontSize: "0.8em", textDecoration: "none", textOverflow: "ellipsis" }, itemHoverStyle: { color: "#000000" }, itemHiddenStyle: { color: "#666666", textDecoration: "line-through" }, shadow: !1, itemCheckboxStyle: { position: "absolute", width: "13px", height: "13px" }, squareSymbol: !0, symbolPadding: 5, verticalAlign: "bottom", x: 0, y: 0, title: { style: { fontSize: "0.8em", fontWeight: "bold" } } }, loading: { labelStyle: { fontWeight: "bold", position: "relative", top: "45%" }, style: { position: "absolute", backgroundColor: "#ffffff", opacity: .5, textAlign: "center" } }, tooltip: { enabled: !0, animation: { duration: 300, easing: t => Math.sqrt(1 - Math.pow(t - 1, 2)) }, borderRadius: 3, dateTimeLabelFormats: { millisecond: "%[AebHMSL]", second: "%[AebHMS]", minute: "%[AebHM]", hour: "%[AebHM]", day: "%[AebY]", week: "%v %[AebY]", month: "%[BY]", year: "%Y" }, footerFormat: "", headerShape: "callout", hideDelay: 500, padding: 8, position: { x: 0, y: 3 }, shared: !1, snap: tf ? 25 : 10, headerFormat: '{ucfirst point.key}
', pointFormat: ' {series.name}: {point.y}
', backgroundColor: "#ffffff", borderWidth: void 0, stickOnContact: !1, style: { color: "#333333", cursor: "default", fontSize: "0.8em" }, useHTML: !1 }, credits: { enabled: !0, href: "https://www.highcharts.com?credits", position: { align: "right", x: -10, verticalAlign: "bottom", y: -5 }, style: { cursor: "pointer", color: "#999999", fontSize: "0.6em" }, text: "Highcharts.com" } } , tb = new tu(ty.time,ty.lang) , tv = { defaultOptions: ty, defaultTime: tb, getOptions: function() { return ty }, setOptions: function(t) { return tm(w, "setOptions", { options: t }), tx(!0, ty, t), t.time && tb.update(ty.time), t.lang && "locale"in t.lang && tb.update({ locale: t.lang.locale }), t.lang?.chartTitle && (ty.title = { ...ty.title, text: t.lang.chartTitle }), ty } } , {win: tk} = w , {isNumber: tw, isString: tM, merge: tS, pInt: tT, defined: tC} = V , tA = (t, e, i) => `color-mix(in srgb,${t},${e} ${100 * i}%)` , tP = t => tM(t) && !!t && "none" !== t; class tL { static parse(t) { return t ? new tL(t) : tL.None } constructor(t) { let e, i, s, o; this.rgba = [NaN, NaN, NaN, NaN], this.input = t; let r = w.Color; if (r && r !== tL) return new r(t); if ("object" == typeof t && void 0 !== t.stops) this.stops = t.stops.map(t => new tL(t[1])); else if ("string" == typeof t) for (this.input = t = tL.names[t.toLowerCase()] || t, s = tL.parsers.length; s-- && !i; ) (e = (o = tL.parsers[s]).regex.exec(t)) && (i = o.parse(e)); i && (this.rgba = i) } get(t) { let e = this.input , i = this.rgba; if (this.output) return this.output; if ("object" == typeof e && void 0 !== this.stops) { let i = tS(e); return i.stops = [].slice.call(i.stops), this.stops.forEach( (e, s) => { i.stops[s] = [i.stops[s][0], e.get(t)] } ), i } return i && tw(i[0]) ? "rgb" !== t && (t || 1 !== i[3]) ? "a" === t ? `${i[3]}` : "rgba(" + i.join(",") + ")" : "rgb(" + i[0] + "," + i[1] + "," + i[2] + ")" : e } brighten(t) { let e = this.rgba; if (this.stops) this.stops.forEach(function(e) { e.brighten(t) }); else if (tw(t) && 0 !== t) { if (tw(e[0])) for (let i = 0; i < 3; i++) e[i] += tT(255 * t), e[i] < 0 && (e[i] = 0), e[i] > 255 && (e[i] = 255); else tL.useColorMix && tP(this.input) && (this.output = tA(this.input, t > 0 ? "white" : "black", Math.abs(t))) } return this } setOpacity(t) { return this.rgba[3] = t, this } tweenTo(t, e) { let i = this.rgba , s = t.rgba; if (!tw(i[0]) || !tw(s[0])) return tL.useColorMix && tP(this.input) && tP(t.input) && e < .99 ? tA(this.input, t.input, e) : t.input || "none"; let o = 1 !== s[3] || 1 !== i[3] , r = (t, s) => t + (i[s] - t) * (1 - e) , a = s.slice(0, 3).map(r).map(Math.round); return o && a.push(r(s[3], 3)), (o ? "rgba(" : "rgb(") + a.join(",") + ")" } } tL.names = { white: "#ffffff", black: "#000000" }, tL.parsers = [{ regex: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?(?:\.\d+)?)\s*\)/, parse: function(t) { return [tT(t[1]), tT(t[2]), tT(t[3]), parseFloat(t[4], 10)] } }, { regex: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/, parse: function(t) { return [tT(t[1]), tT(t[2]), tT(t[3]), 1] } }, { regex: /^#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?$/i, parse: function(t) { return [tT(t[1] + t[1], 16), tT(t[2] + t[2], 16), tT(t[3] + t[3], 16), tC(t[4]) ? tT(t[4] + t[4], 16) / 255 : 1] } }, { regex: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?$/i, parse: function(t) { return [tT(t[1], 16), tT(t[2], 16), tT(t[3], 16), tC(t[4]) ? tT(t[4], 16) / 255 : 1] } }], tL.useColorMix = tk.CSS?.supports("color", "color-mix(in srgb,red,blue 9%)"), tL.None = new tL(""); let {parse: tO} = tL , {win: tE} = w , {isNumber: tI, objectEach: tD} = V; class tB { constructor(t, e, i) { this.pos = NaN, this.options = e, this.elem = t, this.prop = i } dSetter() { let t = this.paths , e = t?.[0] , i = t?.[1] , s = this.now || 0 , o = []; if (1 !== s && e && i) { if (e.length === i.length && s < 1) for (let t = 0; t < i.length; t++) { let r = e[t] , a = i[t] , n = []; for (let t = 0; t < a.length; t++) { let e = r[t] , i = a[t]; tI(e) && tI(i) && ("A" !== a[0] || 4 !== t && 5 !== t) ? n[t] = e + s * (i - e) : n[t] = i } o.push(n) } else o = i } else o = this.toD || []; this.elem.attr("d", o, void 0, !0) } update() { let t = this.elem , e = this.prop , i = this.now , s = this.options.step; this[e + "Setter"] ? this[e + "Setter"]() : t.attr ? t.element && t.attr(e, i, null, !0) : t.style[e] = i + this.unit, s && s.call(t, i, this) } run(t, e, i) { let s = this , o = s.options , r = function(t) { return !r.stopped && s.step(t) } , a = tE.requestAnimationFrame || function(t) { setTimeout(t, 13) } , n = function() { for (let t = 0; t < tB.timers.length; t++) tB.timers[t]() || tB.timers.splice(t--, 1); tB.timers.length && a(n) }; t !== e || this.elem["forceAnimate:" + this.prop] ? (this.startTime = +new Date, this.start = t, this.end = e, this.unit = i, this.now = this.start, this.pos = 0, r.elem = this.elem, r.prop = this.prop, r() && 1 === tB.timers.push(r) && a(n)) : (delete o.curAnim[this.prop], o.complete && 0 === Object.keys(o.curAnim).length && o.complete.call(this.elem)) } step(t) { let e, i, s = +new Date, o = this.options, r = this.elem, a = o.complete, n = o.duration, h = o.curAnim; return r.attr && !r.element ? e = !1 : t || s >= n + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), h[this.prop] = !0, i = !0, tD(h, function(t) { !0 !== t && (i = !1) }), i && a && a.call(r), e = !1) : (this.pos = o.easing((s - this.startTime) / n), this.now = this.start + (this.end - this.start) * this.pos, this.update(), e = !0), e } initPath(t, e, i) { let s = t.startX, o = t.endX, r = i.slice(), a = t.isArea, n = a ? 2 : 1, h = e && i.length > e.length && i.hasStackedCliffs, l, d, c, p, g = e?.slice(); if (!g || h) return [r, r]; function u(t, e) { for (; t.length < d; ) { let i = t[0] , s = e[d - t.length]; if (s && "M" === i[0] && ("C" === s[0] ? t[0] = ["C", i[1], i[2], i[1], i[2], i[1], i[2]] : t[0] = ["L", i[1], i[2]]), t.unshift(i), a) { let e = t.pop(); t.push(t[t.length - 1], e) } } } function f(t) { for (; t.length < d; ) { let e = t[Math.floor(t.length / n) - 1].slice(); if ("C" === e[0] && (e[1] = e[5], e[2] = e[6]), a) { let i = t[Math.floor(t.length / n)].slice(); t.splice(t.length / 2, 0, e, i) } else t.push(e) } } if (s && o && o.length) { for (c = 0; c < s.length; c++) { if (s[c] === o[0]) { l = c; break } if (s[0] === o[o.length - s.length + c]) { l = c, p = !0; break } if (s[s.length - 1] === o[o.length - s.length + c]) { l = s.length - c; break } } void 0 === l && (g = []) } return g.length && tI(l) && (d = r.length + l * n, p ? (u(g, r), f(r)) : (u(r, g), f(g))), [g, r] } fillSetter() { tB.prototype.strokeSetter.apply(this, arguments) } strokeSetter() { this.elem.attr(this.prop, tO(this.start).tweenTo(tO(this.end), this.pos), void 0, !0) } } tB.timers = []; let {defined: tN, getStyle: tz, isArray: tR, isNumber: tW, isObject: tH, merge: tF, objectEach: tX, pick: tG} = V; function tj(t) { return tH(t) ? tF({ duration: 500, defer: 0 }, t) : { duration: 500 * !!t, defer: 0 } } function tY(t, e) { let i = tB.timers.length; for (; i--; ) tB.timers[i].elem !== t || e && e !== tB.timers[i].prop || (tB.timers[i].stopped = !0) } let tU = { animate: function(t, e, i) { let s, o = "", r, a, n; tH(i) || (n = arguments, i = { duration: n[2], easing: n[3], complete: n[4] }), tW(i.duration) || (i.duration = 400), i.easing = "function" == typeof i.easing ? i.easing : Math[i.easing] || Math.easeInOutSine, i.curAnim = tF(e), tX(e, function(n, h) { tY(t, h), a = new tB(t,i,h), r = void 0, "d" === h && tR(e.d) ? (a.paths = a.initPath(t, t.pathArray, e.d), a.toD = e.d, s = 0, r = 1) : t.attr ? s = t.attr(h) : (s = parseFloat(tz(t, h)) || 0, "opacity" !== h && (o = "px")), r || (r = n), "string" == typeof r && r.match("px") && (r = r.replace(/px/g, "")), a.run(s, r, o) }) }, animObject: tj, getDeferredAnimation: function(t, e, i) { let s = tj(e) , o = i ? [i] : t.series , r = 0 , a = 0; return o.forEach(t => { let i = tj(t.options.animation); r = tH(e) && tN(e.defer) ? s.defer : Math.max(r, i.duration + i.defer), a = Math.min(s.duration, i.duration) } ), t.renderer.forExport && (r = 0), { defer: Math.max(0, r - a), duration: Math.min(r, a) } }, setAnimation: function(t, e) { e.renderer.globalAnimation = tG(t, e.options.chart.animation, !0) }, stop: tY } , {SVG_NS: t$, win: tV} = w , {attr: tZ, createElement: t_, css: tq, error: tK, isFunction: tJ, isString: tQ, objectEach: t0, splat: t1} = V , {trustedTypes: t2} = tV , t3 = t2 && tJ(t2.createPolicy) && t2.createPolicy("highcharts", { createHTML: t => t }) , t5 = t3 ? t3.createHTML("") : ""; class t6 { static filterUserAttributes(t) { return t0(t, (e, i) => { let s = !0; -1 === t6.allowedAttributes.indexOf(i) && (s = !1), -1 !== ["background", "dynsrc", "href", "lowsrc", "src"].indexOf(i) && (s = tQ(e) && t6.allowedReferences.some(t => 0 === e.indexOf(t))), s || (tK(33, !1, void 0, { "Invalid attribute in config": `${i}` }), delete t[i]), tQ(e) && t[i] && (t[i] = e.replace(/ { let i = e.split(":").map(t => t.trim()) , s = i.shift(); return s && i.length && (t[s.replace(/-([a-z])/g, t => t[1].toUpperCase())] = i.join(":")), t } , {}) } static setElementHTML(t, e) { t.innerHTML = t6.emptyHTML, e && new t6(e).addToDOM(t) } constructor(t) { this.nodes = "string" == typeof t ? this.parseMarkup(t) : t } addToDOM(t) { return function t(e, i) { let s; return t1(e).forEach(function(e) { let o, r = e.tagName, a = e.textContent ? w.doc.createTextNode(e.textContent) : void 0, n = t6.bypassHTMLFiltering; if (r) { if ("#text" === r) o = a; else if (-1 !== t6.allowedTags.indexOf(r) || n) { let s = "svg" === r ? t$ : i.namespaceURI || t$ , h = w.doc.createElementNS(s, r) , l = e.attributes || {}; t0(e, function(t, e) { "tagName" !== e && "attributes" !== e && "children" !== e && "style" !== e && "textContent" !== e && (l[e] = t) }), tZ(h, n ? l : t6.filterUserAttributes(l)), e.style && tq(h, e.style), a && h.appendChild(a), t(e.children || [], h), o = h } else tK(33, !1, void 0, { "Invalid tagName in config": r }) } o && i.appendChild(o), s = o }), s }(this.nodes, t) } parseMarkup(t) { let e, i = []; t = t.trim().replace(/ style=(["'])/g, " data-style=$1"); try { e = new DOMParser().parseFromString(t3 ? t3.createHTML(t) : t, "text/html") } catch (t) {} if (!e) { let i = t_("div"); i.innerHTML = t, e = { body: i } } let s = (t, e) => { let i = t.nodeName.toLowerCase() , o = { tagName: i }; "#text" === i && (o.textContent = t.textContent || ""); let r = t.attributes; if (r) { let t = {}; [].forEach.call(r, e => { "data-style" === e.name ? o.style = t6.parseStyle(e.value) : t[e.name] = e.value } ), o.attributes = t } if (t.childNodes.length) { let e = []; [].forEach.call(t.childNodes, t => { s(t, e) } ), e.length && (o.children = e) } e.push(o) } ; return [].forEach.call(e.body.childNodes, t => s(t, i)), i } } t6.allowedAttributes = ["alt", "aria-controls", "aria-describedby", "aria-expanded", "aria-haspopup", "aria-hidden", "aria-label", "aria-labelledby", "aria-live", "aria-pressed", "aria-readonly", "aria-roledescription", "aria-selected", "class", "clip-path", "color", "colspan", "cx", "cy", "d", "dx", "dy", "disabled", "fill", "filterUnits", "flood-color", "flood-opacity", "height", "href", "id", "in", "in2", "markerHeight", "markerWidth", "offset", "opacity", "operator", "orient", "padding", "paddingLeft", "paddingRight", "patternUnits", "r", "radius", "refX", "refY", "role", "scope", "slope", "src", "startOffset", "stdDeviation", "stroke", "stroke-linecap", "stroke-width", "style", "tableValues", "result", "rowspan", "summary", "target", "tabindex", "text-align", "text-anchor", "textAnchor", "textLength", "title", "type", "valign", "width", "x", "x1", "x2", "xlink:href", "y", "y1", "y2", "zIndex"], t6.allowedReferences = ["https://", "http://", "mailto:", "/", "../", "./", "#"], t6.allowedTags = ["a", "abbr", "b", "br", "button", "caption", "circle", "clipPath", "code", "dd", "defs", "div", "dl", "dt", "em", "feComponentTransfer", "feComposite", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feMorphology", "feOffset", "feMerge", "feMergeNode", "filter", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "img", "li", "linearGradient", "marker", "ol", "p", "path", "pattern", "pre", "rect", "small", "span", "stop", "strong", "style", "sub", "sup", "svg", "table", "text", "textPath", "thead", "title", "tbody", "tspan", "td", "th", "tr", "u", "ul", "#text"], t6.emptyHTML = t5, t6.bypassHTMLFiltering = !1; let {defaultOptions: t9, defaultTime: t4} = tv , {pageLang: t8} = w , {extend: t7, getNestedProperty: et, isArray: ee, isNumber: ei, isObject: es, isString: eo, pick: er, ucfirst: ea} = V , en = { add: (t, e) => t + e, divide: (t, e) => 0 !== e ? t / e : "", eq: (t, e) => t == e, each: function(t) { let e = arguments[arguments.length - 1]; return !!ee(t) && t.map( (i, s) => ed(e.body, t7(es(i) ? i : { "@this": i }, { "@index": s, "@first": 0 === s, "@last": s === t.length - 1 }))).join("") }, ge: (t, e) => t >= e, gt: (t, e) => t > e, if: t => !!t, le: (t, e) => t <= e, lt: (t, e) => t < e, multiply: (t, e) => t * e, ne: (t, e) => t != e, subtract: (t, e) => t - e, ucfirst: ea, unless: t => !t } , eh = {} , el = t => /^["'].+["']$/.test(t); function ed(t="", e, i) { let s = /\{([a-zA-Z\u00C0-\u017F\d:\.,;\-\/<>\[\]%_@+"'’= #\(\)]+)\}/g, o = /\(([a-zA-Z\u00C0-\u017F\d:\.,;\-\/<>\[\]%_@+"'= ]+)\)/g, r = [], a = /f$/, n = /\.(\d)/, h = i?.options?.lang || t9.lang, l = i?.time || t4, d = i?.numberFormatter || ec, c = (t="") => { let i; return "true" === t || "false" !== t && ((i = Number(t)).toString() === t ? i : el(t) ? t.slice(1, -1) : et(t, e)) } , p, g, u = 0, f; for (; null !== (p = s.exec(t)); ) { let i = p , s = o.exec(p[1]); s && (p = s, f = !0), g?.isBlock || (g = { ctx: e, expression: p[1], find: p[0], isBlock: "#" === p[1].charAt(0), start: p.index, startInner: p.index + p[0].length, length: p[0].length }); let a = (g.isBlock ? i : p)[1].split(" ")[0].replace("#", ""); en[a] && (g.isBlock && a === g.fn && u++, g.fn || (g.fn = a)); let n = "else" === p[1]; if (g.isBlock && g.fn && (p[1] === `/${g.fn}` || n)) { if (u) !n && u--; else { let e = g.startInner , i = t.substr(e, p.index - e); void 0 === g.body ? (g.body = i, g.startInner = p.index + p[0].length) : g.elseBody = i, g.find += i + p[0], n || (r.push(g), g = void 0) } } else g.isBlock || r.push(g); if (s && !g?.isBlock) break } return r.forEach(s => { let r, p, {body: g, elseBody: u, expression: f, fn: m} = s; if (m) { let t = [s], o = [], a = f.length, n = 0, h; for (p = 0; p <= a; p++) { let t = f.charAt(p); h || '"' !== t && "'" !== t ? h === t && (h = "") : h = t, h || " " !== t && p !== a || (o.push(f.substr(n, p - n)), n = p + 1) } for (p = en[m].length; p--; ) t.unshift(c(o[p + 1])); r = en[m].apply(e, t), s.isBlock && "boolean" == typeof r && (r = ed(r ? g : u, e, i)) } else { let t = el(f) ? [f] : f.split(":"); if (r = c(t.shift() || ""), t.length && "number" == typeof r) { let e = t.join(":"); if (a.test(e)) { let t = parseInt((e.match(n) || ["", "-1"])[1], 10); null !== r && (r = d(r, t, h.decimalPoint, e.indexOf(",") > -1 ? h.thousandsSep : "")) } else r = l.dateFormat(e, r) } o.lastIndex = 0, o.test(s.find) && eo(r) && (r = `"${r}"`) } t = t.replace(s.find, er(r, "")) } ), f ? ed(t, e, i) : t } function ec(t, e, i, s) { e *= 1; let o, r, [a,n] = (t = +t || 0).toString().split("e").map(Number), h = this?.options?.lang || t9.lang, l = (t.toString().split(".")[1] || "").split("e")[0].length, d = e, c = {}; i ?? (i = h.decimalPoint), s ?? (s = h.thousandsSep), -1 === e ? e = Math.min(l, 20) : ei(e) ? e && n < 0 && ((r = e + n) >= 0 ? (a = +a.toExponential(r).split("e")[0], e = r) : (a = Math.floor(a), t = e < 20 ? +(a * Math.pow(10, n)).toFixed(e) : 0, n = 0)) : e = 2, n && (e ?? (e = 2), t = a), ei(e) && e >= 0 && (c.minimumFractionDigits = e, c.maximumFractionDigits = e), "" === s && (c.useGrouping = !1); let p = s || i , g = p ? "en" : this?.locale || h.locale || t8 , u = JSON.stringify(c) + g; return o = (eh[u] ?? (eh[u] = new Intl.NumberFormat(g,c))).format(t), p && (o = o.replace(/([,\.])/g, "_$1").replace(/_\,/g, s ?? ",").replace("_.", i ?? ".")), (e || 0 != +o) && (!(n < 0) || d) || (o = "0"), n && 0 != +o && (o += "e" + (n < 0 ? "" : "+") + n), o } let ep = { dateFormat: function(t, e, i) { return t4.dateFormat(t, e, i) }, format: ed, helpers: en, numberFormat: ec }; !function(t) { let e; t.rendererTypes = {}, t.getRendererType = function(i=e) { return t.rendererTypes[i] || t.rendererTypes[e] } , t.registerRendererType = function(i, s, o) { t.rendererTypes[i] = s, (!e || o) && (e = i, w.Renderer = s) } }(s || (s = {})); let eg = s , {clamp: eu, pick: ef, pushUnique: em, stableSort: ex} = V; (o || (o = {})).distribute = function t(e, i, s) { let o = e, r = o.reducedLen || i, a = (t, e) => t.target - e.target, n = [], h = e.length, l = [], d = n.push, c, p, g, u = !0, f, m, x = 0, y; for (c = h; c--; ) x += e[c].size; if (x > r) { for (ex(e, (t, e) => (e.rank || 0) - (t.rank || 0)), g = (y = e[0].rank === e[e.length - 1].rank) ? h / 2 : -1, p = y ? g : h - 1; g && x > r; ) f = e[c = Math.floor(p)], em(l, c) && (x -= f.size), p += g, y && p >= e.length && (g /= 2, p = g); l.sort( (t, e) => e - t).forEach(t => d.apply(n, e.splice(t, 1))) } for (ex(e, a), e = e.map(t => ({ size: t.size, targets: [t.target], align: ef(t.align, .5) })); u; ) { for (c = e.length; c--; ) f = e[c], m = (Math.min.apply(0, f.targets) + Math.max.apply(0, f.targets)) / 2, f.pos = eu(m - f.size * f.align, 0, i - f.size); for (c = e.length, u = !1; c--; ) c > 0 && e[c - 1].pos + e[c - 1].size > e[c].pos && (e[c - 1].size += e[c].size, e[c - 1].targets = e[c - 1].targets.concat(e[c].targets), e[c - 1].align = .5, e[c - 1].pos + e[c - 1].size > i && (e[c - 1].pos = i - e[c - 1].size), e.splice(c, 1), u = !0) } return d.apply(o, n), c = 0, e.some(e => { let r = 0; return (e.targets || []).some( () => (o[c].pos = e.pos + r, void 0 !== s && Math.abs(o[c].pos - o[c].target) > s) ? (o.slice(0, c + 1).forEach(t => delete t.pos), o.reducedLen = (o.reducedLen || i) - .1 * i, o.reducedLen > .1 * i && t(o, i, s), !0) : (r += o[c].size, c++, !1)) } ), ex(o, a), o } ; let ey = o , {animate: eb, animObject: ev, stop: ek} = tU , {deg2rad: ew, doc: eM, svg: eS, SVG_NS: eT, win: eC, isFirefox: eA} = w , {addEvent: eP, attr: eL, createElement: eO, crisp: eE, css: eI, defined: eD, erase: eB, extend: eN, fireEvent: ez, getAlignFactor: eR, isArray: eW, isFunction: eH, isNumber: eF, isObject: eX, isString: eG, merge: ej, objectEach: eY, pick: eU, pInt: e$, pushUnique: eV, replaceNested: eZ, syncTimeout: e_, uniqueKey: eq} = V; class eK { _defaultGetter(t) { let e = eU(this[t + "Value"], this[t], this.element ? this.element.getAttribute(t) : null, 0); return /^-?[\d\.]+$/.test(e) && (e = parseFloat(e)), e } _defaultSetter(t, e, i) { i.setAttribute(e, t) } add(t) { let e, i = this.renderer, s = this.element; return t && (this.parentGroup = t), void 0 !== this.textStr && "text" === this.element.nodeName && i.buildText(this), this.added = !0, (!t || t.handleZ || this.zIndex) && (e = this.zIndexSetter()), e || (t ? t.element : i.box).appendChild(s), this.onAdd && this.onAdd(), this } addClass(t, e) { let i = e ? "" : this.attr("class") || ""; return (t = (t || "").split(/ /g).reduce(function(t, e) { return -1 === i.indexOf(e) && t.push(e), t }, i ? [i] : []).join(" ")) !== i && this.attr("class", t), this } afterSetters() { this.doTransform && (this.updateTransform(), this.doTransform = !1) } align(t, e, i, s=!0) { let o = this.renderer , r = o.alignedObjects , a = !!t; t ? (this.alignOptions = t, this.alignByTranslate = e, this.alignTo = i) : (t = this.alignOptions || {}, e = this.alignByTranslate, i = this.alignTo); let n = !i || eG(i) ? i || "renderer" : void 0; n && (a && eV(r, this), i = void 0); let h = eU(i, o[n], o) , l = (h.x || 0) + (t.x || 0) + ((h.width || 0) - (t.width || 0)) * eR(t.align) , d = (h.y || 0) + (t.y || 0) + ((h.height || 0) - (t.height || 0)) * eR(t.verticalAlign) , c = { "text-align": t?.align }; return c[e ? "translateX" : "x"] = Math.round(l), c[e ? "translateY" : "y"] = Math.round(d), s && (this[this.placed ? "animate" : "attr"](c), this.placed = !0), this.alignAttr = c, this } alignSetter(t) { let e = { left: "start", center: "middle", right: "end" }; e[t] && (this.alignValue = t, this.element.setAttribute("text-anchor", e[t])) } animate(t, e, i) { let s = ev(eU(e, this.renderer.globalAnimation, !0)) , o = s.defer; return eM.hidden && (s.duration = 0), 0 !== s.duration ? (i && (s.complete = i), e_( () => { this.element && eb(this, t, s) } , o)) : (this.attr(t, void 0, i || s.complete), eY(t, function(t, e) { s.step && s.step.call(this, t, { prop: e, pos: 1, elem: this }) }, this)), this } applyTextOutline(t) { let e = this.element; -1 !== t.indexOf("contrast") && (t = t.replace(/contrast/g, this.renderer.getContrast(e.style.fill))); let i = t.indexOf(" ") , s = t.substring(i + 1) , o = t.substring(0, i); if (o && "none" !== o && w.svg) { this.fakeTS = !0, o = o.replace(/(^[\d\.]+)(.*?)$/g, function(t, e, i) { return 2 * Number(e) + i }), this.removeTextOutline(); let t = eM.createElementNS(eT, "tspan"); eL(t, { class: "highcharts-text-outline", fill: s, stroke: s, "stroke-width": o, "stroke-linejoin": "round" }); let i = e.querySelector("textPath") || e; [].forEach.call(i.childNodes, e => { let i = e.cloneNode(!0); i.removeAttribute && ["fill", "stroke", "stroke-width", "stroke"].forEach(t => i.removeAttribute(t)), t.appendChild(i) } ); let r = 0; [].forEach.call(i.querySelectorAll("text tspan"), t => { r += Number(t.getAttribute("dy")) } ); let a = eM.createElementNS(eT, "tspan"); a.textContent = "​", eL(a, { x: Number(e.getAttribute("x")), dy: -r }), t.appendChild(a), i.insertBefore(t, i.firstChild) } } attr(t, e, i, s) { let {element: o} = this, r = eK.symbolCustomAttribs, a, n, h = this, l; return "string" == typeof t && void 0 !== e && (a = t, (t = {})[a] = e), "string" == typeof t ? h = (this[t + "Getter"] || this._defaultGetter).call(this, t, o) : (eY(t, function(e, i) { l = !1, s || ek(this, i), this.symbolName && -1 !== r.indexOf(i) && (n || (this.symbolAttr(t), n = !0), l = !0), this.rotation && ("x" === i || "y" === i) && (this.doTransform = !0), l || (this[i + "Setter"] || this._defaultSetter).call(this, e, i, o) }, this), this.afterSetters()), i && i.call(this), h } clip(t) { if (t && !t.clipPath) { let e = eq() + "-" , i = this.renderer.createElement("clipPath").attr({ id: e }).add(this.renderer.defs); eN(t, { clipPath: i, id: e, count: 0 }), t.add(i) } return this.attr("clip-path", t ? `url(${this.renderer.url}#${t.id})` : "none") } crisp(t, e) { e = Math.round(e || t.strokeWidth || 0); let i = t.x || this.x || 0 , s = t.y || this.y || 0 , o = (t.width || this.width || 0) + i , r = (t.height || this.height || 0) + s , a = eE(i, e) , n = eE(s, e); return eN(t, { x: a, y: n, width: eE(o, e) - a, height: eE(r, e) - n }), eD(t.strokeWidth) && (t.strokeWidth = e), t } complexColor(t, e, i) { let s = this.renderer, o, r, a, n, h, l, d, c, p, g, u = [], f; ez(this.renderer, "complexColor", { args: arguments }, function() { if (t.radialGradient ? r = "radialGradient" : t.linearGradient && (r = "linearGradient"), r) { if (a = t[r], h = s.gradients, l = t.stops, p = i.radialReference, eW(a) && (t[r] = a = { x1: a[0], y1: a[1], x2: a[2], y2: a[3], gradientUnits: "userSpaceOnUse" }), "radialGradient" === r && p && !eD(a.gradientUnits) && (n = a, a = ej(a, s.getRadialAttr(p, n), { gradientUnits: "userSpaceOnUse" })), eY(a, function(t, e) { "id" !== e && u.push(e, t) }), eY(l, function(t) { u.push(t) }), h[u = u.join(",")]) g = h[u].attr("id"); else { a.id = g = eq(); let t = h[u] = s.createElement(r).attr(a).add(s.defs); t.radAttr = n, t.stops = [], l.forEach(function(e) { 0 === e[1].indexOf("rgba") ? (d = (o = tL.parse(e[1])).get("rgb"), c = o.get("a")) : (d = e[1], c = 1); let i = s.createElement("stop").attr({ offset: e[0], "stop-color": d, "stop-opacity": c }).add(t); t.stops.push(i) }) } f = "url(" + s.url + "#" + g + ")", i.setAttribute(e, f), i.gradient = u, t.toString = function() { return f } } }) } css(t) { let e = this.styles, i = {}, s = this.element, o, r = !e; if (e && eY(t, function(t, s) { e && e[s] !== t && (i[s] = t, r = !0) }), r) { e && (t = eN(e, i)), null === t.width || "auto" === t.width ? delete this.textWidth : "text" === s.nodeName.toLowerCase() && t.width && (o = this.textWidth = e$(t.width)), eN(this.styles, t), o && !eS && this.renderer.forExport && delete t.width; let r = eA && t.fontSize || null; r && (eF(r) || /^\d+$/.test(r)) && (t.fontSize += "px"); let a = ej(t); s.namespaceURI === this.SVG_NS && (["textOutline", "textOverflow", "whiteSpace", "width"].forEach(t => a && delete a[t]), a.color && (a.fill = a.color, delete a.color)), eI(s, a) } return this.added && ("text" === this.element.nodeName && this.renderer.buildText(this), t.textOutline && this.applyTextOutline(t.textOutline)), this } dashstyleSetter(t) { let e, i = this["stroke-width"]; if ("inherit" === i && (i = 1), t) { let s = (t = t.toLowerCase()).replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(","); for (e = s.length; e--; ) s[e] = "" + e$(s[e]) * eU(i, NaN); t = s.join(",").replace(/NaN/g, "none"), this.element.setAttribute("stroke-dasharray", t) } } destroy() { let t = this, e = t.element || {}, i = t.renderer, s = e.ownerSVGElement, o = "SPAN" === e.nodeName && t.parentGroup || void 0, r, a; if (e.onclick = e.onmouseout = e.onmouseover = e.onmousemove = e.point = null, ek(t), t.clipPath && s) { let e = t.clipPath; [].forEach.call(s.querySelectorAll("[clip-path],[CLIP-PATH]"), function(t) { t.getAttribute("clip-path").indexOf(e.element.id) > -1 && t.removeAttribute("clip-path") }), t.clipPath = e.destroy() } if (t.stops) { for (a = 0; a < t.stops.length; a++) t.stops[a].destroy(); t.stops.length = 0, t.stops = void 0 } for (t.safeRemoveChild(e); o?.div && 0 === o.div.childNodes.length; ) r = o.parentGroup, t.safeRemoveChild(o.div), delete o.div, o = r; t.alignOptions && eB(i.alignedObjects, t), eY(t, (e, i) => { (t[i]?.parentGroup === t || -1 !== ["connector", "foreignObject"].indexOf(i)) && t[i]?.destroy?.(), delete t[i] } ) } dSetter(t, e, i) { eW(t) && ("string" == typeof t[0] && (t = this.renderer.pathToSegments(t)), this.pathArray = t, t = t.reduce( (t, e, i) => e?.join ? (i ? t + " " : "") + e.join(" ") : (e || "").toString(), "")), /(NaN| {2}|^$)/.test(t) && (t = "M 0 0"), this[e] !== t && (i.setAttribute(e, t), this[e] = t) } fillSetter(t, e, i) { "string" == typeof t ? i.setAttribute(e, t) : t && this.complexColor(t, e, i) } hrefSetter(t, e, i) { i.setAttributeNS("http://www.w3.org/1999/xlink", e, t) } getBBox(t, e) { let i, s, o, r, {alignValue: a, element: n, renderer: h, styles: l, textStr: d} = this, {cache: c, cacheKeys: p} = h, g = n.namespaceURI === this.SVG_NS, u = eU(e, this.rotation, 0), f = h.styledMode ? n && eK.prototype.getStyle.call(n, "font-size") : l.fontSize; if (eD(d) && (-1 === (r = d.toString()).indexOf("<") && (r = r.replace(/\d/g, "0")), r += ["", h.rootFontSize, f, u, this.textWidth, a, l.lineClamp, l.textOverflow, l.fontWeight].join(",")), r && !t && (i = c[r]), !i || i.polygon) { if (g || h.forExport) { try { o = this.fakeTS && function(t) { let e = n.querySelector(".highcharts-text-outline"); e && eI(e, { display: t }) } , eH(o) && o("none"), i = n.getBBox ? eN({}, n.getBBox()) : { width: n.offsetWidth, height: n.offsetHeight, x: 0, y: 0 }, eH(o) && o("") } catch (t) {} (!i || i.width < 0) && (i = { x: 0, y: 0, width: 0, height: 0 }) } else i = this.htmlGetBBox(); s = i.height, g && (i.height = s = ({ "11px,17": 14, "13px,20": 16 })[`${f || ""},${Math.round(s)}`] || s), u && (i = this.getRotatedBox(i, u)); let t = { bBox: i }; ez(this, "afterGetBBox", t), i = t.bBox } if (r && ("" === d || i.height > 0)) { for (; p.length > 250; ) delete c[p.shift()]; c[r] || p.push(r), c[r] = i } return i } getRotatedBox(t, e) { let {x: i, y: s, width: o, height: r} = t , {alignValue: a, translateY: n, rotationOriginX: h=0, rotationOriginY: l=0} = this , d = eR(a) , c = Number(this.element.getAttribute("y") || 0) - (n ? 0 : s) , p = e * ew , g = (e - 90) * ew , u = Math.cos(p) , f = Math.sin(p) , m = o * u , x = o * f , y = Math.cos(g) , b = Math.sin(g) , [[v,k],[w,M]] = [h, l].map(t => [t - t * u, t * f]) , S = i + d * (o - m) + v + M + c * y , T = S + m , C = T - r * y , A = C - m , P = s + c - d * x - k + w + c * b , L = P + x , O = L - r * b , E = O - x , I = Math.min(S, T, C, A) , D = Math.min(P, L, O, E) , B = Math.max(S, T, C, A) - I , N = Math.max(P, L, O, E) - D; return { x: I, y: D, width: B, height: N, polygon: [[S, P], [T, L], [C, O], [A, E]] } } getStyle(t) { return eC.getComputedStyle(this.element || this, "").getPropertyValue(t) } hasClass(t) { return -1 !== ("" + this.attr("class")).split(" ").indexOf(t) } hide() { return this.attr({ visibility: "hidden" }) } htmlGetBBox() { return { height: 0, width: 0, x: 0, y: 0 } } constructor(t, e) { this.onEvents = {}, this.opacity = 1, this.SVG_NS = eT, this.element = "span" === e || "body" === e ? eO(e) : eM.createElementNS(this.SVG_NS, e), this.renderer = t, this.styles = {}, ez(this, "afterInit") } on(t, e) { let {onEvents: i} = this; return i[t] && i[t](), i[t] = eP(this.element, t, e), this } opacitySetter(t, e, i) { let s = Number(Number(t).toFixed(3)); this.opacity = s, i.setAttribute(e, s) } reAlign() { this.alignOptions?.width && "left" !== this.alignOptions.align && (this.alignOptions.width = this.getBBox().width, this.placed = !1, this.align()) } removeClass(t) { return this.attr("class", ("" + this.attr("class")).replace(eG(t) ? RegExp(`(^| )${t}( |$)`) : t, " ").replace(/ +/g, " ").trim()) } removeTextOutline() { let t = this.element.querySelector("tspan.highcharts-text-outline"); t && this.safeRemoveChild(t) } safeRemoveChild(t) { let e = t.parentNode; e && e.removeChild(t) } setRadialReference(t) { let e = this.element.gradient && this.renderer.gradients[this.element.gradient] || void 0; return this.element.radialReference = t, e?.radAttr && e.animate(this.renderer.getRadialAttr(t, e.radAttr)), this } shadow(t) { let {renderer: e} = this , i = ej(this.parentGroup?.rotation === 90 ? { offsetX: -1, offsetY: -1 } : {}, eX(t) ? t : {}) , s = e.shadowDefinition(i); return this.attr({ filter: t ? `url(${e.url}#${s})` : "none" }) } show(t=!0) { return this.attr({ visibility: t ? "inherit" : "visible" }) } "stroke-widthSetter"(t, e, i) { this[e] = t, i.setAttribute(e, t) } strokeWidth() { if (!this.renderer.styledMode) return this["stroke-width"] || 0; let t = this.getStyle("stroke-width"), e = 0, i; return /px$/.test(t) ? e = e$(t) : "" !== t && (eL(i = eM.createElementNS(eT, "rect"), { width: t, "stroke-width": 0 }), this.element.parentNode.appendChild(i), e = i.getBBox().width, i.parentNode.removeChild(i)), e } symbolAttr(t) { let e = this; eK.symbolCustomAttribs.forEach(function(i) { e[i] = eU(t[i], e[i]) }), e.attr({ d: e.renderer.symbols[e.symbolName](e.x, e.y, e.width, e.height, e) }) } textSetter(t) { t !== this.textStr && (delete this.textPxLength, this.textStr = t, this.added && this.renderer.buildText(this), this.reAlign()) } titleSetter(t) { let e = this.element , i = e.getElementsByTagName("title")[0] || eM.createElementNS(this.SVG_NS, "title"); e.insertBefore ? e.insertBefore(i, e.firstChild) : e.appendChild(i), i.textContent = eZ(eU(t, ""), [/<[^>]*>/g, ""]).replace(/</g, "<").replace(/>/g, ">") } toFront() { let t = this.element; return t.parentNode.appendChild(t), this } translate(t, e) { return this.attr({ translateX: t, translateY: e }) } updateTransform(t="transform") { let {element: e, foreignObject: i, matrix: s, padding: o, rotation: r=0, rotationOriginX: a, rotationOriginY: n, scaleX: h, scaleY: l, text: d, translateX: c=0, translateY: p=0} = this , g = ["translate(" + c + "," + p + ")"]; eD(s) && g.push("matrix(" + s.join(",") + ")"), r && (g.push("rotate(" + r + " " + (a ?? e.getAttribute("x") ?? this.x ?? 0) + " " + (n ?? e.getAttribute("y") ?? this.y ?? 0) + ")"), d?.element.tagName !== "SPAN" || d?.foreignObject || d.attr({ rotation: r, rotationOriginX: (a || 0) - o, rotationOriginY: (n || 0) - o })), (eD(h) || eD(l)) && g.push("scale(" + eU(h, 1) + " " + eU(l, 1) + ")"), g.length && !(d || this).textPath && (i?.element || e).setAttribute(t, g.join(" ")) } visibilitySetter(t, e, i) { "inherit" === t ? i.removeAttribute(e) : this[e] !== t && i.setAttribute(e, t), this[e] = t } xGetter(t) { return "circle" === this.element.nodeName && ("x" === t ? t = "cx" : "y" === t && (t = "cy")), this._defaultGetter(t) } zIndexSetter(t, e) { let i = this.renderer, s = this.parentGroup, o = (s || i).element || i.box, r = this.element, a = o === i.box, n, h, l, d = !1, c, p = this.added, g; if (eD(t) ? (r.setAttribute("data-z-index", t), t *= 1, this[e] === t && (p = !1)) : eD(this[e]) && r.removeAttribute("data-z-index"), this[e] = t, p) { for ((t = this.zIndex) && s && (s.handleZ = !0), g = (n = o.childNodes).length - 1; g >= 0 && !d; g--) c = !eD(l = (h = n[g]).getAttribute("data-z-index")), h !== r && (t < 0 && c && !a && !g ? (o.insertBefore(r, n[g]), d = !0) : (e$(l) <= t || c && (!eD(t) || t >= 0)) && (o.insertBefore(r, n[g + 1]), d = !0)); d || (o.insertBefore(r, n[3 * !!a]), d = !0) } return d } } eK.symbolCustomAttribs = ["anchorX", "anchorY", "clockwise", "end", "height", "innerR", "r", "start", "width", "x", "y"], eK.prototype.strokeSetter = eK.prototype.fillSetter, eK.prototype.yGetter = eK.prototype.xGetter, eK.prototype.matrixSetter = eK.prototype.rotationOriginXSetter = eK.prototype.rotationOriginYSetter = eK.prototype.rotationSetter = eK.prototype.scaleXSetter = eK.prototype.scaleYSetter = eK.prototype.translateXSetter = eK.prototype.translateYSetter = eK.prototype.verticalAlignSetter = function(t, e) { this[e] = t, this.doTransform = !0 } ; let eJ = eK , {defined: eQ, extend: e0, getAlignFactor: e1, isNumber: e2, merge: e3, pick: e5, removeEvent: e6} = V; class e9 extends eJ { constructor(t, e, i, s, o, r, a, n, h, l) { let d; super(t, "g"), this.paddingLeftSetter = this.paddingSetter, this.paddingRightSetter = this.paddingSetter, this.doUpdate = !1, this.textStr = e, this.x = i, this.y = s, this.anchorX = r, this.anchorY = a, this.baseline = h, this.className = l, this.addClass("button" === l ? "highcharts-no-tooltip" : "highcharts-label"), l && this.addClass("highcharts-" + l), this.text = t.text(void 0, 0, 0, n).attr({ zIndex: 1 }), "string" == typeof o && ((d = /^url\((.*?)\)$/.test(o)) || this.renderer.symbols[o]) && (this.symbolKey = o), this.bBox = e9.emptyBBox, this.padding = 3, this.baselineOffset = 0, this.needsBox = t.styledMode || d, this.deferredAttr = {}, this.alignFactor = 0 } alignSetter(t) { let e = e1(t); this.textAlign = t, e !== this.alignFactor && (this.alignFactor = e, this.bBox && e2(this.xSetting) && this.attr({ x: this.xSetting })) } anchorXSetter(t, e) { this.anchorX = t, this.boxAttr(e, Math.round(t) - this.getCrispAdjust() - this.xSetting) } anchorYSetter(t, e) { this.anchorY = t, this.boxAttr(e, t - this.ySetting) } boxAttr(t, e) { this.box ? this.box.attr(t, e) : this.deferredAttr[t] = e } css(t) { if (t) { let e = {}; t = e3(t), e9.textProps.forEach(i => { void 0 !== t[i] && (e[i] = t[i], delete t[i]) } ), this.text.css(e), "fontSize"in e || "fontWeight"in e ? this.updateTextPadding() : ("width"in e || "textOverflow"in e) && this.updateBoxSize() } return eJ.prototype.css.call(this, t) } destroy() { e6(this.element, "mouseenter"), e6(this.element, "mouseleave"), this.text && this.text.destroy(), this.box && (this.box = this.box.destroy()), eJ.prototype.destroy.call(this) } fillSetter(t, e) { t && (this.needsBox = !0), this.fill = t, this.boxAttr(e, t) } getBBox(t, e) { this.textStr && 0 === this.bBox.width && 0 === this.bBox.height && this.updateBoxSize(); let {padding: i, height: s=0, translateX: o=0, translateY: r=0, width: a=0} = this , n = e5(this.paddingLeft, i) , h = e ?? (this.rotation || 0) , l = { width: a, height: s, x: o + this.bBox.x - n, y: r + this.bBox.y - i + this.baselineOffset }; return h && (l = this.getRotatedBox(l, h)), l } getCrispAdjust() { return (this.renderer.styledMode && this.box ? this.box.strokeWidth() : this["stroke-width"] ? parseInt(this["stroke-width"], 10) : 0) % 2 / 2 } heightSetter(t) { this.heightSetting = t, this.doUpdate = !0 } afterSetters() { super.afterSetters(), this.doUpdate && (this.updateBoxSize(), this.doUpdate = !1) } onAdd() { this.text.add(this), this.attr({ text: e5(this.textStr, ""), x: this.x || 0, y: this.y || 0 }), this.box && eQ(this.anchorX) && this.attr({ anchorX: this.anchorX, anchorY: this.anchorY }) } paddingSetter(t, e) { e2(t) ? t !== this[e] && (this[e] = t, this.updateTextPadding()) : this[e] = void 0 } rSetter(t, e) { this.boxAttr(e, t) } strokeSetter(t, e) { this.stroke = t, this.boxAttr(e, t) } "stroke-widthSetter"(t, e) { t && (this.needsBox = !0), this["stroke-width"] = t, this.boxAttr(e, t) } "text-alignSetter"(t) { this.textAlign = this["text-align"] = t, this.updateTextPadding() } textSetter(t) { void 0 !== t && this.text.attr({ text: t }), this.updateTextPadding(), this.reAlign() } updateBoxSize() { let t, e = this.text, i = {}, s = this.padding, o = this.bBox = (!e2(this.widthSetting) || !e2(this.heightSetting) || this.textAlign) && eQ(e.textStr) ? e.getBBox(void 0, 0) : e9.emptyBBox; this.width = this.getPaddedWidth(), this.height = (this.heightSetting || o.height || 0) + 2 * s; let r = this.renderer.fontMetrics(e); if (this.baselineOffset = s + Math.min((this.text.firstLineMetrics || r).b, o.height || 1 / 0), this.heightSetting && (this.baselineOffset += (this.heightSetting - r.h) / 2), this.needsBox && !e.textPath) { if (!this.box) { let t = this.box = this.symbolKey ? this.renderer.symbol(this.symbolKey) : this.renderer.rect(); t.addClass(("button" === this.className ? "" : "highcharts-label-box") + (this.className ? " highcharts-" + this.className + "-box" : "")), t.add(this) } i.x = t = this.getCrispAdjust(), i.y = (this.baseline ? -this.baselineOffset : 0) + t, i.width = Math.round(this.width), i.height = Math.round(this.height), this.box.attr(e0(i, this.deferredAttr)), this.deferredAttr = {} } } updateTextPadding() { let t = this.text , e = t.styles.textAlign || this.textAlign; if (!t.textPath) { this.updateBoxSize(); let i = this.baseline ? 0 : this.baselineOffset , s = (this.paddingLeft ?? this.padding) + e1(e) * (this.widthSetting ?? this.bBox.width); (s !== t.x || i !== t.y) && (t.attr({ align: e, x: s }), void 0 !== i && t.attr("y", i)), t.x = s, t.y = i } } widthSetter(t) { this.widthSetting = e2(t) ? t : void 0, this.doUpdate = !0 } getPaddedWidth() { let t = this.padding , e = e5(this.paddingLeft, t) , i = e5(this.paddingRight, t); return (this.widthSetting || this.bBox.width || 0) + e + i } xSetter(t) { this.x = t, this.alignFactor && (t -= this.alignFactor * this.getPaddedWidth(), this["forceAnimate:x"] = !0), this.xSetting = Math.round(t), this.attr("translateX", this.xSetting) } ySetter(t) { this.ySetting = this.y = Math.round(t), this.attr("translateY", this.ySetting) } } e9.emptyBBox = { width: 0, height: 0, x: 0, y: 0 }, e9.textProps = ["color", "direction", "fontFamily", "fontSize", "fontStyle", "fontWeight", "lineClamp", "lineHeight", "textAlign", "textDecoration", "textOutline", "textOverflow", "whiteSpace", "width"]; let {defined: e4, isNumber: e8, pick: e7} = V; function it(t, e, i, s, o) { let r = []; if (o) { let a = o.start || 0 , n = o.end || 0 , h = e7(o.r, i) , l = e7(o.r, s || i) , d = 2e-4 / (o.borderRadius ? 1 : Math.max(h, 1)) , c = Math.abs(n - a - 2 * Math.PI) < d; c && (a = Math.PI / 2, n = 2.5 * Math.PI - d); let p = o.innerR , g = e7(o.open, c) , u = Math.cos(a) , f = Math.sin(a) , m = Math.cos(n) , x = Math.sin(n) , y = e7(o.longArc, n - a - Math.PI < d ? 0 : 1) , b = ["A", h, l, 0, y, e7(o.clockwise, 1), t + h * m, e + l * x]; b.params = { start: a, end: n, cx: t, cy: e }, r.push(["M", t + h * u, e + l * f], b), e4(p) && ((b = ["A", p, p, 0, y, e4(o.clockwise) ? 1 - o.clockwise : 0, t + p * u, e + p * f]).params = { start: n, end: a, cx: t, cy: e }, r.push(g ? ["M", t + p * m, e + p * x] : ["L", t + p * m, e + p * x], b)), g || r.push(["Z"]) } return r } function ie(t, e, i, s, o) { return o?.r ? ii(t, e, i, s, o) : [["M", t, e], ["L", t + i, e], ["L", t + i, e + s], ["L", t, e + s], ["Z"]] } function ii(t, e, i, s, o) { let r = o?.r || 0; return [["M", t + r, e], ["L", t + i - r, e], ["A", r, r, 0, 0, 1, t + i, e + r], ["L", t + i, e + s - r], ["A", r, r, 0, 0, 1, t + i - r, e + s], ["L", t + r, e + s], ["A", r, r, 0, 0, 1, t, e + s - r], ["L", t, e + r], ["A", r, r, 0, 0, 1, t + r, e], ["Z"]] } let is = { arc: it, callout: function(t, e, i, s, o) { let r = Math.min(o?.r || 0, i, s) , a = r + 6 , n = o?.anchorX , h = o?.anchorY || 0 , l = ii(t, e, i, s, { r }); if (!e8(n) || n < i && n > 0 && h < s && h > 0) return l; if (t + n > i - a) { if (h > e + a && h < e + s - a) l.splice(3, 1, ["L", t + i, h - 6], ["L", t + i + 6, h], ["L", t + i, h + 6], ["L", t + i, e + s - r]); else if (n < i) { let o = h < e + a , d = o ? e : e + s; l.splice(o ? 2 : 5, 0, ["L", n, h], ["L", t + i - r, d]) } else l.splice(3, 1, ["L", t + i, s / 2], ["L", n, h], ["L", t + i, s / 2], ["L", t + i, e + s - r]) } else if (t + n < a) { if (h > e + a && h < e + s - a) l.splice(7, 1, ["L", t, h + 6], ["L", t - 6, h], ["L", t, h - 6], ["L", t, e + r]); else if (n > 0) { let i = h < e + a , o = i ? e : e + s; l.splice(i ? 1 : 6, 0, ["L", n, h], ["L", t + r, o]) } else l.splice(7, 1, ["L", t, s / 2], ["L", n, h], ["L", t, s / 2], ["L", t, e + r]) } else h > s && n < i - a ? l.splice(5, 1, ["L", n + 6, e + s], ["L", n, e + s + 6], ["L", n - 6, e + s], ["L", t + r, e + s]) : h < 0 && n > a && l.splice(1, 1, ["L", n - 6, e], ["L", n, e - 6], ["L", n + 6, e], ["L", i - r, e]); return l }, circle: function(t, e, i, s) { return it(t + i / 2, e + s / 2, i / 2, s / 2, { start: .5 * Math.PI, end: 2.5 * Math.PI, open: !1 }) }, diamond: function(t, e, i, s) { return [["M", t + i / 2, e], ["L", t + i, e + s / 2], ["L", t + i / 2, e + s], ["L", t, e + s / 2], ["Z"]] }, rect: ie, roundedRect: ii, square: ie, triangle: function(t, e, i, s) { return [["M", t + i / 2, e], ["L", t + i, e + s], ["L", t, e + s], ["Z"]] }, "triangle-down": function(t, e, i, s) { return [["M", t, e], ["L", t + i, e], ["L", t + i / 2, e + s], ["Z"]] } } , {doc: io, SVG_NS: ir, win: ia} = w , {attr: ih, extend: il, fireEvent: id, isString: ic, objectEach: ip, pick: ig} = V , iu = (t, e) => t.substring(0, e) + "…" , im = class { constructor(t) { let e = t.styles; this.renderer = t.renderer, this.svgElement = t, this.width = t.textWidth, this.textLineHeight = e?.lineHeight, this.textOutline = e?.textOutline, this.ellipsis = e?.textOverflow === "ellipsis", this.lineClamp = e?.lineClamp, this.noWrap = e?.whiteSpace === "nowrap" } buildSVG() { let t = this.svgElement , e = t.element , i = t.renderer , s = ig(t.textStr, "").toString() , o = -1 !== s.indexOf("<") , r = e.childNodes , a = !t.added && i.box , n = [s, this.ellipsis, this.noWrap, this.textLineHeight, this.textOutline, t.getStyle("font-size"), t.styles.lineClamp, this.width].join(","); if (n !== t.textCache) { t.textCache = n, delete t.actualWidth; for (let t = r.length; t--; ) e.removeChild(r[t]); if (o || this.ellipsis || this.width || t.textPath || -1 !== s.indexOf(" ") && (!this.noWrap || //g.test(s))) { if ("" !== s) { a && a.appendChild(e); let i = new t6(s); this.modifyTree(i.nodes), i.addToDOM(e), this.modifyDOM(), this.ellipsis && -1 !== (e.textContent || "").indexOf("…") && t.attr("title", this.unescapeEntities(t.textStr || "", ["<", ">"])), a && a.removeChild(e) } } else e.appendChild(io.createTextNode(this.unescapeEntities(s))); ic(this.textOutline) && t.applyTextOutline && t.applyTextOutline(this.textOutline) } } modifyDOM() { let t, e = this.svgElement, i = ih(e.element, "x"); for (e.firstLineMetrics = void 0; t = e.element.firstChild; ) if (/^[\s\u200B]*$/.test(t.textContent || " ")) e.element.removeChild(t); else break; [].forEach.call(e.element.querySelectorAll("tspan.highcharts-br"), (t, s) => { t.nextSibling && t.previousSibling && (0 === s && 1 === t.previousSibling.nodeType && (e.firstLineMetrics = e.renderer.fontMetrics(t.previousSibling)), ih(t, { dy: this.getLineHeight(t.nextSibling), x: i })) } ); let s = this.width || 0; if (!s) return; let o = (t, o) => { let r = t.textContent || "" , a = r.replace(/([^\^])-/g, "$1- ").split(" ") , n = !this.noWrap && (a.length > 1 || e.element.childNodes.length > 1) , h = this.getLineHeight(o) , l = Math.max(0, s - .8 * h) , d = 0 , c = e.actualWidth; if (n) { let r = [] , n = []; for (; o.firstChild && o.firstChild !== t; ) n.push(o.firstChild), o.removeChild(o.firstChild); for (; a.length; ) if (a.length && !this.noWrap && d > 0 && (r.push(t.textContent || ""), t.textContent = a.join(" ").replace(/- /g, "-")), this.truncate(t, void 0, a, 0 === d && c || 0, s, l, (t, e) => a.slice(0, e).join(" ").replace(/- /g, "-")), c = e.actualWidth, d++, this.lineClamp && d >= this.lineClamp) { a.length && (this.truncate(t, t.textContent || "", void 0, 0, s, l, iu), t.textContent = t.textContent?.replace("…", "") + "…"); break } n.forEach(e => { o.insertBefore(e, t) } ), r.forEach(e => { o.insertBefore(io.createTextNode(e), t); let s = io.createElementNS(ir, "tspan"); s.textContent = "​", ih(s, { dy: h, x: i }), o.insertBefore(s, t) } ) } else this.ellipsis && r && this.truncate(t, r, void 0, 0, s, l, iu) } , r = t => { [].slice.call(t.childNodes).forEach(i => { i.nodeType === ia.Node.TEXT_NODE ? o(i, t) : (-1 !== i.className.baseVal.indexOf("highcharts-br") && (e.actualWidth = 0), r(i)) } ) } ; r(e.element) } getLineHeight(t) { let e = t.nodeType === ia.Node.TEXT_NODE ? t.parentElement : t; return this.textLineHeight ? parseInt(this.textLineHeight.toString(), 10) : this.renderer.fontMetrics(e || this.svgElement.element).h } modifyTree(t) { let e = (i, s) => { let {attributes: o={}, children: r, style: a={}, tagName: n} = i , h = this.renderer.styledMode; if ("b" === n || "strong" === n ? h ? o.class = "highcharts-strong" : a.fontWeight = "bold" : ("i" === n || "em" === n) && (h ? o.class = "highcharts-emphasized" : a.fontStyle = "italic"), a?.color && (a.fill = a.color), "br" === n) { o.class = "highcharts-br", i.textContent = "​"; let e = t[s + 1]; e?.textContent && (e.textContent = e.textContent.replace(/^ +/gm, "")) } else "a" === n && r && r.some(t => "#text" === t.tagName) && (i.children = [{ children: r, tagName: "tspan" }]); "#text" !== n && "a" !== n && (i.tagName = "tspan"), il(i, { attributes: o, style: a }), r && r.filter(t => "#text" !== t.tagName).forEach(e) } ; t.forEach(e), id(this.svgElement, "afterModifyTree", { nodes: t }) } truncate(t, e, i, s, o, r, a) { let n, h, l = this.svgElement, {rotation: d} = l, c = [], p = i && !s ? 1 : 0, g = (e || i || "").length, u = g; i || (o = r); let f = function(e, o) { let r = o || e , a = t.parentNode; if (a && void 0 === c[r] && a.getSubStringLength) try { c[r] = s + a.getSubStringLength(0, i ? r + 1 : r) } catch (t) {} return c[r] }; if (l.rotation = 0, s + (h = f(t.textContent.length)) > o) { for (; p <= g; ) u = Math.ceil((p + g) / 2), i && (n = a(i, u)), h = f(u, n && n.length - 1), p === g ? p = g + 1 : h > o ? g = u - 1 : p = u; 0 === g ? t.textContent = "" : e && g === e.length - 1 || (t.textContent = n || a(e || i, u)), this.ellipsis && h > o && this.truncate(t, t.textContent || "", void 0, 0, o, r, iu) } i && i.splice(0, u), l.actualWidth = h, l.rotation = d } unescapeEntities(t, e) { return ip(this.renderer.escapes, function(i, s) { e && -1 !== e.indexOf(i) || (t = t.toString().replace(RegExp(i, "g"), s)) }), t } } , {defaultOptions: ix} = tv , {charts: iy, deg2rad: ib, doc: iv, isFirefox: ik, isMS: iw, isWebKit: iM, noop: iS, SVG_NS: iT, symbolSizes: iC, win: iA} = w , {addEvent: iP, attr: iL, createElement: iO, crisp: iE, css: iI, defined: iD, destroyObjectProperties: iB, extend: iN, isArray: iz, isNumber: iR, isObject: iW, isString: iH, merge: iF, pick: iX, pInt: iG, replaceNested: ij, uniqueKey: iY} = V; class iU { constructor(t, e, i, s, o, r, a) { let n, h; this.x = 0, this.y = 0; let l = this.createElement("svg").attr({ version: "1.1", class: "highcharts-root" }) , d = l.element; a || l.css(this.getStyle(s || {})), t.appendChild(d), iL(t, "dir", "ltr"), -1 === t.innerHTML.indexOf("xmlns") && iL(d, "xmlns", this.SVG_NS), this.box = d, this.boxWrapper = l, this.alignedObjects = [], this.url = this.getReferenceURL(), this.createElement("desc").add().element.appendChild(iv.createTextNode("Created with Highcharts 12.2.0")), this.defs = this.createElement("defs").add(), this.allowHTML = r, this.forExport = o, this.styledMode = a, this.gradients = {}, this.cache = {}, this.cacheKeys = [], this.imgCount = 0, this.rootFontSize = l.getStyle("font-size"), this.setSize(e, i, !1), ik && t.getBoundingClientRect && ((n = function() { iI(t, { left: 0, top: 0 }), h = t.getBoundingClientRect(), iI(t, { left: Math.ceil(h.left) - h.left + "px", top: Math.ceil(h.top) - h.top + "px" }) } )(), this.unSubPixelFix = iP(iA, "resize", n)) } definition(t) { return new t6([t]).addToDOM(this.defs.element) } getReferenceURL() { if ((ik || iM) && iv.getElementsByTagName("base").length) { if (!iD(e)) { let t = iY() , i = new t6([{ tagName: "svg", attributes: { width: 8, height: 8 }, children: [{ tagName: "defs", children: [{ tagName: "clipPath", attributes: { id: t }, children: [{ tagName: "rect", attributes: { width: 4, height: 4 } }] }] }, { tagName: "rect", attributes: { id: "hitme", width: 8, height: 8, "clip-path": `url(#${t})`, fill: "rgba(0,0,0,0.001)" } }] }]).addToDOM(iv.body); iI(i, { position: "fixed", top: 0, left: 0, zIndex: 9e5 }); let s = iv.elementFromPoint(6, 6); e = s?.id === "hitme", iv.body.removeChild(i) } if (e) return ij(iA.location.href.split("#")[0], [/<[^>]*>/g, ""], [/([\('\)])/g, "\\$1"], [/ /g, "%20"]) } return "" } getStyle(t) { return this.style = iN({ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif', fontSize: "1rem" }, t), this.style } setStyle(t) { this.boxWrapper.css(this.getStyle(t)) } isHidden() { return !this.boxWrapper.getBBox().width } destroy() { let t = this.defs; return this.box = null, this.boxWrapper = this.boxWrapper.destroy(), iB(this.gradients || {}), this.gradients = null, this.defs = t.destroy(), this.unSubPixelFix && this.unSubPixelFix(), this.alignedObjects = null, null } createElement(t) { return new this.Element(this,t) } getRadialAttr(t, e) { return { cx: t[0] - t[2] / 2 + (e.cx || 0) * t[2], cy: t[1] - t[2] / 2 + (e.cy || 0) * t[2], r: (e.r || 0) * t[2] } } shadowDefinition(t) { let e = [`highcharts-drop-shadow-${this.chartIndex}`, ...Object.keys(t).map(e => `${e}-${t[e]}`)].join("-").toLowerCase().replace(/[^a-z\d\-]/g, "") , i = iF({ color: "#000000", offsetX: 1, offsetY: 1, opacity: .15, width: 5 }, t); return this.defs.element.querySelector(`#${e}`) || this.definition({ tagName: "filter", attributes: { id: e, filterUnits: i.filterUnits }, children: this.getShadowFilterContent(i) }), e } getShadowFilterContent(t) { return [{ tagName: "feDropShadow", attributes: { dx: t.offsetX, dy: t.offsetY, "flood-color": t.color, "flood-opacity": Math.min(5 * t.opacity, 1), stdDeviation: t.width / 2 } }] } buildText(t) { new im(t).buildSVG() } getContrast(t) { let e = tL.parse(t).rgba , i = " clamp(0,calc(9e9*(0.5 - (0.2126*r + 0.7152*g + 0.0722*b))),1)"; if (iR(e[0]) || !tL.useColorMix) { let t = e.map(t => { let e = t / 255; return e <= .04 ? e / 12.92 : Math.pow((e + .055) / 1.055, 2.4) } ) , i = .2126 * t[0] + .7152 * t[1] + .0722 * t[2]; return 1.05 / (i + .05) > (i + .05) / .05 ? "#FFFFFF" : "#000000" } return "color(from " + t + " srgb" + i + i + i + ")" } button(t, e, i, s, o={}, r, a, n, h, l) { let d = this.label(t, e, i, h, void 0, void 0, l, void 0, "button") , c = this.styledMode , p = arguments , g = 0; o = iF(ix.global.buttonTheme, o), c && (delete o.fill, delete o.stroke, delete o["stroke-width"]); let u = o.states || {} , f = o.style || {}; delete o.states, delete o.style; let m = [t6.filterUserAttributes(o)] , x = [f]; return c || ["hover", "select", "disabled"].forEach( (t, e) => { m.push(iF(m[0], t6.filterUserAttributes(p[e + 5] || u[t] || {}))), x.push(m[e + 1].style), delete m[e + 1].style } ), iP(d.element, iw ? "mouseover" : "mouseenter", function() { 3 !== g && d.setState(1) }), iP(d.element, iw ? "mouseout" : "mouseleave", function() { 3 !== g && d.setState(g) }), d.setState = (t=0) => { if (1 !== t && (d.state = g = t), d.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][t]), !c) { d.attr(m[t]); let e = x[t]; iW(e) && d.css(e) } } , d.attr(m[0]), !c && (d.css(iN({ cursor: "default" }, f)), l && d.text.css({ pointerEvents: "none" })), d.on("touchstart", t => t.stopPropagation()).on("click", function(t) { 3 !== g && s?.call(d, t) }) } crispLine(t, e) { let[i,s] = t; return iD(i[1]) && i[1] === s[1] && (i[1] = s[1] = iE(i[1], e)), iD(i[2]) && i[2] === s[2] && (i[2] = s[2] = iE(i[2], e)), t } path(t) { let e = this.styledMode ? {} : { fill: "none" }; return iz(t) ? e.d = t : iW(t) && iN(e, t), this.createElement("path").attr(e) } circle(t, e, i) { let s = iW(t) ? t : void 0 === t ? {} : { x: t, y: e, r: i } , o = this.createElement("circle"); return o.xSetter = o.ySetter = function(t, e, i) { i.setAttribute("c" + e, t) } , o.attr(s) } arc(t, e, i, s, o, r) { let a; iW(t) ? (e = (a = t).y, i = a.r, s = a.innerR, o = a.start, r = a.end, t = a.x) : a = { innerR: s, start: o, end: r }; let n = this.symbol("arc", t, e, i, i, a); return n.r = i, n } rect(t, e, i, s, o, r) { let a = iW(t) ? t : void 0 === t ? {} : { x: t, y: e, r: o, width: Math.max(i || 0, 0), height: Math.max(s || 0, 0) } , n = this.createElement("rect"); return this.styledMode || (void 0 !== r && (a["stroke-width"] = r, iN(a, n.crisp(a))), a.fill = "none"), n.rSetter = function(t, e, i) { n.r = t, iL(i, { rx: t, ry: t }) } , n.rGetter = function() { return n.r || 0 } , n.attr(a) } roundedRect(t) { return this.symbol("roundedRect").attr(t) } setSize(t, e, i) { this.width = t, this.height = e, this.boxWrapper.animate({ width: t, height: e }, { step: function() { this.attr({ viewBox: "0 0 " + this.attr("width") + " " + this.attr("height") }) }, duration: iX(i, !0) ? void 0 : 0 }), this.alignElements() } g(t) { let e = this.createElement("g"); return t ? e.attr({ class: "highcharts-" + t }) : e } image(t, e, i, s, o, r) { let a = { preserveAspectRatio: "none" }; iR(e) && (a.x = e), iR(i) && (a.y = i), iR(s) && (a.width = s), iR(o) && (a.height = o); let n = this.createElement("image").attr(a) , h = function(e) { n.attr({ href: t }), r.call(n, e) }; if (r) { n.attr({ href: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" }); let e = new iA.Image; iP(e, "load", h), e.src = t, e.complete && h({}) } else n.attr({ href: t }); return n } symbol(t, e, i, s, o, r) { let a, n, h, l, d = this, c = /^url\((.*?)\)$/, p = c.test(t), g = !p && (this.symbols[t] ? t : "circle"), u = g && this.symbols[g]; if (u) "number" == typeof e && (n = u.call(this.symbols, e || 0, i || 0, s || 0, o || 0, r)), a = this.path(n), d.styledMode || a.attr("fill", "none"), iN(a, { symbolName: g || void 0, x: e, y: i, width: s, height: o }), r && iN(a, r); else if (p) { h = t.match(c)[1]; let s = a = this.image(h); s.imgwidth = iX(r?.width, iC[h]?.width), s.imgheight = iX(r?.height, iC[h]?.height), l = t => t.attr({ width: t.width, height: t.height }), ["width", "height"].forEach(t => { s[`${t}Setter`] = function(t, e) { this[e] = t; let {alignByTranslate: i, element: s, width: o, height: a, imgwidth: n, imgheight: h} = this , l = "width" === e ? n : h , d = 1; r && "within" === r.backgroundSize && o && a && n && h ? (d = Math.min(o / n, a / h), iL(s, { width: Math.round(n * d), height: Math.round(h * d) })) : s && l && s.setAttribute(e, l), !i && n && h && this.translate(((o || 0) - n * d) / 2, ((a || 0) - h * d) / 2) } } ), iD(e) && s.attr({ x: e, y: i }), s.isImg = !0, s.symbolUrl = t, iD(s.imgwidth) && iD(s.imgheight) ? l(s) : (s.attr({ width: 0, height: 0 }), iO("img", { onload: function() { let t = iy[d.chartIndex]; 0 === this.width && (iI(this, { position: "absolute", top: "-999em" }), iv.body.appendChild(this)), iC[h] = { width: this.width, height: this.height }, s.imgwidth = this.width, s.imgheight = this.height, s.element && l(s), this.parentNode && this.parentNode.removeChild(this), d.imgCount--, d.imgCount || !t || t.hasLoaded || t.onload() }, src: h }), this.imgCount++) } return a } clipRect(t, e, i, s) { return this.rect(t, e, i, s, 0) } text(t, e, i, s) { let o = {}; if (s && (this.allowHTML || !this.forExport)) return this.html(t, e, i); o.x = Math.round(e || 0), i && (o.y = Math.round(i)), iD(t) && (o.text = t); let r = this.createElement("text").attr(o); return s && (!this.forExport || this.allowHTML) || (r.xSetter = function(t, e, i) { let s = i.getElementsByTagName("tspan") , o = i.getAttribute(e); for (let i = 0, r; i < s.length; i++) (r = s[i]).getAttribute(e) === o && r.setAttribute(e, t); i.setAttribute(e, t) } ), r } fontMetrics(t) { let e = iG(eJ.prototype.getStyle.call(t, "font-size") || 0) , i = e < 24 ? e + 3 : Math.round(1.2 * e) , s = Math.round(.8 * i); return { h: i, b: s, f: e } } rotCorr(t, e, i) { let s = t; return e && i && (s = Math.max(s * Math.cos(e * ib), 4)), { x: -t / 3 * Math.sin(e * ib), y: s } } pathToSegments(t) { let e = [] , i = [] , s = { A: 8, C: 7, H: 2, L: 3, M: 3, Q: 5, S: 5, T: 3, V: 2 }; for (let o = 0; o < t.length; o++) iH(i[0]) && iR(t[o]) && i.length === s[i[0].toUpperCase()] && t.splice(o, 0, i[0].replace("M", "L").replace("m", "l")), "string" == typeof t[o] && (i.length && e.push(i.slice(0)), i.length = 0), i.push(t[o]); return e.push(i.slice(0)), e } label(t, e, i, s, o, r, a, n, h) { return new e9(this,t,e,i,s,o,r,a,n,h) } alignElements() { this.alignedObjects.forEach(t => t.align()) } } iN(iU.prototype, { Element: eJ, SVG_NS: iT, escapes: { "&": "&", "<": "<", ">": ">", "'": "'", '"': """ }, symbols: is, draw: iS }), eg.registerRendererType("svg", iU, !0); let {composed: i$, isFirefox: iV} = w , {attr: iZ, css: i_, createElement: iq, defined: iK, extend: iJ, getAlignFactor: iQ, isNumber: i0, pInt: i1, pushUnique: i2} = V; function i3(t, e, i) { let s = this.div?.style || i.style; eJ.prototype[`${e}Setter`].call(this, t, e, i), s && (s[e] = t) } let i5 = (t, e) => { if (!t.div) { let i = iZ(t.element, "class") , s = t.css , o = iq("div", i ? { className: i } : void 0, { position: "absolute", left: `${t.translateX || 0}px`, top: `${t.translateY || 0}px`, ...t.styles, display: t.display, opacity: t.opacity, visibility: t.visibility }, t.parentGroup?.div || e); t.classSetter = (t, e, i) => { i.setAttribute("class", t), o.className = t } , t.translateXSetter = t.translateYSetter = (e, i) => { t[i] = e, o.style["translateX" === i ? "left" : "top"] = `${e}px`, t.doTransform = !0 } , t.opacitySetter = t.visibilitySetter = i3, t.css = e => (s.call(t, e), e.cursor && (o.style.cursor = e.cursor), e.pointerEvents && (o.style.pointerEvents = e.pointerEvents), t), t.on = function() { return eJ.prototype.on.apply({ element: o, onEvents: t.onEvents }, arguments), t } , t.div = o } return t.div } ; class i6 extends eJ { static compose(t) { i2(i$, this.compose) && (t.prototype.html = function(t, e, i) { return new i6(this,"span").attr({ text: t, x: Math.round(e), y: Math.round(i) }) } ) } constructor(t, e) { super(t, e), i6.useForeignObject ? this.foreignObject = t.createElement("foreignObject").attr({ zIndex: 2 }) : this.css({ position: "absolute", ...t.styledMode ? {} : { fontFamily: t.style.fontFamily, fontSize: t.style.fontSize } }), this.element.style.whiteSpace = "nowrap" } getSpanCorrection(t, e, i) { this.xCorr = -t * i, this.yCorr = -e } css(t) { let e, {element: i} = this, s = "SPAN" === i.tagName && t && "width"in t, o = s && t.width; return s && (delete t.width, this.textWidth = i1(o) || void 0, e = !0), t?.textOverflow === "ellipsis" && (t.overflow = "hidden", t.whiteSpace = "nowrap"), t?.lineClamp && (t.display = "-webkit-box", t.WebkitLineClamp = t.lineClamp, t.WebkitBoxOrient = "vertical", t.overflow = "hidden"), i0(Number(t?.fontSize)) && (t.fontSize += "px"), iJ(this.styles, t), i_(i, t), e && this.updateTransform(), this } htmlGetBBox() { let {element: t} = this; return { x: t.offsetLeft, y: t.offsetTop, width: t.offsetWidth, height: t.offsetHeight } } updateTransform() { if (!this.added) { this.alignOnAdd = !0; return } let {element: t, foreignObject: e, oldTextWidth: i, renderer: s, rotation: o, rotationOriginX: r, rotationOriginY: a, scaleX: n, scaleY: h, styles: {display: l="inline-block", whiteSpace: d}, textAlign: c="left", textWidth: p, translateX: g=0, translateY: u=0, x: f=0, y: m=0} = this; if (e || i_(t, { marginLeft: `${g}px`, marginTop: `${u}px` }), "SPAN" === t.tagName) { let g, u = [o, c, t.innerHTML, p, this.textAlign].join(","), x = -(this.parentGroup?.padding * 1) || 0; if (p !== i) { let e = this.textPxLength ? this.textPxLength : (i_(t, { width: "", whiteSpace: d || "nowrap" }), t.offsetWidth) , s = p || 0 , r = "" === t.style.textOverflow && t.style.webkitLineClamp; (s > i || e > s || r) && (/[\-\s\u00AD]/.test(t.textContent || t.innerText) || "ellipsis" === t.style.textOverflow) && (i_(t, { width: (o || n || e > s || r) && i0(p) ? p + "px" : "auto", display: l, whiteSpace: d || "normal" }), this.oldTextWidth = p) } e && (i_(t, { display: "inline-block", verticalAlign: "top" }), e.attr({ width: s.width, height: s.height })), u !== this.cTT && (g = s.fontMetrics(t).b, iK(o) && !e && (o !== (this.oldRotation || 0) || c !== this.oldAlign) && i_(t, { transform: `rotate(${o}deg)`, transformOrigin: `${x}% ${x}px` }), this.getSpanCorrection(!iK(o) && !this.textWidth && this.textPxLength || t.offsetWidth, g, iQ(c))); let {xCorr: y=0, yCorr: b=0} = this , v = { left: `${f + y}px`, top: `${m + b}px`, textAlign: c, transformOrigin: `${(r ?? f) - y - f - x}px ${(a ?? m) - b - m - x}px` }; (n || h) && (v.transform = `scale(${n ?? 1},${h ?? 1})`), e ? (super.updateTransform(), i0(f) && i0(m) ? (e.attr({ x: f + y, y: m + b, width: t.offsetWidth + 3, height: t.offsetHeight, "transform-origin": t.getAttribute("transform-origin") || "0 0" }), i_(t, { display: l, textAlign: c })) : iV && e.attr({ width: 0, height: 0 })) : i_(t, v), this.cTT = u, this.oldRotation = o, this.oldAlign = c } } add(t) { let {foreignObject: e, renderer: i} = this , s = i.box.parentNode , o = []; if (e) e.add(t), super.add(i.createElement("body").attr({ xmlns: "http://www.w3.org/1999/xhtml" }).css({ background: "transparent", margin: "0 3px 0 0" }).add(e)); else { let e; if (this.parentGroup = t, t && !(e = t.div)) { let i = t; for (; i; ) o.push(i), i = i.parentGroup; for (let t of o.reverse()) e = i5(t, s) } (e || s).appendChild(this.element) } return this.added = !0, this.alignOnAdd && this.updateTransform(), this } textSetter(t) { t !== this.textStr && (delete this.bBox, delete this.oldTextWidth, t6.setElementHTML(this.element, t ?? ""), this.textStr = t, this.doTransform = !0) } alignSetter(t) { this.alignValue = this.textAlign = t, this.doTransform = !0 } xSetter(t, e) { this[e] = t, this.doTransform = !0 } } let i9 = i6.prototype; i9.visibilitySetter = i9.opacitySetter = i3, i9.ySetter = i9.rotationSetter = i9.rotationOriginXSetter = i9.rotationOriginYSetter = i9.xSetter, !function(t) { t.xAxis = { alignTicks: !0, allowDecimals: void 0, panningEnabled: !0, zIndex: 2, zoomEnabled: !0, dateTimeLabelFormats: { millisecond: { main: "%[HMSL]", range: !1 }, second: { main: "%[HMS]", range: !1 }, minute: { main: "%[HM]", range: !1 }, hour: { main: "%[HM]", range: !1 }, day: { main: "%[eb]" }, week: { main: "%[eb]" }, month: { main: "%[bY]" }, year: { main: "%Y" } }, endOnTick: !1, gridLineDashStyle: "Solid", gridZIndex: 1, labels: { autoRotationLimit: 80, distance: 15, enabled: !0, indentation: 10, overflow: "justify", reserveSpace: void 0, rotation: void 0, staggerLines: 0, step: 0, useHTML: !1, zIndex: 7, style: { color: "#333333", cursor: "default", fontSize: "0.8em", textOverflow: "ellipsis" } }, maxPadding: .01, minorGridLineDashStyle: "Solid", minorTickLength: 2, minorTickPosition: "outside", minorTicksPerMajor: 5, minPadding: .01, offset: void 0, reversed: void 0, reversedStacks: !1, showEmpty: !0, showFirstLabel: !0, showLastLabel: !0, startOfWeek: 1, startOnTick: !1, tickLength: 10, tickPixelInterval: 100, tickmarkPlacement: "between", tickPosition: "outside", title: { align: "middle", useHTML: !1, x: 0, y: 0, style: { color: "#666666", fontSize: "0.8em" } }, visible: !0, minorGridLineColor: "#f2f2f2", minorGridLineWidth: 1, minorTickColor: "#999999", lineColor: "#333333", lineWidth: 1, gridLineColor: "#e6e6e6", gridLineWidth: void 0, tickColor: "#333333" }, t.yAxis = { reversedStacks: !0, endOnTick: !0, maxPadding: .05, minPadding: .05, tickPixelInterval: 72, showLastLabel: !0, labels: { x: void 0 }, startOnTick: !0, title: {}, stackLabels: { animation: {}, allowOverlap: !1, enabled: !1, crop: !0, overflow: "justify", formatter: function() { let {numberFormatter: t} = this.axis.chart; return t(this.total || 0, -1) }, style: { color: "#000000", fontSize: "0.7em", fontWeight: "bold", textOutline: "1px contrast" } }, gridLineWidth: 1, lineWidth: 0 } }(r || (r = {})); let i4 = r , {addEvent: i8, isFunction: i7, objectEach: st, removeEvent: se} = V; (a || (a = {})).registerEventOptions = function(t, e) { t.eventOptions = t.eventOptions || {}, st(e.events, function(e, i) { t.eventOptions[i] !== e && (t.eventOptions[i] && (se(t, i, t.eventOptions[i]), delete t.eventOptions[i]), i7(e) && (t.eventOptions[i] = e, i8(t, i, e, { order: 0 }))) }) } ; let si = a , {deg2rad: ss} = w , {clamp: so, correctFloat: sr, defined: sa, destroyObjectProperties: sn, extend: sh, fireEvent: sl, getAlignFactor: sd, isNumber: sc, merge: sp, objectEach: sg, pick: su} = V , sf = class { constructor(t, e, i, s, o) { this.isNew = !0, this.isNewLabel = !0, this.axis = t, this.pos = e, this.type = i || "", this.parameters = o || {}, this.tickmarkOffset = this.parameters.tickmarkOffset, this.options = this.parameters.options, sl(this, "init"), i || s || this.addLabel() } addLabel() { let t = this, e = t.axis, i = e.options, s = e.chart, o = e.categories, r = e.logarithmic, a = e.names, n = t.pos, h = su(t.options?.labels, i.labels), l = e.tickPositions, d = n === l[0], c = n === l[l.length - 1], p = (!h.step || 1 === h.step) && 1 === e.tickInterval, g = l.info, u = t.label, f, m, x, y = this.parameters.category || (o ? su(o[n], a[n], n) : n); r && sc(y) && (y = sr(r.lin2log(y))), e.dateTime && (g ? f = (m = s.time.resolveDTLFormat(i.dateTimeLabelFormats[!i.grid && g.higherRanks[n] || g.unitName])).main : sc(y) && (f = e.dateTime.getXDateFormat(y, i.dateTimeLabelFormats || {}))), t.isFirst = d, t.isLast = c; let b = { axis: e, chart: s, dateTimeLabelFormat: f, isFirst: d, isLast: c, pos: n, tick: t, tickPositionInfo: g, value: y }; sl(this, "labelFormat", b); let v = t => h.formatter ? h.formatter.call(t, t) : h.format ? (t.text = e.defaultLabelFormatter.call(t), ep.format(h.format, t, s)) : e.defaultLabelFormatter.call(t) , k = v.call(b, b) , w = m?.list; w ? t.shortenLabel = function() { for (x = 0; x < w.length; x++) if (sh(b, { dateTimeLabelFormat: w[x] }), u.attr({ text: v.call(b, b) }), u.getBBox().width < e.getSlotWidth(t) - 2 * (h.padding || 0)) return; u.attr({ text: "" }) } : t.shortenLabel = void 0, p && e._addedPlotLB && t.moveLabel(k, h), sa(u) || t.movedLabel ? u && u.textStr !== k && !p && (!u.textWidth || h.style.width || u.styles.width || u.css({ width: null }), u.attr({ text: k }), u.textPxLength = u.getBBox().width) : (t.label = u = t.createLabel(k, h), t.rotation = 0) } createLabel(t, e, i) { let s = this.axis , {renderer: o, styledMode: r} = s.chart , a = e.style.whiteSpace , n = sa(t) && e.enabled ? o.text(t, i?.x, i?.y, e.useHTML).add(s.labelGroup) : void 0; return n && (r || n.css(sp(e.style)), n.textPxLength = n.getBBox().width, !r && a && n.css({ whiteSpace: a })), n } destroy() { sn(this, this.axis) } getPosition(t, e, i, s) { let o = this.axis , r = o.chart , a = s && r.oldChartHeight || r.chartHeight , n = { x: t ? sr(o.translate(e + i, void 0, void 0, s) + o.transB) : o.left + o.offset + (o.opposite ? (s && r.oldChartWidth || r.chartWidth) - o.right - o.left : 0), y: t ? a - o.bottom + o.offset - (o.opposite ? o.height : 0) : sr(a - o.translate(e + i, void 0, void 0, s) - o.transB) }; return n.y = so(n.y, -1e9, 1e9), sl(this, "afterGetPosition", { pos: n }), n } getLabelPosition(t, e, i, s, o, r, a, n) { let h, l, d = this.axis, c = d.transA, p = d.isLinked && d.linkedParent ? d.linkedParent.reversed : d.reversed, g = d.staggerLines, u = d.tickRotCorr || { x: 0, y: 0 }, f = s || d.reserveSpaceDefault ? 0 : -d.labelOffset * ("center" === d.labelAlign ? .5 : 1), m = o.distance, x = {}; return h = 0 === d.side ? i.rotation ? -m : -i.getBBox().height : 2 === d.side ? u.y + m : Math.cos(i.rotation * ss) * (u.y - i.getBBox(!1, 0).height / 2), sa(o.y) && (h = 0 === d.side && d.horiz ? o.y + h : o.y), t = t + su(o.x, [0, 1, 0, -1][d.side] * m) + f + u.x - (r && s ? r * c * (p ? -1 : 1) : 0), e = e + h - (r && !s ? r * c * (p ? 1 : -1) : 0), g && (l = a / (n || 1) % g, d.opposite && (l = g - l - 1), e += l * (d.labelOffset / g)), x.x = t, x.y = Math.round(e), sl(this, "afterGetLabelPosition", { pos: x, tickmarkOffset: r, index: a }), x } getLabelSize() { return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0 } getMarkPath(t, e, i, s, o=!1, r) { return r.crispLine([["M", t, e], ["L", t + (o ? 0 : -i), e + (o ? i : 0)]], s) } handleOverflow(t) { let e = this.axis, i = e.options.labels, s = t.x, o = e.chart.chartWidth, r = e.chart.spacing, a = su(e.labelLeft, Math.min(e.pos, r[3])), n = su(e.labelRight, Math.max(e.isRadial ? 0 : e.pos + e.len, o - r[1])), h = this.label, l = this.rotation, d = sd(e.labelAlign || h.attr("align")), c = h.getBBox().width, p = e.getSlotWidth(this), g = p, u = 1, f; l || "justify" !== i.overflow ? l < 0 && s - d * c < a ? f = Math.round(s / Math.cos(l * ss) - a) : l > 0 && s + d * c > n && (f = Math.round((o - s) / Math.cos(l * ss))) : (s - d * c < a ? g = t.x + g * (1 - d) - a : s + (1 - d) * c > n && (g = n - t.x + g * d, u = -1), (g = Math.min(p, g)) < p && "center" === e.labelAlign && (t.x += u * (p - g - d * (p - Math.min(c, g)))), (c > g || e.autoRotation && h?.styles?.width) && (f = g)), f && h && (this.shortenLabel ? this.shortenLabel() : h.css(sh({}, { width: Math.floor(f) + "px", lineClamp: +!e.isRadial }))) } moveLabel(t, e) { let i = this, s = i.label, o = i.axis, r = !1, a; s && s.textStr === t ? (i.movedLabel = s, r = !0, delete i.label) : sg(o.ticks, function(e) { r || e.isNew || e === i || !e.label || e.label.textStr !== t || (i.movedLabel = e.label, r = !0, e.labelPos = i.movedLabel.xy, delete e.label) }), !r && (i.labelPos || s) && (a = i.labelPos || s.xy, i.movedLabel = i.createLabel(t, e, a), i.movedLabel && i.movedLabel.attr({ opacity: 0 })) } render(t, e, i) { let s = this.axis , o = s.horiz , r = this.pos , a = su(this.tickmarkOffset, s.tickmarkOffset) , n = this.getPosition(o, r, a, e) , h = n.x , l = n.y , d = s.pos , c = d + s.len , p = o ? h : l , g = su(i, this.label?.newOpacity, 1); !s.chart.polar && (sr(p) < d || p > c) && (i = 0), i ?? (i = 1), this.isActive = !0, this.renderGridLine(e, i), this.renderMark(n, i), this.renderLabel(n, e, g, t), this.isNew = !1, sl(this, "afterRender") } renderGridLine(t, e) { let i = this.axis, s = i.options, o = {}, r = this.pos, a = this.type, n = su(this.tickmarkOffset, i.tickmarkOffset), h = i.chart.renderer, l = this.gridLine, d, c = s.gridLineWidth, p = s.gridLineColor, g = s.gridLineDashStyle; "minor" === this.type && (c = s.minorGridLineWidth, p = s.minorGridLineColor, g = s.minorGridLineDashStyle), l || (i.chart.styledMode || (o.stroke = p, o["stroke-width"] = c || 0, o.dashstyle = g), a || (o.zIndex = 1), t && (e = 0), this.gridLine = l = h.path().attr(o).addClass("highcharts-" + (a ? a + "-" : "") + "grid-line").add(i.gridGroup)), l && (d = i.getPlotLinePath({ value: r + n, lineWidth: l.strokeWidth(), force: "pass", old: t, acrossPanes: !1 })) && l[t || this.isNew ? "attr" : "animate"]({ d: d, opacity: e }) } renderMark(t, e) { let i = this.axis , s = i.options , o = i.chart.renderer , r = this.type , a = i.tickSize(r ? r + "Tick" : "tick") , n = t.x , h = t.y , l = su(s["minor" !== r ? "tickWidth" : "minorTickWidth"], !r && i.isXAxis ? 1 : 0) , d = s["minor" !== r ? "tickColor" : "minorTickColor"] , c = this.mark , p = !c; a && (i.opposite && (a[0] = -a[0]), c || (this.mark = c = o.path().addClass("highcharts-" + (r ? r + "-" : "") + "tick").add(i.axisGroup), i.chart.styledMode || c.attr({ stroke: d, "stroke-width": l })), c[p ? "attr" : "animate"]({ d: this.getMarkPath(n, h, a[0], c.strokeWidth(), i.horiz, o), opacity: e })) } renderLabel(t, e, i, s) { let o = this.axis , r = o.horiz , a = o.options , n = this.label , h = a.labels , l = h.step , d = su(this.tickmarkOffset, o.tickmarkOffset) , c = t.x , p = t.y , g = !0; n && sc(c) && (n.xy = t = this.getLabelPosition(c, p, n, r, h, d, s, l), (!this.isFirst || this.isLast || a.showFirstLabel) && (!this.isLast || this.isFirst || a.showLastLabel) ? !r || h.step || h.rotation || e || 0 === i || this.handleOverflow(t) : g = !1, l && s % l && (g = !1), g && sc(t.y) ? (t.opacity = i, n[this.isNewLabel ? "attr" : "animate"](t).show(!0), this.isNewLabel = !1) : (n.hide(), this.isNewLabel = !0)) } replaceMovedLabel() { let t = this.label , e = this.axis; t && !this.isNew && (t.animate({ opacity: 0 }, void 0, t.destroy), delete this.label), e.isDirty = !0, this.label = this.movedLabel, delete this.movedLabel } } , {animObject: sm} = tU , {xAxis: sx, yAxis: sy} = i4 , {defaultOptions: sb} = tv , {registerEventOptions: sv} = si , {deg2rad: sk} = w , {arrayMax: sw, arrayMin: sM, clamp: sS, correctFloat: sT, defined: sC, destroyObjectProperties: sA, erase: sP, error: sL, extend: sO, fireEvent: sE, getClosestDistance: sI, insertItem: sD, isArray: sB, isNumber: sN, isString: sz, merge: sR, normalizeTickInterval: sW, objectEach: sH, pick: sF, relativeLength: sX, removeEvent: sG, splat: sj, syncTimeout: sY} = V , sU = (t, e) => sW(e, void 0, void 0, sF(t.options.allowDecimals, e < .5 || void 0 !== t.tickAmount), !!t.tickAmount); sO(sb, { xAxis: sx, yAxis: sR(sx, sy) }); class s$ { constructor(t, e, i) { this.init(t, e, i) } init(t, e, i=this.coll) { let s = "xAxis" === i , o = this.isZAxis || (t.inverted ? !s : s); this.chart = t, this.horiz = o, this.isXAxis = s, this.coll = i, sE(this, "init", { userOptions: e }), this.opposite = sF(e.opposite, this.opposite), this.side = sF(e.side, this.side, o ? 2 * !this.opposite : this.opposite ? 1 : 3), this.setOptions(e); let r = this.options , a = r.labels; this.type ?? (this.type = r.type || "linear"), this.uniqueNames ?? (this.uniqueNames = r.uniqueNames ?? !0), sE(this, "afterSetType"), this.userOptions = e, this.minPixelPadding = 0, this.reversed = sF(r.reversed, this.reversed), this.visible = r.visible, this.zoomEnabled = r.zoomEnabled, this.hasNames = "category" === this.type || !0 === r.categories, this.categories = sB(r.categories) && r.categories || (this.hasNames ? [] : void 0), this.names || (this.names = [], this.names.keys = {}), this.plotLinesAndBandsGroups = {}, this.positiveValuesOnly = !!this.logarithmic, this.isLinked = sC(r.linkedTo), this.ticks = {}, this.labelEdge = [], this.minorTicks = {}, this.plotLinesAndBands = [], this.alternateBands = {}, this.len ?? (this.len = 0), this.minRange = this.userMinRange = r.minRange || r.maxZoom, this.range = r.range, this.offset = r.offset || 0, this.max = void 0, this.min = void 0; let n = sF(r.crosshair, sj(t.options.tooltip.crosshairs)[+!s]); this.crosshair = !0 === n ? {} : n, -1 === t.axes.indexOf(this) && (s ? t.axes.splice(t.xAxis.length, 0, this) : t.axes.push(this), sD(this, t[this.coll])), t.orderItems(this.coll), this.series = this.series || [], t.inverted && !this.isZAxis && s && !sC(this.reversed) && (this.reversed = !0), this.labelRotation = sN(a.rotation) ? a.rotation : void 0, sv(this, r), sE(this, "afterInit") } setOptions(t) { let e = this.horiz ? { labels: { autoRotation: [-45], padding: 3 }, margin: 15 } : { labels: { padding: 1 }, title: { rotation: 90 * this.side } }; this.options = sR(e, "yAxis" === this.coll ? { title: { text: this.chart.options.lang.yAxisTitle } } : {}, sb[this.coll], t), sE(this, "afterSetOptions", { userOptions: t }) } defaultLabelFormatter() { let t = this.axis, {numberFormatter: e} = this.chart, i = sN(this.value) ? this.value : NaN, s = t.chart.time, o = t.categories, r = this.dateTimeLabelFormat, a = sb.lang, n = a.numericSymbols, h = a.numericSymbolMagnitude || 1e3, l = t.logarithmic ? Math.abs(i) : t.tickInterval, d = n?.length, c, p; if (o) p = `${this.value}`; else if (r) p = s.dateFormat(r, i, !0); else if (d && n && l >= 1e3) for (; d-- && void 0 === p; ) l >= (c = Math.pow(h, d + 1)) && 10 * i % c == 0 && null !== n[d] && 0 !== i && (p = e(i / c, -1) + n[d]); return void 0 === p && (p = Math.abs(i) >= 1e4 ? e(i, -1) : e(i, -1, void 0, "")), p } getSeriesExtremes() { let t, e = this; sE(this, "getSeriesExtremes", null, function() { e.hasVisibleSeries = !1, e.dataMin = e.dataMax = e.threshold = void 0, e.softThreshold = !e.isXAxis, e.series.forEach(i => { if (i.reserveSpace()) { let s = i.options, o, r = s.threshold, a, n; if (e.hasVisibleSeries = !0, e.positiveValuesOnly && 0 >= (r || 0) && (r = void 0), e.isXAxis) (o = i.getColumn("x")).length && (o = e.logarithmic ? o.filter(t => t > 0) : o, a = (t = i.getXExtremes(o)).min, n = t.max, sN(a) || a instanceof Date || (o = o.filter(sN), a = (t = i.getXExtremes(o)).min, n = t.max), o.length && (e.dataMin = Math.min(sF(e.dataMin, a), a), e.dataMax = Math.max(sF(e.dataMax, n), n))); else { let t = i.applyExtremes(); sN(t.dataMin) && (a = t.dataMin, e.dataMin = Math.min(sF(e.dataMin, a), a)), sN(t.dataMax) && (n = t.dataMax, e.dataMax = Math.max(sF(e.dataMax, n), n)), sC(r) && (e.threshold = r), (!s.softThreshold || e.positiveValuesOnly) && (e.softThreshold = !1) } } } ) }), sE(this, "afterGetSeriesExtremes") } translate(t, e, i, s, o, r) { let a = this.linkedParent || this , n = s && a.old ? a.old.min : a.min; if (!sN(n)) return NaN; let h = a.minPixelPadding , l = (a.isOrdinal || a.brokenAxis?.hasBreaks || a.logarithmic && o) && a.lin2val , d = 1 , c = 0 , p = s && a.old ? a.old.transA : a.transA , g = 0; return p || (p = a.transA), i && (d *= -1, c = a.len), a.reversed && (d *= -1, c -= d * (a.sector || a.len)), e ? (g = (t = t * d + c - h) / p + n, l && (g = a.lin2val(g))) : (l && (t = a.val2lin(t)), g = d * (t - n) * p + c + d * h + (sN(r) ? p * r : 0), a.isRadial || (g = sT(g))), g } toPixels(t, e) { return this.translate(this.chart?.time.parse(t) ?? NaN, !1, !this.horiz, void 0, !0) + (e ? 0 : this.pos) } toValue(t, e) { return this.translate(t - (e ? 0 : this.pos), !0, !this.horiz, void 0, !0) } getPlotLinePath(t) { let e = this, i = e.chart, s = e.left, o = e.top, r = t.old, a = t.value, n = t.lineWidth, h = r && i.oldChartHeight || i.chartHeight, l = r && i.oldChartWidth || i.chartWidth, d = e.transB, c = t.translatedValue, p = t.force, g, u, f, m, x; function y(t, e, i) { return "pass" !== p && (t < e || t > i) && (p ? t = sS(t, e, i) : x = !0), t } let b = { value: a, lineWidth: n, old: r, force: p, acrossPanes: t.acrossPanes, translatedValue: c }; return sE(this, "getPlotLinePath", b, function(t) { g = f = (c = sS(c = sF(c, e.translate(a, void 0, void 0, r)), -1e9, 1e9)) + d, u = m = h - c - d, sN(c) ? e.horiz ? (u = o, m = h - e.bottom + (e.options.isInternal ? 0 : i.scrollablePixelsY || 0), g = f = y(g, s, s + e.width)) : (g = s, f = l - e.right + (i.scrollablePixelsX || 0), u = m = y(u, o, o + e.height)) : (x = !0, p = !1), t.path = x && !p ? void 0 : i.renderer.crispLine([["M", g, u], ["L", f, m]], n || 1) }), b.path } getLinearTickPositions(t, e, i) { let s, o, r, a = sT(Math.floor(e / t) * t), n = sT(Math.ceil(i / t) * t), h = []; if (sT(a + t) === a && (r = 20), this.single) return [e]; for (s = a; s <= n && (h.push(s), (s = sT(s + t, r)) !== o); ) o = s; return h } getMinorTickInterval() { let {minorTicks: t, minorTickInterval: e} = this.options; return !0 === t ? sF(e, "auto") : !1 !== t ? e : void 0 } getMinorTickPositions() { let t = this.options, e = this.tickPositions, i = this.minorTickInterval, s = this.pointRangePadding || 0, o = (this.min || 0) - s, r = (this.max || 0) + s, a = this.brokenAxis?.hasBreaks ? this.brokenAxis.unitLength : r - o, n = [], h; if (a && a / i < this.len / 3) { let s = this.logarithmic; if (s) this.paddedTicks.forEach(function(t, e, o) { e && n.push.apply(n, s.getLogTickPositions(i, o[e - 1], o[e], !0)) }); else if (this.dateTime && "auto" === this.getMinorTickInterval()) n = n.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(i), o, r, t.startOfWeek)); else for (h = o + (e[0] - o) % i; h <= r && h !== n[0]; h += i) n.push(h) } return 0 !== n.length && this.trimTicks(n), n } adjustForMinRange() { let t = this.options, e = this.logarithmic, i = this.chart.time, {max: s, min: o, minRange: r} = this, a, n, h, l; this.isXAxis && void 0 === r && !e && (r = sC(t.min) || sC(t.max) || sC(t.floor) || sC(t.ceiling) ? null : Math.min(5 * (sI(this.series.map(t => { let e = t.getColumn("x"); return t.xIncrement ? e.slice(0, 2) : e } )) || 0), this.dataMax - this.dataMin)), sN(s) && sN(o) && sN(r) && s - o < r && (n = this.dataMax - this.dataMin >= r, a = (r - s + o) / 2, h = [o - a, i.parse(t.min) ?? o - a], n && (h[2] = e ? e.log2lin(this.dataMin) : this.dataMin), l = [(o = sw(h)) + r, i.parse(t.max) ?? o + r], n && (l[2] = e ? e.log2lin(this.dataMax) : this.dataMax), (s = sM(l)) - o < r && (h[0] = s - r, h[1] = i.parse(t.min) ?? s - r, o = sw(h))), this.minRange = r, this.min = o, this.max = s } getClosest() { let t, e; if (this.categories) e = 1; else { let i = []; this.series.forEach(function(t) { let s = t.closestPointRange , o = t.getColumn("x"); 1 === o.length ? i.push(o[0]) : t.sorted && sC(s) && t.reserveSpace() && (e = sC(e) ? Math.min(e, s) : s) }), i.length && (i.sort( (t, e) => t - e), t = sI([i])) } return t && e ? Math.min(t, e) : t || e } nameToX(t) { let e = sB(this.options.categories), i = e ? this.categories : this.names, s = t.options.x, o; return t.series.requireSorting = !1, sC(s) || (s = this.uniqueNames && i ? e ? i.indexOf(t.name) : sF(i.keys[t.name], -1) : t.series.autoIncrement()), -1 === s ? !e && i && (o = i.length) : sN(s) && (o = s), void 0 !== o ? (this.names[o] = t.name, this.names.keys[t.name] = o) : t.x && (o = t.x), o } updateNames() { let t = this , e = this.names; e.length > 0 && (Object.keys(e.keys).forEach(function(t) { delete e.keys[t] }), e.length = 0, this.minRange = this.userMinRange, (this.series || []).forEach(e => { e.xIncrement = null, (!e.points || e.isDirtyData) && (t.max = Math.max(t.max || 0, e.dataTable.rowCount - 1), e.processData(), e.generatePoints()); let i = e.getColumn("x").slice(); e.data.forEach( (e, s) => { let o = i[s]; e?.options && void 0 !== e.name && void 0 !== (o = t.nameToX(e)) && o !== e.x && (i[s] = e.x = o) } ), e.dataTable.setColumn("x", i) } )) } setAxisTranslation() { let t = this, e = t.max - t.min, i = t.linkedParent, s = !!t.categories, o = t.isXAxis, r = t.axisPointRange || 0, a, n = 0, h = 0, l, d = t.transA; (o || s || r) && (a = t.getClosest(), i ? (n = i.minPointOffset, h = i.pointRangePadding) : t.series.forEach(function(e) { let i = s ? 1 : o ? sF(e.options.pointRange, a, 0) : t.axisPointRange || 0 , l = e.options.pointPlacement; if (r = Math.max(r, i), !t.single || s) { let t = e.is("xrange") ? !o : o; n = Math.max(n, t && sz(l) ? 0 : i / 2), h = Math.max(h, t && "on" === l ? 0 : i) } }), l = t.ordinal?.slope && a ? t.ordinal.slope / a : 1, t.minPointOffset = n *= l, t.pointRangePadding = h *= l, t.pointRange = Math.min(r, t.single && s ? 1 : e), o && (t.closestPointRange = a)), t.translationSlope = t.transA = d = t.staticScale || t.len / (e + h || 1), t.transB = t.horiz ? t.left : t.bottom, t.minPixelPadding = d * n, sE(this, "afterSetAxisTranslation") } minFromRange() { let {max: t, min: e} = this; return sN(t) && sN(e) && t - e || void 0 } setTickInterval(t) { let {categories: e, chart: i, dataMax: s, dataMin: o, dateTime: r, isXAxis: a, logarithmic: n, options: h, softThreshold: l} = this, d = i.time, c = sN(this.threshold) ? this.threshold : void 0, p = this.minRange || 0, {ceiling: g, floor: u, linkedTo: f, softMax: m, softMin: x} = h, y = sN(f) && i[this.coll]?.[f], b = h.tickPixelInterval, v = h.maxPadding, k = h.minPadding, w = 0, M, S = sN(h.tickInterval) && h.tickInterval >= 0 ? h.tickInterval : void 0, T, C, A, P; if (r || e || y || this.getTickAmount(), A = sF(this.userMin, d.parse(h.min)), P = sF(this.userMax, d.parse(h.max)), y ? (this.linkedParent = y, M = y.getExtremes(), this.min = sF(M.min, M.dataMin), this.max = sF(M.max, M.dataMax), this.type !== y.type && sL(11, !0, i)) : (l && sC(c) && sN(s) && sN(o) && (o >= c ? (T = c, k = 0) : s <= c && (C = c, v = 0)), this.min = sF(A, T, o), this.max = sF(P, C, s)), sN(this.max) && sN(this.min) && (n && (this.positiveValuesOnly && !t && 0 >= Math.min(this.min, sF(o, this.min)) && sL(10, !0, i), this.min = sT(n.log2lin(this.min), 16), this.max = sT(n.log2lin(this.max), 16)), this.range && sN(o) && (this.userMin = this.min = A = Math.max(o, this.minFromRange() || 0), this.userMax = P = this.max, this.range = void 0)), sE(this, "foundExtremes"), this.adjustForMinRange(), sN(this.min) && sN(this.max)) { if (!sN(this.userMin) && sN(x) && x < this.min && (this.min = A = x), !sN(this.userMax) && sN(m) && m > this.max && (this.max = P = m), e || this.axisPointRange || this.stacking?.usePercentage || y || !(w = this.max - this.min) || (!sC(A) && k && (this.min -= w * k), sC(P) || !v || (this.max += w * v)), !sN(this.userMin) && sN(u) && (this.min = Math.max(this.min, u)), !sN(this.userMax) && sN(g) && (this.max = Math.min(this.max, g)), l && sN(o) && sN(s)) { let t = c || 0; !sC(A) && this.min < t && o >= t ? this.min = h.minRange ? Math.min(t, this.max - p) : t : !sC(P) && this.max > t && s <= t && (this.max = h.minRange ? Math.max(t, this.min + p) : t) } !i.polar && this.min > this.max && (sC(h.min) ? this.max = this.min : sC(h.max) && (this.min = this.max)), w = this.max - this.min } if (this.min !== this.max && sN(this.min) && sN(this.max) ? y && !S && b === y.options.tickPixelInterval ? this.tickInterval = S = y.tickInterval : this.tickInterval = sF(S, this.tickAmount ? w / Math.max(this.tickAmount - 1, 1) : void 0, e ? 1 : w * b / Math.max(this.len, b)) : this.tickInterval = 1, a && !t) { let t = this.min !== this.old?.min || this.max !== this.old?.max; this.series.forEach(function(e) { e.forceCrop = e.forceCropping?.(), e.processData(t) }), sE(this, "postProcessData", { hasExtremesChanged: t }) } this.setAxisTranslation(), sE(this, "initialAxisTranslation"), this.pointRange && !S && (this.tickInterval = Math.max(this.pointRange, this.tickInterval)); let L = sF(h.minTickInterval, r && !this.series.some(t => !t.sorted) ? this.closestPointRange : 0); !S && L && this.tickInterval < L && (this.tickInterval = L), r || n || S || (this.tickInterval = sU(this, this.tickInterval)), this.tickAmount || (this.tickInterval = this.unsquish()), this.setTickPositions() } setTickPositions() { let t = this.options, e = t.tickPositions, i = t.tickPositioner, s = this.getMinorTickInterval(), o = !this.isPanning, r = o && t.startOnTick, a = o && t.endOnTick, n = [], h; if (this.tickmarkOffset = this.categories && "between" === t.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0, this.single = this.min === this.max && sC(this.min) && !this.tickAmount && (this.min % 1 == 0 || !1 !== t.allowDecimals), e) n = e.slice(); else if (sN(this.min) && sN(this.max)) { if (!this.ordinal?.positions && (this.max - this.min) / this.tickInterval > Math.max(2 * this.len, 200)) n = [this.min, this.max], sL(19, !1, this.chart); else if (this.dateTime) n = this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval, t.units), this.min, this.max, t.startOfWeek, this.ordinal?.positions, this.closestPointRange, !0); else if (this.logarithmic) n = this.logarithmic.getLogTickPositions(this.tickInterval, this.min, this.max); else { let t = this.tickInterval , e = t; for (; e <= 2 * t; ) if (n = this.getLinearTickPositions(this.tickInterval, this.min, this.max), this.tickAmount && n.length > this.tickAmount) this.tickInterval = sU(this, e *= 1.1); else break } n.length > this.len && (n = [n[0], n[n.length - 1]])[0] === n[1] && (n.length = 1), i && (this.tickPositions = n, (h = i.apply(this, [this.min, this.max])) && (n = h)) } this.tickPositions = n, this.minorTickInterval = "auto" === s && this.tickInterval ? this.tickInterval / t.minorTicksPerMajor : s, this.paddedTicks = n.slice(0), this.trimTicks(n, r, a), !this.isLinked && sN(this.min) && sN(this.max) && (this.single && n.length < 2 && !this.categories && !this.series.some(t => t.is("heatmap") && "between" === t.options.pointPlacement) && (this.min -= .5, this.max += .5), e || h || this.adjustTickAmount()), sE(this, "afterSetTickPositions") } trimTicks(t, e, i) { let s = t[0] , o = t[t.length - 1] , r = !this.isOrdinal && this.minPointOffset || 0; if (sE(this, "trimTicks"), !this.isLinked || !this.grid) { if (e && s !== -1 / 0) this.min = s; else for (; this.min - r > t[0]; ) t.shift(); if (i) this.max = o; else for (; this.max + r < t[t.length - 1]; ) t.pop(); 0 === t.length && sC(s) && !this.options.tickPositions && t.push((o + s) / 2) } } alignToOthers() { let t, e = this, i = e.chart, s = [this], o = e.options, r = i.options.chart, a = "yAxis" === this.coll && r.alignThresholds, n = []; if (e.thresholdAlignment = void 0, (!1 !== r.alignTicks && o.alignTicks || a) && !1 !== o.startOnTick && !1 !== o.endOnTick && !e.logarithmic) { let o = t => { let {horiz: e, options: i} = t; return [e ? i.left : i.top, i.width, i.height, i.pane].join(",") } , r = o(this); i[this.coll].forEach(function(i) { let {series: a} = i; a.length && a.some(t => t.visible) && i !== e && o(i) === r && (t = !0, s.push(i)) }) } if (t && a) { s.forEach(t => { let i = t.getThresholdAlignment(e); sN(i) && n.push(i) } ); let t = n.length > 1 ? n.reduce( (t, e) => t += e, 0) / n.length : void 0; s.forEach(e => { e.thresholdAlignment = t } ) } return t } getThresholdAlignment(t) { if ((!sN(this.dataMin) || this !== t && this.series.some(t => t.isDirty || t.isDirtyData)) && this.getSeriesExtremes(), sN(this.threshold)) { let t = sS((this.threshold - (this.dataMin || 0)) / ((this.dataMax || 0) - (this.dataMin || 0)), 0, 1); return this.options.reversed && (t = 1 - t), t } } getTickAmount() { let t = this.options , e = t.tickPixelInterval , i = t.tickAmount; sC(t.tickInterval) || i || !(this.len < e) || this.isRadial || this.logarithmic || !t.startOnTick || !t.endOnTick || (i = 2), !i && this.alignToOthers() && (i = Math.ceil(this.len / e) + 1), i < 4 && (this.finalTickAmt = i, i = 5), this.tickAmount = i } adjustTickAmount() { let t = this, {finalTickAmt: e, max: i, min: s, options: o, tickPositions: r, tickAmount: a, thresholdAlignment: n} = t, h = r?.length, l = sF(t.threshold, t.softThreshold ? 0 : null), d, c, p = t.tickInterval, g, u = () => r.push(sT(r[r.length - 1] + p)), f = () => r.unshift(sT(r[0] - p)); if (sN(n) && (g = n < .5 ? Math.ceil(n * (a - 1)) : Math.floor(n * (a - 1)), o.reversed && (g = a - 1 - g)), t.hasData() && sN(s) && sN(i)) { let n = () => { t.transA *= (h - 1) / (a - 1), t.min = o.startOnTick ? r[0] : Math.min(s, r[0]), t.max = o.endOnTick ? r[r.length - 1] : Math.max(i, r[r.length - 1]) } ; if (sN(g) && sN(t.threshold)) { for (; r[g] !== l || r.length !== a || r[0] > s || r[r.length - 1] < i; ) { for (r.length = 0, r.push(t.threshold); r.length < a; ) void 0 === r[g] || r[g] > t.threshold ? f() : u(); if (p > 8 * t.tickInterval) break; p *= 2 } n() } else if (h < a) { for (; r.length < a; ) r.length % 2 || s === l ? u() : f(); n() } if (sC(e)) { for (c = d = r.length; c--; ) (3 === e && c % 2 == 1 || e <= 2 && c > 0 && c < d - 1) && r.splice(c, 1); t.finalTickAmt = void 0 } } } setScale() { let {coll: t, stacking: e} = this , i = !1 , s = !1; this.series.forEach(t => { i = i || t.isDirtyData || t.isDirty, s = s || t.xAxis?.isDirty || !1 } ), this.setAxisSize(); let o = this.len !== this.old?.len; o || i || s || this.isLinked || this.forceRedraw || this.userMin !== this.old?.userMin || this.userMax !== this.old?.userMax || this.alignToOthers() ? (e && "yAxis" === t && e.buildStacks(), this.forceRedraw = !1, this.userMinRange || (this.minRange = void 0), this.getSeriesExtremes(), this.setTickInterval(), e && "xAxis" === t && e.buildStacks(), this.isDirty || (this.isDirty = o || this.min !== this.old?.min || this.max !== this.old?.max)) : e && e.cleanStacks(), i && delete this.allExtremes, sE(this, "afterSetScale") } setExtremes(t, e, i=!0, s, o) { let r = this.chart; this.series.forEach(t => { delete t.kdTree } ), t = r.time.parse(t), e = r.time.parse(e), sE(this, "setExtremes", o = sO(o, { min: t, max: e }), t => { this.userMin = t.min, this.userMax = t.max, this.eventArgs = t, i && r.redraw(s) } ) } setAxisSize() { let t = this.chart , e = this.options , i = e.offsets || [0, 0, 0, 0] , s = this.horiz , o = this.width = Math.round(sX(sF(e.width, t.plotWidth - i[3] + i[1]), t.plotWidth)) , r = this.height = Math.round(sX(sF(e.height, t.plotHeight - i[0] + i[2]), t.plotHeight)) , a = this.top = Math.round(sX(sF(e.top, t.plotTop + i[0]), t.plotHeight, t.plotTop)) , n = this.left = Math.round(sX(sF(e.left, t.plotLeft + i[3]), t.plotWidth, t.plotLeft)); this.bottom = t.chartHeight - r - a, this.right = t.chartWidth - o - n, this.len = Math.max(s ? o : r, 0), this.pos = s ? n : a } getExtremes() { let t = this.logarithmic; return { min: t ? sT(t.lin2log(this.min)) : this.min, max: t ? sT(t.lin2log(this.max)) : this.max, dataMin: this.dataMin, dataMax: this.dataMax, userMin: this.userMin, userMax: this.userMax } } getThreshold(t) { let e = this.logarithmic , i = e ? e.lin2log(this.min) : this.min , s = e ? e.lin2log(this.max) : this.max; return null === t || t === -1 / 0 ? t = i : t === 1 / 0 ? t = s : i > t ? t = i : s < t && (t = s), this.translate(t, 0, 1, 0, 1) } autoLabelAlign(t) { let e = (sF(t, 0) - 90 * this.side + 720) % 360 , i = { align: "center" }; return sE(this, "autoLabelAlign", i, function(t) { e > 15 && e < 165 ? t.align = "right" : e > 195 && e < 345 && (t.align = "left") }), i.align } tickSize(t) { let e = this.options, i = sF(e["tick" === t ? "tickWidth" : "minorTickWidth"], "tick" === t && this.isXAxis && !this.categories ? 1 : 0), s = e["tick" === t ? "tickLength" : "minorTickLength"], o; i && s && ("inside" === e[t + "Position"] && (s = -s), o = [s, i]); let r = { tickSize: o }; return sE(this, "afterTickSize", r), r.tickSize } labelMetrics() { let t = this.chart.renderer , e = this.ticks , i = e[Object.keys(e)[0]] || {}; return this.chart.renderer.fontMetrics(i.label || i.movedLabel || t.box) } unsquish() { let t = this.options.labels, e = t.padding || 0, i = this.horiz, s = this.tickInterval, o = this.len / ((+!!this.categories + this.max - this.min) / s), r = t.rotation, a = sT(.8 * this.labelMetrics().h), n = Math.max(this.max - this.min, 0), h = function(t) { let i = (t + 2 * e) / (o || 1); return (i = i > 1 ? Math.ceil(i) : 1) * s > n && t !== 1 / 0 && o !== 1 / 0 && n && (i = Math.ceil(n / s)), sT(i * s) }, l = s, d, c = Number.MAX_VALUE, p; if (i) { if (!t.staggerLines && (sN(r) ? p = [r] : o < t.autoRotationLimit && (p = t.autoRotation)), p) { let t, e; for (let i of p) (i === r || i && i >= -90 && i <= 90) && (e = (t = h(Math.abs(a / Math.sin(sk * i)))) + Math.abs(i / 360)) < c && (c = e, d = i, l = t) } } else l = h(.75 * a); return this.autoRotation = p, this.labelRotation = sF(d, sN(r) ? r : 0), t.step ? s : l } getSlotWidth(t) { let e = this.chart , i = this.horiz , s = this.options.labels , o = Math.max(this.tickPositions.length - +!this.categories, 1) , r = e.margin[3]; if (t && sN(t.slotWidth)) return t.slotWidth; if (i && s.step < 2 && !this.isRadial) return s.rotation ? 0 : (this.staggerLines || 1) * this.len / o; if (!i) { let t = s.style.width; if (void 0 !== t) return parseInt(String(t), 10); if (r) return r - e.spacing[3] } return .33 * e.chartWidth } renderUnsquish() { let t = this.chart, e = t.renderer, i = this.tickPositions, s = this.ticks, o = this.options.labels, r = o.style, a = this.horiz, n = this.getSlotWidth(), h = Math.max(1, Math.round(n - (a ? 2 * (o.padding || 0) : o.distance || 0))), l = {}, d = this.labelMetrics(), c = r.lineClamp, p, g = c ?? (Math.floor(this.len / (i.length * d.h)) || 1), u = 0; sz(o.rotation) || (l.rotation = o.rotation || 0), i.forEach(function(t) { let e = s[t]; e.movedLabel && e.replaceMovedLabel(); let i = e.label?.textPxLength || 0; i > u && (u = i) }), this.maxLabelLength = u, this.autoRotation ? u > h && u > d.h ? l.rotation = this.labelRotation : this.labelRotation = 0 : n && (p = h), l.rotation && (p = u > .5 * t.chartHeight ? .33 * t.chartHeight : u, c || (g = 1)), this.labelAlign = o.align || this.autoLabelAlign(this.labelRotation), this.labelAlign && (l.align = this.labelAlign), i.forEach(function(t) { let e = s[t] , i = e?.label , o = r.width , a = {}; i && (i.attr(l), e.shortenLabel ? e.shortenLabel() : p && !o && "nowrap" !== r.whiteSpace && (p < (i.textPxLength || 0) || "SPAN" === i.element.tagName) ? i.css(sO(a, { width: `${p}px`, lineClamp: g })) : !i.styles.width || a.width || o || i.css({ width: "auto" }), e.rotation = l.rotation) }, this), this.tickRotCorr = e.rotCorr(d.b, this.labelRotation || 0, 0 !== this.side) } hasData() { return this.series.some(function(t) { return t.hasData() }) || this.options.showEmpty && sC(this.min) && sC(this.max) } addTitle(t) { let e, i = this.chart.renderer, s = this.horiz, o = this.opposite, r = this.options.title, a = this.chart.styledMode; this.axisTitle || ((e = r.textAlign) || (e = (s ? { low: "left", middle: "center", high: "right" } : { low: o ? "right" : "left", middle: "center", high: o ? "left" : "right" })[r.align]), this.axisTitle = i.text(r.text || "", 0, 0, r.useHTML).attr({ zIndex: 7, rotation: r.rotation || 0, align: e }).addClass("highcharts-axis-title"), a || this.axisTitle.css(sR(r.style)), this.axisTitle.add(this.axisGroup), this.axisTitle.isNew = !0), a || r.style.width || this.isRadial || this.axisTitle.css({ width: this.len + "px" }), this.axisTitle[t ? "show" : "hide"](t) } generateTick(t) { let e = this.ticks; e[t] ? e[t].addLabel() : e[t] = new sf(this,t) } createGroups() { let {axisParent: t, chart: e, coll: i, options: s} = this , o = e.renderer , r = (e, r, a) => o.g(e).attr({ zIndex: a }).addClass(`highcharts-${i.toLowerCase()}${r} ` + (this.isRadial ? `highcharts-radial-axis${r} ` : "") + (s.className || "")).add(t); this.axisGroup || (this.gridGroup = r("grid", "-grid", s.gridZIndex), this.axisGroup = r("axis", "", s.zIndex), this.labelGroup = r("axis-labels", "-labels", s.labels.zIndex)) } getOffset() { let t = this, {chart: e, horiz: i, options: s, side: o, ticks: r, tickPositions: a, coll: n} = t, h = e.inverted && !t.isZAxis ? [1, 0, 3, 2][o] : o, l = t.hasData(), d = s.title, c = s.labels, p = sN(s.crossing), g = e.axisOffset, u = e.clipOffset, f = [-1, 1, 1, -1][o], m, x = 0, y, b = 0, v = 0, k, w; if (t.showAxis = m = l || s.showEmpty, t.staggerLines = t.horiz && c.staggerLines || void 0, t.createGroups(), l || t.isLinked ? (a.forEach(function(e) { t.generateTick(e) }), t.renderUnsquish(), t.reserveSpaceDefault = 0 === o || 2 === o || ({ 1: "left", 3: "right" })[o] === t.labelAlign, sF(c.reserveSpace, !p && null, "center" === t.labelAlign || null, t.reserveSpaceDefault) && a.forEach(function(t) { v = Math.max(r[t].getLabelSize(), v) }), t.staggerLines && (v *= t.staggerLines), t.labelOffset = v * (t.opposite ? -1 : 1)) : sH(r, function(t, e) { t.destroy(), delete r[e] }), d?.text && !1 !== d.enabled && (t.addTitle(m), m && !p && !1 !== d.reserveSpace && (t.titleOffset = x = t.axisTitle.getBBox()[i ? "height" : "width"], b = sC(y = d.offset) ? 0 : sF(d.margin, i ? 5 : 10))), t.renderLine(), t.offset = f * sF(s.offset, g[o] ? g[o] + (s.margin || 0) : 0), t.tickRotCorr = t.tickRotCorr || { x: 0, y: 0 }, w = 0 === o ? -t.labelMetrics().h : 2 === o ? t.tickRotCorr.y : 0, k = Math.abs(v) + b, v && (k -= w, k += f * (i ? sF(c.y, t.tickRotCorr.y + f * c.distance) : sF(c.x, f * c.distance))), t.axisTitleMargin = sF(y, k), t.getMaxLabelDimensions && (t.maxLabelDimensions = t.getMaxLabelDimensions(r, a)), "colorAxis" !== n && u) { let e = this.tickSize("tick"); g[o] = Math.max(g[o], (t.axisTitleMargin || 0) + x + f * t.offset, k, a?.length && e ? e[0] + f * t.offset : 0); let i = !t.axisLine || s.offset ? 0 : t.axisLine.strokeWidth() / 2; u[h] = Math.max(u[h], i) } sE(this, "afterGetOffset") } getLinePath(t) { let e = this.chart , i = this.opposite , s = this.offset , o = this.horiz , r = this.left + (i ? this.width : 0) + s , a = e.chartHeight - this.bottom - (i ? this.height : 0) + s; return i && (t *= -1), e.renderer.crispLine([["M", o ? this.left : r, o ? a : this.top], ["L", o ? e.chartWidth - this.right : r, o ? a : e.chartHeight - this.bottom]], t) } renderLine() { this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.chart.styledMode || this.axisLine.attr({ stroke: this.options.lineColor, "stroke-width": this.options.lineWidth, zIndex: 7 })) } getTitlePosition(t) { let e = this.horiz , i = this.left , s = this.top , o = this.len , r = this.options.title , a = e ? i : s , n = this.opposite , h = this.offset , l = r.x , d = r.y , c = this.chart.renderer.fontMetrics(t) , p = t ? Math.max(t.getBBox(!1, 0).height - c.h - 1, 0) : 0 , g = { low: a + (e ? 0 : o), middle: a + o / 2, high: a + (e ? o : 0) }[r.align] , u = (e ? s + this.height : i) + (e ? 1 : -1) * (n ? -1 : 1) * (this.axisTitleMargin || 0) + [-p, p, c.f, -p][this.side] , f = { x: e ? g + l : u + (n ? this.width : 0) + h + l, y: e ? u + d - (n ? this.height : 0) + h : g + d }; return sE(this, "afterGetTitlePosition", { titlePosition: f }), f } renderMinorTick(t, e) { let i = this.minorTicks; i[t] || (i[t] = new sf(this,t,"minor")), e && i[t].isNew && i[t].render(null, !0), i[t].render(null, !1, 1) } renderTick(t, e, i) { let s = this.isLinked , o = this.ticks; (!s || t >= this.min && t <= this.max || this.grid?.isColumn) && (o[t] || (o[t] = new sf(this,t)), i && o[t].isNew && o[t].render(e, !0, -1), o[t].render(e)) } render() { let t, e, i = this, s = i.chart, o = i.logarithmic, r = s.renderer, a = i.options, n = i.isLinked, h = i.tickPositions, l = i.axisTitle, d = i.ticks, c = i.minorTicks, p = i.alternateBands, g = a.stackLabels, u = a.alternateGridColor, f = a.crossing, m = i.tickmarkOffset, x = i.axisLine, y = i.showAxis, b = sm(r.globalAnimation); if (i.labelEdge.length = 0, i.overlap = !1, [d, c, p].forEach(function(t) { sH(t, function(t) { t.isActive = !1 }) }), sN(f)) { let t = this.isXAxis ? s.yAxis[0] : s.xAxis[0] , e = [1, -1, -1, 1][this.side]; if (t) { let s = t.toPixels(f, !0); i.horiz && (s = t.len - s), i.offset = e * s } } if (i.hasData() || n) { let r = i.chart.hasRendered && i.old && sN(i.old.min); i.minorTickInterval && !i.categories && i.getMinorTickPositions().forEach(function(t) { i.renderMinorTick(t, r) }), h.length && (h.forEach(function(t, e) { i.renderTick(t, e, r) }), m && (0 === i.min || i.single) && (d[-1] || (d[-1] = new sf(i,-1,null,!0)), d[-1].render(-1))), u && h.forEach(function(r, a) { e = void 0 !== h[a + 1] ? h[a + 1] + m : i.max - m, a % 2 == 0 && r < i.max && e <= i.max + (s.polar ? -m : m) && (p[r] || (p[r] = new w.PlotLineOrBand(i,{})), t = r + m, p[r].options = { from: o ? o.lin2log(t) : t, to: o ? o.lin2log(e) : e, color: u, className: "highcharts-alternate-grid" }, p[r].render(), p[r].isActive = !0) }), i._addedPlotLB || (i._addedPlotLB = !0, (a.plotLines || []).concat(a.plotBands || []).forEach(function(t) { i.addPlotBandOrLine(t) })) } [d, c, p].forEach(function(t) { let e = [] , i = b.duration; sH(t, function(t, i) { t.isActive || (t.render(i, !1, 0), t.isActive = !1, e.push(i)) }), sY(function() { let i = e.length; for (; i--; ) t[e[i]] && !t[e[i]].isActive && (t[e[i]].destroy(), delete t[e[i]]) }, t !== p && s.hasRendered && i ? i : 0) }), x && (x[x.isPlaced ? "animate" : "attr"]({ d: this.getLinePath(x.strokeWidth()) }), x.isPlaced = !0, x[y ? "show" : "hide"](y)), l && y && (l[l.isNew ? "attr" : "animate"](i.getTitlePosition(l)), l.isNew = !1), g?.enabled && i.stacking && i.stacking.renderStackTotals(), i.old = { len: i.len, max: i.max, min: i.min, transA: i.transA, userMax: i.userMax, userMin: i.userMin }, i.isDirty = !1, sE(this, "afterRender") } redraw() { this.visible && (this.render(), this.plotLinesAndBands.forEach(function(t) { t.render() })), this.series.forEach(function(t) { t.isDirty = !0 }) } getKeepProps() { return this.keepProps || s$.keepProps } destroy(t) { let e = this , i = e.plotLinesAndBands , s = this.eventOptions; if (sE(this, "destroy", { keepEvents: t }), t || sG(e), [e.ticks, e.minorTicks, e.alternateBands].forEach(function(t) { sA(t) }), i) { let t = i.length; for (; t--; ) i[t].destroy() } for (let t in ["axisLine", "axisTitle", "axisGroup", "gridGroup", "labelGroup", "cross", "scrollbar"].forEach(function(t) { e[t] && (e[t] = e[t].destroy()) }), e.plotLinesAndBandsGroups) e.plotLinesAndBandsGroups[t] = e.plotLinesAndBandsGroups[t].destroy(); sH(e, function(t, i) { -1 === e.getKeepProps().indexOf(i) && delete e[i] }), this.eventOptions = s } drawCrosshair(t, e) { let i = this.crosshair, s = i?.snap ?? !0, o = this.chart, r, a, n, h = this.cross, l; if (sE(this, "drawCrosshair", { e: t, point: e }), t || (t = this.cross?.e), i && !1 !== (sC(e) || !s)) { if (s ? sC(e) && (a = sF("colorAxis" !== this.coll ? e.crosshairPos : null, this.isXAxis ? e.plotX : this.len - e.plotY)) : a = t && (this.horiz ? t.chartX - this.pos : this.len - t.chartY + this.pos), sC(a) && (l = { value: e && (this.isXAxis ? e.x : sF(e.stackY, e.y)), translatedValue: a }, o.polar && sO(l, { isCrosshair: !0, chartX: t?.chartX, chartY: t?.chartY, point: e }), r = this.getPlotLinePath(l) || null), !sC(r)) { this.hideCrosshair(); return } n = this.categories && !this.isRadial, h || (this.cross = h = o.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (n ? "category " : "thin ") + (i.className || "")).attr({ zIndex: sF(i.zIndex, 2) }).add(), !o.styledMode && (h.attr({ stroke: i.color || (n ? tL.parse("#ccd3ff").setOpacity(.25).get() : "#cccccc"), "stroke-width": sF(i.width, 1) }).css({ "pointer-events": "none" }), i.dashStyle && h.attr({ dashstyle: i.dashStyle }))), h.show().attr({ d: r }), n && !i.width && h.attr({ "stroke-width": this.transA }), this.cross.e = t } else this.hideCrosshair(); sE(this, "afterDrawCrosshair", { e: t, point: e }) } hideCrosshair() { this.cross && this.cross.hide(), sE(this, "afterHideCrosshair") } update(t, e) { let i = this.chart; t = sR(this.userOptions, t), this.destroy(!0), this.init(i, t), i.isDirtyBox = !0, sF(e, !0) && i.redraw() } remove(t) { let e = this.chart , i = this.coll , s = this.series , o = s.length; for (; o--; ) s[o] && s[o].remove(!1); sP(e.axes, this), sP(e[i] || [], this), e.orderItems(i), this.destroy(), e.isDirtyBox = !0, sF(t, !0) && e.redraw() } setTitle(t, e) { this.update({ title: t }, e) } setCategories(t, e) { this.update({ categories: t }, e) } } s$.keepProps = ["coll", "extKey", "hcEvents", "len", "names", "series", "userMax", "userMin"]; let {addEvent: sV, getMagnitude: sZ, normalizeTickInterval: s_, timeUnits: sq} = V; !function(t) { function e() { return this.chart.time.getTimeTicks.apply(this.chart.time, arguments) } function i() { if ("datetime" !== this.type) { this.dateTime = void 0; return } this.dateTime || (this.dateTime = new s(this)) } t.compose = function(t) { return t.keepProps.includes("dateTime") || (t.keepProps.push("dateTime"), t.prototype.getTimeTicks = e, sV(t, "afterSetType", i)), t } ; class s { constructor(t) { this.axis = t } normalizeTimeTickInterval(t, e) { let i = e || [["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], ["second", [1, 2, 5, 10, 15, 30]], ["minute", [1, 2, 5, 10, 15, 30]], ["hour", [1, 2, 3, 4, 6, 8, 12]], ["day", [1, 2]], ["week", [1, 2]], ["month", [1, 2, 3, 4, 6]], ["year", null]], s = i[i.length - 1], o = sq[s[0]], r = s[1], a; for (a = 0; a < i.length && (o = sq[(s = i[a])[0]], r = s[1], !i[a + 1] || !(t <= (o * r[r.length - 1] + sq[i[a + 1][0]]) / 2)); a++) ; o === sq.year && t < 5 * o && (r = [1, 2, 5]); let n = s_(t / o, r, "year" === s[0] ? Math.max(sZ(t / o), 1) : 1); return { unitRange: o, count: n, unitName: s[0] } } getXDateFormat(t, e) { let {axis: i} = this , s = i.chart.time; return i.closestPointRange ? s.getDateFormat(i.closestPointRange, t, i.options.startOfWeek, e) || s.resolveDTLFormat(e.year).main : s.resolveDTLFormat(e.day).main } } t.Additions = s }(n || (n = {})); let sK = n , {addEvent: sJ, normalizeTickInterval: sQ, pick: s0} = V; !function(t) { function e() { "logarithmic" !== this.type ? this.logarithmic = void 0 : this.logarithmic ?? (this.logarithmic = new s(this)) } function i() { let t = this.logarithmic; t && (this.lin2val = function(e) { return t.lin2log(e) } , this.val2lin = function(e) { return t.log2lin(e) } ) } t.compose = function(t) { return t.keepProps.includes("logarithmic") || (t.keepProps.push("logarithmic"), sJ(t, "afterSetType", e), sJ(t, "afterInit", i)), t } ; class s { constructor(t) { this.axis = t } getLogTickPositions(t, e, i, s) { let o = this.axis , r = o.len , a = o.options , n = []; if (s || (this.minorAutoInterval = void 0), t >= .5) t = Math.round(t), n = o.getLinearTickPositions(t, e, i); else if (t >= .08) { let o, r, a, h, l, d, c, p = Math.floor(e); for (o = t > .3 ? [1, 2, 4] : t > .15 ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9], r = p; r < i + 1 && !c; r++) for (a = 0, h = o.length; a < h && !c; a++) (l = this.log2lin(this.lin2log(r) * o[a])) > e && (!s || d <= i) && void 0 !== d && n.push(d), d > i && (c = !0), d = l } else { let h = this.lin2log(e) , l = this.lin2log(i) , d = s ? o.getMinorTickInterval() : a.tickInterval , c = a.tickPixelInterval / (s ? 5 : 1) , p = s ? r / o.tickPositions.length : r; t = sQ(t = s0("auto" === d ? null : d, this.minorAutoInterval, (l - h) * c / (p || 1))), n = o.getLinearTickPositions(t, h, l).map(this.log2lin), s || (this.minorAutoInterval = t / 5) } return s || (o.tickInterval = t), n } lin2log(t) { return Math.pow(10, t) } log2lin(t) { return Math.log(t) / Math.LN10 } } t.Additions = s }(h || (h = {})); let s1 = h , {erase: s2, extend: s3, isNumber: s5} = V; !function(t) { let e; function i(t) { return this.addPlotBandOrLine(t, "plotBands") } function s(t, i) { let s = this.userOptions , o = new e(this,t); if (this.visible && (o = o.render()), o) { if (this._addedPlotLB || (this._addedPlotLB = !0, (s.plotLines || []).concat(s.plotBands || []).forEach(t => { this.addPlotBandOrLine(t) } )), i) { let e = s[i] || []; e.push(t), s[i] = e } this.plotLinesAndBands.push(o) } return o } function o(t) { return this.addPlotBandOrLine(t, "plotLines") } function r(t, e, i) { i = i || this.options; let s = this.getPlotLinePath({ value: e, force: !0, acrossPanes: i.acrossPanes }), o = [], r = this.horiz, a = !s5(this.min) || !s5(this.max) || t < this.min && e < this.min || t > this.max && e > this.max, n = this.getPlotLinePath({ value: t, force: !0, acrossPanes: i.acrossPanes }), h, l = 1, d; if (n && s) for (a && (d = n.toString() === s.toString(), l = 0), h = 0; h < n.length; h += 2) { let t = n[h] , e = n[h + 1] , i = s[h] , a = s[h + 1]; ("M" === t[0] || "L" === t[0]) && ("M" === e[0] || "L" === e[0]) && ("M" === i[0] || "L" === i[0]) && ("M" === a[0] || "L" === a[0]) && (r && i[1] === t[1] ? (i[1] += l, a[1] += l) : r || i[2] !== t[2] || (i[2] += l, a[2] += l), o.push(["M", t[1], t[2]], ["L", e[1], e[2]], ["L", a[1], a[2]], ["L", i[1], i[2]], ["Z"])), o.isFlat = d } return o } function a(t) { this.removePlotBandOrLine(t) } function n(t) { let e = this.plotLinesAndBands , i = this.options , s = this.userOptions; if (e) { let o = e.length; for (; o--; ) e[o].id === t && e[o].destroy(); [i.plotLines || [], s.plotLines || [], i.plotBands || [], s.plotBands || []].forEach(function(e) { for (o = e.length; o--; ) e[o]?.id === t && s2(e, e[o]) }) } } function h(t) { this.removePlotBandOrLine(t) } t.compose = function(t, l) { let d = l.prototype; return d.addPlotBand || (e = t, s3(d, { addPlotBand: i, addPlotLine: o, addPlotBandOrLine: s, getPlotBandPath: r, removePlotBand: a, removePlotLine: h, removePlotBandOrLine: n })), l } }(l || (l = {})); let s6 = l , {addEvent: s9, arrayMax: s4, arrayMin: s8, defined: s7, destroyObjectProperties: ot, erase: oe, fireEvent: oi, merge: os, objectEach: oo, pick: or} = V; class oa { static compose(t, e) { return s9(t, "afterInit", function() { this.labelCollectors.push( () => { let t = []; for (let e of this.axes) for (let {label: i, options: s} of e.plotLinesAndBands) i && !s?.label?.allowOverlap && t.push(i); return t } ) }), s6.compose(oa, e) } constructor(t, e) { this.axis = t, this.options = e, this.id = e.id } render() { oi(this, "render"); let {axis: t, options: e} = this, {horiz: i, logarithmic: s} = t, {color: o, events: r, zIndex: a=0} = e, {renderer: n, time: h} = t.chart, l = {}, d = h.parse(e.to), c = h.parse(e.from), p = h.parse(e.value), g = e.borderWidth, u = e.label, {label: f, svgElem: m} = this, x = [], y, b = s7(c) && s7(d), v = s7(p), k = !m, w = { class: "highcharts-plot-" + (b ? "band " : "line ") + (e.className || "") }, M = b ? "bands" : "lines"; if (!t.chart.styledMode && (v ? (w.stroke = o || "#999999", w["stroke-width"] = or(e.width, 1), e.dashStyle && (w.dashstyle = e.dashStyle)) : b && (w.fill = o || "#e6e9ff", g && (w.stroke = e.borderColor, w["stroke-width"] = g))), l.zIndex = a, M += "-" + a, (y = t.plotLinesAndBandsGroups[M]) || (t.plotLinesAndBandsGroups[M] = y = n.g("plot-" + M).attr(l).add()), m || (this.svgElem = m = n.path().attr(w).add(y)), s7(p)) x = t.getPlotLinePath({ value: s?.log2lin(p) ?? p, lineWidth: m.strokeWidth(), acrossPanes: e.acrossPanes }); else { if (!(s7(c) && s7(d))) return; x = t.getPlotBandPath(s?.log2lin(c) ?? c, s?.log2lin(d) ?? d, e) } return !this.eventsAdded && r && (oo(r, (t, e) => { m?.on(e, t => { r[e].apply(this, [t]) } ) } ), this.eventsAdded = !0), (k || !m.d) && x?.length ? m.attr({ d: x }) : m && (x ? (m.show(), m.animate({ d: x })) : m.d && (m.hide(), f && (this.label = f = f.destroy()))), u && (s7(u.text) || s7(u.formatter)) && x?.length && t.width > 0 && t.height > 0 && !x.isFlat ? (u = os({ align: i && b ? "center" : void 0, x: i ? !b && 4 : 10, verticalAlign: !i && b ? "middle" : void 0, y: i ? b ? 16 : 10 : b ? 6 : -4, rotation: i && !b ? 90 : 0, ...b ? { inside: !0 } : {} }, u), this.renderLabel(u, x, b, a)) : f && f.hide(), this } renderLabel(t, e, i, s) { let o = this.axis , r = o.chart.renderer , a = t.inside , n = this.label; n || (this.label = n = r.text(this.getLabelText(t), 0, 0, t.useHTML).attr({ align: t.textAlign || t.align, rotation: t.rotation, class: "highcharts-plot-" + (i ? "band" : "line") + "-label " + (t.className || ""), zIndex: s }), o.chart.styledMode || n.css(os({ fontSize: "0.8em", textOverflow: i && !a ? "" : "ellipsis" }, t.style)), n.add()); let h = e.xBounds || [e[0][1], e[1][1], i ? e[2][1] : e[0][1]] , l = e.yBounds || [e[0][2], e[1][2], i ? e[2][2] : e[0][2]] , d = s8(h) , c = s8(l) , p = s4(h) - d; n.align(t, !1, { x: d, y: c, width: p, height: s4(l) - c }), n.alignAttr.y -= r.fontMetrics(n).b, (!n.alignValue || "left" === n.alignValue || s7(a)) && n.css({ width: (t.style?.width || (i && a ? p : 90 === n.rotation ? o.height - (n.alignAttr.y - o.top) : (t.clip ? o.width : o.chart.chartWidth) - (n.alignAttr.x - o.left))) + "px" }), n.show(!0) } getLabelText(t) { return s7(t.formatter) ? t.formatter.call(this) : t.text } destroy() { oe(this.axis.plotLinesAndBands, this), delete this.axis, ot(this) } } let {animObject: on} = tU , {format: oh} = ep , {composed: ol, dateFormats: od, doc: oc, isSafari: op} = w , {distribute: og} = ey , {addEvent: ou, clamp: of, css: om, discardElement: ox, extend: oy, fireEvent: ob, getAlignFactor: ov, isArray: ok, isNumber: ow, isObject: oM, isString: oS, merge: oT, pick: oC, pushUnique: oA, splat: oP, syncTimeout: oL} = V; class oO { constructor(t, e, i) { this.allowShared = !0, this.crosshairs = [], this.distance = 0, this.isHidden = !0, this.isSticky = !1, this.options = {}, this.outside = !1, this.chart = t, this.init(t, e), this.pointer = i } bodyFormatter(t) { return t.map(t => { let e = t.series.tooltipOptions , i = t.formatPrefix || "point"; return (e[i + "Formatter"] || t.tooltipFormatter).call(t, e[i + "Format"] || "") } ) } cleanSplit(t) { this.chart.series.forEach(function(e) { let i = e?.tt; i && (!i.isActive || t ? e.tt = i.destroy() : i.isActive = !1) }) } defaultFormatter(t) { let e, i = this.points || oP(this); return (e = (e = [t.headerFooterFormatter(i[0])]).concat(t.bodyFormatter(i))).push(t.headerFooterFormatter(i[0], !0)), e } destroy() { this.label && (this.label = this.label.destroy()), this.split && (this.cleanSplit(!0), this.tt && (this.tt = this.tt.destroy())), this.renderer && (this.renderer = this.renderer.destroy(), ox(this.container)), V.clearTimeout(this.hideTimer) } getAnchor(t, e) { let i, {chart: s, pointer: o} = this, r = s.inverted, a = s.plotTop, n = s.plotLeft; if (t = oP(t), t[0].series?.yAxis && !t[0].series.yAxis.options.reversedStacks && (t = t.slice().reverse()), this.followPointer && e) void 0 === e.chartX && (e = o.normalize(e)), i = [e.chartX - n, e.chartY - a]; else if (t[0].tooltipPos) i = t[0].tooltipPos; else { let s = 0 , o = 0; t.forEach(function(t) { let e = t.pos(!0); e && (s += e[0], o += e[1]) }), s /= t.length, o /= t.length, this.shared && t.length > 1 && e && (r ? s = e.chartX : o = e.chartY), i = [s - n, o - a] } return i.map(Math.round) } getClassName(t, e, i) { let s = this.options , o = t.series , r = o.options; return [s.className, "highcharts-label", i && "highcharts-tooltip-header", e ? "highcharts-tooltip-box" : "highcharts-tooltip", !i && "highcharts-color-" + oC(t.colorIndex, o.colorIndex), r?.className].filter(oS).join(" ") } getLabel({anchorX: t, anchorY: e}={ anchorX: 0, anchorY: 0 }) { let i = this , s = this.chart.styledMode , o = this.options , r = this.split && this.allowShared , a = this.container , n = this.chart.renderer; if (this.label) { let t = !this.label.hasClass("highcharts-label"); (!r && t || r && !t) && this.destroy() } if (!this.label) { if (this.outside) { let t = this.chart , e = t.options.chart.style , i = eg.getRendererType(); this.container = a = w.doc.createElement("div"), a.className = "highcharts-tooltip-container " + (t.renderTo.className.match(/(highcharts[a-zA-Z0-9-]+)\s?/gm) || ""), om(a, { position: "absolute", top: "1px", pointerEvents: "none", zIndex: Math.max(this.options.style.zIndex || 0, (e?.zIndex || 0) + 3) }), this.renderer = n = new i(a,0,0,e,void 0,void 0,n.styledMode) } if (r ? this.label = n.g("tooltip") : (this.label = n.label("", t, e, o.shape || "callout", void 0, void 0, o.useHTML, void 0, "tooltip").attr({ padding: o.padding, r: o.borderRadius }), s || this.label.attr({ fill: o.backgroundColor, "stroke-width": o.borderWidth || 0 }).css(o.style).css({ pointerEvents: o.style.pointerEvents || (this.shouldStickOnContact() ? "auto" : "none") })), i.outside) { let t = this.label; [t.xSetter, t.ySetter].forEach( (e, s) => { t[s ? "ySetter" : "xSetter"] = o => { e.call(t, i.distance), t[s ? "y" : "x"] = o, a && (a.style[s ? "top" : "left"] = `${o}px`) } } ) } this.label.attr({ zIndex: 8 }).shadow(o.shadow ?? !o.fixed).add() } return a && !a.parentElement && w.doc.body.appendChild(a), this.label } getPlayingField() { let {body: t, documentElement: e} = oc , {chart: i, distance: s, outside: o} = this; return { width: o ? Math.max(t.scrollWidth, e.scrollWidth, t.offsetWidth, e.offsetWidth, e.clientWidth) - 2 * s - 2 : i.chartWidth, height: o ? Math.max(t.scrollHeight, e.scrollHeight, t.offsetHeight, e.offsetHeight, e.clientHeight) : i.chartHeight } } getPosition(t, e, i) { let {distance: s, chart: o, outside: r, pointer: a} = this, {inverted: n, plotLeft: h, plotTop: l, polar: d} = o, {plotX: c=0, plotY: p=0} = i, g = {}, u = n && i.h || 0, {height: f, width: m} = this.getPlayingField(), x = a.getChartPosition(), y = t => t * x.scaleX, b = t => t * x.scaleY, v = i => { let a = "x" === i; return [i, a ? m : f, a ? t : e].concat(r ? [a ? y(t) : b(e), a ? x.left - s + y(c + h) : x.top - s + b(p + l), 0, a ? m : f] : [a ? t : e, a ? c + h : p + l, a ? h : l, a ? h + o.plotWidth : l + o.plotHeight]) } , k = v("y"), w = v("x"), M, S = !!i.negative; !d && o.hoverSeries?.yAxis?.reversed && (S = !S); let T = !this.followPointer && oC(i.ttBelow, !d && !n === S) , C = function(t, e, i, o, a, n, h) { let l = r ? "y" === t ? b(s) : y(s) : s , d = (i - o) / 2 , c = o < a - s , p = a + s + o < e , f = a - l - i + d , m = a + l - d; if (T && p) g[t] = m; else if (!T && c) g[t] = f; else if (c) g[t] = Math.min(h - o, f - u < 0 ? f : f - u); else { if (!p) return g[t] = 0, !1; g[t] = Math.max(n, m + u + i > e ? m : m + u) } } , A = function(t, e, i, o, r) { if (r < s || r > e - s) return !1; r < i / 2 ? g[t] = 1 : r > e - o / 2 ? g[t] = e - o - 2 : g[t] = r - i / 2 } , P = function(t) { [k,w] = [w, k], M = t } , L = () => { !1 !== C.apply(0, k) ? !1 !== A.apply(0, w) || M || (P(!0), L()) : M ? g.x = g.y = 0 : (P(!0), L()) } ; return (n && !d || this.len > 1) && P(), L(), g } getFixedPosition(t, e, i) { let s = i.series , {chart: o, options: r, split: a} = this , n = r.position , h = n.relativeTo , l = r.shared || s?.yAxis?.isRadial && ("pane" === h || !h) ? "plotBox" : h , d = "chart" === l ? o.renderer : o[l] || o.getClipBox(s, !0); return { x: d.x + (d.width - t) * ov(n.align) + n.x, y: d.y + (d.height - e) * ov(n.verticalAlign) + (!a && n.y || 0) } } hide(t) { let e = this; V.clearTimeout(this.hideTimer), t = oC(t, this.options.hideDelay), this.isHidden || (this.hideTimer = oL(function() { let i = e.getLabel(); e.getLabel().animate({ opacity: 0 }, { duration: t ? 150 : t, complete: () => { i.hide(), e.container && e.container.remove() } }), e.isHidden = !0 }, t)) } init(t, e) { this.chart = t, this.options = e, this.crosshairs = [], this.isHidden = !0, this.split = e.split && !t.inverted && !t.polar, this.shared = e.shared || this.split, this.outside = oC(e.outside, !!(t.scrollablePixelsX || t.scrollablePixelsY)) } shouldStickOnContact(t) { return !!(!this.followPointer && this.options.stickOnContact && (!t || this.pointer.inClass(t.target, "highcharts-tooltip"))) } move(t, e, i, s) { let {followPointer: o, options: r} = this , a = on(!o && !this.isHidden && !r.fixed && r.animation) , n = o || (this.len || 0) > 1 , h = { x: t, y: e }; n ? h.anchorX = h.anchorY = NaN : (h.anchorX = i, h.anchorY = s), a.step = () => this.drawTracker(), this.getLabel().animate(h, a) } refresh(t, e) { let {chart: i, options: s, pointer: o, shared: r} = this , a = oP(t) , n = a[0] , h = s.format , l = s.formatter || this.defaultFormatter , d = i.styledMode , c = this.allowShared; if (!s.enabled || !n.series) return; V.clearTimeout(this.hideTimer), this.allowShared = !(!ok(t) && t.series && t.series.noSharedTooltip), c = c && !this.allowShared, this.followPointer = !this.split && n.series.tooltipOptions.followPointer; let p = this.getAnchor(t, e) , g = p[0] , u = p[1]; r && this.allowShared && (o.applyInactiveState(a), a.forEach(t => t.setState("hover")), n.points = a), this.len = a.length; let f = oS(h) ? oh(h, n, i) : l.call(n, this); n.points = void 0; let m = n.series; if (this.distance = oC(m.tooltipOptions.distance, 16), !1 === f) this.hide(); else { if (this.split && this.allowShared) this.renderSplit(f, a); else { let t = g , r = u; if (e && o.isDirectTouch && (t = e.chartX - i.plotLeft, r = e.chartY - i.plotTop), i.polar || !1 === m.options.clip || a.some(e => o.isDirectTouch || e.series.shouldShowTooltip(t, r))) { let t = this.getLabel(c && this.tt || {}); (!s.style.width || d) && t.css({ width: (this.outside ? this.getPlayingField() : i.spacingBox).width + "px" }), t.attr({ class: this.getClassName(n), text: f && f.join ? f.join("") : f }), this.outside && t.attr({ x: of(t.x || 0, 0, this.getPlayingField().width - (t.width || 0) - 1) }), d || t.attr({ stroke: s.borderColor || n.color || m.color || "#666666" }), this.updatePosition({ plotX: g, plotY: u, negative: n.negative, ttBelow: n.ttBelow, series: m, h: p[2] || 0 }) } else { this.hide(); return } } this.isHidden && this.label && this.label.attr({ opacity: 1 }).show(), this.isHidden = !1 } ob(this, "refresh") } renderSplit(t, e) { let i = this , {chart: s, chart: {chartWidth: o, chartHeight: r, plotHeight: a, plotLeft: n, plotTop: h, scrollablePixelsY: l=0, scrollablePixelsX: d, styledMode: c}, distance: p, options: g, options: {fixed: u, position: f, positioner: m}, pointer: x} = i , {scrollLeft: y=0, scrollTop: b=0} = s.scrollablePlotArea?.scrollingContainer || {} , v = i.outside && "number" != typeof d ? oc.documentElement.getBoundingClientRect() : { left: y, right: y + o, top: b, bottom: b + r } , k = i.getLabel() , w = this.renderer || s.renderer , M = !!s.xAxis[0]?.opposite , {left: S, top: T} = x.getChartPosition() , C = m || u , A = h + b , P = 0 , L = a - l , O = function(t, e, s, o=[0, 0], r=!0) { let a, n; if (s.isHeader) n = M ? 0 : L, a = of(o[0] - t / 2, v.left, v.right - t - (i.outside ? S : 0)); else if (u && s) { let o = i.getFixedPosition(t, e, s); a = o.x, n = o.y - A } else n = o[1] - A, a = of(a = r ? o[0] - t - p : o[0] + p, r ? a : v.left, v.right); return { x: a, y: n } }; oS(t) && (t = [!1, t]); let E = t.slice(0, e.length + 1).reduce(function(t, s, o) { if (!1 !== s && "" !== s) { let r = e[o - 1] || { isHeader: !0, plotX: e[0].plotX, plotY: a, series: {} } , l = r.isHeader , d = l ? i : r.series , f = d.tt = function(t, e, s) { let o = t , {isHeader: r, series: a} = e , n = a.tooltipOptions || g; if (!o) { let t = { padding: n.padding, r: n.borderRadius }; c || (t.fill = n.backgroundColor, t["stroke-width"] = n.borderWidth ?? (u && !r ? 0 : 1)), o = w.label("", 0, 0, n[r ? "headerShape" : "shape"] || (u && !r ? "rect" : "callout"), void 0, void 0, n.useHTML).addClass(i.getClassName(e, !0, r)).attr(t).add(k) } return o.isActive = !0, o.attr({ text: s }), c || o.css(n.style).attr({ stroke: n.borderColor || e.color || a.color || "#333333" }), o }(d.tt, r, s.toString()) , x = f.getBBox() , y = x.width + f.strokeWidth(); l && (P = x.height, L += P, M && (A -= P)); let {anchorX: b, anchorY: S} = function(t) { let e, i, {isHeader: s, plotX: o=0, plotY: r=0, series: l} = t; if (s) e = Math.max(n + o, n), i = h + a / 2; else { let {xAxis: t, yAxis: s} = l; e = t.pos + of(o, -p, t.len + p), l.shouldShowTooltip(0, s.pos - h + r, { ignoreX: !0 }) && (i = s.pos + r) } return { anchorX: e = of(e, v.left - p, v.right + p), anchorY: i } }(r); if ("number" == typeof S) { let e = x.height + 1 , s = (m || O).call(i, y, e, r, [b, S]); t.push({ align: C ? 0 : void 0, anchorX: b, anchorY: S, boxWidth: y, point: r, rank: oC(s.rank, +!!l), size: e, target: s.y, tt: f, x: s.x }) } else f.isActive = !1 } return t }, []); !C && E.some(t => { let {outside: e} = i , s = (e ? S : 0) + t.anchorX; return s < v.left && s + t.boxWidth < v.right || s < S - v.left + t.boxWidth && v.right - s > s } ) && (E = E.map(t => { let {x: e, y: i} = O.call(this, t.boxWidth, t.size, t.point, [t.anchorX, t.anchorY], !1); return oy(t, { target: i, x: e }) } )), i.cleanSplit(), og(E, L); let I = { left: S, right: S }; E.forEach(function(t) { let {x: e, boxWidth: s, isHeader: o} = t; !o && (i.outside && S + e < I.left && (I.left = S + e), !o && i.outside && I.left + s > I.right && (I.right = S + e)) }), E.forEach(function(t) { let {x: e, anchorX: s, anchorY: o, pos: r, point: {isHeader: a}} = t , n = { visibility: void 0 === r ? "hidden" : "inherit", x: e, y: (r || 0) + A + (u && f.y || 0), anchorX: s, anchorY: o }; if (i.outside && e < s) { let t = S - I.left; t > 0 && (a || (n.x = e + t, n.anchorX = s + t), a && (n.x = (I.right - I.left) / 2, n.anchorX = s + t)) } t.tt.attr(n) }); let {container: D, outside: B, renderer: N} = i; if (B && D && N) { let {width: t, height: e, x: i, y: s} = k.getBBox(); N.setSize(t + i, e + s, !1), D.style.left = I.left + "px", D.style.top = T + "px" } op && k.attr({ opacity: 1 === k.opacity ? .999 : 1 }) } drawTracker() { if (!this.shouldStickOnContact()) { this.tracker && (this.tracker = this.tracker.destroy()); return } let t = this.chart , e = this.label , i = this.shared ? t.hoverPoints : t.hoverPoint; if (!e || !i) return; let s = { x: 0, y: 0, width: 0, height: 0 } , o = this.getAnchor(i) , r = e.getBBox(); o[0] += t.plotLeft - (e.translateX || 0), o[1] += t.plotTop - (e.translateY || 0), s.x = Math.min(0, o[0]), s.y = Math.min(0, o[1]), s.width = o[0] < 0 ? Math.max(Math.abs(o[0]), r.width - o[0]) : Math.max(Math.abs(o[0]), r.width), s.height = o[1] < 0 ? Math.max(Math.abs(o[1]), r.height - Math.abs(o[1])) : Math.max(Math.abs(o[1]), r.height), this.tracker ? this.tracker.attr(s) : (this.tracker = e.renderer.rect(s).addClass("highcharts-tracker").add(e), t.styledMode || this.tracker.attr({ fill: "rgba(0,0,0,0)" })) } styledModeFormat(t) { return t.replace('style="font-size: 0.8em"', 'class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g, 'class="highcharts-color-{$1.colorIndex} {series.options.className} {point.options.className}"') } headerFooterFormatter(t, e) { let i = t.series , s = i.tooltipOptions , o = i.xAxis , r = o?.dateTime , a = { isFooter: e, point: t } , n = s.xDateFormat || "" , h = s[e ? "footerFormat" : "headerFormat"]; return ob(this, "headerFormatter", a, function(e) { if (r && !n && ow(t.key) && (n = r.getXDateFormat(t.key, s.dateTimeLabelFormats)), r && n) { if (oM(n)) { let t = n; od[0] = e => i.chart.time.dateFormat(t, e), n = "%0" } (t.tooltipDateKeys || ["key"]).forEach(t => { h = h.replace(RegExp("point\\." + t + "([ \\)}])"), `(point.${t}:${n})$1`) } ) } i.chart.styledMode && (h = this.styledModeFormat(h)), e.text = oh(h, t, this.chart) }), a.text || "" } update(t) { this.destroy(), this.init(this.chart, oT(!0, this.options, t)) } updatePosition(t) { let {chart: e, container: i, distance: s, options: o, pointer: r, renderer: a} = this, {height: n=0, width: h=0} = this.getLabel(), {fixed: l, positioner: d} = o, {left: c, top: p, scaleX: g, scaleY: u} = r.getChartPosition(), f = (d || l && this.getFixedPosition || this.getPosition).call(this, h, n, t), m = w.doc, x = (t.plotX || 0) + e.plotLeft, y = (t.plotY || 0) + e.plotTop, b; if (a && i) { if (d || l) { let {scrollLeft: t=0, scrollTop: i=0} = e.scrollablePlotArea?.scrollingContainer || {}; f.x += t + c - s, f.y += i + p - s } b = (o.borderWidth || 0) + 2 * s + 2, a.setSize(of(h + b, 0, m.documentElement.clientWidth) - 1, n + b, !1), (1 !== g || 1 !== u) && (om(i, { transform: `scale(${g}, ${u})` }), x *= g, y *= u), x += c - f.x, y += p - f.y } this.move(Math.round(f.x), Math.round(f.y || 0), x, y) } } !function(t) { t.compose = function(e) { oA(ol, "Core.Tooltip") && ou(e, "afterInit", function() { let e = this.chart; e.options.tooltip && (e.tooltip = new t(e,e.options.tooltip,this)) }) } }(oO || (oO = {})); let oE = oO , {animObject: oI} = tU , {defaultOptions: oD} = tv , {format: oB} = ep , {addEvent: oN, crisp: oz, erase: oR, extend: oW, fireEvent: oH, getNestedProperty: oF, isArray: oX, isFunction: oG, isNumber: oj, isObject: oY, merge: oU, pick: o$, syncTimeout: oV, removeEvent: oZ, uniqueKey: o_} = V; class oq { animateBeforeDestroy() { let t = this , e = { x: t.startXPos, opacity: 0 } , i = t.getGraphicalProps(); i.singular.forEach(function(i) { t[i] = t[i].animate("dataLabel" === i ? { x: t[i].startXPos, y: t[i].startYPos, opacity: 0 } : e) }), i.plural.forEach(function(e) { t[e].forEach(function(e) { e.element && e.animate(oW({ x: t.startXPos }, e.startYPos ? { x: e.startXPos, y: e.startYPos } : {})) }) }) } applyOptions(t, e) { let i = this.series , s = i.options.pointValKey || i.pointValKey; return oW(this, t = oq.prototype.optionsToObject.call(this, t)), this.options = this.options ? oW(this.options, t) : t, t.group && delete this.group, t.dataLabels && delete this.dataLabels, s && (this.y = oq.prototype.getNestedProperty.call(this, s)), this.selected && (this.state = "select"), "name"in this && void 0 === e && i.xAxis && i.xAxis.hasNames && (this.x = i.xAxis.nameToX(this)), void 0 === this.x && i ? this.x = e ?? i.autoIncrement() : oj(t.x) && i.options.relativeXValue ? this.x = i.autoIncrement(t.x) : "string" == typeof this.x && (e ?? (e = i.chart.time.parse(this.x)), oj(e) && (this.x = e)), this.isNull = this.isValid && !this.isValid(), this.formatPrefix = this.isNull ? "null" : "point", this } destroy() { if (!this.destroyed) { let t = this , e = t.series , i = e.chart , s = e.options.dataSorting , o = i.hoverPoints , r = oI(t.series.chart.renderer.globalAnimation) , a = () => { for (let e in (t.graphic || t.graphics || t.dataLabel || t.dataLabels) && (oZ(t), t.destroyElements()), t) delete t[e] } ; t.legendItem && i.legend.destroyItem(t), o && (t.setState(), oR(o, t), o.length || (i.hoverPoints = null)), t === i.hoverPoint && t.onMouseOut(), s?.enabled ? (this.animateBeforeDestroy(), oV(a, r.duration)) : a(), i.pointCount-- } this.destroyed = !0 } destroyElements(t) { let e = this , i = e.getGraphicalProps(t); i.singular.forEach(function(t) { e[t] = e[t].destroy() }), i.plural.forEach(function(t) { e[t].forEach(function(t) { t?.element && t.destroy() }), delete e[t] }) } firePointEvent(t, e, i) { let s = this , o = this.series.options; s.manageEvent(t), "click" === t && o.allowPointSelect && (i = function(t) { !s.destroyed && s.select && s.select(null, t.ctrlKey || t.metaKey || t.shiftKey) } ), oH(s, t, e, i) } getClassName() { return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone?.className ? " " + this.zone.className.replace("highcharts-negative", "") : "") } getGraphicalProps(t) { let e, i, s = this, o = [], r = { singular: [], plural: [] }; for ((t = t || { graphic: 1, dataLabel: 1 }).graphic && o.push("graphic", "connector"), t.dataLabel && o.push("dataLabel", "dataLabelPath", "dataLabelUpper"), i = o.length; i--; ) s[e = o[i]] && r.singular.push(e); return ["graphic", "dataLabel"].forEach(function(e) { let i = e + "s"; t[e] && s[i] && r.plural.push(i) }), r } getNestedProperty(t) { return t ? 0 === t.indexOf("custom.") ? oF(t, this.options) : this[t] : void 0 } getZone() { let t = this.series, e = t.zones, i = t.zoneAxis || "y", s, o = 0; for (s = e[0]; this[i] >= s.value; ) s = e[++o]; return this.nonZonedColor || (this.nonZonedColor = this.color), s?.color && !this.options.color ? this.color = s.color : this.color = this.nonZonedColor, s } hasNewShapeType() { return (this.graphic && (this.graphic.symbolName || this.graphic.element.nodeName)) !== this.shapeType } constructor(t, e, i) { this.formatPrefix = "point", this.visible = !0, this.point = this, this.series = t, this.applyOptions(e, i), this.id ?? (this.id = o_()), this.resolveColor(), this.dataLabelOnNull ?? (this.dataLabelOnNull = t.options.nullInteraction), t.chart.pointCount++, oH(this, "afterInit") } isValid() { return (oj(this.x) || this.x instanceof Date) && oj(this.y) } optionsToObject(t) { let e = this.series, i = e.options.keys, s = i || e.pointArrayMap || ["y"], o = s.length, r = {}, a, n = 0, h = 0; if (oj(t) || null === t) r[s[0]] = t; else if (oX(t)) for (!i && t.length > o && ("string" == (a = typeof t[0]) ? e.xAxis?.dateTime ? r.x = e.chart.time.parse(t[0]) : r.name = t[0] : "number" === a && (r.x = t[0]), n++); h < o; ) i && void 0 === t[n] || (s[h].indexOf(".") > 0 ? oq.prototype.setNestedProperty(r, t[n], s[h]) : r[s[h]] = t[n]), n++, h++; else "object" == typeof t && (r = t, t.dataLabels && (e.hasDataLabels = () => !0), t.marker && (e._hasPointMarkers = !0)); return r } pos(t, e=this.plotY) { if (!this.destroyed) { let {plotX: i, series: s} = this , {chart: o, xAxis: r, yAxis: a} = s , n = 0 , h = 0; if (oj(i) && oj(e)) return t && (n = r ? r.pos : o.plotLeft, h = a ? a.pos : o.plotTop), o.inverted && r && a ? [a.len - e + h, r.len - i + n] : [i + n, e + h] } } resolveColor() { let t = this.series, e = t.chart.options.chart, i = t.chart.styledMode, s, o, r = e.colorCount, a; delete this.nonZonedColor, t.options.colorByPoint ? (i || (s = (o = t.options.colors || t.chart.options.colors)[t.colorCounter], r = o.length), a = t.colorCounter, t.colorCounter++, t.colorCounter === r && (t.colorCounter = 0)) : (i || (s = t.color), a = t.colorIndex), this.colorIndex = o$(this.options.colorIndex, a), this.color = o$(this.options.color, s) } setNestedProperty(t, e, i) { return i.split(".").reduce(function(t, i, s, o) { let r = o.length - 1 === s; return t[i] = r ? e : oY(t[i], !0) ? t[i] : {}, t[i] }, t), t } shouldDraw() { return !this.isNull } tooltipFormatter(t) { let {chart: e, pointArrayMap: i=["y"], tooltipOptions: s} = this.series , {valueDecimals: o="", valuePrefix: r="", valueSuffix: a=""} = s; return e.styledMode && (t = e.tooltip?.styledModeFormat(t) || t), i.forEach(e => { e = "{point." + e, (r || a) && (t = t.replace(RegExp(e + "}", "g"), r + e + "}" + a)), t = t.replace(RegExp(e + "}", "g"), e + ":,." + o + "f}") } ), oB(t, this, e) } update(t, e, i, s) { let o, r = this, a = r.series, n = r.graphic, h = a.chart, l = a.options; function d() { r.applyOptions(t); let s = n && r.hasMockGraphic , d = null === r.y ? !s : s; n && d && (r.graphic = n.destroy(), delete r.hasMockGraphic), oY(t, !0) && (n?.element && t && t.marker && void 0 !== t.marker.symbol && (r.graphic = n.destroy()), t?.dataLabels && r.dataLabel && (r.dataLabel = r.dataLabel.destroy())), o = r.index; let c = {}; for (let t of a.dataColumnKeys()) c[t] = r[t]; a.dataTable.setRow(c, o), l.data[o] = oY(l.data[o], !0) || oY(t, !0) ? r.options : o$(t, l.data[o]), a.isDirty = a.isDirtyData = !0, !a.fixedBox && a.hasCartesianSeries && (h.isDirtyBox = !0), "point" === l.legendType && (h.isDirtyLegend = !0), e && h.redraw(i) } e = o$(e, !0), !1 === s ? d() : r.firePointEvent("update", { options: t }, d) } remove(t, e) { this.series.removePoint(this.series.data.indexOf(this), t, e) } select(t, e) { let i = this , s = i.series , o = s.chart; t = o$(t, !i.selected), this.selectedStaging = t, i.firePointEvent(t ? "select" : "unselect", { accumulate: e }, function() { i.selected = i.options.selected = t, s.options.data[s.data.indexOf(i)] = i.options, i.setState(t && "select"), e || o.getSelectedPoints().forEach(function(t) { let e = t.series; t.selected && t !== i && (t.selected = t.options.selected = !1, e.options.data[e.data.indexOf(t)] = t.options, t.setState(o.hoverPoints && e.options.inactiveOtherPoints ? "inactive" : ""), t.firePointEvent("unselect")) }) }), delete this.selectedStaging } onMouseOver(t) { let {inverted: e, pointer: i} = this.series.chart; i && (t = t ? i.normalize(t) : i.getChartCoordinatesFromPoint(this, e), i.runPointActions(t, this)) } onMouseOut() { let t = this.series.chart; this.firePointEvent("mouseOut"), this.series.options.inactiveOtherPoints || (t.hoverPoints || []).forEach(function(t) { t.setState() }), t.hoverPoints = t.hoverPoint = null } manageEvent(t) { let e = oU(this.series.options.point, this.options) , i = e.events?.[t]; oG(i) && (!this.hcEvents?.[t] || this.hcEvents?.[t]?.map(t => t.fn).indexOf(i) === -1) ? (this.importedUserEvent?.(), this.importedUserEvent = oN(this, t, i), this.hcEvents && (this.hcEvents[t].userEvent = !0)) : this.importedUserEvent && !i && this.hcEvents?.[t] && this.hcEvents?.[t].userEvent && (oZ(this, t), delete this.hcEvents[t], Object.keys(this.hcEvents) || delete this.importedUserEvent) } setState(t, e) { let i = this.series, s = this.state, o = i.options.states[t || "normal"] || {}, r = oD.plotOptions[i.type].marker && i.options.marker, a = r && !1 === r.enabled, n = r?.states?.[t || "normal"] || {}, h = !1 === n.enabled, l = this.marker || {}, d = i.chart, c = r && i.markerAttribs, p = i.halo, g, u, f, m = i.stateMarkerGraphic, x; if ((t = t || "") === this.state && !e || this.selected && "select" !== t || !1 === o.enabled || t && (h || a && !1 === n.enabled) || t && l.states && l.states[t] && !1 === l.states[t].enabled) return; if (this.state = t, c && (g = i.markerAttribs(this, t)), this.graphic && !this.hasMockGraphic) { if (s && this.graphic.removeClass("highcharts-point-" + s), t && this.graphic.addClass("highcharts-point-" + t), !d.styledMode) { u = i.pointAttribs(this, t), f = o$(d.options.chart.animation, o.animation); let e = u.opacity; i.options.inactiveOtherPoints && oj(e) && (this.dataLabels || []).forEach(function(t) { t && !t.hasClass("highcharts-data-label-hidden") && (t.animate({ opacity: e }, f), t.connector && t.connector.animate({ opacity: e }, f)) }), this.graphic.animate(u, f) } g && this.graphic.animate(g, o$(d.options.chart.animation, n.animation, r.animation)), m && m.hide() } else t && n && (x = l.symbol || i.symbol, m && m.currentSymbol !== x && (m = m.destroy()), g && (m ? m[e ? "animate" : "attr"]({ x: g.x, y: g.y }) : x && (i.stateMarkerGraphic = m = d.renderer.symbol(x, g.x, g.y, g.width, g.height, oU(r, n)).add(i.markerGroup), m.currentSymbol = x)), !d.styledMode && m && "inactive" !== this.state && m.attr(i.pointAttribs(this, t))), m && (m[t && this.isInside ? "show" : "hide"](), m.element.point = this, m.addClass(this.getClassName(), !0)); let y = o.halo , b = this.graphic || m , v = b?.visibility || "inherit"; y?.size && b && "hidden" !== v && !this.isCluster ? (p || (i.halo = p = d.renderer.path().add(b.parentGroup)), p.show()[e ? "animate" : "attr"]({ d: this.haloPath(y.size) }), p.attr({ class: "highcharts-halo highcharts-color-" + o$(this.colorIndex, i.colorIndex) + (this.className ? " " + this.className : ""), visibility: v, zIndex: -1 }), p.point = this, d.styledMode || p.attr(oW({ fill: this.color || i.color, "fill-opacity": y.opacity }, t6.filterUserAttributes(y.attributes || {})))) : p?.point?.haloPath && !p.point.destroyed && p.animate({ d: p.point.haloPath(0) }, null, p.hide), oH(this, "afterSetState", { state: t }) } haloPath(t) { let e = this.pos(); return e ? this.series.chart.renderer.symbols.circle(oz(e[0], 1) - t, e[1] - t, 2 * t, 2 * t) : [] } } let oK = oq , {parse: oJ} = tL , {charts: oQ, composed: o0, isTouchDevice: o1} = w , {addEvent: o2, attr: o3, css: o5, extend: o6, find: o9, fireEvent: o4, isNumber: o8, isObject: o7, objectEach: rt, offset: re, pick: ri, pushUnique: rs, splat: ro} = V; class rr { applyInactiveState(t=[]) { let e = []; t.forEach(t => { let i = t.series; e.push(i), i.linkedParent && e.push(i.linkedParent), i.linkedSeries && e.push.apply(e, i.linkedSeries), i.navigatorSeries && e.push(i.navigatorSeries), i.boosted && i.markerGroup && e.push.apply(e, this.chart.series.filter(t => t.markerGroup === i.markerGroup)) } ), this.chart.series.forEach(t => { -1 === e.indexOf(t) ? t.setState("inactive", !0) : t.options.inactiveOtherPoints && t.setAllPointsToState("inactive") } ) } destroy() { let t = this; this.eventsToUnbind.forEach(t => t()), this.eventsToUnbind = [], !w.chartCount && (rr.unbindDocumentMouseUp.forEach(t => t.unbind()), rr.unbindDocumentMouseUp.length = 0, rr.unbindDocumentTouchEnd && (rr.unbindDocumentTouchEnd = rr.unbindDocumentTouchEnd())), clearInterval(t.tooltipTimeout), rt(t, function(e, i) { t[i] = void 0 }) } getSelectionMarkerAttrs(t, e) { let i = { args: { chartX: t, chartY: e }, attrs: {}, shapeType: "rect" }; return o4(this, "getSelectionMarkerAttrs", i, i => { let s, {chart: o, zoomHor: r, zoomVert: a} = this, {mouseDownX: n=0, mouseDownY: h=0} = o, l = i.attrs; l.x = o.plotLeft, l.y = o.plotTop, l.width = r ? 1 : o.plotWidth, l.height = a ? 1 : o.plotHeight, r && (l.width = Math.max(1, Math.abs(s = t - n)), l.x = (s > 0 ? 0 : s) + n), a && (l.height = Math.max(1, Math.abs(s = e - h)), l.y = (s > 0 ? 0 : s) + h) } ), i } drag(t) { let {chart: e} = this, {mouseDownX: i=0, mouseDownY: s=0} = e, {panning: o, panKey: r, selectionMarkerFill: a} = e.options.chart, n = e.plotLeft, h = e.plotTop, l = e.plotWidth, d = e.plotHeight, c = o7(o) ? o.enabled : o, p = r && t[`${r}Key`], g = t.chartX, u = t.chartY, f, m = this.selectionMarker; if ((!m || !m.touch) && (g < n ? g = n : g > n + l && (g = n + l), u < h ? u = h : u > h + d && (u = h + d), this.hasDragged = Math.sqrt(Math.pow(i - g, 2) + Math.pow(s - u, 2)), this.hasDragged > 10)) { f = e.isInsidePlot(i - n, s - h, { visiblePlotOnly: !0 }); let {shapeType: r, attrs: l} = this.getSelectionMarkerAttrs(g, u); (e.hasCartesianSeries || e.mapView) && this.hasZoom && f && !p && !m && (this.selectionMarker = m = e.renderer[r](), m.attr({ class: "highcharts-selection-marker", zIndex: 7 }).add(), e.styledMode || m.attr({ fill: a || oJ("#334eff").setOpacity(.25).get() })), m && m.attr(l), f && !m && c && e.pan(t, o) } } dragStart(t) { let e = this.chart; e.mouseIsDown = t.type, e.cancelClick = !1, e.mouseDownX = t.chartX, e.mouseDownY = t.chartY } getSelectionBox(t) { let e = { args: { marker: t }, result: t.getBBox() }; return o4(this, "getSelectionBox", e), e.result } drop(t) { let e, {chart: i, selectionMarker: s} = this; for (let t of i.axes) t.isPanning && (t.isPanning = !1, (t.options.startOnTick || t.options.endOnTick || t.series.some(t => t.boosted)) && (t.forceRedraw = !0, t.setExtremes(t.userMin, t.userMax, !1), e = !0)); if (e && i.redraw(), s && t) { if (this.hasDragged) { let e = this.getSelectionBox(s); i.transform({ axes: i.axes.filter(t => t.zoomEnabled && ("xAxis" === t.coll && this.zoomX || "yAxis" === t.coll && this.zoomY)), selection: { originalEvent: t, xAxis: [], yAxis: [], ...e }, from: e }) } o8(i.index) && (this.selectionMarker = s.destroy()) } i && o8(i.index) && (o5(i.container, { cursor: i._cursor }), i.cancelClick = this.hasDragged > 10, i.mouseIsDown = !1, this.hasDragged = 0, this.pinchDown = []) } findNearestKDPoint(t, e, i) { let s; return t.forEach(function(t) { let o = !(t.noSharedTooltip && e) && 0 > t.options.findNearestPointBy.indexOf("y") , r = t.searchPoint(i, o); o7(r, !0) && r.series && (!o7(s, !0) || function(t, i) { let s, o = t.distX - i.distX, r = t.dist - i.dist, a = i.series.group?.zIndex - t.series.group?.zIndex; return 0 !== o && e ? o : 0 !== r ? r : 0 !== a ? a : t.series.index > i.series.index ? -1 : 1 }(s, r) > 0) && (s = r) }), s } getChartCoordinatesFromPoint(t, e) { let {xAxis: i, yAxis: s} = t.series , o = t.shapeArgs; if (i && s) { let r = t.clientX ?? t.plotX ?? 0 , a = t.plotY || 0; return t.isNode && o && o8(o.x) && o8(o.y) && (r = o.x, a = o.y), e ? { chartX: s.len + s.pos - a, chartY: i.len + i.pos - r } : { chartX: r + i.pos, chartY: a + s.pos } } if (o?.x && o.y) return { chartX: o.x, chartY: o.y } } getChartPosition() { if (this.chartPosition) return this.chartPosition; let {container: t} = this.chart , e = re(t); this.chartPosition = { left: e.left, top: e.top, scaleX: 1, scaleY: 1 }; let {offsetHeight: i, offsetWidth: s} = t; return s > 2 && i > 2 && (this.chartPosition.scaleX = e.width / s, this.chartPosition.scaleY = e.height / i), this.chartPosition } getCoordinates(t) { let e = { xAxis: [], yAxis: [] }; for (let i of this.chart.axes) e[i.isXAxis ? "xAxis" : "yAxis"].push({ axis: i, value: i.toValue(t[i.horiz ? "chartX" : "chartY"]) }); return e } getHoverData(t, e, i, s, o, r) { let a = [], n = function(t) { return t.visible && !(!o && t.directTouch) && ri(t.options.enableMouseTracking, !0) }, h = e, l, d = { chartX: r ? r.chartX : void 0, chartY: r ? r.chartY : void 0, shared: o }; o4(this, "beforeGetHoverData", d), l = h && !h.stickyTracking ? [h] : i.filter(t => t.stickyTracking && (d.filter || n)(t)); let c = s && t || !r ? t : this.findNearestKDPoint(l, o, r); return h = c?.series, c && (o && !h.noSharedTooltip ? (l = i.filter(function(t) { return d.filter ? d.filter(t) : n(t) && !t.noSharedTooltip })).forEach(function(t) { let e = t.options?.nullInteraction , i = o9(t.points, function(t) { return t.x === c.x && (!t.isNull || !!e) }); o7(i) && (t.boosted && t.boost && (i = t.boost.getPoint(i)), a.push(i)) }) : a.push(c)), o4(this, "afterGetHoverData", d = { hoverPoint: c }), { hoverPoint: d.hoverPoint, hoverSeries: h, hoverPoints: a } } getPointFromEvent(t) { let e = t.target, i; for (; e && !i; ) i = e.point, e = e.parentNode; return i } onTrackerMouseOut(t) { let e = this.chart , i = t.relatedTarget , s = e.hoverSeries; this.isDirectTouch = !1, !s || !i || s.stickyTracking || this.inClass(i, "highcharts-tooltip") || this.inClass(i, "highcharts-series-" + s.index) && this.inClass(i, "highcharts-tracker") || s.onMouseOut() } inClass(t, e) { let i = t, s; for (; i; ) { if (s = o3(i, "class")) { if (-1 !== s.indexOf(e)) return !0; if (-1 !== s.indexOf("highcharts-container")) return !1 } i = i.parentElement } } constructor(t, e) { this.hasDragged = 0, this.pointerCaptureEventsToUnbind = [], this.eventsToUnbind = [], this.options = e, this.chart = t, this.runChartClick = !!e.chart.events?.click, this.pinchDown = [], this.setDOMEvents(), o4(this, "afterInit") } normalize(t, e) { let i = t.touches , s = i ? i.length ? i.item(0) : ri(i.changedTouches, t.changedTouches)[0] : t; e || (e = this.getChartPosition()); let o = s.pageX - e.left , r = s.pageY - e.top; return o6(t, { chartX: Math.round(o /= e.scaleX), chartY: Math.round(r /= e.scaleY) }) } onContainerClick(t) { let e = this.chart , i = e.hoverPoint , s = this.normalize(t) , o = e.plotLeft , r = e.plotTop; !e.cancelClick && (i && this.inClass(s.target, "highcharts-tracker") ? (o4(i.series, "click", o6(s, { point: i })), e.hoverPoint && i.firePointEvent("click", s)) : (o6(s, this.getCoordinates(s)), e.isInsidePlot(s.chartX - o, s.chartY - r, { visiblePlotOnly: !0 }) && o4(e, "click", s))) } onContainerMouseDown(t) { let e = (1 & (t.buttons || t.button)) == 1; t = this.normalize(t), w.isFirefox && 0 !== t.button && this.onContainerMouseMove(t), (void 0 === t.button || e) && (this.zoomOption(t), e && t.preventDefault?.(), this.dragStart(t)) } onContainerMouseLeave(t) { let {pointer: e} = oQ[ri(rr.hoverChartIndex, -1)] || {}; t = this.normalize(t), this.onContainerMouseMove(t), e && !this.inClass(t.relatedTarget, "highcharts-tooltip") && (e.reset(), e.chartPosition = void 0) } onContainerMouseEnter() { delete this.chartPosition } onContainerMouseMove(t) { let e = this.chart , i = e.tooltip , s = this.normalize(t); this.setHoverChartIndex(t), ("mousedown" === e.mouseIsDown || this.touchSelect(s)) && this.drag(s), !e.openMenu && (this.inClass(s.target, "highcharts-tracker") || e.isInsidePlot(s.chartX - e.plotLeft, s.chartY - e.plotTop, { visiblePlotOnly: !0 })) && !i?.shouldStickOnContact(s) && (this.inClass(s.target, "highcharts-no-tooltip") ? this.reset(!1, 0) : this.runPointActions(s)) } onDocumentTouchEnd(t) { this.onDocumentMouseUp(t) } onContainerTouchMove(t) { this.touchSelect(t) ? this.onContainerMouseMove(t) : this.touch(t) } onContainerTouchStart(t) { this.touchSelect(t) ? this.onContainerMouseDown(t) : (this.zoomOption(t), this.touch(t, !0)) } onDocumentMouseMove(t) { let e = this.chart , i = e.tooltip , s = this.chartPosition , o = this.normalize(t, s); !s || e.isInsidePlot(o.chartX - e.plotLeft, o.chartY - e.plotTop, { visiblePlotOnly: !0 }) || i?.shouldStickOnContact(o) || o.target !== e.container.ownerDocument && this.inClass(o.target, "highcharts-tracker") || this.reset() } onDocumentMouseUp(t) { oQ[ri(rr.hoverChartIndex, -1)]?.pointer?.drop(t) } pinch(t) { let e = this , {chart: i, hasZoom: s, lastTouches: o} = e , r = [].map.call(t.touches || [], t => e.normalize(t)) , a = r.length , n = 1 === a && (e.inClass(t.target, "highcharts-tracker") && i.runTrackerClick || e.runChartClick) , h = i.tooltip , l = 1 === a && ri(h?.options.followTouchMove, !0); a > 1 ? e.initiated = !0 : l && (e.initiated = !1), s && e.initiated && !n && !1 !== t.cancelable && t.preventDefault(), "touchstart" === t.type ? (e.pinchDown = r, e.res = !0, i.mouseDownX = t.chartX) : l ? this.runPointActions(e.normalize(t)) : o && (o4(i, "touchpan", { originalEvent: t, touches: r }, () => { let e = t => { let e = t[0] , i = t[1] || e; return { x: e.chartX, y: e.chartY, width: i.chartX - e.chartX, height: i.chartY - e.chartY } } ; i.transform({ axes: i.axes.filter(t => t.zoomEnabled && (this.zoomHor && t.horiz || this.zoomVert && !t.horiz)), to: e(r), from: e(o), trigger: t.type }) } ), e.res && (e.res = !1, this.reset(!1, 0))), e.lastTouches = r } reset(t, e) { let i = this.chart , s = i.hoverSeries , o = i.hoverPoint , r = i.hoverPoints , a = i.tooltip , n = a?.shared ? r : o; t && n && ro(n).forEach(function(e) { e.series.isCartesian && void 0 === e.plotX && (t = !1) }), t ? a && n && ro(n).length && (a.refresh(n), a.shared && r ? r.forEach(function(t) { t.setState(t.state, !0), t.series.isCartesian && (t.series.xAxis.crosshair && t.series.xAxis.drawCrosshair(null, t), t.series.yAxis.crosshair && t.series.yAxis.drawCrosshair(null, t)) }) : o && (o.setState(o.state, !0), i.axes.forEach(function(t) { t.crosshair && o.series[t.coll] === t && t.drawCrosshair(null, o) }))) : (o && o.onMouseOut(), r && r.forEach(function(t) { t.setState() }), s && s.onMouseOut(), a && a.hide(e), this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove()), i.axes.forEach(function(t) { t.hideCrosshair() }), i.hoverPoints = i.hoverPoint = void 0) } runPointActions(t, e, i) { let s = this.chart , o = s.series , r = s.tooltip?.options.enabled ? s.tooltip : void 0 , a = !!r && r.shared , n = e || s.hoverPoint , h = n?.series || s.hoverSeries , l = (!t || "touchmove" !== t.type) && (!!e || h?.directTouch && this.isDirectTouch) , d = this.getHoverData(n, h, o, l, a, t); n = d.hoverPoint, h = d.hoverSeries; let c = d.hoverPoints , p = h?.tooltipOptions.followPointer && !h.tooltipOptions.split , g = a && h && !h.noSharedTooltip; if (n && (i || n !== s.hoverPoint || r?.isHidden)) { if ((s.hoverPoints || []).forEach(function(t) { -1 === c.indexOf(t) && t.setState() }), s.hoverSeries !== h && h.onMouseOver(), this.applyInactiveState(c), (c || []).forEach(function(t) { t.setState("hover") }), s.hoverPoint && s.hoverPoint.firePointEvent("mouseOut"), !n.series) return; s.hoverPoints = c, s.hoverPoint = n, n.firePointEvent("mouseOver", void 0, () => { r && n && r.refresh(g ? c : n, t) } ) } else if (p && r && !r.isHidden) { let e = r.getAnchor([{}], t); s.isInsidePlot(e[0], e[1], { visiblePlotOnly: !0 }) && r.updatePosition({ plotX: e[0], plotY: e[1] }) } this.unDocMouseMove || (this.unDocMouseMove = o2(s.container.ownerDocument, "mousemove", t => oQ[rr.hoverChartIndex ?? -1]?.pointer?.onDocumentMouseMove(t)), this.eventsToUnbind.push(this.unDocMouseMove)), s.axes.forEach(function(e) { let i, o = e.crosshair?.snap ?? !0; !o || (i = s.hoverPoint) && i.series[e.coll] === e || (i = o9(c, t => t.series?.[e.coll] === e)), i || !o ? e.drawCrosshair(t, i) : e.hideCrosshair() }) } setDOMEvents() { let t = this.chart.container , e = t.ownerDocument; t.onmousedown = this.onContainerMouseDown.bind(this), t.onmousemove = this.onContainerMouseMove.bind(this), t.onclick = this.onContainerClick.bind(this), this.eventsToUnbind.push(o2(t, "mouseenter", this.onContainerMouseEnter.bind(this)), o2(t, "mouseleave", this.onContainerMouseLeave.bind(this))), rr.unbindDocumentMouseUp.some(t => t.doc === e) || rr.unbindDocumentMouseUp.push({ doc: e, unbind: o2(e, "mouseup", this.onDocumentMouseUp.bind(this)) }); let i = this.chart.renderTo.parentElement; for (; i && "BODY" !== i.tagName; ) this.eventsToUnbind.push(o2(i, "scroll", () => { delete this.chartPosition } )), i = i.parentElement; this.eventsToUnbind.push(o2(t, "touchstart", this.onContainerTouchStart.bind(this), { passive: !1 }), o2(t, "touchmove", this.onContainerTouchMove.bind(this), { passive: !1 })), rr.unbindDocumentTouchEnd || (rr.unbindDocumentTouchEnd = o2(e, "touchend", this.onDocumentTouchEnd.bind(this), { passive: !1 })), this.setPointerCapture(), o2(this.chart, "redraw", this.setPointerCapture.bind(this)) } setPointerCapture() { if (!o1) return; let t = this.pointerCaptureEventsToUnbind , e = this.chart , i = e.container , s = ri(e.options.tooltip?.followTouchMove, !0) && e.series.some(t => t.options.findNearestPointBy.indexOf("y") > -1); !this.hasPointerCapture && s ? (t.push(o2(i, "pointerdown", t => { t.target?.hasPointerCapture(t.pointerId) && t.target?.releasePointerCapture(t.pointerId) } ), o2(i, "pointermove", t => { e.pointer?.getPointFromEvent(t)?.onMouseOver(t) } )), e.styledMode || o5(i, { "touch-action": "none" }), i.className += " highcharts-no-touch-action", this.hasPointerCapture = !0) : this.hasPointerCapture && !s && (t.forEach(t => t()), t.length = 0, e.styledMode || o5(i, { "touch-action": ri(e.options.chart.style?.["touch-action"], "manipulation") }), i.className = i.className.replace(" highcharts-no-touch-action", ""), this.hasPointerCapture = !1) } setHoverChartIndex(t) { let e = this.chart , i = w.charts[ri(rr.hoverChartIndex, -1)]; if (i && i !== e) { let s = { relatedTarget: e.container }; t && !t?.relatedTarget && Object.assign({}, t, s), i.pointer?.onContainerMouseLeave(t || s) } i?.mouseIsDown || (rr.hoverChartIndex = e.index) } touch(t, e) { let i, {chart: s, pinchDown: o=[]} = this; this.setHoverChartIndex(), 1 === (t = this.normalize(t)).touches.length ? s.isInsidePlot(t.chartX - s.plotLeft, t.chartY - s.plotTop, { visiblePlotOnly: !0 }) && !s.openMenu ? (e && this.runPointActions(t), "touchmove" === t.type && (i = !!o[0] && Math.pow(o[0].chartX - t.chartX, 2) + Math.pow(o[0].chartY - t.chartY, 2) >= 16), ri(i, !0) && this.pinch(t)) : e && this.reset() : 2 === t.touches.length && this.pinch(t) } touchSelect(t) { return !!(this.chart.zooming.singleTouch && t.touches && 1 === t.touches.length) } zoomOption(t) { let e = this.chart, i = e.inverted, s = e.zooming.type || "", o, r; /touch/.test(t.type) && (s = ri(e.zooming.pinchType, s)), this.zoomX = o = /x/.test(s), this.zoomY = r = /y/.test(s), this.zoomHor = o && !i || r && i, this.zoomVert = r && !i || o && i, this.hasZoom = o || r } } rr.unbindDocumentMouseUp = [], function(t) { t.compose = function(e) { rs(o0, "Core.Pointer") && o2(e, "beforeRender", function() { this.pointer = new t(this,this.options) }) } }(rr || (rr = {})); let ra = rr; !function(t) { t.setLength = function(t, e, i) { return Array.isArray(t) ? (t.length = e, t) : t[i ? "subarray" : "slice"](0, e) } , t.splice = function(t, e, i, s, o=[]) { if (Array.isArray(t)) return Array.isArray(o) || (o = Array.from(o)), { removed: t.splice(e, i, ...o), array: t }; let r = Object.getPrototypeOf(t).constructor , a = t[s ? "subarray" : "slice"](e, e + i) , n = new r(t.length - i + o.length); return n.set(t.subarray(0, e), 0), n.set(o, e), n.set(t.subarray(e + i), e + o.length), { removed: a, array: n } } }(d || (d = {})); let {setLength: rn, splice: rh} = d , {fireEvent: rl, objectEach: rd, uniqueKey: rc} = V , rp = class { constructor(t={}) { this.autoId = !t.id, this.columns = {}, this.id = t.id || rc(), this.modified = this, this.rowCount = 0, this.versionTag = rc(); let e = 0; rd(t.columns || {}, (t, i) => { this.columns[i] = t.slice(), e = Math.max(e, t.length) } ), this.applyRowCount(e) } applyRowCount(t) { this.rowCount = t, rd(this.columns, (e, i) => { e.length !== t && (this.columns[i] = rn(e, t)) } ) } deleteRows(t, e=1) { if (e > 0 && t < this.rowCount) { let i = 0; rd(this.columns, (s, o) => { this.columns[o] = rh(s, t, e).array, i = s.length } ), this.rowCount = i } rl(this, "afterDeleteRows", { rowIndex: t, rowCount: e }), this.versionTag = rc() } getColumn(t, e) { return this.columns[t] } getColumns(t, e) { return (t || Object.keys(this.columns)).reduce( (t, e) => (t[e] = this.columns[e], t), {}) } getRow(t, e) { return (e || Object.keys(this.columns)).map(e => this.columns[e]?.[t]) } setColumn(t, e=[], i=0, s) { this.setColumns({ [t]: e }, i, s) } setColumns(t, e, i) { let s = this.rowCount; rd(t, (t, e) => { this.columns[e] = t.slice(), s = t.length } ), this.applyRowCount(s), i?.silent || (rl(this, "afterSetColumns"), this.versionTag = rc()) } setRow(t, e=this.rowCount, i, s) { let {columns: o} = this , r = i ? this.rowCount + 1 : e + 1; rd(t, (t, a) => { let n = o[a] || s?.addColumns !== !1 && Array(r); n && (i ? n = rh(n, e, 0, !0, [t]).array : n[e] = t, o[a] = n) } ), r > this.rowCount && this.applyRowCount(r), s?.silent || (rl(this, "afterSetRows"), this.versionTag = rc()) } } , {extend: rg, merge: ru, pick: rf} = V; !function(t) { function e(t, e, i) { let s = this.legendItem = this.legendItem || {}, {chart: o, options: r} = this, {baseline: a=0, symbolWidth: n, symbolHeight: h} = t, l = this.symbol || "circle", d = h / 2, c = o.renderer, p = s.group, g = a - Math.round((t.fontMetrics?.b || h) * (i ? .4 : .3)), u = {}, f, m = r.marker, x = 0; if (o.styledMode || (u["stroke-width"] = Math.min(r.lineWidth || 0, 24), r.dashStyle ? u.dashstyle = r.dashStyle : "square" === r.linecap || (u["stroke-linecap"] = "round")), s.line = c.path().addClass("highcharts-graph").attr(u).add(p), i && (s.area = c.path().addClass("highcharts-area").add(p)), u["stroke-linecap"] && (x = Math.min(s.line.strokeWidth(), n) / 2), n) { let t = [["M", x, g], ["L", n - x, g]]; s.line.attr({ d: t }), s.area?.attr({ d: [...t, ["L", n - x, a], ["L", x, a]] }) } if (m && !1 !== m.enabled && n) { let t = Math.min(rf(m.radius, d), d); 0 === l.indexOf("url") && (m = ru(m, { width: h, height: h }), t = 0), s.symbol = f = c.symbol(l, n / 2 - t, g - t, 2 * t, 2 * t, rg({ context: "legend" }, m)).addClass("highcharts-point").add(p), f.isMarker = !0 } } t.areaMarker = function(t, i) { e.call(this, t, i, !0) } , t.lineMarker = e, t.rectangle = function(t, e) { let i = e.legendItem || {} , s = t.options , o = t.symbolHeight , r = s.squareSymbol , a = r ? o : t.symbolWidth; i.symbol = this.chart.renderer.rect(r ? (t.symbolWidth - o) / 2 : 0, t.baseline - o + 1, a, o, rf(t.options.symbolRadius, o / 2)).addClass("highcharts-point").attr({ zIndex: 3 }).add(i.group) } }(c || (c = {})); let rm = c , {defaultOptions: rx} = tv , {extend: ry, extendClass: rb, merge: rv} = V; !function(t) { function e(e, i) { let s = rx.plotOptions || {} , o = i.defaultOptions , r = i.prototype; return r.type = e, r.pointClass || (r.pointClass = oK), !t.seriesTypes[e] && (o && (s[e] = o), t.seriesTypes[e] = i, !0) } t.seriesTypes = w.seriesTypes, t.registerSeriesType = e, t.seriesType = function(i, s, o, r, a) { let n = rx.plotOptions || {}; if (s = s || "", n[i] = rv(n[s], o), delete t.seriesTypes[i], e(i, rb(t.seriesTypes[s] || function() {} , r)), t.seriesTypes[i].prototype.type = i, a) { class e extends oK { } ry(e.prototype, a), t.seriesTypes[i].prototype.pointClass = e } return t.seriesTypes[i] } }(p || (p = {})); let rk = p , {animObject: rw, setAnimation: rM} = tU , {defaultOptions: rS} = tv , {registerEventOptions: rT} = si , {svg: rC, win: rA} = w , {seriesTypes: rP} = rk , {format: rL} = ep , {arrayMax: rO, arrayMin: rE, clamp: rI, correctFloat: rD, crisp: rB, defined: rN, destroyObjectProperties: rz, diffObjects: rR, erase: rW, error: rH, extend: rF, find: rX, fireEvent: rG, getClosestDistance: rj, getNestedProperty: rY, insertItem: rU, isArray: r$, isNumber: rV, isString: rZ, merge: r_, objectEach: rq, pick: rK, removeEvent: rJ, syncTimeout: rQ} = V; class r0 { constructor() { this.zoneAxis = "y" } init(t, e) { let i; rG(this, "init", { options: e }), this.dataTable ?? (this.dataTable = new rp); let s = t.series; this.eventsToUnbind = [], this.chart = t, this.options = this.setOptions(e); let o = this.options , r = !1 !== o.visible; this.linkedSeries = [], this.bindAxes(), rF(this, { name: o.name, state: "", visible: r, selected: !0 === o.selected }), rT(this, o); let a = o.events; (a?.click || o.point?.events?.click || o.allowPointSelect) && (t.runTrackerClick = !0), this.getColor(), this.getSymbol(), this.isCartesian && (t.hasCartesianSeries = !0), s.length && (i = s[s.length - 1]), this._i = rK(i?._i, -1) + 1, this.opacity = this.options.opacity, t.orderItems("series", rU(this, s)), o.dataSorting?.enabled ? this.setDataSortingOptions() : this.points || this.data || this.setData(o.data, !1), rG(this, "afterInit") } is(t) { return rP[t] && this instanceof rP[t] } bindAxes() { let t, e = this, i = e.options, s = e.chart; rG(this, "bindAxes", null, function() { (e.axisTypes || []).forEach(function(o) { (s[o] || []).forEach(function(s) { t = s.options, (rK(i[o], 0) === s.index || void 0 !== i[o] && i[o] === t.id) && (rU(e, s.series), e[o] = s, s.isDirty = !0) }), e[o] || e.optionalAxis === o || rH(18, !0, s) }) }), rG(this, "afterBindAxes") } hasData() { return this.visible && void 0 !== this.dataMax && void 0 !== this.dataMin || this.visible && this.dataTable.rowCount > 0 } hasMarkerChanged(t, e) { let i = t.marker , s = e.marker || {}; return i && (s.enabled && !i.enabled || s.symbol !== i.symbol || s.height !== i.height || s.width !== i.width) } autoIncrement(t) { let e, i = this.options, {pointIntervalUnit: s, relativeXValue: o} = this.options, r = this.chart.time, a = this.xIncrement ?? r.parse(i.pointStart) ?? 0; if (this.pointInterval = e = rK(this.pointInterval, i.pointInterval, 1), o && rV(t) && (e *= t), s) { let t = r.toParts(a); "day" === s ? t[2] += e : "month" === s ? t[1] += e : "year" === s && (t[0] += e), e = r.makeTime.apply(r, t) - a } return o && rV(t) ? a + e : (this.xIncrement = a + e, a) } setDataSortingOptions() { let t = this.options; rF(this, { requireSorting: !1, sorted: !1, enabledDataSorting: !0, allowDG: !1 }), rN(t.pointRange) || (t.pointRange = 1) } setOptions(t) { let e, i = this.chart, s = i.options.plotOptions, o = i.userOptions || {}, r = r_(t), a = i.styledMode, n = { plotOptions: s, userOptions: r }; rG(this, "setOptions", n); let h = n.plotOptions[this.type] , l = o.plotOptions || {} , d = l.series || {} , c = rS.plotOptions[this.type] || {} , p = l[this.type] || {}; h.dataLabels = this.mergeArrays(c.dataLabels, h.dataLabels), this.userOptions = n.userOptions; let g = r_(h, s.series, p, r); this.tooltipOptions = r_(rS.tooltip, rS.plotOptions.series?.tooltip, c?.tooltip, i.userOptions.tooltip, l.series?.tooltip, p.tooltip, r.tooltip), this.stickyTracking = rK(r.stickyTracking, p.stickyTracking, d.stickyTracking, !!this.tooltipOptions.shared && !this.noSharedTooltip || g.stickyTracking), null === h.marker && delete g.marker, this.zoneAxis = g.zoneAxis || "y"; let u = this.zones = (g.zones || []).map(t => ({ ...t })); return (g.negativeColor || g.negativeFillColor) && !g.zones && (e = { value: g[this.zoneAxis + "Threshold"] || g.threshold || 0, className: "highcharts-negative" }, a || (e.color = g.negativeColor, e.fillColor = g.negativeFillColor), u.push(e)), u.length && rN(u[u.length - 1].value) && u.push(a ? {} : { color: this.color, fillColor: this.fillColor }), rG(this, "afterSetOptions", { options: g }), g } getName() { return this.options.name ?? rL(this.chart.options.lang.seriesName, this, this.chart) } getCyclic(t, e, i) { let s, o, r = this.chart, a = `${t}Index`, n = `${t}Counter`, h = i?.length || r.options.chart.colorCount; !e && (rN(o = rK("color" === t ? this.options.colorIndex : void 0, this[a])) ? s = o : (r.series.length || (r[n] = 0), s = r[n] % h, r[n] += 1), i && (e = i[s])), void 0 !== s && (this[a] = s), this[t] = e } getColor() { this.chart.styledMode ? this.getCyclic("color") : this.options.colorByPoint ? this.color = "#cccccc" : this.getCyclic("color", this.options.color || rS.plotOptions[this.type].color, this.chart.options.colors) } getPointsCollection() { return (this.hasGroupedData ? this.points : this.data) || [] } getSymbol() { let t = this.options.marker; this.getCyclic("symbol", t.symbol, this.chart.options.symbols) } getColumn(t, e) { return (e ? this.dataTable.modified : this.dataTable).getColumn(t, !0) || [] } findPointIndex(t, e) { let i, s, o, {id: r, x: a} = t, n = this.points, h = this.options.dataSorting, l = this.cropStart || 0; if (r) { let t = this.chart.get(r); t instanceof oK && (i = t) } else if (this.linkedParent || this.enabledDataSorting || this.options.relativeXValue) { let e = e => !e.touched && e.index === t.index; if (h?.matchByName ? e = e => !e.touched && e.name === t.name : this.options.relativeXValue && (e = e => !e.touched && e.options.x === t.x), !(i = rX(n, e))) return } return i && void 0 !== (o = i?.index) && (s = !0), void 0 === o && rV(a) && (o = this.getColumn("x").indexOf(a, e)), -1 !== o && void 0 !== o && this.cropped && (o = o >= l ? o - l : o), !s && rV(o) && n[o]?.touched && (o = void 0), o } updateData(t, e) { let {options: i, requireSorting: s} = this, o = i.dataSorting, r = this.points, a = [], n = t.length === r.length, h, l, d, c, p = !0; if (this.xIncrement = null, t.forEach( (t, e) => { let l, d = rN(t) && this.pointClass.prototype.optionsToObject.call({ series: this }, t) || {}, {id: p, x: g} = d; p || rV(g) ? (-1 === (l = this.findPointIndex(d, c)) || void 0 === l ? a.push(t) : r[l] && t !== i.data?.[l] ? (r[l].update(t, !1, void 0, !1), r[l].touched = !0, s && (c = l + 1)) : r[l] && (r[l].touched = !0), (!n || e !== l || o?.enabled || this.hasDerivedData) && (h = !0)) : a.push(t) } , this), h) for (l = r.length; l--; ) (d = r[l]) && !d.touched && d.remove?.(!1, e); else n && !o?.enabled ? (t.forEach( (t, e) => { t === r[e].y || r[e].destroyed || r[e].update(t, !1, void 0, !1) } ), a.length = 0) : p = !1; if (r.forEach(t => { t && (t.touched = !1) } ), !p) return !1; a.forEach(t => { this.addPoint(t, !1, void 0, void 0, !1) } , this); let g = this.getColumn("x"); return null === this.xIncrement && g.length && (this.xIncrement = rO(g), this.autoIncrement()), !0 } dataColumnKeys() { return ["x", ...this.pointArrayMap || ["y"]] } setData(t, e=!0, i, s) { let o = this.points, r = o?.length || 0, a = this.options, n = this.chart, h = a.dataSorting, l = this.xAxis, d = a.turboThreshold, c = this.dataTable, p = this.dataColumnKeys(), g = this.pointValKey || "y", u = (this.pointArrayMap || []).length, f = a.keys, m, x, y = 0, b = 1, v; n.options.chart.allowMutatingData || (a.data && delete this.options.data, this.userOptions.data && delete this.userOptions.data, v = r_(!0, t)); let k = (t = v || t || []).length; if (h?.enabled && (t = this.sortData(t)), n.options.chart.allowMutatingData && !1 !== s && k && r && !this.cropped && !this.hasGroupedData && this.visible && !this.boosted && (x = this.updateData(t, i)), !x) { this.xIncrement = null, this.colorCounter = 0; let e = d && k > d; if (e) { let i = this.getFirstValidPoint(t) , s = this.getFirstValidPoint(t, k - 1, -1) , o = t => !!(r$(t) && (f || rV(t[0]))); if (rV(i) && rV(s)) { let e = [] , i = []; for (let s of t) e.push(this.autoIncrement()), i.push(s); c.setColumns({ x: e, [g]: i }) } else if (o(i) && o(s)) { if (u) { let e = +(i.length === u) , s = Array(p.length).fill(0).map( () => []); for (let i of t) { e && s[0].push(this.autoIncrement()); for (let t = e; t <= u; t++) s[t]?.push(i[t - e]) } c.setColumns(p.reduce( (t, e, i) => (t[e] = s[i], t), {})) } else { f && (y = f.indexOf("x"), b = f.indexOf("y"), y = y >= 0 ? y : 0, b = b >= 0 ? b : 1), 1 === i.length && (b = 0); let e = [] , s = []; if (y === b) for (let i of t) e.push(this.autoIncrement()), s.push(i[b]); else for (let i of t) e.push(i[y]), s.push(i[b]); c.setColumns({ x: e, [g]: s }) } } else e = !1 } if (!e) { let e = p.reduce( (t, e) => (t[e] = [], t), {}); for (m = 0; m < k; m++) { let i = this.pointClass.prototype.applyOptions.apply({ series: this }, [t[m]]); for (let t of p) e[t][m] = i[t] } c.setColumns(e) } for (rZ(this.getColumn("y")[0]) && rH(14, !0, n), this.data = [], this.options.data = this.userOptions.data = t, m = r; m--; ) o[m]?.destroy(); l && (l.minRange = l.userMinRange), this.isDirty = n.isDirtyBox = !0, this.isDirtyData = !!o, i = !1 } "point" === a.legendType && (this.processData(), this.generatePoints()), e && n.redraw(i) } sortData(t) { let e = this , i = e.options.dataSorting.sortKey || "y" , s = function(t, e) { return rN(e) && t.pointClass.prototype.optionsToObject.call({ series: t }, e) || {} }; return t.forEach(function(i, o) { t[o] = s(e, i), t[o].index = o }, this), t.concat().sort( (t, e) => { let s = rY(i, t) , o = rY(i, e); return o < s ? -1 : +(o > s) } ).forEach(function(t, e) { t.x = e }, this), e.linkedSeries && e.linkedSeries.forEach(function(e) { let i = e.options , o = i.data; !i.dataSorting?.enabled && o && (o.forEach(function(i, r) { o[r] = s(e, i), t[r] && (o[r].x = t[r].x, o[r].index = r) }), e.setData(o, !1)) }), t } getProcessedData(t) { let e = this, {dataTable: i, isCartesian: s, options: o, xAxis: r} = e, a = o.cropThreshold, n = t || e.getExtremesFromAll, h = r?.logarithmic, l = i.rowCount, d, c, p = 0, g, u, f, m = e.getColumn("x"), x = i, y = !1; return r && (u = (g = r.getExtremes()).min, f = g.max, y = !!(r.categories && !r.names.length), s && e.sorted && !n && (!a || l > a || e.forceCrop) && (m[l - 1] < u || m[0] > f ? x = new rp : e.getColumn(e.pointValKey || "y").length && (m[0] < u || m[l - 1] > f) && (x = (d = this.cropData(i, u, f)).modified, p = d.start, c = !0))), m = x.getColumn("x") || [], { modified: x, cropped: c, cropStart: p, closestPointRange: rj([h ? m.map(h.log2lin) : m], () => e.requireSorting && !y && rH(15, !1, e.chart)) } } processData(t) { let e = this.xAxis , i = this.dataTable; if (this.isCartesian && !this.isDirty && !e.isDirty && !this.yAxis.isDirty && !t) return !1; let s = this.getProcessedData(); i.modified = s.modified, this.cropped = s.cropped, this.cropStart = s.cropStart, this.closestPointRange = this.basePointRange = s.closestPointRange, rG(this, "afterProcessData") } cropData(t, e, i) { let s = t.getColumn("x", !0) || [], o = s.length, r = {}, a, n, h = 0, l = o; for (a = 0; a < o; a++) if (s[a] >= e) { h = Math.max(0, a - 1); break } for (n = a; n < o; n++) if (s[n] > i) { l = n + 1; break } for (let e of this.dataColumnKeys()) { let i = t.getColumn(e, !0); i && (r[e] = i.slice(h, l)) } return { modified: new rp({ columns: r }), start: h, end: l } } generatePoints() { let t = this.options, e = this.processedData || t.data, i = this.dataTable.modified, s = this.getColumn("x", !0), o = this.pointClass, r = i.rowCount, a = this.cropStart || 0, n = this.hasGroupedData, h = t.keys, l = [], d = t.dataGrouping?.groupAll ? a : 0, c = this.xAxis?.categories, p = this.pointArrayMap || ["y"], g = this.dataColumnKeys(), u, f, m, x, y = this.data, b; if (!y && !n) { let t = []; t.length = e?.length || 0, y = this.data = t } for (h && n && (this.options.keys = !1), x = 0; x < r; x++) f = a + x, n ? ((m = new o(this,i.getRow(x, g) || [])).dataGroup = this.groupMap[d + x], m.dataGroup?.options && (m.options = m.dataGroup.options, rF(m, m.dataGroup.options), delete m.dataLabels)) : (m = y[f], b = e ? e[f] : i.getRow(x, p), m || void 0 === b || (y[f] = m = new o(this,b,s[x]))), m && (m.index = n ? d + x : f, l[x] = m, m.category = c?.[m.x] ?? m.x, m.key = m.name ?? m.category); if (this.options.keys = h, y && (r !== (u = y.length) || n)) for (x = 0; x < u; x++) x !== a || n || (x += r), y[x] && (y[x].destroyElements(), y[x].plotX = void 0); this.data = y, this.points = l, rG(this, "afterGeneratePoints") } getXExtremes(t) { return { min: rE(t), max: rO(t) } } getExtremes(t, e) { let {xAxis: i, yAxis: s} = this, o = e || this.getExtremesFromAll || this.options.getExtremesFromAll, r = o && this.cropped ? this.dataTable : this.dataTable.modified, a = r.rowCount, n = t || this.stackedYData, h = n ? [n] : (this.keysAffectYAxis || this.pointArrayMap || ["y"])?.map(t => r.getColumn(t, !0) || []) || [], l = this.getColumn("x", !0), d = [], c = this.requireSorting && !this.is("column") ? 1 : 0, p = !!s && s.positiveValuesOnly, g = o || this.cropped || !i, u, f, m, x = 0, y = 0; for (i && (x = (u = i.getExtremes()).min, y = u.max), m = 0; m < a; m++) if (f = l[m], g || (l[m + c] || f) >= x && (l[m - c] || f) <= y) for (let t of h) { let e = t[m]; rV(e) && (e > 0 || !p) && d.push(e) } let b = { activeYData: d, dataMin: rE(d), dataMax: rO(d) }; return rG(this, "afterGetExtremes", { dataExtremes: b }), b } applyExtremes() { let t = this.getExtremes(); return this.dataMin = t.dataMin, this.dataMax = t.dataMax, t } getFirstValidPoint(t, e=0, i=1) { let s = t.length , o = e; for (; o >= 0 && o < s; ) { if (rN(t[o])) return t[o]; o += i } } translate() { this.generatePoints(); let t = this.options, e = t.stacking, i = this.xAxis, s = this.enabledDataSorting, o = this.yAxis, r = this.points, a = r.length, n = this.pointPlacementToXValue(), h = !!n, l = t.threshold, d = t.startFromThreshold ? l : 0, c = t?.nullInteraction && o.len, p, g, u, f, m = Number.MAX_VALUE; function x(t) { return rI(t, -1e9, 1e9) } for (p = 0; p < a; p++) { let t, a = r[p], y = a.x, b, v, k = a.y, w = a.low, M = e && o.stacking?.stacks[(this.negStacks && k < (d ? 0 : l) ? "-" : "") + this.stackKey]; a.plotX = rV(g = i.translate(y, !1, !1, !1, !0, n)) ? rD(x(g)) : void 0, e && this.visible && M && M[y] && (f = this.getStackIndicator(f, y, this.index), !a.isNull && f.key && (v = (b = M[y]).points[f.key]), b && r$(v) && (w = v[0], k = v[1], w === d && f.key === M[y].base && (w = rK(rV(l) ? l : o.min)), o.positiveValuesOnly && rN(w) && w <= 0 && (w = void 0), a.total = a.stackTotal = rK(b.total), a.percentage = rN(a.y) && b.total ? a.y / b.total * 100 : void 0, a.stackY = k, this.irregularWidths || b.setOffset(this.pointXOffset || 0, this.barW || 0, void 0, void 0, void 0, this.xAxis))), a.yBottom = rN(w) ? x(o.translate(w, !1, !0, !1, !0)) : void 0, this.dataModify && (k = this.dataModify.modifyValue(k, p)), rV(k) && void 0 !== a.plotX ? t = rV(t = o.translate(k, !1, !0, !1, !0)) ? x(t) : void 0 : !rV(k) && c && (t = c), a.plotY = t, a.isInside = this.isPointInside(a), a.clientX = h ? rD(i.translate(y, !1, !1, !1, !0, n)) : g, a.negative = (a.y || 0) < (l || 0), a.isNull || !1 === a.visible || (void 0 !== u && (m = Math.min(m, Math.abs(g - u))), u = g), a.zone = this.zones.length ? a.getZone() : void 0, !a.graphic && this.group && s && (a.isNew = !0) } this.closestPointRangePx = m, rG(this, "afterTranslate") } getValidPoints(t, e, i) { let s = this.chart; return (t || this.points || []).filter(function(t) { let {plotX: o, plotY: r} = t; return !!((i || !t.isNull && rV(r)) && (!e || s.isInsidePlot(o, r, { inverted: s.inverted }))) && !1 !== t.visible }) } getSharedClipKey() { return this.sharedClipKey = (this.options.xAxis || 0) + "," + (this.options.yAxis || 0), this.sharedClipKey } setClip() { let {chart: t, group: e, markerGroup: i} = this , s = t.sharedClips , o = t.renderer , r = t.getClipBox(this) , a = this.getSharedClipKey() , n = s[a]; n ? n.animate(r) : s[a] = n = o.clipRect(r), e && e.clip(!1 === this.options.clip ? void 0 : n), i && i.clip() } animate(t) { let {chart: e, group: i, markerGroup: s} = this , o = e.inverted , r = rw(this.options.animation) , a = [this.getSharedClipKey(), r.duration, r.easing, r.defer].join(",") , n = e.sharedClips[a] , h = e.sharedClips[a + "m"]; if (t && i) { let t = e.getClipBox(this); if (n) n.attr("height", t.height); else { t.width = 0, o && (t.x = e.plotHeight), n = e.renderer.clipRect(t), e.sharedClips[a] = n; let i = { x: -99, y: -99, width: o ? e.plotWidth + 199 : 99, height: o ? 99 : e.plotHeight + 199 }; h = e.renderer.clipRect(i), e.sharedClips[a + "m"] = h } i.clip(n), s?.clip(h) } else if (n && !n.hasClass("highcharts-animating")) { let t = e.getClipBox(this) , i = r.step; (s?.element.childNodes.length || e.series.length > 1) && (r.step = function(t, e) { i && i.apply(e, arguments), "width" === e.prop && h?.element && h.attr(o ? "height" : "width", t + 99) } ), n.addClass("highcharts-animating").animate(t, r) } } afterAnimate() { this.setClip(), rq(this.chart.sharedClips, (t, e, i) => { t && !this.chart.container.querySelector(`[clip-path="url(#${t.id})"]`) && (t.destroy(), delete i[e]) } ), this.finishedAnimating = !0, rG(this, "afterAnimate") } drawPoints(t=this.points) { let e, i, s, o, r, a, n, h = this.chart, l = h.styledMode, {colorAxis: d, options: c} = this, p = c.marker, g = c.nullInteraction, u = this[this.specialGroup || "markerGroup"], f = this.xAxis, m = rK(p.enabled, !f || !!f.isRadial || null, this.closestPointRangePx >= p.enabledThreshold * p.radius); if (!1 !== p.enabled || this._hasPointMarkers) for (e = 0; e < t.length; e++) { o = (s = (i = t[e]).graphic) ? "animate" : "attr", r = i.marker || {}, a = !!i.marker; let c = i.isNull; if ((m && !rN(r.enabled) || r.enabled) && (!c || g) && !1 !== i.visible) { let t = rK(r.symbol, this.symbol, "rect"); n = this.markerAttribs(i, i.selected && "select"), this.enabledDataSorting && (i.startXPos = f.reversed ? -(n.width || 0) : f.width); let e = !1 !== i.isInside; if (!s && e && ((n.width || 0) > 0 || i.hasImage) && (i.graphic = s = h.renderer.symbol(t, n.x, n.y, n.width, n.height, a ? r : p).add(u), this.enabledDataSorting && h.hasRendered && (s.attr({ x: i.startXPos }), o = "animate")), s && "animate" === o && s[e ? "show" : "hide"](e).animate(n), s) { let t = this.pointAttribs(i, l || !i.selected ? void 0 : "select"); l ? d && s.css({ fill: t.fill }) : s[o](t) } s && s.addClass(i.getClassName(), !0) } else s && (i.graphic = s.destroy()) } } markerAttribs(t, e) { let i = this.options, s = i.marker, o = t.marker || {}, r = o.symbol || s.symbol, a = {}, n, h, l = rK(o.radius, s?.radius); e && (n = s.states[e], h = o.states && o.states[e], l = rK(h?.radius, n?.radius, l && l + (n?.radiusPlus || 0))), t.hasImage = r && 0 === r.indexOf("url"), t.hasImage && (l = 0); let d = t.pos(); return rV(l) && d && (i.crisp && (d[0] = rB(d[0], t.hasImage ? 0 : "rect" === r ? s?.lineWidth || 0 : 1)), a.x = d[0] - l, a.y = d[1] - l), l && (a.width = a.height = 2 * l), a } pointAttribs(t, e) { let i = this.options, s = i.marker, o = t?.options, r = o?.marker || {}, a = o?.color, n = t?.color, h = t?.zone?.color, l, d, c = this.color, p, g, u = rK(r.lineWidth, s.lineWidth), f = t?.isNull && i.nullInteraction ? 0 : 1; return c = a || h || n || c, p = r.fillColor || s.fillColor || c, g = r.lineColor || s.lineColor || c, e = e || "normal", l = s.states[e] || {}, u = rK((d = r.states && r.states[e] || {}).lineWidth, l.lineWidth, u + rK(d.lineWidthPlus, l.lineWidthPlus, 0)), p = d.fillColor || l.fillColor || p, g = d.lineColor || l.lineColor || g, { stroke: g, "stroke-width": u, fill: p, opacity: f = rK(d.opacity, l.opacity, f) } } destroy(t) { let e, i, s = this, o = s.chart, r = /AppleWebKit\/533/.test(rA.navigator.userAgent), a = s.data || []; for (rG(s, "destroy", { keepEventsForUpdate: t }), this.removeEvents(t), (s.axisTypes || []).forEach(function(t) { i = s[t], i?.series && (rW(i.series, s), i.isDirty = i.forceRedraw = !0) }), s.legendItem && s.chart.legend.destroyItem(s), e = a.length; e--; ) a[e]?.destroy?.(); for (let t of s.zones) rz(t, void 0, !0); V.clearTimeout(s.animationTimeout), rq(s, function(t, e) { t instanceof eJ && !t.survive && t[r && "group" === e ? "hide" : "destroy"]() }), o.hoverSeries === s && (o.hoverSeries = void 0), rW(o.series, s), o.orderItems("series"), rq(s, function(e, i) { t && "hcEvents" === i || delete s[i] }) } applyZones() { let {area: t, chart: e, graph: i, zones: s, points: o, xAxis: r, yAxis: a, zoneAxis: n} = this , {inverted: h, renderer: l} = e , d = this[`${n}Axis`] , {isXAxis: c, len: p=0, minPointOffset: g=0} = d || {} , u = (i?.strokeWidth() || 0) / 2 + 1 , f = (t, e=0, i=0) => { h && (i = p - i); let {translated: s=0, lineClip: o} = t , r = i - s; o?.push(["L", e, Math.abs(r) < u ? i - u * (r <= 0 ? -1 : 1) : s]) } ; if (s.length && (i || t) && d && rV(d.min)) { let e = d.getExtremes().max + g , u = t => { t.forEach( (e, i) => { ("M" === e[0] || "L" === e[0]) && (t[i] = [e[0], c ? p - e[1] : e[1], c ? e[2] : p - e[2]]) } ) } ; if (s.forEach(t => { t.lineClip = [], t.translated = rI(d.toPixels(rK(t.value, e), !0) || 0, 0, p) } ), i && !this.showLine && i.hide(), t && t.hide(), "y" === n && o.length < r.len) for (let t of o) { let {plotX: e, plotY: i, zone: o} = t , r = o && s[s.indexOf(o) - 1]; o && f(o, e, i), r && f(r, e, i) } let m = [] , x = d.toPixels(d.getExtremes().min - g, !0); s.forEach(e => { let s = e.lineClip || [] , o = Math.round(e.translated || 0); r.reversed && s.reverse(); let {clip: n, simpleClip: d} = e , p = 0 , g = 0 , f = r.len , y = a.len; c ? (p = o, f = x) : (g = o, y = x); let b = [["M", p, g], ["L", f, g], ["L", f, y], ["L", p, y], ["Z"]] , v = [b[0], ...s, b[1], b[2], ...m, b[3], b[4]]; m = s.reverse(), x = o, h && (u(v), t && u(b)), n ? (n.animate({ d: v }), d?.animate({ d: b })) : (n = e.clip = l.path(v), t && (d = e.simpleClip = l.path(b))), i && e.graph?.clip(n), t && e.area?.clip(d) } ) } else this.visible && (i && i.show(), t && t.show()) } plotGroup(t, e, i, s, o) { let r = this[t] , a = !r , n = { visibility: i, zIndex: s || .1 }; return rN(this.opacity) && !this.chart.styledMode && "inactive" !== this.state && (n.opacity = this.opacity), r || (this[t] = r = this.chart.renderer.g().add(o)), r.addClass("highcharts-" + e + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (rN(this.colorIndex) ? "highcharts-color-" + this.colorIndex + " " : "") + (this.options.className || "") + (r.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0), r.attr(n)[a ? "attr" : "animate"](this.getPlotBox(e)), r } getPlotBox(t) { let e = this.xAxis , i = this.yAxis , s = this.chart , o = s.inverted && !s.polar && e && this.invertible && "series" === t; return s.inverted && (e = i, i = this.xAxis), { translateX: e ? e.left : s.plotLeft, translateY: i ? i.top : s.plotTop, rotation: 90 * !!o, rotationOriginX: o ? (e.len - i.len) / 2 : 0, rotationOriginY: o ? (e.len + i.len) / 2 : 0, scaleX: o ? -1 : 1, scaleY: 1 } } removeEvents(t) { let {eventsToUnbind: e} = this; t || rJ(this), e.length && (e.forEach(t => { t() } ), e.length = 0) } render() { let t = this , {chart: e, options: i, hasRendered: s} = t , o = rw(i.animation) , r = t.visible ? "inherit" : "hidden" , a = i.zIndex , n = e.seriesGroup , h = t.finishedAnimating ? 0 : o.duration; rG(this, "render"), t.plotGroup("group", "series", r, a, n), t.markerGroup = t.plotGroup("markerGroup", "markers", r, a, n), !1 !== i.clip && t.setClip(), h && t.animate?.(!0), t.drawGraph && (t.drawGraph(), t.applyZones()), t.visible && t.drawPoints(), t.drawDataLabels?.(), t.redrawPoints?.(), i.enableMouseTracking && t.drawTracker?.(), h && t.animate?.(), s || (h && o.defer && (h += o.defer), t.animationTimeout = rQ( () => { t.afterAnimate() } , h || 0)), t.isDirty = !1, t.hasRendered = !0, rG(t, "afterRender") } redraw() { let t = this.isDirty || this.isDirtyData; this.translate(), this.render(), t && delete this.kdTree } reserveSpace() { return this.visible || !this.chart.options.chart.ignoreHiddenSeries } searchPoint(t, e) { let {xAxis: i, yAxis: s} = this , o = this.chart.inverted; return this.searchKDTree({ clientX: o ? i.len - t.chartY + i.pos : t.chartX - i.pos, plotY: o ? s.len - t.chartX + s.pos : t.chartY - s.pos }, e, t) } buildKDTree(t) { this.buildingKdTree = !0; let e = this , i = e.options , s = i.findNearestPointBy.indexOf("y") > -1 ? 2 : 1; delete e.kdTree, rQ(function() { e.kdTree = function t(i, s, o) { let r, a, n = i?.length; if (n) return r = e.kdAxisArray[s % o], i.sort( (t, e) => (t[r] || 0) - (e[r] || 0)), { point: i[a = Math.floor(n / 2)], left: t(i.slice(0, a), s + 1, o), right: t(i.slice(a + 1), s + 1, o) } }(e.getValidPoints(void 0, !e.directTouch, i?.nullInteraction), s, s), e.buildingKdTree = !1 }, i.kdNow || t?.type === "touchstart" ? 0 : 1) } searchKDTree(t, e, i, s, o) { let r = this , [a,n] = this.kdAxisArray , h = e ? "distX" : "dist" , l = (r.options.findNearestPointBy || "").indexOf("y") > -1 ? 2 : 1 , d = !!r.isBubble , c = s || ( (t, e, i) => { let s = t[i] || 0 , o = e[i] || 0; return [s === o && t.index > e.index || s < o ? t : e, !1] } ) , p = o || ( (t, e) => t < e); if (this.kdTree || this.buildingKdTree || this.buildKDTree(i), this.kdTree) return function t(e, i, s, o) { let l = i.point , g = r.kdAxisArray[s % o] , u = l , f = !1; !function(t, e) { let i = t[a] , s = e[a] , o = rN(i) && rN(s) ? i - s : null , r = t[n] , h = e[n] , l = rN(r) && rN(h) ? r - h : 0 , c = d && e.marker?.radius || 0; e.dist = Math.sqrt((o && o * o || 0) + l * l) - c, e.distX = rN(o) ? Math.abs(o) - c : Number.MAX_VALUE }(e, l); let m = (e[g] || 0) - (l[g] || 0) + (d && l.marker?.radius || 0) , x = m < 0 ? "left" : "right" , y = m < 0 ? "right" : "left"; return i[x] && ([u,f] = c(l, t(e, i[x], s + 1, o), h)), i[y] && p(Math.sqrt(m * m), u[h], f) && (u = c(u, t(e, i[y], s + 1, o), h)[0]), u }(t, this.kdTree, l, l) } pointPlacementToXValue() { let {options: t, xAxis: e} = this , i = t.pointPlacement; return "between" === i && (i = e.reversed ? -.5 : .5), rV(i) ? i * (t.pointRange || e.pointRange) : 0 } isPointInside(t) { let {chart: e, xAxis: i, yAxis: s} = this , {plotX: o=-1, plotY: r=-1} = t; return r >= 0 && r <= (s ? s.len : e.plotHeight) && o >= 0 && o <= (i ? i.len : e.plotWidth) } drawTracker() { let t = this , e = t.options , i = e.trackByArea , s = [].concat((i ? t.areaPath : t.graphPath) || []) , o = t.chart , r = o.pointer , a = o.renderer , n = o.options.tooltip?.snap || 0 , h = () => { e.enableMouseTracking && o.hoverSeries !== t && t.onMouseOver() } , l = "rgba(192,192,192," + (rC ? 1e-4 : .002) + ")" , d = t.tracker; d ? d.attr({ d: s }) : t.graph && (t.tracker = d = a.path(s).attr({ visibility: t.visible ? "inherit" : "hidden", zIndex: 2 }).addClass(i ? "highcharts-tracker-area" : "highcharts-tracker-line").add(t.group), o.styledMode || d.attr({ "stroke-linecap": "round", "stroke-linejoin": "round", stroke: l, fill: i ? l : "none", "stroke-width": t.graph.strokeWidth() + (i ? 0 : 2 * n) }), [t.tracker, t.markerGroup, t.dataLabelsGroup].forEach(t => { t && (t.addClass("highcharts-tracker").on("mouseover", h).on("mouseout", t => { r?.onTrackerMouseOut(t) } ), e.cursor && !o.styledMode && t.css({ cursor: e.cursor }), t.on("touchstart", h)) } )), rG(this, "afterDrawTracker") } addPoint(t, e, i, s, o) { let r, a, n = this.options, {chart: h, data: l, dataTable: d, xAxis: c} = this, p = c?.hasNames && c.names, g = n.data, u = this.getColumn("x"); e = rK(e, !0); let f = { series: this }; this.pointClass.prototype.applyOptions.apply(f, [t]); let m = f.x; if (a = u.length, this.requireSorting && m < u[a - 1]) for (r = !0; a && u[a - 1] > m; ) a--; d.setRow(f, a, !0, { addColumns: !1 }), p && f.name && (p[m] = f.name), g?.splice(a, 0, t), (r || this.processedData) && (this.data.splice(a, 0, null), this.processData()), "point" === n.legendType && this.generatePoints(), i && (l[0] && l[0].remove ? l[0].remove(!1) : ([l, g].filter(rN).forEach(t => { t.shift() } ), d.deleteRows(0))), !1 !== o && rG(this, "addPoint", { point: f }), this.isDirty = !0, this.isDirtyData = !0, e && h.redraw(s) } removePoint(t, e, i) { let s = this , {chart: o, data: r, points: a, dataTable: n} = s , h = r[t] , l = function() { [a?.length === r.length ? a : void 0, r, s.options.data].filter(rN).forEach(e => { e.splice(t, 1) } ), n.deleteRows(t), h?.destroy(), s.isDirty = !0, s.isDirtyData = !0, e && o.redraw() }; rM(i, o), e = rK(e, !0), h ? h.firePointEvent("remove", null, l) : l() } remove(t, e, i, s) { let o = this , r = o.chart; function a() { o.destroy(s), r.isDirtyLegend = r.isDirtyBox = !0, r.linkSeries(s), rK(t, !0) && r.redraw(e) } !1 !== i ? rG(o, "remove", null, a) : a() } update(t, e) { rG(this, "update", { options: t = rR(t, this.userOptions) }); let i = this, s = i.chart, o = i.userOptions, r = i.initialType || i.type, a = s.options.plotOptions, n = rP[r].prototype, h = i.finishedAnimating && { animation: !1 }, l = {}, d, c, p = r0.keepProps.slice(), g = t.type || o.type || s.options.chart.type, u = !(this.hasDerivedData || g && g !== this.type || void 0 !== t.keys || void 0 !== t.pointStart || void 0 !== t.pointInterval || void 0 !== t.relativeXValue || t.joinBy || t.mapData || ["dataGrouping", "pointStart", "pointInterval", "pointIntervalUnit", "keys"].some(t => i.hasOptionChanged(t))); g = g || r, u ? (p.push.apply(p, r0.keepPropsForPoints), !1 !== t.visible && p.push("area", "graph"), i.parallelArrays.forEach(function(t) { p.push(t + "Data") }), t.data && (t.dataSorting && rF(i.options.dataSorting, t.dataSorting), this.setData(t.data, !1))) : this.dataTable.modified = this.dataTable, t = r_(o, { index: void 0 === o.index ? i.index : o.index, pointStart: a?.series?.pointStart ?? o.pointStart ?? i.getColumn("x")[0] }, !u && { data: i.options.data }, t, h), u && t.data && (t.data = i.options.data), (p = ["group", "markerGroup", "dataLabelsGroup", "transformGroup"].concat(p)).forEach(function(t) { p[t] = i[t], delete i[t] }); let f = !1; if (rP[g]) { if (f = g !== i.type, i.remove(!1, !1, !1, !0), f) { if (s.propFromSeries(), Object.setPrototypeOf) Object.setPrototypeOf(i, rP[g].prototype); else { let t = Object.hasOwnProperty.call(i, "hcEvents") && i.hcEvents; for (c in n) i[c] = void 0; rF(i, rP[g].prototype), t ? i.hcEvents = t : delete i.hcEvents } } } else rH(17, !0, s, { missingModuleFor: g }); if (p.forEach(function(t) { i[t] = p[t] }), i.init(s, t), u && this.points) for (let t of (!1 === (d = i.options).visible ? (l.graphic = 1, l.dataLabel = 1) : (this.hasMarkerChanged(d, o) && (l.graphic = 1), i.hasDataLabels?.() || (l.dataLabel = 1)), this.points)) t?.series && (t.resolveColor(), Object.keys(l).length && t.destroyElements(l), !1 === d.showInLegend && t.legendItem && s.legend.destroyItem(t)); i.initialType = r, s.linkSeries(), s.setSortedData(), f && i.linkedSeries.length && (i.isDirtyData = !0), rG(this, "afterUpdate"), rK(e, !0) && s.redraw(!!u && void 0) } setName(t) { this.name = this.options.name = this.userOptions.name = t, this.chart.isDirtyLegend = !0 } hasOptionChanged(t) { let e = this.chart , i = this.options[t] , s = e.options.plotOptions , o = this.userOptions[t] , r = rK(s?.[this.type]?.[t], s?.series?.[t]); return o && !rN(r) ? i !== o : i !== rK(r, i) } onMouseOver() { let t = this.chart , e = t.hoverSeries , i = t.pointer; i?.setHoverChartIndex(), e && e !== this && e.onMouseOut(), this.options.events.mouseOver && rG(this, "mouseOver"), this.setState("hover"), t.hoverSeries = this } onMouseOut() { let t = this.options , e = this.chart , i = e.tooltip , s = e.hoverPoint; e.hoverSeries = null, s && s.onMouseOut(), this && t.events.mouseOut && rG(this, "mouseOut"), i && !this.stickyTracking && (!i.shared || this.noSharedTooltip) && i.hide(), e.series.forEach(function(t) { t.setState("", !0) }) } setState(t, e) { let i = this , s = i.options , o = i.graph , r = s.inactiveOtherPoints , a = s.states , n = rK(a[t || "normal"] && a[t || "normal"].animation, i.chart.options.chart.animation) , h = s.lineWidth , l = s.opacity; if (t = t || "", i.state !== t && ([i.group, i.markerGroup, i.dataLabelsGroup].forEach(function(e) { e && (i.state && e.removeClass("highcharts-series-" + i.state), t && e.addClass("highcharts-series-" + t)) }), i.state = t, !i.chart.styledMode)) { if (a[t] && !1 === a[t].enabled) return; if (t && (h = a[t].lineWidth || h + (a[t].lineWidthPlus || 0), l = rK(a[t].opacity, l)), o && !o.dashstyle && rV(h)) for (let t of [o, ...this.zones.map(t => t.graph)]) t?.animate({ "stroke-width": h }, n); r || [i.group, i.markerGroup, i.dataLabelsGroup, i.labelBySeries].forEach(function(t) { t && t.animate({ opacity: l }, n) }) } e && r && i.points && i.setAllPointsToState(t || void 0) } setAllPointsToState(t) { this.points.forEach(function(e) { e.setState && e.setState(t) }) } setVisible(t, e) { let i = this , s = i.chart , o = s.options.chart.ignoreHiddenSeries , r = i.visible; i.visible = t = i.options.visible = i.userOptions.visible = void 0 === t ? !r : t; let a = t ? "show" : "hide"; ["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"].forEach(t => { i[t]?.[a]() } ), (s.hoverSeries === i || s.hoverPoint?.series === i) && i.onMouseOut(), i.legendItem && s.legend.colorizeItem(i, t), i.isDirty = !0, i.options.stacking && s.series.forEach(t => { t.options.stacking && t.visible && (t.isDirty = !0) } ), i.linkedSeries.forEach(e => { e.setVisible(t, !1) } ), o && (s.isDirtyBox = !0), rG(i, a), !1 !== e && s.redraw() } show() { this.setVisible(!0) } hide() { this.setVisible(!1) } select(t) { this.selected = t = this.options.selected = void 0 === t ? !this.selected : t, this.checkbox && (this.checkbox.checked = t), rG(this, t ? "select" : "unselect") } shouldShowTooltip(t, e, i={}) { return i.series = this, i.visiblePlotOnly = !0, this.chart.isInsidePlot(t, e, i) } drawLegendSymbol(t, e) { rm[this.options.legendSymbol || "rectangle"]?.call(this, t, e) } } r0.defaultOptions = { lineWidth: 2, allowPointSelect: !1, crisp: !0, showCheckbox: !1, animation: { duration: 1e3 }, enableMouseTracking: !0, events: {}, marker: { enabledThreshold: 2, lineColor: "#ffffff", lineWidth: 0, radius: 4, states: { normal: { animation: !0 }, hover: { animation: { duration: 150 }, enabled: !0, radiusPlus: 2, lineWidthPlus: 1 }, select: { fillColor: "#cccccc", lineColor: "#000000", lineWidth: 2 } } }, point: { events: {} }, dataLabels: { animation: {}, align: "center", borderWidth: 0, defer: !0, formatter: function() { let {numberFormatter: t} = this.series.chart; return "number" != typeof this.y ? "" : t(this.y, -1) }, padding: 5, style: { fontSize: "0.7em", fontWeight: "bold", color: "contrast", textOutline: "1px contrast" }, verticalAlign: "bottom", x: 0, y: 0 }, cropThreshold: 300, opacity: 1, pointRange: 0, softThreshold: !0, states: { normal: { animation: !0 }, hover: { animation: { duration: 150 }, lineWidthPlus: 1, marker: {}, halo: { size: 10, opacity: .25 } }, select: { animation: { duration: 0 } }, inactive: { animation: { duration: 150 }, opacity: .2 } }, stickyTracking: !0, turboThreshold: 1e3, findNearestPointBy: "x" }, r0.types = rk.seriesTypes, r0.registerType = rk.registerSeriesType, r0.keepProps = ["colorIndex", "eventOptions", "navigatorSeries", "symbolIndex", "baseSeries"], r0.keepPropsForPoints = ["data", "isDirtyData", "isDirtyCanvas", "points", "dataTable", "processedData", "xIncrement", "cropped", "_hasPointMarkers", "hasDataLabels", "nodes", "layout", "level", "mapMap", "mapData", "minY", "maxY", "minX", "maxX", "transformGroups"], rF(r0.prototype, { axisTypes: ["xAxis", "yAxis"], coll: "series", colorCounter: 0, directTouch: !1, invertible: !0, isCartesian: !0, kdAxisArray: ["clientX", "plotY"], parallelArrays: ["x", "y"], pointClass: oK, requireSorting: !0, sorted: !0 }), rk.series = r0; let r1 = r0 , {animObject: r2, setAnimation: r3} = tU , {registerEventOptions: r5} = si , {composed: r6, marginNames: r9} = w , {distribute: r4} = ey , {format: r8} = ep , {addEvent: r7, createElement: at, css: ae, defined: ai, discardElement: as, find: ao, fireEvent: ar, isNumber: aa, merge: an, pick: ah, pushUnique: al, relativeLength: ad, stableSort: ac, syncTimeout: ap} = V; class ag { constructor(t, e) { this.allItems = [], this.initialItemY = 0, this.itemHeight = 0, this.itemMarginBottom = 0, this.itemMarginTop = 0, this.itemX = 0, this.itemY = 0, this.lastItemY = 0, this.lastLineHeight = 0, this.legendHeight = 0, this.legendWidth = 0, this.maxItemWidth = 0, this.maxLegendWidth = 0, this.offsetWidth = 0, this.padding = 0, this.pages = [], this.symbolHeight = 0, this.symbolWidth = 0, this.titleHeight = 0, this.totalItemWidth = 0, this.widthOption = 0, this.chart = t, this.setOptions(e), e.enabled && (this.render(), r5(this, e), r7(this.chart, "endResize", function() { this.legend.positionCheckboxes() })), r7(this.chart, "render", () => { this.options.enabled && this.proximate && (this.proximatePositions(), this.positionItems()) } ) } setOptions(t) { let e = ah(t.padding, 8); this.options = t, this.chart.styledMode || (this.itemStyle = t.itemStyle, this.itemHiddenStyle = an(this.itemStyle, t.itemHiddenStyle)), this.itemMarginTop = t.itemMarginTop, this.itemMarginBottom = t.itemMarginBottom, this.padding = e, this.initialItemY = e - 5, this.symbolWidth = ah(t.symbolWidth, 16), this.pages = [], this.proximate = "proximate" === t.layout && !this.chart.inverted, this.baseline = void 0 } update(t, e) { let i = this.chart; this.setOptions(an(!0, this.options, t)), "events"in this.options && r5(this, this.options), this.destroy(), i.isDirtyLegend = i.isDirtyBox = !0, ah(e, !0) && i.redraw(), ar(this, "afterUpdate", { redraw: e }) } colorizeItem(t, e) { let i = t.color , {area: s, group: o, label: r, line: a, symbol: n} = t.legendItem || {}; if ((t instanceof r1 || t instanceof oK) && (t.color = t.options?.legendSymbolColor || i), o?.[e ? "removeClass" : "addClass"]("highcharts-legend-item-hidden"), !this.chart.styledMode) { let {itemHiddenStyle: i={}} = this , o = i.color , {fillColor: h, fillOpacity: l, lineColor: d, marker: c} = t.options , p = t => (!e && (t.fill && (t.fill = o), t.stroke && (t.stroke = o)), t); r?.css(an(e ? this.itemStyle : i)), a?.attr(p({ stroke: d || t.color })), n && n.attr(p(c && n.isMarker ? t.pointAttribs() : { fill: t.color })), s?.attr(p({ fill: h || t.color, "fill-opacity": h ? 1 : l ?? .75 })) } t.color = i, ar(this, "afterColorizeItem", { item: t, visible: e }) } positionItems() { this.allItems.forEach(this.positionItem, this), this.chart.isResizing || this.positionCheckboxes() } positionItem(t) { let {group: e, x: i=0, y: s=0} = t.legendItem || {} , o = this.options , r = o.symbolPadding , a = !o.rtl , n = t.checkbox; if (e?.element) { let o = { translateX: a ? i : this.legendWidth - i - 2 * r - 4, translateY: s }; e[ai(e.translateY) ? "animate" : "attr"](o, void 0, () => { ar(this, "afterPositionItem", { item: t }) } ) } n && (n.x = i, n.y = s) } destroyItem(t) { let e = t.checkbox , i = t.legendItem || {}; for (let t of ["group", "label", "line", "symbol"]) i[t] && (i[t] = i[t].destroy()); e && as(e), t.legendItem = void 0 } destroy() { for (let t of this.getAllItems()) this.destroyItem(t); for (let t of ["clipRect", "up", "down", "pager", "nav", "box", "title", "group"]) this[t] && (this[t] = this[t].destroy()); this.display = null } positionCheckboxes() { let t, e = this.group?.alignAttr, i = this.clipHeight || this.legendHeight, s = this.titleHeight; e && (t = e.translateY, this.allItems.forEach(function(o) { let r, a = o.checkbox; a && (r = t + s + a.y + (this.scrollOffset || 0) + 3, ae(a, { left: e.translateX + o.checkboxOffset + a.x - 20 + "px", top: r + "px", display: this.proximate || r > t - 6 && r < t + i - 6 ? "" : "none" })) }, this)) } renderTitle() { let t = this.options, e = this.padding, i = t.title, s, o = 0; i.text && (this.title || (this.title = this.chart.renderer.label(i.text, e - 3, e - 4, void 0, void 0, void 0, t.useHTML, void 0, "legend-title").attr({ zIndex: 1 }), this.chart.styledMode || this.title.css(i.style), this.title.add(this.group)), i.width || this.title.css({ width: this.maxLegendWidth + "px" }), o = (s = this.title.getBBox()).height, this.offsetWidth = s.width, this.contentGroup.attr({ translateY: o })), this.titleHeight = o } setText(t) { let e = this.options; t.legendItem.label.attr({ text: e.labelFormat ? r8(e.labelFormat, t, this.chart) : e.labelFormatter.call(t) }) } renderItem(t) { let e = t.legendItem = t.legendItem || {} , i = this.chart , s = i.renderer , o = this.options , r = "horizontal" === o.layout , a = this.symbolWidth , n = o.symbolPadding || 0 , h = this.itemStyle , l = this.itemHiddenStyle , d = r ? ah(o.itemDistance, 20) : 0 , c = !o.rtl , p = !t.series , g = !p && t.series.drawLegendSymbol ? t.series : t , u = g.options , f = !!this.createCheckboxForItem && u && u.showCheckbox , m = o.useHTML , x = t.options.className , y = e.label , b = a + n + d + 20 * !!f; !y && (e.group = s.g("legend-item").addClass("highcharts-" + g.type + "-series highcharts-color-" + t.colorIndex + (x ? " " + x : "") + (p ? " highcharts-series-" + t.index : "")).attr({ zIndex: 1 }).add(this.scrollGroup), e.label = y = s.text("", c ? a + n : -n, this.baseline || 0, m), i.styledMode || y.css(an(t.visible ? h : l)), y.attr({ align: c ? "left" : "right", zIndex: 2 }).add(e.group), !this.baseline && (this.fontMetrics = s.fontMetrics(y), this.baseline = this.fontMetrics.f + 3 + this.itemMarginTop, y.attr("y", this.baseline), this.symbolHeight = ah(o.symbolHeight, this.fontMetrics.f), o.squareSymbol && (this.symbolWidth = ah(o.symbolWidth, Math.max(this.symbolHeight, 16)), b = this.symbolWidth + n + d + 20 * !!f, c && y.attr("x", this.symbolWidth + n))), g.drawLegendSymbol(this, t), this.setItemEvents && this.setItemEvents(t, y, m)), f && !t.checkbox && this.createCheckboxForItem && this.createCheckboxForItem(t), this.colorizeItem(t, t.visible), (i.styledMode || !h.width) && y.css({ width: (o.itemWidth || this.widthOption || i.spacingBox.width) - b + "px" }), this.setText(t); let v = y.getBBox() , k = this.fontMetrics?.h || 0; t.itemWidth = t.checkboxOffset = o.itemWidth || e.labelWidth || v.width + b, this.maxItemWidth = Math.max(this.maxItemWidth, t.itemWidth), this.totalItemWidth += t.itemWidth, this.itemHeight = t.itemHeight = Math.round(e.labelHeight || (v.height > 1.5 * k ? v.height : k)) } layoutItem(t) { let e = this.options , i = this.padding , s = "horizontal" === e.layout , o = t.itemHeight , r = this.itemMarginBottom , a = this.itemMarginTop , n = s ? ah(e.itemDistance, 20) : 0 , h = this.maxLegendWidth , l = e.alignColumns && this.totalItemWidth > h ? this.maxItemWidth : t.itemWidth , d = t.legendItem || {}; s && this.itemX - i + l > h && (this.itemX = i, this.lastLineHeight && (this.itemY += a + this.lastLineHeight + r), this.lastLineHeight = 0), this.lastItemY = a + this.itemY + r, this.lastLineHeight = Math.max(o, this.lastLineHeight), d.x = this.itemX, d.y = this.itemY, s ? this.itemX += l : (this.itemY += a + o + r, this.lastLineHeight = o), this.offsetWidth = this.widthOption || Math.max((s ? this.itemX - i - (t.checkbox ? 0 : n) : l) + i, this.offsetWidth) } getAllItems() { let t = []; return this.chart.series.forEach(function(e) { let i = e?.options; e && ah(i.showInLegend, !ai(i.linkedTo) && void 0, !0) && (t = t.concat(e.legendItem?.labels || ("point" === i.legendType ? e.data : e))) }), ar(this, "afterGetAllItems", { allItems: t }), t } getAlignment() { let t = this.options; return this.proximate ? t.align.charAt(0) + "tv" : t.floating ? "" : t.align.charAt(0) + t.verticalAlign.charAt(0) + t.layout.charAt(0) } adjustMargins(t, e) { let i = this.chart , s = this.options , o = this.getAlignment(); o && [/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/].forEach(function(r, a) { r.test(o) && !ai(t[a]) && (i[r9[a]] = Math.max(i[r9[a]], i.legend[(a + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][a] * s[a % 2 ? "x" : "y"] + ah(s.margin, 12) + e[a] + (i.titleOffset[a] || 0))) }) } proximatePositions() { let t, e = this.chart, i = [], s = "left" === this.options.align; for (let o of (this.allItems.forEach(function(t) { let o, r, a = s, n, h; t.yAxis && (t.xAxis.options.reversed && (a = !a), t.points && (o = ao(a ? t.points : t.points.slice(0).reverse(), function(t) { return aa(t.plotY) })), r = this.itemMarginTop + t.legendItem.label.getBBox().height + this.itemMarginBottom, h = t.yAxis.top - e.plotTop, n = t.visible ? (o ? o.plotY : t.yAxis.height) + (h - .3 * r) : h + t.yAxis.height, i.push({ target: n, size: r, item: t })) }, this), r4(i, e.plotHeight))) t = o.item.legendItem || {}, aa(o.pos) && (t.y = e.plotTop - e.spacing[0] + o.pos) } render() { let t = this.chart, e = t.renderer, i = this.options, s = this.padding, o = this.getAllItems(), r, a, n, h = this.group, l, d = this.box; this.itemX = s, this.itemY = this.initialItemY, this.offsetWidth = 0, this.lastItemY = 0, this.widthOption = ad(i.width, t.spacingBox.width - s), l = t.spacingBox.width - 2 * s - i.x, ["rm", "lm"].indexOf(this.getAlignment().substring(0, 2)) > -1 && (l /= 2), this.maxLegendWidth = this.widthOption || l, h || (this.group = h = e.g("legend").addClass(i.className || "").attr({ zIndex: 7 }).add(), this.contentGroup = e.g().attr({ zIndex: 1 }).add(h), this.scrollGroup = e.g().add(this.contentGroup)), this.renderTitle(), ac(o, (t, e) => (t.options?.legendIndex || 0) - (e.options?.legendIndex || 0)), i.reversed && o.reverse(), this.allItems = o, this.display = r = !!o.length, this.lastLineHeight = 0, this.maxItemWidth = 0, this.totalItemWidth = 0, this.itemHeight = 0, o.forEach(this.renderItem, this), o.forEach(this.layoutItem, this), a = (this.widthOption || this.offsetWidth) + s, n = this.lastItemY + this.lastLineHeight + this.titleHeight, n = this.handleOverflow(n) + s, d || (this.box = d = e.rect().addClass("highcharts-legend-box").attr({ r: i.borderRadius }).add(h)), t.styledMode || d.attr({ stroke: i.borderColor, "stroke-width": i.borderWidth || 0, fill: i.backgroundColor || "none" }).shadow(i.shadow), a > 0 && n > 0 && d[d.placed ? "animate" : "attr"](d.crisp.call({}, { x: 0, y: 0, width: a, height: n }, d.strokeWidth())), h[r ? "show" : "hide"](), t.styledMode && "none" === h.getStyle("display") && (a = n = 0), this.legendWidth = a, this.legendHeight = n, r && this.align(), this.proximate || this.positionItems(), ar(this, "afterRender") } align(t=this.chart.spacingBox) { let e = this.chart , i = this.options , s = t.y; /(lth|ct|rth)/.test(this.getAlignment()) && e.titleOffset[0] > 0 ? s += e.titleOffset[0] : /(lbh|cb|rbh)/.test(this.getAlignment()) && e.titleOffset[2] > 0 && (s -= e.titleOffset[2]), s !== t.y && (t = an(t, { y: s })), e.hasRendered || (this.group.placed = !1), this.group.align(an(i, { width: this.legendWidth, height: this.legendHeight, verticalAlign: this.proximate ? "top" : i.verticalAlign }), !0, t) } handleOverflow(t) { let e = this, i = this.chart, s = i.renderer, o = this.options, r = o.y, a = "top" === o.verticalAlign, n = this.padding, h = o.maxHeight, l = o.navigation, d = ah(l.animation, !0), c = l.arrowSize || 12, p = this.pages, g = this.allItems, u = function(t) { "number" == typeof t ? w.attr({ height: t }) : w && (e.clipRect = w.destroy(), e.contentGroup.clip()), e.contentGroup.div && (e.contentGroup.div.style.clip = t ? "rect(" + n + "px,9999px," + (n + t) + "px,0)" : "auto") }, f = function(t) { return e[t] = s.circle(0, 0, 1.3 * c).translate(c / 2, c / 2).add(k), i.styledMode || e[t].attr("fill", "rgba(0,0,0,0.0001)"), e[t] }, m, x, y, b, v = i.spacingBox.height + (a ? -r : r) - n, k = this.nav, w = this.clipRect; return "horizontal" !== o.layout || "middle" === o.verticalAlign || o.floating || (v /= 2), h && (v = Math.min(v, h)), p.length = 0, t && v > 0 && t > v && !1 !== l.enabled ? (this.clipHeight = m = Math.max(v - 20 - this.titleHeight - n, 0), this.currentPage = ah(this.currentPage, 1), this.fullHeight = t, g.forEach( (t, e) => { let i = (y = t.legendItem || {}).y || 0 , s = Math.round(y.label.getBBox().height) , o = p.length; (!o || i - p[o - 1] > m && (x || i) !== p[o - 1]) && (p.push(x || i), o++), y.pageIx = o - 1, x && b && (b.pageIx = o - 1), e === g.length - 1 && i + s - p[o - 1] > m && i > p[o - 1] && (p.push(i), y.pageIx = o), i !== x && (x = i), b = y } ), w || (w = e.clipRect = s.clipRect(0, n - 2, 9999, 0), e.contentGroup.clip(w)), u(m), k || (this.nav = k = s.g().attr({ zIndex: 1 }).add(this.group), this.up = s.symbol("triangle", 0, 0, c, c).add(k), f("upTracker").on("click", function() { e.scroll(-1, d) }), this.pager = s.text("", 15, 10).addClass("highcharts-legend-navigation"), !i.styledMode && l.style && this.pager.css(l.style), this.pager.add(k), this.down = s.symbol("triangle-down", 0, 0, c, c).add(k), f("downTracker").on("click", function() { e.scroll(1, d) })), e.scroll(0), t = v) : k && (u(), this.nav = k.destroy(), this.scrollGroup.attr({ translateY: 1 }), this.clipHeight = 0), t } scroll(t, e) { let i = this.chart , s = this.pages , o = s.length , r = this.clipHeight , a = this.options.navigation , n = this.pager , h = this.padding , l = this.currentPage + t; l > o && (l = o), l > 0 && (void 0 !== e && r3(e, i), this.nav.attr({ translateX: h, translateY: r + this.padding + 7 + this.titleHeight, visibility: "inherit" }), [this.up, this.upTracker].forEach(function(t) { t.attr({ class: 1 === l ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" }) }), n.attr({ text: l + "/" + o }), [this.down, this.downTracker].forEach(function(t) { t.attr({ x: 18 + this.pager.getBBox().width, class: l === o ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" }) }, this), i.styledMode || (this.up.attr({ fill: 1 === l ? a.inactiveColor : a.activeColor }), this.upTracker.css({ cursor: 1 === l ? "default" : "pointer" }), this.down.attr({ fill: l === o ? a.inactiveColor : a.activeColor }), this.downTracker.css({ cursor: l === o ? "default" : "pointer" })), this.scrollOffset = -s[l - 1] + this.initialItemY, this.scrollGroup.animate({ translateY: this.scrollOffset }), this.currentPage = l, this.positionCheckboxes(), ap( () => { ar(this, "afterScroll", { currentPage: l }) } , r2(ah(e, i.renderer.globalAnimation, !0)).duration)) } setItemEvents(t, e, i) { let s = this , o = t.legendItem || {} , r = s.chart.renderer.boxWrapper , a = t instanceof oK , n = t instanceof r1 , h = "highcharts-legend-" + (a ? "point" : "series") + "-active" , l = s.chart.styledMode , d = i ? [e, o.symbol] : [o.group] , c = e => { s.allItems.forEach(i => { t !== i && [i].concat(i.linkedSeries || []).forEach(t => { t.setState(e, !a) } ) } ) } ; for (let i of d) i && i.on("mouseover", function() { t.visible && c("inactive"), t.setState("hover"), t.visible && r.addClass(h), l || e.css(s.options.itemHoverStyle) }).on("mouseout", function() { s.chart.styledMode || e.css(an(t.visible ? s.itemStyle : s.itemHiddenStyle)), c(""), r.removeClass(h), t.setState() }).on("click", function(e) { let i = function() { t.setVisible && t.setVisible(), c(t.visible ? "inactive" : "") }; r.removeClass(h), ar(s, "itemClick", { browserEvent: e, legendItem: t }, i), a ? t.firePointEvent("legendItemClick", { browserEvent: e }) : n && ar(t, "legendItemClick", { browserEvent: e }) }) } createCheckboxForItem(t) { t.checkbox = at("input", { type: "checkbox", className: "highcharts-legend-checkbox", checked: t.selected, defaultChecked: t.selected }, this.options.itemCheckboxStyle, this.chart.container), r7(t.checkbox, "click", function(e) { let i = e.target; ar(t.series || t, "checkboxClick", { checked: i.checked, item: t }, function() { t.select() }) }) } } !function(t) { t.compose = function(e) { al(r6, "Core.Legend") && r7(e, "beforeMargins", function() { this.legend = new t(this,this.options.legend) }) } }(ag || (ag = {})); let au = ag , {animate: af, animObject: am, setAnimation: ax} = tU , {defaultOptions: ay} = tv , {numberFormat: ab} = ep , {registerEventOptions: av} = si , {charts: ak, doc: aw, marginNames: aM, svg: aS, win: aT} = w , {seriesTypes: aC} = rk , {addEvent: aA, attr: aP, createElement: aL, css: aO, defined: aE, diffObjects: aI, discardElement: aD, erase: aB, error: aN, extend: az, find: aR, fireEvent: aW, getAlignFactor: aH, getStyle: aF, isArray: aX, isNumber: aG, isObject: aj, isString: aY, merge: aU, objectEach: a$, pick: aV, pInt: aZ, relativeLength: a_, removeEvent: aq, splat: aK, syncTimeout: aJ, uniqueKey: aQ} = V; class a0 { static chart(t, e, i) { return new a0(t,e,i) } constructor(t, e, i) { this.sharedClips = {}; let s = [...arguments]; (aY(t) || t.nodeName) && (this.renderTo = s.shift()), this.init(s[0], s[1]) } setZoomOptions() { let t = this.options.chart , e = t.zooming; this.zooming = { ...e, type: aV(t.zoomType, e.type), key: aV(t.zoomKey, e.key), pinchType: aV(t.pinchType, e.pinchType), singleTouch: aV(t.zoomBySingleTouch, e.singleTouch, !1), resetButton: aU(e.resetButton, t.resetZoomButton) } } init(t, e) { aW(this, "init", { args: arguments }, function() { let i = aU(ay, t) , s = i.chart , o = this.renderTo || s.renderTo; this.userOptions = az({}, t), (this.renderTo = aY(o) ? aw.getElementById(o) : o) || aN(13, !0, this), this.margin = [], this.spacing = [], this.labelCollectors = [], this.callback = e, this.isResizing = 0, this.options = i, this.axes = [], this.series = [], this.locale = i.lang.locale ?? this.renderTo.closest("[lang]")?.lang, this.time = new tu(az(i.time || {}, { locale: this.locale }),i.lang), i.time = this.time.options, this.numberFormatter = (s.numberFormatter || ab).bind(this), this.styledMode = s.styledMode, this.hasCartesianSeries = s.showAxes, this.index = ak.length, ak.push(this), w.chartCount++, av(this, s), this.xAxis = [], this.yAxis = [], this.pointCount = this.colorCounter = this.symbolCounter = 0, this.setZoomOptions(), aW(this, "afterInit"), this.firstRender() }) } initSeries(t) { let e = this.options.chart , i = t.type || e.type , s = aC[i]; s || aN(17, !0, this, { missingModuleFor: i }); let o = new s; return "function" == typeof o.init && o.init(this, t), o } setSortedData() { this.getSeriesOrderByLinks().forEach(function(t) { t.points || t.data || !t.enabledDataSorting || t.setData(t.options.data, !1) }) } getSeriesOrderByLinks() { return this.series.concat().sort(function(t, e) { return t.linkedSeries.length || e.linkedSeries.length ? e.linkedSeries.length - t.linkedSeries.length : 0 }) } orderItems(t, e=0) { let i = this[t] , s = this.options[t] = aK(this.options[t]).slice() , o = this.userOptions[t] = this.userOptions[t] ? aK(this.userOptions[t]).slice() : []; if (this.hasRendered && (s.splice(e), o.splice(e)), i) for (let t = e, r = i.length; t < r; ++t) { let e = i[t]; e && (e.index = t, e instanceof r1 && (e.name = e.getName()), e.options.isInternal || (s[t] = e.options, o[t] = e.userOptions)) } } getClipBox(t, e) { let i = this.inverted , {xAxis: s, yAxis: o} = t || {} , {x: r, y: a, width: n, height: h} = aU(this.clipBox); return t && (s && s.len !== this.plotSizeX && (n = s.len), o && o.len !== this.plotSizeY && (h = o.len), i && !t.invertible && ([n,h] = [h, n])), e && (r += (i ? o : s)?.pos ?? this.plotLeft, a += (i ? s : o)?.pos ?? this.plotTop), { x: r, y: a, width: n, height: h } } isInsidePlot(t, e, i={}) { let {inverted: s, plotBox: o, plotLeft: r, plotTop: a, scrollablePlotBox: n} = this , {scrollLeft: h=0, scrollTop: l=0} = i.visiblePlotOnly && this.scrollablePlotArea?.scrollingContainer || {} , d = i.series , c = i.visiblePlotOnly && n || o , p = i.inverted ? e : t , g = i.inverted ? t : e , u = { x: p, y: g, isInsidePlot: !0, options: i }; if (!i.ignoreX) { let t = d && (s && !this.polar ? d.yAxis : d.xAxis) || { pos: r, len: 1 / 0 } , e = i.paneCoordinates ? t.pos + p : r + p; e >= Math.max(h + r, t.pos) && e <= Math.min(h + r + c.width, t.pos + t.len) || (u.isInsidePlot = !1) } if (!i.ignoreY && u.isInsidePlot) { let t = !s && i.axis && !i.axis.isXAxis && i.axis || d && (s ? d.xAxis : d.yAxis) || { pos: a, len: 1 / 0 } , e = i.paneCoordinates ? t.pos + g : a + g; e >= Math.max(l + a, t.pos) && e <= Math.min(l + a + c.height, t.pos + t.len) || (u.isInsidePlot = !1) } return aW(this, "afterIsInsidePlot", u), u.isInsidePlot } redraw(t) { aW(this, "beforeRedraw"); let e = this.hasCartesianSeries ? this.axes : this.colorAxis || [], i = this.series, s = this.pointer, o = this.legend, r = this.userOptions.legend, a = this.renderer, n = a.isHidden(), h = [], l, d, c, p = this.isDirtyBox, g = this.isDirtyLegend, u; for (a.rootFontSize = a.boxWrapper.getStyle("font-size"), this.setResponsive && this.setResponsive(!1), ax(!!this.hasRendered && t, this), n && this.temporaryDisplay(), this.layOutTitles(!1), c = i.length; c--; ) if (((u = i[c]).options.stacking || u.options.centerInCategory) && (d = !0, u.isDirty)) { l = !0; break } if (l) for (c = i.length; c--; ) (u = i[c]).options.stacking && (u.isDirty = !0); i.forEach(function(t) { t.isDirty && ("point" === t.options.legendType ? ("function" == typeof t.updateTotals && t.updateTotals(), g = !0) : r && (r.labelFormatter || r.labelFormat) && (g = !0)), t.isDirtyData && aW(t, "updatedData") }), g && o && o.options.enabled && (o.render(), this.isDirtyLegend = !1), d && this.getStacks(), e.forEach(function(t) { t.updateNames(), t.setScale() }), this.getMargins(), e.forEach(function(t) { t.isDirty && (p = !0) }), e.forEach(function(t) { let e = t.min + "," + t.max; t.extKey !== e && (t.extKey = e, h.push(function() { aW(t, "afterSetExtremes", az(t.eventArgs, t.getExtremes())), delete t.eventArgs })), (p || d) && t.redraw() }), p && this.drawChartBox(), aW(this, "predraw"), i.forEach(function(t) { (p || t.isDirty) && t.visible && t.redraw(), t.isDirtyData = !1 }), s && s.reset(!0), a.draw(), aW(this, "redraw"), aW(this, "render"), n && this.temporaryDisplay(!0), h.forEach(function(t) { t.call() }) } get(t) { let e = this.series; function i(e) { return e.id === t || e.options && e.options.id === t } let s = aR(this.axes, i) || aR(this.series, i); for (let t = 0; !s && t < e.length; t++) s = aR(e[t].points || [], i); return s } createAxes() { let t = this.userOptions; for (let e of (aW(this, "createAxes"), ["xAxis", "yAxis"])) for (let i of t[e] = aK(t[e] || {})) new s$(this,i,e); aW(this, "afterCreateAxes") } getSelectedPoints() { return this.series.reduce( (t, e) => (e.getPointsCollection().forEach(e => { aV(e.selectedStaging, e.selected) && t.push(e) } ), t), []) } getSelectedSeries() { return this.series.filter(t => t.selected) } setTitle(t, e, i) { this.applyDescription("title", t), this.applyDescription("subtitle", e), this.applyDescription("caption", void 0), this.layOutTitles(i) } applyDescription(t, e) { let i = this , s = this.options[t] = aU(this.options[t], e) , o = this[t]; o && e && (this[t] = o = o.destroy()), s && !o && ((o = this.renderer.text(s.text, 0, 0, s.useHTML).attr({ align: s.align, class: "highcharts-" + t, zIndex: s.zIndex || 4 }).css({ textOverflow: "ellipsis", whiteSpace: "nowrap" }).add()).update = function(e, s) { i.applyDescription(t, e), i.layOutTitles(s) } , this.styledMode || o.css(az("title" === t ? { fontSize: this.options.isStock ? "1em" : "1.2em" } : {}, s.style)), o.textPxLength = o.getBBox().width, o.css({ whiteSpace: s.style?.whiteSpace }), this[t] = o) } layOutTitles(t=!0) { let e = [0, 0, 0] , {options: i, renderer: s, spacingBox: o} = this; ["title", "subtitle", "caption"].forEach(t => { let i = this[t] , r = this.options[t] , a = aU(o) , n = i?.textPxLength || 0; if (i && r) { aW(this, "layOutTitle", { alignTo: a, key: t, textPxLength: n }); let o = s.fontMetrics(i) , h = o.b , l = o.h , d = r.verticalAlign || "top" , c = "top" === d , p = c && r.minScale || 1 , g = "title" === t ? c ? -3 : 0 : c ? e[0] + 2 : 0 , u = Math.min(a.width / n, 1) , f = Math.max(p, u) , m = aU({ y: "bottom" === d ? h : g + h }, { align: "title" === t ? u < p ? "left" : "center" : this.title?.alignValue }, r) , x = (r.width || (u > p ? this.chartWidth : a.width) / f) + "px"; i.alignValue !== m.align && (i.placed = !1); let y = Math.round(i.css({ width: x }).getBBox(r.useHTML).height); if (m.height = y, i.align(m, !1, a).attr({ align: m.align, scaleX: f, scaleY: f, "transform-origin": `${a.x + n * f * aH(m.align)} ${l}` }), !r.floating) { let t = y * (y < 1.2 * l ? 1 : f); "top" === d ? e[0] = Math.ceil(e[0] + t) : "bottom" === d && (e[2] = Math.ceil(e[2] + t)) } } } , this), e[0] && "top" === (i.title?.verticalAlign || "top") && (e[0] += i.title?.margin || 0), e[2] && i.caption?.verticalAlign === "bottom" && (e[2] += i.caption?.margin || 0); let r = !this.titleOffset || this.titleOffset.join(",") !== e.join(","); this.titleOffset = e, aW(this, "afterLayOutTitles"), !this.isDirtyBox && r && (this.isDirtyBox = this.isDirtyLegend = r, this.hasRendered && t && this.isDirtyBox && this.redraw()) } getContainerBox() { let t = [].map.call(this.renderTo.children, t => { if (t !== this.container) { let e = t.style.display; return t.style.display = "none", [t, e] } } ) , e = { width: aF(this.renderTo, "width", !0) || 0, height: aF(this.renderTo, "height", !0) || 0 }; return t.filter(Boolean).forEach( ([t,e]) => { t.style.display = e } ), e } getChartSize() { let t = this.options.chart , e = t.width , i = t.height , s = this.getContainerBox() , o = s.height <= 1 || !this.renderTo.parentElement?.style.height && "100%" === this.renderTo.style.height; this.chartWidth = Math.max(0, e || s.width || 600), this.chartHeight = Math.max(0, a_(i, this.chartWidth) || (o ? 400 : s.height)), this.containerBox = s } temporaryDisplay(t) { let e = this.renderTo, i; if (t) for (; e?.style; ) e.hcOrigStyle && (aO(e, e.hcOrigStyle), delete e.hcOrigStyle), e.hcOrigDetached && (aw.body.removeChild(e), e.hcOrigDetached = !1), e = e.parentNode; else for (; e?.style && (aw.body.contains(e) || e.parentNode || (e.hcOrigDetached = !0, aw.body.appendChild(e)), ("none" === aF(e, "display", !1) || e.hcOricDetached) && (e.hcOrigStyle = { display: e.style.display, height: e.style.height, overflow: e.style.overflow }, i = { display: "block", overflow: "hidden" }, e !== this.renderTo && (i.height = 0), aO(e, i), e.offsetWidth || e.style.setProperty("display", "block", "important")), (e = e.parentNode) !== aw.body); ) ; } setClassName(t) { this.container.className = "highcharts-container " + (t || "") } getContainer() { let t, e = this.options, i = e.chart, s = "data-highcharts-chart", o = aQ(), r = this.renderTo, a = aZ(aP(r, s)); aG(a) && ak[a] && ak[a].hasRendered && ak[a].destroy(), aP(r, s, this.index), r.innerHTML = t6.emptyHTML, i.skipClone || r.offsetWidth || this.temporaryDisplay(), this.getChartSize(); let n = this.chartHeight , h = this.chartWidth; aO(r, { overflow: "hidden" }), this.styledMode || (t = az({ position: "relative", overflow: "hidden", width: h + "px", height: n + "px", textAlign: "left", lineHeight: "normal", zIndex: 0, "-webkit-tap-highlight-color": "rgba(0,0,0,0)", userSelect: "none", "touch-action": "manipulation", outline: "none", padding: "0px" }, i.style || {})); let l = aL("div", { id: o }, t, r); this.container = l, this.getChartSize(), h === this.chartWidth || (h = this.chartWidth, this.styledMode || aO(l, { width: aV(i.style?.width, h + "px") })), this.containerBox = this.getContainerBox(), this._cursor = l.style.cursor; let d = i.renderer || !aS ? eg.getRendererType(i.renderer) : iU; if (this.renderer = new d(l,h,n,void 0,i.forExport,e.exporting?.allowHTML,this.styledMode), ax(void 0, this), this.setClassName(i.className), this.styledMode) for (let t in e.defs) this.renderer.definition(e.defs[t]); else this.renderer.setStyle(i.style); this.renderer.chartIndex = this.index, aW(this, "afterGetContainer") } getMargins(t) { let {spacing: e, margin: i, titleOffset: s} = this; this.resetMargins(), s[0] && !aE(i[0]) && (this.plotTop = Math.max(this.plotTop, s[0] + e[0])), s[2] && !aE(i[2]) && (this.marginBottom = Math.max(this.marginBottom, s[2] + e[2])), this.legend?.display && this.legend.adjustMargins(i, e), aW(this, "getMargins"), t || this.getAxisMargins() } getAxisMargins() { let t = this , e = t.axisOffset = [0, 0, 0, 0] , i = t.colorAxis , s = t.margin , o = function(t) { t.forEach(function(t) { t.visible && t.getOffset() }) }; t.hasCartesianSeries ? o(t.axes) : i?.length && o(i), aM.forEach(function(i, o) { aE(s[o]) || (t[i] += e[o]) }), t.setChartSize() } getOptions() { return aI(this.userOptions, ay) } reflow(t) { let e = this , i = e.containerBox , s = e.getContainerBox(); delete e.pointer?.chartPosition, !e.isPrinting && !e.isResizing && i && s.width && ((s.width !== i.width || s.height !== i.height) && (V.clearTimeout(e.reflowTimeout), e.reflowTimeout = aJ(function() { e.container && e.setSize(void 0, void 0, !1) }, 100 * !!t)), e.containerBox = s) } setReflow() { let t = this , e = e => { t.options?.chart.reflow && t.hasLoaded && t.reflow(e) } ; if ("function" == typeof ResizeObserver) new ResizeObserver(e).observe(t.renderTo); else { let t = aA(aT, "resize", e); aA(this, "destroy", t) } } setSize(t, e, i) { let s = this , o = s.renderer; s.isResizing += 1, ax(i, s); let r = o.globalAnimation; s.oldChartHeight = s.chartHeight, s.oldChartWidth = s.chartWidth, void 0 !== t && (s.options.chart.width = t), void 0 !== e && (s.options.chart.height = e), s.getChartSize(); let {chartWidth: a, chartHeight: n, scrollablePixelsX: h=0, scrollablePixelsY: l=0} = s; (s.isDirtyBox || a !== s.oldChartWidth || n !== s.oldChartHeight) && (s.styledMode || (r ? af : aO)(s.container, { width: `${a + h}px`, height: `${n + l}px` }, r), s.setChartSize(!0), o.setSize(a, n, r), s.axes.forEach(function(t) { t.isDirty = !0, t.setScale() }), s.isDirtyLegend = !0, s.isDirtyBox = !0, s.layOutTitles(), s.getMargins(), s.redraw(r), s.oldChartHeight = void 0, aW(s, "resize"), setTimeout( () => { s && aW(s, "endResize") } , am(r).duration)), s.isResizing -= 1 } setChartSize(t) { let e, i, s, o, {chartHeight: r, chartWidth: a, inverted: n, spacing: h, renderer: l} = this, d = this.clipOffset, c = Math[n ? "floor" : "round"]; this.plotLeft = e = Math.round(this.plotLeft), this.plotTop = i = Math.round(this.plotTop), this.plotWidth = s = Math.max(0, Math.round(a - e - (this.marginRight ?? 0))), this.plotHeight = o = Math.max(0, Math.round(r - i - (this.marginBottom ?? 0))), this.plotSizeX = n ? o : s, this.plotSizeY = n ? s : o, this.spacingBox = l.spacingBox = { x: h[3], y: h[0], width: a - h[3] - h[1], height: r - h[0] - h[2] }, this.plotBox = l.plotBox = { x: e, y: i, width: s, height: o }, d && (this.clipBox = { x: c(d[3]), y: c(d[0]), width: c(this.plotSizeX - d[1] - d[3]), height: c(this.plotSizeY - d[0] - d[2]) }), t || (this.axes.forEach(function(t) { t.setAxisSize(), t.setAxisTranslation() }), l.alignElements()), aW(this, "afterSetChartSize", { skipAxes: t }) } resetMargins() { aW(this, "resetMargins"); let t = this , e = t.options.chart , i = e.plotBorderWidth || 0 , s = Math.round(i) / 2; ["margin", "spacing"].forEach(function(i) { let s = e[i] , o = aj(s) ? s : [s, s, s, s]; ["Top", "Right", "Bottom", "Left"].forEach(function(s, r) { t[i][r] = aV(e[i + s], o[r]) }) }), aM.forEach(function(e, i) { t[e] = aV(t.margin[i], t.spacing[i]) }), t.axisOffset = [0, 0, 0, 0], t.clipOffset = [s, s, s, s], t.plotBorderWidth = i } drawChartBox() { let t = this.options.chart, e = this.renderer, i = this.chartWidth, s = this.chartHeight, o = this.styledMode, r = this.plotBGImage, a = t.backgroundColor, n = t.plotBackgroundColor, h = t.plotBackgroundImage, l = this.plotLeft, d = this.plotTop, c = this.plotWidth, p = this.plotHeight, g = this.plotBox, u = this.clipRect, f = this.clipBox, m = this.chartBackground, x = this.plotBackground, y = this.plotBorder, b, v, k, w = "animate"; m || (this.chartBackground = m = e.rect().addClass("highcharts-background").add(), w = "attr"), o ? b = v = m.strokeWidth() : (v = (b = t.borderWidth || 0) + 8 * !!t.shadow, k = { fill: a || "none" }, (b || m["stroke-width"]) && (k.stroke = t.borderColor, k["stroke-width"] = b), m.attr(k).shadow(t.shadow)), m[w]({ x: v / 2, y: v / 2, width: i - v - b % 2, height: s - v - b % 2, r: t.borderRadius }), w = "animate", x || (w = "attr", this.plotBackground = x = e.rect().addClass("highcharts-plot-background").add()), x[w](g), !o && (x.attr({ fill: n || "none" }).shadow(t.plotShadow), h && (r ? (h !== r.attr("href") && r.attr("href", h), r.animate(g)) : this.plotBGImage = e.image(h, l, d, c, p).add())), u ? u.animate({ width: f.width, height: f.height }) : this.clipRect = e.clipRect(f), w = "animate", y || (w = "attr", this.plotBorder = y = e.rect().addClass("highcharts-plot-border").attr({ zIndex: 1 }).add()), o || y.attr({ stroke: t.plotBorderColor, "stroke-width": t.plotBorderWidth || 0, fill: "none" }), y[w](y.crisp(g, -y.strokeWidth())), this.isDirtyBox = !1, aW(this, "afterDrawChartBox") } propFromSeries() { let t, e, i, s = this, o = s.options.chart, r = s.options.series; ["inverted", "angular", "polar"].forEach(function(a) { for (e = aC[o.type], i = o[a] || e && e.prototype[a], t = r?.length; !i && t--; ) (e = aC[r[t].type]) && e.prototype[a] && (i = !0); s[a] = i }) } linkSeries(t) { let e = this , i = e.series; i.forEach(function(t) { t.linkedSeries.length = 0 }), i.forEach(function(t) { let {linkedTo: i} = t.options; if (aY(i)) { let s; (s = ":previous" === i ? e.series[t.index - 1] : e.get(i)) && s.linkedParent !== t && (s.linkedSeries.push(t), t.linkedParent = s, s.enabledDataSorting && t.setDataSortingOptions(), t.visible = aV(t.options.visible, s.options.visible, t.visible)) } }), aW(this, "afterLinkSeries", { isUpdating: t }) } renderSeries() { this.series.forEach(function(t) { t.translate(), t.render() }) } render() { let t = this.axes, e = this.colorAxis, i = this.renderer, s = this.options.chart.axisLayoutRuns || 2, o = t => { t.forEach(t => { t.visible && t.render() } ) } , r = 0, a = !0, n, h = 0; for (let e of (this.setTitle(), aW(this, "beforeMargins"), this.getStacks?.(), this.getMargins(!0), this.setChartSize(), t)) { let {options: t} = e , {labels: i} = t; if (this.hasCartesianSeries && e.horiz && e.visible && i.enabled && e.series.length && "colorAxis" !== e.coll && !this.polar) { r = t.tickLength, e.createGroups(); let s = new sf(e,0,"",!0) , o = s.createLabel("x", i); if (s.destroy(), o && aV(i.reserveSpace, !aG(t.crossing)) && (r = o.getBBox().height + i.distance + Math.max(t.offset || 0, 0)), r) { o?.destroy(); break } } } for (this.plotHeight = Math.max(this.plotHeight - r, 0); (a || n || s > 1) && h < s; ) { let e = this.plotWidth , i = this.plotHeight; for (let e of t) 0 === h ? e.setScale() : (e.horiz && a || !e.horiz && n) && e.setTickInterval(!0); 0 === h ? this.getAxisMargins() : this.getMargins(), a = e / this.plotWidth > (h ? 1 : 1.1), n = i / this.plotHeight > (h ? 1 : 1.05), h++ } this.drawChartBox(), this.hasCartesianSeries ? o(t) : e?.length && o(e), this.seriesGroup || (this.seriesGroup = i.g("series-group").attr({ zIndex: 3 }).shadow(this.options.chart.seriesGroupShadow).add()), this.renderSeries(), this.addCredits(), this.setResponsive && this.setResponsive(), this.hasRendered = !0 } addCredits(t) { let e = this , i = aU(!0, this.options.credits, t); i.enabled && !this.credits && (this.credits = this.renderer.text(i.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() { i.href && (aT.location.href = i.href) }).attr({ align: i.position.align, zIndex: 8 }), e.styledMode || this.credits.css(i.style), this.credits.add().align(i.position), this.credits.update = function(t) { e.credits = e.credits.destroy(), e.addCredits(t) } ) } destroy() { let t, e = this, i = e.axes, s = e.series, o = e.container, r = o?.parentNode; for (aW(e, "destroy"), e.renderer.forExport ? aB(ak, e) : ak[e.index] = void 0, w.chartCount--, e.renderTo.removeAttribute("data-highcharts-chart"), aq(e), t = i.length; t--; ) i[t] = i[t].destroy(); for (this.scroller?.destroy?.(), t = s.length; t--; ) s[t] = s[t].destroy(); ["title", "subtitle", "chartBackground", "plotBackground", "plotBGImage", "plotBorder", "seriesGroup", "clipRect", "credits", "pointer", "rangeSelector", "legend", "resetZoomButton", "tooltip", "renderer"].forEach(t => { e[t] = e[t]?.destroy?.() } ), o && (o.innerHTML = t6.emptyHTML, aq(o), r && aD(o)), a$(e, function(t, i) { delete e[i] }) } firstRender() { let t = this , e = t.options; t.getContainer(), t.resetMargins(), t.setChartSize(), t.propFromSeries(), t.createAxes(); let i = aX(e.series) ? e.series : []; e.series = [], i.forEach(function(e) { t.initSeries(e) }), t.linkSeries(), t.setSortedData(), aW(t, "beforeRender"), t.render(), t.pointer?.getChartPosition(), t.renderer.imgCount || t.hasLoaded || t.onload(), t.temporaryDisplay(!0) } onload() { this.callbacks.concat([this.callback]).forEach(function(t) { t && void 0 !== this.index && t.apply(this, [this]) }, this), aW(this, "load"), aW(this, "render"), aE(this.index) && this.setReflow(), this.warnIfA11yModuleNotLoaded(), this.hasLoaded = !0 } warnIfA11yModuleNotLoaded() { let {options: t, title: e} = this; !t || this.accessibility || (this.renderer.boxWrapper.attr({ role: "img", "aria-label": (e?.element.textContent || "").replace(/ this.transform({ reset: !0, trigger: "zoom" })) } pan(t, e) { let i = this , s = "object" == typeof e ? e : { enabled: e, type: "x" } , o = s.type , r = o && i[({ x: "xAxis", xy: "axes", y: "yAxis" })[o]].filter(t => t.options.panningEnabled && !t.options.isInternal) , a = i.options.chart; a?.panning && (a.panning = s), aW(this, "pan", { originalEvent: t }, () => { i.transform({ axes: r, event: t, to: { x: t.chartX - (i.mouseDownX || 0), y: t.chartY - (i.mouseDownY || 0) }, trigger: "pan" }), aO(i.container, { cursor: "move" }) } ) } transform(t) { let {axes: e=this.axes, event: i, from: s={}, reset: o, selection: r, to: a={}, trigger: n} = t, {inverted: h, time: l} = this, d = !1, c, p; for (let t of (this.hoverPoints?.forEach(t => t.setState()), e)) { let {horiz: e, len: g, minPointOffset: u=0, options: f, reversed: m} = t , x = e ? "width" : "height" , y = e ? "x" : "y" , b = aV(a[x], t.len) , v = aV(s[x], t.len) , k = 10 > Math.abs(b) ? 1 : b / v , w = (s[y] || 0) + v / 2 - t.pos , M = w - ((a[y] ?? t.pos) + b / 2 - t.pos) / k , S = m && !h || !m && h ? -1 : 1; if (!o && (w < 0 || w > t.len)) continue; let T = t.toValue(M, !0) + (r || t.isOrdinal ? 0 : u * S) , C = t.toValue(M + g / k, !0) - (r || t.isOrdinal ? 0 : u * S || 0) , A = t.allExtremes; if (T > C && ([T,C] = [C, T]), 1 === k && !o && "yAxis" === t.coll && !A) { for (let e of t.series) { let t = e.getExtremes(e.getProcessedData(!0).modified.getColumn("y") || [], !0); A ?? (A = { dataMin: Number.MAX_VALUE, dataMax: -Number.MAX_VALUE }), aG(t.dataMin) && aG(t.dataMax) && (A.dataMin = Math.min(t.dataMin, A.dataMin), A.dataMax = Math.max(t.dataMax, A.dataMax)) } t.allExtremes = A } let {dataMin: P, dataMax: L, min: O, max: E} = az(t.getExtremes(), A || {}) , I = l.parse(f.min) , D = l.parse(f.max) , B = P ?? I , N = L ?? D , z = C - T , R = t.categories ? 0 : Math.min(z, N - B) , W = B - R * (aE(I) ? 0 : f.minPadding) , H = N + R * (aE(D) ? 0 : f.maxPadding) , F = t.allowZoomOutside || 1 === k || "zoom" !== n && k > 1 , X = Math.min(I ?? W, W, F ? O : W) , G = Math.max(D ?? H, H, F ? E : H); (!t.isOrdinal || t.options.overscroll || 1 !== k || o) && (T < X && (T = X, k >= 1 && (C = T + z)), C > G && (C = G, k >= 1 && (T = C - z)), (o || t.series.length && (T !== O || C !== E) && T >= X && C <= G) && (r ? r[t.coll].push({ axis: t, min: T, max: C }) : (t.isPanning = "zoom" !== n, t.isPanning && (p = !0), t.setExtremes(o ? void 0 : T, o ? void 0 : C, !1, !1, { move: M, trigger: n, scale: k }), !o && (T > X || C < G) && "mousewheel" !== n && (c = !0)), d = !0), i && (this[e ? "mouseDownX" : "mouseDownY"] = i[e ? "chartX" : "chartY"])) } return d && (r ? aW(this, "selection", r, () => { delete t.selection, t.trigger = "zoom", this.transform(t) } ) : (!c || p || this.resetZoomButton ? !c && this.resetZoomButton && (this.resetZoomButton = this.resetZoomButton.destroy()) : this.showResetZoom(), this.redraw("zoom" === n && (this.options.chart.animation ?? this.pointCount < 100)))), d } } az(a0.prototype, { callbacks: [], collectionsWithInit: { xAxis: [a0.prototype.addAxis, [!0]], yAxis: [a0.prototype.addAxis, [!1]], series: [a0.prototype.addSeries] }, collectionsWithUpdate: ["xAxis", "yAxis", "series"], propsRequireDirtyBox: ["backgroundColor", "borderColor", "borderWidth", "borderRadius", "plotBackgroundColor", "plotBackgroundImage", "plotBorderColor", "plotBorderWidth", "plotShadow", "shadow"], propsRequireReflow: ["margin", "marginTop", "marginRight", "marginBottom", "marginLeft", "spacing", "spacingTop", "spacingRight", "spacingBottom", "spacingLeft"], propsRequireUpdateSeries: ["chart.inverted", "chart.polar", "chart.ignoreHiddenSeries", "chart.type", "colors", "plotOptions", "time", "tooltip"] }); let {stop: a1} = tU , {composed: a2} = w , {addEvent: a3, createElement: a5, css: a6, defined: a9, erase: a4, merge: a8, pushUnique: a7} = V; function nt() { let t = this.scrollablePlotArea; (this.scrollablePixelsX || this.scrollablePixelsY) && !t && (this.scrollablePlotArea = t = new ni(this)), t?.applyFixed() } function ne() { this.chart.scrollablePlotArea && (this.chart.scrollablePlotArea.isDirty = !0) } class ni { static compose(t, e, i) { a7(a2, this.compose) && (a3(t, "afterInit", ne), a3(e, "afterSetChartSize", t => this.afterSetSize(t.target, t)), a3(e, "render", nt), a3(i, "show", ne)) } static afterSetSize(t, e) { let i, s, o, {minWidth: r, minHeight: a} = t.options.chart.scrollablePlotArea || {}, {clipBox: n, plotBox: h, inverted: l, renderer: d} = t; if (!d.forExport && (r ? (t.scrollablePixelsX = i = Math.max(0, r - t.chartWidth), i && (t.scrollablePlotBox = a8(t.plotBox), h.width = t.plotWidth += i, n[l ? "height" : "width"] += i, o = !0)) : a && (t.scrollablePixelsY = s = Math.max(0, a - t.chartHeight), a9(s) && (t.scrollablePlotBox = a8(t.plotBox), h.height = t.plotHeight += s, n[l ? "width" : "height"] += s, o = !1)), a9(o) && !e.skipAxes)) for (let e of t.axes) (e.horiz === o || t.hasParallelCoordinates && "yAxis" === e.coll) && (e.setAxisSize(), e.setAxisTranslation()) } constructor(t) { let e, i = t.options.chart, s = eg.getRendererType(), o = i.scrollablePlotArea || {}, r = this.moveFixedElements.bind(this), a = { WebkitOverflowScrolling: "touch", overflowX: "hidden", overflowY: "hidden" }; t.scrollablePixelsX && (a.overflowX = "auto"), t.scrollablePixelsY && (a.overflowY = "auto"), this.chart = t; let n = this.parentDiv = a5("div", { className: "highcharts-scrolling-parent" }, { position: "relative" }, t.renderTo) , h = this.scrollingContainer = a5("div", { className: "highcharts-scrolling" }, a, n) , l = this.innerContainer = a5("div", { className: "highcharts-inner-container" }, void 0, h) , d = this.fixedDiv = a5("div", { className: "highcharts-fixed" }, { position: "absolute", overflow: "hidden", pointerEvents: "none", zIndex: (i.style?.zIndex || 0) + 2, top: 0 }, void 0, !0) , c = this.fixedRenderer = new s(d,t.chartWidth,t.chartHeight,i.style); this.mask = c.path().attr({ fill: i.backgroundColor || "#fff", "fill-opacity": o.opacity ?? .85, zIndex: -1 }).addClass("highcharts-scrollable-mask").add(), h.parentNode.insertBefore(d, h), a6(t.renderTo, { overflow: "visible" }), a3(t, "afterShowResetZoom", r), a3(t, "afterApplyDrilldown", r), a3(t, "afterLayOutTitles", r), a3(h, "scroll", () => { let {pointer: i, hoverPoint: s} = t; i && (delete i.chartPosition, s && (e = s), i.runPointActions(void 0, e, !0)) } ), l.appendChild(t.container) } applyFixed() { let {chart: t, fixedRenderer: e, isDirty: i, scrollingContainer: s} = this , {axisOffset: o, chartWidth: r, chartHeight: a, container: n, plotHeight: h, plotLeft: l, plotTop: d, plotWidth: c, scrollablePixelsX: p=0, scrollablePixelsY: g=0} = t , {scrollPositionX: u=0, scrollPositionY: f=0} = t.options.chart.scrollablePlotArea || {} , m = r + p , x = a + g; e.setSize(r, a), (i ?? !0) && (this.isDirty = !1, this.moveFixedElements()), a1(t.container), a6(n, { width: `${m}px`, height: `${x}px` }), t.renderer.boxWrapper.attr({ width: m, height: x, viewBox: [0, 0, m, x].join(" ") }), t.chartBackground?.attr({ width: m, height: x }), a6(s, { width: `${r}px`, height: `${a}px` }), a9(i) || (s.scrollLeft = p * u, s.scrollTop = g * f); let y = d - o[0] - 1 , b = l - o[3] - 1 , v = d + h + o[2] + 1 , k = l + c + o[1] + 1 , w = l + c - p , M = d + h - g , S = [["M", 0, 0]]; p ? S = [["M", 0, y], ["L", l - 1, y], ["L", l - 1, v], ["L", 0, v], ["Z"], ["M", w, y], ["L", r, y], ["L", r, v], ["L", w, v], ["Z"]] : g && (S = [["M", b, 0], ["L", b, d - 1], ["L", k, d - 1], ["L", k, 0], ["Z"], ["M", b, M], ["L", b, a], ["L", k, a], ["L", k, M], ["Z"]]), "adjustHeight" !== t.redrawTrigger && this.mask.attr({ d: S }) } moveFixedElements() { let t, {container: e, inverted: i, scrollablePixelsX: s, scrollablePixelsY: o} = this.chart, r = this.fixedRenderer, a = ni.fixedSelectors; if (s && !i ? t = ".highcharts-yaxis" : s && i ? t = ".highcharts-xaxis" : o && !i ? t = ".highcharts-xaxis" : o && i && (t = ".highcharts-yaxis"), t && !(this.chart.hasParallelCoordinates && ".highcharts-yaxis" === t)) for (let e of [`${t}:not(.highcharts-radial-axis)`, `${t}-labels:not(.highcharts-radial-axis-labels)`]) a7(a, e); else for (let t of [".highcharts-xaxis", ".highcharts-yaxis"]) for (let e of [`${t}:not(.highcharts-radial-axis)`, `${t}-labels:not(.highcharts-radial-axis-labels)`]) a4(a, e); for (let t of a) [].forEach.call(e.querySelectorAll(t), t => { (t.namespaceURI === r.SVG_NS ? r.box : r.box.parentNode).appendChild(t), t.style.pointerEvents = "auto" } ) } } ni.fixedSelectors = [".highcharts-breadcrumbs-group", ".highcharts-contextbutton", ".highcharts-caption", ".highcharts-credits", ".highcharts-drillup-button", ".highcharts-legend", ".highcharts-legend-checkbox", ".highcharts-navigator-series", ".highcharts-navigator-xaxis", ".highcharts-navigator-yaxis", ".highcharts-navigator", ".highcharts-range-selector-group", ".highcharts-reset-zoom", ".highcharts-scrollbar", ".highcharts-subtitle", ".highcharts-title"]; let {format: ns} = ep , {series: no} = rk , {destroyObjectProperties: nr, fireEvent: na, getAlignFactor: nn, isNumber: nh, pick: nl} = V , nd = class { constructor(t, e, i, s, o) { let r = t.chart.inverted , a = t.reversed; this.axis = t; let n = this.isNegative = !!i != !!a; this.options = e = e || {}, this.x = s, this.total = null, this.cumulative = null, this.points = {}, this.hasValidPoints = !1, this.stack = o, this.leftCliff = 0, this.rightCliff = 0, this.alignOptions = { align: e.align || (r ? n ? "left" : "right" : "center"), verticalAlign: e.verticalAlign || (r ? "middle" : n ? "bottom" : "top"), y: e.y, x: e.x }, this.textAlign = e.textAlign || (r ? n ? "right" : "left" : "center") } destroy() { nr(this, this.axis) } render(t) { let e = this.axis.chart , i = this.options , s = i.format , o = s ? ns(s, this, e) : i.formatter.call(this); if (this.label) this.label.attr({ text: o, visibility: "hidden" }); else { this.label = e.renderer.label(o, null, void 0, i.shape, void 0, void 0, i.useHTML, !1, "stack-labels"); let s = { r: i.borderRadius || 0, text: o, padding: nl(i.padding, 5), visibility: "hidden" }; e.styledMode || (s.fill = i.backgroundColor, s.stroke = i.borderColor, s["stroke-width"] = i.borderWidth, this.label.css(i.style || {})), this.label.attr(s), this.label.added || this.label.add(t) } this.label.labelrank = e.plotSizeY, na(this, "afterRender") } setOffset(t, e, i, s, o, r) { let {alignOptions: a, axis: n, label: h, options: l, textAlign: d} = this , c = n.chart , p = this.getStackBox({ xOffset: t, width: e, boxBottom: i, boxTop: s, defaultX: o, xAxis: r }) , {verticalAlign: g} = a; if (h && p) { let t = h.getBBox(void 0, 0), e = h.padding, i = "justify" === nl(l.overflow, "justify"), s; a.x = l.x || 0, a.y = l.y || 0; let {x: o, y: r} = this.adjustStackPosition({ labelBox: t, verticalAlign: g, textAlign: d }); p.x -= o, p.y -= r, h.align(a, !1, p), (s = c.isInsidePlot(h.alignAttr.x + a.x + o, h.alignAttr.y + a.y + r)) || (i = !1), i && no.prototype.justifyDataLabel.call(n, h, a, h.alignAttr, t, p), h.attr({ x: h.alignAttr.x, y: h.alignAttr.y, rotation: l.rotation, rotationOriginX: t.width * nn(l.textAlign || "center"), rotationOriginY: t.height / 2 }), nl(!i && l.crop, !0) && (s = nh(h.x) && nh(h.y) && c.isInsidePlot(h.x - e + (h.width || 0), h.y) && c.isInsidePlot(h.x + e, h.y)), h[s ? "show" : "hide"]() } na(this, "afterSetOffset", { xOffset: t, width: e }) } adjustStackPosition({labelBox: t, verticalAlign: e, textAlign: i}) { return { x: t.width / 2 + t.width / 2 * (2 * nn(i) - 1), y: t.height / 2 * 2 * (1 - nn(e)) } } getStackBox(t) { let e = this.axis , i = e.chart , {boxTop: s, defaultX: o, xOffset: r, width: a, boxBottom: n} = t , h = e.stacking.usePercentage ? 100 : nl(s, this.total, 0) , l = e.toPixels(h) , d = t.xAxis || i.xAxis[0] , c = nl(o, d.translate(this.x)) + r , p = Math.abs(l - e.toPixels(n || nh(e.min) && e.logarithmic && e.logarithmic.lin2log(e.min) || 0)) , g = i.inverted , u = this.isNegative; return g ? { x: (u ? l : l - p) - i.plotLeft, y: d.height - c - a + d.top - i.plotTop, width: p, height: a } : { x: c + d.transB - i.plotLeft, y: (u ? l - p : l) - i.plotTop, width: a, height: p } } } , {getDeferredAnimation: nc} = tU , {series: {prototype: np}} = rk , {addEvent: ng, correctFloat: nu, defined: nf, destroyObjectProperties: nm, fireEvent: nx, isNumber: ny, objectEach: nb, pick: nv} = V; function nk() { let t = this.inverted; this.axes.forEach(t => { t.stacking?.stacks && t.hasVisibleSeries && (t.stacking.oldStacks = t.stacking.stacks) } ), this.series.forEach(e => { let i = e.xAxis?.options || {}; e.options.stacking && e.reserveSpace() && (e.stackKey = [e.type, nv(e.options.stack, ""), t ? i.top : i.left, t ? i.height : i.width].join(",")) } ) } function nw() { let t = this.stacking; if (t) { let e = t.stacks; nb(e, (t, i) => { nm(t), delete e[i] } ), t.stackTotalGroup?.destroy() } } function nM() { this.stacking || (this.stacking = new nL(this)) } function nS(t, e, i, s) { return !nf(t) || t.x !== e || s && t.stackKey !== s ? t = { x: e, index: 0, key: s, stackKey: s } : t.index++, t.key = [i, e, t.index].join(","), t } function nT() { let t, e = this, i = e.yAxis, s = e.stackKey || "", o = i.stacking.stacks, r = e.getColumn("x", !0), a = e.options.stacking, n = e[a + "Stacker"]; n && [s, "-" + s].forEach(i => { let s = r.length, a, h, l; for (; s--; ) a = r[s], t = e.getStackIndicator(t, a, e.index, i), h = o[i]?.[a], (l = h?.points[t.key || ""]) && n.call(e, l, h, s) } ) } function nC(t, e, i) { let s = e.total ? 100 / e.total : 0; t[0] = nu(t[0] * s), t[1] = nu(t[1] * s), this.stackedYData[i] = t[1] } function nA(t) { (this.is("column") || this.is("columnrange")) && (this.options.centerInCategory && this.chart.series.length > 1 ? np.setStackedPoints.call(this, t, "group") : t.stacking.resetStacks()) } function nP(t, e) { let i, s, o, r, a, n, h, l = e || this.options.stacking; if (!l || !this.reserveSpace() || (({ group: "xAxis" })[l] || "yAxis") !== t.coll) return; let d = this.getColumn("x", !0) , c = this.getColumn(this.pointValKey || "y", !0) , p = [] , g = c.length , u = this.options , f = u.threshold || 0 , m = u.startFromThreshold ? f : 0 , x = u.stack , y = e ? `${this.type},${l}` : this.stackKey || "" , b = "-" + y , v = this.negStacks , k = t.stacking , w = k.stacks , M = k.oldStacks; for (k.stacksTouched += 1, h = 0; h < g; h++) { let e = d[h] || 0 , g = c[h] , u = ny(g) && g || 0; n = (i = this.getStackIndicator(i, e, this.index)).key || "", w[a = (s = v && u < (m ? 0 : f)) ? b : y] || (w[a] = {}), w[a][e] || (M[a]?.[e] ? (w[a][e] = M[a][e], w[a][e].total = null) : w[a][e] = new nd(t,t.options.stackLabels,!!s,e,x)), o = w[a][e], null !== g ? (o.points[n] = o.points[this.index] = [nv(o.cumulative, m)], nf(o.cumulative) || (o.base = n), o.touched = k.stacksTouched, i.index > 0 && !1 === this.singleStacks && (o.points[n][0] = o.points[this.index + "," + e + ",0"][0])) : (delete o.points[n], delete o.points[this.index]); let S = o.total || 0; "percent" === l ? (r = s ? y : b, S = v && w[r]?.[e] ? (r = w[r][e]).total = Math.max(r.total || 0, S) + Math.abs(u) : nu(S + Math.abs(u))) : "group" === l ? ny(g) && S++ : S = nu(S + u), "group" === l ? o.cumulative = (S || 1) - 1 : o.cumulative = nu(nv(o.cumulative, m) + u), o.total = S, null !== g && (o.points[n].push(o.cumulative), p[h] = o.cumulative, o.hasValidPoints = !0) } "percent" === l && (k.usePercentage = !0), "group" !== l && (this.stackedYData = p), k.oldStacks = {} } class nL { constructor(t) { this.oldStacks = {}, this.stacks = {}, this.stacksTouched = 0, this.axis = t } buildStacks() { let t, e, i = this.axis, s = i.series, o = "xAxis" === i.coll, r = i.options.reversedStacks, a = s.length; for (this.resetStacks(), this.usePercentage = !1, e = a; e--; ) t = s[r ? e : a - e - 1], o && t.setGroupedPoints(i), t.setStackedPoints(i); if (!o) for (e = 0; e < a; e++) s[e].modifyStacks(); nx(i, "afterBuildStacks") } cleanStacks() { this.oldStacks && (this.stacks = this.oldStacks, nb(this.stacks, t => { nb(t, t => { t.cumulative = t.total } ) } )) } resetStacks() { nb(this.stacks, t => { nb(t, (e, i) => { ny(e.touched) && e.touched < this.stacksTouched ? (e.destroy(), delete t[i]) : (e.total = null, e.cumulative = null) } ) } ) } renderStackTotals() { let t = this.axis , e = t.chart , i = e.renderer , s = this.stacks , o = nc(e, t.options.stackLabels?.animation || !1) , r = this.stackTotalGroup = this.stackTotalGroup || i.g("stack-labels").attr({ zIndex: 6, opacity: 0 }).add(); r.translate(e.plotLeft, e.plotTop), nb(s, t => { nb(t, t => { t.render(r) } ) } ), r.animate({ opacity: 1 }, o) } } (g || (g = {})).compose = function(t, e, i) { let s = e.prototype , o = i.prototype; s.getStacks || (ng(t, "init", nM), ng(t, "destroy", nw), s.getStacks = nk, o.getStackIndicator = nS, o.modifyStacks = nT, o.percentStacker = nC, o.setGroupedPoints = nA, o.setStackedPoints = nP) } ; let nO = g , {defined: nE, merge: nI, isObject: nD} = V; class nB extends r1 { drawGraph() { let t = this.options , e = (this.gappedPath || this.getGraphPath).call(this) , i = this.chart.styledMode; [this, ...this.zones].forEach( (s, o) => { let r, a = s.graph, n = a ? "animate" : "attr", h = s.dashStyle || t.dashStyle; a ? (a.endX = this.preventGraphAnimation ? null : e.xMap, a.animate({ d: e })) : e.length && (s.graph = a = this.chart.renderer.path(e).addClass("highcharts-graph" + (o ? ` highcharts-zone-graph-${o - 1} ` : " ") + (o && s.className || "")).attr({ zIndex: 1 }).add(this.group)), a && !i && (r = { stroke: !o && t.lineColor || s.color || this.color || "#cccccc", "stroke-width": t.lineWidth || 0, fill: this.fillGraph && this.color || "none" }, h ? r.dashstyle = h : "square" !== t.linecap && (r["stroke-linecap"] = r["stroke-linejoin"] = "round"), a[n](r).shadow(t.shadow && nI({ filterUnits: "userSpaceOnUse" }, nD(t.shadow) ? t.shadow : {}))), a && (a.startX = e.xMap, a.isArea = e.isArea) } ) } getGraphPath(t, e, i) { let s = this, o = s.options, r = [], a = [], n, h = o.step, l = (t = t || s.points).reversed; return l && t.reverse(), (h = ({ right: 1, center: 2 })[h] || h && 3) && l && (h = 4 - h), (t = this.getValidPoints(t, !1, o.nullInteraction || !(o.connectNulls && !e && !i))).forEach(function(l, d) { let c, p = l.plotX, g = l.plotY, u = t[d - 1], f = l.isNull || "number" != typeof g; (l.leftCliff || u?.rightCliff) && !i && (n = !0), f && !nE(e) && d > 0 ? n = !o.connectNulls : f && !e ? n = !0 : (0 === d || n ? c = [["M", l.plotX, l.plotY]] : s.getPointSpline ? c = [s.getPointSpline(t, l, d)] : h ? (c = 1 === h ? [["L", u.plotX, g]] : 2 === h ? [["L", (u.plotX + p) / 2, u.plotY], ["L", (u.plotX + p) / 2, g]] : [["L", p, u.plotY]]).push(["L", p, g]) : c = [["L", p, g]], a.push(l.x), h && (a.push(l.x), 2 === h && a.push(l.x)), r.push.apply(r, c), n = !1) }), r.xMap = a, s.graphPath = r, r } } nB.defaultOptions = nI(r1.defaultOptions, { legendSymbol: "lineMarker" }), rk.registerSeriesType("line", nB); let {seriesTypes: {line: nN}} = rk , {extend: nz, merge: nR, objectEach: nW, pick: nH} = V; class nF extends nN { drawGraph() { this.areaPath = [], super.drawGraph.apply(this); let {areaPath: t, options: e} = this; [this, ...this.zones].forEach( (i, s) => { let o = {} , r = i.fillColor || e.fillColor , a = i.area , n = a ? "animate" : "attr"; a ? (a.endX = this.preventGraphAnimation ? null : t.xMap, a.animate({ d: t })) : (o.zIndex = 0, (a = i.area = this.chart.renderer.path(t).addClass("highcharts-area" + (s ? ` highcharts-zone-area-${s - 1} ` : " ") + (s && i.className || "")).add(this.group)).isArea = !0), this.chart.styledMode || (o.fill = r || i.color || this.color, o["fill-opacity"] = r ? 1 : e.fillOpacity ?? .75, a.css({ pointerEvents: this.stickyTracking ? "none" : "auto" })), a[n](o), a.startX = t.xMap, a.shiftUnit = e.step ? 2 : 1 } ) } getGraphPath(t) { let e, i, s, o = nN.prototype.getGraphPath, r = this.options, a = r.stacking, n = this.yAxis, h = [], l = [], d = this.index, c = n.stacking.stacks[this.stackKey], p = r.threshold, g = Math.round(n.getThreshold(r.threshold)), u = nH(r.connectNulls, "percent" === a), f = function(i, s, o) { let r = t[i], u = a && c[r.x].points[d], f = r[o + "Null"] || 0, m = r[o + "Cliff"] || 0, x, y, b = !0; m || f ? (x = (f ? u[0] : u[1]) + m, y = u[0] + m, b = !!f) : !a && t[s] && t[s].isNull && (x = y = p), void 0 !== x && (l.push({ plotX: e, plotY: null === x ? g : n.getThreshold(x), isNull: b, isCliff: !0 }), h.push({ plotX: e, plotY: null === y ? g : n.getThreshold(y), doCurve: !1 })) }; t = t || this.points, a && (t = this.getStackPoints(t)); for (let o = 0, r = t.length; o < r; ++o) a || (t[o].leftCliff = t[o].rightCliff = t[o].leftNull = t[o].rightNull = void 0), i = t[o].isNull, e = nH(t[o].rectPlotX, t[o].plotX), s = a ? nH(t[o].yBottom, g) : g, i && !u || (u || f(o, o - 1, "left"), i && !a && u || (l.push(t[o]), h.push({ x: o, plotX: e, plotY: s })), u || f(o, o + 1, "right")); let m = o.call(this, l, !0, !0); h.reversed = !0; let x = o.call(this, h, !0, !0) , y = x[0]; y && "M" === y[0] && (x[0] = ["L", y[1], y[2]]); let b = m.concat(x); b.length && b.push(["Z"]); let v = o.call(this, l, !1, u); return this.chart.series.length > 1 && a && l.some(t => t.isCliff) && (b.hasStackedCliffs = v.hasStackedCliffs = !0), b.xMap = m.xMap, this.areaPath = b, v } getStackPoints(t) { let e = this , i = [] , s = [] , o = this.xAxis , r = this.yAxis , a = r.stacking.stacks[this.stackKey] , n = {} , h = r.series , l = h.length , d = r.options.reversedStacks ? 1 : -1 , c = h.indexOf(e); if (t = t || this.points, this.options.stacking) { for (let e = 0; e < t.length; e++) t[e].leftNull = t[e].rightNull = void 0, n[t[e].x] = t[e]; nW(a, function(t, e) { null !== t.total && s.push(e) }), s.sort(function(t, e) { return t - e }); let p = h.map(t => t.visible); s.forEach(function(t, g) { let u = 0, f, m; if (n[t] && !n[t].isNull) i.push(n[t]), [-1, 1].forEach(function(i) { let o = 1 === i ? "rightNull" : "leftNull" , r = a[s[g + i]] , u = 0; if (r) { let i = c; for (; i >= 0 && i < l; ) { let s = h[i].index; !(f = r.points[s]) && (s === e.index ? n[t][o] = !0 : p[i] && (m = a[t].points[s]) && (u -= m[1] - m[0])), i += d } } n[t][1 === i ? "rightCliff" : "leftCliff"] = u }); else { let e = c; for (; e >= 0 && e < l; ) { let i = h[e].index; if (f = a[t].points[i]) { u = f[1]; break } e += d } u = nH(u, 0), u = r.translate(u, 0, 1, 0, 1), i.push({ isNull: !0, plotX: o.translate(t, 0, 0, 0, 1), x: t, plotY: u, yBottom: u }) } }) } return i } } nF.defaultOptions = nR(nN.defaultOptions, { threshold: 0, legendSymbol: "areaMarker" }), nz(nF.prototype, { singleStacks: !1 }), rk.registerSeriesType("area", nF); let {line: nX} = rk.seriesTypes , {merge: nG, pick: nj} = V; class nY extends nX { getPointSpline(t, e, i) { let s, o, r, a, n = e.plotX || 0, h = e.plotY || 0, l = t[i - 1], d = t[i + 1]; function c(t) { return t && !t.isNull && !1 !== t.doCurve && !e.isCliff } if (c(l) && c(d)) { let t = l.plotX || 0 , i = l.plotY || 0 , c = d.plotX || 0 , p = d.plotY || 0 , g = 0; s = (1.5 * n + t) / 2.5, o = (1.5 * h + i) / 2.5, r = (1.5 * n + c) / 2.5, a = (1.5 * h + p) / 2.5, r !== s && (g = (a - o) * (r - n) / (r - s) + h - a), o += g, a += g, o > i && o > h ? (o = Math.max(i, h), a = 2 * h - o) : o < i && o < h && (o = Math.min(i, h), a = 2 * h - o), a > p && a > h ? (a = Math.max(p, h), o = 2 * h - a) : a < p && a < h && (a = Math.min(p, h), o = 2 * h - a), e.rightContX = r, e.rightContY = a, e.controlPoints = { low: [s, o], high: [r, a] } } let p = ["C", nj(l.rightContX, l.plotX, 0), nj(l.rightContY, l.plotY, 0), nj(s, n, 0), nj(o, h, 0), n, h]; return l.rightContX = l.rightContY = void 0, p } } nY.defaultOptions = nG(nX.defaultOptions), rk.registerSeriesType("spline", nY); let nU = nY , {area: n$, area: {prototype: nV}} = rk.seriesTypes , {extend: nZ, merge: n_} = V; class nq extends nU { } nq.defaultOptions = n_(nU.defaultOptions, n$.defaultOptions), nZ(nq.prototype, { getGraphPath: nV.getGraphPath, getStackPoints: nV.getStackPoints, drawGraph: nV.drawGraph }), rk.registerSeriesType("areaspline", nq); let {animObject: nK} = tU , {parse: nJ} = tL , {noop: nQ} = w , {clamp: n0, crisp: n1, defined: n2, extend: n3, fireEvent: n5, isArray: n6, isNumber: n9, merge: n4, pick: n8, objectEach: n7} = V; class ht extends r1 { animate(t) { let e, i, s = this, o = this.yAxis, r = o.pos, a = o.reversed, n = s.options, {clipOffset: h, inverted: l} = this.chart, d = {}, c = l ? "translateX" : "translateY"; t && h ? (d.scaleY = .001, i = n0(o.toPixels(n.threshold || 0), r, r + o.len), l ? d.translateX = (i += a ? -Math.floor(h[0]) : Math.ceil(h[2])) - o.len : d.translateY = i += a ? Math.ceil(h[0]) : -Math.floor(h[2]), s.clipBox && s.setClip(), s.group.attr(d)) : (e = Number(s.group.attr(c)), s.group.animate({ scaleY: 1 }, n3(nK(s.options.animation), { step: function(t, i) { s.group && (d[c] = e + i.pos * (r - e), s.group.attr(d)) } }))) } init(t, e) { super.init.apply(this, arguments); let i = this; (t = i.chart).hasRendered && t.series.forEach(function(t) { t.type === i.type && (t.isDirty = !0) }) } getColumnMetrics() { let t = this, e = t.options, i = t.xAxis, s = t.yAxis, o = i.options.reversedStacks, r = i.reversed && !o || !i.reversed && o, a = {}, n, h = 0; !1 === e.grouping ? h = 1 : t.chart.series.forEach(function(e) { let i, o = e.yAxis, r = e.options; e.type === t.type && e.reserveSpace() && s.len === o.len && s.pos === o.pos && (r.stacking && "group" !== r.stacking ? (void 0 === a[n = e.stackKey] && (a[n] = h++), i = a[n]) : !1 !== r.grouping && (i = h++), e.columnIndex = i) }); let l = Math.min(Math.abs(i.transA) * (!i.brokenAxis?.hasBreaks && i.ordinal?.slope || e.pointRange || i.closestPointRange || i.tickInterval || 1), i.len) , d = l * e.groupPadding , c = (l - 2 * d) / (h || 1) , p = Math.min(e.maxPointWidth || i.len, n8(e.pointWidth, c * (1 - 2 * e.pointPadding))) , g = (t.columnIndex || 0) + +!!r; return t.columnMetrics = { width: p, offset: (c - p) / 2 + (d + g * c - l / 2) * (r ? -1 : 1), paddedWidth: c, columnCount: h }, t.columnMetrics } crispCol(t, e, i, s) { let o = this.borderWidth , r = this.chart.inverted; return s = n1(e + s, o, r) - (e = n1(e, o, r)), this.options.crisp && (i = n1(t + i, o) - (t = n1(t, o))), { x: t, y: e, width: i, height: s } } adjustForMissingColumns(t, e, i, s) { if (!i.isNull && s.columnCount > 1) { let o = this.xAxis.series.filter(t => t.visible).map(t => t.index) , r = 0 , a = 0; n7(this.xAxis.stacking?.stacks, t => { let e = "number" == typeof i.x ? t[i.x.toString()]?.points : void 0 , s = e?.[this.index] , n = {}; if (e && n6(s)) { let t = this.index , i = Object.keys(e).filter(t => !t.match(",") && e[t] && e[t].length > 1).map(parseFloat).filter(t => -1 !== o.indexOf(t)).filter(e => { let i = this.chart.series[e].options , s = i.stacking && i.stack; if (n2(s)) { if (n9(n[s])) return t === e && (t = n[s]), !1; n[s] = e } return !0 } ).sort( (t, e) => e - t); r = i.indexOf(t), a = i.length } } ), r = this.xAxis.reversed ? a - 1 - r : r; let n = (a - 1) * s.paddedWidth + e; t = (i.plotX || 0) + n / 2 - e - r * s.paddedWidth } return t } translate() { let t = this , e = t.chart , i = t.options , s = t.dense = t.closestPointRange * t.xAxis.transA < 2 , o = t.borderWidth = n8(i.borderWidth, +!s) , r = t.xAxis , a = t.yAxis , n = i.threshold , h = n8(i.minPointLength, 5) , l = t.getColumnMetrics() , d = l.width , c = t.pointXOffset = l.offset , p = t.dataMin , g = t.dataMax , u = t.translatedThreshold = a.getThreshold(n) , f = t.barW = Math.max(d, 1 + 2 * o); i.pointPadding && i.crisp && (f = Math.ceil(f)), r1.prototype.translate.apply(t), t.points.forEach(function(s) { let o = n8(s.yBottom, u), m = 999 + Math.abs(o), x = s.plotX || 0, y = n0(s.plotY, -m, a.len + m), b, v = Math.min(y, o), k = Math.max(y, o) - v, w = d, M = x + c, S = f; h && Math.abs(k) < h && (k = h, b = !a.reversed && !s.negative || a.reversed && s.negative, n9(n) && n9(g) && s.y === n && g <= n && (a.min || 0) < n && (p !== g || (a.max || 0) <= n) && (b = !b, s.negative = !s.negative), v = Math.abs(v - u) > h ? o - h : u - (b ? h : 0)), n2(s.options.pointWidth) && (M -= Math.round(((w = S = Math.ceil(s.options.pointWidth)) - d) / 2)), i.centerInCategory && (M = t.adjustForMissingColumns(M, w, s, l)), s.barX = M, s.pointWidth = w, s.tooltipPos = e.inverted ? [n0(a.len + a.pos - e.plotLeft - y, a.pos - e.plotLeft, a.len + a.pos - e.plotLeft), r.len + r.pos - e.plotTop - M - S / 2, k] : [r.left - e.plotLeft + M + S / 2, n0(y + a.pos - e.plotTop, a.pos - e.plotTop, a.len + a.pos - e.plotTop), k], s.shapeType = t.pointClass.prototype.shapeType || "roundedRect", s.shapeArgs = t.crispCol(M, v, S, s.isNull ? 0 : k) }), n5(this, "afterColumnTranslate") } drawGraph() { this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data") } pointAttribs(t, e) { let i = this.options, s = this.pointAttrToOptions || {}, o = s.stroke || "borderColor", r = s["stroke-width"] || "borderWidth", a, n, h, l = t && t.color || this.color, d = t && t[o] || i[o] || l, c = t && t.options.dashStyle || i.dashStyle, p = t && t[r] || i[r] || this[r] || 0, g = t?.isNull && i.nullInteraction ? 0 : t?.opacity ?? i.opacity ?? 1; t && this.zones.length && (n = t.getZone(), l = t.options.color || n && (n.color || t.nonZonedColor) || this.color, n && (d = n.borderColor || d, c = n.dashStyle || c, p = n.borderWidth || p)), e && t && (h = (a = n4(i.states[e], t.options.states && t.options.states[e] || {})).brightness, l = a.color || void 0 !== h && nJ(l).brighten(a.brightness).get() || l, d = a[o] || d, p = a[r] || p, c = a.dashStyle || c, g = n8(a.opacity, g)); let u = { fill: l, stroke: d, "stroke-width": p, opacity: g }; return c && (u.dashstyle = c), u } drawPoints(t=this.points) { let e, i = this, s = this.chart, o = i.options, r = o.nullInteraction, a = s.renderer, n = o.animationLimit || 250; t.forEach(function(t) { let h = t.plotY , l = t.graphic , d = !!l , c = l && s.pointCount < n ? "animate" : "attr"; n9(h) && (null !== t.y || r) ? (e = t.shapeArgs, l && t.hasNewShapeType() && (l = l.destroy()), i.enabledDataSorting && (t.startXPos = i.xAxis.reversed ? -(e && e.width || 0) : i.xAxis.width), !l && (t.graphic = l = a[t.shapeType](e).add(t.group || i.group), l && i.enabledDataSorting && s.hasRendered && s.pointCount < n && (l.attr({ x: t.startXPos }), d = !0, c = "animate")), l && d && l[c](n4(e)), s.styledMode || l[c](i.pointAttribs(t, t.selected && "select")).shadow(!1 !== t.allowShadow && o.shadow), l && (l.addClass(t.getClassName(), !0), l.attr({ visibility: t.visible ? "inherit" : "hidden" }))) : l && (t.graphic = l.destroy()) }) } drawTracker(t=this.points) { let e, i = this, s = i.chart, o = s.pointer, r = function(t) { o?.normalize(t); let e = o?.getPointFromEvent(t); o && e && i.options.enableMouseTracking && (s.isInsidePlot(t.chartX - s.plotLeft, t.chartY - s.plotTop, { visiblePlotOnly: !0 }) || o?.inClass(t.target, "highcharts-data-label")) && (o.isDirectTouch = !0, e.onMouseOver(t)) }; t.forEach(function(t) { e = n6(t.dataLabels) ? t.dataLabels : t.dataLabel ? [t.dataLabel] : [], t.graphic && (t.graphic.element.point = t), e.forEach(function(e) { (e.div || e.element).point = t }) }), i._hasTracking || (i.trackerGroups.forEach(function(t) { i[t] && (i[t].addClass("highcharts-tracker").on("mouseover", r).on("mouseout", function(t) { o?.onTrackerMouseOut(t) }).on("touchstart", r), !s.styledMode && i.options.cursor && i[t].css({ cursor: i.options.cursor })) }), i._hasTracking = !0), n5(this, "afterDrawTracker") } remove() { let t = this , e = t.chart; e.hasRendered && e.series.forEach(function(e) { e.type === t.type && (e.isDirty = !0) }), r1.prototype.remove.apply(t, arguments) } } ht.defaultOptions = n4(r1.defaultOptions, { borderRadius: 3, centerInCategory: !1, groupPadding: .2, marker: null, pointPadding: .1, minPointLength: 0, cropThreshold: 50, pointRange: null, states: { hover: { halo: !1, brightness: .1 }, select: { color: "#cccccc", borderColor: "#000000" } }, dataLabels: { align: void 0, verticalAlign: void 0, y: void 0 }, startFromThreshold: !0, stickyTracking: !1, tooltip: { distance: 6 }, threshold: 0, borderColor: "#ffffff" }), n3(ht.prototype, { directTouch: !0, getSymbol: nQ, negStacks: !0, trackerGroups: ["group", "dataLabelsGroup"] }), rk.registerSeriesType("column", ht); let he = ht , {getDeferredAnimation: hi} = tU , {format: hs} = ep , {defined: ho, extend: hr, fireEvent: ha, getAlignFactor: hn, isArray: hh, isString: hl, merge: hd, objectEach: hc, pick: hp, pInt: hg, splat: hu} = V; !function(t) { function e() { return h(this).some(t => t?.enabled) } function i(t, e, i, s, o) { let {chart: r, enabledDataSorting: a} = this , n = this.isCartesian && r.inverted , h = t.plotX , l = t.plotY , d = i.rotation || 0 , c = ho(h) && ho(l) && r.isInsidePlot(h, Math.round(l), { inverted: n, paneCoordinates: !0, series: this }) , p = 0 === d && "justify" === hp(i.overflow, a ? "none" : "justify") , g = this.visible && !1 !== t.visible && ho(h) && (t.series.forceDL || a && !p || c || hp(i.inside, !!this.options.stacking) && s && r.isInsidePlot(h, n ? s.x + 1 : s.y + s.height - 1, { inverted: n, paneCoordinates: !0, series: this })) , u = t.pos(); if (g && u) { var f; let h = e.getBBox() , l = e.getBBox(void 0, 0); if (s = hr({ x: u[0], y: Math.round(u[1]), width: 0, height: 0 }, s || {}), "plotEdges" === i.alignTo && this.isCartesian && (s[n ? "x" : "y"] = 0, s[n ? "width" : "height"] = this.yAxis?.len || 0), hr(i, { width: h.width, height: h.height }), f = s, a && this.xAxis && !p && this.setDataLabelStartPos(t, e, o, c, f), e.align(hd(i, { width: l.width, height: l.height }), !1, s, !1), e.alignAttr.x += hn(i.align) * (l.width - h.width), e.alignAttr.y += hn(i.verticalAlign) * (l.height - h.height), e[e.placed ? "animate" : "attr"]({ "text-align": e.alignAttr["text-align"] || "center", x: e.alignAttr.x + (h.width - l.width) / 2, y: e.alignAttr.y + (h.height - l.height) / 2, rotationOriginX: (e.width || 0) / 2, rotationOriginY: (e.height || 0) / 2 }), p && s.height >= 0) this.justifyDataLabel(e, i, e.alignAttr, h, s, o); else if (hp(i.crop, !0)) { let {x: t, y: i} = e.alignAttr; g = r.isInsidePlot(t, i, { paneCoordinates: !0, series: this }) && r.isInsidePlot(t + h.width - 1, i + h.height - 1, { paneCoordinates: !0, series: this }) } i.shape && !d && e[o ? "attr" : "animate"]({ anchorX: u[0], anchorY: u[1] }) } o && a && (e.placed = !1), g || a && !p ? (e.show(), e.placed = !0) : (e.hide(), e.placed = !1) } function s() { return this.plotGroup("dataLabelsGroup", "data-labels", this.hasRendered ? "inherit" : "hidden", this.options.dataLabels.zIndex || 6) } function o(t) { let e = this.hasRendered || 0 , i = this.initDataLabelsGroup().attr({ opacity: +e }); return !e && i && (this.visible && i.show(), this.options.animation ? i.animate({ opacity: 1 }, t) : i.attr({ opacity: 1 })), i } function r(t) { let e; t = t || this.points; let i = this , s = i.chart , o = i.options , r = s.renderer , {backgroundColor: a, plotBackgroundColor: l} = s.options.chart , d = r.getContrast(hl(l) && l || hl(a) && a || "#000000") , c = h(i) , {animation: p, defer: g} = c[0] , u = g ? hi(s, p, i) : { defer: 0, duration: 0 }; ha(this, "drawDataLabels"), i.hasDataLabels?.() && (e = this.initDataLabels(u), t.forEach(t => { let a = t.dataLabels || [] , h = t.color || i.color; hu(n(c, t.dlOptions || t.options?.dataLabels)).forEach( (n, l) => { let c = n.enabled && (t.visible || t.dataLabelOnHidden) && (!t.isNull || t.dataLabelOnNull) && function(t, e) { let i = e.filter; if (i) { let e = i.operator , s = t[i.property] , o = i.value; return ">" === e && s > o || "<" === e && s < o || ">=" === e && s >= o || "<=" === e && s <= o || "==" === e && s == o || "===" === e && s === o || "!=" === e && s != o || "!==" === e && s !== o || !1 } return !0 }(t, n), {backgroundColor: p, borderColor: g, distance: u, style: f={}} = n, m, x, y, b = {}, v = a[l], k = !v, w; c && (x = ho(m = hp(n[t.formatPrefix + "Format"], n.format)) ? hs(m, t, s) : (n[t.formatPrefix + "Formatter"] || n.formatter).call(t, n), y = n.rotation, !s.styledMode && (f.color = hp(n.color, f.color, hl(i.color) ? i.color : void 0, "#000000"), "contrast" === f.color ? ("none" !== p && (w = p), t.contrastColor = r.getContrast("auto" !== w && hl(w) && w || (hl(h) ? h : "")), f.color = w || !ho(u) && n.inside || 0 > hg(u || 0) || o.stacking ? t.contrastColor : d) : delete t.contrastColor, o.cursor && (f.cursor = o.cursor)), b = { r: n.borderRadius || 0, rotation: y, padding: n.padding, zIndex: 1 }, s.styledMode || (b.fill = "auto" === p ? t.color : p, b.stroke = "auto" === g ? t.color : g, b["stroke-width"] = n.borderWidth), hc(b, (t, e) => { void 0 === t && delete b[e] } )), !v || c && ho(x) && !!(v.div || v.text?.foreignObject) == !!n.useHTML && (v.rotation && n.rotation || v.rotation === n.rotation) || (v = void 0, k = !0), c && ho(x) && (v ? b.text = x : (v = r.label(x, 0, 0, n.shape, void 0, void 0, n.useHTML, void 0, "data-label")).addClass(" highcharts-data-label-color-" + t.colorIndex + " " + (n.className || "") + (n.useHTML ? " highcharts-tracker" : "")), v && (v.options = n, v.attr(b), s.styledMode ? f.width && v.css({ width: f.width, textOverflow: f.textOverflow, whiteSpace: f.whiteSpace }) : v.css(f).shadow(n.shadow), ha(v, "beforeAddingDataLabel", { labelOptions: n, point: t }), v.added || v.add(e), i.alignDataLabel(t, v, n, void 0, k), v.isActive = !0, a[l] && a[l] !== v && a[l].destroy(), a[l] = v)) } ); let l = a.length; for (; l--; ) a[l]?.isActive ? a[l].isActive = !1 : (a[l]?.destroy(), a.splice(l, 1)); t.dataLabel = a[0], t.dataLabels = a } )), ha(this, "afterDrawDataLabels") } function a(t, e, i, s, o, r) { let a = this.chart, n = e.align, h = e.verticalAlign, l = t.box ? 0 : t.padding || 0, d = a.inverted ? this.yAxis : this.xAxis, c = d ? d.left - a.plotLeft : 0, p = a.inverted ? this.xAxis : this.yAxis, g = p ? p.top - a.plotTop : 0, {x: u=0, y: f=0} = e, m, x; return (m = (i.x || 0) + l + c) < 0 && ("right" === n && u >= 0 ? (e.align = "left", e.inside = !0) : u -= m, x = !0), (m = (i.x || 0) + s.width - l + c) > a.plotWidth && ("left" === n && u <= 0 ? (e.align = "right", e.inside = !0) : u += a.plotWidth - m, x = !0), (m = i.y + l + g) < 0 && ("bottom" === h && f >= 0 ? (e.verticalAlign = "top", e.inside = !0) : f -= m, x = !0), (m = (i.y || 0) + s.height - l + g) > a.plotHeight && ("top" === h && f <= 0 ? (e.verticalAlign = "bottom", e.inside = !0) : f += a.plotHeight - m, x = !0), x && (e.x = u, e.y = f, t.placed = !r, t.align(e, void 0, o)), x } function n(t, e) { let i = [], s; if (hh(t) && !hh(e)) i = t.map(function(t) { return hd(t, e) }); else if (hh(e) && !hh(t)) i = e.map(function(e) { return hd(t, e) }); else if (hh(t) || hh(e)) { if (hh(t) && hh(e)) for (s = Math.max(t.length, e.length); s--; ) i[s] = hd(t[s], e[s]) } else i = hd(t, e); return i } function h(t) { let e = t.chart.options.plotOptions; return hu(n(n(e?.series?.dataLabels, e?.[t.type]?.dataLabels), t.options.dataLabels)) } function l(t, e, i, s, o) { let r = this.chart , a = r.inverted , n = this.xAxis , h = n.reversed , l = ((a ? e.height : e.width) || 0) / 2 , d = t.pointWidth , c = d ? d / 2 : 0; e.startXPos = a ? o.x : h ? -l - c : n.width - l + c, e.startYPos = a ? h ? this.yAxis.height - l + c : -l - c : o.y, s ? "hidden" === e.visibility && (e.show(), e.attr({ opacity: 0 }).animate({ opacity: 1 })) : e.attr({ opacity: 1 }).animate({ opacity: 0 }, void 0, e.hide), r.hasRendered && (i && e.attr({ x: e.startXPos, y: e.startYPos }), e.placed = !0) } t.compose = function(t) { let h = t.prototype; h.initDataLabels || (h.initDataLabels = o, h.initDataLabelsGroup = s, h.alignDataLabel = i, h.drawDataLabels = r, h.justifyDataLabel = a, h.mergeArrays = n, h.setDataLabelStartPos = l, h.hasDataLabels = e) } }(u || (u = {})); let hf = u , {composed: hm} = w , {series: hx} = rk , {merge: hy, pushUnique: hb} = V; !function(t) { function e(t, e, i, s, o) { let {chart: r, options: a} = this , n = r.inverted , h = this.xAxis?.len || r.plotSizeX || 0 , l = this.yAxis?.len || r.plotSizeY || 0 , d = t.dlBox || t.shapeArgs , c = t.below ?? (t.plotY || 0) > (this.translatedThreshold ?? l) , p = i.inside ?? !!a.stacking; if (d) { if (s = hy(d), "allow" !== i.overflow || !1 !== i.crop || !1 !== a.clip) { s.y < 0 && (s.height += s.y, s.y = 0); let t = s.y + s.height - l; t > 0 && t < s.height - 1 && (s.height -= t) } n && (s = { x: l - s.y - s.height, y: h - s.x - s.width, width: s.height, height: s.width }), p || (n ? (s.x += c ? 0 : s.width, s.width = 0) : (s.y += c ? s.height : 0, s.height = 0)) } i.align ?? (i.align = !n || p ? "center" : c ? "right" : "left"), i.verticalAlign ?? (i.verticalAlign = n || p ? "middle" : c ? "top" : "bottom"), hx.prototype.alignDataLabel.call(this, t, e, i, s, o), i.inside && t.contrastColor && e.css({ color: t.contrastColor }) } t.compose = function(t) { hf.compose(hx), hb(hm, "ColumnDataLabel") && (t.prototype.alignDataLabel = e) } }(f || (f = {})); let hv = f , {extend: hk, merge: hw} = V; class hM extends he { } hM.defaultOptions = hw(he.defaultOptions, {}), hk(hM.prototype, { inverted: !0 }), rk.registerSeriesType("bar", hM); let {column: hS, line: hT} = rk.seriesTypes , {addEvent: hC, extend: hA, merge: hP} = V; class hL extends hT { applyJitter() { let t = this , e = this.options.jitter , i = this.points.length; e && this.points.forEach(function(s, o) { ["x", "y"].forEach(function(r, a) { if (e[r] && !s.isNull) { let n = `plot${r.toUpperCase()}` , h = t[`${r}Axis`] , l = e[r] * h.transA; if (h && !h.logarithmic) { let t = Math.max(0, (s[n] || 0) - l) , e = Math.min(h.len, (s[n] || 0) + l); s[n] = t + (e - t) * function(t) { let e = 1e4 * Math.sin(t); return e - Math.floor(e) }(o + a * i), "x" === r && (s.clientX = s.plotX) } } }) }) } drawGraph() { this.options.lineWidth ? super.drawGraph() : this.graph && (this.graph = this.graph.destroy()) } } hL.defaultOptions = hP(hT.defaultOptions, { lineWidth: 0, findNearestPointBy: "xy", jitter: { x: 0, y: 0 }, marker: { enabled: !0 }, tooltip: { headerFormat: ' {series.name}
', pointFormat: "x: {point.x}
y: {point.y}
" } }), hA(hL.prototype, { drawTracker: hS.prototype.drawTracker, sorted: !1, requireSorting: !1, noSharedTooltip: !0, trackerGroups: ["group", "markerGroup", "dataLabelsGroup"] }), hC(hL, "afterTranslate", function() { this.applyJitter() }), rk.registerSeriesType("scatter", hL); let {deg2rad: hO} = w , {fireEvent: hE, isNumber: hI, pick: hD, relativeLength: hB} = V; !function(t) { t.getCenter = function() { let t = this.options, e = this.chart, i = 2 * (t.slicedOffset || 0), s = e.plotWidth - 2 * i, o = e.plotHeight - 2 * i, r = t.center, a = Math.min(s, o), n = t.thickness, h, l = t.size, d = t.innerSize || 0, c, p; "string" == typeof l && (l = parseFloat(l)), "string" == typeof d && (d = parseFloat(d)); let g = [hD(r?.[0], "50%"), hD(r?.[1], "50%"), hD(l && l < 0 ? void 0 : t.size, "100%"), hD(d && d < 0 ? void 0 : t.innerSize || 0, "0%")]; for (!e.angular || this instanceof r1 || (g[3] = 0), c = 0; c < 4; ++c) p = g[c], h = c < 2 || 2 === c && /%$/.test(p), g[c] = hB(p, [s, o, a, g[2]][c]) + (h ? i : 0); return g[3] > g[2] && (g[3] = g[2]), hI(n) && 2 * n < g[2] && n > 0 && (g[3] = g[2] - 2 * n), hE(this, "afterGetCenter", { positions: g }), g } , t.getStartAndEndRadians = function(t, e) { let i = hI(t) ? t : 0 , s = hI(e) && e > i && e - i < 360 ? e : i + 360; return { start: hO * (i + -90), end: hO * (s + -90) } } }(m || (m = {})); let hN = m , {setAnimation: hz} = tU , {addEvent: hR, defined: hW, extend: hH, isNumber: hF, pick: hX, relativeLength: hG} = V; class hj extends oK { getConnectorPath(t) { let e = t.dataLabelPosition , i = t.options || {} , s = i.connectorShape , o = this.connectorShapes[s] || s; return e && o.call(this, { ...e.computed, alignment: e.alignment }, e.connectorPosition, i) || [] } getTranslate() { return this.sliced && this.slicedTranslation || { translateX: 0, translateY: 0 } } haloPath(t) { let e = this.shapeArgs; return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(e.x, e.y, e.r + t, e.r + t, { innerR: e.r - 1, start: e.start, end: e.end, borderRadius: e.borderRadius }) } constructor(t, e, i) { super(t, e, i), this.half = 0, this.name ?? (this.name = t.chart.options.lang.pieSliceName); let s = t => { this.slice("select" === t.type) } ; hR(this, "select", s), hR(this, "unselect", s) } isValid() { return hF(this.y) && this.y >= 0 } setVisible(t, e=!0) { t !== this.visible && this.update({ visible: t ?? !this.visible }, e, void 0, !1) } slice(t, e, i) { let s = this.series; hz(i, s.chart), e = hX(e, !0), this.sliced = this.options.sliced = t = hW(t) ? t : !this.sliced, s.options.data[s.data.indexOf(this)] = this.options, this.graphic && this.graphic.animate(this.getTranslate()) } } hH(hj.prototype, { connectorShapes: { fixedOffset: function(t, e, i) { let s = e.breakAt , o = e.touchingSliceAt , r = i.softConnector ? ["C", t.x + ("left" === t.alignment ? -5 : 5), t.y, 2 * s.x - o.x, 2 * s.y - o.y, s.x, s.y] : ["L", s.x, s.y]; return [["M", t.x, t.y], r, ["L", o.x, o.y]] }, straight: function(t, e) { let i = e.touchingSliceAt; return [["M", t.x, t.y], ["L", i.x, i.y]] }, crookedLine: function(t, e, i) { let {angle: s=this.angle || 0, breakAt: o, touchingSliceAt: r} = e , {series: a} = this , [n,h,l] = a.center , d = l / 2 , {plotLeft: c, plotWidth: p} = a.chart , g = "left" === t.alignment , {x: u, y: f} = t , m = o.x; if (i.crookDistance) { let t = hG(i.crookDistance, 1); m = g ? n + d + (p + c - n - d) * (1 - t) : c + (n - d) * t } else m = n + (h - f) * Math.tan(s - Math.PI / 2); let x = [["M", u, f]]; return (g ? m <= u && m >= o.x : m >= u && m <= o.x) && x.push(["L", m, f]), x.push(["L", o.x, o.y], ["L", r.x, r.y]), x } } }); let {getStartAndEndRadians: hY} = hN , {noop: hU} = w , {clamp: h$, extend: hV, fireEvent: hZ, merge: h_, pick: hq} = V; class hK extends r1 { animate(t) { let e = this , i = e.points , s = e.startAngleRad; t || i.forEach(function(t) { let i = t.graphic , o = t.shapeArgs; i && o && (i.attr({ r: hq(t.startR, e.center && e.center[3] / 2), start: s, end: s }), i.animate({ r: o.r, start: o.start, end: o.end }, e.options.animation)) }) } drawEmpty() { let t, e, i = this.startAngleRad, s = this.endAngleRad, o = this.options; 0 === this.total && this.center ? (t = this.center[0], e = this.center[1], this.graph || (this.graph = this.chart.renderer.arc(t, e, this.center[1] / 2, 0, i, s).addClass("highcharts-empty-series").add(this.group)), this.graph.attr({ d: is.arc(t, e, this.center[2] / 2, 0, { start: i, end: s, innerR: this.center[3] / 2 }) }), this.chart.styledMode || this.graph.attr({ "stroke-width": o.borderWidth, fill: o.fillColor || "none", stroke: o.color || "#cccccc" })) : this.graph && (this.graph = this.graph.destroy()) } drawPoints() { let t = this.chart.renderer; this.points.forEach(function(e) { e.graphic && e.hasNewShapeType() && (e.graphic = e.graphic.destroy()), e.graphic || (e.graphic = t[e.shapeType](e.shapeArgs).add(e.series.group), e.delayedRendering = !0) }) } generatePoints() { super.generatePoints(), this.updateTotals() } getX(t, e, i, s) { let o = this.center , r = this.radii ? this.radii[i.index] || 0 : o[2] / 2 , a = s.dataLabelPosition , n = a?.distance || 0 , h = Math.asin(h$((t - o[1]) / (r + n), -1, 1)); return o[0] + Math.cos(h) * (r + n) * (e ? -1 : 1) + (n > 0 ? (e ? -1 : 1) * (s.padding || 0) : 0) } hasData() { return !!this.dataTable.rowCount } redrawPoints() { let t, e, i, s, o = this, r = o.chart; this.drawEmpty(), o.group && !r.styledMode && o.group.shadow(o.options.shadow), o.points.forEach(function(a) { let n = {}; e = a.graphic, !a.isNull && e ? (s = a.shapeArgs, t = a.getTranslate(), r.styledMode || (i = o.pointAttribs(a, a.selected && "select")), a.delayedRendering ? (e.setRadialReference(o.center).attr(s).attr(t), r.styledMode || e.attr(i).attr({ "stroke-linejoin": "round" }), a.delayedRendering = !1) : (e.setRadialReference(o.center), r.styledMode || h_(!0, n, i), h_(!0, n, s, t), e.animate(n)), e.attr({ visibility: a.visible ? "inherit" : "hidden" }), e.addClass(a.getClassName(), !0)) : e && (a.graphic = e.destroy()) }) } sortByAngle(t, e) { t.sort(function(t, i) { return void 0 !== t.angle && (i.angle - t.angle) * e }) } translate(t) { hZ(this, "translate"), this.generatePoints(); let e = this.options, i = e.slicedOffset, s = hY(e.startAngle, e.endAngle), o = this.startAngleRad = s.start, r = (this.endAngleRad = s.end) - o, a = this.points, n = e.ignoreHiddenPoint, h = a.length, l, d, c, p, g, u, f, m = 0; for (t || (this.center = t = this.getCenter()), u = 0; u < h; u++) { f = a[u], l = o + m * r, f.isValid() && (!n || f.visible) && (m += f.percentage / 100), d = o + m * r; let e = { x: t[0], y: t[1], r: t[2] / 2, innerR: t[3] / 2, start: Math.round(1e3 * l) / 1e3, end: Math.round(1e3 * d) / 1e3 }; f.shapeType = "arc", f.shapeArgs = e, (c = (d + l) / 2) > 1.5 * Math.PI ? c -= 2 * Math.PI : c < -Math.PI / 2 && (c += 2 * Math.PI), f.slicedTranslation = { translateX: Math.round(Math.cos(c) * i), translateY: Math.round(Math.sin(c) * i) }, p = Math.cos(c) * t[2] / 2, g = Math.sin(c) * t[2] / 2, f.tooltipPos = [t[0] + .7 * p, t[1] + .7 * g], f.half = +(c < -Math.PI / 2 || c > Math.PI / 2), f.angle = c } hZ(this, "afterTranslate") } updateTotals() { let t = this.points, e = t.length, i = this.options.ignoreHiddenPoint, s, o, r = 0; for (s = 0; s < e; s++) (o = t[s]).isValid() && (!i || o.visible) && (r += o.y); for (s = 0, this.total = r; s < e; s++) (o = t[s]).percentage = r > 0 && (o.visible || !i) ? o.y / r * 100 : 0, o.total = r } } hK.defaultOptions = h_(r1.defaultOptions, { borderRadius: 3, center: [null, null], clip: !1, colorByPoint: !0, dataLabels: { connectorPadding: 5, connectorShape: "crookedLine", crookDistance: void 0, distance: 30, enabled: !0, formatter: function() { return this.isNull ? void 0 : this.name }, softConnector: !0, x: 0 }, fillColor: void 0, ignoreHiddenPoint: !0, inactiveOtherPoints: !0, legendType: "point", marker: null, size: null, showInLegend: !1, slicedOffset: 10, stickyTracking: !1, tooltip: { followPointer: !0 }, borderColor: "#ffffff", borderWidth: 1, lineWidth: void 0, states: { hover: { brightness: .1 } } }), hV(hK.prototype, { axisTypes: [], directTouch: !0, drawGraph: void 0, drawTracker: he.prototype.drawTracker, getCenter: hN.getCenter, getSymbol: hU, invertible: !1, isCartesian: !1, noSharedTooltip: !0, pointAttribs: he.prototype.pointAttribs, pointClass: hj, requireSorting: !1, searchPoint: hU, trackerGroups: ["group", "dataLabelsGroup"] }), rk.registerSeriesType("pie", hK); let {composed: hJ, noop: hQ} = w , {distribute: h0} = ey , {series: h1} = rk , {arrayMax: h2, clamp: h3, defined: h5, pick: h6, pushUnique: h9, relativeLength: h4} = V; !function(t) { let e = { radialDistributionY: function(t, e) { return (e.dataLabelPosition?.top || 0) + t.distributeBox.pos }, radialDistributionX: function(t, e, i, s, o) { let r = o.dataLabelPosition; return t.getX(i < (r?.top || 0) + 2 || i > (r?.bottom || 0) - 2 ? s : i, e.half, e, o) }, justify: function(t, e, i, s) { return s[0] + (t.half ? -1 : 1) * (i + (e.dataLabelPosition?.distance || 0)) }, alignToPlotEdges: function(t, e, i, s) { let o = t.getBBox().width; return e ? o + s : i - o - s }, alignToConnectors: function(t, e, i, s) { let o = 0, r; return t.forEach(function(t) { (r = t.dataLabel.getBBox().width) > o && (o = r) }), e ? o + s : i - o - s } }; function i(t, e) { let i = Math.PI / 2 , {start: s=0, end: o=0} = t.shapeArgs || {} , r = t.angle || 0; e > 0 && s < i && o > i && r > i / 2 && r < 1.5 * i && (r = r <= i ? Math.max(i / 2, (s + i) / 2) : Math.min(1.5 * i, (i + o) / 2)); let {center: a, options: n} = this , h = a[2] / 2 , l = Math.cos(r) , d = Math.sin(r) , c = a[0] + l * h , p = a[1] + d * h , g = Math.min((n.slicedOffset || 0) + (n.borderWidth || 0), e / 5); return { natural: { x: c + l * e, y: p + d * e }, computed: {}, alignment: e < 0 ? "center" : t.half ? "right" : "left", connectorPosition: { angle: r, breakAt: { x: c + l * g, y: p + d * g }, touchingSliceAt: { x: c, y: p } }, distance: e } } function s() { let t = this, e = t.points, i = t.chart, s = i.plotWidth, o = i.plotHeight, r = i.plotLeft, a = Math.round(i.chartWidth / 3), n = t.center, h = n[2] / 2, l = n[1], d = [[], []], c = [0, 0, 0, 0], p = t.dataLabelPositioners, g, u, f, m = 0; t.visible && t.hasDataLabels?.() && (e.forEach(t => { (t.dataLabels || []).forEach(t => { t.shortened && (t.attr({ width: "auto" }).css({ width: "auto", textOverflow: "clip" }), t.shortened = !1) } ) } ), h1.prototype.drawDataLabels.apply(t), e.forEach(t => { (t.dataLabels || []).forEach( (e, i) => { let s = n[2] / 2 , o = e.options , r = h4(o?.distance || 0, s); 0 === i && d[t.half].push(t), !h5(o?.style?.width) && e.getBBox().width > a && (e.css({ width: Math.round(.7 * a) + "px" }), e.shortened = !0), e.dataLabelPosition = this.getDataLabelPosition(t, r), m = Math.max(m, r) } ) } ), d.forEach( (e, a) => { let d = e.length, g = [], x, y, b = 0, v; d && (t.sortByAngle(e, a - .5), m > 0 && (x = Math.max(0, l - h - m), y = Math.min(l + h + m, i.plotHeight), e.forEach(t => { (t.dataLabels || []).forEach(e => { let s = e.dataLabelPosition; s && s.distance > 0 && (s.top = Math.max(0, l - h - s.distance), s.bottom = Math.min(l + h + s.distance, i.plotHeight), b = e.getBBox().height || 21, e.lineHeight = i.renderer.fontMetrics(e.text || e).h + 2 * e.padding, t.distributeBox = { target: (e.dataLabelPosition?.natural.y || 0) - s.top + e.lineHeight / 2, size: b, rank: t.y }, g.push(t.distributeBox)) } ) } ), h0(g, v = y + b - x, v / 5)), e.forEach(i => { (i.dataLabels || []).forEach(l => { let d = l.options || {} , m = i.distributeBox , x = l.dataLabelPosition , y = x?.natural.y || 0 , b = d.connectorPadding || 0 , v = l.lineHeight || 21 , k = (v - l.getBBox().height) / 2 , w = 0 , M = y , S = "inherit"; if (x) { if (g && h5(m) && x.distance > 0 && (void 0 === m.pos ? S = "hidden" : (f = m.size, M = p.radialDistributionY(i, l))), d.justify) w = p.justify(i, l, h, n); else switch (d.alignTo) { case "connectors": w = p.alignToConnectors(e, a, s, r); break; case "plotEdges": w = p.alignToPlotEdges(l, a, s, r); break; default: w = p.radialDistributionX(t, i, M - k, y, l) } if (x.attribs = { visibility: S, align: x.alignment }, x.posAttribs = { x: w + (d.x || 0) + (({ left: b, right: -b })[x.alignment] || 0), y: M + (d.y || 0) - v / 2 }, x.computed.x = w, x.computed.y = M - k, h6(d.crop, !0)) { let t; w - (u = l.getBBox().width) < b && 1 === a ? (t = Math.round(u - w + b), c[3] = Math.max(t, c[3])) : w + u > s - b && 0 === a && (t = Math.round(w + u - s + b), c[1] = Math.max(t, c[1])), M - f / 2 < 0 ? c[0] = Math.max(Math.round(-M + f / 2), c[0]) : M + f / 2 > o && (c[2] = Math.max(Math.round(M + f / 2 - o), c[2])), x.sideOverflow = t } } } ) } )) } ), (0 === h2(c) || this.verifyDataLabelOverflow(c)) && (this.placeDataLabels(), this.points.forEach(e => { (e.dataLabels || []).forEach(s => { let {connectorColor: o, connectorWidth: r=1} = s.options || {} , a = s.dataLabelPosition; if (r) { let n; g = s.connector, a && a.distance > 0 ? (n = !g, g || (s.connector = g = i.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + e.colorIndex + (e.className ? " " + e.className : "")).add(t.dataLabelsGroup)), i.styledMode || g.attr({ "stroke-width": r, stroke: o || e.color || "#666666" }), g[n ? "attr" : "animate"]({ d: e.getConnectorPath(s) }), g.attr({ visibility: a.attribs?.visibility })) : g && (s.connector = g.destroy()) } } ) } ))) } function o() { this.points.forEach(t => { (t.dataLabels || []).forEach(t => { let e = t.dataLabelPosition; e ? (e.sideOverflow && (t.css({ width: Math.max(t.getBBox().width - e.sideOverflow, 0) + "px", textOverflow: t.options?.style?.textOverflow || "ellipsis" }), t.shortened = !0), t.attr(e.attribs), t[t.moved ? "animate" : "attr"](e.posAttribs), t.moved = !0) : t && t.attr({ y: -9999 }) } ), delete t.distributeBox } , this) } function r(t) { let e = this.center , i = this.options , s = i.center , o = i.minSize || 80 , r = o , a = null !== i.size; return !a && (null !== s[0] ? r = Math.max(e[2] - Math.max(t[1], t[3]), o) : (r = Math.max(e[2] - t[1] - t[3], o), e[0] += (t[3] - t[1]) / 2), null !== s[1] ? r = h3(r, o, e[2] - Math.max(t[0], t[2])) : (r = h3(r, o, e[2] - t[0] - t[2]), e[1] += (t[0] - t[2]) / 2), r < e[2] ? (e[2] = r, e[3] = Math.min(i.thickness ? Math.max(0, r - 2 * i.thickness) : Math.max(0, h4(i.innerSize || 0, r)), r), this.translate(e), this.drawDataLabels && this.drawDataLabels()) : a = !0), a } t.compose = function(t) { if (hf.compose(h1), h9(hJ, "PieDataLabel")) { let a = t.prototype; a.dataLabelPositioners = e, a.alignDataLabel = hQ, a.drawDataLabels = s, a.getDataLabelPosition = i, a.placeDataLabels = o, a.verifyDataLabelOverflow = r } } }(x || (x = {})); let h8 = x; !function(t) { t.getCenterOfPoints = function(t) { let e = t.reduce( (t, e) => (t.x += e.x, t.y += e.y, t), { x: 0, y: 0 }); return { x: e.x / t.length, y: e.y / t.length } } , t.getDistanceBetweenPoints = function(t, e) { return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2)) } , t.getAngleBetweenPoints = function(t, e) { return Math.atan2(e.x - t.x, e.y - t.y) } , t.pointInPolygon = function({x: t, y: e}, i) { let s = i.length, o, r, a = !1; for (o = 0, r = s - 1; o < s; r = o++) { let[s,n] = i[o] , [h,l] = i[r]; n > e != l > e && t < (h - s) * (e - n) / (l - n) + s && (a = !a) } return a } }(y || (y = {})); let {pointInPolygon: h7} = y , {addEvent: lt, getAlignFactor: le, fireEvent: li, objectEach: ls, pick: lo} = V; function lr(t) { let e = t.length, i = (t, e) => !(e.x >= t.x + t.width || e.x + e.width <= t.x || e.y >= t.y + t.height || e.y + e.height <= t.y), s = (t, e) => { for (let i of t) if (h7({ x: i[0], y: i[1] }, e)) return !0; return !1 } , o, r, a, n, h, l = !1; for (let i = 0; i < e; i++) (o = t[i]) && (o.oldOpacity = o.opacity, o.newOpacity = 1, o.absoluteBox = function(t) { if (t && (!t.alignAttr || t.placed)) { let e = t.box ? 0 : t.padding || 0 , i = t.alignAttr || { x: t.attr("x"), y: t.attr("y") } , {height: s, polygon: o, width: r} = t.getBBox() , a = le(t.alignValue) * r; return t.width = r, t.height = s, { x: i.x + (t.parentGroup?.translateX || 0) + e - a, y: i.y + (t.parentGroup?.translateY || 0) + e, width: r - 2 * e, height: s - 2 * e, polygon: o } } }(o)); t.sort( (t, e) => (e.labelrank || 0) - (t.labelrank || 0)); for (let o = 0; o < e; ++o) { n = (r = t[o]) && r.absoluteBox; let l = n?.polygon; for (let d = o + 1; d < e; ++d) { h = (a = t[d]) && a.absoluteBox; let e = !1; if (n && h && r !== a && 0 !== r.newOpacity && 0 !== a.newOpacity && "hidden" !== r.visibility && "hidden" !== a.visibility) { let t = h.polygon; if (l && t && l !== t ? s(l, t) && (e = !0) : i(n, h) && (e = !0), e) { let t = r.labelrank < a.labelrank ? r : a , e = t.text; t.newOpacity = 0, e?.element.querySelector("textPath") && e.hide() } } } } for (let e of t) la(e, this) && (l = !0); l && li(this, "afterHideAllOverlappingLabels") } function la(t, e) { let i, s = !1; return t && (i = t.newOpacity, t.oldOpacity !== i && (t.hasClass("highcharts-data-label") ? (t[i ? "removeClass" : "addClass"]("highcharts-data-label-hidden"), s = !0, t[t.isOld ? "animate" : "attr"]({ opacity: i }, void 0, function() { e.styledMode || t.css({ pointerEvents: i ? "auto" : "none" }) }), li(e, "afterHideOverlappingLabel")) : t.attr({ opacity: i })), t.isOld = !0), s } function ln() { let t = this , e = []; for (let i of t.labelCollectors || []) e = e.concat(i()); for (let i of t.yAxis || []) i.stacking && i.options.stackLabels && !i.options.stackLabels.allowOverlap && ls(i.stacking.stacks, t => { ls(t, t => { t.label && e.push(t.label) } ) } ); for (let i of t.series || []) if (i.visible && i.hasDataLabels?.()) { let s = i => { for (let s of i) s.visible && (s.dataLabels || []).forEach(i => { let o = i.options || {}; i.labelrank = lo(o.labelrank, s.labelrank, s.shapeArgs?.height), o.allowOverlap ?? Number(o.distance) > 0 ? (i.oldOpacity = i.opacity, i.newOpacity = 1, la(i, t)) : e.push(i) } ) } ; s(i.nodes || []), s(i.points) } this.hideOverlappingLabels(e) } let lh = { compose: function(t) { let e = t.prototype; e.hideOverlappingLabels || (e.hideOverlappingLabels = lr, lt(t, "render", ln)) } } , {defaultOptions: ll} = tv , {noop: ld} = w , {addEvent: lc, extend: lp, isObject: lg, merge: lu, relativeLength: lf} = V , lm = { radius: 0, scope: "stack", where: void 0 } , lx = ld , ly = ld; function lb(t, e, i, s, o={}) { let r = lx(t, e, i, s, o) , {innerR: a=0, r: n=i, start: h=0, end: l=0} = o; if (o.open || !o.borderRadius) return r; let d = l - h , c = Math.sin(d / 2) , p = Math.max(Math.min(lf(o.borderRadius || 0, n - a), (n - a) / 2, n * c / (1 + c)), 0) , g = Math.min(p, d / Math.PI * 2 * a) , u = r.length - 1; for (; u--; ) !function(t, e, i) { let s, o, r, a = t[e], n = t[e + 1]; if ("Z" === n[0] && (n = t[0]), ("M" === a[0] || "L" === a[0]) && "A" === n[0] ? (s = a, o = n, r = !0) : "A" === a[0] && ("M" === n[0] || "L" === n[0]) && (s = n, o = a), s && o && o.params) { let a = o[1] , n = o[5] , h = o.params , {start: l, end: d, cx: c, cy: p} = h , g = n ? a - i : a + i , u = g ? Math.asin(i / g) : 0 , f = n ? u : -u , m = Math.cos(u) * g; r ? (h.start = l + f, s[1] = c + m * Math.cos(l), s[2] = p + m * Math.sin(l), t.splice(e + 1, 0, ["A", i, i, 0, 0, 1, c + a * Math.cos(h.start), p + a * Math.sin(h.start)])) : (h.end = d - f, o[6] = c + a * Math.cos(h.end), o[7] = p + a * Math.sin(h.end), t.splice(e + 1, 0, ["A", i, i, 0, 0, 1, c + m * Math.cos(d), p + m * Math.sin(d)])), o[4] = Math.abs(h.end - h.start) < Math.PI ? 0 : 1 } }(r, u, u > 1 ? g : p); return r } function lv() { if (this.options.borderRadius && !(this.chart.is3d && this.chart.is3d())) { let {options: t, yAxis: e} = this , i = "percent" === t.stacking , s = ll.plotOptions?.[this.type]?.borderRadius , o = lk(t.borderRadius, lg(s) ? s : {}) , r = e.options.reversed; for (let s of this.points) { let {shapeArgs: a} = s; if ("roundedRect" === s.shapeType && a) { let {width: n=0, height: h=0, y: l=0} = a , d = l , c = h; if ("stack" === o.scope && s.stackTotal) { let o = e.translate(i ? 100 : s.stackTotal, !1, !0, !1, !0) , r = e.translate(t.threshold || 0, !1, !0, !1, !0) , a = this.crispCol(0, Math.min(o, r), 0, Math.abs(o - r)); d = a.y, c = a.height } let p = (s.negative ? -1 : 1) * (r ? -1 : 1) == -1 , g = o.where; !g && this.is("waterfall") && Math.abs((s.yBottom || 0) - (this.translatedThreshold || 0)) > this.borderWidth && (g = "all"), g || (g = "end"); let u = Math.min(lf(o.radius, n), n / 2, "all" === g ? h / 2 : 1 / 0) || 0; "end" === g && (p && (d -= u), c += u), lp(a, { brBoxHeight: c, brBoxY: d, r: u }) } } } } function lk(t, e) { return lg(t) || (t = { radius: t || 0 }), lu(lm, e, t) } function lw() { let t = lk(this.options.borderRadius); for (let e of this.points) { let i = e.shapeArgs; i && (i.borderRadius = lf(t.radius, (i.r || 0) - (i.innerR || 0))) } } function lM(t, e, i, s, o={}) { let r = ly(t, e, i, s, o) , {r: a=0, brBoxHeight: n=s, brBoxY: h=e} = o , l = e - h , d = h + n - (e + s) , c = l - a > -.1 ? 0 : a , p = d - a > -.1 ? 0 : a , g = Math.max(c && l, 0) , u = Math.max(p && d, 0) , f = [t + c, e] , m = [t + i - c, e] , x = [t + i, e + c] , y = [t + i, e + s - p] , b = [t + i - p, e + s] , v = [t + p, e + s] , k = [t, e + s - p] , w = [t, e + c] , M = (t, e) => Math.sqrt(Math.pow(t, 2) - Math.pow(e, 2)); if (g) { let t = M(c, c - g); f[0] -= t, m[0] += t, x[1] = w[1] = e + c - g } if (s < c - g) { let o = M(c, c - g - s); x[0] = y[0] = t + i - c + o, b[0] = Math.min(x[0], b[0]), v[0] = Math.max(y[0], v[0]), k[0] = w[0] = t + c - o, x[1] = w[1] = e + s } if (u) { let t = M(p, p - u); b[0] += t, v[0] -= t, y[1] = k[1] = e + s - p + u } if (s < p - u) { let o = M(p, p - u - s); x[0] = y[0] = t + i - p + o, m[0] = Math.min(x[0], m[0]), f[0] = Math.max(y[0], f[0]), k[0] = w[0] = t + p - o, y[1] = k[1] = e } return r.length = 0, r.push(["M", ...f], ["L", ...m], ["A", c, c, 0, 0, 1, ...x], ["L", ...y], ["A", p, p, 0, 0, 1, ...b], ["L", ...v], ["A", p, p, 0, 0, 1, ...k], ["L", ...w], ["A", c, c, 0, 0, 1, ...f], ["Z"]), r } let {diffObjects: lS, extend: lT, find: lC, merge: lA, pick: lP, uniqueKey: lL} = V; !function(t) { function e(t, e) { let i = t.condition; (i.callback || function() { return this.chartWidth <= lP(i.maxWidth, Number.MAX_VALUE) && this.chartHeight <= lP(i.maxHeight, Number.MAX_VALUE) && this.chartWidth >= lP(i.minWidth, 0) && this.chartHeight >= lP(i.minHeight, 0) } ).call(this) && e.push(t._id) } function i(t, e) { let i = this.options.responsive, s = this.currentResponsive, o = [], r; !e && i && i.rules && i.rules.forEach(t => { void 0 === t._id && (t._id = lL()), this.matchResponsiveRule(t, o) } , this); let a = lA(...o.map(t => lC(i?.rules || [], e => e._id === t)).map(t => t?.chartOptions)); a.isResponsiveOptions = !0, o = o.toString() || void 0; let n = s?.ruleIds; o === n || (s && (this.currentResponsive = void 0, this.updatingResponsive = !0, this.update(s.undoOptions, t, !0), this.updatingResponsive = !1), o ? ((r = lS(a, this.options, !0, this.collectionsWithUpdate)).isResponsiveOptions = !0, this.currentResponsive = { ruleIds: o, mergedOptions: a, undoOptions: r }, this.updatingResponsive || this.update(a, t, !0)) : this.currentResponsive = void 0) } t.compose = function(t) { let s = t.prototype; return s.matchResponsiveRule || lT(s, { matchResponsiveRule: e, setResponsive: i }), t } }(b || (b = {})); let lO = b; w.AST = t6, w.Axis = s$, w.Chart = a0, w.Color = tL, w.DataLabel = hf, w.DataTableCore = rp, w.Fx = tB, w.HTMLElement = i6, w.Legend = au, w.LegendSymbol = rm, w.OverlappingDataLabels = w.OverlappingDataLabels || lh, w.PlotLineOrBand = oa, w.Point = oK, w.Pointer = ra, w.RendererRegistry = eg, w.Series = r1, w.SeriesRegistry = rk, w.StackItem = nd, w.SVGElement = eJ, w.SVGRenderer = iU, w.Templating = ep, w.Tick = sf, w.Time = tu, w.Tooltip = oE, w.animate = tU.animate, w.animObject = tU.animObject, w.chart = a0.chart, w.color = tL.parse, w.dateFormat = ep.dateFormat, w.defaultOptions = tv.defaultOptions, w.distribute = ey.distribute, w.format = ep.format, w.getDeferredAnimation = tU.getDeferredAnimation, w.getOptions = tv.getOptions, w.numberFormat = ep.numberFormat, w.seriesType = rk.seriesType, w.setAnimation = tU.setAnimation, w.setOptions = tv.setOptions, w.stop = tU.stop, w.time = tv.defaultTime, w.timers = tB.timers, ({ compose: function(t, e, i) { let s = t.types.pie; if (!e.symbolCustomAttribs.includes("borderRadius")) { let o = i.prototype.symbols; lc(t, "afterColumnTranslate", lv, { order: 9 }), lc(s, "afterTranslate", lw), e.symbolCustomAttribs.push("borderRadius", "brBoxHeight", "brBoxY"), lx = o.arc, ly = o.roundedRect, o.arc = lb, o.roundedRect = lM } }, optionsToObject: lk }).compose(w.Series, w.SVGElement, w.SVGRenderer), hv.compose(w.Series.types.column), hf.compose(w.Series), sK.compose(w.Axis), i6.compose(w.SVGRenderer), au.compose(w.Chart), s1.compose(w.Axis), lh.compose(w.Chart), h8.compose(w.Series.types.pie), oa.compose(w.Chart, w.Axis), ra.compose(w.Chart), lO.compose(w.Chart), ni.compose(w.Axis, w.Chart, w.Series), nO.compose(w.Axis, w.Chart, w.Series), oE.compose(w.Pointer), V.extend(w, V); let lE = w; return k.default } )());