{"version":3,"sources":[""],"sourcesContent":["/**\n * @license Highcharts JS v12.1.1 (2024-12-20)\n * @module highcharts/highcharts\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\t(root[\"_Highcharts\"] = factory(),module.exports = root[\"_Highcharts\"]);\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"highcharts/highcharts\", [], factory);\n\telse if(typeof exports === 'object')\n\t\t(root[\"_Highcharts\"] = factory(),exports[\"highcharts\"] = root[\"_Highcharts\"]);\n\telse\n\t\t((root[\"Highcharts\"] && root[\"Highcharts\"].error(16, true)), root[\"Highcharts\"] = factory());\n})(typeof window === 'undefined' ? this : window, () => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \t// The require scope\n/******/ \tvar __webpack_require__ = {};\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ highstock_src)\n});\n\n;// ./code/es-modules/Core/Globals.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Namespace\n *\n * */\n/**\n * Shared Highcharts properties.\n * @private\n */\nvar Globals;\n(function (Globals) {\n /* *\n *\n * Constants\n *\n * */\n Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '12.1.1', Globals.win = (typeof window !== 'undefined' ?\n window :\n {}), // eslint-disable-line node/no-unsupported-features/es-builtins\n Globals.doc = Globals.win.document, Globals.svg = (Globals.doc &&\n Globals.doc.createElementNS &&\n !!Globals.doc.createElementNS(Globals.SVG_NS, 'svg').createSVGRect), Globals.pageLang = Globals.doc?.body.closest('[lang]')?.lang, Globals.userAgent = (Globals.win.navigator && Globals.win.navigator.userAgent) || '', Globals.isChrome = Globals.win.chrome, Globals.isFirefox = Globals.userAgent.indexOf('Firefox') !== -1, Globals.isMS = /(edge|msie|trident)/i.test(Globals.userAgent) && !Globals.win.opera, Globals.isSafari = !Globals.isChrome && Globals.userAgent.indexOf('Safari') !== -1, Globals.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(Globals.userAgent), Globals.isWebKit = Globals.userAgent.indexOf('AppleWebKit') !== -1, Globals.deg2rad = Math.PI * 2 / 360, Globals.marginNames = [\n 'plotTop',\n 'marginRight',\n 'marginBottom',\n 'plotLeft'\n ], Globals.noop = function () { }, Globals.supportsPassiveEvents = (function () {\n // Checks whether the browser supports passive events, (#11353).\n let supportsPassive = false;\n // Object.defineProperty doesn't work on IE as well as passive\n // events - instead of using polyfill, we can exclude IE totally.\n if (!Globals.isMS) {\n const opts = Object.defineProperty({}, 'passive', {\n get: function () {\n supportsPassive = true;\n }\n });\n if (Globals.win.addEventListener && Globals.win.removeEventListener) {\n Globals.win.addEventListener('testPassive', Globals.noop, opts);\n Globals.win.removeEventListener('testPassive', Globals.noop, opts);\n }\n }\n return supportsPassive;\n }());\n /**\n * An array containing the current chart objects in the page. A chart's\n * position in the array is preserved throughout the page's lifetime. When\n * a chart is destroyed, the array item becomes `undefined`.\n *\n * @name Highcharts.charts\n * @type {Array}\n */\n Globals.charts = [];\n /**\n * A shared registry between all bundles to keep track of applied\n * compositions.\n * @private\n */\n Globals.composed = [];\n /**\n * A hook for defining additional date format specifiers. New\n * specifiers are defined as key-value pairs by using the\n * specifier as key, and a function which takes the timestamp as\n * value. This function returns the formatted portion of the\n * date.\n *\n * Using `dateFormats` is also a convenient way to define new keys for\n * complex locale-aware date formats compatible with the\n * [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat)\n * browser API, whenever the built-in formats are not sufficient.\n *\n * @sample highcharts/global/dateformats/\n * Adding support for week number\n * @sample highcharts/global/dateformats-object/\n * A locale-aware date format using `Intl.DateTimeFormat`\n *\n * @name Highcharts.dateFormats\n * @type {Record}\n */\n Globals.dateFormats = {};\n /**\n * @private\n * @deprecated\n * @todo Use only `Core/Series/SeriesRegistry.seriesTypes`\n */\n Globals.seriesTypes = {};\n /**\n * @private\n */\n Globals.symbolSizes = {};\n /* *\n *\n * Properties\n *\n * */\n // eslint-disable-next-line prefer-const\n Globals.chartCount = 0;\n})(Globals || (Globals = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Core_Globals = (Globals);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Theme options that should get applied to the chart. In module mode it\n * might not be possible to change this property because of read-only\n * restrictions, instead use {@link Highcharts.setOptions}.\n *\n * @deprecated\n * @name Highcharts.theme\n * @type {Highcharts.Options}\n */\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Utilities.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { charts, doc, win } = Core_Globals;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Provide error messages for debugging, with links to online explanation. This\n * function can be overridden to provide custom error handling.\n *\n * @sample highcharts/chart/highcharts-error/\n * Custom error handler\n *\n * @function Highcharts.error\n *\n * @param {number|string} code\n * The error code. See\n * [errors.xml](https://github.com/highcharts/highcharts/blob/master/errors/errors.xml)\n * for available codes. If it is a string, the error message is printed\n * directly in the console.\n *\n * @param {boolean} [stop=false]\n * Whether to throw an error or just log a warning in the console.\n *\n * @param {Highcharts.Chart} [chart]\n * Reference to the chart that causes the error. Used in 'debugger'\n * module to display errors directly on the chart.\n * Important note: This argument is undefined for errors that lack\n * access to the Chart instance. In such case, the error will be\n * displayed on the last created chart.\n *\n * @param {Highcharts.Dictionary} [params]\n * Additional parameters for the generated message.\n *\n * @return {void}\n */\nfunction error(code, stop, chart, params) {\n const severity = stop ? 'Highcharts error' : 'Highcharts warning';\n if (code === 32) {\n code = `${severity}: Deprecated member`;\n }\n const isCode = isNumber(code);\n let message = isCode ?\n `${severity} #${code}: www.highcharts.com/errors/${code}/` :\n code.toString();\n const defaultHandler = function () {\n if (stop) {\n throw new Error(message);\n }\n // Else ...\n if (win.console &&\n error.messages.indexOf(message) === -1 // Prevent console flooting\n ) {\n console.warn(message); // eslint-disable-line no-console\n }\n };\n if (typeof params !== 'undefined') {\n let additionalMessages = '';\n if (isCode) {\n message += '?';\n }\n objectEach(params, function (value, key) {\n additionalMessages += `\\n - ${key}: ${value}`;\n if (isCode) {\n message += encodeURI(key) + '=' + encodeURI(value);\n }\n });\n message += additionalMessages;\n }\n fireEvent(Core_Globals, 'displayError', { chart, code, message, params }, defaultHandler);\n error.messages.push(message);\n}\n(function (error) {\n error.messages = [];\n})(error || (error = {}));\n/**\n * Utility function to deep merge two or more objects and return a third object.\n * If the first argument is true, the contents of the second object is copied\n * into the first object. The merge function can also be used with a single\n * object argument to create a deep copy of an object.\n *\n * @function Highcharts.merge\n *\n * @param {true | T} extendOrSource\n * Whether to extend the left-side object,\n * or the first object to merge as a deep copy.\n *\n * @param {...Array} [sources]\n * Object(s) to merge into the previous one.\n *\n * @return {T}\n * The merged object. If the first argument is true, the return is the\n * same as the second argument.\n */\nfunction merge(extendOrSource, ...sources) {\n let i, args = [extendOrSource, ...sources], ret = {};\n const doCopy = function (copy, original) {\n // An object is replacing a primitive\n if (typeof copy !== 'object') {\n copy = {};\n }\n objectEach(original, function (value, key) {\n // Prototype pollution (#14883)\n if (key === '__proto__' || key === 'constructor') {\n return;\n }\n // Copy the contents of objects, but not arrays or DOM nodes\n if (isObject(value, true) &&\n !isClass(value) &&\n !isDOMElement(value)) {\n copy[key] = doCopy(copy[key] || {}, value);\n // Primitives and arrays are copied over directly\n }\n else {\n copy[key] = original[key];\n }\n });\n return copy;\n };\n // If first argument is true, copy into the existing object. Used in\n // setOptions.\n if (extendOrSource === true) {\n ret = args[1];\n args = Array.prototype.slice.call(args, 2);\n }\n // For each argument, extend the return\n const len = args.length;\n for (i = 0; i < len; i++) {\n ret = doCopy(ret, args[i]);\n }\n return ret;\n}\n/**\n * Constrain a value to within a lower and upper threshold.\n *\n * @private\n * @param {number} value The initial value\n * @param {number} min The lower threshold\n * @param {number} max The upper threshold\n * @return {number} Returns a number value within min and max.\n */\nfunction clamp(value, min, max) {\n return value > min ? value < max ? value : max : min;\n}\n/**\n * Utility for crisping a line position to the nearest full pixel depening on\n * the line width\n * @param {number} value The raw pixel position\n * @param {number} lineWidth The line width\n * @param {boolean} [inverted] Whether the containing group is inverted.\n * Crisping round numbers on the y-scale need to go\n * to the other side because the coordinate system\n * is flipped (scaleY is -1)\n * @return {number} The pixel position to use for a crisp display\n */\nfunction crisp(value, lineWidth = 0, inverted) {\n const mod = lineWidth % 2 / 2, inverter = inverted ? -1 : 1;\n return (Math.round(value * inverter - mod) + mod) * inverter;\n}\n// eslint-disable-next-line valid-jsdoc\n/**\n * Return the deep difference between two objects. It can either return the new\n * properties, or optionally return the old values of new properties.\n * @private\n */\nfunction diffObjects(newer, older, keepOlder, collectionsWithUpdate) {\n const ret = {};\n /**\n * Recurse over a set of options and its current values, and store the\n * current values in the ret object.\n */\n function diff(newer, older, ret, depth) {\n const keeper = keepOlder ? older : newer;\n objectEach(newer, function (newerVal, key) {\n if (!depth &&\n collectionsWithUpdate &&\n collectionsWithUpdate.indexOf(key) > -1 &&\n older[key]) {\n newerVal = splat(newerVal);\n ret[key] = [];\n // Iterate over collections like series, xAxis or yAxis and map\n // the items by index.\n for (let i = 0; i < Math.max(newerVal.length, older[key].length); i++) {\n // Item exists in current data (#6347)\n if (older[key][i]) {\n // If the item is missing from the new data, we need to\n // save the whole config structure. Like when\n // responsively updating from a dual axis layout to a\n // single axis and back (#13544).\n if (newerVal[i] === void 0) {\n ret[key][i] = older[key][i];\n // Otherwise, proceed\n }\n else {\n ret[key][i] = {};\n diff(newerVal[i], older[key][i], ret[key][i], depth + 1);\n }\n }\n }\n }\n else if (isObject(newerVal, true) &&\n !newerVal.nodeType // #10044\n ) {\n ret[key] = isArray(newerVal) ? [] : {};\n diff(newerVal, older[key] || {}, ret[key], depth + 1);\n // Delete empty nested objects\n if (Object.keys(ret[key]).length === 0 &&\n // Except colorAxis which is a special case where the empty\n // object means it is enabled. Which is unfortunate and we\n // should try to find a better way.\n !(key === 'colorAxis' && depth === 0)) {\n delete ret[key];\n }\n }\n else if (newer[key] !== older[key] ||\n // If the newer key is explicitly undefined, keep it (#10525)\n (key in newer && !(key in older))) {\n if (key !== '__proto__' && key !== 'constructor') {\n ret[key] = keeper[key];\n }\n }\n });\n }\n diff(newer, older, ret, 0);\n return ret;\n}\n/**\n * Shortcut for parseInt\n *\n * @private\n * @function Highcharts.pInt\n *\n * @param {*} s\n * any\n *\n * @param {number} [mag]\n * Magnitude\n *\n * @return {number}\n * number\n */\nfunction pInt(s, mag) {\n return parseInt(s, mag || 10);\n}\n/**\n * Utility function to check for string type.\n *\n * @function Highcharts.isString\n *\n * @param {*} s\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a string.\n */\nfunction isString(s) {\n return typeof s === 'string';\n}\n/**\n * Utility function to check if an item is an array.\n *\n * @function Highcharts.isArray\n *\n * @param {*} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is an array.\n */\nfunction isArray(obj) {\n const str = Object.prototype.toString.call(obj);\n return str === '[object Array]' || str === '[object Array Iterator]';\n}\n/**\n * Utility function to check if an item is of type object.\n *\n * @function Highcharts.isObject\n *\n * @param {*} obj\n * The item to check.\n *\n * @param {boolean} [strict=false]\n * Also checks that the object is not an array.\n *\n * @return {boolean}\n * True if the argument is an object.\n */\nfunction isObject(obj, strict) {\n return (!!obj &&\n typeof obj === 'object' &&\n (!strict || !isArray(obj))); // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n/**\n * Utility function to check if an Object is a HTML Element.\n *\n * @function Highcharts.isDOMElement\n *\n * @param {*} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a HTML Element.\n */\nfunction isDOMElement(obj) {\n return isObject(obj) && typeof obj.nodeType === 'number';\n}\n/**\n * Utility function to check if an Object is a class.\n *\n * @function Highcharts.isClass\n *\n * @param {object|undefined} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a class.\n */\nfunction isClass(obj) {\n const c = obj && obj.constructor;\n return !!(isObject(obj, true) &&\n !isDOMElement(obj) &&\n (c && c.name && c.name !== 'Object'));\n}\n/**\n * Utility function to check if an item is a number and it is finite (not NaN,\n * Infinity or -Infinity).\n *\n * @function Highcharts.isNumber\n *\n * @param {*} n\n * The item to check.\n *\n * @return {boolean}\n * True if the item is a finite number\n */\nfunction isNumber(n) {\n return typeof n === 'number' && !isNaN(n) && n < Infinity && n > -Infinity;\n}\n/**\n * Remove the last occurence of an item from an array.\n *\n * @function Highcharts.erase\n *\n * @param {Array<*>} arr\n * The array.\n *\n * @param {*} item\n * The item to remove.\n *\n * @return {void}\n */\nfunction erase(arr, item) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === item) {\n arr.splice(i, 1);\n break;\n }\n }\n}\n/**\n * Insert a series or an axis in a collection with other items, either the\n * chart series or yAxis series or axis collections, in the correct order\n * according to the index option and whether it is internal. Used internally\n * when adding series and axes.\n *\n * @private\n * @function Highcharts.Chart#insertItem\n * @param {Highcharts.Series|Highcharts.Axis} item\n * The item to insert\n * @param {Array|Array} collection\n * A collection of items, like `chart.series` or `xAxis.series`.\n * @return {number} The index of the series in the collection.\n */\nfunction insertItem(item, collection) {\n const indexOption = item.options.index, length = collection.length;\n let i;\n for (\n // Internal item (navigator) should always be pushed to the end\n i = item.options.isInternal ? length : 0; i < length + 1; i++) {\n if (\n // No index option, reached the end of the collection,\n // equivalent to pushing\n !collection[i] ||\n // Handle index option, the element to insert has lower index\n (isNumber(indexOption) &&\n indexOption < pick(collection[i].options.index, collection[i]._i)) ||\n // Insert the new item before other internal items\n // (navigator)\n collection[i].options.isInternal) {\n collection.splice(i, 0, item);\n break;\n }\n }\n return i;\n}\n/**\n * Adds an item to an array, if it is not present in the array.\n *\n * @function Highcharts.pushUnique\n *\n * @param {Array} array\n * The array to add the item to.\n *\n * @param {unknown} item\n * The item to add.\n *\n * @return {boolean}\n * Returns true, if the item was not present and has been added.\n */\nfunction pushUnique(array, item) {\n return array.indexOf(item) < 0 && !!array.push(item);\n}\n/**\n * Check if an object is null or undefined.\n *\n * @function Highcharts.defined\n *\n * @param {*} obj\n * The object to check.\n *\n * @return {boolean}\n * False if the object is null or undefined, otherwise true.\n */\nfunction defined(obj) {\n return typeof obj !== 'undefined' && obj !== null;\n}\n/**\n * Set or get an attribute or an object of attributes.\n *\n * To use as a setter, pass a key and a value, or let the second argument be a\n * collection of keys and values. When using a collection, passing a value of\n * `null` or `undefined` will remove the attribute.\n *\n * To use as a getter, pass only a string as the second argument.\n *\n * @function Highcharts.attr\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} elem\n * The DOM element to receive the attribute(s).\n *\n * @param {string|Highcharts.HTMLAttributes|Highcharts.SVGAttributes} [keyOrAttribs]\n * The property or an object of key-value pairs.\n *\n * @param {number|string} [value]\n * The value if a single property is set.\n *\n * @return {string|null|undefined}\n * When used as a getter, return the value.\n */\nfunction attr(elem, keyOrAttribs, value) {\n const isGetter = isString(keyOrAttribs) && !defined(value);\n let ret;\n const attrSingle = (value, key) => {\n // Set the value\n if (defined(value)) {\n elem.setAttribute(key, value);\n // Get the value\n }\n else if (isGetter) {\n ret = elem.getAttribute(key);\n // IE7 and below cannot get class through getAttribute (#7850)\n if (!ret && key === 'class') {\n ret = elem.getAttribute(key + 'Name');\n }\n // Remove the value\n }\n else {\n elem.removeAttribute(key);\n }\n };\n // If keyOrAttribs is a string\n if (isString(keyOrAttribs)) {\n attrSingle(value, keyOrAttribs);\n // Else if keyOrAttribs is defined, it is a hash of key/value pairs\n }\n else {\n objectEach(keyOrAttribs, attrSingle);\n }\n return ret;\n}\n/**\n * Check if an element is an array, and if not, make it into an array.\n *\n * @function Highcharts.splat\n *\n * @param {*} obj\n * The object to splat.\n *\n * @return {Array}\n * The produced or original array.\n */\nfunction splat(obj) {\n return isArray(obj) ? obj : [obj];\n}\n/**\n * Set a timeout if the delay is given, otherwise perform the function\n * synchronously.\n *\n * @function Highcharts.syncTimeout\n *\n * @param {Function} fn\n * The function callback.\n *\n * @param {number} delay\n * Delay in milliseconds.\n *\n * @param {*} [context]\n * An optional context to send to the function callback.\n *\n * @return {number}\n * An identifier for the timeout that can later be cleared with\n * Highcharts.clearTimeout. Returns -1 if there is no timeout.\n */\nfunction syncTimeout(fn, delay, context) {\n if (delay > 0) {\n return setTimeout(fn, delay, context);\n }\n fn.call(0, context);\n return -1;\n}\n/**\n * Internal clear timeout. The function checks that the `id` was not removed\n * (e.g. by `chart.destroy()`). For the details see\n * [issue #7901](https://github.com/highcharts/highcharts/issues/7901).\n *\n * @function Highcharts.clearTimeout\n *\n * @param {number|undefined} id\n * Id of a timeout.\n */\nfunction internalClearTimeout(id) {\n if (defined(id)) {\n clearTimeout(id);\n }\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Utility function to extend an object with the members of another.\n *\n * @function Highcharts.extend\n *\n * @param {T|undefined} a\n * The object to be extended.\n *\n * @param {Partial} b\n * The object to add to the first one.\n *\n * @return {T}\n * Object a, the original object.\n */\nfunction extend(a, b) {\n /* eslint-enable valid-jsdoc */\n let n;\n if (!a) {\n a = {};\n }\n for (n in b) { // eslint-disable-line guard-for-in\n a[n] = b[n];\n }\n return a;\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Return the first value that is not null or undefined.\n *\n * @function Highcharts.pick\n *\n * @param {...Array} items\n * Variable number of arguments to inspect.\n *\n * @return {T}\n * The value of the first argument that is not null or undefined.\n */\nfunction pick() {\n const args = arguments;\n const length = args.length;\n for (let i = 0; i < length; i++) {\n const arg = args[i];\n if (typeof arg !== 'undefined' && arg !== null) {\n return arg;\n }\n }\n}\n/**\n * Set CSS on a given element.\n *\n * @function Highcharts.css\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} el\n * An HTML DOM element.\n *\n * @param {Highcharts.CSSObject} styles\n * Style object with camel case property names.\n *\n * @return {void}\n */\nfunction css(el, styles) {\n extend(el.style, styles);\n}\n/**\n * Utility function to create an HTML element with attributes and styles.\n *\n * @function Highcharts.createElement\n *\n * @param {string} tag\n * The HTML tag.\n *\n * @param {Highcharts.HTMLAttributes} [attribs]\n * Attributes as an object of key-value pairs.\n *\n * @param {Highcharts.CSSObject} [styles]\n * Styles as an object of key-value pairs.\n *\n * @param {Highcharts.HTMLDOMElement} [parent]\n * The parent HTML object.\n *\n * @param {boolean} [nopad=false]\n * If true, remove all padding, border and margin.\n *\n * @return {Highcharts.HTMLDOMElement}\n * The created DOM element.\n */\nfunction createElement(tag, attribs, styles, parent, nopad) {\n const el = doc.createElement(tag);\n if (attribs) {\n extend(el, attribs);\n }\n if (nopad) {\n css(el, { padding: '0', border: 'none', margin: '0' });\n }\n if (styles) {\n css(el, styles);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n}\n// eslint-disable-next-line valid-jsdoc\n/**\n * Extend a prototyped class by new members.\n *\n * @deprecated\n * @function Highcharts.extendClass\n *\n * @param {Highcharts.Class} parent\n * The parent prototype to inherit.\n *\n * @param {Highcharts.Dictionary<*>} members\n * A collection of prototype members to add or override compared to the\n * parent prototype.\n *\n * @return {Highcharts.Class}\n * A new prototype.\n */\nfunction extendClass(parent, members) {\n const obj = (function () { });\n obj.prototype = new parent(); // eslint-disable-line new-cap\n extend(obj.prototype, members);\n return obj;\n}\n/**\n * Left-pad a string to a given length by adding a character repetitively.\n *\n * @function Highcharts.pad\n *\n * @param {number} number\n * The input string or number.\n *\n * @param {number} [length]\n * The desired string length.\n *\n * @param {string} [padder=0]\n * The character to pad with.\n *\n * @return {string}\n * The padded string.\n */\nfunction pad(number, length, padder) {\n return new Array((length || 2) +\n 1 -\n String(number)\n .replace('-', '')\n .length).join(padder || '0') + number;\n}\n/**\n * Return a length based on either the integer value, or a percentage of a base.\n *\n * @function Highcharts.relativeLength\n *\n * @param {Highcharts.RelativeSize} value\n * A percentage string or a number.\n *\n * @param {number} base\n * The full length that represents 100%.\n *\n * @param {number} [offset=0]\n * A pixel offset to apply for percentage values. Used internally in\n * axis positioning.\n *\n * @return {number}\n * The computed length.\n */\nfunction relativeLength(value, base, offset) {\n return (/%$/).test(value) ?\n (base * parseFloat(value) / 100) + (offset || 0) :\n parseFloat(value);\n}\n/**\n * Replaces text in a string with a given replacement in a loop to catch nested\n * matches after previous replacements.\n *\n * @function Highcharts.replaceNested\n *\n * @param {string} text\n * Text to search and modify.\n *\n * @param {...Array<(RegExp|string)>} replacements\n * One or multiple tuples with search pattern (`[0]: (string|RegExp)`) and\n * replacement (`[1]: string`) for matching text.\n *\n * @return {string}\n * Text with replacements.\n */\nfunction replaceNested(text, ...replacements) {\n let previous, replacement;\n do {\n previous = text;\n for (replacement of replacements) {\n text = text.replace(replacement[0], replacement[1]);\n }\n } while (text !== previous);\n return text;\n}\n/**\n * Wrap a method with extended functionality, preserving the original function.\n *\n * @function Highcharts.wrap\n *\n * @param {*} obj\n * The context object that the method belongs to. In real cases, this is\n * often a prototype.\n *\n * @param {string} method\n * The name of the method to extend.\n *\n * @param {Highcharts.WrapProceedFunction} func\n * A wrapper function callback. This function is called with the same\n * arguments as the original function, except that the original function\n * is unshifted and passed as the first argument.\n */\nfunction wrap(obj, method, func) {\n const proceed = obj[method];\n obj[method] = function () {\n const outerArgs = arguments, scope = this;\n return func.apply(this, [\n function () {\n return proceed.apply(scope, arguments.length ? arguments : outerArgs);\n }\n ].concat([].slice.call(arguments)));\n };\n}\n/**\n * Get the magnitude of a number.\n *\n * @function Highcharts.getMagnitude\n *\n * @param {number} num\n * The number.\n *\n * @return {number}\n * The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2 etc.\n */\nfunction getMagnitude(num) {\n return Math.pow(10, Math.floor(Math.log(num) / Math.LN10));\n}\n/**\n * Take an interval and normalize it to multiples of round numbers.\n *\n * @deprecated\n * @function Highcharts.normalizeTickInterval\n *\n * @param {number} interval\n * The raw, un-rounded interval.\n *\n * @param {Array<*>} [multiples]\n * Allowed multiples.\n *\n * @param {number} [magnitude]\n * The magnitude of the number.\n *\n * @param {boolean} [allowDecimals]\n * Whether to allow decimals.\n *\n * @param {boolean} [hasTickAmount]\n * If it has tickAmount, avoid landing on tick intervals lower than\n * original.\n *\n * @return {number}\n * The normalized interval.\n *\n * @todo\n * Move this function to the Axis prototype. It is here only for historical\n * reasons.\n */\nfunction normalizeTickInterval(interval, multiples, magnitude, allowDecimals, hasTickAmount) {\n let i, retInterval = interval;\n // Round to a tenfold of 1, 2, 2.5 or 5\n magnitude = pick(magnitude, getMagnitude(interval));\n const normalized = interval / magnitude;\n // Multiples for a linear scale\n if (!multiples) {\n multiples = hasTickAmount ?\n // Finer grained ticks when the tick amount is hard set, including\n // when alignTicks is true on multiple axes (#4580).\n [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n // Else, let ticks fall on rounder numbers\n [1, 2, 2.5, 5, 10];\n // The allowDecimals option\n if (allowDecimals === false) {\n if (magnitude === 1) {\n multiples = multiples.filter(function (num) {\n return num % 1 === 0;\n });\n }\n else if (magnitude <= 0.1) {\n multiples = [1 / magnitude];\n }\n }\n }\n // Normalize the interval to the nearest multiple\n for (i = 0; i < multiples.length; i++) {\n retInterval = multiples[i];\n // Only allow tick amounts smaller than natural\n if ((hasTickAmount &&\n retInterval * magnitude >= interval) ||\n (!hasTickAmount &&\n (normalized <=\n (multiples[i] +\n (multiples[i + 1] || multiples[i])) / 2))) {\n break;\n }\n }\n // Multiply back to the correct magnitude. Correct floats to appropriate\n // precision (#6085).\n retInterval = correctFloat(retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10));\n return retInterval;\n}\n/**\n * Sort an object array and keep the order of equal items. The ECMAScript\n * standard does not specify the behaviour when items are equal.\n *\n * @function Highcharts.stableSort\n *\n * @param {Array<*>} arr\n * The array to sort.\n *\n * @param {Function} sortFunction\n * The function to sort it with, like with regular Array.prototype.sort.\n */\nfunction stableSort(arr, sortFunction) {\n // @todo It seems like Chrome since v70 sorts in a stable way internally,\n // plus all other browsers do it, so over time we may be able to remove this\n // function\n const length = arr.length;\n let sortValue, i;\n // Add index to each item\n for (i = 0; i < length; i++) {\n arr[i].safeI = i; // Stable sort index\n }\n arr.sort(function (a, b) {\n sortValue = sortFunction(a, b);\n return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n });\n // Remove index from items\n for (i = 0; i < length; i++) {\n delete arr[i].safeI; // Stable sort index\n }\n}\n/**\n * Non-recursive method to find the lowest member of an array. `Math.min` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function Highcharts.arrayMin\n *\n * @param {Array<*>} data\n * An array of numbers.\n *\n * @return {number}\n * The lowest number.\n */\nfunction arrayMin(data) {\n let i = data.length, min = data[0];\n while (i--) {\n if (data[i] < min) {\n min = data[i];\n }\n }\n return min;\n}\n/**\n * Non-recursive method to find the lowest member of an array. `Math.max` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function Highcharts.arrayMax\n *\n * @param {Array<*>} data\n * An array of numbers.\n *\n * @return {number}\n * The highest number.\n */\nfunction arrayMax(data) {\n let i = data.length, max = data[0];\n while (i--) {\n if (data[i] > max) {\n max = data[i];\n }\n }\n return max;\n}\n/**\n * Utility method that destroys any SVGElement instances that are properties on\n * the given object. It loops all properties and invokes destroy if there is a\n * destroy method. The property is then delete.\n *\n * @function Highcharts.destroyObjectProperties\n *\n * @param {*} obj\n * The object to destroy properties on.\n *\n * @param {*} [except]\n * Exception, do not destroy this property, only delete it.\n */\nfunction destroyObjectProperties(obj, except, destructablesOnly) {\n objectEach(obj, function (val, n) {\n // If the object is non-null and destroy is defined\n if (val !== except && val?.destroy) {\n // Invoke the destroy\n val.destroy();\n }\n // Delete the property from the object\n if (val?.destroy || !destructablesOnly) {\n delete obj[n];\n }\n });\n}\n/**\n * Discard a HTML element\n *\n * @function Highcharts.discardElement\n *\n * @param {Highcharts.HTMLDOMElement} element\n * The HTML node to discard.\n */\nfunction discardElement(element) {\n if (element && element.parentElement) {\n element.parentElement.removeChild(element);\n }\n}\n/**\n * Fix JS round off float errors.\n *\n * @function Highcharts.correctFloat\n *\n * @param {number} num\n * A float number to fix.\n *\n * @param {number} [prec=14]\n * The precision.\n *\n * @return {number}\n * The corrected float number.\n */\nfunction correctFloat(num, prec) {\n // When the number is higher than 1e14 use the number (#16275)\n return num > 1e14 ? num : parseFloat(num.toPrecision(prec || 14));\n}\n/**\n * The time unit lookup\n *\n * @ignore\n */\nconst timeUnits = {\n millisecond: 1,\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 24 * 3600000,\n week: 7 * 24 * 3600000,\n month: 28 * 24 * 3600000,\n year: 364 * 24 * 3600000\n};\n/**\n * Easing definition\n *\n * @private\n * @function Math.easeInOutSine\n *\n * @param {number} pos\n * Current position, ranging from 0 to 1.\n *\n * @return {number}\n * Ease result\n */\nMath.easeInOutSine = function (pos) {\n return -0.5 * (Math.cos(Math.PI * pos) - 1);\n};\n/**\n * Convenience function to get the align factor, used several places for\n * computing positions\n * @private\n */\nconst getAlignFactor = (align = '') => ({\n center: 0.5,\n right: 1,\n middle: 0.5,\n bottom: 1\n}[align] || 0);\n/**\n * Find the closest distance between two values of a two-dimensional array\n * @private\n * @function Highcharts.getClosestDistance\n *\n * @param {Array>} arrays\n * An array of arrays of numbers\n *\n * @return {number | undefined}\n * The closest distance between values\n */\nfunction getClosestDistance(arrays, onError) {\n const allowNegative = !onError;\n let closest, loopLength, distance, i;\n arrays.forEach((xData) => {\n if (xData.length > 1) {\n loopLength = xData.length - 1;\n for (i = loopLength; i > 0; i--) {\n distance = xData[i] - xData[i - 1];\n if (distance < 0 && !allowNegative) {\n onError?.();\n // Only one call\n onError = void 0;\n }\n else if (distance && (typeof closest === 'undefined' || distance < closest)) {\n closest = distance;\n }\n }\n }\n });\n return closest;\n}\n/**\n * Returns the value of a property path on a given object.\n *\n * @private\n * @function getNestedProperty\n *\n * @param {string} path\n * Path to the property, for example `custom.myValue`.\n *\n * @param {unknown} obj\n * Instance containing the property on the specific path.\n *\n * @return {unknown}\n * The unknown property value.\n */\nfunction getNestedProperty(path, parent) {\n const pathElements = path.split('.');\n while (pathElements.length && defined(parent)) {\n const pathElement = pathElements.shift();\n // Filter on the key\n if (typeof pathElement === 'undefined' ||\n pathElement === '__proto__') {\n return; // Undefined\n }\n if (pathElement === 'this') {\n let thisProp;\n if (isObject(parent)) {\n thisProp = parent['@this'];\n }\n return thisProp ?? parent;\n }\n const child = parent[pathElement.replace(/[\\\\'\"]/g, '')];\n // Filter on the child\n if (!defined(child) ||\n typeof child === 'function' ||\n typeof child.nodeType === 'number' ||\n child === win) {\n return; // Undefined\n }\n // Else, proceed\n parent = child;\n }\n return parent;\n}\n/**\n * Get the computed CSS value for given element and property, only for numerical\n * properties. For width and height, the dimension of the inner box (excluding\n * padding) is returned. Used for fitting the chart within the container.\n *\n * @function Highcharts.getStyle\n *\n * @param {Highcharts.HTMLDOMElement} el\n * An HTML element.\n *\n * @param {string} prop\n * The property name.\n *\n * @param {boolean} [toInt=true]\n * Parse to integer.\n *\n * @return {number|string|undefined}\n * The style value.\n */\nfunction getStyle(el, prop, toInt) {\n let style;\n // For width and height, return the actual inner pixel size (#4913)\n if (prop === 'width') {\n let offsetWidth = Math.min(el.offsetWidth, el.scrollWidth);\n // In flex boxes, we need to use getBoundingClientRect and floor it,\n // because scrollWidth doesn't support subpixel precision (#6427) ...\n const boundingClientRectWidth = el.getBoundingClientRect &&\n el.getBoundingClientRect().width;\n // ...unless if the containing div or its parents are transform-scaled\n // down, in which case the boundingClientRect can't be used as it is\n // also scaled down (#9871, #10498).\n if (boundingClientRectWidth < offsetWidth &&\n boundingClientRectWidth >= offsetWidth - 1) {\n offsetWidth = Math.floor(boundingClientRectWidth);\n }\n return Math.max(0, // #8377\n (offsetWidth -\n (getStyle(el, 'padding-left', true) || 0) -\n (getStyle(el, 'padding-right', true) || 0)));\n }\n if (prop === 'height') {\n return Math.max(0, // #8377\n (Math.min(el.offsetHeight, el.scrollHeight) -\n (getStyle(el, 'padding-top', true) || 0) -\n (getStyle(el, 'padding-bottom', true) || 0)));\n }\n // Otherwise, get the computed style\n const css = win.getComputedStyle(el, void 0); // eslint-disable-line no-undefined\n if (css) {\n style = css.getPropertyValue(prop);\n if (pick(toInt, prop !== 'opacity')) {\n style = pInt(style);\n }\n }\n return style;\n}\n/**\n * Return the value of the first element in the array that satisfies the\n * provided testing function.\n *\n * @function Highcharts.find\n *\n * @param {Array} arr\n * The array to test.\n *\n * @param {Function} callback\n * The callback function. The function receives the item as the first\n * argument. Return `true` if this item satisfies the condition.\n *\n * @return {T|undefined}\n * The value of the element.\n */\nconst find = Array.prototype.find ?\n function (arr, callback) {\n return arr.find(callback);\n } :\n // Legacy implementation. PhantomJS, IE <= 11 etc. #7223.\n function (arr, callback) {\n let i;\n const length = arr.length;\n for (i = 0; i < length; i++) {\n if (callback(arr[i], i)) { // eslint-disable-line node/callback-return\n return arr[i];\n }\n }\n };\n/**\n * Get the element's offset position, corrected for `overflow: auto`.\n *\n * @function Highcharts.offset\n *\n * @param {global.Element} el\n * The DOM element.\n *\n * @return {Highcharts.OffsetObject}\n * An object containing `left` and `top` properties for the position in\n * the page.\n */\nfunction offset(el) {\n const docElem = doc.documentElement, box = (el.parentElement || el.parentNode) ?\n el.getBoundingClientRect() :\n { top: 0, left: 0, width: 0, height: 0 };\n return {\n top: box.top + (win.pageYOffset || docElem.scrollTop) -\n (docElem.clientTop || 0),\n left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n (docElem.clientLeft || 0),\n width: box.width,\n height: box.height\n };\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Iterate over object key pairs in an object.\n *\n * @function Highcharts.objectEach\n *\n * @param {*} obj\n * The object to iterate over.\n *\n * @param {Highcharts.ObjectEachCallbackFunction} fn\n * The iterator callback. It passes three arguments:\n * * value - The property value.\n * * key - The property key.\n * * obj - The object that objectEach is being applied to.\n *\n * @param {T} [ctx]\n * The context.\n */\nfunction objectEach(obj, fn, ctx) {\n /* eslint-enable valid-jsdoc */\n for (const key in obj) {\n if (Object.hasOwnProperty.call(obj, key)) {\n fn.call(ctx || obj[key], obj[key], key, obj);\n }\n }\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Add an event listener.\n *\n * @function Highcharts.addEvent\n *\n * @param {Highcharts.Class|T} el\n * The element or object to add a listener to. It can be a\n * {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n *\n * @param {string} type\n * The event type.\n *\n * @param {Highcharts.EventCallbackFunction|Function} fn\n * The function callback to execute when the event is fired.\n *\n * @param {Highcharts.EventOptionsObject} [options]\n * Options for adding the event.\n *\n * @sample highcharts/members/addevent\n * Use a general `render` event to draw shapes on a chart\n *\n * @return {Function}\n * A callback function to remove the added event.\n */\nfunction addEvent(el, type, fn, options = {}) {\n /* eslint-enable valid-jsdoc */\n // Add hcEvents to either the prototype (in case we're running addEvent on a\n // class) or the instance. If hasOwnProperty('hcEvents') is false, it is\n // inherited down the prototype chain, in which case we need to set the\n // property on this instance (which may itself be a prototype).\n const owner = typeof el === 'function' && el.prototype || el;\n if (!Object.hasOwnProperty.call(owner, 'hcEvents')) {\n owner.hcEvents = {};\n }\n const events = owner.hcEvents;\n // Allow click events added to points, otherwise they will be prevented by\n // the TouchPointer.pinch function after a pinch zoom operation (#7091).\n if (Core_Globals.Point && // Without H a dependency loop occurs\n el instanceof Core_Globals.Point &&\n el.series &&\n el.series.chart) {\n el.series.chart.runTrackerClick = true;\n }\n // Handle DOM events\n // If the browser supports passive events, add it to improve performance\n // on touch events (#11353).\n const addEventListener = el.addEventListener;\n if (addEventListener) {\n addEventListener.call(el, type, fn, Core_Globals.supportsPassiveEvents ? {\n passive: options.passive === void 0 ?\n type.indexOf('touch') !== -1 : options.passive,\n capture: false\n } : false);\n }\n if (!events[type]) {\n events[type] = [];\n }\n const eventObject = {\n fn,\n order: typeof options.order === 'number' ? options.order : Infinity\n };\n events[type].push(eventObject);\n // Order the calls\n events[type].sort((a, b) => a.order - b.order);\n // Return a function that can be called to remove this event.\n return function () {\n removeEvent(el, type, fn);\n };\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Remove an event that was added with {@link Highcharts#addEvent}.\n *\n * @function Highcharts.removeEvent\n *\n * @param {Highcharts.Class|T} el\n * The element to remove events on.\n *\n * @param {string} [type]\n * The type of events to remove. If undefined, all events are removed\n * from the element.\n *\n * @param {Highcharts.EventCallbackFunction} [fn]\n * The specific callback to remove. If undefined, all events that match\n * the element and optionally the type are removed.\n *\n * @return {void}\n */\nfunction removeEvent(el, type, fn) {\n /* eslint-enable valid-jsdoc */\n /**\n * @private\n */\n function removeOneEvent(type, fn) {\n const removeEventListener = el.removeEventListener;\n if (removeEventListener) {\n removeEventListener.call(el, type, fn, false);\n }\n }\n /**\n * @private\n */\n function removeAllEvents(eventCollection) {\n let types, len;\n if (!el.nodeName) {\n return; // Break on non-DOM events\n }\n if (type) {\n types = {};\n types[type] = true;\n }\n else {\n types = eventCollection;\n }\n objectEach(types, function (_val, n) {\n if (eventCollection[n]) {\n len = eventCollection[n].length;\n while (len--) {\n removeOneEvent(n, eventCollection[n][len].fn);\n }\n }\n });\n }\n const owner = typeof el === 'function' && el.prototype || el;\n if (Object.hasOwnProperty.call(owner, 'hcEvents')) {\n const events = owner.hcEvents;\n if (type) {\n const typeEvents = (events[type] || []);\n if (fn) {\n events[type] = typeEvents.filter(function (obj) {\n return fn !== obj.fn;\n });\n removeOneEvent(type, fn);\n }\n else {\n removeAllEvents(events);\n events[type] = [];\n }\n }\n else {\n removeAllEvents(events);\n delete owner.hcEvents;\n }\n }\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Fire an event that was registered with {@link Highcharts#addEvent}.\n *\n * @function Highcharts.fireEvent\n *\n * @param {T} el\n * The object to fire the event on. It can be a {@link HTMLDOMElement},\n * an {@link SVGElement} or any other object.\n *\n * @param {string} type\n * The type of event.\n *\n * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n * Custom event arguments that are passed on as an argument to the event\n * handler.\n *\n * @param {Highcharts.EventCallbackFunction|Function} [defaultFunction]\n * The default function to execute if the other listeners haven't\n * returned false.\n *\n * @return {void}\n */\nfunction fireEvent(el, type, eventArguments, defaultFunction) {\n /* eslint-enable valid-jsdoc */\n eventArguments = eventArguments || {};\n if (doc.createEvent &&\n (el.dispatchEvent ||\n (el.fireEvent &&\n // Enable firing events on Highcharts instance.\n el !== Core_Globals))) {\n const e = doc.createEvent('Events');\n e.initEvent(type, true, true);\n eventArguments = extend(e, eventArguments);\n if (el.dispatchEvent) {\n el.dispatchEvent(eventArguments);\n }\n else {\n el.fireEvent(type, eventArguments);\n }\n }\n else if (el.hcEvents) {\n if (!eventArguments.target) {\n // We're running a custom event\n extend(eventArguments, {\n // Attach a simple preventDefault function to skip\n // default handler if called. The built-in\n // defaultPrevented property is not overwritable (#5112)\n preventDefault: function () {\n eventArguments.defaultPrevented = true;\n },\n // Setting target to native events fails with clicking\n // the zoom-out button in Chrome.\n target: el,\n // If the type is not set, we're running a custom event\n // (#2297). If it is set, we're running a browser event.\n type: type\n });\n }\n const events = [];\n let object = el;\n let multilevel = false;\n // Recurse up the inheritance chain and collect hcEvents set as own\n // objects on the prototypes.\n while (object.hcEvents) {\n if (Object.hasOwnProperty.call(object, 'hcEvents') &&\n object.hcEvents[type]) {\n if (events.length) {\n multilevel = true;\n }\n events.unshift.apply(events, object.hcEvents[type]);\n }\n object = Object.getPrototypeOf(object);\n }\n // For performance reasons, only sort the event handlers in case we are\n // dealing with multiple levels in the prototype chain. Otherwise, the\n // events are already sorted in the addEvent function.\n if (multilevel) {\n // Order the calls\n events.sort((a, b) => a.order - b.order);\n }\n // Call the collected event handlers\n events.forEach((obj) => {\n // If the event handler returns false, prevent the default handler\n // from executing\n if (obj.fn.call(el, eventArguments) === false) {\n eventArguments.preventDefault();\n }\n });\n }\n // Run the default if not prevented\n if (defaultFunction && !eventArguments.defaultPrevented) {\n defaultFunction.call(el, eventArguments);\n }\n}\nlet serialMode;\n/**\n * Get a unique key for using in internal element id's and pointers. The key is\n * composed of a random hash specific to this Highcharts instance, and a\n * counter.\n *\n * @example\n * let id = uniqueKey(); // => 'highcharts-x45f6hp-0'\n *\n * @function Highcharts.uniqueKey\n *\n * @return {string}\n * A unique key.\n */\nconst uniqueKey = (function () {\n const hash = Math.random().toString(36).substring(2, 9) + '-';\n let id = 0;\n return function () {\n return 'highcharts-' + (serialMode ? '' : hash) + id++;\n };\n}());\n/**\n * Activates a serial mode for element IDs provided by\n * {@link Highcharts.uniqueKey}. This mode can be used in automated tests, where\n * a simple comparison of two rendered SVG graphics is needed.\n *\n * **Note:** This is only for testing purposes and will break functionality in\n * webpages with multiple charts.\n *\n * @example\n * if (\n * process &&\n * process.env.NODE_ENV === 'development'\n * ) {\n * Highcharts.useSerialIds(true);\n * }\n *\n * @function Highcharts.useSerialIds\n *\n * @param {boolean} [mode]\n * Changes the state of serial mode.\n *\n * @return {boolean|undefined}\n * State of the serial mode.\n */\nfunction useSerialIds(mode) {\n return (serialMode = pick(mode, serialMode));\n}\nfunction isFunction(obj) {\n return typeof obj === 'function';\n}\nfunction ucfirst(s) {\n return ((isString(s) ?\n s.substring(0, 1).toUpperCase() + s.substring(1) :\n String(s)));\n}\n/* *\n *\n * External\n *\n * */\n// Register Highcharts as a plugin in jQuery\nif (win.jQuery) {\n /**\n * Highcharts-extended JQuery.\n *\n * @external JQuery\n */\n /**\n * Helper function to return the chart of the current JQuery selector\n * element.\n *\n * @function external:JQuery#highcharts\n *\n * @return {Highcharts.Chart}\n * The chart that is linked to the JQuery selector element.\n */ /**\n * Factory function to create a chart in the current JQuery selector\n * element.\n *\n * @function external:JQuery#highcharts\n *\n * @param {'Chart'|'Map'|'StockChart'|string} [className]\n * Name of the factory class in the Highcharts namespace.\n *\n * @param {Highcharts.Options} [options]\n * The chart options structure.\n *\n * @param {Highcharts.ChartCallbackFunction} [callback]\n * Function to run when the chart has loaded and all external\n * images are loaded. Defining a\n * [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n * handler is equivalent.\n *\n * @return {JQuery}\n * The current JQuery selector.\n */\n win.jQuery.fn.highcharts = function () {\n const args = [].slice.call(arguments);\n if (this[0]) { // `this[0]` is the renderTo div\n // Create the chart\n if (args[0]) {\n new Core_Globals[ // eslint-disable-line computed-property-spacing, no-new\n // Constructor defaults to Chart\n isString(args[0]) ? args.shift() : 'Chart'](this[0], args[0], args[1]);\n return this;\n }\n // When called without parameters or with the return argument,\n // return an existing chart\n return charts[attr(this[0], 'data-highcharts-chart')];\n }\n };\n}\n/* *\n *\n * Default Export\n *\n * */\n// TODO use named exports when supported.\nconst Utilities = {\n addEvent,\n arrayMax,\n arrayMin,\n attr,\n clamp,\n clearTimeout: internalClearTimeout,\n correctFloat,\n createElement,\n crisp,\n css,\n defined,\n destroyObjectProperties,\n diffObjects,\n discardElement,\n erase,\n error,\n extend,\n extendClass,\n find,\n fireEvent,\n getAlignFactor,\n getClosestDistance,\n getMagnitude,\n getNestedProperty,\n getStyle,\n insertItem,\n isArray,\n isClass,\n isDOMElement,\n isFunction,\n isNumber,\n isObject,\n isString,\n merge,\n normalizeTickInterval,\n objectEach,\n offset,\n pad,\n pick,\n pInt,\n pushUnique,\n relativeLength,\n removeEvent,\n replaceNested,\n splat,\n stableSort,\n syncTimeout,\n timeUnits,\n ucfirst,\n uniqueKey,\n useSerialIds,\n wrap\n};\n/* harmony default export */ const Core_Utilities = (Utilities);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * An animation configuration. Animation configurations can also be defined as\n * booleans, where `false` turns off animation and `true` defaults to a duration\n * of 500ms and defer of 0ms.\n *\n * @interface Highcharts.AnimationOptionsObject\n */ /**\n* A callback function to execute when the animation finishes.\n* @name Highcharts.AnimationOptionsObject#complete\n* @type {Function|undefined}\n*/ /**\n* The animation defer in milliseconds.\n* @name Highcharts.AnimationOptionsObject#defer\n* @type {number|undefined}\n*/ /**\n* The animation duration in milliseconds.\n* @name Highcharts.AnimationOptionsObject#duration\n* @type {number|undefined}\n*/ /**\n* The name of an easing function as defined on the `Math` object.\n* @name Highcharts.AnimationOptionsObject#easing\n* @type {string|Function|undefined}\n*/ /**\n* A callback function to execute on each step of each attribute or CSS property\n* that's being animated. The first argument contains information about the\n* animation and progress.\n* @name Highcharts.AnimationOptionsObject#step\n* @type {Function|undefined}\n*/\n/**\n * Creates a frame for the animated SVG element.\n *\n * @callback Highcharts.AnimationStepCallbackFunction\n *\n * @param {Highcharts.SVGElement} this\n * The SVG element to animate.\n *\n * @return {void}\n */\n/**\n * Interface description for a class.\n *\n * @interface Highcharts.Class\n * @extends Function\n */ /**\n* Class constructor.\n* @function Highcharts.Class#new\n* @param {...Array<*>} args\n* Constructor arguments.\n* @return {T}\n* Class instance.\n*/\n/**\n * A style object with camel case property names to define visual appearance of\n * a SVG element or HTML element. The properties can be whatever styles are\n * supported on the given SVG or HTML element.\n *\n * @example\n * {\n * fontFamily: 'monospace',\n * fontSize: '1.2em'\n * }\n *\n * @interface Highcharts.CSSObject\n */ /**\n* @name Highcharts.CSSObject#[key:string]\n* @type {boolean|number|string|undefined}\n*/ /**\n* Background style for the element.\n* @name Highcharts.CSSObject#background\n* @type {string|undefined}\n*/ /**\n* Background color of the element.\n* @name Highcharts.CSSObject#backgroundColor\n* @type {Highcharts.ColorString|undefined}\n*/ /**\n* Border style for the element.\n* @name Highcharts.CSSObject#border\n* @type {string|undefined}\n*/ /**\n* Radius of the element border.\n* @name Highcharts.CSSObject#borderRadius\n* @type {number|undefined}\n*/ /**\n* Color used in the element. The 'contrast' option is a Highcharts custom\n* property that results in black or white, depending on the background of the\n* element.\n* @name Highcharts.CSSObject#color\n* @type {'contrast'|Highcharts.ColorString|undefined}\n*/ /**\n* Style of the mouse cursor when resting over the element.\n* @name Highcharts.CSSObject#cursor\n* @type {Highcharts.CursorValue|undefined}\n*/ /**\n* Font family of the element text. Multiple values have to be in decreasing\n* preference order and separated by comma.\n* @name Highcharts.CSSObject#fontFamily\n* @type {string|undefined}\n*/ /**\n* Font size of the element text.\n* @name Highcharts.CSSObject#fontSize\n* @type {string|undefined}\n*/ /**\n* Font weight of the element text.\n* @name Highcharts.CSSObject#fontWeight\n* @type {string|undefined}\n*/ /**\n* Height of the element.\n* @name Highcharts.CSSObject#height\n* @type {number|undefined}\n*/ /**\n* The maximum number of lines. If lines are cropped away, an ellipsis will be\n* added.\n* @name Highcharts.CSSObject#lineClamp\n* @type {number|undefined}\n*/ /**\n* Width of the element border.\n* @name Highcharts.CSSObject#lineWidth\n* @type {number|undefined}\n*/ /**\n* Opacity of the element.\n* @name Highcharts.CSSObject#opacity\n* @type {number|undefined}\n*/ /**\n* Space around the element content.\n* @name Highcharts.CSSObject#padding\n* @type {string|undefined}\n*/ /**\n* Behaviour of the element when the mouse cursor rests over it.\n* @name Highcharts.CSSObject#pointerEvents\n* @type {string|undefined}\n*/ /**\n* Positioning of the element.\n* @name Highcharts.CSSObject#position\n* @type {string|undefined}\n*/ /**\n* Alignment of the element text.\n* @name Highcharts.CSSObject#textAlign\n* @type {string|undefined}\n*/ /**\n* Additional decoration of the element text.\n* @name Highcharts.CSSObject#textDecoration\n* @type {string|undefined}\n*/ /**\n* Outline style of the element text.\n* @name Highcharts.CSSObject#textOutline\n* @type {string|undefined}\n*/ /**\n* Line break style of the element text. Highcharts SVG elements support\n* `ellipsis` when a `width` is set.\n* @name Highcharts.CSSObject#textOverflow\n* @type {string|undefined}\n*/ /**\n* Top spacing of the element relative to the parent element.\n* @name Highcharts.CSSObject#top\n* @type {string|undefined}\n*/ /**\n* Animated transition of selected element properties.\n* @name Highcharts.CSSObject#transition\n* @type {string|undefined}\n*/ /**\n* Line break style of the element text.\n* @name Highcharts.CSSObject#whiteSpace\n* @type {string|undefined}\n*/ /**\n* Width of the element.\n* @name Highcharts.CSSObject#width\n* @type {number|undefined}\n*/\n/**\n * All possible cursor styles.\n *\n * @typedef {'alias'|'all-scroll'|'auto'|'cell'|'col-resize'|'context-menu'|'copy'|'crosshair'|'default'|'e-resize'|'ew-resize'|'grab'|'grabbing'|'help'|'move'|'n-resize'|'ne-resize'|'nesw-resize'|'no-drop'|'none'|'not-allowed'|'ns-resize'|'nw-resize'|'nwse-resize'|'pointer'|'progress'|'row-resize'|'s-resize'|'se-resize'|'sw-resize'|'text'|'vertical-text'|'w-resize'|'wait'|'zoom-in'|'zoom-out'} Highcharts.CursorValue\n */\n/**\n * All possible dash styles.\n *\n * @typedef {'Dash'|'DashDot'|'Dot'|'LongDash'|'LongDashDot'|'LongDashDotDot'|'ShortDash'|'ShortDashDot'|'ShortDashDotDot'|'ShortDot'|'Solid'} Highcharts.DashStyleValue\n */\n/**\n * Generic dictionary in TypeScript notation.\n * Use the native `AnyRecord` instead.\n *\n * @deprecated\n * @interface Highcharts.Dictionary\n */ /**\n* @name Highcharts.Dictionary#[key:string]\n* @type {T}\n*/\n/**\n * The function callback to execute when the event is fired. The `this` context\n * contains the instance, that fired the event.\n *\n * @callback Highcharts.EventCallbackFunction\n *\n * @param {T} this\n *\n * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n * Event arguments.\n *\n * @return {boolean|void}\n */\n/**\n * The event options for adding function callback.\n *\n * @interface Highcharts.EventOptionsObject\n */ /**\n* The order the event handler should be called. This opens for having one\n* handler be called before another, independent of in which order they were\n* added.\n* @name Highcharts.EventOptionsObject#order\n* @type {number}\n*/ /**\n* Whether an event should be passive or not.\n* When set to `true`, the function specified by listener will never call\n* `preventDefault()`.\n* @name Highcharts.EventOptionsObject#passive\n* @type boolean\n*/\n/**\n * Formats data as a string. Usually the data is accessible through the `this`\n * keyword.\n *\n * @callback Highcharts.FormatterCallbackFunction\n *\n * @param {T} this\n * Context to format\n *\n * @return {string}\n * Formatted text\n */\n/**\n * An object of key-value pairs for HTML attributes.\n *\n * @typedef {Highcharts.Dictionary} Highcharts.HTMLAttributes\n */\n/**\n * An HTML DOM element. The type is a reference to the regular HTMLElement in\n * the global scope.\n *\n * @typedef {global.HTMLElement} Highcharts.HTMLDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement\n */\n/**\n * The iterator callback.\n *\n * @callback Highcharts.ObjectEachCallbackFunction\n *\n * @param {T} this\n * The context.\n *\n * @param {*} value\n * The property value.\n *\n * @param {string} key\n * The property key.\n *\n * @param {*} obj\n * The object that objectEach is being applied to.\n */\n/**\n * An object containing `left` and `top` properties for the position in the\n * page.\n *\n * @interface Highcharts.OffsetObject\n */ /**\n* Left distance to the page border.\n* @name Highcharts.OffsetObject#left\n* @type {number}\n*/ /**\n* Top distance to the page border.\n* @name Highcharts.OffsetObject#top\n* @type {number}\n*/\n/**\n * Describes a range.\n *\n * @interface Highcharts.RangeObject\n */ /**\n* Maximum number of the range.\n* @name Highcharts.RangeObject#max\n* @type {number}\n*/ /**\n* Minimum number of the range.\n* @name Highcharts.RangeObject#min\n* @type {number}\n*/\n/**\n * If a number is given, it defines the pixel length. If a percentage string is\n * given, like for example `'50%'`, the setting defines a length relative to a\n * base size, for example the size of a container.\n *\n * @typedef {number|string} Highcharts.RelativeSize\n */\n/**\n * Proceed function to call original (wrapped) function.\n *\n * @callback Highcharts.WrapProceedFunction\n *\n * @param {*} [arg1]\n * Optional argument. Without any arguments defaults to first argument of\n * the wrapping function.\n *\n * @param {*} [arg2]\n * Optional argument. Without any arguments defaults to second argument\n * of the wrapping function.\n *\n * @param {*} [arg3]\n * Optional argument. Without any arguments defaults to third argument of\n * the wrapping function.\n *\n * @return {*}\n * Return value of the original function.\n */\n/**\n * The Highcharts object is the placeholder for all other members, and various\n * utility functions. The most important member of the namespace would be the\n * chart constructor.\n *\n * @example\n * let chart = Highcharts.chart('container', { ... });\n *\n * @namespace Highcharts\n */\n''; // Detach doclets above\n\n;// ./code/es-modules/Core/Chart/ChartDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * General options for the chart.\n *\n * @optionparent chart\n */\nconst ChartDefaults = {\n /**\n * Default `mapData` for all series, in terms of a GeoJSON or TopoJSON\n * object. If set to a string, it functions as an index into the\n * `Highcharts.maps` array.\n *\n * For picking out individual shapes and geometries to use for each series\n * of the map, see [series.mapData](#series.map.mapData).\n *\n * @sample maps/demo/geojson\n * Loading GeoJSON data\n * @sample maps/chart/topojson\n * Loading TopoJSON data\n *\n * @type {string|Array<*>|Highcharts.GeoJSON|Highcharts.TopoJSON}\n * @since 5.0.0\n * @product highmaps\n * @apioption chart.map\n */\n /**\n * Set lat/lon transformation definitions for the chart. If not defined,\n * these are extracted from the map data.\n *\n * @type {*}\n * @since 5.0.0\n * @product highmaps\n * @apioption chart.mapTransforms\n */\n /**\n * When using multiple axes, the ticks of two or more opposite axes\n * will automatically be aligned by adding ticks to the axis or axes\n * with the least ticks, as if `tickAmount` were specified.\n *\n * This can be prevented by setting `alignTicks` to false. If the grid\n * lines look messy, it's a good idea to hide them for the secondary\n * axis by setting `gridLineWidth` to 0.\n *\n * If `startOnTick` or `endOnTick` in the axis options are set to false,\n * then the `alignTicks ` will be disabled for the axis.\n *\n * Disabled for logarithmic axes.\n *\n * @sample {highcharts} highcharts/chart/alignticks-true/\n * True by default\n * @sample {highcharts} highcharts/chart/alignticks-false/\n * False\n * @sample {highstock} stock/chart/alignticks-true/\n * True by default\n * @sample {highstock} stock/chart/alignticks-false/\n * False\n *\n * @type {boolean}\n * @default true\n * @product highcharts highstock gantt\n * @apioption chart.alignTicks\n */\n /**\n * When using multiple axes, align the thresholds. When this is true, other\n * ticks will also be aligned.\n *\n * Note that for line series and some other series types, the `threshold`\n * option is set to `null` by default. This will in turn cause their y-axis\n * to not have a threshold. In order to avoid that, set the series\n * `threshold` to 0 or another number.\n *\n * If `startOnTick` or `endOnTick` in the axis options are set to false, or\n * if the axis is logarithmic, the threshold will not be aligned.\n *\n * @sample {highcharts} highcharts/chart/alignthresholds/ Set to true\n *\n * @since 10.0.0\n * @product highcharts highstock gantt\n * @apioption chart.alignThresholds\n */\n alignThresholds: false,\n /**\n * Set the overall animation for all chart updating. Animation can be\n * disabled throughout the chart by setting it to false here. It can\n * be overridden for each individual API method as a function parameter.\n * The only animation not affected by this option is the initial series\n * animation, see [plotOptions.series.animation](\n * #plotOptions.series.animation).\n *\n * The animation can either be set as a boolean or a configuration\n * object. If `true`, it will use the 'swing' jQuery easing and a\n * duration of 500 ms. If used as a configuration object, the following\n * properties are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * - `duration`: The duration of the animation in milliseconds.\n *\n * - `easing`: A string reference to an easing function set on the\n * `Math` object. See\n * [the easing demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-animation-easing/).\n *\n * When zooming on a series with less than 100 points, the chart redraw\n * will be done with animation, but in case of more data points, it is\n * necessary to set this option to ensure animation on zoom.\n *\n * @sample {highcharts} highcharts/chart/animation-none/\n * Updating with no animation\n * @sample {highcharts} highcharts/chart/animation-duration/\n * With a longer duration\n * @sample {highcharts} highcharts/chart/animation-easing/\n * With a jQuery UI easing\n * @sample {highmaps} maps/chart/animation-none/\n * Updating with no animation\n * @sample {highmaps} maps/chart/animation-duration/\n * With a longer duration\n *\n * @type {boolean|Partial}\n * @default true\n * @apioption chart.animation\n */\n /**\n * A CSS class name to apply to the charts container `div`, allowing\n * unique CSS styling for each chart.\n *\n * @type {string}\n * @apioption chart.className\n */\n /**\n * Event listeners for the chart.\n *\n * @apioption chart.events\n */\n /**\n * Fires when a series is added to the chart after load time, using the\n * `addSeries` method. One parameter, `event`, is passed to the\n * function, containing common event information. Through\n * `event.options` you can access the series options that were passed to\n * the `addSeries` method. Returning false prevents the series from\n * being added.\n *\n * @sample {highcharts} highcharts/chart/events-addseries/\n * Alert on add series\n * @sample {highstock} stock/chart/events-addseries/\n * Alert on add series\n *\n * @type {Highcharts.ChartAddSeriesCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Chart\n * @apioption chart.events.addSeries\n */\n /**\n * Fires when clicking on the plot background. One parameter, `event`,\n * is passed to the function, containing common event information.\n *\n * Information on the clicked spot can be found through `event.xAxis`\n * and `event.yAxis`, which are arrays containing the axes of each\n * dimension and each axis' value at the clicked spot. The primary axes\n * are `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n * datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * ```js\n * click: function(e) {\n * console.log(\n * Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', e.xAxis[0].value),\n * e.yAxis[0].value\n * )\n * }\n * ```\n *\n * @sample {highcharts} highcharts/chart/events-click/\n * Alert coordinates on click\n * @sample {highcharts} highcharts/chart/events-container/\n * Alternatively, attach event to container\n * @sample {highstock} stock/chart/events-click/\n * Alert coordinates on click\n * @sample {highstock} highcharts/chart/events-container/\n * Alternatively, attach event to container\n * @sample {highmaps} maps/chart/events-click/\n * Record coordinates on click\n * @sample {highmaps} highcharts/chart/events-container/\n * Alternatively, attach event to container\n *\n * @type {Highcharts.ChartClickCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Chart\n * @apioption chart.events.click\n */\n /**\n * Fires when the chart is finished loading. Since v4.2.2, it also waits\n * for images to be loaded, for example from point markers. One\n * parameter, `event`, is passed to the function, containing common\n * event information.\n *\n * There is also a second parameter to the chart constructor where a\n * callback function can be passed to be executed on chart.load.\n *\n * @sample {highcharts} highcharts/chart/events-load/\n * Alert on chart load\n * @sample {highcharts} highcharts/chart/events-render/\n * Load vs Redraw vs Render\n * @sample {highstock} stock/chart/events-load/\n * Alert on chart load\n * @sample {highmaps} maps/chart/events-load/\n * Add series on chart load\n *\n * @type {Highcharts.ChartLoadCallbackFunction}\n * @context Highcharts.Chart\n * @apioption chart.events.load\n */\n /**\n * Fires when the chart is redrawn, either after a call to\n * `chart.redraw()` or after an axis, series or point is modified with\n * the `redraw` option set to `true`. One parameter, `event`, is passed\n * to the function, containing common event information.\n *\n * @sample {highcharts} highcharts/chart/events-redraw/\n * Alert on chart redraw\n * @sample {highcharts} highcharts/chart/events-render/\n * Load vs Redraw vs Render\n * @sample {highstock} stock/chart/events-redraw/\n * Alert on chart redraw when adding a series or moving the\n * zoomed range\n * @sample {highmaps} maps/chart/events-redraw/\n * Set subtitle on chart redraw\n *\n * @type {Highcharts.ChartRedrawCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Chart\n * @apioption chart.events.redraw\n */\n /**\n * Fires after initial load of the chart (directly after the `load`\n * event), and after each redraw (directly after the `redraw` event).\n *\n * @sample {highcharts} highcharts/chart/events-render/\n * Load vs Redraw vs Render\n *\n * @type {Highcharts.ChartRenderCallbackFunction}\n * @since 5.0.7\n * @context Highcharts.Chart\n * @apioption chart.events.render\n */\n /**\n * Fires when an area of the chart has been selected. Selection is\n * enabled by setting the chart's zoomType. One parameter, `event`, is\n * passed to the function, containing common event information. The\n * default action for the selection event is to zoom the chart to the\n * selected area. It can be prevented by calling\n * `event.preventDefault()` or return false.\n *\n * Information on the selected area can be found through `event.xAxis`\n * and `event.yAxis`, which are arrays containing the axes of each\n * dimension and each axis' min and max values. The primary axes are\n * `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n * datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * ```js\n * selection: function(event) {\n * // log the min and max of the primary, datetime x-axis\n * console.log(\n * Highcharts.dateFormat(\n * '%Y-%m-%d %H:%M:%S',\n * event.xAxis[0].min\n * ),\n * Highcharts.dateFormat(\n * '%Y-%m-%d %H:%M:%S',\n * event.xAxis[0].max\n * )\n * );\n * // log the min and max of the y axis\n * console.log(event.yAxis[0].min, event.yAxis[0].max);\n * }\n * ```\n *\n * @sample {highcharts} highcharts/chart/events-selection/\n * Report on selection and reset\n * @sample {highcharts} highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * @sample {highstock} stock/chart/events-selection/\n * Report on selection and reset\n * @sample {highstock} highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * (Highcharts)\n *\n * @type {Highcharts.ChartSelectionCallbackFunction}\n * @apioption chart.events.selection\n */\n /**\n * The margin between the outer edge of the chart and the plot area.\n * The numbers in the array designate top, right, bottom and left\n * respectively. Use the options `marginTop`, `marginRight`,\n * `marginBottom` and `marginLeft` for shorthand setting of one option.\n *\n * By default there is no margin. The actual space is dynamically\n * calculated from the offset of axis labels, axis title, title,\n * subtitle and legend in addition to the `spacingTop`, `spacingRight`,\n * `spacingBottom` and `spacingLeft` options.\n *\n * @sample {highcharts} highcharts/chart/margins-zero/\n * Zero margins\n * @sample {highstock} stock/chart/margin-zero/\n * Zero margins\n *\n * @type {number|Array}\n * @apioption chart.margin\n */\n /**\n * The margin between the bottom outer edge of the chart and the plot\n * area. Use this to set a fixed pixel value for the margin as opposed\n * to the default dynamic margin. See also `spacingBottom`.\n *\n * @sample {highcharts} highcharts/chart/marginbottom/\n * 100px bottom margin\n * @sample {highstock} stock/chart/marginbottom/\n * 100px bottom margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginBottom\n */\n /**\n * The margin between the left outer edge of the chart and the plot\n * area. Use this to set a fixed pixel value for the margin as opposed\n * to the default dynamic margin. See also `spacingLeft`.\n *\n * @sample {highcharts} highcharts/chart/marginleft/\n * 150px left margin\n * @sample {highstock} stock/chart/marginleft/\n * 150px left margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginLeft\n */\n /**\n * The margin between the right outer edge of the chart and the plot\n * area. Use this to set a fixed pixel value for the margin as opposed\n * to the default dynamic margin. See also `spacingRight`.\n *\n * @sample {highcharts} highcharts/chart/marginright/\n * 100px right margin\n * @sample {highstock} stock/chart/marginright/\n * 100px right margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginRight\n */\n /**\n * The margin between the top outer edge of the chart and the plot area.\n * Use this to set a fixed pixel value for the margin as opposed to\n * the default dynamic margin. See also `spacingTop`.\n *\n * @sample {highcharts} highcharts/chart/margintop/ 100px top margin\n * @sample {highstock} stock/chart/margintop/\n * 100px top margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginTop\n */\n /**\n * Callback function to override the default function that formats all\n * the numbers in the chart. Returns a string with the formatted number.\n *\n * @sample highcharts/members/highcharts-numberformat\n * Arabic digits in Highcharts\n * @type {Highcharts.NumberFormatterCallbackFunction}\n * @since 8.0.0\n * @apioption chart.numberFormatter\n */\n /**\n * When a chart with an x and a y-axis is rendered, we first pre-render the\n * labels of both in order to measure them. Then, if either of the axis\n * labels take up so much space that it significantly affects the length of\n * the other axis, we repeat the process.\n *\n * By default we stop at two axis layout runs, but it may be that the second\n * run also alter the space required by either axis, for example if it\n * causes the labels to rotate. In this situation, a subsequent redraw of\n * the chart may cause the tick and label placement to change for apparently\n * no reason.\n *\n * Use the `axisLayoutRuns` option to set the maximum allowed number of\n * repetitions. But keep in mind that the default value of 2 is set because\n * every run costs performance time.\n *\n * **Note:** Changing that option to higher than the default might decrease\n * performance significantly, especially with bigger sets of data.\n *\n * @type {number}\n * @default 2\n * @since 11.3.0\n * @apioption chart.axisLayoutRuns\n */\n /**\n * Allows setting a key to switch between zooming and panning. Can be\n * one of `alt`, `ctrl`, `meta` (the command key on Mac and Windows\n * key on Windows) or `shift`. The keys are mapped directly to the key\n * properties of the click event argument (`event.altKey`,\n * `event.ctrlKey`, `event.metaKey` and `event.shiftKey`).\n *\n * @type {string}\n * @since 4.0.3\n * @product highcharts gantt\n * @validvalue [\"alt\", \"ctrl\", \"meta\", \"shift\"]\n * @apioption chart.panKey\n */\n /**\n * Allow panning in a chart. Best used with [panKey](#chart.panKey)\n * to combine zooming and panning.\n *\n * On touch devices, when the [tooltip.followTouchMove](\n * #tooltip.followTouchMove) option is `true` (default), panning\n * requires two fingers. To allow panning with one finger, set\n * `followTouchMove` to `false`.\n *\n * @sample {highcharts} highcharts/chart/pankey/ Zooming and panning\n * @sample {highstock} stock/chart/panning/ Zooming and xy panning\n */\n panning: {\n /**\n * Enable or disable chart panning.\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock|highmaps} true\n */\n enabled: false,\n /**\n * Decides in what dimensions the user can pan the chart. Can be\n * one of `x`, `y`, or `xy`.\n *\n * During panning, all axes will behave as if\n * [`startOnTick`](#yAxis.startOnTick) and\n * [`endOnTick`](#yAxis.endOnTick) were set to `false`. After the\n * panning action is finished, the axes will adjust to their actual\n * settings.\n *\n * @sample {highcharts} highcharts/chart/panning-type\n * Zooming and xy panning\n *\n * @declare Highcharts.OptionsChartPanningTypeValue\n * @type {string}\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @product highcharts highstock gantt\n */\n type: 'x'\n },\n /**\n * Equivalent to [zoomType](#chart.zoomType), but for multitouch\n * gestures only. By default, the `pinchType` is the same as the\n * `zoomType` setting. However, pinching can be enabled separately in\n * some cases, for example in stock charts where a mouse drag pans the\n * chart, while pinching is enabled. When [tooltip.followTouchMove](\n * #tooltip.followTouchMove) is true, pinchType only applies to\n * two-finger touches.\n *\n * @type {string}\n * @default {highcharts} undefined\n * @default {highstock} undefined\n * @since 3.0\n * @product highcharts highstock gantt\n * @deprecated\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @apioption chart.pinchType\n */\n /**\n * Whether to apply styled mode. When in styled mode, no presentational\n * attributes or CSS are applied to the chart SVG. Instead, CSS rules\n * are required to style the chart. The default style sheet is\n * available from `https://code.highcharts.com/css/highcharts.css`.\n *\n * [Read more in the docs](https://www.highcharts.com/docs/chart-design-and-style/style-by-css)\n * on what classes and variables are available.\n *\n * @sample highcharts/css/colors\n * Color theming with CSS\n * @sample highcharts/css/prefers-color-scheme\n * Dynamic theme based on system settings\n * @type {boolean}\n * @default false\n * @since 7.0\n * @apioption chart.styledMode\n */\n styledMode: false,\n /**\n * The corner radius of the outer chart border.\n *\n * @sample {highcharts} highcharts/chart/borderradius/\n * 20px radius\n * @sample {highstock} stock/chart/border/\n * 10px radius\n * @sample {highmaps} maps/chart/border/\n * Border options\n *\n */\n borderRadius: 0,\n /**\n * In styled mode, this sets how many colors the class names\n * should rotate between. With ten colors, series (or points) are\n * given class names like `highcharts-color-0`, `highcharts-color-1`\n * [...] `highcharts-color-9`. The equivalent in non-styled mode\n * is to set colors using the [colors](#colors) setting.\n *\n * @since 5.0.0\n */\n colorCount: 10,\n /**\n * By default, (because of memory and performance reasons) the chart does\n * not copy the data but keeps it as a reference. In some cases, this might\n * result in mutating the original data source. In order to prevent that,\n * set that property to false. Please note that changing that might decrease\n * performance, especially with bigger sets of data.\n *\n * @type {boolean}\n * @since 10.1.0\n */\n allowMutatingData: true,\n /**\n * If true, the axes will scale to the remaining visible series once\n * one series is hidden. If false, hiding and showing a series will\n * not affect the axes or the other series. For stacks, once one series\n * within the stack is hidden, the rest of the stack will close in\n * around it even if the axis is not affected.\n *\n * @sample {highcharts} highcharts/chart/ignorehiddenseries-true/\n * True by default\n * @sample {highcharts} highcharts/chart/ignorehiddenseries-false/\n * False\n * @sample {highcharts} highcharts/chart/ignorehiddenseries-true-stacked/\n * True with stack\n * @sample {highstock} stock/chart/ignorehiddenseries-true/\n * True by default\n * @sample {highstock} stock/chart/ignorehiddenseries-false/\n * False\n *\n * @since 1.2.0\n * @product highcharts highstock gantt\n */\n ignoreHiddenSeries: true,\n /**\n * Whether to invert the axes so that the x axis is vertical and y axis\n * is horizontal. When `true`, the x axis is [reversed](#xAxis.reversed)\n * by default.\n *\n * @productdesc {highcharts}\n * If a bar series is present in the chart, it will be inverted\n * automatically. Inverting the chart doesn't have an effect if there\n * are no cartesian series in the chart.\n *\n * @sample {highcharts} highcharts/chart/inverted/\n * Inverted line\n * @sample {highstock} stock/navigator/inverted/\n * Inverted stock chart\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock gantt\n * @apioption chart.inverted\n */\n /**\n * The distance between the outer edge of the chart and the content,\n * like title or legend, or axis title and labels if present. The\n * numbers in the array designate top, right, bottom and left\n * respectively. Use the options spacingTop, spacingRight, spacingBottom\n * and spacingLeft options for shorthand setting of one option.\n *\n * @type {Array}\n * @see [chart.margin](#chart.margin)\n * @default [10, 10, 15, 10]\n * @since 3.0.6\n */\n spacing: [10, 10, 15, 10],\n /**\n * The button that appears after a selection zoom, allowing the user\n * to reset zoom. This option is deprecated in favor of\n * [zooming](#chart.zooming).\n *\n * @since 2.2\n * @deprecated 10.2.1\n */\n resetZoomButton: {\n /**\n * What frame the button placement should be related to. Can be\n * either `plotBox` or `spacingBox`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n *\n * @type {Highcharts.ButtonRelativeToValue}\n * @apioption chart.resetZoomButton.relativeTo\n */\n /**\n * A collection of attributes for the button. The object takes SVG\n * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n * border radius. The theme also supports `style`, a collection of\n * CSS properties for the text. Equivalent attributes for the hover\n * state are given in `theme.states.hover`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n *\n * @type {Highcharts.SVGAttributes}\n */\n theme: {\n /**\n * The z-index of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.theme.zIndex\n */\n },\n /**\n * The position of the button.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highstock} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n *\n * @type {Highcharts.AlignObject}\n */\n position: {\n /**\n * The horizontal alignment of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.position.align\n */\n /**\n * The horizontal offset of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.position.x\n */\n /**\n * The vertical alignment of the button.\n *\n * @type {Highcharts.VerticalAlignValue}\n * @apioption chart.resetZoomButton.position.verticalAlign\n */\n /**\n * The vertical offset of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.position.y\n */\n }\n },\n /**\n * The pixel width of the plot area border.\n *\n * @sample {highcharts} highcharts/chart/plotborderwidth/\n * 1px border\n * @sample {highstock} stock/chart/plotborder/\n * 2px border\n * @sample {highmaps} maps/chart/plotborder/\n * Plot border options\n *\n * @type {number}\n * @default 0\n * @apioption chart.plotBorderWidth\n */\n /**\n * Whether to apply a drop shadow to the plot area. Requires that\n * plotBackgroundColor be set. The shadow can be an object configuration\n * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n *\n * @sample {highcharts} highcharts/chart/plotshadow/\n * Plot shadow\n * @sample {highstock} stock/chart/plotshadow/\n * Plot shadow\n * @sample {highmaps} maps/chart/plotborder/\n * Plot border options\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption chart.plotShadow\n */\n /**\n * When true, cartesian charts like line, spline, area and column are\n * transformed into the polar coordinate system. This produces _polar\n * charts_, also known as _radar charts_.\n *\n * @sample {highcharts} highcharts/demo/polar/\n * Polar chart\n * @sample {highcharts} highcharts/demo/polar-wind-rose/\n * Wind rose, stacked polar column chart\n * @sample {highcharts} highcharts/demo/polar-spider/\n * Spider web chart\n * @sample {highcharts} highcharts/parallel-coordinates/polar/\n * Star plot, multivariate data in a polar chart\n *\n * @type {boolean}\n * @default false\n * @since 2.3.0\n * @product highcharts\n * @requires highcharts-more\n * @apioption chart.polar\n */\n /**\n * Whether to reflow the chart to fit the width of the container div\n * on resizing the window.\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * True by default\n * @sample {highcharts} highcharts/chart/reflow-false/\n * False\n * @sample {highstock} stock/chart/reflow-true/\n * True by default\n * @sample {highstock} stock/chart/reflow-false/\n * False\n * @sample {highmaps} maps/chart/reflow-true/\n * True by default\n * @sample {highmaps} maps/chart/reflow-false/\n * False\n *\n * @since 2.1\n */\n reflow: true,\n /**\n * The HTML element where the chart will be rendered. If it is a string,\n * the element by that id is used. The HTML element can also be passed\n * by direct reference, or as the first argument of the chart\n * constructor, in which case the option is not needed.\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * String\n * @sample {highcharts} highcharts/chart/renderto-object/\n * Object reference\n * @sample {highstock} stock/chart/renderto-string/\n * String\n * @sample {highstock} stock/chart/renderto-object/\n * Object reference\n *\n * @type {string|Highcharts.HTMLDOMElement}\n * @apioption chart.renderTo\n */\n /**\n * The background color of the marker square when selecting (zooming\n * in on) an area of the chart.\n *\n * @see In styled mode, the selection marker fill is set with the\n * `.highcharts-selection-marker` class.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default rgba(51,92,173,0.25)\n * @since 2.1.7\n * @apioption chart.selectionMarkerFill\n */\n /**\n * Whether to apply a drop shadow to the global series group. This causes\n * all the series to have the same shadow. Contrary to the `series.shadow`\n * option, this prevents items from casting shadows on each other, like for\n * others series in a stack. The shadow can be an object configuration\n * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n *\n * @sample highcharts/chart/seriesgroupshadow/ Shadow\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption chart.shadow\n */\n /**\n * Whether to apply a drop shadow to the outer chart area. Requires\n * that backgroundColor be set. The shadow can be an object\n * configuration containing `color`, `offsetX`, `offsetY`, `opacity` and\n * `width`.\n *\n * @sample {highcharts} highcharts/chart/shadow/\n * Shadow\n * @sample {highstock} stock/chart/shadow/\n * Shadow\n * @sample {highmaps} maps/chart/border/\n * Chart border and shadow\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption chart.shadow\n */\n /**\n * Whether to show the axes initially. This only applies to empty charts\n * where series are added dynamically, as axes are automatically added\n * to cartesian series.\n *\n * @sample {highcharts} highcharts/chart/showaxes-false/\n * False by default\n * @sample {highcharts} highcharts/chart/showaxes-true/\n * True\n *\n * @type {boolean}\n * @since 1.2.5\n * @product highcharts gantt\n * @apioption chart.showAxes\n */\n /**\n * The space between the bottom edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingbottom/\n * Spacing bottom set to 100\n * @sample {highstock} stock/chart/spacingbottom/\n * Spacing bottom set to 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 15\n * @since 2.1\n * @apioption chart.spacingBottom\n */\n /**\n * The space between the left edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingleft/\n * Spacing left set to 100\n * @sample {highstock} stock/chart/spacingleft/\n * Spacing left set to 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 10\n * @since 2.1\n * @apioption chart.spacingLeft\n */\n /**\n * The space between the right edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingright-100/\n * Spacing set to 100\n * @sample {highcharts} highcharts/chart/spacingright-legend/\n * Legend in right position with default spacing\n * @sample {highstock} stock/chart/spacingright/\n * Spacing set to 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 10\n * @since 2.1\n * @apioption chart.spacingRight\n */\n /**\n * The space between the top edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingtop-100/\n * A top spacing of 100\n * @sample {highcharts} highcharts/chart/spacingtop-10/\n * Floating chart title makes the plot area align to the default\n * spacingTop of 10.\n * @sample {highstock} stock/chart/spacingtop/\n * A top spacing of 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 10\n * @since 2.1\n * @apioption chart.spacingTop\n */\n /**\n * Additional CSS styles to apply inline to the container `div` and the root\n * SVG.\n *\n * According to the CSS syntax documentation, it is recommended to quote\n * font family names that contain white space, digits, or punctuation\n * characters other than hyphens. In such cases, wrap the fontFamily\n * name as follows: `fontFamily: '\"Font name\"'`.\n *\n * Since v11, the root font size is 1rem by default, and all child element\n * are given a relative `em` font size by default. This allows implementers\n * to control all the chart's font sizes by only setting the root level.\n *\n * @see In styled mode, general chart styles can be set with the\n * `.highcharts-root` class.\n * @sample {highcharts} highcharts/chart/style-serif-font/\n * Using a serif type font\n * @sample {highcharts} highcharts/chart/style-special-font/\n * Using a font with special character in name\n * @sample {highcharts} highcharts/members/relative-font-size/\n * Relative font sizes\n * @sample {highcharts} highcharts/css/em/\n * Styled mode with relative font sizes\n * @sample {highstock} stock/chart/style/\n * Using a serif type font\n * @sample {highmaps} maps/chart/style-serif-font/\n * Using a serif type font\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontFamily\": \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif\", \"fontSize\":\"1rem\"}\n * @apioption chart.style\n */\n /**\n * The default series type for the chart. Can be any of the chart types\n * listed under [plotOptions](#plotOptions) and [series](#series) or can\n * be a series provided by an additional module.\n *\n * In TypeScript this option has no effect in sense of typing and\n * instead the `type` option must always be set in the series.\n *\n * @sample {highcharts} highcharts/chart/type-bar/\n * Bar\n * @sample {highstock} stock/chart/type/\n * Areaspline\n * @sample {highmaps} maps/chart/type-mapline/\n * Mapline\n *\n * @type {string}\n * @default {highcharts} line\n * @default {highstock} line\n * @default {highmaps} map\n * @since 2.1.0\n * @apioption chart.type\n */\n type: 'line',\n /**\n * Decides in what dimensions the user can zoom by dragging the mouse.\n * Can be one of `x`, `y` or `xy`.\n *\n * @see [panKey](#chart.panKey)\n *\n * @sample {highcharts} highcharts/chart/zoomtype-none/\n * None by default\n * @sample {highcharts} highcharts/chart/zoomtype-x/\n * X\n * @sample {highcharts} highcharts/chart/zoomtype-y/\n * Y\n * @sample {highcharts} highcharts/chart/zoomtype-xy/\n * Xy\n * @sample {highcharts} highcharts/chart/zoomtype-polar/\n * Zoom on polar chart\n * @sample {highstock} stock/demo/basic-line/\n * None by default\n * @sample {highstock} stock/chart/zoomtype-x/\n * X\n * @sample {highstock} stock/chart/zoomtype-y/\n * Y\n * @sample {highstock} stock/chart/zoomtype-xy/\n * Xy\n * @sample {highmaps} maps/chart/zoomtype-xy/\n * Map with selection zoom\n *\n * @type {string}\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @deprecated\n * @apioption chart.zoomType\n */\n /**\n * Enables zooming by a single touch, in combination with\n * [chart.zoomType](#chart.zoomType). When enabled, two-finger pinch\n * will still work as set up by [chart.pinchType](#chart.pinchType).\n * However, `zoomBySingleTouch` will interfere with touch-dragging the\n * chart to read the tooltip. And especially when vertical zooming is\n * enabled, it will make it hard to scroll vertically on the page.\n * @since 9.0.0\n * @sample highcharts/chart/zoombysingletouch\n * Zoom by single touch enabled, with buttons to toggle\n * @product highcharts highstock gantt\n * @deprecated\n */\n /**\n * Chart zooming options.\n * @since 10.2.1\n */\n zooming: {\n /**\n * Equivalent to [type](#chart.zooming.type), but for multitouch\n * gestures only. By default, the `pinchType` is the same as the\n * `type` setting. However, pinching can be enabled separately in\n * some cases, for example in stock charts where a mouse drag pans the\n * chart, while pinching is enabled. When [tooltip.followTouchMove](\n * #tooltip.followTouchMove) is true, pinchType only applies to\n * two-finger touches.\n *\n * @type {string}\n * @default {highcharts} undefined\n * @default {highstock} x\n * @product highcharts highstock gantt\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @apioption chart.zooming.pinchType\n */\n /**\n * Decides in what dimensions the user can zoom by dragging the mouse.\n * Can be one of `x`, `y` or `xy`.\n *\n * @declare Highcharts.OptionsChartZoomingTypeValue\n * @type {string}\n * @default {highcharts} undefined\n * @product highcharts highstock gantt\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @apioption chart.zooming.type\n */\n /**\n * Set a key to hold when dragging to zoom the chart. This is useful to\n * avoid zooming while moving points. Should be set different than\n * [chart.panKey](#chart.panKey).\n *\n * @type {string}\n * @default {highcharts} undefined\n * @validvalue [\"alt\", \"ctrl\", \"meta\", \"shift\"]\n * @requires modules/draggable-points\n * @apioption chart.zooming.key\n */\n /**\n * Enables zooming by a single touch, in combination with\n * [chart.zooming.type](#chart.zooming.type). When enabled, two-finger\n * pinch will still work as set up by [chart.zooming.pinchType]\n * (#chart.zooming.pinchType). However, `singleTouch` will interfere\n * with touch-dragging the chart to read the tooltip. And especially\n * when vertical zooming is enabled, it will make it hard to scroll\n * vertically on the page.\n *\n * @sample highcharts/chart/zoombysingletouch\n * Zoom by single touch enabled, with buttons to toggle\n *\n * @product highcharts highstock gantt\n */\n singleTouch: false,\n /**\n * The button that appears after a selection zoom, allowing the user\n * to reset zoom.\n */\n resetButton: {\n /**\n * What frame the button placement should be related to. Can be\n * either `plotBox` or `spacingBox`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n *\n * @type {Highcharts.ButtonRelativeToValue}\n * @default plot\n * @apioption chart.zooming.resetButton.relativeTo\n */\n /**\n * A collection of attributes for the button. The object takes SVG\n * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n * border radius. The theme also supports `style`, a collection of\n * CSS properties for the text. Equivalent attributes for the hover\n * state are given in `theme.states.hover`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n *\n * @type {Highcharts.SVGAttributes}\n * @since 10.2.1\n */\n theme: {\n /** @internal */\n zIndex: 6\n },\n /**\n * The position of the button.\n *\n * Note: Adjusting position values might cause overlap with chart\n * elements. Ensure coordinates do not obstruct other components or\n * data visibility.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highstock} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n *\n * @type {Highcharts.AlignObject}\n * @since 10.2.1\n */\n position: {\n /**\n * The horizontal alignment of the button.\n */\n align: 'right',\n /**\n * The horizontal offset of the button.\n */\n x: -10,\n /**\n * The vertical alignment of the button.\n *\n * @type {Highcharts.VerticalAlignValue}\n * @default top\n * @apioption chart.zooming.resetButton.position.verticalAlign\n */\n /**\n * The vertical offset of the button.\n */\n y: 10\n }\n }\n },\n /**\n * An explicit width for the chart. By default (when `null`) the width\n * is calculated from the offset width of the containing element.\n *\n * @sample {highcharts} highcharts/chart/width/\n * 800px wide\n * @sample {highstock} stock/chart/width/\n * 800px wide\n * @sample {highmaps} maps/chart/size/\n * Chart with explicit size\n *\n * @type {null|number|string}\n */\n width: null,\n /**\n * An explicit height for the chart. If a _number_, the height is\n * given in pixels. If given a _percentage string_ (for example\n * `'56%'`), the height is given as the percentage of the actual chart\n * width. This allows for preserving the aspect ratio across responsive\n * sizes.\n *\n * By default (when `null`) the height is calculated from the offset\n * height of the containing element, or 400 pixels if the containing\n * element's height is 0.\n *\n * @sample {highcharts} highcharts/chart/height/\n * Forced 200px height\n * @sample {highstock} stock/chart/height/\n * 300px height\n * @sample {highmaps} maps/chart/size/\n * Chart with explicit size\n * @sample highcharts/chart/height-percent/\n * Highcharts with percentage height\n * @sample highcharts/chart/height-inherited/\n * Chart with inherited height\n *\n * @type {null|number|string}\n */\n height: null,\n /**\n * The color of the outer chart border.\n *\n * @see In styled mode, the stroke is set with the\n * `.highcharts-background` class.\n *\n * @sample {highcharts} highcharts/chart/bordercolor/\n * Brown border\n * @sample {highstock} stock/chart/border/\n * Brown border\n * @sample {highmaps} maps/chart/border/\n * Border options\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n borderColor: \"#334eff\" /* Palette.highlightColor80 */,\n /**\n * The pixel width of the outer chart border.\n *\n * @see In styled mode, the stroke is set with the\n * `.highcharts-background` class.\n *\n * @sample {highcharts} highcharts/chart/borderwidth/\n * 5px border\n * @sample {highstock} stock/chart/border/\n * 2px border\n * @sample {highmaps} maps/chart/border/\n * Border options\n *\n * @type {number}\n * @default 0\n * @apioption chart.borderWidth\n */\n /**\n * The background color or gradient for the outer chart area.\n *\n * @see In styled mode, the background is set with the\n * `.highcharts-background` class.\n *\n * @sample {highcharts} highcharts/chart/backgroundcolor-color/\n * Color\n * @sample {highcharts} highcharts/chart/backgroundcolor-gradient/\n * Gradient\n * @sample {highstock} stock/chart/backgroundcolor-color/\n * Color\n * @sample {highstock} stock/chart/backgroundcolor-gradient/\n * Gradient\n * @sample {highmaps} maps/chart/backgroundcolor-color/\n * Color\n * @sample {highmaps} maps/chart/backgroundcolor-gradient/\n * Gradient\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n backgroundColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * The background color or gradient for the plot area.\n *\n * @see In styled mode, the plot background is set with the\n * `.highcharts-plot-background` class.\n *\n * @sample {highcharts} highcharts/chart/plotbackgroundcolor-color/\n * Color\n * @sample {highcharts} highcharts/chart/plotbackgroundcolor-gradient/\n * Gradient\n * @sample {highstock} stock/chart/plotbackgroundcolor-color/\n * Color\n * @sample {highstock} stock/chart/plotbackgroundcolor-gradient/\n * Gradient\n * @sample {highmaps} maps/chart/plotbackgroundcolor-color/\n * Color\n * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n * Gradient\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption chart.plotBackgroundColor\n */\n /**\n * The URL for an image to use as the plot background. To set an image\n * as the background for the entire chart, set a CSS background image\n * to the container element. Note that for the image to be applied to\n * exported charts, its URL needs to be accessible by the export server.\n *\n * @see In styled mode, a plot background image can be set with the\n * `.highcharts-plot-background` class and a [custom pattern](\n * https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n *\n * @sample {highcharts} highcharts/chart/plotbackgroundimage/\n * Skies\n * @sample {highstock} stock/chart/plotbackgroundimage/\n * Skies\n *\n * @type {string}\n * @apioption chart.plotBackgroundImage\n */\n /**\n * The color of the inner chart or plot area border.\n *\n * @see In styled mode, a plot border stroke can be set with the\n * `.highcharts-plot-border` class.\n *\n * @sample {highcharts} highcharts/chart/plotbordercolor/\n * Blue border\n * @sample {highstock} stock/chart/plotborder/\n * Blue border\n * @sample {highmaps} maps/chart/plotborder/\n * Plot border options\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n plotBorderColor: \"#cccccc\" /* Palette.neutralColor20 */\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Chart_ChartDefaults = (ChartDefaults);\n\n;// ./code/es-modules/Core/Color/Palettes.js\n/*\n * Series palettes for Highcharts. Series colors are defined in highcharts.css.\n * **Do not edit this file!** This file is generated using the 'gulp palette' task.\n */\nconst SeriesPalettes = {\n /**\n * Colors for data series and points\n */\n colors: [\n '#2caffe',\n '#544fc5',\n '#00e272',\n '#fe6a35',\n '#6b8abc',\n '#d568fb',\n '#2ee0ca',\n '#fa4b42',\n '#feb56a',\n '#91e8e1'\n ],\n};\n/* harmony default export */ const Palettes = (SeriesPalettes);\n\n;// ./code/es-modules/Core/Time.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { pageLang, win: Time_win } = Core_Globals;\n\nconst { defined: Time_defined, error: Time_error, extend: Time_extend, isNumber: Time_isNumber, isObject: Time_isObject, isString: Time_isString, merge: Time_merge, objectEach: Time_objectEach, pad: Time_pad, splat: Time_splat, timeUnits: Time_timeUnits, ucfirst: Time_ucfirst } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\n// To do: Remove this when we no longer need support for Safari < v14.1\nconst hasOldSafariBug = Core_Globals.isSafari &&\n Time_win.Intl &&\n !Time_win.Intl.DateTimeFormat.prototype.formatRange;\nconst isDateTimeFormatOptions = (obj) => obj.main === void 0;\n// We use the Spanish locale for internal weekday handling because it uses\n// unique letters for narrow weekdays\nconst spanishWeekdayIndex = (weekday) => ['D', 'L', 'M', 'X', 'J', 'V', 'S'].indexOf(weekday);\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Time class. Time settings are applied in general for each page using\n * `Highcharts.setOptions`, or individually for each Chart item through the\n * [time](https://api.highcharts.com/highcharts/time) options set.\n *\n * The Time object is available from {@link Highcharts.Chart#time}, which refers\n * to `Highcharts.time` unless individual time settings are applied for each\n * chart.\n *\n * When configuring time settings for individual chart instances, be aware that\n * using `Highcharts.dateFormat` or `Highcharts.time.dateFormat` within\n * formatter callbacks relies on the global time object, which applies the\n * global language and time zone settings. To ensure charts with local time\n * settings function correctly, use `chart.time.dateFormat? instead. However,\n * the recommended best practice is to use `setOptions` to define global time\n * settings unless specific configurations are needed for each chart.\n *\n * @example\n * // Apply time settings globally\n * Highcharts.setOptions({\n * time: {\n * timezone: 'Europe/London'\n * }\n * });\n *\n * // Apply time settings by instance\n * const chart = Highcharts.chart('container', {\n * time: {\n * timezone: 'America/New_York'\n * },\n * series: [{\n * data: [1, 4, 3, 5]\n * }]\n * });\n *\n * // Use the Time object of a chart instance\n * console.log(\n * 'Current time in New York',\n * chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n * );\n *\n * // Standalone use\n * const time = new Highcharts.Time({\n * timezone: 'America/New_York'\n * });\n * const s = time.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2020, 0, 1));\n * console.log(s); // => 2019-12-31 19:00:00\n *\n * @since 6.0.5\n *\n * @class\n * @name Highcharts.Time\n *\n * @param {Highcharts.TimeOptions} [options] Time options as defined in\n * [chart.options.time](/highcharts/time).\n */\nclass Time {\n /* *\n *\n * Constructors\n *\n * */\n constructor(options) {\n /* *\n *\n * Properties\n *\n * */\n this.options = {\n timezone: 'UTC'\n };\n this.variableTimezone = false;\n this.Date = Time_win.Date;\n this.update(options);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Update the Time object with current options. It is called internally on\n * initializing Highcharts, after running `Highcharts.setOptions` and on\n * `Chart.update`.\n *\n * @private\n * @function Highcharts.Time#update\n *\n * @param {Highcharts.TimeOptions} [options]\n *\n */\n update(options = {}) {\n this.dTLCache = {};\n this.options = options = Time_merge(true, this.options, options);\n const { timezoneOffset, useUTC } = options;\n // Allow using a different Date class\n this.Date = options.Date || Time_win.Date || Date;\n // Assign the time zone. Handle the legacy, deprecated `useUTC` option.\n let timezone = options.timezone;\n if (Time_defined(useUTC)) {\n timezone = useUTC ? 'UTC' : void 0;\n }\n // The Etc/GMT time zones do not support offsets with half-hour\n // resolutions\n if (timezoneOffset && timezoneOffset % 60 === 0) {\n timezone = 'Etc/GMT' + ((timezoneOffset > 0 ? '+' : '')) + timezoneOffset / 60;\n }\n /*\n * The time object has options allowing for variable time zones, meaning\n * the axis ticks or series data needs to consider this.\n */\n this.variableTimezone = timezone !== 'UTC' &&\n timezone?.indexOf('Etc/GMT') !== 0;\n this.timezone = timezone;\n // Assign default time formats from locale strings\n ['months', 'shortMonths', 'weekdays', 'shortWeekdays'].forEach((name) => {\n const isMonth = /months/i.test(name), isShort = /short/.test(name), options = { timeZone: 'UTC' };\n options[isMonth ? 'month' : 'weekday'] = isShort ? 'short' : 'long';\n this[name] = (isMonth ?\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] :\n [3, 4, 5, 6, 7, 8, 9]).map((position) => this.dateFormat(options, (isMonth ? 31 : 1) * 24 * 36e5 * position));\n });\n }\n /**\n * Get a date in terms of numbers (year, month, day etc) for further\n * processing. Takes the current `timezone` setting into account. Inverse of\n * `makeTime` and the native `Date` constructor and `Date.UTC`.\n *\n * The date is returned in array format with the following indices:\n *\n * 0: year,\n * 1: month (zero based),\n * 2: day,\n * 3: hours,\n * 4: minutes,\n * 5: seconds,\n * 6: milliseconds,\n * 7: weekday (Sunday as 0)\n *\n * @function Highcharts.Time#toParts\n *\n * @param {number|Date} [timestamp]\n * The timestamp in milliseconds since January 1st 1970.\n * A Date object is also accepted.\n *\n * @return {Array} The date parts in array format.\n */\n toParts(timestamp) {\n const [weekday, dayOfMonth, month, year, hours, minutes, seconds] = this.dateTimeFormat({\n weekday: 'narrow',\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric'\n }, timestamp, 'es')\n .split(/(?:, |\\/|:)/g);\n return [\n year,\n +month - 1,\n dayOfMonth,\n hours,\n minutes,\n seconds,\n // Milliseconds\n Math.floor(Number(timestamp) || 0) % 1000,\n // Weekday index\n spanishWeekdayIndex(weekday)\n ].map(Number);\n }\n /**\n * Shorthand to get a cached `Intl.DateTimeFormat` instance.\n */\n dateTimeFormat(options, timestamp, locale = this.options.locale || pageLang) {\n const cacheKey = JSON.stringify(options) + locale;\n if (Time_isString(options)) {\n options = this.str2dtf(options);\n }\n let dTL = this.dTLCache[cacheKey];\n if (!dTL) {\n options.timeZone ?? (options.timeZone = this.timezone);\n try {\n dTL = new Intl.DateTimeFormat(locale, options);\n }\n catch (e) {\n if (/Invalid time zone/i.test(e.message)) {\n Time_error(34);\n options.timeZone = 'UTC';\n dTL = new Intl.DateTimeFormat(locale, options);\n }\n else {\n Time_error(e.message, false);\n }\n }\n }\n this.dTLCache[cacheKey] = dTL;\n return dTL?.format(timestamp) || '';\n }\n /**\n * Take a locale-aware string format and return a full DateTimeFormat in\n * object form.\n */\n str2dtf(s, dtf = {}) {\n const mapping = {\n L: { fractionalSecondDigits: 3 },\n S: { second: '2-digit' },\n M: { minute: 'numeric' },\n H: { hour: '2-digit' },\n k: { hour: 'numeric' },\n E: { weekday: 'narrow' },\n a: { weekday: 'short' },\n A: { weekday: 'long' },\n d: { day: '2-digit' },\n e: { day: 'numeric' },\n b: { month: 'short' },\n B: { month: 'long' },\n m: { month: '2-digit' },\n o: { month: 'numeric' },\n y: { year: '2-digit' },\n Y: { year: 'numeric' }\n };\n Object.keys(mapping).forEach((key) => {\n if (s.indexOf(key) !== -1) {\n Time_extend(dtf, mapping[key]);\n }\n });\n return dtf;\n }\n /**\n * Make a time and returns milliseconds. Similar to `Date.UTC`, but takes\n * the current `timezone` setting into account.\n *\n * @function Highcharts.Time#makeTime\n *\n * @param {number} year\n * The year\n *\n * @param {number} month\n * The month. Zero-based, so January is 0.\n *\n * @param {number} [date=1]\n * The day of the month\n *\n * @param {number} [hours=0]\n * The hour of the day, 0-23.\n *\n * @param {number} [minutes=0]\n * The minutes\n *\n * @param {number} [seconds=0]\n * The seconds\n *\n * @return {number}\n * The time in milliseconds since January 1st 1970.\n */\n makeTime(year, month, date = 1, hours = 0, minutes, seconds, milliseconds) {\n // eslint-disable-next-line new-cap\n let d = this.Date.UTC(year, month, date, hours, minutes || 0, seconds || 0, milliseconds || 0);\n if (this.timezone !== 'UTC') {\n const offset = this.getTimezoneOffset(d);\n d += offset;\n // Adjustments close to DST transitions\n if (\n // Optimize for speed by limiting the number of calls to\n // `getTimezoneOffset`. According to\n // https://en.wikipedia.org/wiki/Daylight_saving_time_by_country,\n // DST change may only occur in these months.\n [2, 3, 8, 9, 10, 11].indexOf(month) !== -1 &&\n // DST transitions occur only in the night-time\n (hours < 5 || hours > 20)) {\n const newOffset = this.getTimezoneOffset(d);\n if (offset !== newOffset) {\n d += newOffset - offset;\n // A special case for transitioning from summer time to winter\n // time. When the clock is set back, the same time is repeated\n // twice, i.e. 02:30 am is repeated since the clock is set back\n // from 3 am to 2 am. We need to make the same time as local\n // Date does.\n }\n else if (offset - 36e5 === this.getTimezoneOffset(d - 36e5) &&\n !hasOldSafariBug) {\n d -= 36e5;\n }\n }\n }\n return d;\n }\n /**\n * Parse a datetime string. Unless the string contains time zone\n * information, apply the current `timezone` from options. If the argument\n * is a number, return it.\n *\n * @function Highcharts.Time#parse\n * @param {string|number|undefined} s The datetime string to parse\n * @return {number|undefined} Parsed JavaScript timestamp\n */\n parse(s) {\n if (!Time_isString(s)) {\n return s ?? void 0;\n }\n s = s\n // Firefox fails on YYYY/MM/DD\n .replace(/\\//g, '-')\n // Replace some non-standard notations\n .replace(/(GMT|UTC)/, '');\n // Extend shorthand hour timezone offset like +02\n // .replace(/([+-][0-9]{2})$/, '$1:00');\n // Check if the string has time zone information\n const hasTimezone = s.indexOf('Z') > -1 ||\n /([+-][0-9]{2}):?[0-9]{2}$/.test(s), isYYYYMMDD = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(s);\n if (!hasTimezone && !isYYYYMMDD) {\n s += 'Z';\n }\n const ts = Date.parse(s);\n if (Time_isNumber(ts)) {\n // Unless the string contains time zone information, convert from\n // the local time result of `Date.parse` via UTC into the current\n // timezone of the time object.\n return ts + ((!hasTimezone || isYYYYMMDD) ?\n this.getTimezoneOffset(ts) :\n 0);\n }\n }\n /**\n * Get the time zone offset based on the current timezone information as\n * set in the global options.\n *\n * @function Highcharts.Time#getTimezoneOffset\n *\n * @param {number} timestamp\n * The JavaScript timestamp to inspect.\n *\n * @return {number}\n * The timezone offset in minutes compared to UTC.\n */\n getTimezoneOffset(timestamp) {\n if (this.timezone !== 'UTC') {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [date, gmt, hours, colon, minutes = 0] = this.dateTimeFormat({ timeZoneName: 'shortOffset' }, timestamp, 'en')\n .split(/(GMT|:)/)\n .map(Number), offset = -(hours + minutes / 60) * 60 * 60000;\n // Possible future NaNs stop here\n if (Time_isNumber(offset)) {\n return offset;\n }\n }\n return 0;\n }\n /**\n * Formats a JavaScript date timestamp (milliseconds since January 1 1970)\n * into a human readable date string.\n *\n * The `format` parameter accepts two types of values:\n * - An object containing settings that are passed directly on to\n * [Intl.DateTimeFormat.prototype.format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/format).\n * - A format string containing either individual or locale-aware format\n * keys. **Individual keys**, for example `%Y-%m-%d`, are listed below.\n * **Locale-aware keys** are grouped by square brackets, for example\n * `%[Ymd]`. The order of keys within the square bracket doesn't affect\n * the output, which is determined by the locale. See example below.\n * Internally, the locale-aware format keys are just a shorthand for the\n * full object formats, but are particularly practical in\n * [templating](https://www.highcharts.com/docs/chart-concepts/templating)\n * where full object definitions are not an option.\n *\n * The available string format keys are listed below. Additional formats can\n * be given in the {@link Highcharts.dateFormats} hook.\n *\n * Supported format keys:\n * | Key | Description | Notes on locale-aware format |\n * -------|----------------------------------------------|-------|\n * | `%A` | Long weekday, like 'Monday' | |\n * | `%a` | Short weekday, like 'Mon' | |\n * | `%E` | Narrow weekday, single character | |\n * | `%d` | Two digit day of the month, 01 to 31 | |\n * | `%e` | Day of the month, 1 through 31 | |\n * | `%w` | Day of the week, 0 through 6 | N/A |\n * | `%b` | Short month, like 'Jan' | |\n * | `%B` | Long month, like 'January' | |\n * | `%m` | Two digit month number, 01 through 12 | |\n * | `%o` | Month number, 1 through 12 | |\n * | `%y` | Two digits year, like 24 for 2024 | |\n * | `%Y` | Four digits year, like 2024 | |\n * | `%H` | Two digits hours in 24h format, 00 through 23 | Depending on the locale, 12h format may be instered. |\n * | `%k` | Hours in 24h format, 0 through 23 | Depending on the locale, 12h format may be instered. |\n * | `%I` | Two digits hours in 12h format, 00 through 11 | N/A. The locale determines the hour format. |\n * | `%l` | Hours in 12h format, 1 through 12 | N/A. The locale determines the hour format. |\n * | `%M` | Two digits minutes, 00 through 59 | |\n * | `%p` | Upper case AM or PM | N/A. The locale determines whether to add AM and PM. |\n * | `%P` | Lower case AM or PM | N/A. The locale determines whether to add AM and PM. |\n * | `%S` | Two digits seconds, 00 through 59 | |\n * | `%L` | Milliseconds (naming from Ruby) | |\n *\n * @example\n * // Object format, US English\n * const time1 = new Highcharts.Time({ locale: 'en-US' });\n * console.log(\n * time1.dateFormat({\n * day: 'numeric',\n * month: 'short',\n * year: 'numeric',\n * hour: 'numeric',\n * minute: 'numeric'\n * }, Date.UTC(2024, 11, 31))\n * ); // => Dec 31, 2024, 12:00 AM\n *\n * // Object format, British English\n * const time2 = new Highcharts.Time({ locale: 'en-GB' });\n * console.log(\n * time2.dateFormat({\n * day: 'numeric',\n * month: 'short',\n * year: 'numeric',\n * hour: 'numeric',\n * minute: 'numeric'\n * }, Date.UTC(2024, 11, 31))\n * ); // => 31 Dec 2024, 00:00\n *\n * // Individual key string replacement\n * const time3 = new Highcharts.Time();\n * console.log(\n * time3.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2024, 11, 31))\n * ); // => 2024-12-31 00:00:00\n *\n * // Locale-aware keys, US English\n * const time4 = new Highcharts.Time({ locale: 'en-US' });\n * console.log(\n * time4.dateFormat('%[YebHM]', Date.UTC(2024, 11, 31))\n * ); // => Dec 31, 2024, 12:00 AM\n *\n * // Locale-aware keys, British English\n * const time5 = new Highcharts.Time({ locale: 'en-GB' });\n * console.log(\n * time5.dateFormat('%[YebHM]', Date.UTC(2024, 11, 31))\n * ); // => 31 Dec 2024, 00:00\n *\n * // Mixed locale-aware and individual keys\n * console.log(\n * time5.dateFormat('%[Yeb], %H:%M', Date.UTC(2024, 11, 31))\n * ); // => 31 Dec 2024, 00:00\n *\n * @function Highcharts.Time#dateFormat\n *\n * @param {string|Highcharts.DateTimeFormatOptions} format\n * The desired string format where various time representations are\n * prefixed with %, or an object representing the locale-aware format\n * options.\n *\n * @param {number} [timestamp]\n * The JavaScript timestamp.\n *\n * @param {boolean} [upperCaseFirst=false]\n * Upper case first letter in the return.\n *\n * @return {string}\n * The formatted date.\n */\n dateFormat(format, timestamp, upperCaseFirst) {\n const lang = Core_Globals.defaultOptions?.lang;\n if (!Time_defined(timestamp) || isNaN(timestamp)) {\n return lang?.invalidDate || '';\n }\n format = format ?? '%Y-%m-%d %H:%M:%S';\n // First, identify and replace locale-aware formats like %[Ymd]\n if (Time_isString(format)) {\n const localeAwareRegex = /%\\[([a-zA-Z]+)\\]/g;\n let match;\n while ((match = localeAwareRegex.exec(format))) {\n format = format.replace(match[0], this.dateTimeFormat(match[1], timestamp));\n }\n }\n // Then, replace static formats like %Y, %m, %d etc.\n if (Time_isString(format) && format.indexOf('%') !== -1) {\n const time = this, [fullYear, month, dayOfMonth, hours, minutes, seconds, milliseconds, weekday] = this.toParts(timestamp), langWeekdays = lang?.weekdays || this.weekdays, shortWeekdays = lang?.shortWeekdays || this.shortWeekdays, months = lang?.months || this.months, shortMonths = lang?.shortMonths || this.shortMonths, \n // List all format keys. Custom formats can be added from the\n // outside.\n replacements = Time_extend({\n // Day\n // Short weekday, like 'Mon'\n a: shortWeekdays ?\n shortWeekdays[weekday] :\n langWeekdays[weekday].substr(0, 3),\n // Long weekday, like 'Monday'\n A: langWeekdays[weekday],\n // Two digit day of the month, 01 to 31\n d: Time_pad(dayOfMonth),\n // Day of the month, 1 through 31\n e: Time_pad(dayOfMonth, 2, ' '),\n // Day of the week, 0 through 6\n w: weekday,\n // Week (none implemented)\n // 'W': weekNumber(),\n // Month\n // Short month, like 'Jan'\n b: shortMonths[month],\n // Long month, like 'January'\n B: months[month],\n // Two digit month number, 01 through 12\n m: Time_pad(month + 1),\n // Month number, 1 through 12 (#8150)\n o: month + 1,\n // Year\n // Two digits year, like 09 for 2009\n y: fullYear.toString().substr(2, 2),\n // Four digits year, like 2009\n Y: fullYear,\n // Time\n // Two digits hours in 24h format, 00 through 23\n H: Time_pad(hours),\n // Hours in 24h format, 0 through 23\n k: hours,\n // Two digits hours in 12h format, 00 through 11\n I: Time_pad((hours % 12) || 12),\n // Hours in 12h format, 1 through 12\n l: (hours % 12) || 12,\n // Two digits minutes, 00 through 59\n M: Time_pad(minutes),\n // Upper case AM or PM\n p: hours < 12 ? 'AM' : 'PM',\n // Lower case AM or PM\n P: hours < 12 ? 'am' : 'pm',\n // Two digits seconds, 00 through 59\n S: Time_pad(seconds),\n // Milliseconds (naming from Ruby)\n L: Time_pad(milliseconds, 3)\n }, Core_Globals.dateFormats);\n // Do the replaces\n Time_objectEach(replacements, function (val, key) {\n if (Time_isString(format)) {\n // Regex would do it in one line, but this is faster\n while (format.indexOf('%' + key) !== -1) {\n format = format.replace('%' + key, typeof val === 'function' ?\n val.call(time, timestamp) :\n val);\n }\n }\n });\n }\n else if (Time_isObject(format)) {\n const tzHours = (this.getTimezoneOffset(timestamp) || 0) /\n (60000 * 60), timeZone = this.timezone || ('Etc/GMT' + (tzHours >= 0 ? '+' : '') + tzHours), { prefix = '', suffix = '' } = format;\n format = prefix + this.dateTimeFormat(Time_extend({ timeZone }, format), timestamp) + suffix;\n }\n // Optionally sentence-case the string and return\n return upperCaseFirst ? Time_ucfirst(format) : format;\n }\n /**\n * Resolve legacy formats of dateTimeLabelFormats (strings and arrays) into\n * an object.\n * @private\n * @param {string|Array|Highcharts.Dictionary} f\n * General format description\n * @return {Highcharts.Dictionary}\n * The object definition\n */\n resolveDTLFormat(f) {\n if (!Time_isObject(f, true)) { // Check for string or array\n f = Time_splat(f);\n return {\n main: f[0],\n from: f[1],\n to: f[2]\n };\n }\n // Type-check DateTimeFormatOptions against DateTimeLabelFormatObject\n if (Time_isObject(f, true) && isDateTimeFormatOptions(f)) {\n return { main: f };\n }\n return f;\n }\n /**\n * Return an array with time positions distributed on round time values\n * right and right after min and max. Used in datetime axes as well as for\n * grouping data on a datetime axis.\n *\n * @function Highcharts.Time#getTimeTicks\n *\n * @param {Highcharts.TimeNormalizedObject} normalizedInterval\n * The interval in axis values (ms) and the count\n *\n * @param {number} [min]\n * The minimum in axis values\n *\n * @param {number} [max]\n * The maximum in axis values\n *\n * @param {number} [startOfWeek=1]\n *\n * @return {Highcharts.AxisTickPositionsArray}\n * Time positions\n */\n getTimeTicks(normalizedInterval, min, max, startOfWeek) {\n const time = this, tickPositions = [], higherRanks = {}, { count = 1, unitRange } = normalizedInterval;\n let [year, month, dayOfMonth, hours, minutes, seconds] = time.toParts(min), milliseconds = (min || 0) % 1000, variableDayLength;\n startOfWeek ?? (startOfWeek = 1);\n if (Time_defined(min)) { // #1300\n milliseconds = unitRange >= Time_timeUnits.second ?\n 0 : // #3935\n count * Math.floor(milliseconds / count);\n if (unitRange >= Time_timeUnits.second) { // Second\n seconds = unitRange >= Time_timeUnits.minute ?\n 0 : // #3935\n count * Math.floor(seconds / count);\n }\n if (unitRange >= Time_timeUnits.minute) { // Minute\n minutes = unitRange >= Time_timeUnits.hour ?\n 0 :\n count * Math.floor(minutes / count);\n }\n if (unitRange >= Time_timeUnits.hour) { // Hour\n hours = unitRange >= Time_timeUnits.day ?\n 0 :\n count * Math.floor(hours / count);\n }\n if (unitRange >= Time_timeUnits.day) { // Day\n dayOfMonth = unitRange >= Time_timeUnits.month ?\n 1 :\n Math.max(1, count * Math.floor(dayOfMonth / count));\n }\n if (unitRange >= Time_timeUnits.month) { // Month\n month = unitRange >= Time_timeUnits.year ? 0 :\n count * Math.floor(month / count);\n }\n if (unitRange >= Time_timeUnits.year) { // Year\n year -= year % count;\n }\n // Week is a special case that runs outside the hierarchy\n if (unitRange === Time_timeUnits.week) {\n if (count) {\n min = time.makeTime(year, month, dayOfMonth, hours, minutes, seconds, milliseconds);\n }\n // Get start of current week, independent of count\n const weekday = this.dateTimeFormat({\n timeZone: this.timezone,\n weekday: 'narrow'\n }, min, 'es'), weekdayNo = spanishWeekdayIndex(weekday);\n dayOfMonth += -weekdayNo + startOfWeek +\n // We don't want to skip days that are before\n // startOfWeek (#7051)\n (weekdayNo < startOfWeek ? -7 : 0);\n }\n min = time.makeTime(year, month, dayOfMonth, hours, minutes, seconds, milliseconds);\n // Handle local timezone offset\n if (time.variableTimezone && Time_defined(max)) {\n // Detect whether we need to take the DST crossover into\n // consideration. If we're crossing over DST, the day length may\n // be 23h or 25h and we need to compute the exact clock time for\n // each tick instead of just adding hours. This comes at a cost,\n // so first we find out if it is needed (#4951).\n variableDayLength = (\n // Long range, assume we're crossing over.\n max - min > 4 * Time_timeUnits.month ||\n // Short range, check if min and max are in different time\n // zones.\n time.getTimezoneOffset(min) !==\n time.getTimezoneOffset(max));\n }\n // Iterate and add tick positions at appropriate values\n let t = min, i = 1;\n while (t < max) {\n tickPositions.push(t);\n // Increase the years\n if (unitRange === Time_timeUnits.year) {\n t = time.makeTime(year + i * count, 0);\n // Increase the months\n }\n else if (unitRange === Time_timeUnits.month) {\n t = time.makeTime(year, month + i * count);\n // If we're using local time, the interval is not fixed as it\n // jumps one hour at the DST crossover\n }\n else if (variableDayLength && (unitRange === Time_timeUnits.day ||\n unitRange === Time_timeUnits.week)) {\n t = time.makeTime(year, month, dayOfMonth +\n i * count * (unitRange === Time_timeUnits.day ? 1 : 7));\n }\n else if (variableDayLength &&\n unitRange === Time_timeUnits.hour &&\n count > 1) {\n // Make sure higher ranks are preserved across DST (#6797,\n // #7621)\n t = time.makeTime(year, month, dayOfMonth, hours + i * count);\n // Else, the interval is fixed and we use simple addition\n }\n else {\n t += unitRange * count;\n }\n i++;\n }\n // Push the last time\n tickPositions.push(t);\n // Handle higher ranks. Mark new days if the time is on midnight\n // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold\n // to prevent looping over dense data grouping (#6156).\n if (unitRange <= Time_timeUnits.hour && tickPositions.length < 10000) {\n tickPositions.forEach((t) => {\n if (\n // Speed optimization, no need to run dateFormat unless\n // we're on a full or half hour\n t % 1800000 === 0 &&\n // Check for local or global midnight\n time.dateFormat('%H%M%S%L', t) === '000000000') {\n higherRanks[t] = 'day';\n }\n });\n }\n }\n // Record information on the chosen unit - for dynamic label formatter\n tickPositions.info = Time_extend(normalizedInterval, {\n higherRanks,\n totalRange: unitRange * count\n });\n return tickPositions;\n }\n /**\n * Get the optimal date format for a point, based on a range.\n *\n * @private\n * @function Highcharts.Time#getDateFormat\n *\n * @param {number} range\n * The time range\n *\n * @param {number} timestamp\n * The timestamp of the date\n *\n * @param {number} startOfWeek\n * An integer representing the first day of the week, where 0 is\n * Sunday.\n *\n * @param {Highcharts.Dictionary} dateTimeLabelFormats\n * A map of time units to formats.\n *\n * @return {string}\n * The optimal date format for a point.\n */\n getDateFormat(range, timestamp, startOfWeek, dateTimeLabelFormats) {\n const dateStr = this.dateFormat('%m-%d %H:%M:%S.%L', timestamp), blank = '01-01 00:00:00.000', strpos = {\n millisecond: 15,\n second: 12,\n minute: 9,\n hour: 6,\n day: 3\n };\n let n = 'millisecond', \n // For sub-millisecond data, #4223\n lastN = n;\n for (n in Time_timeUnits) { // eslint-disable-line guard-for-in\n // If the range is exactly one week and we're looking at a\n // Sunday/Monday, go for the week format\n if (range === Time_timeUnits.week &&\n +this.dateFormat('%w', timestamp) === startOfWeek &&\n dateStr.substr(6) === blank.substr(6)) {\n n = 'week';\n break;\n }\n // The first format that is too great for the range\n if (Time_timeUnits[n] > range) {\n n = lastN;\n break;\n }\n // If the point is placed every day at 23:59, we need to show\n // the minutes as well. #2637.\n if (strpos[n] &&\n dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n break;\n }\n // Weeks are outside the hierarchy, only apply them on\n // Mondays/Sundays like in the first condition\n if (n !== 'week') {\n lastN = n;\n }\n }\n return this.resolveDTLFormat(dateTimeLabelFormats[n]).main;\n }\n}\n/* *\n *\n * Default export\n *\n * */\n/* harmony default export */ const Core_Time = (Time);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Normalized interval.\n *\n * @interface Highcharts.TimeNormalizedObject\n */ /**\n* The count.\n*\n* @name Highcharts.TimeNormalizedObject#count\n* @type {number|undefined}\n*/ /**\n* The interval in axis values (ms).\n*\n* @name Highcharts.TimeNormalizedObject#unitRange\n* @type {number}\n*/\n/**\n * Function of an additional date format specifier.\n *\n * @callback Highcharts.TimeFormatCallbackFunction\n *\n * @param {number} timestamp\n * The time to format.\n *\n * @return {string}\n * The formatted portion of the date.\n */\n/**\n * Time ticks.\n *\n * @interface Highcharts.AxisTickPositionsArray\n * @extends global.Array\n */ /**\n* @name Highcharts.AxisTickPositionsArray#info\n* @type {Highcharts.TimeTicksInfoObject|undefined}\n*/\n/**\n * A callback to return the time zone offset for a given datetime. It\n * takes the timestamp in terms of milliseconds since January 1 1970,\n * and returns the timezone offset in minutes. This provides a hook\n * for drawing time based charts in specific time zones using their\n * local DST crossover dates, with the help of external libraries.\n *\n * @callback Highcharts.TimezoneOffsetCallbackFunction\n *\n * @param {number} timestamp\n * Timestamp in terms of milliseconds since January 1 1970.\n *\n * @return {number}\n * Timezone offset in minutes.\n */\n/**\n * Options for formatting dates and times using the [Intl.DateTimeFormat](\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat\n * ) API, and extended with some custom options for Highcharts.\n *\n * @interface Highcharts.DateTimeFormatOptions\n */ /**\n* The locale matching algorithm to use.\n*\n* @name Highcharts.DateTimeFormatOptions#localeMatcher\n* @type {string|undefined}\n*/ /**\n* The time zone to use. The default is the browser's default time zone.\n*\n* @name Highcharts.DateTimeFormatOptions#timeZone\n* @type {string|undefined}\n*/ /**\n* Whether to use 12-hour time (as opposed to 24-hour time).\n*\n* @name Highcharts.DateTimeFormatOptions#hour12\n* @type {'auto'|'always'|'never'|undefined}\n*/ /**\n* The format matching algorithm to use.\n*\n* @name Highcharts.DateTimeFormatOptions#formatMatcher\n* @type {string|undefined}\n*/ /**\n* The representation of the weekday.\n*\n* @name Highcharts.DateTimeFormatOptions#weekday\n* @type {'narrow'|'short'|'long'|undefined}\n*/ /**\n* The representation of the era.\n*\n* @name Highcharts.DateTimeFormatOptions#era\n* @type {'narrow'|'short'|'long'|undefined}\n*/ /**\n* The representation of the year.\n*\n* @name Highcharts.DateTimeFormatOptions#year\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the month.\n* \"narrow\", \"short\", \"long\".\n*\n* @name Highcharts.DateTimeFormatOptions#month\n* @type {'numeric'|'2-digit'|'narrow'|'short'|'long'|undefined}\n*/ /**\n* The representation of the day.\n*\n* @name Highcharts.DateTimeFormatOptions#day\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the hour.\n*\n* @name Highcharts.DateTimeFormatOptions#hour\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the minute.\n*\n* @name Highcharts.DateTimeFormatOptions#minute\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the second.\n*\n* @name Highcharts.DateTimeFormatOptions#second\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The number of fractional digits to use. 3 means milliseconds.\n*\n* @name Highcharts.DateTimeFormatOptions#fractionalSecondDigits\n* @type {number|undefined}\n*/ /**\n* The representation of the time zone name.\n*\n* @name Highcharts.DateTimeFormatOptions#timeZoneName\n* @type {'short'|'long'|undefined}\n*/ /**\n* A prefix for the time string. Custom Highcharts option.\n*\n* @name Highcharts.DateTimeFormatOptions#prefix\n* @type {'string'|undefined}\n*/ /**\n* A suffix for the time string. Custom Highcharts option.\n*\n* @name Highcharts.DateTimeFormatOptions#suffix\n* @type {'string'|undefined}\n*/\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Defaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { isTouchDevice } = Core_Globals;\n\n\n\nconst { fireEvent: Defaults_fireEvent, merge: Defaults_merge } = Core_Utilities;\n/* *\n *\n * API Options\n *\n * */\n/**\n * Global default settings.\n *\n * @name Highcharts.defaultOptions\n * @type {Highcharts.Options}\n */ /**\n* @optionparent\n* @private\n*/\nconst defaultOptions = {\n /**\n * An array containing the default colors for the chart's series. When\n * all colors are used, new colors are pulled from the start again.\n *\n * Default colors can also be set on a series or series.type basis,\n * see [column.colors](#plotOptions.column.colors),\n * [pie.colors](#plotOptions.pie.colors).\n *\n * In styled mode, the colors option doesn't exist. Instead, colors\n * are defined in CSS and applied either through series or point class\n * names, or through the [chart.colorCount](#chart.colorCount) option.\n *\n * @sample {highcharts} highcharts/chart/colors/\n * Assign a global color theme\n * @sample highcharts/members/theme-v10/\n * Latest release styled like version 10\n *\n * @type {Array<(Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject)>}\n * @default [\n * \"#2caffe\",\n * \"#544fc5\",\n * \"#00e272\",\n * \"#fe6a35\",\n * \"#6b8abc\",\n * \"#d568fb\",\n * \"#2ee0ca\",\n * \"#fa4b42\",\n * \"#feb56a\",\n * \"#91e8e1\"\n * ]\n */\n colors: Palettes.colors,\n /**\n * Styled mode only. Configuration object for adding SVG definitions for\n * reusable elements. See [gradients, shadows and\n * patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns)\n * for more information and code examples.\n *\n * @type {*}\n * @since 5.0.0\n * @apioption defs\n */\n /**\n * @ignore-option\n */\n symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n /**\n * An object containing language-related strings and settings. A typical\n * setup uses `Highcharts.setOptions` to make the options apply to all\n * charts in the same page.\n *\n * ```js\n * Highcharts.setOptions({\n * lang: {\n * locale: 'fr'\n * }\n * });\n * ```\n */\n lang: {\n /**\n * The browser locale to use for date and number formatting. The actual\n * locale used for each chart is determined in three steps:\n * 1. If this `lang.locale` option is specified, it is used.\n * 2. Else, look for the closest ancestor HTML element with a `lang`\n * attribute, typically the `` element.\n * 3. If no 'lang' attribute is found, use the default browser locale.\n *\n * Use `en-GB`, British English, for approximate consistency with\n * Highcharts v < 12.\n *\n * @sample highcharts/lang/locale/\n * Set the locale using the `lang.locale` option\n * @sample highcharts/lang/locale-attribute/\n * Pick up the locale from the HTML `lang` attribute\n * @sample highcharts/members/highcharts-numberformat\n * Arabic locale with digits and dates *\n *\n * @since 12.0.0\n * @type {string|Array}\n */\n locale: void 0,\n /**\n * The loading text that appears when the chart is set into the loading\n * state following a call to `chart.showLoading`.\n */\n loading: 'Loading...',\n /**\n * An array containing the months names. Corresponds to the `%B` format\n * in `Highcharts.dateFormat()`. Defaults to 'undefined',\n * meaning the default month names are used according to the\n * `lang.locale` setting.\n *\n * @type {Array}\n */\n months: void 0,\n /**\n * An array containing the months names in abbreviated form. Corresponds\n * to the `%b` format in `Highcharts.dateFormat()`. Defaults to\n * 'undefined', meaning the default short month names are used according\n * to the `lang.locale` setting.\n *\n * @type {Array}\n */\n shortMonths: void 0,\n /**\n * An array containing the weekday names. Defaults to 'undefined',\n * meaning the default weekday names are used according to the\n * `lang.locale` setting.\n *\n * @type {Array}\n */\n weekdays: void 0,\n /**\n * Short week days, starting Sunday. Defaults to 'undefined', meaning\n * the default short weekday names are used according to the\n * `lang.locale` setting.\n *\n * @sample highcharts/lang/shortweekdays/\n * Finnish two-letter abbreviations\n *\n * @type {Array}\n * @since 4.2.4\n * @apioption lang.shortWeekdays\n */\n /**\n * What to show in a date field for invalid dates. Defaults to an empty\n * string.\n *\n * @type {string}\n * @since 4.1.8\n * @product highcharts highstock\n * @apioption lang.invalidDate\n */\n /**\n * The title appearing on hovering the zoom in button. The text itself\n * defaults to \"+\" and can be changed in the button options.\n *\n * @type {string}\n * @default Zoom in\n * @product highmaps\n * @apioption lang.zoomIn\n */\n /**\n * The title appearing on hovering the zoom out button. The text itself\n * defaults to \"-\" and can be changed in the button options.\n *\n * @type {string}\n * @default Zoom out\n * @product highmaps\n * @apioption lang.zoomOut\n */\n /**\n * The default decimal point used in the `Highcharts.numberFormat`\n * method unless otherwise specified in the function arguments. Defaults\n * to the locale decimal point as determined by `lang.locale`.\n *\n * @type {string}\n * @default undefined\n * @since 1.2.2\n * @apioption lang.decimalPoint\n */\n /**\n * [Metric prefixes](https://en.wikipedia.org/wiki/Metric_prefix) used\n * to shorten high numbers in axis labels. Replacing any of the\n * positions with `null` causes the full number to be written. Setting\n * `numericSymbols` to `undefined` disables shortening altogether.\n *\n * @sample {highcharts} highcharts/lang/numericsymbols/\n * Replacing the symbols with text\n * @sample {highstock} highcharts/lang/numericsymbols/\n * Replacing the symbols with text\n *\n * @type {Array}\n * @default [\"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n * @since 2.3.0\n */\n numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'],\n /**\n * The magnitude of [numericSymbols](#lang.numericSymbol) replacements.\n * Use 10000 for Japanese, Korean and various Chinese locales, which\n * use symbols for 10^4, 10^8 and 10^12.\n *\n * @sample highcharts/lang/numericsymbolmagnitude/\n * 10000 magnitude for Japanese\n *\n * @type {number}\n * @default 1000\n * @since 5.0.3\n * @apioption lang.numericSymbolMagnitude\n */\n /**\n * The default thousands separator used in the `Highcharts.numberFormat`\n * method unless otherwise specified in the function arguments. Defaults\n * to the locale thousands separator as determined by `lang.locale`.\n *\n * @type {string}\n * @default undefined\n * @since 1.2.2\n * @apioption lang.thousandsSep\n */\n /**\n * The text for the label appearing when a chart is zoomed.\n *\n * @since 1.2.4\n */\n resetZoom: 'Reset zoom',\n /**\n * The tooltip title for the label appearing when a chart is zoomed.\n *\n * @since 1.2.4\n */\n resetZoomTitle: 'Reset zoom level 1:1'\n },\n /**\n * Global options that don't apply to each chart. These options, like\n * the `lang` options, must be set using the `Highcharts.setOptions`\n * method.\n *\n * ```js\n * Highcharts.setOptions({\n * global: {\n * buttonTheme: {\n * fill: '#d0d0d0'\n * }\n * }\n * });\n * ```\n */\n global: {\n /**\n * General theme for buttons. This applies to the zoom button, exporting\n * context menu, map navigation, range selector buttons and custom\n * buttons generated using the `SVGRenderer.button` function. However,\n * each of these may be overridden with more specific options.\n *\n * @sample highcharts/global/buttontheme\n * General button theme\n * @since 11.4.2\n */\n buttonTheme: {\n /**\n * The fill color for buttons\n */\n fill: \"#f7f7f7\" /* Palette.neutralColor3 */,\n /**\n * The padding of buttons\n */\n padding: 8,\n /**\n * The border radius for buttons\n */\n r: 2,\n /**\n * The stroke color for buttons\n */\n stroke: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * The stroke width for buttons\n */\n 'stroke-width': 1,\n /**\n * CSS styling for the buttons' text\n */\n style: {\n color: \"#333333\" /* Palette.neutralColor80 */,\n cursor: 'pointer',\n fontSize: '0.8em',\n fontWeight: 'normal'\n },\n /**\n * State overrides for the buttons\n */\n states: {\n /**\n * Hover state overrides for the buttons are applied in addition\n * to the normal state options\n */\n hover: {\n fill: \"#e6e6e6\" /* Palette.neutralColor10 */\n },\n /**\n * Select state overrides for the buttons are applied in\n * addition to the normal state options\n */\n select: {\n fill: \"#e6e9ff\" /* Palette.highlightColor10 */,\n style: {\n color: \"#000000\" /* Palette.neutralColor100 */,\n fontWeight: 'bold'\n }\n },\n /**\n * Disabled state overrides for the buttons are applied in\n * addition to the normal state options\n */\n disabled: {\n /**\n * Disabled state CSS style overrides for the buttons' text\n */\n style: {\n color: \"#cccccc\" /* Palette.neutralColor20 */\n }\n }\n }\n }\n },\n /**\n * Time options that can apply globally or to individual charts. These\n * settings affect how `datetime` axes are laid out, how tooltips are\n * formatted, how series\n * [pointIntervalUnit](#plotOptions.series.pointIntervalUnit) works and how\n * the Highcharts Stock range selector handles time.\n *\n * The common use case is that all charts in the same Highcharts object\n * share the same time settings, in which case the global settings are set\n * using `setOptions`.\n *\n * ```js\n * // Apply time settings globally\n * Highcharts.setOptions({\n * time: {\n * timezone: 'Europe/London'\n * }\n * });\n * // Apply time settings by instance\n * const chart = Highcharts.chart('container', {\n * time: {\n * timezone: 'America/New_York'\n * },\n * series: [{\n * data: [1, 4, 3, 5]\n * }]\n * });\n *\n * // Use the Time object\n * console.log(\n * 'Current time in New York',\n * chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n * );\n * ```\n *\n * Since v6.0.5, the time options were moved from the `global` object to the\n * `time` object, and time options can be set on each individual chart.\n *\n * @sample {highcharts|highstock}\n * highcharts/time/timezone/\n * Set the timezone globally\n * @sample {highcharts}\n * highcharts/time/individual/\n * Set the timezone per chart instance\n * @sample {highstock}\n * stock/time/individual/\n * Set the timezone per chart instance\n *\n * @since 6.0.5\n * @optionparent time\n */\n time: {\n /**\n * A custom `Date` class for advanced date handling. For example,\n * [JDate](https://github.com/tahajahangir/jdate) can be hooked in to\n * handle Jalali dates.\n *\n * @type {*}\n * @since 4.0.4\n * @product highcharts highstock gantt\n */\n Date: void 0,\n /**\n * A named time zone. Supported time zone names rely on the browser\n * implementations, as described in the [mdn\n * docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#timezone).\n * If the given time zone is not recognized by the browser, Highcharts\n * provides a warning and falls back to returning a 0 offset,\n * corresponding to the UTC time zone.\n *\n * The time zone affects axis scaling, tickmark placement and\n * time display in `Highcharts.dateFormat`.\n *\n * Setting `timezone` to `undefined` falls back to the default browser\n * timezone setting.\n *\n * Until v11.2.0, this option depended on moment.js.\n *\n * @sample {highcharts|highstock} highcharts/time/timezone/ Europe/Oslo\n *\n * @type {string}\n * @since 5.0.7\n * @product highcharts highstock gantt\n */\n timezone: 'UTC',\n /**\n * The timezone offset in minutes. Positive values are west, negative\n * values are east of UTC, as in the ECMAScript\n * [getTimezoneOffset](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)\n * method. Use this to display UTC based data in a predefined time zone.\n *\n * This option is deprecated as of v11.4.1 and will be removed in a\n * future release. Use the [time.timezone](#time.timezone) option\n * instead.\n *\n * @see [time.getTimezoneOffset](#time.getTimezoneOffset)\n *\n * @sample {highcharts|highstock} highcharts/time/timezoneoffset/\n * Timezone offset\n *\n * @since 3.0.8\n * @deprecated 11.4.2\n * @product highcharts highstock gantt\n */\n timezoneOffset: 0,\n /**\n * Whether to use UTC time for axis scaling, tickmark placement and\n * time display in `Highcharts.dateFormat`. Advantages of using UTC\n * is that the time displays equally regardless of the user agent's\n * time zone settings. Local time can be used when the data is loaded\n * in real time or when correct Daylight Saving Time transitions are\n * required.\n *\n * Setting `useUTC` to true is equivalent to setting `time.timezone` to\n * `\"UTC\"`. Setting `useUTC` to false is equivalent to setting\n * `time.timezone` to `undefined`.\n *\n * @see [time.timezone](#timezone)\n *\n * @sample {highcharts} highcharts/time/useutc-true/\n * True by default\n * @sample {highcharts} highcharts/time/useutc-false/\n * False\n *\n * @deprecated\n */\n useUTC: void 0\n },\n chart: Chart_ChartDefaults,\n /**\n * The chart's main title.\n *\n * @sample {highmaps} maps/title/title/\n * Title options demonstrated\n * @sample {highcharts} highcharts/title/align-auto/\n * Default title alignment\n */\n title: {\n /**\n * When the title is floating, the plot area will not move to make space\n * for it.\n *\n * @sample {highcharts} highcharts/chart/zoomtype-none/\n * False by default\n * @sample {highcharts} highcharts/title/floating/\n * True - title on top of the plot area\n * @sample {highstock} stock/chart/title-floating/\n * True - title on top of the plot area\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @apioption title.floating\n */\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the text.\n *\n * @type {boolean}\n * @default false\n * @apioption title.useHTML\n */\n /**\n * The vertical alignment of the title. Can be one of `\"top\"`,\n * `\"middle\"` and `\"bottom\"`. When a value is given, the title behaves\n * as if [floating](#title.floating) were `true`.\n *\n * @sample {highcharts} highcharts/title/verticalalign/\n * Chart title in bottom right corner\n * @sample {highstock} stock/chart/title-verticalalign/\n * Chart title in bottom right corner\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.1\n * @apioption title.verticalAlign\n */\n /**\n * The x position of the title relative to the alignment within\n * `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @sample {highcharts} highcharts/title/align/\n * Aligned to the plot area (x = 70px = margin left - spacing\n * left)\n * @sample {highstock} stock/chart/title-align/\n * Aligned to the plot area (x = 50px = margin left - spacing\n * left)\n *\n * @type {number}\n * @default 0\n * @since 2.0\n * @apioption title.x\n */\n /**\n * The y position of the title relative to the alignment within\n * [chart.spacingTop](#chart.spacingTop) and [chart.spacingBottom](\n * #chart.spacingBottom). By default it depends on the font size.\n *\n * @sample {highcharts} highcharts/title/y/\n * Title inside the plot area\n * @sample {highstock} stock/chart/title-verticalalign/\n * Chart title in bottom right corner\n *\n * @type {number}\n * @since 2.0\n * @apioption title.y\n */\n /**\n * CSS styles for the title. Use this for font styling, but use `align`,\n * `x` and `y` for text alignment.\n *\n * Note that the default [title.minScale](#title.minScale) option also\n * affects the rendered font size. In order to keep the font size fixed\n * regardless of title length, set `minScale` to 1.\n *\n * In styled mode, the title style is given in the `.highcharts-title`\n * class.\n *\n * @sample {highcharts} highcharts/title/style/\n * Custom color and weight\n * @sample {highstock} stock/chart/title-style/\n * Custom color and weight\n * @sample highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {highcharts|highmaps} { \"color\": \"#333333\", \"fontSize\": \"18px\" }\n * @default {highstock} { \"color\": \"#333333\", \"fontSize\": \"16px\" }\n */\n style: {\n color: \"#333333\" /* Palette.neutralColor80 */,\n fontWeight: 'bold'\n },\n /**\n * The title of the chart. To disable the title, set the `text` to\n * `undefined`.\n *\n * @sample {highcharts} highcharts/title/text/\n * Custom title\n * @sample {highstock} stock/chart/title-text/\n * Custom title\n *\n * @default {highcharts|highmaps} Chart title\n * @default {highstock} undefined\n */\n text: 'Chart title',\n /**\n * The horizontal alignment of the title. Can be one of \"left\", \"center\"\n * and \"right\".\n *\n * Since v12 it defaults to `undefined`, meaning the alignment is\n * computed for best fit. If the text fits in one line, it aligned to\n * the center, but if it is wrapped into multiple lines, it is aligned\n * to the left.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Default alignment, dynamic\n * @sample {highcharts} highcharts/title/align/\n * Aligned to the plot area (x = 70px = margin left - spacing\n * left)\n * @sample {highstock} stock/chart/title-align/\n * Aligned to the plot area (x = 50px = margin left - spacing\n * left)\n *\n * @type {Highcharts.AlignValue}\n * @default undefined\n * @since 2.0\n * @apioption title.align\n */\n /**\n * The margin between the title and the plot area, or if a subtitle\n * is present, the margin between the subtitle and the plot area.\n *\n * @sample {highcharts} highcharts/title/margin-50/\n * A chart title margin of 50\n * @sample {highcharts} highcharts/title/margin-subtitle/\n * The same margin applied with a subtitle\n * @sample {highstock} stock/chart/title-margin/\n * A chart title margin of 50\n *\n * @since 2.1\n */\n margin: 15,\n /**\n * When the title is too wide to fit in the chart, the default behavior\n * is to scale it down to fit, or apply word wrap if it is scaled down\n * to `minScale` and still doesn't fit.\n *\n * The default value reflects the scale, when using default font sizes,\n * when the title font size matches that of the subtitle. The title\n * still stands out as it is bold by default.\n *\n * Set `minScale` to 1 to avoid downscaling.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Downscaling demonstrated\n *\n * @since 12.0.0\n */\n minScale: 0.67\n },\n /**\n * The chart's subtitle. This can be used both to display a subtitle below\n * the main title, and to display random text anywhere in the chart. The\n * subtitle can be updated after chart initialization through the\n * `Chart.setTitle` method.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Default title alignment\n * @sample {highmaps} maps/title/subtitle/\n * Subtitle options demonstrated\n */\n subtitle: {\n /**\n * When the subtitle is floating, the plot area will not move to make\n * space for it.\n *\n * @sample {highcharts} highcharts/subtitle/floating/\n * Floating title and subtitle\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote floating at bottom right of plot area\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @apioption subtitle.floating\n */\n /**\n * CSS styles for the title.\n *\n * In styled mode, the subtitle style is given in the\n * `.highcharts-subtitle` class.\n *\n * @sample {highcharts} highcharts/subtitle/style/\n * Custom color and weight\n * @sample {highcharts} highcharts/css/titles/\n * Styled mode\n * @sample {highstock} stock/chart/subtitle-style\n * Custom color and weight\n * @sample {highstock} highcharts/css/titles/\n * Styled mode\n * @sample {highmaps} highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#666666\"}\n * @apioption subtitle.style\n */\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the text.\n *\n * @type {boolean}\n * @default false\n * @apioption subtitle.useHTML\n */\n /**\n * The vertical alignment of the title. Can be one of `\"top\"`,\n * `\"middle\"` and `\"bottom\"`. When middle, the subtitle behaves as\n * floating.\n *\n * @sample {highcharts} highcharts/subtitle/verticalalign/\n * Footnote at the bottom right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at the bottom right of plot area\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.1\n * @apioption subtitle.verticalAlign\n */\n /**\n * The x position of the subtitle relative to the alignment within\n * `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @sample {highcharts} highcharts/subtitle/align/\n * Footnote at right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at the bottom right of plot area\n *\n * @type {number}\n * @default 0\n * @since 2.0\n * @apioption subtitle.x\n */\n /**\n * The y position of the subtitle relative to the alignment within\n * `chart.spacingTop` and `chart.spacingBottom`. By default the subtitle\n * is laid out below the title unless the title is floating.\n *\n * @sample {highcharts} highcharts/subtitle/verticalalign/\n * Footnote at the bottom right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at the bottom right of plot area\n *\n * @type {number}\n * @since 2.0\n * @apioption subtitle.y\n */\n /**\n * CSS styles for the title.\n *\n * In styled mode, the subtitle style is given in the\n * `.highcharts-subtitle` class.\n *\n * @sample {highcharts} highcharts/subtitle/style/\n * Custom color and weight\n * @sample {highcharts} highcharts/css/titles/\n * Styled mode\n * @sample {highstock} stock/chart/subtitle-style\n * Custom color and weight\n * @sample {highstock} highcharts/css/titles/\n * Styled mode\n * @sample {highmaps} highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#666666\"}\n */\n style: {\n color: \"#666666\" /* Palette.neutralColor60 */,\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * The subtitle of the chart.\n *\n * @sample {highcharts|highstock} highcharts/subtitle/text/\n * Custom subtitle\n * @sample {highcharts|highstock} highcharts/subtitle/text-formatted/\n * Formatted and linked text.\n */\n text: ''\n /**\n * The horizontal alignment of the subtitle. Can be one of \"left\",\n * \"center\" and \"right\". Since v12, it defaults to `undefined`, meaning\n * the actual alignment is inherited from the alignment of the main\n * title.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Default title and subtitle alignment, dynamic\n * @sample {highcharts} highcharts/subtitle/align/\n * Footnote at right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at bottom right of plot area\n *\n * @type {Highcharts.AlignValue}\n * @default undefined\n * @since 2.0\n * @apioption subtitle.align\n */\n },\n /**\n * The chart's caption, which will render below the chart and will be part\n * of exported charts. The caption can be updated after chart initialization\n * through the `Chart.update` or `Chart.caption.update` methods.\n *\n * @sample highcharts/caption/text/\n * A chart with a caption\n * @since 7.2.0\n */\n caption: {\n /**\n * When the caption is floating, the plot area will not move to make\n * space for it.\n *\n * @type {boolean}\n * @default false\n * @apioption caption.floating\n */\n /**\n * The margin between the caption and the plot area.\n */\n margin: 15,\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the text.\n *\n * @type {boolean}\n * @default false\n * @apioption caption.useHTML\n */\n /**\n * The x position of the caption relative to the alignment within\n * `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @type {number}\n * @default 0\n * @apioption caption.x\n */\n /**\n * The y position of the caption relative to the alignment within\n * `chart.spacingTop` and `chart.spacingBottom`.\n *\n * @type {number}\n * @apioption caption.y\n */\n /**\n * CSS styles for the caption.\n *\n * In styled mode, the caption style is given in the\n * `.highcharts-caption` class.\n *\n * @sample {highcharts} highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#666666\"}\n */\n style: {\n color: \"#666666\" /* Palette.neutralColor60 */,\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * The caption text of the chart.\n *\n * @sample {highcharts} highcharts/caption/text/\n * Custom caption\n */\n text: '',\n /**\n * The horizontal alignment of the caption. Can be one of \"left\",\n * \"center\" and \"right\".\n *\n * @type {Highcharts.AlignValue}\n */\n align: 'left',\n /**\n * The vertical alignment of the caption. Can be one of `\"top\"`,\n * `\"middle\"` and `\"bottom\"`. When middle, the caption behaves as\n * floating.\n *\n * @type {Highcharts.VerticalAlignValue}\n */\n verticalAlign: 'bottom'\n },\n /**\n * The plotOptions is a wrapper object for config objects for each series\n * type. The config objects for each series can also be overridden for\n * each series item as given in the series array.\n *\n * Configuration options for the series are given in three levels. Options\n * for all series in a chart are given in the [plotOptions.series](\n * #plotOptions.series) object. Then options for all series of a specific\n * type are given in the plotOptions of that type, for example\n * `plotOptions.line`. Next, options for one single series are given in\n * [the series array](#series).\n */\n plotOptions: {},\n /**\n * The legend is a box containing a symbol and name for each series\n * item or point item in the chart. Each series (or points in case\n * of pie charts) is represented by a symbol and its name in the legend.\n *\n * It is possible to override the symbol creator function and create\n * [custom legend symbols](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/studies/legend-custom-symbol/).\n *\n * @productdesc {highmaps}\n * A Highmaps legend by default contains one legend item per series, but if\n * a `colorAxis` is defined, the axis will be displayed in the legend.\n * Either as a gradient, or as multiple legend items for `dataClasses`.\n */\n legend: {\n /**\n * The background color of the legend.\n *\n * @see In styled mode, the legend background fill can be applied with\n * the `.highcharts-legend-box` class.\n *\n * @sample {highcharts} highcharts/legend/backgroundcolor/\n * Yellowish background\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption legend.backgroundColor\n */\n /**\n * The width of the drawn border around the legend.\n *\n * @see In styled mode, the legend border stroke width can be applied\n * with the `.highcharts-legend-box` class.\n *\n * @sample {highcharts} highcharts/legend/borderwidth/\n * 2px border width\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {number}\n * @default 0\n * @apioption legend.borderWidth\n */\n /**\n * Enable or disable the legend. There is also a series-specific option,\n * [showInLegend](#plotOptions.series.showInLegend), that can hide the\n * series from the legend. In some series types this is `false` by\n * default, so it must set to `true` in order to show the legend for the\n * series.\n *\n * @sample {highcharts} highcharts/legend/enabled-false/ Legend disabled\n * @sample {highstock} stock/legend/align/ Various legend options\n * @sample {highmaps} maps/legend/enabled-false/ Legend disabled\n *\n * @default {highstock} false\n * @default {highmaps} true\n * @default {gantt} false\n */\n enabled: true,\n /**\n * The horizontal alignment of the legend box within the chart area.\n * Valid values are `left`, `center` and `right`.\n *\n * In the case that the legend is aligned in a corner position, the\n * `layout` option will determine whether to place it above/below\n * or on the side of the plot area.\n *\n * @sample {highcharts} highcharts/legend/align/\n * Legend at the right of the chart\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/alignment/\n * Legend alignment\n *\n * @type {Highcharts.AlignValue}\n * @since 2.0\n */\n align: 'center',\n /**\n * If the [layout](legend.layout) is `horizontal` and the legend items\n * span over two lines or more, whether to align the items into vertical\n * columns. Setting this to `false` makes room for more items, but will\n * look more messy.\n *\n * @since 6.1.0\n */\n alignColumns: true,\n /**\n * A CSS class name to apply to the legend group.\n */\n className: 'highcharts-no-tooltip',\n /**\n * General event handlers for the legend. These event hooks can\n * also be attached to the legend at run time using the\n * `Highcharts.addEvent` function.\n *\n * @declare Highcharts.LegendEventsOptionsObject\n *\n * @private\n */\n events: {},\n /**\n * Fires when the legend item belonging to the series is clicked. One\n * parameter, `event`, is passed to the function. The default action\n * is to toggle the visibility of the series, point or data class. This\n * can be prevented by returning `false` or calling\n * `event.preventDefault()`.\n *\n * @sample {highcharts} highcharts/legend/itemclick/\n * Confirm hiding and showing\n * @sample {highcharts} highcharts/legend/pie-legend-itemclick/\n * Confirm toggle visibility of pie slices\n *\n * @type {Highcharts.LegendItemClickCallbackFunction}\n * @context Highcharts.Legend\n * @apioption legend.events.itemClick\n */\n /**\n * When the legend is floating, the plot area ignores it and is allowed\n * to be placed below it.\n *\n * @sample {highcharts} highcharts/legend/floating-false/\n * False by default\n * @sample {highcharts} highcharts/legend/floating-true/\n * True\n * @sample {highmaps} maps/legend/alignment/\n * Floating legend\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @apioption legend.floating\n */\n /**\n * The layout of the legend items. Can be one of `horizontal` or\n * `vertical` or `proximate`. When `proximate`, the legend items will be\n * placed as close as possible to the graphs they're representing,\n * except in inverted charts or when the legend position doesn't allow\n * it.\n *\n * @sample {highcharts} highcharts/legend/layout-horizontal/\n * Horizontal by default\n * @sample {highcharts} highcharts/legend/layout-vertical/\n * Vertical\n * @sample highcharts/legend/layout-proximate\n * Labels proximate to the data\n * @sample {highstock} stock/legend/layout-horizontal/\n * Horizontal by default\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Vertical with data classes\n * @sample {highmaps} maps/legend/layout-vertical/\n * Vertical with color axis gradient\n *\n * @validvalue [\"horizontal\", \"vertical\", \"proximate\"]\n */\n layout: 'horizontal',\n /**\n * In a legend with horizontal layout, the itemDistance defines the\n * pixel distance between each item.\n *\n * @sample {highcharts} highcharts/legend/layout-horizontal/\n * 50px item distance\n * @sample {highstock} highcharts/legend/layout-horizontal/\n * 50px item distance\n *\n * @type {number}\n * @default {highcharts} 20\n * @default {highstock} 20\n * @default {highmaps} 8\n * @since 3.0.3\n * @apioption legend.itemDistance\n */\n /**\n * The pixel bottom margin for each legend item.\n *\n * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n *\n * @since 2.2.0\n */\n itemMarginBottom: 2,\n /**\n * The pixel top margin for each legend item.\n *\n * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n *\n * @since 2.2.0\n */\n itemMarginTop: 2,\n /**\n * The width for each legend item. By default the items are laid out\n * successively. In a [horizontal layout](legend.layout), if the items\n * are laid out across two rows or more, they will be vertically aligned\n * depending on the [legend.alignColumns](legend.alignColumns) option.\n *\n * @sample {highcharts} highcharts/legend/itemwidth-default/\n * Undefined by default\n * @sample {highcharts} highcharts/legend/itemwidth-80/\n * 80 for aligned legend items\n *\n * @type {number}\n * @since 2.0\n * @apioption legend.itemWidth\n */\n /**\n * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for each legend label. Available variables relates to properties on\n * the series, or the point in case of pies.\n *\n * @type {string}\n * @default {name}\n * @since 1.3\n * @apioption legend.labelFormat\n */\n /* eslint-disable valid-jsdoc */\n /**\n * Callback function to format each of the series' labels. The `this`\n * keyword refers to the series object, or the point object in case of\n * pie charts. By default the series or point name is printed.\n *\n * @productdesc {highmaps}\n * In Highmaps the context can also be a data class in case of a\n * `colorAxis`.\n *\n * @sample {highcharts} highcharts/legend/labelformatter/\n * Add text\n * @sample {highmaps} maps/legend/labelformatter/\n * Data classes with label formatter\n *\n * @type {Highcharts.FormatterCallbackFunction}\n */\n labelFormatter: function () {\n // eslint-enable valid-jsdoc\n return this.name;\n },\n /**\n * Line height for the legend items. Deprecated as of 2.1\\. Instead,\n * the line height for each item can be set using\n * `itemStyle.lineHeight`, and the padding between items using\n * `itemMarginTop` and `itemMarginBottom`.\n *\n * @sample {highcharts} highcharts/legend/lineheight/\n * Setting padding\n *\n * @deprecated\n *\n * @type {number}\n * @default 16\n * @since 2.0\n * @product highcharts gantt\n * @apioption legend.lineHeight\n */\n /**\n * If the plot area sized is calculated automatically and the legend is\n * not floating, the legend margin is the space between the legend and\n * the axis labels or plot area.\n *\n * @sample {highcharts} highcharts/legend/margin-default/\n * 12 pixels by default\n * @sample {highcharts} highcharts/legend/margin-30/\n * 30 pixels\n *\n * @type {number}\n * @default 12\n * @since 2.1\n * @apioption legend.margin\n */\n /**\n * Maximum pixel height for the legend. When the maximum height is\n * extended, navigation will show.\n *\n * @type {number}\n * @since 2.3.0\n * @apioption legend.maxHeight\n */\n /**\n * The color of the drawn border around the legend.\n *\n * @see In styled mode, the legend border stroke can be applied with the\n * `.highcharts-legend-box` class.\n *\n * @sample {highcharts} highcharts/legend/bordercolor/\n * Brown border\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n borderColor: \"#999999\" /* Palette.neutralColor40 */,\n /**\n * The border corner radius of the legend.\n *\n * @sample {highcharts} highcharts/legend/borderradius-default/\n * Square by default\n * @sample {highcharts} highcharts/legend/borderradius-round/\n * 5px rounded\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n */\n borderRadius: 0,\n /**\n * Options for the paging or navigation appearing when the legend is\n * overflown. Navigation works well on screen, but not in static\n * exported images. One way of working around that is to\n * [increase the chart height in\n * export](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/legend/navigation-enabled-false/).\n *\n * @sample highcharts/legend/scrollable-vertical/\n * Legend with vertical scrollable extension\n * @sample highcharts/legend/scrollable-horizontal/\n * Legend with horizontal scrollable extension\n *\n */\n navigation: {\n /**\n * How to animate the pages when navigating up or down. A value of\n * `true` applies the default navigation given in the\n * `chart.animation` option. Additional options can be given as an\n * object containing values for easing and duration.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {boolean|Partial}\n * @default true\n * @since 2.2.4\n * @apioption legend.navigation.animation\n */\n /**\n * The pixel size of the up and down arrows in the legend paging\n * navigation.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {number}\n * @default 12\n * @since 2.2.4\n * @apioption legend.navigation.arrowSize\n */\n /**\n * Whether to enable the legend navigation. In most cases, disabling\n * the navigation results in an unwanted overflow.\n *\n * See also the\n * [adapt chart to legend](https://github.com/highcharts/adapt-chart-to-legend)\n * plugin for a solution to extend the chart height to make room for\n * the legend, optionally in exported charts only.\n *\n * @type {boolean}\n * @default true\n * @since 4.2.4\n * @apioption legend.navigation.enabled\n */\n /**\n * Text styles for the legend page navigation.\n *\n * @see In styled mode, the navigation items are styled with the\n * `.highcharts-legend-navigation` class.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {Highcharts.CSSObject}\n * @since 2.2.4\n * @apioption legend.navigation.style\n */\n style: {\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * The color for the active up or down arrow in the legend page\n * navigation.\n *\n * @see In styled mode, the active arrow be styled with the\n * `.highcharts-legend-nav-active` class.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 2.2.4\n */\n activeColor: \"#0022ff\" /* Palette.highlightColor100 */,\n /**\n * The color of the inactive up or down arrow in the legend page\n * navigation. .\n *\n * @see In styled mode, the inactive arrow be styled with the\n * `.highcharts-legend-nav-inactive` class.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 2.2.4\n */\n inactiveColor: \"#cccccc\" /* Palette.neutralColor20 */\n },\n /**\n * The inner padding of the legend box.\n *\n * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n *\n * @type {number}\n * @default 8\n * @since 2.2.0\n * @apioption legend.padding\n */\n /**\n * Whether to reverse the order of the legend items compared to the\n * order of the series or points as defined in the configuration object.\n *\n * @see [yAxis.reversedStacks](#yAxis.reversedStacks),\n * [series.legendIndex](#series.legendIndex)\n *\n * @sample {highcharts} highcharts/legend/reversed/\n * Stacked bar with reversed legend\n *\n * @type {boolean}\n * @default false\n * @since 1.2.5\n * @apioption legend.reversed\n */\n /**\n * Whether to show the symbol on the right side of the text rather than\n * the left side. This is common in Arabic and Hebrew.\n *\n * @sample {highcharts} highcharts/legend/rtl/\n * Symbol to the right\n *\n * @type {boolean}\n * @default false\n * @since 2.2\n * @apioption legend.rtl\n */\n /**\n * CSS styles for the legend area. In the 1.x versions the position\n * of the legend area was determined by CSS. In 2.x, the position is\n * determined by properties like `align`, `verticalAlign`, `x` and `y`,\n * but the styles are still parsed for backwards compatibility.\n *\n * @deprecated\n *\n * @type {Highcharts.CSSObject}\n * @product highcharts highstock\n * @apioption legend.style\n */\n /**\n * CSS styles for each legend item. Only a subset of CSS is supported,\n * notably those options related to text. The default `textOverflow`\n * property makes long texts truncate. Set it to `undefined` to wrap\n * text instead. A `width` property can be added to control the text\n * width.\n *\n * @see In styled mode, the legend items can be styled with the\n * `.highcharts-legend-item` class.\n *\n * @sample {highcharts} highcharts/legend/itemstyle/\n * Bold black text\n * @sample {highmaps} maps/legend/itemstyle/\n * Item text styles\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#333333\", \"cursor\": \"pointer\", \"fontSize\": \"0.8em\", \"fontWeight\": \"bold\", \"textOverflow\": \"ellipsis\"}\n */\n itemStyle: {\n /**\n * @ignore\n */\n color: \"#333333\" /* Palette.neutralColor80 */,\n /**\n * @ignore\n */\n cursor: 'pointer',\n /**\n * @ignore\n */\n fontSize: '0.8em',\n /**\n * @ignore\n */\n textDecoration: 'none',\n /**\n * @ignore\n */\n textOverflow: 'ellipsis'\n },\n /**\n * CSS styles for each legend item in hover mode. Only a subset of\n * CSS is supported, notably those options related to text. Properties\n * are inherited from `style` unless overridden here.\n *\n * @see In styled mode, the hovered legend items can be styled with\n * the `.highcharts-legend-item:hover` pseudo-class.\n *\n * @sample {highcharts} highcharts/legend/itemhoverstyle/\n * Red on hover\n * @sample {highmaps} maps/legend/itemstyle/\n * Item text styles\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#000000\"}\n */\n itemHoverStyle: {\n /**\n * @ignore\n */\n color: \"#000000\" /* Palette.neutralColor100 */\n },\n /**\n * CSS styles for each legend item when the corresponding series or\n * point is hidden. Only a subset of CSS is supported, notably those\n * options related to text. Properties are inherited from `style`\n * unless overridden here.\n *\n * @see In styled mode, the hidden legend items can be styled with\n * the `.highcharts-legend-item-hidden` class.\n *\n * @sample {highcharts} highcharts/legend/itemhiddenstyle/\n * Darker gray color\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#cccccc\"}\n */\n itemHiddenStyle: {\n /**\n * @ignore\n */\n color: \"#666666\" /* Palette.neutralColor60 */,\n /**\n * @ignore\n */\n textDecoration: 'line-through'\n },\n /**\n * Whether to apply a drop shadow to the legend. A `backgroundColor`\n * also needs to be applied for this to take effect. The shadow can be\n * an object configuration containing `color`, `offsetX`, `offsetY`,\n * `opacity` and `width`.\n *\n * @sample {highcharts} highcharts/legend/shadow/\n * White background and drop shadow\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {boolean|Highcharts.CSSObject}\n */\n shadow: false,\n /**\n * Default styling for the checkbox next to a legend item when\n * `showCheckbox` is true.\n *\n * @type {Highcharts.CSSObject}\n * @default {\"width\": \"13px\", \"height\": \"13px\", \"position\":\"absolute\"}\n */\n itemCheckboxStyle: {\n /**\n * @ignore\n */\n position: 'absolute',\n /**\n * @ignore\n */\n width: '13px', // For IE precision\n /**\n * @ignore\n */\n height: '13px'\n },\n /// itemWidth: undefined,\n /**\n * When this is true, the legend symbol width will be the same as\n * the symbol height, which in turn defaults to the font size of the\n * legend items.\n *\n * @since 5.0.0\n */\n squareSymbol: true,\n /**\n * The pixel height of the symbol for series types that use a rectangle\n * in the legend. Defaults to the font size of legend items.\n *\n * Note: This option is a default source of color axis height, if the\n * [colorAxis.height](https://api.highcharts.com/highcharts/colorAxis.height)\n * option is not set.\n *\n * @productdesc {highmaps}\n * In Highmaps, when the symbol is the gradient of a vertical color\n * axis, the height defaults to 200.\n *\n * @sample {highmaps} maps/legend/layout-vertical-sized/\n * Sized vertical gradient\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * No distance between data classes\n *\n * @type {number}\n * @since 3.0.8\n * @apioption legend.symbolHeight\n */\n /**\n * The border radius of the symbol for series types that use a rectangle\n * in the legend. Defaults to half the `symbolHeight`, effectively\n * creating a circle.\n *\n * For color axis scales, it defaults to 3.\n *\n * @sample {highcharts} highcharts/legend/symbolradius/\n * Round symbols\n * @sample {highstock} highcharts/legend/symbolradius/\n * Round symbols\n * @sample {highmaps} highcharts/legend/symbolradius/\n * Round symbols\n *\n * @type {number}\n * @since 3.0.8\n * @apioption legend.symbolRadius\n */\n /**\n * The pixel width of the legend item symbol. When the `squareSymbol`\n * option is set, this defaults to the `symbolHeight`, otherwise 16.\n *\n * Note: This option is a default source of color axis width, if the\n * [colorAxis.width](https://api.highcharts.com/highcharts/colorAxis.width)\n * option is not set.\n *\n * @productdesc {highmaps}\n * In Highmaps, when the symbol is the gradient of a horizontal color\n * axis, the width defaults to 200.\n *\n * @sample {highcharts} highcharts/legend/symbolwidth/\n * Greater symbol width and padding\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/layout-vertical-sized/\n * Sized vertical gradient\n *\n * @type {number}\n * @apioption legend.symbolWidth\n */\n /**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the legend item texts.\n *\n * Prior to 4.1.7, when using HTML, [legend.navigation](\n * #legend.navigation) was disabled.\n *\n * @sample highcharts/legend/scrollable-vertical/\n * Legend with vertical scrollable extension\n * @sample highcharts/legend/scrollable-horizontal/\n * Legend with horizontal scrollable extension\n *\n * @type {boolean}\n * @default false\n * @apioption legend.useHTML\n */\n /**\n * For a color axis with data classes, how many decimals to render in\n * the legend. The default preserves the decimals of the range numbers.\n *\n * @type {number}\n * @default -1\n * @product highcharts highmaps\n * @apioption legend.valueDecimals\n */\n /**\n * For a color axis with data classes, a suffix for the range numbers in\n * the legend.\n *\n * @type {string}\n * @default ''\n * @product highcharts highmaps\n * @apioption legend.valueSuffix\n */\n /**\n * The width of the legend box. If a number is set, it translates to\n * pixels. Since v7.0.2 it allows setting a percent string of the full\n * chart width, for example `40%`.\n *\n * Defaults to the full chart width for legends below or above the\n * chart, half the chart width for legends to the left and right.\n *\n * @sample {highcharts} highcharts/legend/width/\n * Aligned to the plot area\n * @sample {highcharts} highcharts/legend/width-percent/\n * A percent of the chart width\n *\n * @type {number|string}\n * @since 2.0\n * @apioption legend.width\n */\n /**\n * The pixel padding between the legend item symbol and the legend\n * item text.\n *\n * @sample {highcharts} highcharts/legend/symbolpadding/\n * Greater symbol width and padding\n */\n symbolPadding: 5,\n /**\n * The vertical alignment of the legend box. Can be one of `top`,\n * `middle` or `bottom`. Vertical position can be further determined\n * by the `y` option.\n *\n * In the case that the legend is aligned in a corner position, the\n * `layout` option will determine whether to place it above/below\n * or on the side of the plot area.\n *\n * When the [layout](#legend.layout) option is `proximate`, the\n * `verticalAlign` option doesn't apply.\n *\n * @sample {highcharts} highcharts/legend/verticalalign/\n * Legend 100px from the top of the chart\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/alignment/\n * Legend alignment\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.0\n */\n verticalAlign: 'bottom',\n // Width: undefined,\n /**\n * The x offset of the legend relative to its horizontal alignment\n * `align` within chart.spacingLeft and chart.spacingRight. Negative\n * x moves it to the left, positive x moves it to the right.\n *\n * @sample {highcharts} highcharts/legend/width/\n * Aligned to the plot area\n *\n * @since 2.0\n */\n x: 0,\n /**\n * The vertical offset of the legend relative to it's vertical alignment\n * `verticalAlign` within chart.spacingTop and chart.spacingBottom.\n * Negative y moves it up, positive y moves it down.\n *\n * @sample {highcharts} highcharts/legend/verticalalign/\n * Legend 100px from the top of the chart\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/alignment/\n * Legend alignment\n *\n * @since 2.0\n */\n y: 0,\n /**\n * A title to be added on top of the legend.\n *\n * @sample {highcharts} highcharts/legend/title/\n * Legend title\n * @sample {highmaps} maps/legend/alignment/\n * Legend with title\n *\n * @since 3.0\n */\n title: {\n /**\n * A text or HTML string for the title.\n *\n * @type {string}\n * @since 3.0\n * @apioption legend.title.text\n */\n /**\n * Generic CSS styles for the legend title.\n *\n * @see In styled mode, the legend title is styled with the\n * `.highcharts-legend-title` class.\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontSize\": \"0.8em\", \"fontWeight\": \"bold\"}\n * @since 3.0\n */\n style: {\n /**\n * @ignore\n */\n fontSize: '0.8em',\n /**\n * @ignore\n */\n fontWeight: 'bold'\n }\n }\n },\n /**\n * The loading options control the appearance of the loading screen\n * that covers the plot area on chart operations. This screen only\n * appears after an explicit call to `chart.showLoading()`. It is a\n * utility for developers to communicate to the end user that something\n * is going on, for example while retrieving new data via an XHR connection.\n * The \"Loading...\" text itself is not part of this configuration\n * object, but part of the `lang` object.\n */\n loading: {\n /**\n * The duration in milliseconds of the fade out effect.\n *\n * @sample highcharts/loading/hideduration/\n * Fade in and out over a second\n *\n * @type {number}\n * @default 100\n * @since 1.2.0\n * @apioption loading.hideDuration\n */\n /**\n * The duration in milliseconds of the fade in effect.\n *\n * @sample highcharts/loading/hideduration/\n * Fade in and out over a second\n *\n * @type {number}\n * @default 100\n * @since 1.2.0\n * @apioption loading.showDuration\n */\n /**\n * CSS styles for the loading label `span`.\n *\n * @see In styled mode, the loading label is styled with the\n * `.highcharts-loading-inner` class.\n *\n * @sample {highcharts|highmaps} highcharts/loading/labelstyle/\n * Vertically centered\n * @sample {highstock} stock/loading/general/\n * Label styles\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontWeight\": \"bold\", \"position\": \"relative\", \"top\": \"45%\"}\n * @since 1.2.0\n */\n labelStyle: {\n /**\n * @ignore\n */\n fontWeight: 'bold',\n /**\n * @ignore\n */\n position: 'relative',\n /**\n * @ignore\n */\n top: '45%'\n },\n /**\n * CSS styles for the loading screen that covers the plot area.\n *\n * In styled mode, the loading label is styled with the\n * `.highcharts-loading` class.\n *\n * @sample {highcharts|highmaps} highcharts/loading/style/\n * Gray plot area, white text\n * @sample {highstock} stock/loading/general/\n * Gray plot area, white text\n *\n * @type {Highcharts.CSSObject}\n * @default {\"position\": \"absolute\", \"backgroundColor\": \"#ffffff\", \"opacity\": 0.5, \"textAlign\": \"center\"}\n * @since 1.2.0\n */\n style: {\n /**\n * @ignore\n */\n position: 'absolute',\n /**\n * @ignore\n */\n backgroundColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * @ignore\n */\n opacity: 0.5,\n /**\n * @ignore\n */\n textAlign: 'center'\n }\n },\n /**\n * Options for the tooltip that appears when the user hovers over a\n * series or point.\n *\n * @declare Highcharts.TooltipOptions\n */\n tooltip: {\n /**\n * The color of the tooltip border. When `undefined`, the border takes\n * the color of the corresponding series or point.\n *\n * Note that the [borderWidth](#tooltip.borderWidth) is usually 0 by\n * default, so the border color may not be visible until a border width\n * is set.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/ Follow\n * series by default\n * @sample {highcharts} highcharts/tooltip/bordercolor-black/ Black\n * border\n * @sample {highstock} stock/tooltip/general/ Styled tooltip\n * @sample {highmaps} maps/tooltip/background-border/ Background and\n * border demo\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption tooltip.borderColor\n */\n /**\n * A CSS class name to apply to the tooltip's container div,\n * allowing unique CSS styling for each chart.\n *\n * @type {string}\n * @apioption tooltip.className\n */\n /**\n * Since 4.1, the crosshair definitions are moved to the Axis object\n * in order for a better separation from the tooltip. See\n * [xAxis.crosshair](#xAxis.crosshair).\n *\n * @sample {highcharts} highcharts/tooltip/crosshairs-x/\n * Enable a crosshair for the x value\n *\n * @deprecated\n *\n * @type {*}\n * @default true\n * @apioption tooltip.crosshairs\n */\n /**\n * Distance from point to tooltip in pixels.\n *\n * @type {number}\n * @default 16\n * @apioption tooltip.distance\n */\n /**\n * Whether the tooltip should follow the mouse as it moves across\n * columns, pie slices and other point types with an extent.\n * By default it behaves this way for pie, polygon, map, sankey\n * and wordcloud series by override in the `plotOptions`\n * for those series types.\n *\n * Does not apply if [split](#tooltip.split) is `true`.\n *\n * For touch moves to behave the same way, [followTouchMove](\n * #tooltip.followTouchMove) must be `true` also.\n *\n * @sample highcharts/tooltip/followpointer/\n * Tooltip follow pointer comparison\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock} false\n * @default {highmaps} true\n * @since 3.0\n * @apioption tooltip.followPointer\n */\n /**\n * Whether the tooltip should update as the finger moves on a touch\n * device. If this is `true` and [chart.panning](#chart.panning) is\n * set,`followTouchMove` will take over one-finger touches, so the user\n * needs to use two fingers for zooming and panning.\n *\n * Note the difference to [followPointer](#tooltip.followPointer) that\n * only defines the _position_ of the tooltip. If `followPointer` is\n * false in for example a column series, the tooltip will show above or\n * below the column, but as `followTouchMove` is true, the tooltip will\n * jump from column to column as the user swipes across the plot area.\n *\n * @type {boolean}\n * @default {highcharts} true\n * @default {highstock} true\n * @default {highmaps} false\n * @since 3.0.1\n * @apioption tooltip.followTouchMove\n */\n /**\n * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for the whole shared tooltip. When format strings are a requirement,\n * it is usually more convenient to use `headerFormat`, `pointFormat`\n * and `footerFormat`, but the `format` option allows combining them\n * into one setting.\n *\n * The context of the format string is the same as that of the\n * `tooltip.formatter` callback.\n *\n * @sample {highcharts} highcharts/tooltip/format-shared/\n * Format for shared tooltip\n *\n * @type {string}\n * @default undefined\n * @since 11.1.0\n * @apioption tooltip.format\n */\n /**\n * Callback function to format the text of the tooltip from scratch. In\n * case of single or [shared](#tooltip.shared) tooltips, a string should\n * be returned. In case of [split](#tooltip.split) tooltips, it should\n * return an array where the first item is the header, and subsequent\n * items are mapped to the points. Return `false` to disable tooltip for\n * a specific point on series.\n *\n * A subset of HTML is supported. Unless `useHTML` is true, the HTML of\n * the tooltip is parsed and converted to SVG, therefore this isn't a\n * complete HTML renderer. The following HTML tags are supported: `b`,\n * `br`, `em`, `i`, `span`, `strong`. Spans can be styled with a `style`\n * attribute, but only text-related CSS, that is shared with SVG, is\n * handled.\n *\n * The context of the formatter (since v12) is the\n * [Point](https://api.highcharts.com/class-reference/Highcharts.Point)\n * instance. If the tooltip is shared or split, an array `this.points`\n * contains all points of the hovered x-value.\n *\n * Common properties from the Point to use in the formatter include:\n *\n * - **Point.percentage**:\n * Stacked series and pies only. The point's percentage of the total.\n *\n * - **Point.points**:\n * In a shared or split tooltip, this is an array containing all the\n * hovered points.\n *\n * - **this.series**:\n * The series object. The series name is available through\n * `this.series.name`.\n *\n * - **this.total**:\n * The total value at this point's x value in a stacked series, or the\n * sum of all slices in a pie series.\n *\n * - **this.x**:\n * The x value.\n *\n * - **this.y**:\n * The y value.\n *\n * @sample {highcharts} highcharts/tooltip/formatter-simple/\n * Simple string formatting\n * @sample {highcharts} highcharts/tooltip/formatter-shared/\n * Formatting with shared tooltip\n * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n * Formatting with split tooltip\n * @sample highcharts/tooltip/formatter-conditional-default/\n * Extending default formatter\n * @sample {highstock} stock/tooltip/formatter/\n * Formatting with shared tooltip\n * @sample {highmaps} maps/tooltip/formatter/\n * String formatting\n *\n * @type {Highcharts.TooltipFormatterCallbackFunction}\n * @apioption tooltip.formatter\n */\n /**\n * Callback function to format the text of the tooltip for\n * visible null points.\n * Works analogously to [formatter](#tooltip.formatter).\n *\n * @sample highcharts/plotoptions/series-nullformat\n * Format data label and tooltip for null point.\n *\n * @type {Highcharts.TooltipFormatterCallbackFunction}\n * @apioption tooltip.nullFormatter\n */\n /**\n * Whether to allow the tooltip to render outside the chart's SVG\n * element box. By default (`false`), the tooltip is rendered within the\n * chart's SVG element, which results in the tooltip being aligned\n * inside the chart area. For small charts, this may result in clipping\n * or overlapping. When `true`, a separate SVG element is created and\n * overlaid on the page, allowing the tooltip to be aligned inside the\n * page itself. Beware that with this option active, CSS classes on the\n * chart's target container, with classnames matching the pattern\n * 'highcharts-*', will be set on the tooltip as well. This is done to\n * support theming for tooltips with this option.\n *\n * Defaults to `true` if `chart.scrollablePlotArea` is activated,\n * otherwise `false`.\n *\n * @sample highcharts/tooltip/outside\n * Small charts with tooltips outside\n *\n * @type {boolean|undefined}\n * @default undefined\n * @since 6.1.1\n * @apioption tooltip.outside\n */\n /**\n * A callback function for formatting the HTML output for a single point\n * in the tooltip. Like the `pointFormat` string, but with more\n * flexibility.\n *\n * @type {Highcharts.FormatterCallbackFunction}\n * @since 4.1.0\n * @context Highcharts.Point\n * @apioption tooltip.pointFormatter\n */\n /**\n * A callback function to place the tooltip in a custom position. The\n * callback receives three parameters: `labelWidth`, `labelHeight` and\n * `point`, where point contains values for `plotX` and `plotY` telling\n * where the reference point is in the plot area. Add `chart.plotLeft`\n * and `chart.plotTop` to get the full coordinates.\n *\n * To find the actual hovered `Point` instance, use\n * `this.chart.hoverPoint`. For shared or split tooltips, all the hover\n * points are available in `this.chart.hoverPoints`.\n *\n * Since v7, when [tooltip.split](#tooltip.split) option is enabled,\n * positioner is called for each of the boxes separately, including\n * xAxis header. xAxis header is not a point, instead `point` argument\n * contains info: `{ plotX: Number, plotY: Number, isHeader: Boolean }`\n *\n * The return should be an object containing x and y values, for example\n * `{ x: 100, y: 100 }`.\n *\n * @sample {highcharts} highcharts/tooltip/positioner/\n * A fixed tooltip position\n * @sample {highstock} stock/tooltip/positioner/\n * A fixed tooltip position on top of the chart\n * @sample {highmaps} maps/tooltip/positioner/\n * A fixed tooltip position\n * @sample {highstock} stock/tooltip/split-positioner/\n * Split tooltip with fixed positions\n * @sample {highstock} stock/tooltip/positioner-scrollable-plotarea/\n * Scrollable plot area combined with tooltip positioner\n *\n * @type {Highcharts.TooltipPositionerCallbackFunction}\n * @since 2.2.4\n * @apioption tooltip.positioner\n */\n /**\n * Shows tooltip for all points with the same X value. Splits the\n * tooltip into one label per series, with the header close to the axis.\n * This is recommended over [shared](#tooltip.shared)\n * tooltips for charts with multiple line series, generally making them\n * easier to read. This option takes precedence over `tooltip.shared`.\n *\n * Not supported for [polar](#chart.polar) and [inverted](#chart.inverted) charts.\n *\n * @productdesc {highstock} In Highcharts Stock, tooltips are split\n * by default since v6.0.0. Stock charts typically contain\n * multi-dimension points and multiple panes, making split tooltips\n * the preferred layout over\n * the previous `shared` tooltip.\n *\n * @sample highcharts/tooltip/split/\n * Split tooltip\n * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n * Split tooltip and custom formatter callback\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock} true\n * @since 5.0.0\n * @product highcharts highstock\n * @apioption tooltip.split\n */\n /**\n * Prevents the tooltip from switching or closing, when touched or\n * pointed.\n *\n * @sample highcharts/tooltip/stickoncontact/\n * Tooltip sticks on pointer contact\n *\n * @type {boolean}\n * @since 8.0.1\n * @apioption tooltip.stickOnContact\n */\n /**\n * Use HTML to render the contents of the tooltip instead of SVG. Using\n * HTML allows advanced formatting like tables and images in the\n * tooltip. It is also recommended for rtl languages as it works around\n * rtl bugs in early Firefox.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n * A table for value alignment\n * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n * Full HTML tooltip\n * @sample {highmaps} maps/tooltip/usehtml/\n * Pure HTML tooltip\n *\n * @type {boolean}\n * @default false\n * @since 2.2\n * @apioption tooltip.useHTML\n */\n /**\n * How many decimals to show in each series' y value. This is\n * overridable in each series' tooltip options object. The default is to\n * preserve all decimals.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n * @sample {highmaps} maps/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n *\n * @type {number|undefined}\n * @since 2.2\n * @apioption tooltip.valueDecimals\n */\n /**\n * A string to prepend to each series' y value. Overridable in each\n * series' tooltip options object.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n * @sample {highmaps} maps/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n *\n * @type {string}\n * @since 2.2\n * @apioption tooltip.valuePrefix\n */\n /**\n * A string to append to each series' y value. Overridable in each\n * series' tooltip options object.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n * @sample {highmaps} maps/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n *\n * @type {string}\n * @since 2.2\n * @apioption tooltip.valueSuffix\n */\n /**\n * The format for the date in the tooltip header if the X axis is a\n * datetime axis. The default is a best guess based on the smallest\n * distance between points in the chart.\n *\n * @sample {highcharts} highcharts/tooltip/xdateformat/\n * A different format\n *\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @product highcharts highstock gantt\n * @apioption tooltip.xDateFormat\n */\n /**\n * How many decimals to show for the `point.change`\n * or the `point.cumulativeSum` value when the `series.compare`\n * or the `series.cumulative` option is set.\n * This is overridable in each series' tooltip options object.\n *\n * @type {number}\n * @default 2\n * @since 1.0.1\n * @product highstock\n * @apioption tooltip.changeDecimals\n */\n /**\n * Enable or disable the tooltip.\n *\n * @sample {highcharts} highcharts/tooltip/enabled/\n * Disabled\n * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n * Disable tooltip and show values on chart instead\n */\n enabled: true,\n /**\n * Enable or disable animation of the tooltip.\n *\n * @type {boolean|Partial}\n * @since 2.3.0\n */\n animation: {\n duration: 300,\n // EaseOutCirc\n easing: (x) => Math.sqrt(1 - Math.pow(x - 1, 2))\n },\n /**\n * The radius of the rounded border corners.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * Default border radius\n * @sample {highcharts} highcharts/tooltip/borderradius-0/\n * Square borders\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n */\n borderRadius: 3,\n /**\n * For series on datetime axes, the date format in the tooltip's\n * header will by default be guessed based on the closest data points.\n * This member gives the default string representations used for\n * each unit. For an overview of the string or object configuration, see\n * [dateFormat](/class-reference/Highcharts.Time#dateFormat).\n *\n * @see [xAxis.dateTimeLabelFormats](#xAxis.dateTimeLabelFormats)\n *\n * @type {Highcharts.Dictionary}\n * @product highcharts highstock gantt\n */\n dateTimeLabelFormats: {\n /** @internal */\n millisecond: '%[AebHMSL]',\n /** @internal */\n second: '%[AebHMS]',\n /** @internal */\n minute: '%[AebHM]',\n /** @internal */\n hour: '%[AebHM]',\n /** @internal */\n day: '%[AebY]',\n /** @internal */\n week: 'Week from %[AebY]',\n /** @internal */\n month: '%[BY]',\n /** @internal */\n year: '%Y'\n },\n /**\n * A string to append to the tooltip format.\n *\n * @sample {highcharts} highcharts/tooltip/footerformat/\n * A table for value alignment\n * @sample {highmaps} maps/tooltip/format/\n * Format demo\n *\n * @since 2.2\n */\n footerFormat: '',\n /**\n * The name of a symbol to use for the border around the tooltip\n * header. Applies only when [tooltip.split](#tooltip.split) is\n * enabled.\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n * [series.marker.symbol](plotOptions.line.marker.symbol).\n *\n * @see [tooltip.shape](#tooltip.shape)\n *\n * @sample {highstock} stock/tooltip/split-positioner/\n * Different shapes for header and split boxes\n *\n * @type {Highcharts.TooltipShapeValue}\n * @validvalue [\"callout\", \"rect\"]\n * @since 7.0\n */\n headerShape: 'callout',\n /**\n * The number of milliseconds to wait until the tooltip is hidden when\n * mouse out from a point or chart.\n *\n * @since 3.0\n */\n hideDelay: 500,\n /**\n * Padding inside the tooltip, in pixels.\n *\n * @since 5.0.0\n */\n padding: 8,\n /**\n * The name of a symbol to use for the border around the tooltip. Can\n * be one of: `\"callout\"`, `\"circle\"` or `\"rect\"`. When\n * [tooltip.split](#tooltip.split)\n * option is enabled, shape is applied to all boxes except header, which\n * is controlled by\n * [tooltip.headerShape](#tooltip.headerShape).\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n * [series.marker.symbol](plotOptions.line.marker.symbol).\n *\n * @type {Highcharts.TooltipShapeValue}\n * @since 4.0\n */\n shape: 'callout',\n /**\n * Shows information in the tooltip for all points with the same X\n * value. When the tooltip is shared, the entire plot area will capture\n * mouse movement or touch events. Tooltip texts for series types with\n * ordered data (not pie, scatter, flags etc) will be shown in a single\n * bubble. This is recommended for single series charts and for\n * tablet/mobile optimized charts.\n *\n * See also [tooltip.split](#tooltip.split), that is better suited for\n * charts with many series, especially line-type series. The\n * `tooltip.split` option takes precedence over `tooltip.shared`.\n *\n * @sample {highcharts} highcharts/tooltip/shared-false/\n * False by default\n * @sample {highcharts} highcharts/tooltip/shared-true/\n * True\n * @sample {highcharts} highcharts/tooltip/shared-x-crosshair/\n * True with x axis crosshair\n * @sample {highcharts} highcharts/tooltip/shared-true-mixed-types/\n * True with mixed series types\n *\n * @since 2.1\n * @product highcharts highstock\n */\n shared: false,\n /**\n * Proximity snap for graphs or single points. It defaults to 10 for\n * mouse-powered devices and 25 for touch devices.\n *\n * Note that in most cases the whole plot area captures the mouse\n * movement, and in these cases `tooltip.snap` doesn't make sense. This\n * applies when [stickyTracking](#plotOptions.series.stickyTracking)\n * is `true` (default) and when the tooltip is [shared](#tooltip.shared)\n * or [split](#tooltip.split).\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * 10 px by default\n * @sample {highcharts} highcharts/tooltip/snap-50/\n * 50 px on graph\n *\n * @type {number}\n * @default 10/25\n * @since 1.2.0\n * @product highcharts highstock\n */\n snap: isTouchDevice ? 25 : 10,\n /**\n * The HTML of the tooltip header line. The context is the\n * [Point class](https://api.highcharts.com/class-reference/Highcharts.Point).\n * Variables are enclosed in curly brackets. Examples of common\n * variables to include are `x`, `y`, `series.name` and `series.color`\n * and other properties on the same form. The `point.key` variable\n * contains the category name, x value or datetime string depending on\n * the type of axis. For datetime axes, the `point.key` date format can\n * be set using `tooltip.xDateFormat`.\n *\n * @sample {highcharts} highcharts/tooltip/footerformat/\n * An HTML table in the tooltip\n * @sample {highstock} highcharts/tooltip/footerformat/\n * An HTML table in the tooltip\n * @sample {highmaps} maps/tooltip/format/\n * Format demo\n *\n * @type {string}\n * @apioption tooltip.headerFormat\n */\n headerFormat: '{ucfirst point.key}
',\n /**\n * The HTML of the null point's line in the tooltip. Works analogously\n * to [pointFormat](#tooltip.pointFormat).\n *\n * @sample {highcharts} highcharts/plotoptions/series-nullformat\n * Format data label and tooltip for null point.\n *\n * @type {string}\n * @apioption tooltip.nullFormat\n */\n /**\n * The HTML of the point's line in the tooltip. The context is the\n * [Point class](https://api.highcharts.com/class-reference/Highcharts.Point).\n * Variables are enclosed in curly brackets. Examples of common\n * variables to include are `x`, `y`, `series.name` and `series.color`\n * and other properties on the same form. Furthermore, `y` can be\n * extended by the `tooltip.valuePrefix` and `tooltip.valueSuffix`\n * variables. This can also be overridden for each series, which makes\n * it a good hook for displaying units.\n *\n * In styled mode, the dot is colored by a class name rather than the\n * point color.\n *\n * @sample {highcharts} highcharts/tooltip/pointformat/\n * A different point format with value suffix\n * @sample {highcharts|highstock} highcharts/tooltip/pointformat-extra-information/\n * Show extra information about points in the tooltip\n * @sample {highmaps} maps/tooltip/format/\n * Format demo\n *\n * @type {string}\n * @since 2.2\n * @apioption tooltip.pointFormat\n */\n pointFormat: '\\u25CF {series.name}: {point.y}
',\n /**\n * The background color or gradient for the tooltip.\n *\n * In styled mode, the stroke width is set in the\n * `.highcharts-tooltip-box` class.\n *\n * @sample {highcharts} highcharts/tooltip/backgroundcolor-solid/\n * Yellowish background\n * @sample {highcharts} highcharts/tooltip/backgroundcolor-gradient/\n * Gradient\n * @sample {highcharts} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highstock} stock/tooltip/general/\n * Custom tooltip\n * @sample {highstock} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n * @sample {highmaps} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n backgroundColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * The pixel width of the tooltip border. Defaults to 0 for single\n * tooltips and 1 for split tooltips.\n *\n * In styled mode, the stroke width is set in the\n * `.highcharts-tooltip-box` class.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * 2 pixels\n * @sample {highcharts} highcharts/tooltip/borderwidth/\n * No border (shadow only)\n * @sample {highcharts} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highstock} stock/tooltip/general/\n * Custom tooltip\n * @sample {highstock} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n * @sample {highmaps} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n *\n * @type {number}\n */\n borderWidth: void 0,\n /**\n * Whether to apply a drop shadow to the tooltip.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * True by default\n * @sample {highcharts} highcharts/tooltip/shadow/\n * False\n * @sample {highmaps} maps/tooltip/positioner/\n * Fixed tooltip position, border and shadow disabled\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n */\n shadow: true,\n /**\n * Prevents the tooltip from switching or closing when touched or\n * pointed.\n *\n * @sample highcharts/tooltip/stickoncontact/\n * Tooltip sticks on pointer contact\n *\n * @since 8.0.1\n */\n stickOnContact: false,\n /**\n * CSS styles for the tooltip. The tooltip can also be styled through\n * the CSS class `.highcharts-tooltip`.\n *\n * Note that the default `pointerEvents` style makes the tooltip ignore\n * mouse events, so in order to use clickable tooltips, this value must\n * be set to `auto`.\n *\n * @sample {highcharts} highcharts/tooltip/style/\n * Greater padding, bold text\n *\n * @type {Highcharts.CSSObject}\n */\n style: {\n /** @internal */\n color: \"#333333\" /* Palette.neutralColor80 */,\n /** @internal */\n cursor: 'default',\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * Use HTML to render the contents of the tooltip instead of SVG. Using\n * HTML allows advanced formatting like tables and images in the\n * tooltip. It is also recommended for rtl languages as it works around\n * rtl bugs in early Firefox.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n * A table for value alignment\n * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n * Full HTML tooltip\n * @sample {highmaps} maps/tooltip/usehtml/\n * Pure HTML tooltip\n *\n * @since 2.2\n */\n useHTML: false\n },\n /**\n * Highchart by default puts a credits label in the lower right corner\n * of the chart. This can be changed using these options.\n */\n credits: {\n /**\n * Credits for map source to be concatenated with conventional credit\n * text. By default this is a format string that collects copyright\n * information from the map if available.\n *\n * @see [mapTextFull](#credits.mapTextFull)\n * @see [text](#credits.text)\n *\n * @type {string}\n * @default \\u00a9 {geojson.copyrightShort}\n * @since 4.2.2\n * @product highmaps\n * @apioption credits.mapText\n */\n /**\n * Detailed credits for map source to be displayed on hover of credits\n * text. By default this is a format string that collects copyright\n * information from the map if available.\n *\n * @see [mapText](#credits.mapText)\n * @see [text](#credits.text)\n *\n * @type {string}\n * @default {geojson.copyright}\n * @since 4.2.2\n * @product highmaps\n * @apioption credits.mapTextFull\n */\n /**\n * Whether to show the credits text.\n *\n * @sample {highcharts} highcharts/credits/enabled-false/\n * Credits disabled\n * @sample {highstock} stock/credits/enabled/\n * Credits disabled\n * @sample {highmaps} maps/credits/enabled-false/\n * Credits disabled\n */\n enabled: true,\n /**\n * The URL for the credits label.\n *\n * @sample {highcharts} highcharts/credits/href/\n * Custom URL and text\n * @sample {highmaps} maps/credits/customized/\n * Custom URL and text\n */\n href: 'https://www.highcharts.com?credits',\n /**\n * Position configuration for the credits label.\n *\n * @sample {highcharts} highcharts/credits/position-left/\n * Left aligned\n * @sample {highcharts} highcharts/credits/position-left/\n * Left aligned\n * @sample {highmaps} maps/credits/customized/\n * Left aligned\n * @sample {highmaps} maps/credits/customized/\n * Left aligned\n *\n * @type {Highcharts.AlignObject}\n * @since 2.1\n */\n position: {\n /** @internal */\n align: 'right',\n /** @internal */\n x: -10,\n /** @internal */\n verticalAlign: 'bottom',\n /** @internal */\n y: -5\n },\n /**\n * CSS styles for the credits label.\n *\n * @see In styled mode, credits styles can be set with the\n * `.highcharts-credits` class.\n *\n * @type {Highcharts.CSSObject}\n */\n style: {\n /** @internal */\n cursor: 'pointer',\n /** @internal */\n color: \"#999999\" /* Palette.neutralColor40 */,\n /**\n * @type {number|string}\n */\n fontSize: '0.6em'\n },\n /**\n * The text for the credits label.\n *\n * @productdesc {highmaps}\n * If a map is loaded as GeoJSON, the text defaults to\n * `Highcharts @ {map-credits}`. Otherwise, it defaults to\n * `Highcharts.com`.\n *\n * @sample {highcharts} highcharts/credits/href/\n * Custom URL and text\n * @sample {highmaps} maps/credits/customized/\n * Custom URL and text\n */\n text: 'Highcharts.com'\n }\n};\nconst defaultTime = new Core_Time(defaultOptions.time);\n/**\n * Get the updated default options. Until 3.0.7, merely exposing defaultOptions\n * for outside modules wasn't enough because the setOptions method created a new\n * object.\n *\n * @function Highcharts.getOptions\n *\n * @return {Highcharts.Options}\n * Default options.\n */\nfunction getOptions() {\n return defaultOptions;\n}\n/**\n * Merge the default options with custom options and return the new options\n * structure. Commonly used for defining reusable templates.\n *\n * @sample highcharts/members/setoptions Applying a global theme\n *\n * @function Highcharts.setOptions\n *\n * @param {Highcharts.Options} options\n * The new custom chart options.\n *\n * @return {Highcharts.Options}\n * Updated options.\n */\nfunction setOptions(options) {\n Defaults_fireEvent(Core_Globals, 'setOptions', { options });\n // Copy in the default options\n Defaults_merge(true, defaultOptions, options);\n // Update the time object\n if (options.time) {\n defaultTime.update(defaultOptions.time);\n }\n if (options.lang && 'locale' in options.lang) {\n defaultTime.update({\n locale: options.lang.locale\n });\n }\n return defaultOptions;\n}\n/* *\n *\n * Default Export\n *\n * */\nconst DefaultOptions = {\n defaultOptions,\n defaultTime,\n getOptions,\n setOptions\n};\n/* harmony default export */ const Defaults = (DefaultOptions);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @typedef {\"plotBox\"|\"spacingBox\"} Highcharts.ButtonRelativeToValue\n */\n/**\n * Gets fired when a series is added to the chart after load time, using the\n * `addSeries` method. Returning `false` prevents the series from being added.\n *\n * @callback Highcharts.ChartAddSeriesCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {Highcharts.ChartAddSeriesEventObject} event\n * The event that occurred.\n */\n/**\n * Contains common event information. Through the `options` property you can\n * access the series options that were passed to the `addSeries` method.\n *\n * @interface Highcharts.ChartAddSeriesEventObject\n */ /**\n* The series options that were passed to the `addSeries` method.\n* @name Highcharts.ChartAddSeriesEventObject#options\n* @type {Highcharts.SeriesOptionsType}\n*/ /**\n* Prevents the default behaviour of the event.\n* @name Highcharts.ChartAddSeriesEventObject#preventDefault\n* @type {Function}\n*/ /**\n* The event target.\n* @name Highcharts.ChartAddSeriesEventObject#target\n* @type {Highcharts.Chart}\n*/ /**\n* The event type.\n* @name Highcharts.ChartAddSeriesEventObject#type\n* @type {\"addSeries\"}\n*/\n/**\n * Gets fired when clicking on the plot background.\n *\n * @callback Highcharts.ChartClickCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {Highcharts.PointerEventObject} event\n * The event that occurred.\n */\n/**\n * Contains an axes of the clicked spot.\n *\n * @interface Highcharts.ChartClickEventAxisObject\n */ /**\n* Axis at the clicked spot.\n* @name Highcharts.ChartClickEventAxisObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Axis value at the clicked spot.\n* @name Highcharts.ChartClickEventAxisObject#value\n* @type {number}\n*/\n/**\n * Contains information about the clicked spot on the chart. Remember the unit\n * of a datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * @interface Highcharts.ChartClickEventObject\n * @extends Highcharts.PointerEventObject\n */ /**\n* Information about the x-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#xAxis\n* @type {Array}\n*/ /**\n* Information about the y-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#yAxis\n* @type {Array}\n*/ /**\n* Information about the z-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#zAxis\n* @type {Array|undefined}\n*/\n/**\n * Gets fired when the chart is finished loading.\n *\n * @callback Highcharts.ChartLoadCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * Fires when the chart is redrawn, either after a call to `chart.redraw()` or\n * after an axis, series or point is modified with the `redraw` option set to\n * `true`.\n *\n * @callback Highcharts.ChartRedrawCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * Gets fired after initial load of the chart (directly after the `load` event),\n * and after each redraw (directly after the `redraw` event).\n *\n * @callback Highcharts.ChartRenderCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * Gets fired when an area of the chart has been selected. The default action\n * for the selection event is to zoom the chart to the selected area. It can be\n * prevented by calling `event.preventDefault()` or return false.\n *\n * @callback Highcharts.ChartSelectionCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {Highcharts.SelectEventObject} event\n * Event informations\n *\n * @return {boolean|undefined}\n * Return false to prevent the default action, usually zoom.\n */\n(''); // Detach doclets above\n\n;// ./code/es-modules/Core/Color/Color.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { isNumber: Color_isNumber, merge: Color_merge, pInt: Color_pInt, defined: Color_defined } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable valid-jsdoc */\n/**\n * Handle color operations. Some object methods are chainable.\n *\n * @class\n * @name Highcharts.Color\n *\n * @param {Highcharts.ColorType} input\n * The input color in either rgba or hex format\n */\nclass Color {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * Creates a color instance out of a color string or object.\n *\n * @function Highcharts.Color.parse\n *\n * @param {Highcharts.ColorType} [input]\n * The input color in either rgba or hex format.\n *\n * @return {Highcharts.Color}\n * Color instance.\n */\n static parse(input) {\n return input ? new Color(input) : Color.None;\n }\n /* *\n *\n * Constructor\n *\n * */\n constructor(input) {\n this.rgba = [NaN, NaN, NaN, NaN];\n this.input = input;\n const GlobalColor = Core_Globals.Color;\n // Backwards compatibility, allow class overwrite\n if (GlobalColor && GlobalColor !== Color) {\n return new GlobalColor(input);\n }\n let result, rgba, i, parser;\n // Gradients\n if (typeof input === 'object' &&\n typeof input.stops !== 'undefined') {\n this.stops = input.stops.map((stop) => new Color(stop[1]));\n // Solid colors\n }\n else if (typeof input === 'string') {\n this.input = input = (Color.names[input.toLowerCase()] || input);\n i = Color.parsers.length;\n while (i-- && !rgba) {\n parser = Color.parsers[i];\n result = parser.regex.exec(input);\n if (result) {\n rgba = parser.parse(result);\n }\n }\n }\n if (rgba) {\n this.rgba = rgba;\n }\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Return the color or gradient stops in the specified format\n *\n * @function Highcharts.Color#get\n *\n * @param {string} [format]\n * Possible values are 'a', 'rgb', 'rgba' (default).\n *\n * @return {Highcharts.ColorType}\n * This color as a string or gradient stops.\n */\n get(format) {\n const input = this.input, rgba = this.rgba;\n if (typeof input === 'object' &&\n typeof this.stops !== 'undefined') {\n const ret = Color_merge(input);\n ret.stops = [].slice.call(ret.stops);\n this.stops.forEach((stop, i) => {\n ret.stops[i] = [\n ret.stops[i][0],\n stop.get(format)\n ];\n });\n return ret;\n }\n // It's NaN if gradient colors on a column chart\n if (rgba && Color_isNumber(rgba[0])) {\n if (format === 'rgb' || (!format && rgba[3] === 1)) {\n return 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n }\n if (format === 'a') {\n return `${rgba[3]}`;\n }\n return 'rgba(' + rgba.join(',') + ')';\n }\n return input;\n }\n /**\n * Brighten the color instance.\n *\n * @function Highcharts.Color#brighten\n *\n * @param {number} alpha\n * The alpha value.\n *\n * @return {Highcharts.Color}\n * This color with modifications.\n */\n brighten(alpha) {\n const rgba = this.rgba;\n if (this.stops) {\n this.stops.forEach(function (stop) {\n stop.brighten(alpha);\n });\n }\n else if (Color_isNumber(alpha) && alpha !== 0) {\n for (let i = 0; i < 3; i++) {\n rgba[i] += Color_pInt(alpha * 255);\n if (rgba[i] < 0) {\n rgba[i] = 0;\n }\n if (rgba[i] > 255) {\n rgba[i] = 255;\n }\n }\n }\n return this;\n }\n /**\n * Set the color's opacity to a given alpha value.\n *\n * @function Highcharts.Color#setOpacity\n *\n * @param {number} alpha\n * Opacity between 0 and 1.\n *\n * @return {Highcharts.Color}\n * Color with modifications.\n */\n setOpacity(alpha) {\n this.rgba[3] = alpha;\n return this;\n }\n /**\n * Return an intermediate color between two colors.\n *\n * @function Highcharts.Color#tweenTo\n *\n * @param {Highcharts.Color} to\n * The color object to tween to.\n *\n * @param {number} pos\n * The intermediate position, where 0 is the from color (current color\n * item), and 1 is the `to` color.\n *\n * @return {Highcharts.ColorType}\n * The intermediate color in rgba notation, or unsupported type.\n */\n tweenTo(to, pos) {\n const fromRgba = this.rgba, toRgba = to.rgba;\n // Unsupported color, return to-color (#3920, #7034)\n if (!Color_isNumber(fromRgba[0]) || !Color_isNumber(toRgba[0])) {\n return to.input || 'none';\n }\n // Check for has alpha, because rgba colors perform worse due to\n // lack of support in WebKit.\n const hasAlpha = (toRgba[3] !== 1 || fromRgba[3] !== 1), channel = (to, i) => to + (fromRgba[i] - to) * (1 - pos), rgba = toRgba.slice(0, 3).map(channel).map(Math.round);\n if (hasAlpha) {\n rgba.push(channel(toRgba[3], 3));\n }\n return (hasAlpha ? 'rgba(' : 'rgb(') + rgba.join(',') + ')';\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n/**\n * Collection of named colors. Can be extended from the outside by adding\n * colors to Highcharts.Color.names.\n * @private\n */\nColor.names = {\n white: '#ffffff',\n black: '#000000'\n};\n/**\n * Collection of parsers. This can be extended from the outside by pushing\n * parsers to `Color.parsers`.\n * @private\n */\nColor.parsers = [{\n // RGBA color\n // eslint-disable-next-line max-len\n regex: /rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d?(?:\\.\\d+)?)\\s*\\)/,\n parse: function (result) {\n return [\n Color_pInt(result[1]),\n Color_pInt(result[2]),\n Color_pInt(result[3]),\n parseFloat(result[4], 10)\n ];\n }\n }, {\n // RGB color\n regex: /rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)/,\n parse: function (result) {\n return [Color_pInt(result[1]), Color_pInt(result[2]), Color_pInt(result[3]), 1];\n }\n }, {\n // RGBA 3 & 4 digit hex color, e.g. #F0F, #F0FA\n regex: /^#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?$/i,\n parse: function (result) {\n // #abcd => #aabbccdd, hence result + result.\n return [\n (Color_pInt(result[1] + result[1], 16)),\n (Color_pInt(result[2] + result[2], 16)),\n (Color_pInt(result[3] + result[3], 16)),\n !Color_defined(result[4]) ?\n 1 :\n (Color_pInt(result[4] + result[4], 16) / 255)\n ];\n }\n }, {\n // RGBA 6 & 8 digit hex color, e.g. #FFCC00, #FFCC00FF\n regex: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?$/i,\n parse: function (result) {\n return [\n Color_pInt(result[1], 16),\n Color_pInt(result[2], 16),\n Color_pInt(result[3], 16),\n !Color_defined(result[4]) ?\n 1 :\n (Color_pInt(result[4], 16) / 255)\n ];\n }\n }];\n// Must be last static member for init cycle\nColor.None = new Color('');\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Color_Color = (Color);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A valid color to be parsed and handled by Highcharts. Highcharts internally\n * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n * browsers and displayed correctly, but Highcharts is not able to process them\n * and apply concepts like opacity and brightening.\n *\n * @typedef {string} Highcharts.ColorString\n */\n/**\n * A valid color type than can be parsed and handled by Highcharts. It can be a\n * color string, a gradient object, or a pattern object.\n *\n * @typedef {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} Highcharts.ColorType\n */\n/**\n * Gradient options instead of a solid color.\n *\n * @example\n * // Linear gradient used as a color option\n * color: {\n * linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n * stops: [\n * [0, '#003399'], // start\n * [0.5, '#ffffff'], // middle\n * [1, '#3366AA'] // end\n * ]\n * }\n *\n * @interface Highcharts.GradientColorObject\n */ /**\n* Holds an object that defines the start position and the end position relative\n* to the shape.\n* @name Highcharts.GradientColorObject#linearGradient\n* @type {Highcharts.LinearGradientColorObject|undefined}\n*/ /**\n* Holds an object that defines the center position and the radius.\n* @name Highcharts.GradientColorObject#radialGradient\n* @type {Highcharts.RadialGradientColorObject|undefined}\n*/ /**\n* The first item in each tuple is the position in the gradient, where 0 is the\n* start of the gradient and 1 is the end of the gradient. Multiple stops can be\n* applied. The second item is the color for each stop. This color can also be\n* given in the rgba format.\n* @name Highcharts.GradientColorObject#stops\n* @type {Array}\n*/\n/**\n * Color stop tuple.\n *\n * @see Highcharts.GradientColorObject\n *\n * @interface Highcharts.GradientColorStopObject\n */ /**\n* @name Highcharts.GradientColorStopObject#0\n* @type {number}\n*/ /**\n* @name Highcharts.GradientColorStopObject#1\n* @type {Highcharts.ColorString}\n*/ /**\n* @name Highcharts.GradientColorStopObject#color\n* @type {Highcharts.Color|undefined}\n*/\n/**\n * Defines the start position and the end position for a gradient relative\n * to the shape. Start position (x1, y1) and end position (x2, y2) are relative\n * to the shape, where 0 means top/left and 1 is bottom/right.\n *\n * @interface Highcharts.LinearGradientColorObject\n */ /**\n* Start horizontal position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#x1\n* @type {number}\n*/ /**\n* End horizontal position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#x2\n* @type {number}\n*/ /**\n* Start vertical position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#y1\n* @type {number}\n*/ /**\n* End vertical position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#y2\n* @type {number}\n*/\n/**\n * Defines the center position and the radius for a gradient.\n *\n * @interface Highcharts.RadialGradientColorObject\n */ /**\n* Center horizontal position relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#cx\n* @type {number}\n*/ /**\n* Center vertical position relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#cy\n* @type {number}\n*/ /**\n* Radius relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#r\n* @type {number}\n*/\n/**\n * Creates a color instance out of a color string.\n *\n * @function Highcharts.color\n *\n * @param {Highcharts.ColorType} input\n * The input color in either rgba or hex format\n *\n * @return {Highcharts.Color}\n * Color instance\n */\n(''); // Detach doclets above\n\n;// ./code/es-modules/Core/Animation/Fx.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { parse: color } = Color_Color;\n\nconst { win: Fx_win } = Core_Globals;\n\nconst { isNumber: Fx_isNumber, objectEach: Fx_objectEach } = Core_Utilities;\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/* *\n *\n * Class\n *\n * */\n/**\n * An animator object used internally. One instance applies to one property\n * (attribute or style prop) on one element. Animation is always initiated\n * through {@link SVGElement#animate}.\n *\n * @example\n * let rect = renderer.rect(0, 0, 10, 10).add();\n * rect.animate({ width: 100 });\n *\n * @private\n * @class\n * @name Highcharts.Fx\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} elem\n * The element to animate.\n *\n * @param {Partial} options\n * Animation options.\n *\n * @param {string} prop\n * The single attribute or CSS property to animate.\n */\nclass Fx {\n /* *\n *\n * Constructors\n *\n * */\n constructor(elem, options, prop) {\n this.pos = NaN;\n this.options = options;\n this.elem = elem;\n this.prop = prop;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Set the current step of a path definition on SVGElement.\n *\n * @function Highcharts.Fx#dSetter\n *\n */\n dSetter() {\n const paths = this.paths, start = paths && paths[0], end = paths && paths[1], now = this.now || 0;\n let path = [];\n // Land on the final path without adjustment points appended in the ends\n if (now === 1 || !start || !end) {\n path = this.toD || [];\n }\n else if (start.length === end.length && now < 1) {\n for (let i = 0; i < end.length; i++) {\n // Tween between the start segment and the end segment. Start\n // with a copy of the end segment and tween the appropriate\n // numerics\n const startSeg = start[i];\n const endSeg = end[i];\n const tweenSeg = [];\n for (let j = 0; j < endSeg.length; j++) {\n const startItem = startSeg[j];\n const endItem = endSeg[j];\n // Tween numbers\n if (Fx_isNumber(startItem) &&\n Fx_isNumber(endItem) &&\n // Arc boolean flags\n !(endSeg[0] === 'A' && (j === 4 || j === 5))) {\n tweenSeg[j] = startItem + now * (endItem - startItem);\n // Strings, take directly from the end segment\n }\n else {\n tweenSeg[j] = endItem;\n }\n }\n path.push(tweenSeg);\n }\n // If animation is finished or length not matching, land on right value\n }\n else {\n path = end;\n }\n this.elem.attr('d', path, void 0, true);\n }\n /**\n * Update the element with the current animation step.\n *\n * @function Highcharts.Fx#update\n *\n */\n update() {\n const elem = this.elem, prop = this.prop, // If destroyed, it is null\n now = this.now, step = this.options.step;\n // Animation setter defined from outside\n if (this[prop + 'Setter']) {\n this[prop + 'Setter']();\n // Other animations on SVGElement\n }\n else if (elem.attr) {\n if (elem.element) {\n elem.attr(prop, now, null, true);\n }\n // HTML styles, raw HTML content like container size\n }\n else {\n elem.style[prop] = now + this.unit;\n }\n if (step) {\n step.call(elem, now, this);\n }\n }\n /**\n * Run an animation.\n *\n * @function Highcharts.Fx#run\n *\n * @param {number} from\n * The current value, value to start from.\n *\n * @param {number} to\n * The end value, value to land on.\n *\n * @param {string} unit\n * The property unit, for example `px`.\n *\n */\n run(from, to, unit) {\n const self = this, options = self.options, timer = function (gotoEnd) {\n return timer.stopped ? false : self.step(gotoEnd);\n }, requestAnimationFrame = Fx_win.requestAnimationFrame ||\n function (step) {\n setTimeout(step, 13);\n }, step = function () {\n for (let i = 0; i < Fx.timers.length; i++) {\n if (!Fx.timers[i]()) {\n Fx.timers.splice(i--, 1);\n }\n }\n if (Fx.timers.length) {\n requestAnimationFrame(step);\n }\n };\n if (from === to && !this.elem['forceAnimate:' + this.prop]) {\n delete options.curAnim[this.prop];\n if (options.complete &&\n Object.keys(options.curAnim).length === 0) {\n options.complete.call(this.elem);\n }\n }\n else { // #7166\n this.startTime = +new Date();\n this.start = from;\n this.end = to;\n this.unit = unit;\n this.now = this.start;\n this.pos = 0;\n timer.elem = this.elem;\n timer.prop = this.prop;\n if (timer() && Fx.timers.push(timer) === 1) {\n requestAnimationFrame(step);\n }\n }\n }\n /**\n * Run a single step in the animation.\n *\n * @function Highcharts.Fx#step\n *\n * @param {boolean} [gotoEnd]\n * Whether to go to the endpoint of the animation after abort.\n *\n * @return {boolean}\n * Returns `true` if animation continues.\n */\n step(gotoEnd) {\n const t = +new Date(), options = this.options, elem = this.elem, complete = options.complete, duration = options.duration, curAnim = options.curAnim;\n let ret, done;\n if (!!elem.attr && !elem.element) { // #2616, element is destroyed\n ret = false;\n }\n else if (gotoEnd || t >= duration + this.startTime) {\n this.now = this.end;\n this.pos = 1;\n this.update();\n curAnim[this.prop] = true;\n done = true;\n Fx_objectEach(curAnim, function (val) {\n if (val !== true) {\n done = false;\n }\n });\n if (done && complete) {\n complete.call(elem);\n }\n ret = false;\n }\n else {\n this.pos = options.easing((t - this.startTime) / duration);\n this.now = this.start + ((this.end -\n this.start) * this.pos);\n this.update();\n ret = true;\n }\n return ret;\n }\n /**\n * Prepare start and end values so that the path can be animated one to one.\n *\n * @function Highcharts.Fx#initPath\n *\n * @param {Highcharts.SVGElement} elem\n * The SVGElement item.\n *\n * @param {Highcharts.SVGPathArray|undefined} fromD\n * Starting path definition.\n *\n * @param {Highcharts.SVGPathArray} toD\n * Ending path definition.\n *\n * @return {Array}\n * An array containing start and end paths in array form so that\n * they can be animated in parallel.\n */\n initPath(elem, fromD, toD) {\n const startX = elem.startX, endX = elem.endX, end = toD.slice(), // Copy\n isArea = elem.isArea, positionFactor = isArea ? 2 : 1, disableAnimation = fromD &&\n toD.length > fromD.length &&\n toD.hasStackedCliffs; // #16925\n let shift, fullLength, i, reverse, start = fromD && fromD.slice(); // Copy\n if (!start || disableAnimation) {\n return [end, end];\n }\n /**\n * If shifting points, prepend a dummy point to the end path.\n * @private\n */\n function prepend(arr, other) {\n while (arr.length < fullLength) {\n // Move to, line to or curve to?\n const moveSegment = arr[0], otherSegment = other[fullLength - arr.length];\n if (otherSegment && moveSegment[0] === 'M') {\n if (otherSegment[0] === 'C') {\n arr[0] = [\n 'C',\n moveSegment[1],\n moveSegment[2],\n moveSegment[1],\n moveSegment[2],\n moveSegment[1],\n moveSegment[2]\n ];\n }\n else {\n arr[0] = ['L', moveSegment[1], moveSegment[2]];\n }\n }\n // Prepend a copy of the first point\n arr.unshift(moveSegment);\n // For areas, the bottom path goes back again to the left, so we\n // need to append a copy of the last point.\n if (isArea) {\n const z = arr.pop();\n arr.push(arr[arr.length - 1], z); // Append point and the Z\n }\n }\n }\n /**\n * Copy and append last point until the length matches the end length.\n * @private\n */\n function append(arr) {\n while (arr.length < fullLength) {\n // Pull out the slice that is going to be appended or inserted.\n // In a line graph, the positionFactor is 1, and the last point\n // is sliced out. In an area graph, the positionFactor is 2,\n // causing the middle two points to be sliced out, since an area\n // path starts at left, follows the upper path then turns and\n // follows the bottom back.\n const segmentToAdd = arr[Math.floor(arr.length / positionFactor) - 1].slice();\n // Disable the first control point of curve segments\n if (segmentToAdd[0] === 'C') {\n segmentToAdd[1] = segmentToAdd[5];\n segmentToAdd[2] = segmentToAdd[6];\n }\n if (!isArea) {\n arr.push(segmentToAdd);\n }\n else {\n const lowerSegmentToAdd = arr[Math.floor(arr.length / positionFactor)].slice();\n arr.splice(arr.length / 2, 0, segmentToAdd, lowerSegmentToAdd);\n }\n }\n }\n // For sideways animation, find out how much we need to shift to get the\n // start path Xs to match the end path Xs.\n if (startX && endX && endX.length) {\n for (i = 0; i < startX.length; i++) {\n // Moving left, new points coming in on right\n if (startX[i] === endX[0]) {\n shift = i;\n break;\n // Moving right\n }\n else if (startX[0] ===\n endX[endX.length - startX.length + i]) {\n shift = i;\n reverse = true;\n break;\n // Fixed from the right side, \"scaling\" left\n }\n else if (startX[startX.length - 1] ===\n endX[endX.length - startX.length + i]) {\n shift = startX.length - i;\n break;\n }\n }\n if (typeof shift === 'undefined') {\n start = [];\n }\n }\n if (start.length && Fx_isNumber(shift)) {\n // The common target length for the start and end array, where both\n // arrays are padded in opposite ends\n fullLength = end.length + shift * positionFactor;\n if (!reverse) {\n prepend(end, start);\n append(start);\n }\n else {\n prepend(start, end);\n append(end);\n }\n }\n return [start, end];\n }\n /**\n * Handle animation of the color attributes directly.\n *\n * @function Highcharts.Fx#fillSetter\n *\n */\n fillSetter() {\n Fx.prototype.strokeSetter.apply(this, arguments);\n }\n /**\n * Handle animation of the color attributes directly.\n *\n * @function Highcharts.Fx#strokeSetter\n *\n */\n strokeSetter() {\n this.elem.attr(this.prop, color(this.start).tweenTo(color(this.end), this.pos), void 0, true);\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nFx.timers = [];\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Animation_Fx = (Fx);\n\n;// ./code/es-modules/Core/Animation/AnimationUtilities.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { defined: AnimationUtilities_defined, getStyle: AnimationUtilities_getStyle, isArray: AnimationUtilities_isArray, isNumber: AnimationUtilities_isNumber, isObject: AnimationUtilities_isObject, merge: AnimationUtilities_merge, objectEach: AnimationUtilities_objectEach, pick: AnimationUtilities_pick } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Set the global animation to either a given value, or fall back to the given\n * chart's animation option.\n *\n * @function Highcharts.setAnimation\n *\n * @param {boolean|Partial|undefined} animation\n * The animation object.\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @todo\n * This function always relates to a chart, and sets a property on the renderer,\n * so it should be moved to the SVGRenderer.\n */\nfunction setAnimation(animation, chart) {\n chart.renderer.globalAnimation = AnimationUtilities_pick(animation, chart.options.chart.animation, true);\n}\n/**\n * Get the animation in object form, where a disabled animation is always\n * returned as `{ duration: 0 }`.\n *\n * @function Highcharts.animObject\n *\n * @param {boolean|Highcharts.AnimationOptionsObject} [animation=0]\n * An animation setting. Can be an object with duration, complete and\n * easing properties, or a boolean to enable or disable.\n *\n * @return {Highcharts.AnimationOptionsObject}\n * An object with at least a duration property.\n */\nfunction animObject(animation) {\n return AnimationUtilities_isObject(animation) ?\n AnimationUtilities_merge({ duration: 500, defer: 0 }, animation) :\n { duration: animation ? 500 : 0, defer: 0 };\n}\n/**\n * Get the defer as a number value from series animation options.\n *\n * @function Highcharts.getDeferredAnimation\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {boolean|Highcharts.AnimationOptionsObject} animation\n * An animation setting. Can be an object with duration, complete and\n * easing properties, or a boolean to enable or disable.\n *\n * @param {Highcharts.Series} [series]\n * Series to defer animation.\n *\n * @return {number}\n * The numeric value.\n */\nfunction getDeferredAnimation(chart, animation, series) {\n const labelAnimation = animObject(animation), s = series ? [series] : chart.series;\n let defer = 0, duration = 0;\n s.forEach((series) => {\n const seriesAnim = animObject(series.options.animation);\n defer = AnimationUtilities_isObject(animation) && AnimationUtilities_defined(animation.defer) ?\n labelAnimation.defer :\n Math.max(defer, seriesAnim.duration + seriesAnim.defer);\n duration = Math.min(labelAnimation.duration, seriesAnim.duration);\n });\n // Disable defer for exporting\n if (chart.renderer.forExport) {\n defer = 0;\n }\n const anim = {\n defer: Math.max(0, defer - duration),\n duration: Math.min(defer, duration)\n };\n return anim;\n}\n/**\n * The global animate method, which uses Fx to create individual animators.\n *\n * @function Highcharts.animate\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} el\n * The element to animate.\n *\n * @param {Highcharts.CSSObject|Highcharts.SVGAttributes} params\n * An object containing key-value pairs of the properties to animate.\n * Supports numeric as pixel-based CSS properties for HTML objects and\n * attributes for SVGElements.\n *\n * @param {Partial} [opt]\n * Animation options.\n *\n * @return {void}\n */\nfunction animate(el, params, opt) {\n let start, unit = '', end, fx, args;\n if (!AnimationUtilities_isObject(opt)) { // Number or undefined/null\n args = arguments;\n opt = {\n duration: args[2],\n easing: args[3],\n complete: args[4]\n };\n }\n if (!AnimationUtilities_isNumber(opt.duration)) {\n opt.duration = 400;\n }\n opt.easing = typeof opt.easing === 'function' ?\n opt.easing :\n (Math[opt.easing] || Math.easeInOutSine);\n opt.curAnim = AnimationUtilities_merge(params);\n AnimationUtilities_objectEach(params, function (val, prop) {\n // Stop current running animation of this property\n stop(el, prop);\n fx = new Animation_Fx(el, opt, prop);\n end = void 0;\n if (prop === 'd' && AnimationUtilities_isArray(params.d)) {\n fx.paths = fx.initPath(el, el.pathArray, params.d);\n fx.toD = params.d;\n start = 0;\n end = 1;\n }\n else if (el.attr) {\n start = el.attr(prop);\n }\n else {\n start = parseFloat(AnimationUtilities_getStyle(el, prop)) || 0;\n if (prop !== 'opacity') {\n unit = 'px';\n }\n }\n if (!end) {\n end = val;\n }\n if (typeof end === 'string' && end.match('px')) {\n end = end.replace(/px/g, ''); // #4351\n }\n fx.run(start, end, unit);\n });\n}\n/**\n * Stop running animation.\n *\n * @function Highcharts.stop\n *\n * @param {Highcharts.SVGElement} el\n * The SVGElement to stop animation on.\n *\n * @param {string} [prop]\n * The property to stop animating. If given, the stop method will stop a\n * single property from animating, while others continue.\n *\n * @return {void}\n *\n * @todo\n * A possible extension to this would be to stop a single property, when\n * we want to continue animating others. Then assign the prop to the timer\n * in the Fx.run method, and check for the prop here. This would be an\n * improvement in all cases where we stop the animation from .attr. Instead of\n * stopping everything, we can just stop the actual attributes we're setting.\n */\nfunction stop(el, prop) {\n let i = Animation_Fx.timers.length;\n // Remove timers related to this element (#4519)\n while (i--) {\n if (Animation_Fx.timers[i].elem === el && (!prop || prop === Animation_Fx.timers[i].prop)) {\n Animation_Fx.timers[i].stopped = true; // #4667\n }\n }\n}\nconst animationExports = {\n animate,\n animObject,\n getDeferredAnimation,\n setAnimation,\n stop\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const AnimationUtilities = (animationExports);\n\n;// ./code/es-modules/Core/Renderer/HTML/AST.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { SVG_NS, win: AST_win } = Core_Globals;\n\nconst { attr: AST_attr, createElement: AST_createElement, css: AST_css, error: AST_error, isFunction: AST_isFunction, isString: AST_isString, objectEach: AST_objectEach, splat: AST_splat } = Core_Utilities;\nconst { trustedTypes } = AST_win;\n/* *\n *\n * Constants\n *\n * */\n// Create the trusted type policy. This should not be exposed.\nconst trustedTypesPolicy = (trustedTypes &&\n AST_isFunction(trustedTypes.createPolicy) &&\n trustedTypes.createPolicy('highcharts', {\n createHTML: (s) => s\n }));\nconst emptyHTML = trustedTypesPolicy ?\n trustedTypesPolicy.createHTML('') :\n '';\n/* *\n *\n * Class\n *\n * */\n/**\n * The AST class represents an abstract syntax tree of HTML or SVG content. It\n * can take HTML as an argument, parse it, optionally transform it to SVG, then\n * perform sanitation before inserting it into the DOM.\n *\n * @class\n * @name Highcharts.AST\n *\n * @param {string|Array} source\n * Either an HTML string or an ASTNode list to populate the tree.\n */\nclass AST {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * Filter an object of SVG or HTML attributes against the allow list.\n *\n * @static\n *\n * @function Highcharts.AST#filterUserAttributes\n *\n * @param {Highcharts.SVGAttributes} attributes The attributes to filter\n *\n * @return {Highcharts.SVGAttributes}\n * The filtered attributes\n */\n static filterUserAttributes(attributes) {\n AST_objectEach(attributes, (val, key) => {\n let valid = true;\n if (AST.allowedAttributes.indexOf(key) === -1) {\n valid = false;\n }\n if (['background', 'dynsrc', 'href', 'lowsrc', 'src']\n .indexOf(key) !== -1) {\n valid = AST_isString(val) && AST.allowedReferences.some((ref) => val.indexOf(ref) === 0);\n }\n if (!valid) {\n AST_error(33, false, void 0, {\n 'Invalid attribute in config': `${key}`\n });\n delete attributes[key];\n }\n // #17753, < is not allowed in SVG attributes\n if (AST_isString(val) && attributes[key]) {\n attributes[key] = val.replace(/ {\n const pair = line.split(':').map((s) => s.trim()), key = pair.shift();\n if (key && pair.length) {\n styles[key.replace(/-([a-z])/g, (g) => g[1].toUpperCase())] = pair.join(':'); // #17146\n }\n return styles;\n }, {});\n }\n /**\n * Utility function to set html content for an element by passing in a\n * markup string. The markup is safely parsed by the AST class to avoid\n * XSS vulnerabilities. This function should be used instead of setting\n * `innerHTML` in all cases where the content is not fully trusted.\n *\n * @static\n * @function Highcharts.AST#setElementHTML\n *\n * @param {SVGDOMElement|HTMLDOMElement} el\n * Node to set content of.\n *\n * @param {string} html\n * Markup string\n */\n static setElementHTML(el, html) {\n el.innerHTML = AST.emptyHTML; // Clear previous\n if (html) {\n const ast = new AST(html);\n ast.addToDOM(el);\n }\n }\n /* *\n *\n * Constructor\n *\n * */\n // Construct an AST from HTML markup, or wrap an array of existing AST nodes\n constructor(source) {\n this.nodes = typeof source === 'string' ?\n this.parseMarkup(source) : source;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Add the tree defined as a hierarchical JS structure to the DOM\n *\n * @function Highcharts.AST#addToDOM\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} parent\n * The node where it should be added\n *\n * @return {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement}\n * The inserted node.\n */\n addToDOM(parent) {\n /**\n * @private\n * @param {Highcharts.ASTNode} subtree\n * HTML/SVG definition\n * @param {Element} [subParent]\n * parent node\n * @return {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n * The inserted node.\n */\n function recurse(subtree, subParent) {\n let ret;\n AST_splat(subtree).forEach(function (item) {\n const tagName = item.tagName;\n const textNode = item.textContent ?\n Core_Globals.doc.createTextNode(item.textContent) :\n void 0;\n // Whether to ignore the AST filtering totally, #15345\n const bypassHTMLFiltering = AST.bypassHTMLFiltering;\n let node;\n if (tagName) {\n if (tagName === '#text') {\n node = textNode;\n }\n else if (AST.allowedTags.indexOf(tagName) !== -1 ||\n bypassHTMLFiltering) {\n const NS = tagName === 'svg' ?\n SVG_NS :\n (subParent.namespaceURI || SVG_NS);\n const element = Core_Globals.doc.createElementNS(NS, tagName);\n const attributes = item.attributes || {};\n // Apply attributes from root of AST node, legacy from\n // from before TextBuilder\n AST_objectEach(item, function (val, key) {\n if (key !== 'tagName' &&\n key !== 'attributes' &&\n key !== 'children' &&\n key !== 'style' &&\n key !== 'textContent') {\n attributes[key] = val;\n }\n });\n AST_attr(element, bypassHTMLFiltering ?\n attributes :\n AST.filterUserAttributes(attributes));\n if (item.style) {\n AST_css(element, item.style);\n }\n // Add text content\n if (textNode) {\n element.appendChild(textNode);\n }\n // Recurse\n recurse(item.children || [], element);\n node = element;\n }\n else {\n AST_error(33, false, void 0, {\n 'Invalid tagName in config': tagName\n });\n }\n }\n // Add to the tree\n if (node) {\n subParent.appendChild(node);\n }\n ret = node;\n });\n // Return last node added (on top level it's the only one)\n return ret;\n }\n return recurse(this.nodes, parent);\n }\n /**\n * Parse HTML/SVG markup into AST Node objects. Used internally from the\n * constructor.\n *\n * @private\n *\n * @function Highcharts.AST#getNodesFromMarkup\n *\n * @param {string} markup The markup string.\n *\n * @return {Array} The parsed nodes.\n */\n parseMarkup(markup) {\n const nodes = [];\n markup = markup\n .trim()\n // The style attribute throws a warning when parsing when CSP is\n // enabled (#6884), so use an alias and pick it up below\n // Make all quotation marks parse correctly to DOM (#17627)\n .replace(/ style=([\"'])/g, ' data-style=$1');\n let doc;\n try {\n doc = new DOMParser().parseFromString(trustedTypesPolicy ?\n trustedTypesPolicy.createHTML(markup) :\n markup, 'text/html');\n }\n catch (e) {\n // There are two cases where this fails:\n // 1. IE9 and PhantomJS, where the DOMParser only supports parsing\n // XML\n // 2. Due to a Chromium issue where chart redraws are triggered by\n // a `beforeprint` event (#16931),\n // https://issues.chromium.org/issues/40222135\n }\n if (!doc) {\n const body = AST_createElement('div');\n body.innerHTML = markup;\n doc = { body };\n }\n const appendChildNodes = (node, addTo) => {\n const tagName = node.nodeName.toLowerCase();\n // Add allowed tags\n const astNode = {\n tagName\n };\n if (tagName === '#text') {\n astNode.textContent = node.textContent || '';\n }\n const parsedAttributes = node.attributes;\n // Add attributes\n if (parsedAttributes) {\n const attributes = {};\n [].forEach.call(parsedAttributes, (attrib) => {\n if (attrib.name === 'data-style') {\n astNode.style = AST.parseStyle(attrib.value);\n }\n else {\n attributes[attrib.name] = attrib.value;\n }\n });\n astNode.attributes = attributes;\n }\n // Handle children\n if (node.childNodes.length) {\n const children = [];\n [].forEach.call(node.childNodes, (childNode) => {\n appendChildNodes(childNode, children);\n });\n if (children.length) {\n astNode.children = children;\n }\n }\n addTo.push(astNode);\n };\n [].forEach.call(doc.body.childNodes, (childNode) => appendChildNodes(childNode, nodes));\n return nodes;\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n/**\n * The list of allowed SVG or HTML attributes, used for sanitizing\n * potentially harmful content from the chart configuration before adding to\n * the DOM.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedAttributes)\n *\n * @example\n * // Allow a custom, trusted attribute\n * Highcharts.AST.allowedAttributes.push('data-value');\n *\n * @name Highcharts.AST.allowedAttributes\n * @type {Array}\n */\nAST.allowedAttributes = [\n 'alt',\n 'aria-controls',\n 'aria-describedby',\n 'aria-expanded',\n 'aria-haspopup',\n 'aria-hidden',\n 'aria-label',\n 'aria-labelledby',\n 'aria-live',\n 'aria-pressed',\n 'aria-readonly',\n 'aria-roledescription',\n 'aria-selected',\n 'class',\n 'clip-path',\n 'color',\n 'colspan',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'disabled',\n 'fill',\n 'filterUnits',\n 'flood-color',\n 'flood-opacity',\n 'height',\n 'href',\n 'id',\n 'in',\n 'in2',\n 'markerHeight',\n 'markerWidth',\n 'offset',\n 'opacity',\n 'operator',\n 'orient',\n 'padding',\n 'paddingLeft',\n 'paddingRight',\n 'patternUnits',\n 'r',\n 'radius',\n 'refX',\n 'refY',\n 'role',\n 'scope',\n 'slope',\n 'src',\n 'startOffset',\n 'stdDeviation',\n 'stroke',\n 'stroke-linecap',\n 'stroke-width',\n 'style',\n 'tableValues',\n 'result',\n 'rowspan',\n 'summary',\n 'target',\n 'tabindex',\n 'text-align',\n 'text-anchor',\n 'textAnchor',\n 'textLength',\n 'title',\n 'type',\n 'valign',\n 'width',\n 'x',\n 'x1',\n 'x2',\n 'xlink:href',\n 'y',\n 'y1',\n 'y2',\n 'zIndex'\n];\n/**\n * The list of allowed references for referring attributes like `href` and\n * `src`. Attribute values will only be allowed if they start with one of\n * these strings.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedReferences)\n *\n * @example\n * // Allow tel:\n * Highcharts.AST.allowedReferences.push('tel:');\n *\n * @name Highcharts.AST.allowedReferences\n * @type {Array}\n */\nAST.allowedReferences = [\n 'https://',\n 'http://',\n 'mailto:',\n '/',\n '../',\n './',\n '#'\n];\n/**\n * The list of allowed SVG or HTML tags, used for sanitizing potentially\n * harmful content from the chart configuration before adding to the DOM.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedTags)\n *\n * @example\n * // Allow a custom, trusted tag\n * Highcharts.AST.allowedTags.push('blink'); // ;)\n *\n * @name Highcharts.AST.allowedTags\n * @type {Array}\n */\nAST.allowedTags = [\n 'a',\n 'abbr',\n 'b',\n 'br',\n 'button',\n 'caption',\n 'circle',\n 'clipPath',\n 'code',\n 'dd',\n 'defs',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'feComponentTransfer',\n 'feComposite',\n 'feDropShadow',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feMorphology',\n 'feOffset',\n 'feMerge',\n 'feMergeNode',\n 'filter',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'li',\n 'linearGradient',\n 'marker',\n 'ol',\n 'p',\n 'path',\n 'pattern',\n 'pre',\n 'rect',\n 'small',\n 'span',\n 'stop',\n 'strong',\n 'style',\n 'sub',\n 'sup',\n 'svg',\n 'table',\n 'text',\n 'textPath',\n 'thead',\n 'title',\n 'tbody',\n 'tspan',\n 'td',\n 'th',\n 'tr',\n 'u',\n 'ul',\n '#text'\n];\nAST.emptyHTML = emptyHTML;\n/**\n * Allow all custom SVG and HTML attributes, references and tags (together\n * with potentially harmful ones) to be added to the DOM from the chart\n * configuration. In other words, disable the allow-listing which is the\n * primary functionality of the AST.\n *\n * WARNING: Setting this property to `true` while allowing untrusted user\n * data in the chart configuration will expose your application to XSS\n * security risks!\n *\n * Note that in case you want to allow a known set of tags or attributes,\n * you should allow-list them instead of disabling the filtering totally.\n * See [allowedAttributes](Highcharts.AST#.allowedAttributes),\n * [allowedReferences](Highcharts.AST#.allowedReferences) and\n * [allowedTags](Highcharts.AST#.allowedTags). The `bypassHTMLFiltering`\n * setting is intended only for those cases where allow-listing is not\n * practical, and the chart configuration already comes from a secure\n * source.\n *\n * @example\n * // Allow all custom attributes, references and tags (disable DOM XSS\n * // filtering)\n * Highcharts.AST.bypassHTMLFiltering = true;\n *\n * @name Highcharts.AST.bypassHTMLFiltering\n * @static\n */\nAST.bypassHTMLFiltering = false;\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const HTML_AST = (AST);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Serialized form of an SVG/HTML definition, including children.\n *\n * @interface Highcharts.ASTNode\n */ /**\n* @name Highcharts.ASTNode#attributes\n* @type {Highcharts.SVGAttributes|undefined}\n*/ /**\n* @name Highcharts.ASTNode#children\n* @type {Array|undefined}\n*/ /**\n* @name Highcharts.ASTNode#tagName\n* @type {string|undefined}\n*/ /**\n* @name Highcharts.ASTNode#textContent\n* @type {string|undefined}\n*/\n(''); // Keeps doclets above in file\n\n;// ./code/es-modules/Core/Templating.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defaultOptions: Templating_defaultOptions, defaultTime: Templating_defaultTime } = Defaults;\n\nconst { pageLang: Templating_pageLang } = Core_Globals;\n\nconst { extend: Templating_extend, getNestedProperty: Templating_getNestedProperty, isArray: Templating_isArray, isNumber: Templating_isNumber, isObject: Templating_isObject, isString: Templating_isString, pick: Templating_pick, ucfirst: Templating_ucfirst } = Core_Utilities;\nconst helpers = {\n // Built-in helpers\n add: (a, b) => a + b,\n divide: (a, b) => (b !== 0 ? a / b : ''),\n // eslint-disable-next-line eqeqeq\n eq: (a, b) => a == b,\n each: function (arr) {\n const match = arguments[arguments.length - 1];\n return Templating_isArray(arr) ?\n arr.map((item, i) => format(match.body, Templating_extend(Templating_isObject(item) ? item : { '@this': item }, {\n '@index': i,\n '@first': i === 0,\n '@last': i === arr.length - 1\n }))).join('') :\n false;\n },\n ge: (a, b) => a >= b,\n gt: (a, b) => a > b,\n 'if': (condition) => !!condition,\n le: (a, b) => a <= b,\n lt: (a, b) => a < b,\n multiply: (a, b) => a * b,\n // eslint-disable-next-line eqeqeq\n ne: (a, b) => a != b,\n subtract: (a, b) => a - b,\n ucfirst: Templating_ucfirst,\n unless: (condition) => !condition\n};\nconst numberFormatCache = {};\n/* *\n *\n * Functions\n *\n * */\n// Internal convenience function\nconst isQuotedString = (str) => /^[\"'].+[\"']$/.test(str);\n/**\n * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n * human readable date string. The format is a subset of the formats for PHP's\n * [strftime](https://www.php.net/manual/en/function.strftime.php) function.\n * Additional formats can be given in the {@link Highcharts.dateFormats} hook.\n *\n * Since v6.0.5, all internal dates are formatted through the\n * {@link Highcharts.Chart#time} instance to respect chart-level time settings.\n * The `Highcharts.dateFormat` function only reflects global time settings set\n * with `setOptions`.\n *\n * Supported format keys:\n * - `%a`: Short weekday, like 'Mon'\n * - `%A`: Long weekday, like 'Monday'\n * - `%d`: Two digit day of the month, 01 to 31\n * - `%e`: Day of the month, 1 through 31\n * - `%w`: Day of the week, 0 through 6\n * - `%b`: Short month, like 'Jan'\n * - `%B`: Long month, like 'January'\n * - `%m`: Two digit month number, 01 through 12\n * - `%y`: Two digits year, like 09 for 2009\n * - `%Y`: Four digits year, like 2009\n * - `%H`: Two digits hours in 24h format, 00 through 23\n * - `%k`: Hours in 24h format, 0 through 23\n * - `%I`: Two digits hours in 12h format, 00 through 11\n * - `%l`: Hours in 12h format, 1 through 12\n * - `%M`: Two digits minutes, 00 through 59\n * - `%p`: Upper case AM or PM\n * - `%P`: Lower case AM or PM\n * - `%S`: Two digits seconds, 00 through 59\n * - `%L`: Milliseconds (naming from Ruby)\n *\n * @function Highcharts.dateFormat\n *\n * @param {string} format\n * The desired format where various time representations are prefixed\n * with `%`.\n *\n * @param {number} timestamp\n * The JavaScript timestamp.\n *\n * @param {boolean} [upperCaseFirst=false]\n * Upper case first letter in the return.\n *\n * @return {string}\n * The formatted date.\n */\nfunction dateFormat(format, timestamp, upperCaseFirst) {\n return Templating_defaultTime.dateFormat(format, timestamp, upperCaseFirst);\n}\n/**\n * Format a string according to a subset of the rules of Python's String.format\n * method.\n *\n * @example\n * let s = Highcharts.format(\n * 'The {color} fox was {len:.2f} feet long',\n * { color: 'red', len: Math.PI }\n * );\n * // => The red fox was 3.14 feet long\n *\n * @function Highcharts.format\n *\n * @param {string} str\n * The string to format.\n *\n * @param {Record} ctx\n * The context, a collection of key-value pairs where each key is\n * replaced by its value.\n *\n * @param {Highcharts.Chart} [chart]\n * A `Chart` instance used to get numberFormatter and time.\n *\n * @return {string}\n * The formatted string.\n */\nfunction format(str = '', ctx, chart) {\n const regex = /\\{([\\p{L}\\d:\\.,;\\-\\/<>\\[\\]%_@+\"'’= #\\(\\)]+)\\}/gu, \n // The sub expression regex is the same as the top expression regex,\n // but except parens and block helpers (#), and surrounded by parens\n // instead of curly brackets.\n subRegex = /\\(([\\p{L}\\d:\\.,;\\-\\/<>\\[\\]%_@+\"'= ]+)\\)/gu, matches = [], floatRegex = /f$/, decRegex = /\\.(\\d)/, lang = chart?.options.lang || Templating_defaultOptions.lang, time = chart && chart.time || Templating_defaultTime, numberFormatter = chart && chart.numberFormatter || numberFormat;\n /*\n * Get a literal or variable value inside a template expression. May be\n * extended with other types like string or null if needed, but keep it\n * small for now.\n */\n const resolveProperty = (key = '') => {\n let n;\n // Literals\n if (key === 'true') {\n return true;\n }\n if (key === 'false') {\n return false;\n }\n if ((n = Number(key)).toString() === key) {\n return n;\n }\n if (isQuotedString(key)) {\n return key.slice(1, -1);\n }\n // Variables and constants\n return Templating_getNestedProperty(key, ctx);\n };\n let match, currentMatch, depth = 0, hasSub;\n // Parse and create tree\n while ((match = regex.exec(str)) !== null) {\n // When a sub expression is found, it is evaluated first, and the\n // results recursively evaluated until no subexpression exists.\n const mainMatch = match, subMatch = subRegex.exec(match[1]);\n if (subMatch) {\n match = subMatch;\n hasSub = true;\n }\n if (!currentMatch || !currentMatch.isBlock) {\n currentMatch = {\n ctx,\n expression: match[1],\n find: match[0],\n isBlock: match[1].charAt(0) === '#',\n start: match.index,\n startInner: match.index + match[0].length,\n length: match[0].length\n };\n }\n // Identify helpers\n const fn = (currentMatch.isBlock ? mainMatch : match)[1].split(' ')[0].replace('#', '');\n if (helpers[fn]) {\n // Block helper, only 0 level is handled\n if (currentMatch.isBlock && fn === currentMatch.fn) {\n depth++;\n }\n if (!currentMatch.fn) {\n currentMatch.fn = fn;\n }\n }\n // Closing a block helper\n const startingElseSection = match[1] === 'else';\n if (currentMatch.isBlock &&\n currentMatch.fn && (match[1] === `/${currentMatch.fn}` ||\n startingElseSection)) {\n if (!depth) { // === 0\n const start = currentMatch.startInner, body = str.substr(start, match.index - start);\n // Either closing without an else section, or when encountering\n // an else section\n if (currentMatch.body === void 0) {\n currentMatch.body = body;\n currentMatch.startInner = match.index + match[0].length;\n // The body exists already, so this is the else section\n }\n else {\n currentMatch.elseBody = body;\n }\n currentMatch.find += body + match[0];\n if (!startingElseSection) {\n matches.push(currentMatch);\n currentMatch = void 0;\n }\n }\n else if (!startingElseSection) {\n depth--;\n }\n // Common expression\n }\n else if (!currentMatch.isBlock) {\n matches.push(currentMatch);\n }\n // Evaluate sub-matches one by one to prevent orphaned block closers\n if (subMatch && !currentMatch?.isBlock) {\n break;\n }\n }\n // Execute\n matches.forEach((match) => {\n const { body, elseBody, expression, fn } = match;\n let replacement, i;\n // Helper function\n if (fn) {\n // Pass the helpers the amount of arguments defined by the function,\n // then the match as the last argument.\n const args = [match], parts = [], len = expression.length;\n let start = 0, startChar;\n for (i = 0; i <= len; i++) {\n const char = expression.charAt(i);\n // Start of string\n if (!startChar && (char === '\"' || char === '\\'')) {\n startChar = char;\n // End of string\n }\n else if (startChar === char) {\n startChar = '';\n }\n if (!startChar &&\n (char === ' ' || i === len)) {\n parts.push(expression.substr(start, i - start));\n start = i + 1;\n }\n }\n i = helpers[fn].length;\n while (i--) {\n args.unshift(resolveProperty(parts[i + 1]));\n }\n replacement = helpers[fn].apply(ctx, args);\n // Block helpers may return true or false. They may also return a\n // string, like the `each` helper.\n if (match.isBlock && typeof replacement === 'boolean') {\n replacement = format(replacement ? body : elseBody, ctx, chart);\n }\n // Simple variable replacement\n }\n else {\n const valueAndFormat = isQuotedString(expression) ?\n [expression] : expression.split(':');\n replacement = resolveProperty(valueAndFormat.shift() || '');\n // Format the replacement\n if (valueAndFormat.length && typeof replacement === 'number') {\n const segment = valueAndFormat.join(':');\n if (floatRegex.test(segment)) { // Float\n const decimals = parseInt((segment.match(decRegex) || ['', '-1'])[1], 10);\n if (replacement !== null) {\n replacement = numberFormatter(replacement, decimals, lang.decimalPoint, segment.indexOf(',') > -1 ? lang.thousandsSep : '');\n }\n }\n else {\n replacement = time.dateFormat(segment, replacement);\n }\n }\n // Use string literal in order to be preserved in the outer\n // expression\n subRegex.lastIndex = 0;\n if (subRegex.test(match.find) && Templating_isString(replacement)) {\n replacement = `\"${replacement}\"`;\n }\n }\n str = str.replace(match.find, Templating_pick(replacement, ''));\n });\n return hasSub ? format(str, ctx, chart) : str;\n}\n/**\n * Format a number and return a string based on input settings.\n *\n * @sample highcharts/members/highcharts-numberformat/\n * Custom number format\n *\n * @function Highcharts.numberFormat\n *\n * @param {number} number\n * The input number to format.\n *\n * @param {number} decimals\n * The amount of decimals. A value of -1 preserves the amount in the\n * input number.\n *\n * @param {string} [decimalPoint]\n * The decimal point, defaults to the one given in the lang options, or\n * a dot.\n *\n * @param {string} [thousandsSep]\n * The thousands separator, defaults to the one given in the lang\n * options, or a space character.\n *\n * @return {string}\n * The formatted number.\n */\nfunction numberFormat(number, decimals, decimalPoint, thousandsSep) {\n number = +number || 0;\n decimals = +decimals;\n let ret, fractionDigits, [mantissa, exp] = number.toString().split('e').map(Number);\n const lang = this?.options?.lang || Templating_defaultOptions.lang, origDec = (number.toString().split('.')[1] || '').split('e')[0].length, firstDecimals = decimals, options = {};\n decimalPoint ?? (decimalPoint = lang.decimalPoint);\n thousandsSep ?? (thousandsSep = lang.thousandsSep);\n if (decimals === -1) {\n // Preserve decimals. Not huge numbers (#3793).\n decimals = Math.min(origDec, 20);\n }\n else if (!Templating_isNumber(decimals)) {\n decimals = 2;\n }\n else if (decimals && exp < 0) {\n // Expose decimals from exponential notation (#7042)\n fractionDigits = decimals + exp;\n if (fractionDigits >= 0) {\n // Remove too small part of the number while keeping the notation\n mantissa = +mantissa.toExponential(fractionDigits).split('e')[0];\n decimals = fractionDigits;\n }\n else {\n // `fractionDigits < 0`\n mantissa = Math.floor(mantissa);\n if (decimals < 20) {\n // Use number instead of exponential notation (#7405)\n number = +(mantissa * Math.pow(10, exp)).toFixed(decimals);\n }\n else {\n // Or zero\n number = 0;\n }\n exp = 0;\n }\n }\n if (exp) {\n decimals ?? (decimals = 2);\n number = mantissa;\n }\n if (Templating_isNumber(decimals) && decimals >= 0) {\n options.minimumFractionDigits = decimals;\n options.maximumFractionDigits = decimals;\n }\n if (thousandsSep === '') {\n options.useGrouping = false;\n }\n const hasSeparators = thousandsSep || decimalPoint, locale = hasSeparators ?\n 'en' :\n (this?.locale || lang.locale || Templating_pageLang), cacheKey = JSON.stringify(options) + locale, nf = numberFormatCache[cacheKey] ?? (numberFormatCache[cacheKey] = new Intl.NumberFormat(locale, options));\n ret = nf.format(number);\n // If thousandsSep or decimalPoint are set, fall back to using English\n // format with string replacement for the separators.\n if (hasSeparators) {\n ret = ret\n // Preliminary step to avoid re-swapping (#22402)\n .replace(/([,\\.])/g, '_$1')\n .replace(/_\\,/g, thousandsSep ?? ',')\n .replace('_.', decimalPoint ?? '.');\n }\n if (\n // Remove signed zero (#20564)\n (!decimals && +ret === 0) ||\n // Small numbers, no decimals (#14023)\n (exp < 0 && !firstDecimals)) {\n ret = '0';\n }\n if (exp && +ret !== 0) {\n ret += 'e' + (exp < 0 ? '' : '+') + exp;\n }\n return ret;\n}\n/* *\n *\n * Default Export\n *\n * */\nconst Templating = {\n dateFormat,\n format,\n helpers,\n numberFormat\n};\n/* harmony default export */ const Core_Templating = (Templating);\n\n;// ./code/es-modules/Core/Renderer/RendererRegistry.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n/* *\n *\n * Namespace\n *\n * */\nvar RendererRegistry;\n(function (RendererRegistry) {\n /* *\n *\n * Constants\n *\n * */\n RendererRegistry.rendererTypes = {};\n /* *\n *\n * Variables\n *\n * */\n let defaultRenderer;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Gets a registered renderer class. If no renderer type is provided or the\n * requested renderer was not founded, the default renderer is returned.\n *\n * @param {string} [rendererType]\n * Renderer type or the default renderer.\n *\n * @return {Highcharts.Class}\n * Returns the requested renderer class or the default renderer class.\n */\n function getRendererType(rendererType = defaultRenderer) {\n return (RendererRegistry.rendererTypes[rendererType] || RendererRegistry.rendererTypes[defaultRenderer]);\n }\n RendererRegistry.getRendererType = getRendererType;\n /**\n * Register a renderer class.\n *\n * @param {string} rendererType\n * Renderer type to register.\n *\n * @param {Highcharts.Class} rendererClass\n * Returns the requested renderer class or the default renderer class.\n *\n * @param {boolean} setAsDefault\n * Sets the renderer class as the default renderer.\n */\n function registerRendererType(rendererType, rendererClass, setAsDefault) {\n RendererRegistry.rendererTypes[rendererType] = rendererClass;\n if (!defaultRenderer || setAsDefault) {\n defaultRenderer = rendererType;\n Core_Globals.Renderer = rendererClass; // Compatibility\n }\n }\n RendererRegistry.registerRendererType = registerRendererType;\n})(RendererRegistry || (RendererRegistry = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Renderer_RendererRegistry = (RendererRegistry);\n\n;// ./code/es-modules/Core/Renderer/RendererUtilities.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Imports\n *\n * */\n\nconst { clamp: RendererUtilities_clamp, pick: RendererUtilities_pick, pushUnique: RendererUtilities_pushUnique, stableSort: RendererUtilities_stableSort } = Core_Utilities;\n/* *\n *\n * Namespace\n *\n * */\nvar RendererUtilities;\n(function (RendererUtilities) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * General distribution algorithm for distributing labels of differing size\n * along a confined length in two dimensions. The algorithm takes an array\n * of objects containing a size, a target and a rank. It will place the\n * labels as close as possible to their targets, skipping the lowest ranked\n * labels if necessary.\n * @private\n */\n function distribute(boxes, len, maxDistance) {\n // Original array will be altered with added .pos\n const origBoxes = boxes, reducedLen = origBoxes.reducedLen || len, sortByRank = (a, b) => (b.rank || 0) - (a.rank || 0), sortByTarget = (a, b) => a.target - b.target, restBoxes = [], // The outranked overshoot\n boxesLength = boxes.length, forDeletion = [], push = restBoxes.push;\n let i, cursor, step, overlapping = true, box, target, total = 0, equalRank;\n // If the total size exceeds the len, remove those boxes with the lowest\n // rank\n i = boxesLength;\n while (i--) {\n total += boxes[i].size;\n }\n // Sort by rank, then slice away overshoot\n if (total > reducedLen) {\n RendererUtilities_stableSort(boxes, sortByRank);\n equalRank = boxes[0].rank === boxes[boxes.length - 1].rank;\n step = equalRank ? boxesLength / 2 : -1;\n cursor = equalRank ? step : boxesLength - 1;\n // When the boxes have equal rank (pie data labels, flags - #10073),\n // decimate the boxes by starting in the middle and gradually remove\n // more items inside the array. When they are sorted by rank, just\n // remove the ones with the lowest rank from the end.\n while (step && total > reducedLen) {\n i = Math.floor(cursor);\n box = boxes[i];\n if (RendererUtilities_pushUnique(forDeletion, i)) {\n total -= box.size;\n }\n cursor += step;\n // Start over the decimation with smaller steps\n if (equalRank && cursor >= boxes.length) {\n step /= 2;\n cursor = step;\n }\n }\n // Clean out the boxes marked for deletion\n forDeletion\n .sort((a, b) => b - a)\n .forEach((i) => push.apply(restBoxes, boxes.splice(i, 1)));\n }\n // Order by target\n RendererUtilities_stableSort(boxes, sortByTarget);\n // So far we have been mutating the original array. Now\n // create a copy with target arrays\n boxes = boxes.map((box) => ({\n size: box.size,\n targets: [box.target],\n align: RendererUtilities_pick(box.align, 0.5)\n }));\n while (overlapping) {\n // Initial positions: target centered in box\n i = boxes.length;\n while (i--) {\n box = boxes[i];\n // Composite box, average of targets\n target = (Math.min.apply(0, box.targets) +\n Math.max.apply(0, box.targets)) / 2;\n box.pos = RendererUtilities_clamp(target - box.size * box.align, 0, len - box.size);\n }\n // Detect overlap and join boxes\n i = boxes.length;\n overlapping = false;\n while (i--) {\n // Overlap\n if (i > 0 &&\n boxes[i - 1].pos + boxes[i - 1].size >\n boxes[i].pos) {\n // Add this size to the previous box\n boxes[i - 1].size += boxes[i].size;\n boxes[i - 1].targets = boxes[i - 1]\n .targets\n .concat(boxes[i].targets);\n boxes[i - 1].align = 0.5;\n // Overlapping right, push left\n if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n boxes[i - 1].pos = len - boxes[i - 1].size;\n }\n boxes.splice(i, 1); // Remove this item\n overlapping = true;\n }\n }\n }\n // Add the rest (hidden boxes)\n push.apply(origBoxes, restBoxes);\n // Now the composite boxes are placed, we need to put the original boxes\n // within them\n i = 0;\n boxes.some((box) => {\n let posInCompositeBox = 0;\n // Exceeded maxDistance => abort\n return (box.targets || []).some(() => {\n origBoxes[i].pos = box.pos + posInCompositeBox;\n // If the distance between the position and the target exceeds\n // maxDistance, abort the loop and decrease the length in\n // increments of 10% to recursively reduce the number of\n // visible boxes by rank. Once all boxes are within the\n // maxDistance, we're good.\n if (typeof maxDistance !== 'undefined' &&\n Math.abs(origBoxes[i].pos - origBoxes[i].target) > maxDistance) {\n // Reset the positions that are already set\n origBoxes\n .slice(0, i + 1)\n .forEach((box) => delete box.pos);\n // Try with a smaller length\n origBoxes.reducedLen =\n (origBoxes.reducedLen || len) - (len * 0.1);\n // Recurse\n if (origBoxes.reducedLen > len * 0.1) {\n distribute(origBoxes, len, maxDistance);\n }\n // Exceeded maxDistance => abort\n return true;\n }\n posInCompositeBox += origBoxes[i].size;\n i++;\n return false;\n });\n });\n // Add the rest (hidden) boxes and sort by target\n RendererUtilities_stableSort(origBoxes, sortByTarget);\n return origBoxes;\n }\n RendererUtilities.distribute = distribute;\n})(RendererUtilities || (RendererUtilities = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Renderer_RendererUtilities = (RendererUtilities);\n\n;// ./code/es-modules/Core/Renderer/SVG/SVGElement.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animate: SVGElement_animate, animObject: SVGElement_animObject, stop: SVGElement_stop } = AnimationUtilities;\n\n\nconst { deg2rad, doc: SVGElement_doc, svg, SVG_NS: SVGElement_SVG_NS, win: SVGElement_win, isFirefox } = Core_Globals;\n\nconst { addEvent: SVGElement_addEvent, attr: SVGElement_attr, createElement: SVGElement_createElement, crisp: SVGElement_crisp, css: SVGElement_css, defined: SVGElement_defined, erase: SVGElement_erase, extend: SVGElement_extend, fireEvent: SVGElement_fireEvent, getAlignFactor: SVGElement_getAlignFactor, isArray: SVGElement_isArray, isFunction: SVGElement_isFunction, isNumber: SVGElement_isNumber, isObject: SVGElement_isObject, isString: SVGElement_isString, merge: SVGElement_merge, objectEach: SVGElement_objectEach, pick: SVGElement_pick, pInt: SVGElement_pInt, pushUnique: SVGElement_pushUnique, replaceNested: SVGElement_replaceNested, syncTimeout: SVGElement_syncTimeout, uniqueKey: SVGElement_uniqueKey } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n * rendering layer of Highcharts. Combined with the\n * {@link Highcharts.SVGRenderer}\n * object, these prototypes allow freeform annotation in the charts or even in\n * HTML pages without instanciating a chart. The SVGElement can also wrap HTML\n * labels, when `text` or `label` elements are created with the `useHTML`\n * parameter.\n *\n * The SVGElement instances are created through factory functions on the\n * {@link Highcharts.SVGRenderer}\n * object, like\n * {@link Highcharts.SVGRenderer#rect|rect},\n * {@link Highcharts.SVGRenderer#path|path},\n * {@link Highcharts.SVGRenderer#text|text},\n * {@link Highcharts.SVGRenderer#label|label},\n * {@link Highcharts.SVGRenderer#g|g}\n * and more.\n *\n * See [How to use the SVG Renderer](\n * https://www.highcharts.com/docs/advanced-chart-features/renderer) for a\n * comprehensive tutorial on how to draw SVG elements on a chart.\n *\n * @class\n * @name Highcharts.SVGElement\n */\nclass SVGElement {\n // @todo public zIndex?: number;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Get the current value of an attribute or pseudo attribute,\n * used mainly for animation. Called internally from\n * the {@link Highcharts.SVGRenderer#attr} function.\n *\n * @private\n * @function Highcharts.SVGElement#_defaultGetter\n *\n * @param {string} key\n * Property key.\n *\n * @return {number|string}\n * Property value.\n */\n _defaultGetter(key) {\n let ret = SVGElement_pick(this[key + 'Value'], // Align getter\n this[key], this.element ? this.element.getAttribute(key) : null, 0);\n if (/^-?[\\d\\.]+$/.test(ret)) { // Is numerical\n ret = parseFloat(ret);\n }\n return ret;\n }\n /**\n * @private\n * @function Highcharts.SVGElement#_defaultSetter\n *\n * @param {string} value\n *\n * @param {string} key\n *\n * @param {Highcharts.SVGDOMElement} element\n *\n */\n _defaultSetter(value, key, element) {\n element.setAttribute(key, value);\n }\n /**\n * Add the element to the DOM. All elements must be added this way.\n *\n * @sample highcharts/members/renderer-g\n * Elements added to a group\n *\n * @function Highcharts.SVGElement#add\n *\n * @param {Highcharts.SVGElement} [parent]\n * The parent item to add it to. If undefined, the element is added\n * to the {@link Highcharts.SVGRenderer.box}.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n add(parent) {\n const renderer = this.renderer, element = this.element;\n let inserted;\n if (parent) {\n this.parentGroup = parent;\n }\n // Build formatted text\n if (typeof this.textStr !== 'undefined' &&\n this.element.nodeName === 'text' // Not for SVGLabel instances\n ) {\n renderer.buildText(this);\n }\n // Mark as added\n this.added = true;\n // If we're adding to renderer root, or other elements in the group\n // have a z index, we need to handle it\n if (!parent || parent.handleZ || this.zIndex) {\n inserted = this.zIndexSetter();\n }\n // If zIndex is not handled, append at the end\n if (!inserted) {\n (parent ?\n parent.element :\n renderer.box).appendChild(element);\n }\n // Fire an event for internal hooks\n if (this.onAdd) {\n this.onAdd();\n }\n return this;\n }\n /**\n * Add a class name to an element.\n *\n * @function Highcharts.SVGElement#addClass\n *\n * @param {string} className\n * The new class name to add.\n *\n * @param {boolean} [replace=false]\n * When true, the existing class name(s) will be overwritten with the new\n * one. When false, the new one is added.\n *\n * @return {Highcharts.SVGElement}\n * Return the SVG element for chainability.\n */\n addClass(className, replace) {\n const currentClassName = replace ? '' : (this.attr('class') || '');\n // Trim the string and remove duplicates\n className = (className || '')\n .split(/ /g)\n .reduce(function (newClassName, name) {\n if (currentClassName.indexOf(name) === -1) {\n newClassName.push(name);\n }\n return newClassName;\n }, (currentClassName ?\n [currentClassName] :\n []))\n .join(' ');\n if (className !== currentClassName) {\n this.attr('class', className);\n }\n return this;\n }\n /**\n * This method is executed in the end of `attr()`, after setting all\n * attributes in the hash. In can be used to efficiently consolidate\n * multiple attributes in one SVG property -- e.g., translate, rotate and\n * scale are merged in one \"transform\" attribute in the SVG node.\n *\n * @private\n * @function Highcharts.SVGElement#afterSetters\n */\n afterSetters() {\n // Update transform. Do this outside the loop to prevent redundant\n // updating for batch setting of attributes.\n if (this.doTransform) {\n this.updateTransform();\n this.doTransform = false;\n }\n }\n /**\n * Align the element relative to the chart or another box.\n *\n * @function Highcharts.SVGElement#align\n *\n * @param {Highcharts.AlignObject} [alignOptions]\n * The alignment options. The function can be called without this\n * parameter in order to re-align an element after the box has been\n * updated.\n *\n * @param {boolean} [alignByTranslate]\n * Align element by translation.\n *\n * @param {string|Highcharts.BBoxObject} [alignTo]\n * The box to align to, needs a width and height. When the box is a\n * string, it refers to an object in the Renderer. For example, when\n * box is `spacingBox`, it refers to `Renderer.spacingBox` which\n * holds `width`, `height`, `x` and `y` properties.\n *\n * @param {boolean} [redraw]\n * Decide if SVGElement should be redrawn with new alignment or\n * just change its attributes.\n *\n * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n align(alignOptions, alignByTranslate, alignTo, redraw = true) {\n const renderer = this.renderer, alignedObjects = renderer.alignedObjects, initialAlignment = Boolean(alignOptions);\n // First call on instanciate\n if (alignOptions) {\n this.alignOptions = alignOptions;\n this.alignByTranslate = alignByTranslate;\n this.alignTo = alignTo;\n // When called on resize, no arguments are supplied\n }\n else {\n alignOptions = this.alignOptions || {};\n alignByTranslate = this.alignByTranslate;\n alignTo = this.alignTo;\n }\n const alignToKey = !alignTo || SVGElement_isString(alignTo) ?\n alignTo || 'renderer' :\n void 0;\n // When aligned to a key, automatically re-align on redraws\n if (alignToKey) {\n // Prevent duplicates, like legendGroup after resize\n if (initialAlignment) {\n SVGElement_pushUnique(alignedObjects, this);\n }\n alignTo = void 0; // Do not use the box\n }\n const alignToBox = SVGElement_pick(alignTo, renderer[alignToKey], renderer), \n // Default: left align\n x = (alignToBox.x || 0) + (alignOptions.x || 0) +\n ((alignToBox.width || 0) - (alignOptions.width || 0)) *\n SVGElement_getAlignFactor(alignOptions.align), \n // Default: top align\n y = (alignToBox.y || 0) + (alignOptions.y || 0) +\n ((alignToBox.height || 0) - (alignOptions.height || 0)) *\n SVGElement_getAlignFactor(alignOptions.verticalAlign), attribs = {\n 'text-align': alignOptions?.align\n };\n attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n // Animate only if already placed\n if (redraw) {\n this[this.placed ? 'animate' : 'attr'](attribs);\n this.placed = true;\n }\n this.alignAttr = attribs;\n return this;\n }\n /**\n * @private\n * @function Highcharts.SVGElement#alignSetter\n * @param {\"left\"|\"center\"|\"right\"} value\n */\n alignSetter(value) {\n const convert = {\n left: 'start',\n center: 'middle',\n right: 'end'\n };\n if (convert[value]) {\n this.alignValue = value;\n this.element.setAttribute('text-anchor', convert[value]);\n }\n }\n /**\n * Animate to given attributes or CSS properties.\n *\n * @sample highcharts/members/element-on/\n * Setting some attributes by animation\n *\n * @function Highcharts.SVGElement#animate\n *\n * @param {Highcharts.SVGAttributes} params\n * SVG attributes or CSS to animate.\n *\n * @param {boolean|Partial} [options]\n * Animation options.\n *\n * @param {Function} [complete]\n * Function to perform at the end of animation.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n animate(params, options, complete) {\n const animOptions = SVGElement_animObject(SVGElement_pick(options, this.renderer.globalAnimation, true)), deferTime = animOptions.defer;\n // When the page is hidden save resources in the background by not\n // running animation at all (#9749).\n if (SVGElement_doc.hidden) {\n animOptions.duration = 0;\n }\n if (animOptions.duration !== 0) {\n // Allows using a callback with the global animation without\n // overwriting it\n if (complete) {\n animOptions.complete = complete;\n }\n // If defer option is defined delay the animation #12901\n SVGElement_syncTimeout(() => {\n if (this.element) {\n SVGElement_animate(this, params, animOptions);\n }\n }, deferTime);\n }\n else {\n this.attr(params, void 0, complete || animOptions.complete);\n // Call the end step synchronously\n SVGElement_objectEach(params, function (val, prop) {\n if (animOptions.step) {\n animOptions.step.call(this, val, { prop: prop, pos: 1, elem: this });\n }\n }, this);\n }\n return this;\n }\n /**\n * Apply a text outline through a custom CSS property, by copying the text\n * element and apply stroke to the copy. Used internally. Contrast checks at\n * [example](https://jsfiddle.net/highcharts/43soe9m1/2/).\n *\n * @example\n * // Specific color\n * text.css({\n * textOutline: '1px black'\n * });\n * // Automatic contrast\n * text.css({\n * color: '#000000', // black text\n * textOutline: '1px contrast' // => white outline\n * });\n *\n * @private\n * @function Highcharts.SVGElement#applyTextOutline\n *\n * @param {string} textOutline\n * A custom CSS `text-outline` setting, defined by `width color`.\n */\n applyTextOutline(textOutline) {\n const elem = this.element, hasContrast = textOutline.indexOf('contrast') !== -1, styles = {};\n // When the text shadow is set to contrast, use dark stroke for light\n // text and vice versa.\n if (hasContrast) {\n styles.textOutline = textOutline = textOutline.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n }\n // Extract the stroke width and color\n const parts = textOutline.split(' ');\n const color = parts[parts.length - 1];\n let strokeWidth = parts[0];\n if (strokeWidth && strokeWidth !== 'none' && Core_Globals.svg) {\n this.fakeTS = true; // Fake text shadow\n // Since the stroke is applied on center of the actual outline, we\n // need to double it to get the correct stroke-width outside the\n // glyphs.\n strokeWidth = strokeWidth.replace(/(^[\\d\\.]+)(.*?)$/g, function (match, digit, unit) {\n return (2 * Number(digit)) + unit;\n });\n // Remove shadows from previous runs.\n this.removeTextOutline();\n const outline = SVGElement_doc.createElementNS(SVGElement_SVG_NS, 'tspan');\n SVGElement_attr(outline, {\n 'class': 'highcharts-text-outline',\n fill: color,\n stroke: color,\n 'stroke-width': strokeWidth,\n 'stroke-linejoin': 'round'\n });\n // For each of the tspans and text nodes, create a copy in the\n // outline.\n const parentElem = elem.querySelector('textPath') || elem;\n [].forEach.call(parentElem.childNodes, (childNode) => {\n const clone = childNode.cloneNode(true);\n if (clone.removeAttribute) {\n ['fill', 'stroke', 'stroke-width', 'stroke'].forEach((prop) => clone\n .removeAttribute(prop));\n }\n outline.appendChild(clone);\n });\n // Collect the sum of dy from all children, included nested ones\n let totalHeight = 0;\n [].forEach.call(parentElem.querySelectorAll('text tspan'), (element) => {\n totalHeight += Number(element.getAttribute('dy'));\n });\n // Insert an absolutely positioned break before the original text\n // to keep it in place\n const br = SVGElement_doc.createElementNS(SVGElement_SVG_NS, 'tspan');\n br.textContent = '\\u200B';\n // Reset the position for the following text\n SVGElement_attr(br, {\n x: Number(elem.getAttribute('x')),\n dy: -totalHeight\n });\n // Insert the outline\n outline.appendChild(br);\n parentElem.insertBefore(outline, parentElem.firstChild);\n }\n }\n /**\n * @function Highcharts.SVGElement#attr\n * @param {string} key\n * @return {number|string}\n */ /**\n * Apply native and custom attributes to the SVG elements.\n *\n * In order to set the rotation center for rotation, set x and y to 0 and\n * use `translateX` and `translateY` attributes to position the element\n * instead.\n *\n * Attributes frequently used in Highcharts are `fill`, `stroke`,\n * `stroke-width`.\n *\n * @sample highcharts/members/renderer-rect/\n * Setting some attributes\n *\n * @example\n * // Set multiple attributes\n * element.attr({\n * stroke: 'red',\n * fill: 'blue',\n * x: 10,\n * y: 10\n * });\n *\n * // Set a single attribute\n * element.attr('stroke', 'red');\n *\n * // Get an attribute\n * element.attr('stroke'); // => 'red'\n *\n * @function Highcharts.SVGElement#attr\n *\n * @param {string|Highcharts.SVGAttributes} [hash]\n * The native and custom SVG attributes.\n *\n * @param {number|string|Highcharts.SVGPathArray} [val]\n * If the type of the first argument is `string`, the second can be a\n * value, which will serve as a single attribute setter. If the first\n * argument is a string and the second is undefined, the function\n * serves as a getter and the current value of the property is\n * returned.\n *\n * @param {Function} [complete]\n * A callback function to execute after setting the attributes. This\n * makes the function compliant and interchangeable with the\n * {@link SVGElement#animate} function.\n *\n * @param {boolean} [continueAnimation=true]\n * Used internally when `.attr` is called as part of an animation\n * step. Otherwise, calling `.attr` for an attribute will stop\n * animation for that attribute.\n *\n * @return {Highcharts.SVGElement}\n * If used as a setter, it returns the current\n * {@link Highcharts.SVGElement} so the calls can be chained. If\n * used as a getter, the current value of the attribute is returned.\n */\n attr(hash, val, complete, continueAnimation) {\n const { element } = this, symbolCustomAttribs = SVGElement.symbolCustomAttribs;\n let key, hasSetSymbolSize, ret = this, skipAttr, setter;\n // Single key-value pair\n if (typeof hash === 'string' && typeof val !== 'undefined') {\n key = hash;\n hash = {};\n hash[key] = val;\n }\n // Used as a getter: first argument is a string, second is undefined\n if (typeof hash === 'string') {\n ret = (this[hash + 'Getter'] ||\n this._defaultGetter).call(this, hash, element);\n // Setter\n }\n else {\n SVGElement_objectEach(hash, function eachAttribute(val, key) {\n skipAttr = false;\n // Unless .attr is from the animator update, stop current\n // running animation of this property\n if (!continueAnimation) {\n SVGElement_stop(this, key);\n }\n // Special handling of symbol attributes\n if (this.symbolName &&\n symbolCustomAttribs.indexOf(key) !== -1) {\n if (!hasSetSymbolSize) {\n this.symbolAttr(hash);\n hasSetSymbolSize = true;\n }\n skipAttr = true;\n }\n if (this.rotation && (key === 'x' || key === 'y')) {\n this.doTransform = true;\n }\n if (!skipAttr) {\n setter = (this[key + 'Setter'] ||\n this._defaultSetter);\n setter.call(this, val, key, element);\n }\n }, this);\n this.afterSetters();\n }\n // In accordance with animate, run a complete callback\n if (complete) {\n complete.call(this);\n }\n return ret;\n }\n /**\n * Apply a clipping shape to this element.\n *\n * @function Highcharts.SVGElement#clip\n *\n * @param {SVGElement} [clipElem]\n * The clipping shape. If skipped, the current clip is removed.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVG element to allow chaining.\n */\n clip(clipElem) {\n if (clipElem && !clipElem.clipPath) {\n // Add a hyphen at the end to avoid confusion in testing indexes\n // -1 and -10, -11 etc (#6550)\n const id = SVGElement_uniqueKey() + '-', clipPath = this.renderer.createElement('clipPath')\n .attr({ id })\n .add(this.renderer.defs);\n SVGElement_extend(clipElem, { clipPath, id, count: 0 });\n clipElem.add(clipPath);\n }\n return this.attr('clip-path', clipElem ?\n `url(${this.renderer.url}#${clipElem.id})` :\n 'none');\n }\n /**\n * Calculate the coordinates needed for drawing a rectangle crisply and\n * return the calculated attributes.\n *\n * @function Highcharts.SVGElement#crisp\n *\n * @param {Highcharts.RectangleObject} rect\n * Rectangle to crisp.\n *\n * @param {number} [strokeWidth]\n * The stroke width to consider when computing crisp positioning. It can\n * also be set directly on the rect parameter.\n *\n * @return {Highcharts.RectangleObject}\n * The modified rectangle arguments.\n */\n crisp(rect, strokeWidth) {\n // Math.round because strokeWidth can sometimes have roundoff errors\n strokeWidth = Math.round(strokeWidth || rect.strokeWidth || 0);\n const x1 = rect.x || this.x || 0, y1 = rect.y || this.y || 0, x2 = (rect.width || this.width || 0) + x1, y2 = (rect.height || this.height || 0) + y1, \n // Find all the rounded coordinates for corners\n x = SVGElement_crisp(x1, strokeWidth), y = SVGElement_crisp(y1, strokeWidth), x2Crisp = SVGElement_crisp(x2, strokeWidth), y2Crisp = SVGElement_crisp(y2, strokeWidth);\n SVGElement_extend(rect, {\n x,\n y,\n width: x2Crisp - x,\n height: y2Crisp - y\n });\n if (SVGElement_defined(rect.strokeWidth)) {\n rect.strokeWidth = strokeWidth;\n }\n return rect;\n }\n /**\n * Build and apply an SVG gradient out of a common JavaScript configuration\n * object. This function is called from the attribute setters. An event\n * hook is added for supporting other complex color types.\n *\n * @private\n * @function Highcharts.SVGElement#complexColor\n *\n * @param {Highcharts.GradientColorObject|Highcharts.PatternObject} colorOptions\n * The gradient or pattern options structure.\n *\n * @param {string} prop\n * The property to apply, can either be `fill` or `stroke`.\n *\n * @param {Highcharts.SVGDOMElement} elem\n * SVG element to apply the gradient on.\n */\n complexColor(colorOptions, prop, elem) {\n const renderer = this.renderer;\n let colorObject, gradName, gradAttr, radAttr, gradients, stops, stopColor, stopOpacity, radialReference, id, key = [], value;\n SVGElement_fireEvent(this.renderer, 'complexColor', {\n args: arguments\n }, function () {\n // Apply linear or radial gradients\n if (colorOptions.radialGradient) {\n gradName = 'radialGradient';\n }\n else if (colorOptions.linearGradient) {\n gradName = 'linearGradient';\n }\n if (gradName) {\n gradAttr = colorOptions[gradName];\n gradients = renderer.gradients;\n stops = colorOptions.stops;\n radialReference = elem.radialReference;\n // Keep < 2.2 compatibility\n if (SVGElement_isArray(gradAttr)) {\n colorOptions[gradName] = gradAttr = {\n x1: gradAttr[0],\n y1: gradAttr[1],\n x2: gradAttr[2],\n y2: gradAttr[3],\n gradientUnits: 'userSpaceOnUse'\n };\n }\n // Correct the radial gradient for the radial reference system\n if (gradName === 'radialGradient' &&\n radialReference &&\n !SVGElement_defined(gradAttr.gradientUnits)) {\n // Save the radial attributes for updating\n radAttr = gradAttr;\n gradAttr = SVGElement_merge(gradAttr, renderer.getRadialAttr(radialReference, radAttr), { gradientUnits: 'userSpaceOnUse' });\n }\n // Build the unique key to detect whether we need to create a\n // new element (#1282)\n SVGElement_objectEach(gradAttr, function (value, n) {\n if (n !== 'id') {\n key.push(n, value);\n }\n });\n SVGElement_objectEach(stops, function (val) {\n key.push(val);\n });\n key = key.join(',');\n // Check if a gradient object with the same config object is\n // created within this renderer\n if (gradients[key]) {\n id = gradients[key].attr('id');\n }\n else {\n // Set the id and create the element\n gradAttr.id = id = SVGElement_uniqueKey();\n const gradientObject = gradients[key] =\n renderer.createElement(gradName)\n .attr(gradAttr)\n .add(renderer.defs);\n gradientObject.radAttr = radAttr;\n // The gradient needs to keep a list of stops to be able to\n // destroy them\n gradientObject.stops = [];\n stops.forEach(function (stop) {\n if (stop[1].indexOf('rgba') === 0) {\n colorObject = Color_Color.parse(stop[1]);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n }\n else {\n stopColor = stop[1];\n stopOpacity = 1;\n }\n const stopObject = renderer.createElement('stop').attr({\n offset: stop[0],\n 'stop-color': stopColor,\n 'stop-opacity': stopOpacity\n }).add(gradientObject);\n // Add the stop element to the gradient\n gradientObject.stops.push(stopObject);\n });\n }\n // Set the reference to the gradient object\n value = 'url(' + renderer.url + '#' + id + ')';\n elem.setAttribute(prop, value);\n elem.gradient = key;\n // Allow the color to be concatenated into tooltips formatters\n // etc. (#2995)\n colorOptions.toString = function () {\n return value;\n };\n }\n });\n }\n /**\n * Set styles for the element. In addition to CSS styles supported by\n * native SVG and HTML elements, there are also some custom made for\n * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n * elements.\n *\n * @sample highcharts/members/renderer-text-on-chart/\n * Styled text\n *\n * @function Highcharts.SVGElement#css\n *\n * @param {Highcharts.CSSObject} styles\n * The new CSS styles.\n *\n * @return {Highcharts.SVGElement}\n * Return the SVG element for chaining.\n */\n css(styles) {\n const oldStyles = this.styles, newStyles = {}, elem = this.element;\n let textWidth, hasNew = !oldStyles;\n // Filter out existing styles to increase performance (#2640)\n if (oldStyles) {\n SVGElement_objectEach(styles, function (value, n) {\n if (oldStyles && oldStyles[n] !== value) {\n newStyles[n] = value;\n hasNew = true;\n }\n });\n }\n if (hasNew) {\n // Merge the new styles with the old ones\n if (oldStyles) {\n styles = SVGElement_extend(oldStyles, newStyles);\n }\n // Get the text width from style\n // Previously set, unset it (#8234)\n if (styles.width === null || styles.width === 'auto') {\n delete this.textWidth;\n // Apply new\n }\n else if (elem.nodeName.toLowerCase() === 'text' &&\n styles.width) {\n textWidth = this.textWidth = SVGElement_pInt(styles.width);\n }\n // Store object\n SVGElement_extend(this.styles, styles);\n if (textWidth && (!svg && this.renderer.forExport)) {\n delete styles.width;\n }\n const fontSize = isFirefox && styles.fontSize || null;\n // Necessary in firefox to be able to set font-size, #22124\n if (fontSize && (SVGElement_isNumber(fontSize) ||\n /^\\d+$/.test(fontSize))) {\n styles.fontSize += 'px';\n }\n const stylesToApply = SVGElement_merge(styles);\n if (elem.namespaceURI === this.SVG_NS) {\n // These CSS properties are interpreted internally by the SVG\n // renderer, but are not supported by SVG and should not be\n // added to the DOM. In styled mode, no CSS should find its way\n // to the DOM whatsoever (#6173, #6474).\n ['textOutline', 'textOverflow', 'whiteSpace', 'width'].forEach((key) => (stylesToApply &&\n delete stylesToApply[key]));\n // SVG requires fill for text\n if (stylesToApply.color) {\n stylesToApply.fill = stylesToApply.color;\n }\n }\n SVGElement_css(elem, stylesToApply);\n }\n if (this.added) {\n // Rebuild text after added. Cache mechanisms in the buildText will\n // prevent building if there are no significant changes.\n if (this.element.nodeName === 'text') {\n this.renderer.buildText(this);\n }\n // Apply text outline after added\n if (styles.textOutline) {\n this.applyTextOutline(styles.textOutline);\n }\n }\n return this;\n }\n /**\n * @private\n * @function Highcharts.SVGElement#dashstyleSetter\n * @param {string} value\n */\n dashstyleSetter(value) {\n let i, strokeWidth = this['stroke-width'];\n // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new\n // strokeWidth function, we should be able to use that instead.\n if (strokeWidth === 'inherit') {\n strokeWidth = 1;\n }\n value = value && value.toLowerCase();\n if (value) {\n const v = value\n .replace('shortdashdotdot', '3,1,1,1,1,1,')\n .replace('shortdashdot', '3,1,1,1')\n .replace('shortdot', '1,1,')\n .replace('shortdash', '3,1,')\n .replace('longdash', '8,3,')\n .replace(/dot/g, '1,3,')\n .replace('dash', '4,3,')\n .replace(/,$/, '')\n .split(','); // Ending comma\n i = v.length;\n while (i--) {\n v[i] = '' + (SVGElement_pInt(v[i]) * SVGElement_pick(strokeWidth, NaN));\n }\n value = v.join(',').replace(/NaN/g, 'none'); // #3226\n this.element.setAttribute('stroke-dasharray', value);\n }\n }\n /**\n * Destroy the element and element wrapper and clear up the DOM and event\n * hooks.\n *\n * @function Highcharts.SVGElement#destroy\n */\n destroy() {\n const wrapper = this, element = wrapper.element || {}, renderer = wrapper.renderer, ownerSVGElement = element.ownerSVGElement;\n let parentToClean = (element.nodeName === 'SPAN' &&\n wrapper.parentGroup ||\n void 0), grandParent, i;\n // Remove events\n element.onclick = element.onmouseout = element.onmouseover =\n element.onmousemove = element.point = null;\n SVGElement_stop(wrapper); // Stop running animations\n if (wrapper.clipPath && ownerSVGElement) {\n const clipPath = wrapper.clipPath;\n // Look for existing references to this clipPath and remove them\n // before destroying the element (#6196).\n // The upper case version is for Edge\n [].forEach.call(ownerSVGElement.querySelectorAll('[clip-path],[CLIP-PATH]'), function (el) {\n if (el.getAttribute('clip-path').indexOf(clipPath.element.id) > -1) {\n el.removeAttribute('clip-path');\n }\n });\n wrapper.clipPath = clipPath.destroy();\n }\n wrapper.connector = wrapper.connector?.destroy();\n // Destroy stops in case this is a gradient object @todo old code?\n if (wrapper.stops) {\n for (i = 0; i < wrapper.stops.length; i++) {\n wrapper.stops[i].destroy();\n }\n wrapper.stops.length = 0;\n wrapper.stops = void 0;\n }\n // Remove element\n wrapper.safeRemoveChild(element);\n // In case of useHTML, clean up empty containers emulating SVG groups\n // (#1960, #2393, #2697).\n while (parentToClean &&\n parentToClean.div &&\n parentToClean.div.childNodes.length === 0) {\n grandParent = parentToClean.parentGroup;\n wrapper.safeRemoveChild(parentToClean.div);\n delete parentToClean.div;\n parentToClean = grandParent;\n }\n // Remove from alignObjects\n if (wrapper.alignOptions) {\n SVGElement_erase(renderer.alignedObjects, wrapper);\n }\n SVGElement_objectEach(wrapper, function (val, key) {\n // Destroy child elements of a group\n if (wrapper[key] &&\n wrapper[key].parentGroup === wrapper &&\n wrapper[key].destroy) {\n wrapper[key].destroy();\n }\n // Delete all properties\n delete wrapper[key];\n });\n return;\n }\n /**\n * @private\n * @function Highcharts.SVGElement#dSettter\n * @param {number|string|Highcharts.SVGPathArray} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n dSetter(value, key, element) {\n if (SVGElement_isArray(value)) {\n // Backwards compatibility, convert one-dimensional array into an\n // array of segments\n if (typeof value[0] === 'string') {\n value = this.renderer.pathToSegments(value);\n }\n this.pathArray = value;\n value = value.reduce((acc, seg, i) => {\n if (!seg || !seg.join) {\n return (seg || '').toString();\n }\n return (i ? acc + ' ' : '') + seg.join(' ');\n }, '');\n }\n if (/(NaN| {2}|^$)/.test(value)) {\n value = 'M 0 0';\n }\n // Check for cache before resetting. Resetting causes disturbance in the\n // DOM, causing flickering in some cases in Edge/IE (#6747). Also\n // possible performance gain.\n if (this[key] !== value) {\n element.setAttribute(key, value);\n this[key] = value;\n }\n }\n /**\n * @private\n * @function Highcharts.SVGElement#fillSetter\n * @param {Highcharts.ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n fillSetter(value, key, element) {\n if (typeof value === 'string') {\n element.setAttribute(key, value);\n }\n else if (value) {\n this.complexColor(value, key, element);\n }\n }\n /**\n * @private\n * @function Highcharts.SVGElement#hrefSetter\n * @param {Highcharts.ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n hrefSetter(value, key, element) {\n // Namespace is needed for offline export, #19106\n element.setAttributeNS('http://www.w3.org/1999/xlink', key, value);\n }\n /**\n * Get the bounding box (width, height, x and y) for the element. Generally\n * used to get rendered text size. Since this is called a lot in charts,\n * the results are cached based on text properties, in order to save DOM\n * traffic. The returned bounding box includes the rotation, so for example\n * a single text line of rotation 90 will report a greater height, and a\n * width corresponding to the line-height.\n *\n * @sample highcharts/members/renderer-on-chart/\n * Draw a rectangle based on a text's bounding box\n *\n * @function Highcharts.SVGElement#getBBox\n *\n * @param {boolean} [reload]\n * Skip the cache and get the updated DOM bounding box.\n *\n * @param {number} [rot]\n * Override the element's rotation. This is internally used on axis\n * labels with a value of 0 to find out what the bounding box would\n * be have been if it were not rotated.\n *\n * @return {Highcharts.BBoxObject}\n * The bounding box with `x`, `y`, `width` and `height` properties.\n */\n getBBox(reload, rot) {\n const wrapper = this, { alignValue, element, renderer, styles, textStr } = wrapper, { cache, cacheKeys } = renderer, isSVG = element.namespaceURI === wrapper.SVG_NS, rotation = SVGElement_pick(rot, wrapper.rotation, 0), fontSize = renderer.styledMode ? (element &&\n SVGElement.prototype.getStyle.call(element, 'font-size')) : (styles.fontSize);\n let bBox, height, toggleTextShadowShim, cacheKey;\n // Avoid undefined and null (#7316)\n if (SVGElement_defined(textStr)) {\n cacheKey = textStr.toString();\n // Since numbers are monospaced, and numerical labels appear a lot\n // in a chart, we assume that a label of n characters has the same\n // bounding box as others of the same length. Unless there is inner\n // HTML in the label. In that case, leave the numbers as is (#5899).\n if (cacheKey.indexOf('<') === -1) {\n cacheKey = cacheKey.replace(/\\d/g, '0');\n }\n // Properties that affect bounding box\n cacheKey += [\n '',\n renderer.rootFontSize,\n fontSize,\n rotation,\n wrapper.textWidth, // #7874, also useHTML\n alignValue,\n styles.lineClamp,\n styles.textOverflow, // #5968\n styles.fontWeight // #12163\n ].join(',');\n }\n if (cacheKey && !reload) {\n bBox = cache[cacheKey];\n }\n // No cache found\n if (!bBox || bBox.polygon) {\n // SVG elements\n if (isSVG || renderer.forExport) {\n try { // Fails in Firefox if the container has display: none.\n // When the text shadow shim is used, we need to hide the\n // fake shadows to get the correct bounding box (#3872)\n toggleTextShadowShim = this.fakeTS && function (display) {\n const outline = element.querySelector('.highcharts-text-outline');\n if (outline) {\n SVGElement_css(outline, { display });\n }\n };\n // Workaround for #3842, Firefox reporting wrong bounding\n // box for shadows\n if (SVGElement_isFunction(toggleTextShadowShim)) {\n toggleTextShadowShim('none');\n }\n bBox = element.getBBox ?\n // SVG: use extend because IE9 is not allowed to change\n // width and height in case of rotation (below)\n SVGElement_extend({}, element.getBBox()) : {\n // HTML elements with `exporting.allowHTML` and\n // legacy IE in export mode\n width: element.offsetWidth,\n height: element.offsetHeight,\n x: 0,\n y: 0\n };\n // #3842\n if (SVGElement_isFunction(toggleTextShadowShim)) {\n toggleTextShadowShim('');\n }\n }\n catch (e) {\n '';\n }\n // If the bBox is not set, the try-catch block above failed. The\n // other condition is for Opera that returns a width of\n // -Infinity on hidden elements.\n if (!bBox || bBox.width < 0) {\n bBox = { x: 0, y: 0, width: 0, height: 0 };\n }\n // Use HTML within SVG\n }\n else {\n bBox = wrapper.htmlGetBBox();\n }\n // True SVG elements as well as HTML elements in modern browsers\n // using the .useHTML option need to compensated for rotation\n height = bBox.height;\n // Workaround for wrong bounding box in IE, Edge and Chrome on\n // Windows. With Highcharts' default font, IE and Edge report\n // a box height of 16.899 and Chrome rounds it to 17. If this\n // stands uncorrected, it results in more padding added below\n // the text than above when adding a label border or background.\n // Also vertical positioning is affected.\n // https://jsfiddle.net/highcharts/em37nvuj/\n // (#1101, #1505, #1669, #2568, #6213).\n if (isSVG) {\n bBox.height = height = ({\n '11px,17': 14,\n '13px,20': 16\n }[`${fontSize || ''},${Math.round(height)}`] ||\n height);\n }\n // Adjust for rotated text\n if (rotation) {\n bBox = this.getRotatedBox(bBox, rotation);\n }\n // Create a reference to catch changes to bBox\n const e = { bBox };\n SVGElement_fireEvent(this, 'afterGetBBox', e);\n // Pick up any changes after the fired event\n bBox = e.bBox;\n }\n // Cache it. When loading a chart in a hidden iframe in Firefox and\n // IE/Edge, the bounding box height is 0, so don't cache it (#5620).\n if (cacheKey && (textStr === '' || bBox.height > 0)) {\n // Rotate (#4681)\n while (cacheKeys.length > 250) {\n delete cache[cacheKeys.shift()];\n }\n if (!cache[cacheKey]) {\n cacheKeys.push(cacheKey);\n }\n cache[cacheKey] = bBox;\n }\n return bBox;\n }\n /**\n * Get the rotated box.\n * @private\n */\n getRotatedBox(box, rotation) {\n const { x: boxX, y: boxY, width, height } = box, { alignValue, translateY, rotationOriginX = 0, rotationOriginY = 0 } = this, alignFactor = SVGElement_getAlignFactor(alignValue), baseline = Number(this.element.getAttribute('y') || 0) -\n (translateY ? 0 : boxY), rad = rotation * deg2rad, rad90 = (rotation - 90) * deg2rad, cosRad = Math.cos(rad), sinRad = Math.sin(rad), wCosRad = width * cosRad, wSinRad = width * sinRad, cosRad90 = Math.cos(rad90), sinRad90 = Math.sin(rad90), [[xOriginCosRad, xOriginSinRad], [yOriginCosRad, yOriginSinRad]] = [\n rotationOriginX,\n rotationOriginY\n ].map((rotOrigin) => [\n rotOrigin - (rotOrigin * cosRad),\n rotOrigin * sinRad\n ]), \n // Find the starting point on the left side baseline of\n // the text\n pX = ((boxX + alignFactor * (width - wCosRad)) +\n xOriginCosRad + yOriginSinRad), pY = ((boxY + baseline - alignFactor * wSinRad) -\n xOriginSinRad + yOriginCosRad), \n // Find all corners\n aX = pX + baseline * cosRad90, bX = aX + wCosRad, cX = bX - height * cosRad90, dX = cX - wCosRad, aY = pY + baseline * sinRad90, bY = aY + wSinRad, cY = bY - height * sinRad90, dY = cY - wSinRad;\n // Deduct the bounding box from the corners\n const x = Math.min(aX, bX, cX, dX), y = Math.min(aY, bY, cY, dY), boxWidth = Math.max(aX, bX, cX, dX) - x, boxHeight = Math.max(aY, bY, cY, dY) - y;\n /* Uncomment to debug boxes\n this.renderer.path([\n ['M', aX, aY],\n ['L', bX, bY],\n ['L', cX, cY],\n ['L', dX, dY],\n ['Z']\n ])\n .attr({\n stroke: 'red',\n 'stroke-width': 1\n })\n .add();\n // */\n return {\n x,\n y,\n width: boxWidth,\n height: boxHeight,\n polygon: [\n [aX, aY],\n [bX, bY],\n [cX, cY],\n [dX, dY]\n ]\n };\n }\n /**\n * Get the computed style. Only in styled mode.\n *\n * @example\n * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n *\n * @function Highcharts.SVGElement#getStyle\n *\n * @param {string} prop\n * The property name to check for.\n *\n * @return {string}\n * The current computed value.\n */\n getStyle(prop) {\n return SVGElement_win\n .getComputedStyle(this.element || this, '')\n .getPropertyValue(prop);\n }\n /**\n * Check if an element has the given class name.\n *\n * @function Highcharts.SVGElement#hasClass\n *\n * @param {string} className\n * The class name to check for.\n *\n * @return {boolean}\n * Whether the class name is found.\n */\n hasClass(className) {\n return ('' + this.attr('class'))\n .split(' ')\n .indexOf(className) !== -1;\n }\n /**\n * Hide the element, similar to setting the `visibility` attribute to\n * `hidden`.\n *\n * @function Highcharts.SVGElement#hide\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n hide() {\n return this.attr({ visibility: 'hidden' });\n }\n /**\n * @private\n */\n htmlGetBBox() {\n return { height: 0, width: 0, x: 0, y: 0 };\n }\n /**\n * Initialize the SVG element. This function only exists to make the\n * initialization process overridable. It should not be called directly.\n *\n * @function Highcharts.SVGElement#init\n *\n * @param {Highcharts.SVGRenderer} renderer\n * The SVGRenderer instance to initialize to.\n *\n * @param {string} nodeName\n * The SVG node name.\n */\n constructor(renderer, nodeName) {\n this.onEvents = {};\n this.opacity = 1; // Default base for animation\n this.SVG_NS = SVGElement_SVG_NS;\n /**\n * The primary DOM node. Each `SVGElement` instance wraps a main DOM\n * node, but may also represent more nodes.\n *\n * @name Highcharts.SVGElement#element\n * @type {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n */\n this.element = nodeName === 'span' || nodeName === 'body' ?\n SVGElement_createElement(nodeName) :\n SVGElement_doc.createElementNS(this.SVG_NS, nodeName);\n /**\n * The renderer that the SVGElement belongs to.\n *\n * @name Highcharts.SVGElement#renderer\n * @type {Highcharts.SVGRenderer}\n */\n this.renderer = renderer;\n this.styles = {};\n SVGElement_fireEvent(this, 'afterInit');\n }\n /**\n * Add an event listener. This is a simple setter that replaces the\n * previous event of the same type added by this function, as opposed to\n * the {@link Highcharts#addEvent} function.\n *\n * @sample highcharts/members/element-on/\n * A clickable rectangle\n *\n * @function Highcharts.SVGElement#on\n *\n * @param {string} eventType\n * The event type.\n *\n * @param {Function} handler\n * The handler callback.\n *\n * @return {Highcharts.SVGElement}\n * The SVGElement for chaining.\n */\n on(eventType, handler) {\n const { onEvents } = this;\n if (onEvents[eventType]) {\n // Unbind existing event\n onEvents[eventType]();\n }\n onEvents[eventType] = SVGElement_addEvent(this.element, eventType, handler);\n return this;\n }\n /**\n * @private\n * @function Highcharts.SVGElement#opacitySetter\n * @param {string} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n opacitySetter(value, key, element) {\n // Round off to avoid float errors, like tests where opacity lands on\n // 9.86957e-06 instead of 0\n const opacity = Number(Number(value).toFixed(3));\n this.opacity = opacity;\n element.setAttribute(key, opacity);\n }\n /**\n * Re-align an aligned text or label after setting the text.\n *\n * @private\n * @function Highcharts.SVGElement#reAlign\n *\n */\n reAlign() {\n if (this.alignOptions?.width && this.alignOptions.align !== 'left') {\n this.alignOptions.width = this.getBBox().width;\n this.placed = false; // Block animation\n this.align();\n }\n }\n /**\n * Remove a class name from the element.\n *\n * @function Highcharts.SVGElement#removeClass\n *\n * @param {string|RegExp} className\n * The class name to remove.\n *\n * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n */\n removeClass(className) {\n return this.attr('class', ('' + this.attr('class'))\n .replace(SVGElement_isString(className) ?\n new RegExp(`(^| )${className}( |$)`) : // #12064, #13590\n className, ' ')\n .replace(/ +/g, ' ')\n .trim());\n }\n /**\n *\n * @private\n */\n removeTextOutline() {\n const outline = this.element\n .querySelector('tspan.highcharts-text-outline');\n if (outline) {\n this.safeRemoveChild(outline);\n }\n }\n /**\n * Removes an element from the DOM.\n *\n * @private\n * @function Highcharts.SVGElement#safeRemoveChild\n *\n * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n * The DOM node to remove.\n */\n safeRemoveChild(element) {\n const parentNode = element.parentNode;\n if (parentNode) {\n parentNode.removeChild(element);\n }\n }\n /**\n * Set the coordinates needed to draw a consistent radial gradient across\n * a shape regardless of positioning inside the chart. Used on pie slices\n * to make all the slices have the same radial reference point.\n *\n * @function Highcharts.SVGElement#setRadialReference\n *\n * @param {Array} coordinates\n * The center reference. The format is `[centerX, centerY, diameter]` in\n * pixels.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n setRadialReference(coordinates) {\n const existingGradient = (this.element.gradient &&\n this.renderer.gradients[this.element.gradient]);\n this.element.radialReference = coordinates;\n // On redrawing objects with an existing gradient, the gradient needs\n // to be repositioned (#3801)\n if (existingGradient && existingGradient.radAttr) {\n existingGradient.animate(this.renderer.getRadialAttr(coordinates, existingGradient.radAttr));\n }\n return this;\n }\n /**\n * Add a shadow to the element. In styled mode, this method is not used,\n * instead use `defs` and filters.\n *\n * @example\n * renderer.rect(10, 100, 100, 100)\n * .attr({ fill: 'red' })\n * .shadow(true);\n *\n * @function Highcharts.SVGElement#shadow\n *\n * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions] The\n * shadow options. If `true`, the default options are applied. If\n * `false`, the current shadow will be removed.\n *\n * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n shadow(shadowOptions) {\n const { renderer } = this, options = SVGElement_merge(this.parentGroup?.rotation === 90 ? {\n offsetX: -1,\n offsetY: -1\n } : {}, SVGElement_isObject(shadowOptions) ? shadowOptions : {}), id = renderer.shadowDefinition(options);\n return this.attr({\n filter: shadowOptions ?\n `url(${renderer.url}#${id})` :\n 'none'\n });\n }\n /**\n * Show the element after it has been hidden.\n *\n * @function Highcharts.SVGElement#show\n *\n * @param {boolean} [inherit=true]\n * Set the visibility attribute to `inherit` rather than `visible`.\n * The difference is that an element with `visibility=\"visible\"`\n * will be visible even if the parent is hidden.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n show(inherit = true) {\n return this.attr({ visibility: inherit ? 'inherit' : 'visible' });\n }\n /**\n * Set the stroke-width and record it on the SVGElement\n *\n * @private\n * @function Highcharts.SVGElement#strokeSetter\n * @param {number|string|ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n 'stroke-widthSetter'(value, key, element) {\n // Record it for quick access in getter\n this[key] = value;\n element.setAttribute(key, value);\n }\n /**\n * Get the computed stroke width in pixel values. This is used extensively\n * when drawing shapes to ensure the shapes are rendered crisp and\n * positioned correctly relative to each other. Using\n * `shape-rendering: crispEdges` leaves us less control over positioning,\n * for example when we want to stack columns next to each other, or position\n * things pixel-perfectly within the plot box.\n *\n * The common pattern when placing a shape is:\n * - Create the SVGElement and add it to the DOM. In styled mode, it will\n * now receive a stroke width from the style sheet. In classic mode we\n * will add the `stroke-width` attribute.\n * - Read the computed `elem.strokeWidth()`.\n * - Place it based on the stroke width.\n *\n * @function Highcharts.SVGElement#strokeWidth\n *\n * @return {number}\n * The stroke width in pixels. Even if the given stroke width (in CSS or by\n * attributes) is based on `em` or other units, the pixel size is returned.\n */\n strokeWidth() {\n // In non-styled mode, read the stroke width as set by .attr\n if (!this.renderer.styledMode) {\n return this['stroke-width'] || 0;\n }\n // In styled mode, read computed stroke width\n const val = this.getStyle('stroke-width');\n let ret = 0, tempElement;\n // Read pixel values directly\n if (/px$/.test(val)) {\n ret = SVGElement_pInt(val);\n // Other values like em, pt etc need to be measured\n }\n else if (val !== '') {\n tempElement = SVGElement_doc.createElementNS(SVGElement_SVG_NS, 'rect');\n SVGElement_attr(tempElement, {\n width: val,\n 'stroke-width': 0\n });\n this.element.parentNode.appendChild(tempElement);\n ret = tempElement.getBBox().width;\n tempElement.parentNode.removeChild(tempElement);\n }\n return ret;\n }\n /**\n * If one of the symbol size affecting parameters are changed,\n * check all the others only once for each call to an element's\n * .attr() method\n *\n * @private\n * @function Highcharts.SVGElement#symbolAttr\n *\n * @param {Highcharts.SVGAttributes} hash\n * The attributes to set.\n */\n symbolAttr(hash) {\n const wrapper = this;\n SVGElement.symbolCustomAttribs.forEach(function (key) {\n wrapper[key] = SVGElement_pick(hash[key], wrapper[key]);\n });\n wrapper.attr({\n d: wrapper.renderer.symbols[wrapper.symbolName](wrapper.x, wrapper.y, wrapper.width, wrapper.height, wrapper)\n });\n }\n /**\n * @private\n * @function Highcharts.SVGElement#textSetter\n * @param {string} value\n */\n textSetter(value) {\n if (value !== this.textStr) {\n // Delete size caches when the text changes\n // delete this.bBox; // old code in series-label\n delete this.textPxLength;\n this.textStr = value;\n if (this.added) {\n this.renderer.buildText(this);\n }\n this.reAlign();\n }\n }\n /**\n * @private\n * @function Highcharts.SVGElement#titleSetter\n * @param {string} value\n */\n titleSetter(value) {\n const el = this.element;\n const titleNode = el.getElementsByTagName('title')[0] ||\n SVGElement_doc.createElementNS(this.SVG_NS, 'title');\n // Move to first child\n if (el.insertBefore) {\n el.insertBefore(titleNode, el.firstChild);\n }\n else {\n el.appendChild(titleNode);\n }\n // Replace text content and escape markup\n titleNode.textContent = SVGElement_replaceNested(// Scan #[73]\n SVGElement_pick(value, ''), // #3276, #3895\n [/<[^>]*>/g, '']).replace(/</g, '<').replace(/>/g, '>');\n }\n /**\n * Bring the element to the front. Alternatively, a new zIndex can be set.\n *\n * @sample highcharts/members/element-tofront/\n * Click an element to bring it to front\n *\n * @function Highcharts.SVGElement#toFront\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n toFront() {\n const element = this.element;\n element.parentNode.appendChild(element);\n return this;\n }\n /**\n * Move an object and its children by x and y values.\n *\n * @function Highcharts.SVGElement#translate\n *\n * @param {number} x\n * The x value.\n *\n * @param {number} y\n * The y value.\n *\n * @return {Highcharts.SVGElement}\n * Translated element.\n */\n translate(x, y) {\n return this.attr({\n translateX: x,\n translateY: y\n });\n }\n /**\n * Update the transform attribute based on internal properties. Deals with\n * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n * attributes and updates the SVG `transform` attribute.\n *\n * @private\n * @function Highcharts.SVGElement#updateTransform\n */\n updateTransform(attrib = 'transform') {\n const { element, matrix, rotation = 0, rotationOriginX, rotationOriginY, scaleX, scaleY, translateX = 0, translateY = 0 } = this;\n // Apply translate. Nearly all transformed elements have translation,\n // so instead of checking for translate = 0, do it always (#1767,\n // #1846).\n const transform = ['translate(' + translateX + ',' + translateY + ')'];\n // Apply matrix\n if (SVGElement_defined(matrix)) {\n transform.push('matrix(' + matrix.join(',') + ')');\n }\n // Apply rotation\n if (rotation) {\n transform.push('rotate(' + rotation + ' ' +\n SVGElement_pick(rotationOriginX, element.getAttribute('x'), 0) +\n ' ' +\n SVGElement_pick(rotationOriginY, element.getAttribute('y') || 0) + ')');\n // HTML labels rotation (#20685)\n if (this.text?.element.tagName === 'SPAN') {\n this.text.attr({\n rotation,\n rotationOriginX: (rotationOriginX || 0) - this.padding,\n rotationOriginY: (rotationOriginY || 0) - this.padding\n });\n }\n }\n // Apply scale\n if (SVGElement_defined(scaleX) || SVGElement_defined(scaleY)) {\n transform.push('scale(' + SVGElement_pick(scaleX, 1) + ' ' + SVGElement_pick(scaleY, 1) + ')');\n }\n if (transform.length && !(this.text || this).textPath) {\n element.setAttribute(attrib, transform.join(' '));\n }\n }\n /**\n * @private\n * @function Highcharts.SVGElement#visibilitySetter\n *\n * @param {string} value\n *\n * @param {string} key\n *\n * @param {Highcharts.SVGDOMElement} element\n *\n */\n visibilitySetter(value, key, element) {\n // IE9-11 doesn't handle visibility:inherit well, so we remove the\n // attribute instead (#2881, #3909)\n if (value === 'inherit') {\n element.removeAttribute(key);\n }\n else if (this[key] !== value) { // #6747\n element.setAttribute(key, value);\n }\n this[key] = value;\n }\n /**\n * @private\n * @function Highcharts.SVGElement#xGetter\n */\n xGetter(key) {\n if (this.element.nodeName === 'circle') {\n if (key === 'x') {\n key = 'cx';\n }\n else if (key === 'y') {\n key = 'cy';\n }\n }\n return this._defaultGetter(key);\n }\n /**\n * @private\n * @function Highcharts.SVGElement#zIndexSetter\n */\n zIndexSetter(value, key) {\n const renderer = this.renderer, parentGroup = this.parentGroup, parentWrapper = parentGroup || renderer, parentNode = parentWrapper.element || renderer.box, element = this.element, svgParent = parentNode === renderer.box;\n let childNodes, otherElement, otherZIndex, inserted = false, undefinedOtherZIndex, run = this.added, i;\n if (SVGElement_defined(value)) {\n // So we can read it for other elements in the group\n element.setAttribute('data-z-index', value);\n value = +value;\n if (this[key] === value) {\n // Only update when needed (#3865)\n run = false;\n }\n }\n else if (SVGElement_defined(this[key])) {\n element.removeAttribute('data-z-index');\n }\n this[key] = value;\n // Insert according to this and other elements' zIndex. Before .add() is\n // called, nothing is done. Then on add, or by later calls to\n // zIndexSetter, the node is placed on the right place in the DOM.\n if (run) {\n value = this.zIndex;\n if (value && parentGroup) {\n parentGroup.handleZ = true;\n }\n childNodes = parentNode.childNodes;\n for (i = childNodes.length - 1; i >= 0 && !inserted; i--) {\n otherElement = childNodes[i];\n otherZIndex = otherElement.getAttribute('data-z-index');\n undefinedOtherZIndex = !SVGElement_defined(otherZIndex);\n if (otherElement !== element) {\n if (\n // Negative zIndex versus no zIndex:\n // On all levels except the highest. If the parent is\n // , then we don't want to put items before \n // or \n value < 0 &&\n undefinedOtherZIndex &&\n !svgParent &&\n !i) {\n parentNode.insertBefore(element, childNodes[i]);\n inserted = true;\n }\n else if (\n // Insert after the first element with a lower zIndex\n SVGElement_pInt(otherZIndex) <= value ||\n // If negative zIndex, add this before first undefined\n // zIndex element\n (undefinedOtherZIndex &&\n (!SVGElement_defined(value) || value >= 0))) {\n parentNode.insertBefore(element, childNodes[i + 1]);\n inserted = true;\n }\n }\n }\n if (!inserted) {\n parentNode.insertBefore(element, childNodes[svgParent ? 3 : 0]);\n inserted = true;\n }\n }\n return inserted;\n }\n}\n/* *\n *\n * Properties\n *\n * */\n// Custom attributes used for symbols, these should be filtered out when\n// setting SVGElement attributes (#9375).\nSVGElement.symbolCustomAttribs = [\n 'anchorX',\n 'anchorY',\n 'clockwise',\n 'end',\n 'height',\n 'innerR',\n 'r',\n 'start',\n 'width',\n 'x',\n 'y'\n];\n// Some shared setters and getters\nSVGElement.prototype.strokeSetter = SVGElement.prototype.fillSetter;\nSVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\nSVGElement.prototype.matrixSetter =\n SVGElement.prototype.rotationOriginXSetter =\n SVGElement.prototype.rotationOriginYSetter =\n SVGElement.prototype.rotationSetter =\n SVGElement.prototype.scaleXSetter =\n SVGElement.prototype.scaleYSetter =\n SVGElement.prototype.translateXSetter =\n SVGElement.prototype.translateYSetter =\n SVGElement.prototype.verticalAlignSetter = function (value, key) {\n this[key] = value;\n this.doTransform = true;\n };\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const SVG_SVGElement = (SVGElement);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Reference to the global SVGElement class as a workaround for a name conflict\n * in the Highcharts namespace.\n *\n * @global\n * @typedef {global.SVGElement} GlobalSVGElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The horizontal alignment of an element.\n *\n * @typedef {\"center\"|\"left\"|\"right\"} Highcharts.AlignValue\n */\n/**\n * Options to align the element relative to the chart or another box.\n *\n * @interface Highcharts.AlignObject\n */ /**\n* Horizontal alignment. Can be one of `left`, `center` and `right`.\n*\n* @name Highcharts.AlignObject#align\n* @type {Highcharts.AlignValue|undefined}\n*\n* @default left\n*/ /**\n* Vertical alignment. Can be one of `top`, `middle` and `bottom`.\n*\n* @name Highcharts.AlignObject#verticalAlign\n* @type {Highcharts.VerticalAlignValue|undefined}\n*\n* @default top\n*/ /**\n* Horizontal pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#x\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Vertical pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#y\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Use the `transform` attribute with translateX and translateY custom\n* attributes to align this elements rather than `x` and `y` attributes.\n*\n* @name Highcharts.AlignObject#alignByTranslate\n* @type {boolean|undefined}\n*\n* @default false\n*/\n/**\n * Bounding box of an element.\n *\n * @interface Highcharts.BBoxObject\n * @extends Highcharts.PositionObject\n */ /**\n* Height of the bounding box.\n*\n* @name Highcharts.BBoxObject#height\n* @type {number}\n*/ /**\n* Width of the bounding box.\n*\n* @name Highcharts.BBoxObject#width\n* @type {number}\n*/ /**\n* Horizontal position of the bounding box.\n*\n* @name Highcharts.BBoxObject#x\n* @type {number}\n*/ /**\n* Vertical position of the bounding box.\n*\n* @name Highcharts.BBoxObject#y\n* @type {number}\n*/\n/**\n * An object of key-value pairs for SVG attributes. Attributes in Highcharts\n * elements for the most parts correspond to SVG, but some are specific to\n * Highcharts, like `zIndex`, `rotation`, `rotationOriginX`,\n * `rotationOriginY`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n * attributes containing a hyphen are _not_ camel-cased, they should be\n * quoted to preserve the hyphen.\n *\n * @example\n * {\n * 'stroke': '#ff0000', // basic\n * 'stroke-width': 2, // hyphenated\n * 'rotation': 45 // custom\n * 'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n * }\n *\n * @interface Highcharts.SVGAttributes\n */ /**\n* @name Highcharts.SVGAttributes#[key:string]\n* @type {*}\n*/ /**\n* @name Highcharts.SVGAttributes#d\n* @type {string|Highcharts.SVGPathArray|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dx\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dy\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#fill\n* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#inverted\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#matrix\n* @type {Array|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotation\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#stroke\n* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#style\n* @type {string|Highcharts.CSSObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#zIndex\n* @type {number|undefined}\n*/\n/**\n * An SVG DOM element. The type is a reference to the regular SVGElement in the\n * global scope.\n *\n * @typedef {globals.GlobalSVGElement} Highcharts.SVGDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The vertical alignment of an element.\n *\n * @typedef {\"bottom\"|\"middle\"|\"top\"} Highcharts.VerticalAlignValue\n */\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Renderer/SVG/SVGLabel.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defined: SVGLabel_defined, extend: SVGLabel_extend, getAlignFactor: SVGLabel_getAlignFactor, isNumber: SVGLabel_isNumber, merge: SVGLabel_merge, pick: SVGLabel_pick, removeEvent: SVGLabel_removeEvent } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * SVG label to render text.\n * @private\n * @class\n * @name Highcharts.SVGLabel\n * @augments Highcharts.SVGElement\n */\nclass SVGLabel extends SVG_SVGElement {\n /* *\n *\n * Constructor\n *\n * */\n constructor(renderer, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n super(renderer, 'g');\n this.paddingLeftSetter = this.paddingSetter;\n this.paddingRightSetter = this.paddingSetter;\n this.doUpdate = false;\n this.textStr = str;\n this.x = x;\n this.y = y;\n this.anchorX = anchorX;\n this.anchorY = anchorY;\n this.baseline = baseline;\n this.className = className;\n this.addClass(className === 'button' ?\n 'highcharts-no-tooltip' :\n 'highcharts-label');\n if (className) {\n this.addClass('highcharts-' + className);\n }\n // Create the text element. An undefined text content prevents redundant\n // box calculation (#16121)\n this.text = renderer.text(void 0, 0, 0, useHTML).attr({ zIndex: 1 });\n // Validate the shape argument\n let hasBGImage;\n if (typeof shape === 'string') {\n hasBGImage = /^url\\((.*?)\\)$/.test(shape);\n if (hasBGImage || this.renderer.symbols[shape]) {\n this.symbolKey = shape;\n }\n }\n this.bBox = SVGLabel.emptyBBox;\n this.padding = 3;\n this.baselineOffset = 0;\n this.needsBox = renderer.styledMode || hasBGImage;\n this.deferredAttr = {};\n this.alignFactor = 0;\n }\n /* *\n *\n * Functions\n *\n * */\n alignSetter(value) {\n const alignFactor = SVGLabel_getAlignFactor(value);\n this.textAlign = value;\n if (alignFactor !== this.alignFactor) {\n this.alignFactor = alignFactor;\n // Bounding box exists, means we're dynamically changing\n if (this.bBox && SVGLabel_isNumber(this.xSetting)) {\n this.attr({ x: this.xSetting }); // #5134\n }\n }\n }\n anchorXSetter(value, key) {\n this.anchorX = value;\n this.boxAttr(key, Math.round(value) - this.getCrispAdjust() - this.xSetting);\n }\n anchorYSetter(value, key) {\n this.anchorY = value;\n this.boxAttr(key, value - this.ySetting);\n }\n /*\n * Set a box attribute, or defer it if the box is not yet created\n */\n boxAttr(key, value) {\n if (this.box) {\n this.box.attr(key, value);\n }\n else {\n this.deferredAttr[key] = value;\n }\n }\n /*\n * Pick up some properties and apply them to the text instead of the\n * wrapper.\n */\n css(styles) {\n if (styles) {\n const textStyles = {};\n // Create a copy to avoid altering the original object\n // (#537)\n styles = SVGLabel_merge(styles);\n SVGLabel.textProps.forEach((prop) => {\n if (typeof styles[prop] !== 'undefined') {\n textStyles[prop] = styles[prop];\n delete styles[prop];\n }\n });\n this.text.css(textStyles);\n // Update existing text, box (#9400, #12163, #18212)\n if ('fontSize' in textStyles || 'fontWeight' in textStyles) {\n this.updateTextPadding();\n }\n else if ('width' in textStyles || 'textOverflow' in textStyles) {\n this.updateBoxSize();\n }\n }\n return SVG_SVGElement.prototype.css.call(this, styles);\n }\n /*\n * Destroy and release memory.\n */\n destroy() {\n // Added by button implementation\n SVGLabel_removeEvent(this.element, 'mouseenter');\n SVGLabel_removeEvent(this.element, 'mouseleave');\n if (this.text) {\n this.text.destroy();\n }\n if (this.box) {\n this.box = this.box.destroy();\n }\n // Call base implementation to destroy the rest\n SVG_SVGElement.prototype.destroy.call(this);\n return void 0;\n }\n fillSetter(value, key) {\n if (value) {\n this.needsBox = true;\n }\n // For animation getter (#6776)\n this.fill = value;\n this.boxAttr(key, value);\n }\n /*\n * Return the bounding box of the box, not the group.\n */\n getBBox(reload, rot) {\n // If we have a text string and the DOM bBox was 0, it typically means\n // that the label was first rendered hidden, so we need to update the\n // bBox (#15246)\n if (this.textStr && this.bBox.width === 0 && this.bBox.height === 0) {\n this.updateBoxSize();\n }\n const { padding, height = 0, translateX = 0, translateY = 0, width = 0 } = this, paddingLeft = SVGLabel_pick(this.paddingLeft, padding), rotation = rot ?? (this.rotation || 0);\n let bBox = {\n width,\n height,\n x: translateX + this.bBox.x - paddingLeft,\n y: translateY + this.bBox.y - padding + this.baselineOffset\n };\n if (rotation) {\n bBox = this.getRotatedBox(bBox, rotation);\n }\n return bBox;\n }\n getCrispAdjust() {\n return (this.renderer.styledMode && this.box ?\n this.box.strokeWidth() :\n (this['stroke-width'] ?\n parseInt(this['stroke-width'], 10) :\n 0)) % 2 / 2;\n }\n heightSetter(value) {\n this.heightSetting = value;\n this.doUpdate = true;\n }\n /**\n * This method is executed in the end of `attr()`, after setting all\n * attributes in the hash. In can be used to efficiently consolidate\n * multiple attributes in one SVG property -- e.g., translate, rotate and\n * scale are merged in one \"transform\" attribute in the SVG node.\n * Also updating height or width should trigger update of the box size.\n *\n * @private\n * @function Highcharts.SVGLabel#afterSetters\n */\n afterSetters() {\n super.afterSetters();\n if (this.doUpdate) {\n this.updateBoxSize();\n this.doUpdate = false;\n }\n }\n /*\n * After the text element is added, get the desired size of the border\n * box and add it before the text in the DOM.\n */\n onAdd() {\n this.text.add(this);\n this.attr({\n // Alignment is available now (#3295, 0 not rendered if given\n // as a value)\n text: SVGLabel_pick(this.textStr, ''),\n x: this.x || 0,\n y: this.y || 0\n });\n if (this.box && SVGLabel_defined(this.anchorX)) {\n this.attr({\n anchorX: this.anchorX,\n anchorY: this.anchorY\n });\n }\n }\n paddingSetter(value, key) {\n if (!SVGLabel_isNumber(value)) {\n this[key] = void 0;\n }\n else if (value !== this[key]) {\n this[key] = value;\n this.updateTextPadding();\n }\n }\n rSetter(value, key) {\n this.boxAttr(key, value);\n }\n strokeSetter(value, key) {\n // For animation getter (#6776)\n this.stroke = value;\n this.boxAttr(key, value);\n }\n 'stroke-widthSetter'(value, key) {\n if (value) {\n this.needsBox = true;\n }\n this['stroke-width'] = value;\n this.boxAttr(key, value);\n }\n 'text-alignSetter'(value) {\n // The text-align variety is for the pre-animation getter. The code\n // should be unified to either textAlign or text-align.\n this.textAlign = this['text-align'] = value;\n this.updateTextPadding();\n }\n textSetter(text) {\n if (typeof text !== 'undefined') {\n // Must use .attr to ensure transforms are done (#10009)\n this.text.attr({ text });\n }\n this.updateTextPadding();\n this.reAlign();\n }\n /*\n * This function runs after the label is added to the DOM (when the bounding\n * box is available), and after the text of the label is updated to detect\n * the new bounding box and reflect it in the border box.\n */\n updateBoxSize() {\n const text = this.text, attribs = {}, padding = this.padding, \n // #12165 error when width is null (auto)\n // #12163 when fontweight: bold, recalculate bBox without cache\n // #3295 && 3514 box failure when string equals 0\n bBox = this.bBox = (((!SVGLabel_isNumber(this.widthSetting) ||\n !SVGLabel_isNumber(this.heightSetting) ||\n this.textAlign) && SVGLabel_defined(text.textStr)) ?\n text.getBBox(void 0, 0) :\n SVGLabel.emptyBBox);\n let crispAdjust;\n this.width = this.getPaddedWidth();\n this.height = (this.heightSetting || bBox.height || 0) + 2 * padding;\n const metrics = this.renderer.fontMetrics(text);\n // Update the label-scoped y offset. Math.min because of inline\n // style (#9400)\n this.baselineOffset = padding + Math.min(\n // When applicable, use the font size of the first line (#15707)\n (this.text.firstLineMetrics || metrics).b, \n // When the height is 0, there is no bBox, so go with the font\n // metrics. Highmaps CSS demos.\n bBox.height || Infinity);\n // #15491: Vertical centering\n if (this.heightSetting) {\n this.baselineOffset += (this.heightSetting - metrics.h) / 2;\n }\n if (this.needsBox && !text.textPath) {\n // Create the border box if it is not already present\n if (!this.box) {\n // Symbol definition exists (#5324)\n const box = this.box = this.symbolKey ?\n this.renderer.symbol(this.symbolKey) :\n this.renderer.rect();\n box.addClass(// Don't use label className for buttons\n (this.className === 'button' ?\n '' : 'highcharts-label-box') +\n (this.className ?\n ' highcharts-' + this.className + '-box' : ''));\n box.add(this);\n }\n crispAdjust = this.getCrispAdjust();\n attribs.x = crispAdjust;\n attribs.y = ((this.baseline ? -this.baselineOffset : 0) + crispAdjust);\n // Apply the box attributes\n attribs.width = Math.round(this.width);\n attribs.height = Math.round(this.height);\n this.box.attr(SVGLabel_extend(attribs, this.deferredAttr));\n this.deferredAttr = {};\n }\n }\n /*\n * This function runs after setting text or padding, but only if padding\n * is changed.\n */\n updateTextPadding() {\n const text = this.text, textAlign = text.styles.textAlign || this.textAlign;\n if (!text.textPath) {\n this.updateBoxSize();\n // Determine y based on the baseline\n const textY = this.baseline ? 0 : this.baselineOffset, textX = (this.paddingLeft ?? this.padding) +\n // Compensate for alignment\n SVGLabel_getAlignFactor(textAlign) * (this.widthSetting ?? this.bBox.width);\n // Update if anything changed\n if (textX !== text.x || textY !== text.y) {\n text.attr({\n align: textAlign,\n x: textX\n });\n if (typeof textY !== 'undefined') {\n text.attr('y', textY);\n }\n }\n // Record current values\n text.x = textX;\n text.y = textY;\n }\n }\n widthSetter(value) {\n // `width:auto` => null\n this.widthSetting = SVGLabel_isNumber(value) ? value : void 0;\n this.doUpdate = true;\n }\n getPaddedWidth() {\n const padding = this.padding;\n const paddingLeft = SVGLabel_pick(this.paddingLeft, padding);\n const paddingRight = SVGLabel_pick(this.paddingRight, padding);\n return ((this.widthSetting || this.bBox.width || 0) +\n paddingLeft +\n paddingRight);\n }\n xSetter(value) {\n this.x = value; // For animation getter\n if (this.alignFactor) {\n value -= this.alignFactor * this.getPaddedWidth();\n // Force animation even when setting to the same value (#7898)\n this['forceAnimate:x'] = true;\n }\n this.xSetting = Math.round(value);\n this.attr('translateX', this.xSetting);\n }\n ySetter(value) {\n this.ySetting = this.y = Math.round(value);\n this.attr('translateY', this.ySetting);\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nSVGLabel.emptyBBox = {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n};\n/**\n * For labels, these CSS properties are applied to the `text` node directly.\n *\n * @private\n * @name Highcharts.SVGLabel#textProps\n * @type {Array}\n */\nSVGLabel.textProps = [\n 'color', 'direction', 'fontFamily', 'fontSize', 'fontStyle',\n 'fontWeight', 'lineClamp', 'lineHeight', 'textAlign', 'textDecoration',\n 'textOutline', 'textOverflow', 'whiteSpace', 'width'\n];\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const SVG_SVGLabel = (SVGLabel);\n\n;// ./code/es-modules/Core/Renderer/SVG/Symbols.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defined: Symbols_defined, isNumber: Symbols_isNumber, pick: Symbols_pick } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/* eslint-disable require-jsdoc, valid-jsdoc */\n/**\n *\n */\nfunction arc(cx, cy, w, h, options) {\n const arc = [];\n if (options) {\n const start = options.start || 0, rx = Symbols_pick(options.r, w), ry = Symbols_pick(options.r, h || w), \n // Subtract a small number to prevent cos and sin of start and end\n // from becoming equal on 360 arcs (#1561). The size of the circle\n // affects the constant, therefore the division by `rx`. If the\n // proximity is too small, the arc disappears. If it is too great, a\n // gap appears. This can be seen in the animation of the official\n // bubble demo (#20586).\n proximity = 0.0002 / (options.borderRadius ? 1 : Math.max(rx, 1)), fullCircle = (Math.abs((options.end || 0) - start - 2 * Math.PI) <\n proximity), end = (options.end || 0) - (fullCircle ? proximity : 0), innerRadius = options.innerR, open = Symbols_pick(options.open, fullCircle), cosStart = Math.cos(start), sinStart = Math.sin(start), cosEnd = Math.cos(end), sinEnd = Math.sin(end), \n // Proximity takes care of rounding errors around PI (#6971)\n longArc = Symbols_pick(options.longArc, end - start - Math.PI < proximity ? 0 : 1);\n let arcSegment = [\n 'A', // ArcTo\n rx, // X radius\n ry, // Y radius\n 0, // Slanting\n longArc, // Long or short arc\n Symbols_pick(options.clockwise, 1), // Clockwise\n cx + rx * cosEnd,\n cy + ry * sinEnd\n ];\n arcSegment.params = { start, end, cx, cy }; // Memo for border radius\n arc.push([\n 'M',\n cx + rx * cosStart,\n cy + ry * sinStart\n ], arcSegment);\n if (Symbols_defined(innerRadius)) {\n arcSegment = [\n 'A', // ArcTo\n innerRadius, // X radius\n innerRadius, // Y radius\n 0, // Slanting\n longArc, // Long or short arc\n // Clockwise - opposite to the outer arc clockwise\n Symbols_defined(options.clockwise) ? 1 - options.clockwise : 0,\n cx + innerRadius * cosStart,\n cy + innerRadius * sinStart\n ];\n // Memo for border radius\n arcSegment.params = {\n start: end,\n end: start,\n cx,\n cy\n };\n arc.push(open ?\n [\n 'M',\n cx + innerRadius * cosEnd,\n cy + innerRadius * sinEnd\n ] : [\n 'L',\n cx + innerRadius * cosEnd,\n cy + innerRadius * sinEnd\n ], arcSegment);\n }\n if (!open) {\n arc.push(['Z']);\n }\n }\n return arc;\n}\n/**\n * Callout shape used for default tooltips.\n */\nfunction callout(x, y, w, h, options) {\n const arrowLength = 6, halfDistance = 6, r = Math.min((options && options.r) || 0, w, h), safeDistance = r + halfDistance, anchorX = options && options.anchorX, anchorY = options && options.anchorY || 0;\n const path = roundedRect(x, y, w, h, { r });\n if (!Symbols_isNumber(anchorX)) {\n return path;\n }\n // Do not render a connector, if anchor starts inside the label\n if (anchorX < w && anchorX > 0 && anchorY < h && anchorY > 0) {\n return path;\n }\n // Anchor on right side\n if (x + anchorX > w - safeDistance) {\n // Chevron\n if (anchorY > y + safeDistance &&\n anchorY < y + h - safeDistance) {\n path.splice(3, 1, ['L', x + w, anchorY - halfDistance], ['L', x + w + arrowLength, anchorY], ['L', x + w, anchorY + halfDistance], ['L', x + w, y + h - r]);\n // Simple connector\n }\n else {\n if (anchorX < w) { // Corner connector\n const isTopCorner = anchorY < y + safeDistance, cornerY = isTopCorner ? y : y + h, sliceStart = isTopCorner ? 2 : 5;\n path.splice(sliceStart, 0, ['L', anchorX, anchorY], ['L', x + w - r, cornerY]);\n }\n else { // Side connector\n path.splice(3, 1, ['L', x + w, h / 2], ['L', anchorX, anchorY], ['L', x + w, h / 2], ['L', x + w, y + h - r]);\n }\n }\n // Anchor on left side\n }\n else if (x + anchorX < safeDistance) {\n // Chevron\n if (anchorY > y + safeDistance &&\n anchorY < y + h - safeDistance) {\n path.splice(7, 1, ['L', x, anchorY + halfDistance], ['L', x - arrowLength, anchorY], ['L', x, anchorY - halfDistance], ['L', x, y + r]);\n // Simple connector\n }\n else {\n if (anchorX > 0) { // Corner connector\n const isTopCorner = anchorY < y + safeDistance, cornerY = isTopCorner ? y : y + h, sliceStart = isTopCorner ? 1 : 6;\n path.splice(sliceStart, 0, ['L', anchorX, anchorY], ['L', x + r, cornerY]);\n }\n else { // Side connector\n path.splice(7, 1, ['L', x, h / 2], ['L', anchorX, anchorY], ['L', x, h / 2], ['L', x, y + r]);\n }\n }\n }\n else if ( // Replace bottom\n anchorY > h &&\n anchorX < w - safeDistance) {\n path.splice(5, 1, ['L', anchorX + halfDistance, y + h], ['L', anchorX, y + h + arrowLength], ['L', anchorX - halfDistance, y + h], ['L', x + r, y + h]);\n }\n else if ( // Replace top\n anchorY < 0 &&\n anchorX > safeDistance) {\n path.splice(1, 1, ['L', anchorX - halfDistance, y], ['L', anchorX, y - arrowLength], ['L', anchorX + halfDistance, y], ['L', w - r, y]);\n }\n return path;\n}\n/**\n *\n */\nfunction circle(x, y, w, h) {\n // Return a full arc\n return arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n start: Math.PI * 0.5,\n end: Math.PI * 2.5,\n open: false\n });\n}\n/**\n *\n */\nfunction diamond(x, y, w, h) {\n return [\n ['M', x + w / 2, y],\n ['L', x + w, y + h / 2],\n ['L', x + w / 2, y + h],\n ['L', x, y + h / 2],\n ['Z']\n ];\n}\n// #15291\n/**\n *\n */\nfunction rect(x, y, w, h, options) {\n if (options && options.r) {\n return roundedRect(x, y, w, h, options);\n }\n return [\n ['M', x, y],\n ['L', x + w, y],\n ['L', x + w, y + h],\n ['L', x, y + h],\n ['Z']\n ];\n}\n/**\n *\n */\nfunction roundedRect(x, y, w, h, options) {\n const r = options?.r || 0;\n return [\n ['M', x + r, y],\n ['L', x + w - r, y], // Top side\n ['A', r, r, 0, 0, 1, x + w, y + r], // Top-right corner\n ['L', x + w, y + h - r], // Right side\n ['A', r, r, 0, 0, 1, x + w - r, y + h], // Bottom-right corner\n ['L', x + r, y + h], // Bottom side\n ['A', r, r, 0, 0, 1, x, y + h - r], // Bottom-left corner\n ['L', x, y + r], // Left side\n ['A', r, r, 0, 0, 1, x + r, y],\n ['Z'] // Top-left corner\n ];\n}\n/**\n *\n */\nfunction triangle(x, y, w, h) {\n return [\n ['M', x + w / 2, y],\n ['L', x + w, y + h],\n ['L', x, y + h],\n ['Z']\n ];\n}\n/**\n *\n */\nfunction triangleDown(x, y, w, h) {\n return [\n ['M', x, y],\n ['L', x + w, y],\n ['L', x + w / 2, y + h],\n ['Z']\n ];\n}\nconst Symbols = {\n arc,\n callout,\n circle,\n diamond,\n rect,\n roundedRect,\n square: rect,\n triangle,\n 'triangle-down': triangleDown\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const SVG_Symbols = (Symbols);\n\n;// ./code/es-modules/Core/Renderer/SVG/TextBuilder.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { doc: TextBuilder_doc, SVG_NS: TextBuilder_SVG_NS, win: TextBuilder_win } = Core_Globals;\n\nconst { attr: TextBuilder_attr, extend: TextBuilder_extend, fireEvent: TextBuilder_fireEvent, isString: TextBuilder_isString, objectEach: TextBuilder_objectEach, pick: TextBuilder_pick } = Core_Utilities;\n// Function used to test string length including an ellipsis\nconst stringWithEllipsis = (text, currentIndex) => text.substring(0, currentIndex) + '\\u2026';\n/* *\n *\n * Class\n *\n * */\n/**\n * SVG Text Builder\n * @private\n * @class\n * @name Highcharts.TextBuilder\n */\nclass TextBuilder {\n constructor(svgElement) {\n const textStyles = svgElement.styles;\n this.renderer = svgElement.renderer;\n this.svgElement = svgElement;\n this.width = svgElement.textWidth;\n this.textLineHeight = textStyles && textStyles.lineHeight;\n this.textOutline = textStyles && textStyles.textOutline;\n this.ellipsis = Boolean(textStyles && textStyles.textOverflow === 'ellipsis');\n this.lineClamp = textStyles?.lineClamp;\n this.noWrap = Boolean(textStyles && textStyles.whiteSpace === 'nowrap');\n }\n /**\n * Build an SVG representation of the pseudo HTML given in the object's\n * svgElement.\n *\n * @private\n *\n * @return {void}.\n */\n buildSVG() {\n const wrapper = this.svgElement, textNode = wrapper.element, renderer = wrapper.renderer, textStr = TextBuilder_pick(wrapper.textStr, '').toString(), hasMarkup = textStr.indexOf('<') !== -1, childNodes = textNode.childNodes, tempParent = !wrapper.added && renderer.box, regexMatchBreaks = //g, \n // The buildText code is quite heavy, so if we're not changing\n // something that affects the text, skip it (#6113).\n textCache = [\n textStr,\n this.ellipsis,\n this.noWrap,\n this.textLineHeight,\n this.textOutline,\n wrapper.getStyle('font-size'),\n wrapper.styles.lineClamp,\n this.width\n ].join(',');\n if (textCache === wrapper.textCache) {\n return;\n }\n wrapper.textCache = textCache;\n delete wrapper.actualWidth;\n // Remove old text\n for (let i = childNodes.length; i--;) {\n textNode.removeChild(childNodes[i]);\n }\n // Simple strings, add text directly and return\n if (!hasMarkup &&\n !this.ellipsis &&\n !this.width &&\n !wrapper.textPath &&\n (textStr.indexOf(' ') === -1 ||\n (this.noWrap && !regexMatchBreaks.test(textStr)))) {\n textNode.appendChild(TextBuilder_doc.createTextNode(this.unescapeEntities(textStr)));\n // Complex strings, add more logic\n }\n else if (textStr !== '') {\n if (tempParent) {\n // Attach it to the DOM to read offset width and font size\n tempParent.appendChild(textNode);\n }\n // Step 1. Parse the markup safely and directly into a tree\n // structure.\n const ast = new HTML_AST(textStr);\n // Step 2. Do as many as we can of the modifications to the tree\n // structure before it is added to the DOM\n this.modifyTree(ast.nodes);\n ast.addToDOM(textNode);\n // Step 3. Some modifications can't be done until the structure is\n // in the DOM, because we need to read computed metrics.\n this.modifyDOM();\n // Add title if an ellipsis was added\n if (this.ellipsis &&\n (textNode.textContent || '').indexOf('\\u2026') !== -1) {\n wrapper.attr('title', this.unescapeEntities(wrapper.textStr || '', ['<', '>']) // #7179\n );\n }\n if (tempParent) {\n tempParent.removeChild(textNode);\n }\n }\n // Apply the text outline\n if (TextBuilder_isString(this.textOutline) && wrapper.applyTextOutline) {\n wrapper.applyTextOutline(this.textOutline);\n }\n }\n /**\n * Modify the DOM of the generated SVG structure. This function only does\n * operations that cannot be done until the elements are attached to the\n * DOM, like doing layout based on rendered metrics of the added elements.\n *\n * @private\n *\n */\n modifyDOM() {\n const wrapper = this.svgElement;\n const x = TextBuilder_attr(wrapper.element, 'x');\n wrapper.firstLineMetrics = void 0;\n // Remove empty tspans (including breaks) from the beginning because\n // SVG's getBBox doesn't count empty lines. The use case is tooltip\n // where the header is empty. By doing this in the DOM rather than in\n // the AST, we can inspect the textContent directly and don't have to\n // recurse down to look for valid content.\n let firstChild;\n while ((firstChild = wrapper.element.firstChild)) {\n if (/^[\\s\\u200B]*$/.test(firstChild.textContent || ' ')) {\n wrapper.element.removeChild(firstChild);\n }\n else {\n break;\n }\n }\n // Modify hard line breaks by applying the rendered line height\n [].forEach.call(wrapper.element.querySelectorAll('tspan.highcharts-br'), (br, i) => {\n if (br.nextSibling && br.previousSibling) { // #5261\n if (i === 0 && br.previousSibling.nodeType === 1) {\n wrapper.firstLineMetrics = wrapper.renderer\n .fontMetrics(br.previousSibling);\n }\n TextBuilder_attr(br, {\n // Since the break is inserted in front of the next\n // line, we need to use the next sibling for the line\n // height\n dy: this.getLineHeight(br.nextSibling),\n x\n });\n }\n });\n // Constrain the line width, either by ellipsis or wrapping\n const width = this.width || 0;\n if (!width) {\n return;\n }\n // Insert soft line breaks into each text node\n const modifyTextNode = (textNode, parentElement) => {\n const text = textNode.textContent || '';\n const words = text\n .replace(/([^\\^])-/g, '$1- ') // Split on hyphens\n // .trim()\n .split(' '); // #1273\n const hasWhiteSpace = !this.noWrap && (words.length > 1 || wrapper.element.childNodes.length > 1);\n const dy = this.getLineHeight(parentElement), ellipsisWidth = Math.max(0, \n // Subtract the font face to make room for\n // the ellipsis itself\n width - 0.8 * dy);\n let lineNo = 0;\n let startAt = wrapper.actualWidth;\n if (hasWhiteSpace) {\n const lines = [];\n // Remove preceding siblings in order to make the text length\n // calculation correct in the truncate function\n const precedingSiblings = [];\n while (parentElement.firstChild &&\n parentElement.firstChild !== textNode) {\n precedingSiblings.push(parentElement.firstChild);\n parentElement.removeChild(parentElement.firstChild);\n }\n while (words.length) {\n // Apply the previous line\n if (words.length && !this.noWrap && lineNo > 0) {\n lines.push(textNode.textContent || '');\n textNode.textContent = words.join(' ')\n .replace(/- /g, '-');\n }\n // For each line, truncate the remaining\n // words into the line length.\n this.truncate(textNode, void 0, words, lineNo === 0 ? (startAt || 0) : 0, width, ellipsisWidth, \n // Build the text to test for\n (t, currentIndex) => words\n .slice(0, currentIndex)\n .join(' ')\n .replace(/- /g, '-'));\n startAt = wrapper.actualWidth;\n lineNo++;\n // Line clamp. Break out after n lines and append an\n // ellipsis regardless of the text length.\n if (this.lineClamp && lineNo >= this.lineClamp) {\n // Only if there are remaining words that should have\n // been rendered.\n if (words.length) {\n this.truncate(textNode, textNode.textContent || '', void 0, 0, \n // Target width\n width, ellipsisWidth, stringWithEllipsis);\n textNode.textContent = textNode.textContent\n ?.replace('\\u2026', '') + '\\u2026';\n }\n break;\n }\n }\n // Reinsert the preceding child nodes\n precedingSiblings.forEach((childNode) => {\n parentElement.insertBefore(childNode, textNode);\n });\n // Insert the previous lines before the original text node\n lines.forEach((line) => {\n // Insert the line\n parentElement.insertBefore(TextBuilder_doc.createTextNode(line), textNode);\n // Insert a break\n const br = TextBuilder_doc.createElementNS(TextBuilder_SVG_NS, 'tspan');\n br.textContent = '\\u200B'; // Zero-width space\n TextBuilder_attr(br, { dy, x });\n parentElement.insertBefore(br, textNode);\n });\n }\n else if (this.ellipsis) {\n if (text) {\n this.truncate(textNode, text, void 0, 0, \n // Target width\n width, ellipsisWidth, stringWithEllipsis);\n }\n }\n };\n // Recurse down the DOM tree and handle line breaks for each text node\n const modifyChildren = ((node) => {\n const childNodes = [].slice.call(node.childNodes);\n childNodes.forEach((childNode) => {\n if (childNode.nodeType === TextBuilder_win.Node.TEXT_NODE) {\n modifyTextNode(childNode, node);\n }\n else {\n // Reset word-wrap width readings after hard breaks\n if (childNode.className.baseVal\n .indexOf('highcharts-br') !== -1) {\n wrapper.actualWidth = 0;\n }\n // Recurse down to child node\n modifyChildren(childNode);\n }\n });\n });\n modifyChildren(wrapper.element);\n }\n /**\n * Get the rendered line height of a , or pure text node.\n * @private\n * @param {DOMElementType|Text} node The node to check for\n * @return {number} The rendered line height\n */\n getLineHeight(node) {\n // If the node is a text node, use its parent\n const element = (node.nodeType === TextBuilder_win.Node.TEXT_NODE) ?\n node.parentElement :\n node;\n return this.textLineHeight ?\n parseInt(this.textLineHeight.toString(), 10) :\n this.renderer.fontMetrics(element || this.svgElement.element).h;\n }\n /**\n * Transform a pseudo HTML AST node tree into an SVG structure. We do as\n * much heavy lifting as we can here, before doing the final processing in\n * the modifyDOM function. The original data is mutated.\n *\n * @private\n *\n * @param {ASTNode[]} nodes The AST nodes\n *\n */\n modifyTree(nodes) {\n const modifyChild = (node, i) => {\n const { attributes = {}, children, style = {}, tagName } = node, styledMode = this.renderer.styledMode;\n // Apply styling to text tags\n if (tagName === 'b' || tagName === 'strong') {\n if (styledMode) {\n // eslint-disable-next-line dot-notation\n attributes['class'] = 'highcharts-strong';\n }\n else {\n style.fontWeight = 'bold';\n }\n }\n else if (tagName === 'i' || tagName === 'em') {\n if (styledMode) {\n // eslint-disable-next-line dot-notation\n attributes['class'] = 'highcharts-emphasized';\n }\n else {\n style.fontStyle = 'italic';\n }\n }\n // Modify styling\n if (style && style.color) {\n style.fill = style.color;\n }\n // Handle breaks\n if (tagName === 'br') {\n attributes['class'] = 'highcharts-br'; // eslint-disable-line dot-notation\n node.textContent = '\\u200B'; // Zero-width space\n // Trim whitespace off the beginning of new lines\n const nextNode = nodes[i + 1];\n if (nextNode && nextNode.textContent) {\n nextNode.textContent =\n nextNode.textContent.replace(/^ +/gm, '');\n }\n // If an anchor has direct text node children, the text is unable to\n // wrap because there is no `getSubStringLength` function on the\n // element. Therefore we need to wrap the child text node or nodes\n // in a tspan. #16173.\n }\n else if (tagName === 'a' &&\n children &&\n children.some((child) => child.tagName === '#text')) {\n node.children = [{ children, tagName: 'tspan' }];\n }\n if (tagName !== '#text' && tagName !== 'a') {\n node.tagName = 'tspan';\n }\n TextBuilder_extend(node, { attributes, style });\n // Recurse\n if (children) {\n children\n .filter((c) => c.tagName !== '#text')\n .forEach(modifyChild);\n }\n };\n nodes.forEach(modifyChild);\n TextBuilder_fireEvent(this.svgElement, 'afterModifyTree', { nodes });\n }\n /*\n * Truncate the text node contents to a given length. Used when the css\n * width is set. If the `textOverflow` is `ellipsis`, the text is truncated\n * character by character to the given length. If not, the text is\n * word-wrapped line by line.\n */\n truncate(textNode, text, words, startAt, width, ellipsisWidth, getString) {\n const svgElement = this.svgElement;\n const { rotation } = svgElement;\n // Cache the lengths to avoid checking the same twice\n const lengths = [];\n // Word wrap cannot be truncated to shorter than one word, ellipsis\n // text can be completely blank.\n let minIndex = words && !startAt ? 1 : 0;\n let maxIndex = (text || words || '').length;\n let currentIndex = maxIndex;\n let str;\n let actualWidth;\n if (!words) {\n width = ellipsisWidth;\n }\n const getSubStringLength = function (charEnd, concatenatedEnd) {\n // `charEnd` is used when finding the character-by-character\n // break for ellipsis, concatenatedEnd is used for word-by-word\n // break for word wrapping.\n const end = concatenatedEnd || charEnd;\n const parentNode = textNode.parentNode;\n if (parentNode && typeof lengths[end] === 'undefined') {\n // Modern browsers\n if (parentNode.getSubStringLength) {\n // Fails with DOM exception on unit-tests/legend/members\n // of unknown reason. Desired width is 0, text content\n // is \"5\" and end is 1.\n try {\n lengths[end] = startAt +\n parentNode.getSubStringLength(0, words ? end + 1 : end);\n }\n catch (e) {\n '';\n }\n }\n }\n return lengths[end];\n };\n svgElement.rotation = 0; // Discard rotation when computing box\n actualWidth = getSubStringLength(textNode.textContent.length);\n if (startAt + actualWidth > width) {\n // Do a binary search for the index where to truncate the text\n while (minIndex <= maxIndex) {\n currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n // When checking words for word-wrap, we need to build the\n // string and measure the subStringLength at the concatenated\n // word length.\n if (words) {\n str = getString(words, currentIndex);\n }\n actualWidth = getSubStringLength(currentIndex, str && str.length - 1);\n if (minIndex === maxIndex) {\n // Complete\n minIndex = maxIndex + 1;\n }\n else if (actualWidth > width) {\n // Too large. Set max index to current.\n maxIndex = currentIndex - 1;\n }\n else {\n // Within width. Set min index to current.\n minIndex = currentIndex;\n }\n }\n // If max index was 0 it means the shortest possible text was also\n // too large. For ellipsis that means only the ellipsis, while for\n // word wrap it means the whole first word.\n if (maxIndex === 0) {\n // Remove ellipsis\n textNode.textContent = '';\n // If the new text length is one less than the original, we don't\n // need the ellipsis\n }\n else if (!(text && maxIndex === text.length - 1)) {\n textNode.textContent = str || getString(text || words, currentIndex);\n }\n // Add ellipsis on individual lines\n if (this.ellipsis && actualWidth > width) {\n this.truncate(textNode, textNode.textContent || '', void 0, 0, width, ellipsisWidth, stringWithEllipsis);\n }\n }\n // When doing line wrapping, prepare for the next line by removing the\n // items from this line.\n if (words) {\n words.splice(0, currentIndex);\n }\n svgElement.actualWidth = actualWidth;\n svgElement.rotation = rotation; // Apply rotation again.\n }\n /*\n * Un-escape HTML entities based on the public `renderer.escapes` list\n *\n * @private\n *\n * @param {string} inputStr The string to unescape\n * @param {Array} [except] Exceptions\n *\n * @return {string} The processed string\n */\n unescapeEntities(inputStr, except) {\n TextBuilder_objectEach(this.renderer.escapes, function (value, key) {\n if (!except || except.indexOf(value) === -1) {\n inputStr = inputStr.toString().replace(new RegExp(value, 'g'), key);\n }\n });\n return inputStr;\n }\n}\n/* harmony default export */ const SVG_TextBuilder = (TextBuilder);\n\n;// ./code/es-modules/Core/Renderer/SVG/SVGRenderer.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { defaultOptions: SVGRenderer_defaultOptions } = Defaults;\n\n\nconst { charts: SVGRenderer_charts, deg2rad: SVGRenderer_deg2rad, doc: SVGRenderer_doc, isFirefox: SVGRenderer_isFirefox, isMS, isWebKit, noop, SVG_NS: SVGRenderer_SVG_NS, symbolSizes, win: SVGRenderer_win } = Core_Globals;\n\n\n\n\n\n\nconst { addEvent: SVGRenderer_addEvent, attr: SVGRenderer_attr, createElement: SVGRenderer_createElement, crisp: SVGRenderer_crisp, css: SVGRenderer_css, defined: SVGRenderer_defined, destroyObjectProperties: SVGRenderer_destroyObjectProperties, extend: SVGRenderer_extend, isArray: SVGRenderer_isArray, isNumber: SVGRenderer_isNumber, isObject: SVGRenderer_isObject, isString: SVGRenderer_isString, merge: SVGRenderer_merge, pick: SVGRenderer_pick, pInt: SVGRenderer_pInt, replaceNested: SVGRenderer_replaceNested, uniqueKey: SVGRenderer_uniqueKey } = Core_Utilities;\n/* *\n *\n * Variables\n *\n * */\nlet hasInternalReferenceBug;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * Allows direct access to the Highcharts rendering layer in order to draw\n * primitive shapes like circles, rectangles, paths or text directly on a chart,\n * or independent from any chart. The SVGRenderer represents a wrapper object\n * for SVG in modern browsers.\n *\n * An existing chart's renderer can be accessed through {@link Chart.renderer}.\n * The renderer can also be used completely decoupled from a chart.\n *\n * See [How to use the SVG Renderer](\n * https://www.highcharts.com/docs/advanced-chart-features/renderer) for a\n * comprehensive tutorial.\n *\n * @sample highcharts/members/renderer-on-chart\n * Annotating a chart programmatically.\n * @sample highcharts/members/renderer-basic\n * Independent SVG drawing.\n *\n * @example\n * // Use directly without a chart object.\n * let renderer = new Highcharts.Renderer(parentNode, 600, 400);\n *\n * @class\n * @name Highcharts.SVGRenderer\n *\n * @param {Highcharts.HTMLDOMElement} container\n * Where to put the SVG in the web page.\n *\n * @param {number} width\n * The width of the SVG.\n *\n * @param {number} height\n * The height of the SVG.\n *\n * @param {Highcharts.CSSObject} [style]\n * The box style, if not in styleMode\n *\n * @param {boolean} [forExport=false]\n * Whether the rendered content is intended for export.\n *\n * @param {boolean} [allowHTML=true]\n * Whether the renderer is allowed to include HTML text, which will be\n * projected on top of the SVG.\n *\n * @param {boolean} [styledMode=false]\n * Whether the renderer belongs to a chart that is in styled mode.\n * If it does, it will avoid setting presentational attributes in\n * some cases, but not when set explicitly through `.attr` and `.css`\n * etc.\n */\nclass SVGRenderer {\n /**\n * The root `svg` node of the renderer.\n *\n * @name Highcharts.SVGRenderer#box\n * @type {Highcharts.SVGDOMElement}\n */\n /**\n * The wrapper for the root `svg` node of the renderer.\n *\n * @name Highcharts.SVGRenderer#boxWrapper\n * @type {Highcharts.SVGElement}\n */\n /**\n * A pointer to the `defs` node of the root SVG.\n *\n * @name Highcharts.SVGRenderer#defs\n * @type {Highcharts.SVGElement}\n */\n /**\n * Whether the rendered content is intended for export.\n *\n * @name Highcharts.SVGRenderer#forExport\n * @type {boolean | undefined}\n */\n /**\n * Page url used for internal references.\n *\n * @private\n * @name Highcharts.SVGRenderer#url\n * @type {string}\n */\n /**\n * Initialize the SVGRenderer. Overridable initializer function that takes\n * the same parameters as the constructor.\n *\n * @function Highcharts.SVGRenderer#init\n *\n * @param {Highcharts.HTMLDOMElement} container\n * Where to put the SVG in the web page.\n *\n * @param {number} width\n * The width of the SVG.\n *\n * @param {number} height\n * The height of the SVG.\n *\n * @param {Highcharts.CSSObject} [style]\n * The box style, if not in styleMode\n *\n * @param {boolean} [forExport=false]\n * Whether the rendered content is intended for export.\n *\n * @param {boolean} [allowHTML=true]\n * Whether the renderer is allowed to include HTML text, which will be\n * projected on top of the SVG.\n *\n * @param {boolean} [styledMode=false]\n * Whether the renderer belongs to a chart that is in styled mode. If it\n * does, it will avoid setting presentational attributes in some cases, but\n * not when set explicitly through `.attr` and `.css` etc.\n */\n constructor(container, width, height, style, forExport, allowHTML, styledMode) {\n const renderer = this, boxWrapper = renderer\n .createElement('svg')\n .attr({\n version: '1.1',\n 'class': 'highcharts-root'\n }), element = boxWrapper.element;\n if (!styledMode) {\n boxWrapper.css(this.getStyle(style || {}));\n }\n container.appendChild(element);\n // Always use ltr on the container, otherwise text-anchor will be\n // flipped and text appear outside labels, buttons, tooltip etc (#3482)\n SVGRenderer_attr(container, 'dir', 'ltr');\n // For browsers other than IE, add the namespace attribute (#1978)\n if (container.innerHTML.indexOf('xmlns') === -1) {\n SVGRenderer_attr(element, 'xmlns', this.SVG_NS);\n }\n this.box = element;\n this.boxWrapper = boxWrapper;\n this.alignedObjects = [];\n this.url = this.getReferenceURL();\n // Add description\n const desc = this.createElement('desc').add();\n desc.element.appendChild(SVGRenderer_doc.createTextNode('Created with Highcharts 12.1.1'));\n this.defs = this.createElement('defs').add();\n this.allowHTML = allowHTML;\n this.forExport = forExport;\n this.styledMode = styledMode;\n this.gradients = {}; // Object where gradient SvgElements are stored\n this.cache = {}; // Cache for numerical bounding boxes\n this.cacheKeys = [];\n this.imgCount = 0;\n this.rootFontSize = boxWrapper.getStyle('font-size');\n renderer.setSize(width, height, false);\n // Issue 110 workaround:\n // In Firefox, if a div is positioned by percentage, its pixel position\n // may land between pixels. The container itself doesn't display this,\n // but an SVG element inside this container will be drawn at subpixel\n // precision. In order to draw sharp lines, this must be compensated\n // for. This doesn't seem to work inside iframes though (like in\n // jsFiddle).\n let subPixelFix, rect;\n if (SVGRenderer_isFirefox && container.getBoundingClientRect) {\n subPixelFix = function () {\n SVGRenderer_css(container, { left: 0, top: 0 });\n rect = container.getBoundingClientRect();\n SVGRenderer_css(container, {\n left: (Math.ceil(rect.left) - rect.left) + 'px',\n top: (Math.ceil(rect.top) - rect.top) + 'px'\n });\n };\n // Run the fix now\n subPixelFix();\n // Run it on resize\n renderer.unSubPixelFix = SVGRenderer_addEvent(SVGRenderer_win, 'resize', subPixelFix);\n }\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * General method for adding a definition to the SVG `defs` tag. Can be used\n * for gradients, fills, filters etc. Styled mode only. A hook for adding\n * general definitions to the SVG's defs tag. Definitions can be referenced\n * from the CSS by its `id`. Read more in\n * [gradients, shadows and patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n * Styled mode only.\n *\n * @function Highcharts.SVGRenderer#definition\n *\n * @param {Highcharts.ASTNode} def\n * A serialized form of an SVG definition, including children.\n *\n * @return {Highcharts.SVGElement}\n * The inserted node.\n */\n definition(def) {\n const ast = new HTML_AST([def]);\n return ast.addToDOM(this.defs.element);\n }\n /**\n * Get the prefix needed for internal URL references to work in certain\n * cases. Some older browser versions had a bug where internal url\n * references in SVG attributes, on the form `url(#some-id)`, would fail if\n * a base tag was present in the page. There were also issues with\n * `history.pushState` related to this prefix.\n *\n * Related issues: #24, #672, #1070, #5244.\n *\n * The affected browsers are:\n * - Chrome <= 53 (May 2018)\n * - Firefox <= 51 (January 2017)\n * - Safari/Mac <= 12.1 (2018 or 2019)\n * - Safari/iOS <= 13\n *\n * @todo Remove this hack when time has passed. All the affected browsers\n * are evergreens, so it is increasingly unlikely that users are affected by\n * the bug.\n *\n * @return {string}\n * The prefix to use. An empty string for modern browsers.\n */\n getReferenceURL() {\n if ((SVGRenderer_isFirefox || isWebKit) &&\n SVGRenderer_doc.getElementsByTagName('base').length) {\n // Detect if a clip path is taking effect by performing a hit test\n // outside the clipped area. If the hit element is the rectangle\n // that was supposed to be clipped, the bug is present. This only\n // has to be performed once per page load, so we store the result\n // locally in the module.\n if (!SVGRenderer_defined(hasInternalReferenceBug)) {\n const id = SVGRenderer_uniqueKey();\n const ast = new HTML_AST([{\n tagName: 'svg',\n attributes: {\n width: 8,\n height: 8\n },\n children: [{\n tagName: 'defs',\n children: [{\n tagName: 'clipPath',\n attributes: {\n id\n },\n children: [{\n tagName: 'rect',\n attributes: {\n width: 4,\n height: 4\n }\n }]\n }]\n }, {\n tagName: 'rect',\n attributes: {\n id: 'hitme',\n width: 8,\n height: 8,\n 'clip-path': `url(#${id})`,\n fill: 'rgba(0,0,0,0.001)'\n }\n }]\n }]);\n const svg = ast.addToDOM(SVGRenderer_doc.body);\n SVGRenderer_css(svg, {\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9e5\n });\n const hitElement = SVGRenderer_doc.elementFromPoint(6, 6);\n hasInternalReferenceBug = (hitElement && hitElement.id) === 'hitme';\n SVGRenderer_doc.body.removeChild(svg);\n }\n if (hasInternalReferenceBug) {\n // Scan alert #[72]: Loop for nested patterns\n return SVGRenderer_replaceNested(SVGRenderer_win.location.href.split('#')[0], // Remove hash\n [/<[^>]*>/g, ''], // Wing cut HTML\n [/([\\('\\)])/g, '\\\\$1'], // Escape parantheses and quotes\n [/ /g, '%20'] // Replace spaces (needed for Safari only)\n );\n }\n }\n return '';\n }\n /**\n * Get the global style setting for the renderer.\n *\n * @private\n * @function Highcharts.SVGRenderer#getStyle\n *\n * @param {Highcharts.CSSObject} style\n * Style settings.\n *\n * @return {Highcharts.CSSObject}\n * The style settings mixed with defaults.\n */\n getStyle(style) {\n this.style = SVGRenderer_extend({\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", ' +\n 'Roboto, Helvetica, Arial, \"Apple Color Emoji\", ' +\n '\"Segoe UI Emoji\", \"Segoe UI Symbol\", sans-serif',\n fontSize: '1rem'\n }, style);\n return this.style;\n }\n /**\n * Apply the global style on the renderer, mixed with the default styles.\n *\n * @function Highcharts.SVGRenderer#setStyle\n *\n * @param {Highcharts.CSSObject} style\n * CSS to apply.\n */\n setStyle(style) {\n this.boxWrapper.css(this.getStyle(style));\n }\n /**\n * Detect whether the renderer is hidden. This happens when one of the\n * parent elements has `display: none`. Used internally to detect when we\n * need to render preliminarily in another div to get the text bounding\n * boxes right.\n *\n * @function Highcharts.SVGRenderer#isHidden\n *\n * @return {boolean}\n * True if it is hidden.\n */\n isHidden() {\n return !this.boxWrapper.getBBox().width;\n }\n /**\n * Destroys the renderer and its allocated members.\n *\n * @function Highcharts.SVGRenderer#destroy\n *\n * @return {null}\n * Pass through value.\n */\n destroy() {\n const renderer = this, rendererDefs = renderer.defs;\n renderer.box = null;\n renderer.boxWrapper = renderer.boxWrapper.destroy();\n // Call destroy on all gradient elements\n SVGRenderer_destroyObjectProperties(renderer.gradients || {});\n renderer.gradients = null;\n renderer.defs = rendererDefs.destroy();\n // Remove sub pixel fix handler (#982)\n if (renderer.unSubPixelFix) {\n renderer.unSubPixelFix();\n }\n renderer.alignedObjects = null;\n return null;\n }\n /**\n * Create a wrapper for an SVG element. Serves as a factory for\n * {@link SVGElement}, but this function is itself mostly called from\n * primitive factories like {@link SVGRenderer#path}, {@link\n * SVGRenderer#rect} or {@link SVGRenderer#text}.\n *\n * @function Highcharts.SVGRenderer#createElement\n *\n * @param {string} nodeName\n * The node name, for example `rect`, `g` etc.\n *\n * @return {Highcharts.SVGElement}\n * The generated SVGElement.\n */\n createElement(nodeName) {\n return new this.Element(this, nodeName);\n }\n /**\n * Get converted radial gradient attributes according to the radial\n * reference. Used internally from the {@link SVGElement#colorGradient}\n * function.\n *\n * @private\n * @function Highcharts.SVGRenderer#getRadialAttr\n */\n getRadialAttr(radialReference, gradAttr) {\n return {\n cx: (radialReference[0] - radialReference[2] / 2) +\n (gradAttr.cx || 0) * radialReference[2],\n cy: (radialReference[1] - radialReference[2] / 2) +\n (gradAttr.cy || 0) * radialReference[2],\n r: (gradAttr.r || 0) * radialReference[2]\n };\n }\n /**\n * Create a drop shadow definition and return its id\n *\n * @private\n * @function Highcharts.SVGRenderer#shadowDefinition\n *\n * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions] The\n * shadow options. If `true`, the default options are applied\n */\n shadowDefinition(shadowOptions) {\n const id = [\n `highcharts-drop-shadow-${this.chartIndex}`,\n ...Object.keys(shadowOptions)\n .map((key) => `${key}-${shadowOptions[key]}`)\n ].join('-').toLowerCase().replace(/[^a-z\\d\\-]/g, ''), options = SVGRenderer_merge({\n color: '#000000',\n offsetX: 1,\n offsetY: 1,\n opacity: 0.15,\n width: 5\n }, shadowOptions);\n if (!this.defs.element.querySelector(`#${id}`)) {\n this.definition({\n tagName: 'filter',\n attributes: {\n id,\n filterUnits: options.filterUnits\n },\n children: this.getShadowFilterContent(options)\n });\n }\n return id;\n }\n /**\n * Get shadow filter content.\n * NOTE! Overridden in es5 module for IE11 compatibility.\n *\n * @private\n * @function Highcharts.SVGRenderer#getShadowFilterContent\n *\n * @param {ShadowOptionsObject} options\n * The shadow options.\n * @return {Array}\n * The shadow filter content.\n */\n getShadowFilterContent(options) {\n return [{\n tagName: 'feDropShadow',\n attributes: {\n dx: options.offsetX,\n dy: options.offsetY,\n 'flood-color': options.color,\n // Tuned and modified to keep a preserve compatibility\n // with the old settings\n 'flood-opacity': Math.min(options.opacity * 5, 1),\n stdDeviation: options.width / 2\n }\n }];\n }\n /**\n * Parse a simple HTML string into SVG tspans. Called internally when text\n * is set on an SVGElement. The function supports a subset of HTML tags, CSS\n * text features like `width`, `text-overflow`, `white-space`, and also\n * attributes like `href` and `style`.\n *\n * @private\n * @function Highcharts.SVGRenderer#buildText\n *\n * @param {Highcharts.SVGElement} wrapper\n * The parent SVGElement.\n */\n buildText(wrapper) {\n new SVG_TextBuilder(wrapper).buildSVG();\n }\n /**\n * Returns white for dark colors and black for bright colors, based on W3C's\n * definition of [Relative luminance](\n * https://www.w3.org/WAI/GL/wiki/Relative_luminance).\n *\n * @function Highcharts.SVGRenderer#getContrast\n *\n * @param {Highcharts.ColorString} color\n * The color to get the contrast for.\n *\n * @return {Highcharts.ColorString}\n * The contrast color, either `#000000` or `#FFFFFF`.\n */\n getContrast(color) {\n // #6216, #17273\n const rgba = Color_Color.parse(color).rgba\n .map((b8) => {\n const c = b8 / 255;\n return c <= 0.03928 ?\n c / 12.92 :\n Math.pow((c + 0.055) / 1.055, 2.4);\n });\n // Relative luminance\n const l = 0.2126 * rgba[0] + 0.7152 * rgba[1] + 0.0722 * rgba[2];\n // Use white or black based on which provides more contrast\n return 1.05 / (l + 0.05) > (l + 0.05) / 0.05 ? '#FFFFFF' : '#000000';\n }\n /**\n * Create a button with preset states. Styles for the button can either be\n * set as arguments, or a general theme for all buttons can be set by the\n * `global.buttonTheme` option.\n *\n * @function Highcharts.SVGRenderer#button\n *\n * @param {string} text\n * The text or HTML to draw.\n *\n * @param {number} x\n * The x position of the button's left side.\n *\n * @param {number} y\n * The y position of the button's top side.\n *\n * @param {Highcharts.EventCallbackFunction} callback\n * The function to execute on button click or touch.\n *\n * @param {Highcharts.SVGAttributes} [theme]\n * SVG attributes for the normal state.\n *\n * @param {Highcharts.SVGAttributes} [hoverState]\n * SVG attributes for the hover state.\n *\n * @param {Highcharts.SVGAttributes} [selectState]\n * SVG attributes for the pressed state.\n *\n * @param {Highcharts.SVGAttributes} [disabledState]\n * SVG attributes for the disabled state.\n *\n * @param {Highcharts.SymbolKeyValue} [shape=rect]\n * The shape type.\n *\n * @param {boolean} [useHTML=false]\n * Whether to use HTML to render the label.\n *\n * @return {Highcharts.SVGElement}\n * The button element.\n */\n button(text, x, y, callback, theme = {}, hoverState, selectState, disabledState, shape, useHTML) {\n const label = this.label(text, x, y, shape, void 0, void 0, useHTML, void 0, 'button'), styledMode = this.styledMode, args = arguments;\n let curState = 0;\n theme = SVGRenderer_merge(SVGRenderer_defaultOptions.global.buttonTheme, theme);\n // @todo Consider moving this to a lower level, like .attr\n if (styledMode) {\n delete theme.fill;\n delete theme.stroke;\n delete theme['stroke-width'];\n }\n const states = theme.states || {}, normalStyle = theme.style || {};\n delete theme.states;\n delete theme.style;\n // Presentational\n const stateAttribs = [\n HTML_AST.filterUserAttributes(theme)\n ], \n // The string type is a mistake, it is just for compliance with\n // SVGAttribute and is not used in button theme.\n stateStyles = [normalStyle];\n if (!styledMode) {\n ['hover', 'select', 'disabled'].forEach((stateName, i) => {\n stateAttribs.push(SVGRenderer_merge(stateAttribs[0], HTML_AST.filterUserAttributes(args[i + 5] || states[stateName] || {})));\n stateStyles.push(stateAttribs[i + 1].style);\n delete stateAttribs[i + 1].style;\n });\n }\n // Add the events. IE9 and IE10 need mouseover and mouseout to function\n // (#667).\n SVGRenderer_addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function () {\n if (curState !== 3) {\n label.setState(1);\n }\n });\n SVGRenderer_addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function () {\n if (curState !== 3) {\n label.setState(curState);\n }\n });\n label.setState = (state = 0) => {\n // Hover state is temporary, don't record it\n if (state !== 1) {\n label.state = curState = state;\n }\n // Update visuals\n label\n .removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n .addClass('highcharts-button-' +\n ['normal', 'hover', 'pressed', 'disabled'][state]);\n if (!styledMode) {\n label.attr(stateAttribs[state]);\n const css = stateStyles[state];\n if (SVGRenderer_isObject(css)) {\n label.css(css);\n }\n }\n };\n label.attr(stateAttribs[0]);\n // Presentational attributes\n if (!styledMode) {\n label.css(SVGRenderer_extend({ cursor: 'default' }, normalStyle));\n // HTML labels don't need to handle pointer events because click and\n // mouseenter/mouseleave is bound to the underlying element.\n // Should this be reconsidered, we need more complex logic to share\n // events between the and its
counterpart, and avoid\n // triggering mouseenter/mouseleave when hovering from one to the\n // other (#17440).\n if (useHTML) {\n label.text.css({ pointerEvents: 'none' });\n }\n }\n return label\n .on('touchstart', (e) => e.stopPropagation())\n .on('click', function (e) {\n if (curState !== 3) {\n callback.call(label, e);\n }\n });\n }\n /**\n * Make a straight line crisper by not spilling out to neighbour pixels.\n *\n * @function Highcharts.SVGRenderer#crispLine\n *\n * @param {Highcharts.SVGPathArray} points\n * The original points on the format `[['M', 0, 0], ['L', 100, 0]]`.\n *\n * @param {number} width\n * The width of the line.\n *\n * @return {Highcharts.SVGPathArray}\n * The original points array, but modified to render crisply.\n */\n crispLine(points, width) {\n const [start, end] = points;\n // Normalize to a crisp line\n if (SVGRenderer_defined(start[1]) && start[1] === end[1]) {\n start[1] = end[1] = SVGRenderer_crisp(start[1], width);\n }\n if (SVGRenderer_defined(start[2]) && start[2] === end[2]) {\n start[2] = end[2] = SVGRenderer_crisp(start[2], width);\n }\n return points;\n }\n /**\n * Draw a path, wraps the SVG `path` element.\n *\n * @sample highcharts/members/renderer-path-on-chart/\n * Draw a path in a chart\n * @sample highcharts/members/renderer-path/\n * Draw a path independent from a chart\n *\n * @example\n * let path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n * .attr({ stroke: '#ff00ff' })\n * .add();\n *\n * @function Highcharts.SVGRenderer#path\n *\n * @param {Highcharts.SVGPathArray} [path]\n * An SVG path definition in array form.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n *\n */ /**\n * Draw a path, wraps the SVG `path` element.\n *\n * @function Highcharts.SVGRenderer#path\n *\n * @param {Highcharts.SVGAttributes} [attribs]\n * The initial attributes.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n path(path) {\n const attribs = (this.styledMode ? {} : {\n fill: 'none'\n });\n if (SVGRenderer_isArray(path)) {\n attribs.d = path;\n }\n else if (SVGRenderer_isObject(path)) { // Attributes\n SVGRenderer_extend(attribs, path);\n }\n return this.createElement('path').attr(attribs);\n }\n /**\n * Draw a circle, wraps the SVG `circle` element.\n *\n * @sample highcharts/members/renderer-circle/\n * Drawing a circle\n *\n * @function Highcharts.SVGRenderer#circle\n *\n * @param {number} [x]\n * The center x position.\n *\n * @param {number} [y]\n * The center y position.\n *\n * @param {number} [r]\n * The radius.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */ /**\n * Draw a circle, wraps the SVG `circle` element.\n *\n * @function Highcharts.SVGRenderer#circle\n *\n * @param {Highcharts.SVGAttributes} [attribs]\n * The initial attributes.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n circle(x, y, r) {\n const attribs = (SVGRenderer_isObject(x) ?\n x :\n typeof x === 'undefined' ? {} : { x: x, y: y, r: r }), wrapper = this.createElement('circle');\n // Setting x or y translates to cx and cy\n wrapper.xSetter = wrapper.ySetter = function (value, key, element) {\n element.setAttribute('c' + key, value);\n };\n return wrapper.attr(attribs);\n }\n /**\n * Draw and return an arc.\n *\n * @sample highcharts/members/renderer-arc/\n * Drawing an arc\n *\n * @function Highcharts.SVGRenderer#arc\n *\n * @param {number} [x=0]\n * Center X position.\n *\n * @param {number} [y=0]\n * Center Y position.\n *\n * @param {number} [r=0]\n * The outer radius' of the arc.\n *\n * @param {number} [innerR=0]\n * Inner radius like used in donut charts.\n *\n * @param {number} [start=0]\n * The starting angle of the arc in radians, where 0 is to the right and\n * `-Math.PI/2` is up.\n *\n * @param {number} [end=0]\n * The ending angle of the arc in radians, where 0 is to the right and\n * `-Math.PI/2` is up.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */ /**\n * Draw and return an arc. Overloaded function that takes arguments object.\n *\n * @function Highcharts.SVGRenderer#arc\n *\n * @param {Highcharts.SVGAttributes} attribs\n * Initial SVG attributes.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n arc(x, y, r, innerR, start, end) {\n let options;\n if (SVGRenderer_isObject(x)) {\n options = x;\n y = options.y;\n r = options.r;\n innerR = options.innerR;\n start = options.start;\n end = options.end;\n x = options.x;\n }\n else {\n options = { innerR, start, end };\n }\n // Arcs are defined as symbols for the ability to set\n // attributes in attr and animate\n const arc = this.symbol('arc', x, y, r, r, options);\n arc.r = r; // #959\n return arc;\n }\n /**\n * Draw and return a rectangle.\n *\n * @function Highcharts.SVGRenderer#rect\n *\n * @param {number} [x]\n * Left position.\n *\n * @param {number} [y]\n * Top position.\n *\n * @param {number} [width]\n * Width of the rectangle.\n *\n * @param {number} [height]\n * Height of the rectangle.\n *\n * @param {number} [r]\n * Border corner radius.\n *\n * @param {number} [strokeWidth]\n * A stroke width can be supplied to allow crisp drawing.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */ /**\n * Draw and return a rectangle.\n *\n * @sample highcharts/members/renderer-rect-on-chart/\n * Draw a rectangle in a chart\n * @sample highcharts/members/renderer-rect/\n * Draw a rectangle independent from a chart\n *\n * @function Highcharts.SVGRenderer#rect\n *\n * @param {Highcharts.SVGAttributes} [attributes]\n * General SVG attributes for the rectangle.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n rect(x, y, width, height, r, strokeWidth) {\n const attribs = (SVGRenderer_isObject(x) ?\n x :\n typeof x === 'undefined' ?\n {} :\n {\n x,\n y,\n r,\n width: Math.max(width || 0, 0),\n height: Math.max(height || 0, 0)\n }), wrapper = this.createElement('rect');\n if (!this.styledMode) {\n if (typeof strokeWidth !== 'undefined') {\n attribs['stroke-width'] = strokeWidth;\n SVGRenderer_extend(attribs, wrapper.crisp(attribs));\n }\n attribs.fill = 'none';\n }\n wrapper.rSetter = function (value, _key, element) {\n wrapper.r = value;\n SVGRenderer_attr(element, {\n rx: value,\n ry: value\n });\n };\n wrapper.rGetter = function () {\n return wrapper.r || 0;\n };\n return wrapper.attr(attribs);\n }\n /**\n * Draw and return a rectangle with advanced corner rounding options.\n *\n * @function Highcharts.SVGRenderer#roundedRect\n *\n * @param {Highcharts.SVGAttributes} attribs\n * Attributes\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n roundedRect(attribs) {\n return this.symbol('roundedRect').attr(attribs);\n }\n /**\n * Resize the {@link SVGRenderer#box} and re-align all aligned child\n * elements.\n *\n * @sample highcharts/members/renderer-g/\n * Show and hide grouped objects\n *\n * @function Highcharts.SVGRenderer#setSize\n *\n * @param {number} width\n * The new pixel width.\n *\n * @param {number} height\n * The new pixel height.\n *\n * @param {boolean|Partial} [animate=true]\n * Whether and how to animate.\n */\n setSize(width, height, animate) {\n const renderer = this;\n renderer.width = width;\n renderer.height = height;\n renderer.boxWrapper.animate({\n width: width,\n height: height\n }, {\n step: function () {\n this.attr({\n viewBox: '0 0 ' + this.attr('width') + ' ' +\n this.attr('height')\n });\n },\n duration: SVGRenderer_pick(animate, true) ? void 0 : 0\n });\n renderer.alignElements();\n }\n /**\n * Create and return an svg group element. Child\n * {@link Highcharts.SVGElement} objects are added to the group by using the\n * group as the first parameter in {@link Highcharts.SVGElement#add|add()}.\n *\n * @function Highcharts.SVGRenderer#g\n *\n * @param {string} [name]\n * The group will be given a class name of `highcharts-{name}`. This\n * can be used for styling and scripting.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n g(name) {\n const elem = this.createElement('g');\n return name ?\n elem.attr({ 'class': 'highcharts-' + name }) :\n elem;\n }\n /**\n * Display an image.\n *\n * @sample highcharts/members/renderer-image-on-chart/\n * Add an image in a chart\n * @sample highcharts/members/renderer-image/\n * Add an image independent of a chart\n *\n * @function Highcharts.SVGRenderer#image\n *\n * @param {string} href\n * The image source.\n *\n * @param {number} [x]\n * The X position.\n *\n * @param {number} [y]\n * The Y position.\n *\n * @param {number} [width]\n * The image width. If omitted, it defaults to the image file width.\n *\n * @param {number} [height]\n * The image height. If omitted it defaults to the image file\n * height.\n *\n * @param {Function} [onload]\n * Event handler for image load.\n *\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n */\n image(href, x, y, width, height, onload) {\n const attribs = { preserveAspectRatio: 'none' };\n // Optional properties (#11756)\n if (SVGRenderer_isNumber(x)) {\n attribs.x = x;\n }\n if (SVGRenderer_isNumber(y)) {\n attribs.y = y;\n }\n if (SVGRenderer_isNumber(width)) {\n attribs.width = width;\n }\n if (SVGRenderer_isNumber(height)) {\n attribs.height = height;\n }\n const elemWrapper = this.createElement('image').attr(attribs), onDummyLoad = function (e) {\n elemWrapper.attr({ href });\n onload.call(elemWrapper, e);\n };\n // Add load event if supplied\n if (onload) {\n // We have to use a dummy HTML image since IE support for SVG image\n // load events is very buggy. First set a transparent src, wait for\n // dummy to load, and then add the real src to the SVG image.\n elemWrapper.attr({\n /* eslint-disable-next-line max-len */\n href: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='\n });\n const dummy = new SVGRenderer_win.Image();\n SVGRenderer_addEvent(dummy, 'load', onDummyLoad);\n dummy.src = href;\n if (dummy.complete) {\n onDummyLoad({});\n }\n }\n else {\n elemWrapper.attr({ href });\n }\n return elemWrapper;\n }\n /**\n * Draw a symbol out of pre-defined shape paths from\n * {@link SVGRenderer#symbols}.\n * It is used in Highcharts for point makers, which cake a `symbol` option,\n * and label and button backgrounds like in the tooltip and stock flags.\n *\n * @function Highcharts.SVGRenderer#symbol\n *\n * @param {string} symbol\n * The symbol name.\n *\n * @param {number} [x]\n * The X coordinate for the top left position.\n *\n * @param {number} [y]\n * The Y coordinate for the top left position.\n *\n * @param {number} [width]\n * The pixel width.\n *\n * @param {number} [height]\n * The pixel height.\n *\n * @param {Highcharts.SymbolOptionsObject} [options]\n * Additional options, depending on the actual symbol drawn.\n *\n * @return {Highcharts.SVGElement}\n * SVG symbol.\n */\n symbol(symbol, x, y, width, height, options) {\n const ren = this, imageRegex = /^url\\((.*?)\\)$/, isImage = imageRegex.test(symbol), sym = (!isImage && (this.symbols[symbol] ? symbol : 'circle')), \n // Get the symbol definition function\n symbolFn = (sym && this.symbols[sym]);\n let obj, path, imageSrc, centerImage;\n if (symbolFn) {\n // Check if there's a path defined for this symbol\n if (typeof x === 'number') {\n path = symbolFn.call(this.symbols, x || 0, y || 0, width || 0, height || 0, options);\n }\n obj = this.path(path);\n if (!ren.styledMode) {\n obj.attr('fill', 'none');\n }\n // Expando properties for use in animate and attr\n SVGRenderer_extend(obj, {\n symbolName: (sym || void 0),\n x: x,\n y: y,\n width: width,\n height: height\n });\n if (options) {\n SVGRenderer_extend(obj, options);\n }\n // Image symbols\n }\n else if (isImage) {\n imageSrc = symbol.match(imageRegex)[1];\n // Create the image synchronously, add attribs async\n const img = obj = this.image(imageSrc);\n // The image width is not always the same as the symbol width. The\n // image may be centered within the symbol, as is the case when\n // image shapes are used as label backgrounds, for example in flags.\n img.imgwidth = SVGRenderer_pick(options && options.width, symbolSizes[imageSrc] && symbolSizes[imageSrc].width);\n img.imgheight = SVGRenderer_pick(options && options.height, symbolSizes[imageSrc] && symbolSizes[imageSrc].height);\n /**\n * Set the size and position\n */\n centerImage = (obj) => obj.attr({\n width: obj.width,\n height: obj.height\n });\n /**\n * Width and height setters that take both the image's physical size\n * and the label size into consideration, and translates the image\n * to center within the label.\n */\n ['width', 'height'].forEach((key) => {\n img[`${key}Setter`] = function (value, key) {\n this[key] = value;\n const { alignByTranslate, element, width, height, imgwidth, imgheight } = this, imgSize = key === 'width' ? imgwidth : imgheight;\n let scale = 1;\n // Scale and center the image within its container. The name\n // `backgroundSize` is taken from the CSS spec, but the\n // value `within` is made up. Other possible values in the\n // spec, `cover` and `contain`, can be implemented if\n // needed.\n if (options &&\n options.backgroundSize === 'within' &&\n width &&\n height &&\n imgwidth &&\n imgheight) {\n scale = Math.min(width / imgwidth, height / imgheight);\n // Update both width and height to keep the ratio\n // correct (#17315)\n SVGRenderer_attr(element, {\n width: Math.round(imgwidth * scale),\n height: Math.round(imgheight * scale)\n });\n }\n else if (element && imgSize) {\n element.setAttribute(key, imgSize);\n }\n if (!alignByTranslate && imgwidth && imgheight) {\n this.translate(((width || 0) - (imgwidth * scale)) / 2, ((height || 0) - (imgheight * scale)) / 2);\n }\n };\n });\n if (SVGRenderer_defined(x)) {\n img.attr({\n x: x,\n y: y\n });\n }\n img.isImg = true;\n img.symbolUrl = symbol;\n if (SVGRenderer_defined(img.imgwidth) && SVGRenderer_defined(img.imgheight)) {\n centerImage(img);\n }\n else {\n // Initialize image to be 0 size so export will still function\n // if there's no cached sizes.\n img.attr({ width: 0, height: 0 });\n // Create a dummy JavaScript image to get the width and height.\n SVGRenderer_createElement('img', {\n onload: function () {\n const chart = SVGRenderer_charts[ren.chartIndex];\n // Special case for SVGs on IE11, the width is not\n // accessible until the image is part of the DOM\n // (#2854).\n if (this.width === 0) {\n SVGRenderer_css(this, {\n position: 'absolute',\n top: '-999em'\n });\n SVGRenderer_doc.body.appendChild(this);\n }\n // Center the image\n symbolSizes[imageSrc] = {\n width: this.width,\n height: this.height\n };\n img.imgwidth = this.width;\n img.imgheight = this.height;\n if (img.element) {\n centerImage(img);\n }\n // Clean up after #2854 workaround.\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n // Fire the load event when all external images are\n // loaded\n ren.imgCount--;\n if (!ren.imgCount && chart && !chart.hasLoaded) {\n chart.onload();\n }\n },\n src: imageSrc\n });\n this.imgCount++;\n }\n }\n return obj;\n }\n /**\n * Define a clipping rectangle. The clipping rectangle is later applied\n * to {@link SVGElement} objects through the {@link SVGElement#clip}\n * function.\n *\n * This function is deprecated as of v11.2. Instead, use a regular shape\n * (`rect`, `path` etc), and the `SVGElement.clipTo` function.\n *\n * @example\n * let circle = renderer.circle(100, 100, 100)\n * .attr({ fill: 'red' })\n * .add();\n * let clipRect = renderer.clipRect(100, 100, 100, 100);\n *\n * // Leave only the lower right quarter visible\n * circle.clip(clipRect);\n *\n * @deprecated\n *\n * @function Highcharts.SVGRenderer#clipRect\n *\n * @param {number} [x]\n *\n * @param {number} [y]\n *\n * @param {number} [width]\n *\n * @param {number} [height]\n *\n * @return {Highcharts.ClipRectElement}\n * A clipping rectangle.\n */\n clipRect(x, y, width, height) {\n return this.rect(x, y, width, height, 0);\n }\n /**\n * Draw text. The text can contain a subset of HTML, like spans and anchors\n * and some basic text styling of these. For more advanced features like\n * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n * To update the text after render, run `text.attr({ text: 'New text' })`.\n *\n * @sample highcharts/members/renderer-text-on-chart/\n * Annotate the chart freely\n * @sample highcharts/members/renderer-on-chart/\n * Annotate with a border and in response to the data\n * @sample highcharts/members/renderer-text/\n * Formatted text\n *\n * @function Highcharts.SVGRenderer#text\n *\n * @param {string} [str]\n * The text of (subset) HTML to draw.\n *\n * @param {number} [x]\n * The x position of the text's lower left corner.\n *\n * @param {number} [y]\n * The y position of the text's lower left corner.\n *\n * @param {boolean} [useHTML=false]\n * Use HTML to render the text.\n *\n * @return {Highcharts.SVGElement}\n * The text object.\n */\n text(str, x, y, useHTML) {\n const renderer = this, attribs = {};\n if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n return renderer.html(str, x, y);\n }\n attribs.x = Math.round(x || 0); // X always needed for line-wrap logic\n if (y) {\n attribs.y = Math.round(y);\n }\n if (SVGRenderer_defined(str)) {\n attribs.text = str;\n }\n const wrapper = renderer.createElement('text').attr(attribs);\n if (!useHTML || (renderer.forExport && !renderer.allowHTML)) {\n wrapper.xSetter = function (value, key, element) {\n const tspans = element.getElementsByTagName('tspan'), parentVal = element.getAttribute(key);\n for (let i = 0, tspan; i < tspans.length; i++) {\n tspan = tspans[i];\n // If the x values are equal, the tspan represents a line\n // break\n if (tspan.getAttribute(key) === parentVal) {\n tspan.setAttribute(key, value);\n }\n }\n element.setAttribute(key, value);\n };\n }\n return wrapper;\n }\n /**\n * Utility to return the baseline offset and total line height from the font\n * size.\n *\n * @function Highcharts.SVGRenderer#fontMetrics\n *\n * @param {Highcharts.SVGElement|Highcharts.SVGDOMElement|number} [element]\n * The element to inspect for a current font size. If a number is\n * given, it's used as a fall back for direct font size in pixels.\n *\n * @return {Highcharts.FontMetricsObject}\n * The font metrics.\n */\n fontMetrics(element) {\n const f = SVGRenderer_pInt(SVG_SVGElement.prototype.getStyle.call(element, 'font-size') || 0);\n // Empirical values found by comparing font size and bounding box\n // height. Applies to the default font family.\n // https://jsfiddle.net/highcharts/7xvn7/\n const h = f < 24 ? f + 3 : Math.round(f * 1.2), b = Math.round(h * 0.8);\n return {\n // Line height\n h,\n // Baseline\n b,\n // Font size\n f\n };\n }\n /**\n * Correct X and Y positioning of a label for rotation (#1764).\n *\n * @private\n * @function Highcharts.SVGRenderer#rotCorr\n */\n rotCorr(baseline, rotation, alterY) {\n let y = baseline;\n if (rotation && alterY) {\n y = Math.max(y * Math.cos(rotation * SVGRenderer_deg2rad), 4);\n }\n return {\n x: (-baseline / 3) * Math.sin(rotation * SVGRenderer_deg2rad),\n y: y\n };\n }\n /**\n * Compatibility function to convert the legacy one-dimensional path array\n * into an array of segments.\n *\n * It is used in maps to parse the `path` option, and in SVGRenderer.dSetter\n * to support legacy paths from demos.\n *\n * @private\n * @function Highcharts.SVGRenderer#pathToSegments\n */\n pathToSegments(path) {\n const ret = [];\n const segment = [];\n const commandLength = {\n A: 8,\n C: 7,\n H: 2,\n L: 3,\n M: 3,\n Q: 5,\n S: 5,\n T: 3,\n V: 2\n };\n // Short, non-typesafe parsing of the one-dimensional array. It splits\n // the path on any string. This is not type checked against the tuple\n // types, but is shorter, and doesn't require specific checks for any\n // command type in SVG.\n for (let i = 0; i < path.length; i++) {\n // Command skipped, repeat previous or insert L/l for M/m\n if (SVGRenderer_isString(segment[0]) &&\n SVGRenderer_isNumber(path[i]) &&\n segment.length === commandLength[(segment[0].toUpperCase())]) {\n path.splice(i, 0, segment[0].replace('M', 'L').replace('m', 'l'));\n }\n // Split on string\n if (typeof path[i] === 'string') {\n if (segment.length) {\n ret.push(segment.slice(0));\n }\n segment.length = 0;\n }\n segment.push(path[i]);\n }\n ret.push(segment.slice(0));\n return ret;\n /*\n // Fully type-safe version where each tuple type is checked. The\n // downside is filesize and a lack of flexibility for unsupported\n // commands\n const ret: SVGPath = [],\n commands = {\n A: 7,\n C: 6,\n H: 1,\n L: 2,\n M: 2,\n Q: 4,\n S: 4,\n T: 2,\n V: 1,\n Z: 0\n };\n\n let i = 0,\n lastI = 0,\n lastCommand;\n\n while (i < path.length) {\n const item = path[i];\n\n let command;\n\n if (typeof item === 'string') {\n command = item;\n i += 1;\n } else {\n command = lastCommand || 'M';\n }\n\n // Upper case\n const commandUC = command.toUpperCase();\n\n if (commandUC in commands) {\n\n // No numeric parameters\n if (command === 'Z' || command === 'z') {\n ret.push([command]);\n\n // One numeric parameter\n } else {\n const val0 = path[i];\n if (typeof val0 === 'number') {\n\n // Horizontal line to\n if (command === 'H' || command === 'h') {\n ret.push([command, val0]);\n i += 1;\n\n // Vertical line to\n } else if (command === 'V' || command === 'v') {\n ret.push([command, val0]);\n i += 1;\n\n // Two numeric parameters\n } else {\n const val1 = path[i + 1];\n if (typeof val1 === 'number') {\n // lineTo\n if (command === 'L' || command === 'l') {\n ret.push([command, val0, val1]);\n i += 2;\n\n // moveTo\n } else if (command === 'M' || command === 'm') {\n ret.push([command, val0, val1]);\n i += 2;\n\n // Smooth quadratic bezier\n } else if (command === 'T' || command === 't') {\n ret.push([command, val0, val1]);\n i += 2;\n\n // Four numeric parameters\n } else {\n const val2 = path[i + 2],\n val3 = path[i + 3];\n if (\n typeof val2 === 'number' &&\n typeof val3 === 'number'\n ) {\n // Quadratic bezier to\n if (\n command === 'Q' ||\n command === 'q'\n ) {\n ret.push([\n command,\n val0,\n val1,\n val2,\n val3\n ]);\n i += 4;\n\n // Smooth cubic bezier to\n } else if (\n command === 'S' ||\n command === 's'\n ) {\n ret.push([\n command,\n val0,\n val1,\n val2,\n val3\n ]);\n i += 4;\n\n // Six numeric parameters\n } else {\n const val4 = path[i + 4],\n val5 = path[i + 5];\n\n if (\n typeof val4 === 'number' &&\n typeof val5 === 'number'\n ) {\n // Curve to\n if (\n command === 'C' ||\n command === 'c'\n ) {\n ret.push([\n command,\n val0,\n val1,\n val2,\n val3,\n val4,\n val5\n ]);\n i += 6;\n\n // Seven numeric parameters\n } else {\n const val6 = path[i + 6];\n\n // Arc to\n if (\n typeof val6 ===\n 'number' &&\n (\n command === 'A' ||\n command === 'a'\n )\n ) {\n ret.push([\n command,\n val0,\n val1,\n val2,\n val3,\n val4,\n val5,\n val6\n ]);\n i += 7;\n\n }\n\n }\n }\n }\n }\n }\n }\n\n }\n }\n }\n }\n\n // An unmarked command following a moveTo is a lineTo\n lastCommand = command === 'M' ? 'L' : command;\n\n if (i === lastI) {\n break;\n }\n lastI = i;\n }\n return ret;\n */\n }\n /**\n * Draw a label, which is an extended text element with support for border\n * and background. Highcharts creates a `g` element with a text and a `path`\n * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n * background are set through `stroke`, `stroke-width` and `fill` attributes\n * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n * text after render, run `label.attr({ text: 'New text' })`.\n *\n * @sample highcharts/members/renderer-label-on-chart/\n * A label on the chart\n *\n * @function Highcharts.SVGRenderer#label\n *\n * @param {string} str\n * The initial text string or (subset) HTML to render.\n *\n * @param {number} x\n * The x position of the label's left side.\n *\n * @param {number} [y]\n * The y position of the label's top side or baseline, depending on\n * the `baseline` parameter.\n *\n * @param {string} [shape='rect']\n * The shape of the label's border/background, if any. Defaults to\n * `rect`. Other possible values are `callout` or other shapes\n * defined in {@link Highcharts.SVGRenderer#symbols}.\n *\n * @param {number} [anchorX]\n * In case the `shape` has a pointer, like a flag, this is the\n * coordinates it should be pinned to.\n *\n * @param {number} [anchorY]\n * In case the `shape` has a pointer, like a flag, this is the\n * coordinates it should be pinned to.\n *\n * @param {boolean} [useHTML=false]\n * Whether to use HTML to render the label.\n *\n * @param {boolean} [baseline=false]\n * Whether to position the label relative to the text baseline,\n * like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n * upper border of the rectangle.\n *\n * @param {string} [className]\n * Class name for the group.\n *\n * @return {Highcharts.SVGElement}\n * The generated label.\n */\n label(str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n return new SVG_SVGLabel(this, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className);\n }\n /**\n * Re-align all aligned elements.\n *\n * @private\n * @function Highcharts.SVGRenderer#alignElements\n */\n alignElements() {\n this.alignedObjects.forEach((el) => el.align());\n }\n}\nSVGRenderer_extend(SVGRenderer.prototype, {\n /**\n * A pointer to the renderer's associated Element class.\n *\n * @name Highcharts.SVGRenderer#Element\n * @type {Highcharts.SVGElement}\n */\n Element: SVG_SVGElement,\n SVG_NS: SVGRenderer_SVG_NS,\n /**\n * A collection of characters mapped to HTML entities. When `useHTML` on an\n * element is true, these entities will be rendered correctly by HTML. In\n * the SVG pseudo-HTML, they need to be unescaped back to simple characters,\n * so for example `<` will render as `<`.\n *\n * @example\n * // Add support for unescaping quotes\n * Highcharts.SVGRenderer.prototype.escapes['\"'] = '"';\n *\n * @name Highcharts.SVGRenderer#escapes\n * @type {Highcharts.Dictionary}\n */\n escapes: {\n '&': '&',\n '<': '<',\n '>': '>',\n \"'\": ''', // eslint-disable-line quotes\n '\"': '"'\n },\n /**\n * An extendable collection of functions for defining symbol paths.\n *\n * @name Highcharts.SVGRenderer#symbols\n * @type {Highcharts.SymbolDictionary}\n */\n symbols: SVG_Symbols,\n /**\n * Dummy function for plugins, called every time the renderer is updated.\n * Prior to Highcharts 5, this was used for the canvg renderer.\n *\n * @deprecated\n * @function Highcharts.SVGRenderer#draw\n */\n draw: noop\n});\n/* *\n *\n * Registry\n *\n * */\nRenderer_RendererRegistry.registerRendererType('svg', SVGRenderer, true);\n/* *\n *\n * Export Default\n *\n * */\n/* harmony default export */ const SVG_SVGRenderer = (SVGRenderer);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A clipping rectangle that can be applied to one or more {@link SVGElement}\n * instances. It is instantiated with the {@link SVGRenderer#clipRect} function\n * and applied with the {@link SVGElement#clip} function.\n *\n * @example\n * let circle = renderer.circle(100, 100, 100)\n * .attr({ fill: 'red' })\n * .add();\n * let clipRect = renderer.clipRect(100, 100, 100, 100);\n *\n * // Leave only the lower right quarter visible\n * circle.clip(clipRect);\n *\n * @typedef {Highcharts.SVGElement} Highcharts.ClipRectElement\n */\n/**\n * The font metrics.\n *\n * @interface Highcharts.FontMetricsObject\n */ /**\n* The baseline relative to the top of the box.\n*\n* @name Highcharts.FontMetricsObject#b\n* @type {number}\n*/ /**\n* The font size.\n*\n* @name Highcharts.FontMetricsObject#f\n* @type {number}\n*/ /**\n* The line height.\n*\n* @name Highcharts.FontMetricsObject#h\n* @type {number}\n*/\n/**\n * An object containing `x` and `y` properties for the position of an element.\n *\n * @interface Highcharts.PositionObject\n */ /**\n* X position of the element.\n* @name Highcharts.PositionObject#x\n* @type {number}\n*/ /**\n* Y position of the element.\n* @name Highcharts.PositionObject#y\n* @type {number}\n*/\n/**\n * A rectangle.\n *\n * @interface Highcharts.RectangleObject\n */ /**\n* Height of the rectangle.\n* @name Highcharts.RectangleObject#height\n* @type {number}\n*/ /**\n* Width of the rectangle.\n* @name Highcharts.RectangleObject#width\n* @type {number}\n*/ /**\n* Horizontal position of the rectangle.\n* @name Highcharts.RectangleObject#x\n* @type {number}\n*/ /**\n* Vertical position of the rectangle.\n* @name Highcharts.RectangleObject#y\n* @type {number}\n*/\n/**\n * The shadow options.\n *\n * @interface Highcharts.ShadowOptionsObject\n */ /**\n* The shadow color.\n* @name Highcharts.ShadowOptionsObject#color\n* @type {Highcharts.ColorString|undefined}\n* @default ${palette.neutralColor100}\n*/ /**\n* The horizontal offset from the element.\n*\n* @name Highcharts.ShadowOptionsObject#offsetX\n* @type {number|undefined}\n* @default 1\n*/ /**\n* The vertical offset from the element.\n* @name Highcharts.ShadowOptionsObject#offsetY\n* @type {number|undefined}\n* @default 1\n*/ /**\n* The shadow opacity.\n*\n* @name Highcharts.ShadowOptionsObject#opacity\n* @type {number|undefined}\n* @default 0.15\n*/ /**\n* The shadow width or distance from the element.\n* @name Highcharts.ShadowOptionsObject#width\n* @type {number|undefined}\n* @default 3\n*/\n/**\n * @interface Highcharts.SizeObject\n */ /**\n* @name Highcharts.SizeObject#height\n* @type {number}\n*/ /**\n* @name Highcharts.SizeObject#width\n* @type {number}\n*/\n/**\n * Array of path commands, that will go into the `d` attribute of an SVG\n * element.\n *\n * @typedef {Array<(Array|Array|Array|Array|Array|Array)>} Highcharts.SVGPathArray\n */\n/**\n * Possible path commands in an SVG path array. Valid values are `A`, `C`, `H`,\n * `L`, `M`, `Q`, `S`, `T`, `V`, `Z`.\n *\n * @typedef {string} Highcharts.SVGPathCommand\n * @validvalue [\"a\",\"c\",\"h\",\"l\",\"m\",\"q\",\"s\",\"t\",\"v\",\"z\",\"A\",\"C\",\"H\",\"L\",\"M\",\"Q\",\"S\",\"T\",\"V\",\"Z\"]\n */\n/**\n * An extendable collection of functions for defining symbol paths. Symbols are\n * used internally for point markers, button and label borders and backgrounds,\n * or custom shapes. Extendable by adding to {@link SVGRenderer#symbols}.\n *\n * @interface Highcharts.SymbolDictionary\n */ /**\n* @name Highcharts.SymbolDictionary#[key:string]\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#arc\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#callout\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#circle\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#diamond\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#square\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#triangle\n* @type {Function|undefined}\n*/\n/**\n * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`, `triangle`,\n * and `triangle-down`. Symbols are used internally for point markers, button\n * and label borders and backgrounds, or custom shapes. Extendable by adding to\n * {@link SVGRenderer#symbols}.\n *\n * @typedef {\"arc\"|\"callout\"|\"circle\"|\"diamond\"|\"square\"|\"triangle\"|\"triangle-down\"} Highcharts.SymbolKeyValue\n */\n/**\n * Additional options, depending on the actual symbol drawn.\n *\n * @interface Highcharts.SymbolOptionsObject\n */ /**\n* The anchor X position for the `callout` symbol. This is where the chevron\n* points to.\n*\n* @name Highcharts.SymbolOptionsObject#anchorX\n* @type {number|undefined}\n*/ /**\n* The anchor Y position for the `callout` symbol. This is where the chevron\n* points to.\n*\n* @name Highcharts.SymbolOptionsObject#anchorY\n* @type {number|undefined}\n*/ /**\n* The end angle of an `arc` symbol.\n*\n* @name Highcharts.SymbolOptionsObject#end\n* @type {number|undefined}\n*/ /**\n* Whether to draw `arc` symbol open or closed.\n*\n* @name Highcharts.SymbolOptionsObject#open\n* @type {boolean|undefined}\n*/ /**\n* The radius of an `arc` symbol, or the border radius for the `callout` symbol.\n*\n* @name Highcharts.SymbolOptionsObject#r\n* @type {number|undefined}\n*/ /**\n* The start angle of an `arc` symbol.\n*\n* @name Highcharts.SymbolOptionsObject#start\n* @type {number|undefined}\n*/\n(''); // Keeps doclets above in transpiled file\n\n;// ./code/es-modules/Core/Renderer/HTML/HTMLElement.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { composed } = Core_Globals;\n\n\nconst { attr: HTMLElement_attr, css: HTMLElement_css, createElement: HTMLElement_createElement, defined: HTMLElement_defined, extend: HTMLElement_extend, getAlignFactor: HTMLElement_getAlignFactor, isNumber: HTMLElement_isNumber, pInt: HTMLElement_pInt, pushUnique: HTMLElement_pushUnique } = Core_Utilities;\n/**\n * The opacity and visibility properties are set as attributes on the main\n * element and SVG groups, and as identical CSS properties on the HTML element\n * and the ancestry divs. (#3542)\n *\n * @private\n */\nfunction commonSetter(value, key, elem) {\n const style = this.div?.style || elem.style;\n SVG_SVGElement.prototype[`${key}Setter`].call(this, value, key, elem);\n if (style) {\n style[key] = value;\n }\n}\n/**\n * Decorate each SVG group in the ancestry line. Each SVG `g` element that\n * contains children with useHTML, will receive a `div` element counterpart to\n * contain the HTML span. These div elements are translated and styled like\n * original `g` counterparts.\n *\n * @private\n */\nconst decorateSVGGroup = (g, container) => {\n if (!g.div) {\n const className = HTMLElement_attr(g.element, 'class'), cssProto = g.css;\n // Create the parallel HTML group\n const div = HTMLElement_createElement('div', className ? { className } : void 0, {\n // Add HTML specific styles\n position: 'absolute',\n left: `${g.translateX || 0}px`,\n top: `${g.translateY || 0}px`,\n // Add pre-existing styles\n ...g.styles,\n // Add g attributes that correspond to CSS\n display: g.display,\n opacity: g.opacity, // #5075\n visibility: g.visibility\n }, \n // The top group is appended to container\n g.parentGroup?.div || container);\n g.classSetter = (value, key, element) => {\n element.setAttribute('class', value);\n div.className = value;\n };\n /**\n * Common translate setter for X and Y on the HTML group.\n *\n * Reverted the fix for #6957 due to positioning problems and offline\n * export (#7254, #7280, #7529)\n * @private\n */\n g.translateXSetter = g.translateYSetter = (value, key) => {\n g[key] = value;\n div.style[key === 'translateX' ? 'left' : 'top'] = `${value}px`;\n g.doTransform = true;\n };\n g.opacitySetter = g.visibilitySetter = commonSetter;\n // Extend the parent group's css function by updating the parallel div\n // counterpart with the same style.\n g.css = (styles) => {\n // Call the base css method. The `parentGroup` can be either an\n // SVGElement or an SVGLabel, in which the css method is extended\n // (#19200).\n cssProto.call(g, styles);\n // #6794\n if (styles.cursor) {\n div.style.cursor = styles.cursor;\n }\n // #18821\n if (styles.pointerEvents) {\n div.style.pointerEvents = styles.pointerEvents;\n }\n return g;\n };\n // Event handling\n g.on = function () {\n SVG_SVGElement.prototype.on.apply({\n element: div,\n onEvents: g.onEvents\n }, arguments);\n return g;\n };\n g.div = div;\n }\n return g.div;\n};\n/* *\n *\n * Class\n *\n * */\nclass HTMLElement extends SVG_SVGElement {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * Compose\n * @private\n */\n static compose(SVGRendererClass) {\n if (HTMLElement_pushUnique(composed, this.compose)) {\n /**\n * Create a HTML text node. This is used by the SVG renderer `text`\n * and `label` functions through the `useHTML` parameter.\n *\n * @private\n */\n SVGRendererClass.prototype.html = function (str, x, y) {\n return new HTMLElement(this, 'span')\n // Set the default attributes\n .attr({\n text: str,\n x: Math.round(x),\n y: Math.round(y)\n });\n };\n }\n }\n /* *\n *\n * Functions\n *\n * */\n constructor(renderer, nodeName) {\n super(renderer, nodeName);\n this.css({\n position: 'absolute',\n ...(renderer.styledMode ? {} : {\n fontFamily: renderer.style.fontFamily,\n fontSize: renderer.style.fontSize\n })\n });\n }\n /**\n * Get the correction in X and Y positioning as the element is rotated.\n * @private\n */\n getSpanCorrection(width, baseline, alignCorrection) {\n this.xCorr = -width * alignCorrection;\n this.yCorr = -baseline;\n }\n /**\n * Apply CSS to HTML elements. This is used in text within SVG rendering.\n * @private\n */\n css(styles) {\n const { element } = this, \n // When setting or unsetting the width style, we need to update\n // transform (#8809)\n isSettingWidth = (element.tagName === 'SPAN' &&\n styles &&\n 'width' in styles), textWidth = isSettingWidth && styles.width;\n let doTransform;\n if (isSettingWidth) {\n delete styles.width;\n this.textWidth = HTMLElement_pInt(textWidth) || void 0;\n doTransform = true;\n }\n // Some properties require other properties to be set\n if (styles?.textOverflow === 'ellipsis') {\n styles.overflow = 'hidden';\n }\n if (styles?.lineClamp) {\n styles.display = '-webkit-box';\n styles.WebkitLineClamp = styles.lineClamp;\n styles.WebkitBoxOrient = 'vertical';\n styles.overflow = 'hidden';\n }\n // SVG natively supports setting font size as numbers. With HTML, the\n // font size should behave in the same way (#21624).\n if (HTMLElement_isNumber(Number(styles?.fontSize))) {\n styles.fontSize = styles.fontSize + 'px';\n }\n HTMLElement_extend(this.styles, styles);\n HTMLElement_css(element, styles);\n // Now that all styles are applied, to the transform\n if (doTransform) {\n this.updateTransform();\n }\n return this;\n }\n /**\n * The useHTML method for calculating the bounding box based on offsets.\n * Called internally from the `SVGElement.getBBox` function and subsequently\n * rotated.\n *\n * @private\n */\n htmlGetBBox() {\n const { element } = this;\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n }\n /**\n * Batch update styles and attributes related to transform\n *\n * @private\n */\n updateTransform() {\n // Aligning non added elements is expensive\n if (!this.added) {\n this.alignOnAdd = true;\n return;\n }\n const { element, renderer, rotation, rotationOriginX, rotationOriginY, scaleX, scaleY, styles, textAlign = 'left', textWidth, translateX = 0, translateY = 0, x = 0, y = 0 } = this, { display = 'block', whiteSpace } = styles;\n // Get the pixel length of the text\n const getTextPxLength = () => {\n if (this.textPxLength) {\n return this.textPxLength;\n }\n // Reset multiline/ellipsis in order to read width (#4928,\n // #5417)\n HTMLElement_css(element, {\n width: '',\n whiteSpace: whiteSpace || 'nowrap'\n });\n return element.offsetWidth;\n };\n // Apply translate\n HTMLElement_css(element, {\n marginLeft: `${translateX}px`,\n marginTop: `${translateY}px`\n });\n if (element.tagName === 'SPAN') {\n const currentTextTransform = [\n rotation,\n textAlign,\n element.innerHTML,\n textWidth,\n this.textAlign\n ].join(','), parentPadding = (this.parentGroup?.padding * -1) || 0;\n let baseline;\n // Update textWidth. Use the memoized textPxLength if possible, to\n // avoid the getTextPxLength function using elem.offsetWidth.\n // Calling offsetWidth affects rendering time as it forces layout\n // (#7656).\n if (textWidth !== this.oldTextWidth) { // #983, #1254\n const textPxLength = getTextPxLength(), textWidthNum = textWidth || 0;\n if (((textWidthNum > this.oldTextWidth) ||\n textPxLength > textWidthNum) && (\n // Only set the width if the text is able to word-wrap,\n // or text-overflow is ellipsis (#9537)\n /[ \\-]/.test(element.textContent || element.innerText) ||\n element.style.textOverflow === 'ellipsis')) {\n HTMLElement_css(element, {\n width: ((textPxLength > textWidthNum) ||\n rotation ||\n scaleX) ?\n textWidth + 'px' :\n 'auto', // #16261\n display,\n whiteSpace: whiteSpace || 'normal' // #3331\n });\n this.oldTextWidth = textWidth;\n }\n }\n // Do the calculations and DOM access only if properties changed\n if (currentTextTransform !== this.cTT) {\n baseline = renderer.fontMetrics(element).b;\n // Renderer specific handling of span rotation, but only if we\n // have something to update.\n if (HTMLElement_defined(rotation) &&\n ((rotation !== (this.oldRotation || 0)) ||\n (textAlign !== this.oldAlign))) {\n this.setSpanRotation(rotation, parentPadding, parentPadding);\n }\n this.getSpanCorrection(\n // Avoid elem.offsetWidth if we can, it affects rendering\n // time heavily (#7656)\n ((!HTMLElement_defined(rotation) &&\n !this.textWidth &&\n this.textPxLength) || // #7920\n element.offsetWidth), baseline, HTMLElement_getAlignFactor(textAlign));\n }\n // Apply position with correction and rotation origin\n const { xCorr = 0, yCorr = 0 } = this, rotOriginX = (rotationOriginX ?? x) - xCorr - x - parentPadding, rotOriginY = (rotationOriginY ?? y) - yCorr - y - parentPadding, styles = {\n left: `${x + xCorr}px`,\n top: `${y + yCorr}px`,\n textAlign,\n transformOrigin: `${rotOriginX}px ${rotOriginY}px`\n };\n if (scaleX || scaleY) {\n styles.transform = `scale(${scaleX ?? 1},${scaleY ?? 1})`;\n }\n HTMLElement_css(element, styles);\n // Record current text transform\n this.cTT = currentTextTransform;\n this.oldRotation = rotation;\n this.oldAlign = textAlign;\n }\n }\n /**\n * Set the rotation of an individual HTML span.\n * @private\n */\n setSpanRotation(rotation, originX, originY) {\n // CSS transform and transform-origin both supported without prefix\n // since Firefox 16 (2012), IE 10 (2012), Chrome 36 (2014), Safari 9\n // (2015).;\n HTMLElement_css(this.element, {\n transform: `rotate(${rotation}deg)`,\n transformOrigin: `${originX}% ${originY}px`\n });\n }\n /**\n * Add the element to a group wrapper. For HTML elements, a parallel div\n * will be created for each ancenstor SVG `g` element.\n *\n * @private\n */\n add(parentGroup) {\n const container = this.renderer.box\n .parentNode, parents = [];\n let div;\n this.parentGroup = parentGroup;\n // Create a parallel divs to hold the HTML elements\n if (parentGroup) {\n div = parentGroup.div;\n if (!div) {\n // Read the parent chain into an array and read from top\n // down\n let svgGroup = parentGroup;\n while (svgGroup) {\n parents.push(svgGroup);\n // Move up to the next parent group\n svgGroup = svgGroup.parentGroup;\n }\n // Decorate each of the ancestor group elements with a parallel\n // div that reflects translation and styling\n for (const parentGroup of parents.reverse()) {\n div = decorateSVGGroup(parentGroup, container);\n }\n }\n }\n (div || container).appendChild(this.element);\n this.added = true;\n if (this.alignOnAdd) {\n this.updateTransform();\n }\n return this;\n }\n /**\n * Text setter\n * @private\n */\n textSetter(value) {\n if (value !== this.textStr) {\n delete this.bBox;\n delete this.oldTextWidth;\n HTML_AST.setElementHTML(this.element, value ?? '');\n this.textStr = value;\n this.doTransform = true;\n }\n }\n /**\n * Align setter\n *\n * @private\n */\n alignSetter(value) {\n this.alignValue = this.textAlign = value;\n this.doTransform = true;\n }\n /**\n * Various setters which rely on update transform\n * @private\n */\n xSetter(value, key) {\n this[key] = value;\n this.doTransform = true;\n }\n}\n// Some shared setters\nconst proto = HTMLElement.prototype;\nproto.visibilitySetter = proto.opacitySetter = commonSetter;\nproto.ySetter =\n proto.rotationSetter =\n proto.rotationOriginXSetter =\n proto.rotationOriginYSetter = proto.xSetter;\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const HTML_HTMLElement = (HTMLElement);\n\n;// ./code/es-modules/Core/Axis/AxisDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Namespace\n *\n * */\nvar AxisDefaults;\n(function (AxisDefaults) {\n /* *\n *\n * Constants\n *\n * */\n /**\n * The X axis or category axis. Normally this is the horizontal axis,\n * though if the chart is inverted this is the vertical axis. In case of\n * multiple axes, the xAxis node is an array of configuration objects.\n *\n * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n * access to the axis.\n *\n * @productdesc {highmaps}\n * In Highmaps, the axis is hidden, but it is used behind the scenes to\n * control features like zooming and panning. Zooming is in effect the same\n * as setting the extremes of one of the exes.\n *\n * @type {*|Array<*>}\n * @optionparent xAxis\n */\n AxisDefaults.xAxis = {\n /**\n * When using multiple axis, the ticks of two or more opposite axes\n * will automatically be aligned by adding ticks to the axis or axes\n * with the least ticks, as if `tickAmount` were specified.\n *\n * This can be prevented by setting `alignTicks` to false. If the grid\n * lines look messy, it's a good idea to hide them for the secondary\n * axis by setting `gridLineWidth` to 0.\n *\n * If `startOnTick` or `endOnTick` in an Axis options are set to false,\n * then the `alignTicks ` will be disabled for the Axis.\n *\n * Disabled for logarithmic axes.\n *\n * @product highcharts highstock gantt\n */\n alignTicks: true,\n /**\n * Whether to allow decimals in this axis' ticks. When counting\n * integers, like persons or hits on a web page, decimals should\n * be avoided in the labels. By default, decimals are allowed on small\n * scale axes.\n *\n * @see [minTickInterval](#xAxis.minTickInterval)\n *\n * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-true/\n * True by default\n * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-false/\n * False\n *\n * @type {boolean|undefined}\n * @default undefined\n * @since 2.0\n */\n allowDecimals: void 0,\n /**\n * When using an alternate grid color, a band is painted across the\n * plot area between every other grid line.\n *\n * @sample {highcharts} highcharts/yaxis/alternategridcolor/\n * Alternate grid color on the Y axis\n * @sample {highstock} stock/xaxis/alternategridcolor/\n * Alternate grid color on the Y axis\n *\n * @type {Highcharts.ColorType}\n * @apioption xAxis.alternateGridColor\n */\n /**\n * An array defining breaks in the axis, the sections defined will be\n * left out and all the points shifted closer to each other.\n *\n * @productdesc {highcharts}\n * Requires that the broken-axis.js module is loaded.\n *\n * @sample {highcharts} highcharts/axisbreak/break-simple/\n * Simple break\n * @sample {highcharts|highstock} highcharts/axisbreak/break-visualized/\n * Advanced with callback\n * @sample {highstock} stock/demo/intraday-breaks/\n * Break on nights and weekends\n *\n * @type {Array<*>}\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.breaks\n */\n /**\n * A number indicating how much space should be left between the start\n * and the end of the break. The break size is given in axis units,\n * so for instance on a `datetime` axis, a break size of 3600000 would\n * indicate the equivalent of an hour.\n *\n * @type {number}\n * @default 0\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.breaks.breakSize\n */\n /**\n * The axis value where the break starts. On datetime axes, this may be\n * a date string.\n *\n * @type {number|string}\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.breaks.from\n */\n /**\n * Defines an interval after which the break appears again. By default\n * the breaks do not repeat.\n *\n * @type {number}\n * @default 0\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.breaks.repeat\n */\n /**\n * The axis value where the break ends. On datetime axes, this may be\n * a date string.\n *\n * @type {number|string}\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.breaks.to\n */\n /**\n * If categories are present for the xAxis, names are used instead of\n * numbers for that axis.\n *\n * Since Highcharts 3.0, categories can also\n * be extracted by giving each point a [name](#series.data) and setting\n * axis [type](#xAxis.type) to `category`. However, if you have multiple\n * series, best practice remains defining the `categories` array.\n *\n * Example: `categories: ['Apples', 'Bananas', 'Oranges']`\n *\n * @sample {highcharts} highcharts/demo/line-labels/\n * With\n * @sample {highcharts} highcharts/xaxis/categories/\n * Without\n *\n * @type {Array}\n * @product highcharts gantt\n * @apioption xAxis.categories\n */\n /**\n * The highest allowed value for automatically computed axis extremes.\n *\n * @see [floor](#xAxis.floor)\n *\n * @sample {highcharts|highstock} highcharts/yaxis/floor-ceiling/\n * Floor and ceiling\n *\n * @type {number}\n * @since 4.0\n * @product highcharts highstock gantt\n * @apioption xAxis.ceiling\n */\n /**\n * A class name that opens for styling the axis by CSS, especially in\n * Highcharts styled mode. The class name is applied to group elements\n * for the grid, axis elements and labels.\n *\n * @sample {highcharts|highstock|highmaps} highcharts/css/axis/\n * Multiple axes with separate styling\n *\n * @type {string}\n * @since 5.0.0\n * @apioption xAxis.className\n */\n /**\n * Configure a crosshair that follows either the mouse pointer or the\n * hovered point.\n *\n * In styled mode, the crosshairs are styled in the\n * `.highcharts-crosshair`, `.highcharts-crosshair-thin` or\n * `.highcharts-xaxis-category` classes.\n *\n * @productdesc {highstock}\n * In Highcharts stock, by default, the crosshair is enabled on the\n * X axis and disabled on the Y axis.\n *\n * @sample {highcharts} highcharts/xaxis/crosshair-both/\n * Crosshair on both axes\n * @sample {highstock} stock/xaxis/crosshairs-xy/\n * Crosshair on both axes, with y axis label\n * @sample {highmaps} highcharts/xaxis/crosshair-both/\n * Crosshair on both axes\n *\n * @declare Highcharts.AxisCrosshairOptions\n * @type {boolean|*}\n * @default false\n * @since 4.1\n * @apioption xAxis.crosshair\n */\n /**\n * The value on a perpendicular axis where this axis should cross. This\n * is typically used on mathematical plots where the axes cross at 0.\n * When `crossing` is set, space will not be reserved at the sides of\n * the chart for axis labels and title, so those may be clipped. In this\n * case it is better to place the axes without the `crossing` option.\n *\n * @type {number}\n * @sample highcharts/xaxis/crossing\n * Function plot with axes crossing at 0\n * @since 11.0.1\n * @apioption xAxis.crossing\n */\n /**\n * A class name for the crosshair, especially as a hook for styling.\n *\n * @type {string}\n * @since 5.0.0\n * @apioption xAxis.crosshair.className\n */\n /**\n * The color of the crosshair. Defaults to `#cccccc` for numeric and\n * datetime axes, and `rgba(204,214,235,0.25)` for category axes, where\n * the crosshair by default highlights the whole category.\n *\n * @sample {highcharts|highstock|highmaps} highcharts/xaxis/crosshair-customized/\n * Customized crosshairs\n *\n * @type {Highcharts.ColorType}\n * @default #cccccc\n * @since 4.1\n * @apioption xAxis.crosshair.color\n */\n /**\n * The dash style for the crosshair. See\n * [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n * for possible values.\n *\n * @sample {highcharts|highmaps} highcharts/xaxis/crosshair-dotted/\n * Dotted crosshair\n * @sample {highstock} stock/xaxis/crosshair-dashed/\n * Dashed X axis crosshair\n *\n * @type {Highcharts.DashStyleValue}\n * @default Solid\n * @since 4.1\n * @apioption xAxis.crosshair.dashStyle\n */\n /**\n * A label on the axis next to the crosshair.\n *\n * In styled mode, the label is styled with the\n * `.highcharts-crosshair-label` class.\n *\n * @sample {highstock} stock/xaxis/crosshair-label/\n * Crosshair labels\n * @sample {highstock} highcharts/css/crosshair-label/\n * Style mode\n *\n * @declare Highcharts.AxisCrosshairLabelOptions\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label\n */\n /**\n * Alignment of the label compared to the axis. Defaults to `\"left\"` for\n * right-side axes, `\"right\"` for left-side axes and `\"center\"` for\n * horizontal axes.\n *\n * @type {Highcharts.AlignValue}\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.align\n */\n /**\n * The background color for the label. Defaults to the related series\n * color, or `#666666` if that is not available.\n *\n * @type {Highcharts.ColorType}\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.backgroundColor\n */\n /**\n * The border color for the crosshair label\n *\n * @type {Highcharts.ColorType}\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.borderColor\n */\n /**\n * The border corner radius of the crosshair label.\n *\n * @type {number}\n * @default 3\n * @since 2.1.10\n * @product highstock\n * @apioption xAxis.crosshair.label.borderRadius\n */\n /**\n * The border width for the crosshair label.\n *\n * @type {number}\n * @default 0\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.borderWidth\n */\n /**\n * Flag to enable crosshair's label.\n *\n * @sample {highstock} stock/xaxis/crosshairs-xy/\n * Enabled label for yAxis' crosshair\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.enabled\n */\n /**\n * A format string for the crosshair label. Defaults to `{value}` for\n * numeric axes and `{value:%b %d, %Y}` for datetime axes.\n *\n * @type {string}\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.format\n */\n /**\n * Formatter function for the label text.\n *\n * @type {Highcharts.XAxisCrosshairLabelFormatterCallbackFunction}\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.formatter\n */\n /**\n * Padding inside the crosshair label.\n *\n * @type {number}\n * @default 8\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.padding\n */\n /**\n * The shape to use for the label box.\n *\n * @type {string}\n * @default callout\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.shape\n */\n /**\n * Text styles for the crosshair label.\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"white\", \"fontWeight\": \"normal\", \"fontSize\": \"11px\", \"textAlign\": \"center\"}\n * @since 2.1\n * @product highstock\n * @apioption xAxis.crosshair.label.style\n */\n /**\n * Whether the crosshair should snap to the point or follow the pointer\n * independent of points.\n *\n * @sample {highcharts|highstock} highcharts/xaxis/crosshair-snap-false/\n * True by default\n * @sample {highmaps} maps/demo/latlon-advanced/\n * Snap is false\n *\n * @type {boolean}\n * @default true\n * @since 4.1\n * @apioption xAxis.crosshair.snap\n */\n /**\n * The pixel width of the crosshair. Defaults to 1 for numeric or\n * datetime axes, and for one category width for category axes.\n *\n * @sample {highcharts} highcharts/xaxis/crosshair-customized/\n * Customized crosshairs\n * @sample {highstock} highcharts/xaxis/crosshair-customized/\n * Customized crosshairs\n * @sample {highmaps} highcharts/xaxis/crosshair-customized/\n * Customized crosshairs\n *\n * @type {number}\n * @default 1\n * @since 4.1\n * @apioption xAxis.crosshair.width\n */\n /**\n * The Z index of the crosshair. Higher Z indices allow drawing the\n * crosshair on top of the series or behind the grid lines.\n *\n * @type {number}\n * @default 2\n * @since 4.1\n * @apioption xAxis.crosshair.zIndex\n */\n /**\n * Whether to pan axis. If `chart.panning` is enabled, the option\n * allows to disable panning on an individual axis.\n */\n panningEnabled: true,\n /**\n * The Z index for the axis group.\n *\n * @see [axis.gridZIndex](#xAxis.gridZIndex)\n * @see [axis.labels.zIndex](#xAxis.labels.zIndex)\n */\n zIndex: 2,\n /**\n * Whether to zoom axis. If `chart.zoomType` is set, the option allows\n * to disable zooming on an individual axis.\n *\n * @sample {highcharts} highcharts/xaxis/zoomenabled/\n * Zoom enabled is false\n */\n zoomEnabled: true,\n /**\n * For a datetime axis, the scale will automatically adjust to the\n * appropriate unit. This member gives the default string\n * representations used for each unit. For intermediate values,\n * different units may be used, for example the `day` unit can be used\n * on midnight and `hour` unit be used for intermediate values on the\n * same axis.\n *\n * For an overview of the string or object configuration, see\n * [dateFormat](/class-reference/Highcharts.Time#dateFormat).\n *\n * Defaults to:\n * ```js\n * {\n * millisecond: '%[HMSL]',\n * second: '%[HMS]',\n * minute: '%[HM]',\n * hour: '%[HM]',\n * day: '%[eb]',\n * week: '%[eb]',\n * month: '%[bY]',\n * year: '%Y'\n * }\n * ```\n *\n * @sample {highcharts} highcharts/xaxis/datetimelabelformats-object/\n * Object day format on X axis\n * @sample {highcharts} highcharts/xaxis/datetimelabelformats/\n * String day format on X axis\n * @sample {highstock} stock/xaxis/datetimelabelformats/\n * More information in x axis labels\n *\n * @declare Highcharts.AxisDateTimeLabelFormatsOptions\n * @product highcharts highstock gantt\n */\n dateTimeLabelFormats: {\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n millisecond: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.millisecond.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.millisecond.main\n */\n main: '%[HMSL]',\n range: false\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n second: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.second.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.second.main\n */\n main: '%[HMS]',\n range: false\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n minute: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.minute.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.minute.main\n */\n main: '%[HM]',\n range: false\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n hour: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.hour.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.hour.main\n */\n main: '%[HM]',\n range: false\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n day: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.day.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.day.main\n */\n main: '%[eb]'\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n week: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.week.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.week.main\n */\n main: '%[eb]'\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n month: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.month.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.month.main\n */\n main: '%[bY]'\n },\n /**\n * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n * @type {string|*}\n */\n year: {\n /**\n * @type {Array}\n * @default undefined\n * @apioption xAxis.dateTimeLabelFormats.year.list\n */\n /**\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @apioption xAxis.dateTimeLabelFormats.year.main\n */\n main: '%Y'\n }\n },\n /**\n * Whether to force the axis to end on a tick. Use this option with\n * the `maxPadding` option to control the axis end.\n *\n * @productdesc {highstock}\n * In Highcharts Stock, `endOnTick` is always `false` when the navigator\n * is enabled, to prevent jumpy scrolling. With disabled navigator\n * enabling `endOnTick` may lead to extending the xAxis to show the last\n * tick, therefore range selector buttons may not have an active state\n * if the axis gets extended.\n *\n * @sample {highcharts} highcharts/yaxis/endontick/\n * True by default\n * @sample {highcharts} highcharts/yaxis/endontick-false/\n * False\n * @sample {highstock} stock/demo/basic-line/\n * True by default\n * @sample {highstock} stock/xaxis/endontick/\n * False\n *\n * @since 1.2.0\n */\n endOnTick: false,\n /**\n * Event handlers for the axis.\n *\n * @type {*}\n * @apioption xAxis.events\n */\n /**\n * An event fired after the breaks have rendered.\n *\n * @see [breaks](#xAxis.breaks)\n *\n * @sample {highcharts} highcharts/axisbreak/break-event/\n * AfterBreak Event\n *\n * @type {Highcharts.AxisEventCallbackFunction}\n * @since 4.1.0\n * @product highcharts gantt\n * @apioption xAxis.events.afterBreaks\n */\n /**\n * As opposed to the `setExtremes` event, this event fires after the\n * final min and max values are computed and corrected for `minRange`.\n *\n * Fires when the minimum and maximum is set for the axis, either by\n * calling the `.setExtremes()` method or by selecting an area in the\n * chart. One parameter, `event`, is passed to the function, containing\n * common event information.\n *\n * The new user set minimum and maximum values can be found by\n * `event.min` and `event.max`. These reflect the axis minimum and\n * maximum in axis values. The actual data extremes are found in\n * `event.dataMin` and `event.dataMax`.\n *\n * @type {Highcharts.AxisSetExtremesEventCallbackFunction}\n * @since 2.3\n * @context Highcharts.Axis\n * @apioption xAxis.events.afterSetExtremes\n */\n /**\n * An event fired when a break from this axis occurs on a point.\n *\n * @see [breaks](#xAxis.breaks)\n *\n * @sample {highcharts} highcharts/axisbreak/break-visualized/\n * Visualization of a Break\n *\n * @type {Highcharts.AxisPointBreakEventCallbackFunction}\n * @since 4.1.0\n * @product highcharts gantt\n * @context Highcharts.Axis\n * @apioption xAxis.events.pointBreak\n */\n /**\n * An event fired when a point falls inside a break from this axis.\n *\n * @type {Highcharts.AxisPointBreakEventCallbackFunction}\n * @product highcharts highstock gantt\n * @context Highcharts.Axis\n * @apioption xAxis.events.pointInBreak\n */\n /**\n * An event fired when a point is outside a break after zoom.\n *\n * @type {Highcharts.AxisPointBreakEventCallbackFunction}\n * @product highcharts highstock gantt\n * @context Highcharts.Axis\n * @apioption xAxis.events.pointBreakOut\n */\n /**\n * Fires when the minimum and maximum is set for the axis, either by\n * calling the `.setExtremes()` method or by selecting an area in the\n * chart. One parameter, `event`, is passed to the function,\n * containing common event information.\n *\n * The new user set minimum and maximum values can be found by\n * `event.min` and `event.max`. These reflect the axis minimum and\n * maximum in data values. When an axis is zoomed all the way out from\n * the \"Reset zoom\" button, `event.min` and `event.max` are null, and\n * the new extremes are set based on `this.dataMin` and `this.dataMax`.\n *\n * @sample {highstock} stock/xaxis/events-setextremes/\n * Log new extremes on x axis\n *\n * @type {Highcharts.AxisSetExtremesEventCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Axis\n * @apioption xAxis.events.setExtremes\n */\n /**\n * The lowest allowed value for automatically computed axis extremes.\n *\n * @see [ceiling](#yAxis.ceiling)\n *\n * @sample {highcharts} highcharts/yaxis/floor-ceiling/\n * Floor and ceiling\n * @sample {highstock} stock/demo/lazy-loading/\n * Prevent negative stock price on Y axis\n *\n * @type {number}\n * @since 4.0\n * @product highcharts highstock gantt\n * @apioption xAxis.floor\n */\n /**\n * The dash or dot style of the grid lines. For possible values, see\n * [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n *\n * @sample {highcharts} highcharts/yaxis/gridlinedashstyle/\n * Long dashes\n * @sample {highstock} stock/xaxis/gridlinedashstyle/\n * Long dashes\n *\n * @type {Highcharts.DashStyleValue}\n * @since 1.2\n */\n gridLineDashStyle: 'Solid',\n /**\n * The Z index of the grid lines.\n *\n * @sample {highcharts|highstock} highcharts/xaxis/gridzindex/\n * A Z index of 4 renders the grid above the graph\n *\n * @product highcharts highstock gantt\n *\n * @see [axis.zIndex](#xAxis.zIndex)\n * @see [axis.labels.zIndex](#xAxis.labels.zIndex)\n */\n gridZIndex: 1,\n /**\n * An id for the axis. This can be used after render time to get\n * a pointer to the axis object through `chart.get()`.\n *\n * @sample {highcharts} highcharts/xaxis/id/\n * Get the object\n * @sample {highstock} stock/xaxis/id/\n * Get the object\n *\n * @type {string}\n * @since 1.2.0\n * @apioption xAxis.id\n */\n /**\n * The axis labels show the number or category for each tick.\n *\n * Since v8.0.0: Labels are animated in categorized x-axis with\n * updating data if `tickInterval` and `step` is set to 1.\n *\n * @productdesc {highmaps}\n * X and Y axis labels are by default disabled in Highmaps, but the\n * functionality is inherited from Highcharts and used on `colorAxis`,\n * and can be enabled on X and Y axes too.\n */\n labels: {\n /**\n * What part of the string the given position is anchored to.\n * If `left`, the left side of the string is at the axis position.\n * Can be one of `\"left\"`, `\"center\"` or `\"right\"`. Defaults to\n * an intelligent guess based on which side of the chart the axis\n * is on and the rotation of the label.\n *\n * @see [reserveSpace](#xAxis.labels.reserveSpace)\n *\n * @sample {highcharts} highcharts/xaxis/labels-align-left/\n * Left\n * @sample {highcharts} highcharts/xaxis/labels-align-right/\n * Right\n * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n * Left-aligned labels on a vertical category axis\n *\n * @type {Highcharts.AlignValue}\n * @apioption xAxis.labels.align\n */\n /**\n * Whether to allow the axis labels to overlap. When false,\n * overlapping labels are hidden.\n *\n * @sample {highcharts} highcharts/xaxis/labels-allowoverlap-true/\n * X axis labels overlap enabled\n *\n * @type {boolean}\n * @default false\n * @apioption xAxis.labels.allowOverlap\n */\n /**\n * For horizontal axes, the allowed degrees of label rotation\n * to prevent overlapping labels. If there is enough space,\n * labels are not rotated. As the chart gets narrower, it\n * will start rotating the labels -45 degrees, then remove\n * every second label and try again with rotations 0 and -45 etc.\n * Set it to `undefined` to disable rotation, which will\n * cause the labels to word-wrap if possible. Defaults to `[-45]``\n * on bottom and top axes, `undefined` on left and right axes.\n *\n * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-default/\n * Default auto rotation of 0 or -45\n * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-0-90/\n * Custom graded auto rotation\n *\n * @type {Array}\n * @default undefined\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.labels.autoRotation\n */\n /**\n * When each category width is more than this many pixels, we don't\n * apply auto rotation. Instead, we lay out the axis label with word\n * wrap. A lower limit makes sense when the label contains multiple\n * short words that don't extend the available horizontal space for\n * each label.\n *\n * @sample {highcharts} highcharts/xaxis/labels-autorotationlimit/\n * Lower limit\n *\n * @since 4.1.5\n * @product highcharts gantt\n */\n autoRotationLimit: 80,\n /**\n * The label's pixel distance from the perimeter of the plot area.\n * On cartesian charts, this is overridden if the `labels.y` setting\n * is set.\n *\n * @sample {highcharts} highcharts/yaxis/labels-distance/\n * Polar chart, labels centered under the arc\n *\n * @type {number}\n * @product highcharts gantt\n */\n distance: 15,\n /**\n * Enable or disable the axis labels.\n *\n * @sample {highcharts} highcharts/xaxis/labels-enabled/\n * X axis labels disabled\n * @sample {highstock} stock/xaxis/labels-enabled/\n * X axis labels disabled\n *\n */\n enabled: true,\n /**\n * A format string for the axis label. The context is available as\n * format string variables. For example, you can use `{text}` to\n * insert the default formatted text. The recommended way of adding\n * units for the label is using `text`, for example `{text} km`.\n *\n * To add custom numeric or datetime formatting, use `{value}` with\n * formatting, for example `{value:.1f}` or `{value:%Y-%m-%d}`.\n *\n * See\n * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for more examples of formatting.\n *\n * The default value is not specified due to the dynamic\n * nature of the default implementation.\n *\n * @sample {highcharts|highstock} highcharts/yaxis/labels-format/\n * Add units to Y axis label\n * @sample {highcharts} highcharts/xaxis/labels-format-linked/\n * Linked category names\n * @sample {highcharts} highcharts/xaxis/labels-format-custom/\n * Custom number format\n *\n * @type {string}\n * @since 3.0\n * @apioption xAxis.labels.format\n */\n /**\n * Callback JavaScript function to format the label. The value\n * is given by `this.value`. Additional properties for `this` are\n * `axis`, `chart`, `isFirst`, `isLast` and `text` which holds the\n * value of the default formatter.\n *\n * Defaults to a built in function returning a formatted string\n * depending on whether the axis is `category`, `datetime`,\n * `numeric` or other.\n *\n * @sample {highcharts} highcharts/xaxis/labels-formatter-linked/\n * Linked category names\n * @sample {highcharts} highcharts/xaxis/labels-formatter-extended/\n * Modified numeric labels\n * @sample {highstock} stock/xaxis/labels-formatter/\n * Added units on Y axis\n *\n * @type {Highcharts.AxisLabelsFormatterCallbackFunction}\n * @apioption xAxis.labels.formatter\n */\n /**\n * The number of pixels to indent the labels per level in a treegrid\n * axis.\n *\n * @sample gantt/treegrid-axis/demo\n * Indentation 10px by default.\n * @sample gantt/treegrid-axis/indentation-0px\n * Indentation set to 0px.\n *\n * @product gantt\n */\n indentation: 10,\n /**\n * Horizontal axis only. When `staggerLines` is not set,\n * `maxStaggerLines` defines how many lines the axis is allowed to\n * add to automatically avoid overlapping X labels. Set to `1` to\n * disable overlap detection.\n *\n * @deprecated\n * @type {number}\n * @default 5\n * @since 1.3.3\n * @apioption xAxis.labels.maxStaggerLines\n */\n /**\n * How to handle overflowing labels on horizontal axis. If set to\n * `\"allow\"`, it will not be aligned at all. By default it\n * `\"justify\"` labels inside the chart area. If there is room to\n * move it, it will be aligned to the edge, else it will be removed.\n *\n * @since 2.2.5\n * @validvalue [\"allow\", \"justify\"]\n */\n overflow: 'justify',\n /**\n * The pixel padding for axis labels, to ensure white space between\n * them. Defaults to 4 for horizontal axes, 1 for vertical.\n *\n * @type {number}\n * @default undefined\n * @product highcharts gantt\n * @apioption xAxis.labels.padding\n */\n /**\n * Whether to reserve space for the labels. By default, space is\n * reserved for the labels in these cases:\n *\n * * On all horizontal axes.\n * * On vertical axes if `label.align` is `right` on a left-side\n * axis or `left` on a right-side axis.\n * * On vertical axes if `label.align` is `center`.\n *\n * This can be turned off when for example the labels are rendered\n * inside the plot area instead of outside.\n *\n * @see [labels.align](#xAxis.labels.align)\n *\n * @sample {highcharts} highcharts/xaxis/labels-reservespace/\n * No reserved space, labels inside plot\n * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n * Left-aligned labels on a vertical category axis\n *\n * @type {boolean}\n * @since 4.1.10\n * @product highcharts highstock gantt\n * @apioption xAxis.labels.reserveSpace\n */\n reserveSpace: void 0,\n /**\n * Rotation of the labels in degrees. When `undefined`, the\n * `autoRotation` option takes precedence.\n *\n * @sample {highcharts} highcharts/xaxis/labels-rotation/\n * X axis labels rotated 90°\n *\n * @type {number}\n * @default 0\n * @apioption xAxis.labels.rotation\n */\n rotation: void 0,\n /**\n * Horizontal axes only. The number of lines to spread the labels\n * over to make room or tighter labels. 0 disables staggering.\n *\n * @sample {highcharts} highcharts/xaxis/labels-staggerlines/\n * Show labels over two lines\n * @sample {highstock} stock/xaxis/labels-staggerlines/\n * Show labels over two lines\n *\n * @since 2.1\n */\n staggerLines: 0,\n /**\n * To show only every _n_'th label on the axis, set the step to _n_.\n * Setting the step to 2 shows every other label.\n *\n * By default, when 0, the step is calculated automatically to avoid\n * overlap. To prevent this, set it to 1\\. This usually only\n * happens on a category axis, and is often a sign that you have\n * chosen the wrong axis type.\n *\n * Read more at\n * [Axis docs](https://www.highcharts.com/docs/chart-concepts/axes)\n * => What axis should I use?\n *\n * @sample {highcharts} highcharts/xaxis/labels-step/\n * Showing only every other axis label on a categorized\n * x-axis\n * @sample {highcharts} highcharts/xaxis/labels-step-auto/\n * Auto steps on a category axis\n *\n * @since 2.1\n */\n step: 0,\n /**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n */\n useHTML: false,\n /**\n * The x position offset of all labels relative to the tick\n * positions on the axis. Overrides the `labels.distance` option.\n *\n * @type {number}\n * @apioption xAxis.labels.x\n */\n /**\n * The y position offset of all labels relative to the tick\n * positions on the axis. Overrides the `labels.distance` option.\n *\n * @sample {highcharts} highcharts/xaxis/labels-x/\n * X axis labels placed on grid lines\n *\n * @type {number}\n * @apioption xAxis.labels.y\n */\n /**\n * The Z index for the axis labels.\n *\n * @see [axis.zIndex](#xAxis.zIndex)\n * @see [axis.gridZIndex](#xAxis.gridZIndex)\n */\n zIndex: 7,\n /**\n * CSS styles for the label. Use `lineClamp` to control wrapping of\n * category labels. Use `textOverflow: 'none'` to prevent ellipsis\n * (dots).\n *\n * In styled mode, the labels are styled with the\n * `.highcharts-axis-labels` class.\n *\n * @sample {highcharts} highcharts/xaxis/labels-style/\n * Red X axis labels\n *\n * @type {Highcharts.CSSObject}\n */\n style: {\n /** @internal */\n color: \"#333333\" /* Palette.neutralColor80 */,\n /** @internal */\n cursor: 'default',\n /**\n * @type {number|string}\n */\n fontSize: '0.8em',\n /** @internal */\n textOverflow: 'ellipsis'\n }\n },\n /**\n * The left position as the horizontal axis. If it's a number, it is\n * interpreted as pixel position relative to the chart.\n *\n * Since Highcharts v5.0.13: If it's a percentage string, it is\n * interpreted as percentages of the plot width, offset from plot area\n * left.\n *\n * @sample {highcharts} highcharts/xaxis/axis-position-properties\n * Different axis position properties\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption xAxis.left\n */\n /**\n * The top position as the vertical axis. If it's a number, it is\n * interpreted as pixel position relative to the chart.\n *\n * Since Highcharts 2: If it's a percentage string, it is interpreted\n * as percentages of the plot height, offset from plot area top.\n *\n * @sample {highcharts} highcharts/xaxis/axis-position-properties\n * Different axis position properties\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption xAxis.top\n */\n /**\n * Index of another axis that this axis is linked to. When an axis is\n * linked to a master axis, it will take the same extremes as\n * the master, but as assigned by min or max or by setExtremes.\n * It can be used to show additional info, or to ease reading the\n * chart by duplicating the scales.\n *\n * @sample {highcharts} highcharts/xaxis/linkedto/\n * Different string formats of the same date\n * @sample {highcharts} highcharts/yaxis/linkedto/\n * Y values on both sides\n *\n * @type {number}\n * @since 2.0.2\n * @product highcharts highstock gantt\n * @apioption xAxis.linkedTo\n */\n /**\n * The maximum value of the axis. If `undefined`, the max value is\n * automatically calculated.\n *\n * If a datetime string is passed, it is parsed into epoch time\n * according to the time zone given in [time.timezone](#time.timezone).\n *\n * If the [endOnTick](#yAxis.endOnTick) option is true, the `max` value\n * might be rounded up.\n *\n * If a [tickAmount](#yAxis.tickAmount) is set, the axis may be extended\n * beyond the set max in order to reach the given number of ticks. The\n * same may happen in a chart with multiple axes, determined by [chart.\n * alignTicks](#chart), where a `tickAmount` is applied internally.\n *\n * @sample {highcharts} highcharts/yaxis/max-200/\n * Y axis max of 200\n * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n * Y axis max on logarithmic axis\n * @sample {highstock} stock/xaxis/min-max/\n * Fixed min and max on X axis\n *\n * @type {number|string|null}\n * @apioption xAxis.max\n */\n /**\n * Padding of the max value relative to the length of the axis. A\n * padding of 0.05 will make a 100px axis 5px longer. This is useful\n * when you don't want the highest data value to appear on the edge\n * of the plot area. When the axis' `max` option is set or a max extreme\n * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n *\n * @productdesc {highstock}\n * For an [ordinal](#xAxis.ordinal) axis, `minPadding` and `maxPadding`\n * are ignored. Use [overscroll](#xAxis.overscroll) instead.\n *\n * @sample {highcharts} highcharts/yaxis/maxpadding/\n * Max padding of 0.25 on y axis\n * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n * Greater min- and maxPadding\n * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n * Add some padding\n *\n * @default {highcharts} 0.01\n * @default {highstock|highmaps} 0\n * @since 1.2.0\n */\n maxPadding: 0.01,\n /**\n * Deprecated. Use `minRange` instead.\n *\n * @deprecated\n * @type {number}\n * @product highcharts highstock\n * @apioption xAxis.maxZoom\n */\n /**\n * The minimum value of the axis. If `undefined`, the min value is\n * automatically calculated.\n *\n * If a datetime string is passed, it is parsed into epoch time\n * according to the time zone given in [time.timezone](#time.timezone).\n *\n * If the [startOnTick](#yAxis.startOnTick) option is true (default),\n * the `min` value might be rounded down.\n *\n * The automatically calculated minimum value is also affected by\n * [floor](#yAxis.floor), [softMin](#yAxis.softMin),\n * [minPadding](#yAxis.minPadding), [minRange](#yAxis.minRange)\n * as well as [series.threshold](#plotOptions.series.threshold)\n * and [series.softThreshold](#plotOptions.series.softThreshold).\n *\n * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n * -50 with startOnTick to false\n * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n * -50 with startOnTick true by default\n * @sample {highstock} stock/xaxis/min-max/\n * Set min and max on X axis\n *\n * @type {number|string|null}\n * @apioption xAxis.min\n */\n /**\n * The dash or dot style of the minor grid lines. For possible values,\n * see [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n *\n * @sample {highcharts} highcharts/yaxis/minorgridlinedashstyle/\n * Long dashes on minor grid lines\n * @sample {highstock} stock/xaxis/minorgridlinedashstyle/\n * Long dashes on minor grid lines\n *\n * @type {Highcharts.DashStyleValue}\n * @since 1.2\n */\n minorGridLineDashStyle: 'Solid',\n /**\n * Specific tick interval in axis units for the minor ticks. On a linear\n * axis, if `\"auto\"`, the minor tick interval is calculated as a fifth\n * of the tickInterval. If `undefined`, minor ticks are not shown.\n *\n * On logarithmic axes, the unit is the power of the value. For example,\n * setting the minorTickInterval to 1 puts one tick on each of 0.1, 1,\n * 10, 100 etc. Setting the minorTickInterval to 0.1 produces 9 ticks\n * between 1 and 10, 10 and 100 etc.\n *\n * If user settings dictate minor ticks to become too dense, they don't\n * make sense, and will be ignored to prevent performance problems.\n *\n * @sample {highcharts} highcharts/yaxis/minortickinterval-null/\n * Undefined by default\n * @sample {highcharts} highcharts/yaxis/minortickinterval-5/ 5 units\n * @sample {highcharts} highcharts/yaxis/minortickinterval-log-auto/\n * \"auto\"\n * @sample {highcharts} highcharts/yaxis/minortickinterval-log/ 0.1\n * @sample {highstock} stock/demo/basic-line/ Null by default\n * @sample {highstock} stock/xaxis/minortickinterval-auto/ \"auto\"\n *\n * @type {number|'auto'}\n * @apioption xAxis.minorTickInterval\n */\n /**\n * The pixel length of the minor tick marks.\n *\n * @sample {highcharts} highcharts/yaxis/minorticklength/\n * 10px on Y axis\n * @sample {highstock} stock/xaxis/minorticks/\n * 10px on Y axis\n */\n minorTickLength: 2,\n /**\n * The position of the minor tick marks relative to the axis line.\n * Can be one of `inside` and `outside`.\n *\n * @sample {highcharts} highcharts/yaxis/minortickposition-outside/\n * Outside by default\n * @sample {highcharts} highcharts/yaxis/minortickposition-inside/\n * Inside\n * @sample {highstock} stock/xaxis/minorticks/\n * Inside\n *\n * @validvalue [\"inside\", \"outside\"]\n */\n minorTickPosition: 'outside',\n /**\n * Enable or disable minor ticks. The interval between the minor ticks\n * can be controlled either by the\n * [minorTicksPerMajor](#xAxis.minorTicksPerMajor) setting, or as an\n * absolute [minorTickInterval](#xAxis.minorTickInterval) value.\n *\n * On a logarithmic axis, minor ticks are laid out based on a best\n * guess, attempting to enter an approximate number of minor ticks\n * between each major tick based on\n * [minorTicksPerMajor](#xAxis.minorTicksPerMajor).\n *\n * Prior to v6.0.0, ticks were enabled in auto layout by setting\n * `minorTickInterval` to `\"auto\"`.\n *\n * @productdesc {highcharts} On axes using\n * [categories](#xAxis.categories), minor ticks are not supported.\n *\n * @sample {highcharts} highcharts/yaxis/minorticks-true/ Enabled on\n * linear Y axis\n *\n * @type {boolean}\n * @default false\n * @since 6.0.0\n * @apioption xAxis.minorTicks\n */\n /**\n * The number of minor ticks per major tick. Works for `linear`,\n * `logarithmic` and `datetime` axes.\n *\n * @sample {highcharts} highcharts/yaxis/minortickspermajor/\n * 2 minor ticks per major tick on Y axis\n *\n * @since 11.0.0\n *\n * @type {number}\n */\n minorTicksPerMajor: 5,\n /**\n * The pixel width of the minor tick mark.\n *\n * @sample {highcharts} highcharts/yaxis/minortickwidth/\n * 3px width\n * @sample {highstock} stock/xaxis/minorticks/\n * 1px width\n *\n * @type {number}\n * @default 0\n * @apioption xAxis.minorTickWidth\n */\n /**\n * Padding of the min value relative to the length of the axis. A\n * padding of 0.05 will make a 100px axis 5px longer. This is useful\n * when you don't want the lowest data value to appear on the edge\n * of the plot area. When the axis' `min` option is set or a min extreme\n * is set using `axis.setExtremes()`, the minPadding will be ignored.\n *\n * @productdesc {highstock}\n * For an [ordinal](#xAxis.ordinal) axis, `minPadding` and `maxPadding`\n * are ignored. Use [overscroll](#xAxis.overscroll) instead.\n *\n * @sample {highcharts} highcharts/yaxis/minpadding/\n * Min padding of 0.2\n * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n * Greater min- and maxPadding\n * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n * Add some padding\n *\n * @default {highcharts} 0.01\n * @default {highstock|highmaps} 0\n * @since 1.2.0\n * @product highcharts highstock gantt\n */\n minPadding: 0.01,\n /**\n * The minimum range to display on this axis. The entire axis will not\n * be allowed to span over a smaller interval than this. For example,\n * for a datetime axis the main unit is milliseconds. If minRange is\n * set to 3600000, you can't zoom in more than to one hour.\n *\n * The default minRange for the x axis is five times the smallest\n * interval between any of the data points.\n *\n * On a logarithmic axis, the unit for the minimum range is the power.\n * So a minRange of 1 means that the axis can be zoomed to 10-100,\n * 100-1000, 1000-10000 etc.\n *\n * **Note**: The `minPadding`, `maxPadding`, `startOnTick` and\n * `endOnTick` settings also affect how the extremes of the axis\n * are computed.\n *\n * @sample {highcharts} highcharts/xaxis/minrange/\n * Minimum range of 5\n * @sample {highstock} stock/xaxis/minrange/\n * Max zoom of 6 months overrides user selections\n *\n * @type {number}\n * @apioption xAxis.minRange\n */\n /**\n * The minimum tick interval allowed in axis values. For example on\n * zooming in on an axis with daily data, this can be used to prevent\n * the axis from showing hours. Defaults to the closest distance between\n * two points on the axis.\n *\n * @type {number}\n * @since 2.3.0\n * @apioption xAxis.minTickInterval\n */\n /**\n * The distance in pixels from the plot area to the axis line.\n * A positive offset moves the axis with it's line, labels and ticks\n * away from the plot area. This is typically used when two or more\n * axes are displayed on the same side of the plot. With multiple\n * axes the offset is dynamically adjusted to avoid collision, this\n * can be overridden by setting offset explicitly.\n *\n * @sample {highcharts} highcharts/yaxis/offset/\n * Y axis offset of 70\n * @sample {highcharts} highcharts/yaxis/offset-centered/\n * Axes positioned in the center of the plot\n * @sample {highstock} stock/xaxis/offset/\n * Y axis offset by 70 px\n *\n * @type {number}\n */\n offset: void 0,\n /**\n * Whether to display the axis on the opposite side of the normal. The\n * normal is on the left side for vertical axes and bottom for\n * horizontal, so the opposite sides will be right and top respectively.\n * This is typically used with dual or multiple axes.\n *\n * @sample {highcharts} highcharts/yaxis/opposite/\n * Secondary Y axis opposite\n * @sample {highstock} stock/xaxis/opposite/\n * Y axis on left side\n *\n * @default {highcharts|highstock|highmaps} false\n * @default {gantt} true\n * @type Boolean\n * @apioption xAxis.opposite\n */\n /**\n * In an ordinal axis, the points are equally spaced in the chart\n * regardless of the actual time or x distance between them. This means\n * that missing data periods (e.g. nights or weekends for a stock chart)\n * will not take up space in the chart.\n * Having `ordinal: false` will show any gaps created by the `gapSize`\n * setting proportionate to their duration.\n *\n * In stock charts the X axis is ordinal by default, unless\n * the boost module is used and at least one of the series' data length\n * exceeds the [boostThreshold](#series.line.boostThreshold).\n *\n * For an ordinal axis, `minPadding` and `maxPadding` are ignored. Use\n * [overscroll](#xAxis.overscroll) instead.\n *\n * @sample {highstock} stock/xaxis/ordinal-true/\n * True by default\n * @sample {highstock} stock/xaxis/ordinal-false/\n * False\n *\n * @see [overscroll](#xAxis.overscroll)\n *\n * @type {boolean}\n * @default true\n * @since 1.1\n * @product highstock\n * @apioption xAxis.ordinal\n */\n /**\n * Additional range on the right side of the xAxis. Works similar to\n * `xAxis.maxPadding`, but the value is set in terms of axis values,\n * percentage or pixels.\n *\n * If it's a number, it is interpreted as axis values, which in a\n * datetime axis equals milliseconds.\n *\n * If it's a percentage string, is interpreted as percentages of axis\n * length. An overscroll of 50% will make a 100px axis 50px longer.\n *\n * If it's a pixel string, it is interpreted as a fixed pixel value, but\n * limited to 90% of the axis length.\n *\n * @sample {highstock} stock/xaxis/overscroll/ One minute overscroll\n * with live data\n * @sample {highstock} stock/xaxis/overscroll-percent/ Overscroll set in\n * percentage\n * @sample {highstock} stock/xaxis/overscroll-pixel/ Overscroll set in\n * pixels\n *\n * @type {number | string}\n * @default 0\n * @since 6.0.0\n * @product highstock\n * @apioption xAxis.overscroll\n */\n /**\n * Refers to the index in the [panes](#panes) array. Used for circular\n * gauges and polar charts. When the option is not set then first pane\n * will be used.\n *\n * @sample highcharts/demo/gauge-vu-meter\n * Two gauges with different center\n *\n * @type {number}\n * @product highcharts\n * @apioption xAxis.pane\n */\n /**\n * The zoomed range to display when only defining one or none of `min`\n * or `max`. For example, to show the latest month, a range of one month\n * can be set.\n *\n * @sample {highstock} stock/xaxis/range/\n * Setting a zoomed range when the rangeSelector is disabled\n *\n * @type {number}\n * @product highstock\n * @apioption xAxis.range\n */\n /**\n * Whether to reverse the axis so that the highest number is closest\n * to the origin. If the chart is inverted, the x axis is reversed by\n * default.\n *\n * @sample {highcharts} highcharts/yaxis/reversed/\n * Reversed Y axis\n * @sample {highstock} stock/xaxis/reversed/\n * Reversed Y axis\n *\n * @type {boolean}\n * @default undefined\n * @apioption xAxis.reversed\n */\n reversed: void 0,\n /**\n * This option determines how stacks should be ordered within a group.\n * For example reversed xAxis also reverses stacks, so first series\n * comes last in a group. To keep order like for non-reversed xAxis\n * enable this option.\n *\n * @sample {highcharts} highcharts/xaxis/reversedstacks/\n * Reversed stacks comparison\n * @sample {highstock} highcharts/xaxis/reversedstacks/\n * Reversed stacks comparison\n *\n * @since 6.1.1\n * @product highcharts highstock\n */\n reversedStacks: false,\n /**\n * An optional scrollbar to display on the X axis in response to\n * limiting the minimum and maximum of the axis values.\n *\n * In styled mode, all the presentational options for the scrollbar are\n * replaced by the classes `.highcharts-scrollbar-thumb`,\n * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n *\n * @sample {highstock} stock/yaxis/heatmap-scrollbars/\n * Heatmap with both scrollbars\n *\n * @extends scrollbar\n * @since 4.2.6\n * @product highstock\n * @apioption xAxis.scrollbar\n */\n /**\n * Whether to show the axis line and title when the axis has no data.\n *\n * @sample {highcharts} highcharts/yaxis/showempty/\n * When clicking the legend to hide series, one axis preserves\n * line and title, the other doesn't\n * @sample {highstock} highcharts/yaxis/showempty/\n * When clicking the legend to hide series, one axis preserves\n * line and title, the other doesn't\n *\n * @since 1.1\n */\n showEmpty: true,\n /**\n * Whether to show the first tick label.\n *\n * @sample {highcharts} highcharts/xaxis/showfirstlabel-false/\n * Set to false on X axis\n * @sample {highstock} stock/xaxis/showfirstlabel/\n * Labels below plot lines on Y axis\n */\n showFirstLabel: true,\n /**\n * Whether to show the last tick label. Defaults to `true` on cartesian\n * charts, and `false` on polar charts.\n *\n * @sample {highcharts} highcharts/xaxis/showlastlabel-true/\n * Set to true on X axis\n * @sample {highstock} stock/xaxis/showfirstlabel/\n * Labels below plot lines on Y axis\n *\n * @type {boolean}\n * @default undefined\n * @product highcharts highstock gantt\n */\n showLastLabel: true,\n /**\n * A soft maximum for the axis. If the series data maximum is less than\n * this, the axis will stay at this maximum, but if the series data\n * maximum is higher, the axis will flex to show all data.\n *\n * @sample highcharts/yaxis/softmin-softmax/\n * Soft min and max\n *\n * @type {number}\n * @since 5.0.1\n * @product highcharts highstock gantt\n * @apioption xAxis.softMax\n */\n /**\n * A soft minimum for the axis. If the series data minimum is greater\n * than this, the axis will stay at this minimum, but if the series\n * data minimum is lower, the axis will flex to show all data.\n *\n * @sample highcharts/yaxis/softmin-softmax/\n * Soft min and max\n *\n * @type {number}\n * @since 5.0.1\n * @product highcharts highstock gantt\n * @apioption xAxis.softMin\n */\n /**\n * For datetime axes, this decides where to put the tick between weeks.\n * 0 = Sunday, 1 = Monday.\n *\n * @sample {highcharts} highcharts/xaxis/startofweek-monday/\n * Monday by default\n * @sample {highcharts} highcharts/xaxis/startofweek-sunday/\n * Sunday\n * @sample {highstock} stock/xaxis/startofweek-1\n * Monday by default\n * @sample {highstock} stock/xaxis/startofweek-0\n * Sunday\n *\n * @product highcharts highstock gantt\n */\n startOfWeek: 1,\n /**\n * Whether to force the axis to start on a tick. Use this option with\n * the `minPadding` option to control the axis start.\n *\n * @productdesc {highstock}\n * In Highcharts Stock, `startOnTick` is always `false` when\n * the navigator is enabled, to prevent jumpy scrolling.\n *\n * @sample {highcharts} highcharts/xaxis/startontick-false/\n * False by default\n * @sample {highcharts} highcharts/xaxis/startontick-true/\n * True\n *\n * @since 1.2.0\n */\n startOnTick: false,\n /**\n * The amount of ticks to draw on the axis. This opens up for aligning\n * the ticks of multiple charts or panes within a chart. This option\n * overrides the `tickPixelInterval` option.\n *\n * This option only has an effect on linear axes. Datetime, logarithmic\n * or category axes are not affected.\n *\n * @sample {highcharts} highcharts/yaxis/tickamount/\n * 8 ticks on Y axis\n * @sample {highstock} highcharts/yaxis/tickamount/\n * 8 ticks on Y axis\n *\n * @type {number}\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @apioption xAxis.tickAmount\n */\n /**\n * The interval of the tick marks in axis units. When `undefined`, the\n * tick interval is computed to approximately follow the\n * [tickPixelInterval](#xAxis.tickPixelInterval) on linear and datetime\n * axes. On categorized axes, a `undefined` tickInterval will default to\n * 1, one category. Note that datetime axes are based on milliseconds,\n * so for example an interval of one day is expressed as\n * `24 * 3600 * 1000`.\n *\n * On logarithmic axes, the tickInterval is based on powers, so a\n * tickInterval of 1 means one tick on each of 0.1, 1, 10, 100 etc. A\n * tickInterval of 2 means a tick of 0.1, 10, 1000 etc. A tickInterval\n * of 0.2 puts a tick on 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10, 20,\n * 40 etc.\n *\n *\n * If the tickInterval is too dense for labels to be drawn, Highcharts\n * may remove ticks.\n *\n * If the chart has multiple axes, the [alignTicks](#chart.alignTicks)\n * option may interfere with the `tickInterval` setting.\n *\n * @see [tickPixelInterval](#xAxis.tickPixelInterval)\n * @see [tickPositions](#xAxis.tickPositions)\n * @see [tickPositioner](#xAxis.tickPositioner)\n *\n * @sample {highcharts} highcharts/xaxis/tickinterval-5/\n * Tick interval of 5 on a linear axis\n * @sample {highstock} stock/xaxis/tickinterval/\n * Tick interval of 0.01 on Y axis\n *\n * @type {number}\n * @apioption xAxis.tickInterval\n */\n /**\n * The pixel length of the main tick marks.\n *\n * @sample {highcharts} highcharts/xaxis/ticklength/\n * 20 px tick length on the X axis\n * @sample {highstock} stock/xaxis/ticks/\n * Formatted ticks on X axis\n */\n tickLength: 10,\n /**\n * If tickInterval is `null` this option sets the approximate pixel\n * interval of the tick marks. Not applicable to categorized axis.\n *\n * The tick interval is also influenced by the [minTickInterval](\n * #xAxis.minTickInterval) option, that, by default prevents ticks from\n * being denser than the data points.\n *\n * @see [tickInterval](#xAxis.tickInterval)\n * @see [tickPositioner](#xAxis.tickPositioner)\n * @see [tickPositions](#xAxis.tickPositions)\n *\n * @sample {highcharts} highcharts/xaxis/tickpixelinterval-50/\n * 50 px on X axis\n * @sample {highstock} stock/xaxis/tickpixelinterval/\n * 200 px on X axis\n */\n tickPixelInterval: 100,\n /**\n * For categorized axes only. If `on` the tick mark is placed in the\n * center of the category, if `between` the tick mark is placed between\n * categories. The default is `between` if the `tickInterval` is 1, else\n * `on`. In order to render tick marks on a category axis it is necessary\n * to provide a [tickWidth](#xAxis.tickWidth).\n *\n * @sample {highcharts} highcharts/xaxis/tickmarkplacement-between/\n * \"between\" by default\n * @sample {highcharts} highcharts/xaxis/tickmarkplacement-on/\n * \"on\"\n *\n * @product highcharts gantt\n * @validvalue [\"on\", \"between\"]\n */\n tickmarkPlacement: 'between',\n /**\n * The position of the major tick marks relative to the axis line.\n * Can be one of `inside` and `outside`.\n *\n * @sample {highcharts} highcharts/xaxis/tickposition-outside/\n * \"outside\" by default\n * @sample {highcharts} highcharts/xaxis/tickposition-inside/\n * \"inside\"\n * @sample {highstock} stock/xaxis/ticks/\n * Formatted ticks on X axis\n *\n * @validvalue [\"inside\", \"outside\"]\n */\n tickPosition: 'outside',\n /**\n * A callback function returning array defining where the ticks are\n * laid out on the axis. This overrides the default behaviour of\n * [tickPixelInterval](#xAxis.tickPixelInterval) and [tickInterval](\n * #xAxis.tickInterval). The automatic tick positions are accessible\n * through `this.tickPositions` and can be modified by the callback.\n *\n * @see [tickPositions](#xAxis.tickPositions)\n *\n * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n * Demo of tickPositions and tickPositioner\n * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n * Demo of tickPositions and tickPositioner\n *\n * @type {Highcharts.AxisTickPositionerCallbackFunction}\n * @apioption xAxis.tickPositioner\n */\n /**\n * An array defining where the ticks are laid out on the axis. This\n * overrides the default behaviour of [tickPixelInterval](\n * #xAxis.tickPixelInterval) and [tickInterval](#xAxis.tickInterval).\n *\n * @see [tickPositioner](#xAxis.tickPositioner)\n *\n * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n * Demo of tickPositions and tickPositioner\n * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n * Demo of tickPositions and tickPositioner\n *\n * @type {Array}\n * @apioption xAxis.tickPositions\n */\n /**\n * The pixel width of the major tick marks. Defaults to 0 on category\n * axes, otherwise 1.\n *\n * In styled mode, the stroke width is given in the `.highcharts-tick`\n * class, but in order for the element to be generated on category axes,\n * the option must be explicitly set to 1.\n *\n * @sample {highcharts} highcharts/xaxis/tickwidth/\n * 10 px width\n * @sample {highcharts} highcharts/css/axis-grid/\n * Styled mode\n * @sample {highstock} stock/xaxis/ticks/\n * Formatted ticks on X axis\n * @sample {highstock} highcharts/css/axis-grid/\n * Styled mode\n *\n * @type {undefined|number}\n * @default {highstock} 1\n * @default {highmaps} 0\n * @apioption xAxis.tickWidth\n */\n /**\n * The axis title, showing next to the axis line.\n *\n * @productdesc {highmaps}\n * In Highmaps, the axis is hidden by default, but adding an axis title\n * is still possible. X axis and Y axis titles will appear at the bottom\n * and left by default.\n */\n title: {\n /**\n * Alignment of the title relative to the axis values. Possible\n * values are \"low\", \"middle\" or \"high\".\n *\n * @sample {highcharts} highcharts/xaxis/title-align-low/\n * \"low\"\n * @sample {highcharts} highcharts/xaxis/title-align-center/\n * \"middle\" by default\n * @sample {highcharts} highcharts/xaxis/title-align-high/\n * \"high\"\n * @sample {highcharts} highcharts/yaxis/title-offset/\n * Place the Y axis title on top of the axis\n * @sample {highstock} stock/xaxis/title-align/\n * Aligned to \"high\" value\n *\n * @type {Highcharts.AxisTitleAlignValue}\n */\n align: 'middle',\n /**\n * Deprecated. Set the `text` to `undefined` to disable the title.\n *\n * @deprecated\n * @type {boolean}\n * @product highcharts\n * @apioption xAxis.title.enabled\n */\n /**\n * The pixel distance between the axis labels or line and the title.\n * Defaults to 0 for horizontal axes, 10 for vertical\n *\n * @sample {highcharts} highcharts/xaxis/title-margin/\n * Y axis title margin of 60\n *\n * @type {number}\n * @apioption xAxis.title.margin\n */\n /**\n * The distance of the axis title from the axis line. By default,\n * this distance is computed from the offset width of the labels,\n * the labels' distance from the axis and the title's margin.\n * However when the offset option is set, it overrides all this.\n *\n * @sample {highcharts} highcharts/yaxis/title-offset/\n * Place the axis title on top of the axis\n * @sample {highstock} highcharts/yaxis/title-offset/\n * Place the axis title on top of the Y axis\n *\n * @type {number}\n * @since 2.2.0\n * @apioption xAxis.title.offset\n */\n /**\n * Whether to reserve space for the title when laying out the axis.\n *\n * @type {boolean}\n * @default true\n * @since 5.0.11\n * @product highcharts highstock gantt\n * @apioption xAxis.title.reserveSpace\n */\n /**\n * The rotation of the text in degrees. 0 is horizontal, 270 is\n * vertical reading from bottom to top. Defaults to 0 for horizontal\n * axes, 270 for left-side axes and 90 for right-side axes.\n *\n * @sample {highcharts} highcharts/yaxis/title-offset/\n * Horizontal\n *\n * @type {number}\n * @default undefined\n * @apioption xAxis.title.rotation\n */\n /**\n * The actual text of the axis title. It can contain basic HTML tags\n * like `b`, `i` and `span` with style.\n *\n * @sample {highcharts} highcharts/xaxis/title-text/\n * Custom HTML\n * @sample {highstock} stock/xaxis/title-text/\n * Titles for both axes\n *\n * @type {string|null}\n * @apioption xAxis.title.text\n */\n /**\n * Alignment of the text, can be `\"left\"`, `\"right\"` or `\"center\"`.\n * Default alignment depends on the\n * [title.align](xAxis.title.align):\n *\n * Horizontal axes:\n * - for `align` = `\"low\"`, `textAlign` is set to `left`\n * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n * - for `align` = `\"high\"`, `textAlign` is set to `right`\n *\n * Vertical axes:\n * - for `align` = `\"low\"` and `opposite` = `true`, `textAlign` is\n * set to `right`\n * - for `align` = `\"low\"` and `opposite` = `false`, `textAlign` is\n * set to `left`\n * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n * - for `align` = `\"high\"` and `opposite` = `true` `textAlign` is\n * set to `left`\n * - for `align` = `\"high\"` and `opposite` = `false` `textAlign` is\n * set to `right`\n *\n * @type {Highcharts.AlignValue}\n * @apioption xAxis.title.textAlign\n */\n /**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the axis title.\n *\n * @product highcharts highstock gantt\n */\n useHTML: false,\n /**\n * Horizontal pixel offset of the title position.\n *\n * @since 4.1.6\n * @product highcharts highstock gantt\n */\n x: 0,\n /**\n * Vertical pixel offset of the title position.\n *\n * @product highcharts highstock gantt\n */\n y: 0,\n /**\n * CSS styles for the title. If the title text is longer than the\n * axis length, it will wrap to multiple lines by default. This can\n * be customized by setting the `lineClamp` property, by setting a\n * specific `width` or by setting `whiteSpace: 'nowrap'`.\n *\n * In styled mode, the stroke width is given in the\n * `.highcharts-axis-title` class.\n *\n * @sample {highcharts} highcharts/xaxis/title-style/\n * Red\n * @sample {highcharts} highcharts/css/axis/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n */\n style: {\n /** @internal */\n color: \"#666666\" /* Palette.neutralColor60 */,\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n }\n },\n /**\n * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`\n * or `category`. In a datetime axis, the numbers are given in\n * milliseconds, and tick marks are placed on appropriate values like\n * full hours or days. In a category axis, the\n * [point names](#series.line.data.name) of the chart's series are used\n * for categories, if not a [categories](#xAxis.categories) array is\n * defined.\n *\n * @sample {highcharts} highcharts/xaxis/type-linear/\n * Linear\n * @sample {highcharts} highcharts/yaxis/type-log/\n * Logarithmic\n * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n * Logarithmic with minor grid lines\n * @sample {highcharts} highcharts/xaxis/type-log-both/\n * Logarithmic on two axes\n * @sample {highcharts} highcharts/yaxis/type-log-negative/\n * Logarithmic with extension to emulate negative values\n *\n * @type {Highcharts.AxisTypeValue}\n * @default linear\n * @product highcharts gantt\n * @apioption xAxis.type\n */\n /**\n * If there are multiple axes on the same side of the chart, the pixel\n * margin between the axes. Defaults to 0 on vertical axes, 15 on\n * horizontal axes.\n *\n * @type {number}\n * @since 7.0.3\n * @apioption xAxis.margin\n */\n /**\n * Applies only when the axis `type` is `category`. When `uniqueNames`\n * is true, points are placed on the X axis according to their names.\n * If the same point name is repeated in the same or another series,\n * the point is placed on the same X position as other points of the\n * same name. When `uniqueNames` is false, the points are laid out in\n * increasing X positions regardless of their names, and the X axis\n * category will take the name of the last point in each position.\n *\n * @sample {highcharts} highcharts/xaxis/uniquenames-true/\n * True by default\n * @sample {highcharts} highcharts/xaxis/uniquenames-false/\n * False\n *\n * @since 4.2.7\n * @product highcharts gantt\n * @type {boolean}\n * @default true\n * @apioption xAxis.uniqueNames\n */\n /**\n * Datetime axis only. An array determining what time intervals the\n * ticks are allowed to fall on. Each array item is an array where the\n * first value is the time unit and the second value another array of\n * allowed multiples.\n *\n * Defaults to:\n * ```js\n * units: [[\n * 'millisecond', // unit name\n * [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n * ], [\n * 'second',\n * [1, 2, 5, 10, 15, 30]\n * ], [\n * 'minute',\n * [1, 2, 5, 10, 15, 30]\n * ], [\n * 'hour',\n * [1, 2, 3, 4, 6, 8, 12]\n * ], [\n * 'day',\n * [1, 2]\n * ], [\n * 'week',\n * [1, 2]\n * ], [\n * 'month',\n * [1, 2, 3, 4, 6]\n * ], [\n * 'year',\n * null\n * ]]\n * ```\n *\n * @sample {highcharts} highcharts/xaxis/units/\n * Axis units demonstrated\n *\n * @type {Array|null)>>}\n * @product highcharts highstock gantt\n * @apioption xAxis.units\n */\n /**\n * Whether axis, including axis title, line, ticks and labels, should\n * be visible.\n *\n * @since 4.1.9\n * @product highcharts highstock gantt\n */\n visible: true,\n /**\n * Color of the minor, secondary grid lines.\n *\n * In styled mode, the stroke width is given in the\n * `.highcharts-minor-grid-line` class.\n *\n * @sample {highcharts} highcharts/yaxis/minorgridlinecolor/\n * Bright grey lines from Y axis\n * @sample {highcharts|highstock} highcharts/css/axis-grid/\n * Styled mode\n * @sample {highstock} stock/xaxis/minorgridlinecolor/\n * Bright grey lines from Y axis\n *\n * @type {Highcharts.ColorType}\n * @default #f2f2f2\n */\n minorGridLineColor: \"#f2f2f2\" /* Palette.neutralColor5 */,\n /**\n * Width of the minor, secondary grid lines.\n *\n * In styled mode, the stroke width is given in the\n * `.highcharts-grid-line` class.\n *\n * @sample {highcharts} highcharts/yaxis/minorgridlinewidth/\n * 2px lines from Y axis\n * @sample {highcharts|highstock} highcharts/css/axis-grid/\n * Styled mode\n * @sample {highstock} stock/xaxis/minorgridlinewidth/\n * 2px lines from Y axis\n */\n minorGridLineWidth: 1,\n /**\n * Color for the minor tick marks.\n *\n * @sample {highcharts} highcharts/yaxis/minortickcolor/\n * Black tick marks on Y axis\n * @sample {highstock} stock/xaxis/minorticks/\n * Black tick marks on Y axis\n *\n * @type {Highcharts.ColorType}\n * @default #999999\n */\n minorTickColor: \"#999999\" /* Palette.neutralColor40 */,\n /**\n * The color of the line marking the axis itself.\n *\n * In styled mode, the line stroke is given in the\n * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n *\n * @sample {highcharts} highcharts/yaxis/linecolor/\n * A red line on Y axis\n * @sample {highcharts|highstock} highcharts/css/axis/\n * Axes in styled mode\n * @sample {highstock} stock/xaxis/linecolor/\n * A red line on X axis\n *\n * @type {Highcharts.ColorType}\n */\n lineColor: \"#333333\" /* Palette.neutralColor80 */,\n /**\n * The width of the line marking the axis itself.\n *\n * In styled mode, the stroke width is given in the\n * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n *\n * @sample {highcharts} highcharts/yaxis/linecolor/\n * A 1px line on Y axis\n * @sample {highcharts|highstock} highcharts/css/axis/\n * Axes in styled mode\n * @sample {highstock} stock/xaxis/linewidth/\n * A 2px line on X axis\n *\n * @default {highcharts|highstock} 1\n * @default {highmaps} 0\n */\n lineWidth: 1,\n /**\n * Color of the grid lines extending the ticks across the plot area.\n *\n * In styled mode, the stroke is given in the `.highcharts-grid-line`\n * class.\n *\n * @productdesc {highmaps}\n * In Highmaps, the grid lines are hidden by default.\n *\n * @sample {highcharts} highcharts/yaxis/gridlinecolor/\n * Green lines\n * @sample {highcharts|highstock} highcharts/css/axis-grid/\n * Styled mode\n * @sample {highstock} stock/xaxis/gridlinecolor/\n * Green lines\n *\n * @type {Highcharts.ColorType}\n * @default #e6e6e6\n */\n gridLineColor: \"#e6e6e6\" /* Palette.neutralColor10 */,\n /**\n * The width of the grid lines extending the ticks across the plot area.\n * Defaults to 1 on the Y axis and 0 on the X axis, except for 3d\n * charts.\n *\n * In styled mode, the stroke width is given in the\n * `.highcharts-grid-line` class.\n *\n * @sample {highcharts} highcharts/yaxis/gridlinewidth/\n * 2px lines\n * @sample {highcharts|highstock} highcharts/css/axis-grid/\n * Styled mode\n * @sample {highstock} stock/xaxis/gridlinewidth/\n * 2px lines\n *\n * @type {number}\n * @apioption xAxis.gridLineWidth\n */\n gridLineWidth: void 0,\n /**\n * The height as the vertical axis. If it's a number, it is\n * interpreted as pixels.\n *\n * Since Highcharts 2: If it's a percentage string, it is interpreted\n * as percentages of the total plot height.\n *\n * @sample {highcharts} highcharts/xaxis/axis-position-properties\n * Different axis position properties\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption xAxis.height\n */\n /**\n * The width as the horizontal axis. If it's a number, it is interpreted\n * as pixels.\n *\n * Since Highcharts v5.0.13: If it's a percentage string, it is\n * interpreted as percentages of the total plot width.\n *\n * @sample {highcharts} highcharts/xaxis/axis-position-properties\n * Different axis position properties\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption xAxis.width\n */\n /**\n * Color for the main tick marks.\n *\n * In styled mode, the stroke is given in the `.highcharts-tick`\n * class.\n *\n * @sample {highcharts} highcharts/xaxis/tickcolor/\n * Red ticks on X axis\n * @sample {highcharts|highstock} highcharts/css/axis-grid/\n * Styled mode\n * @sample {highstock} stock/xaxis/ticks/\n * Formatted ticks on X axis\n *\n * @type {Highcharts.ColorType}\n */\n tickColor: \"#333333\" /* Palette.neutralColor80 */\n // `tickWidth: 1`\n };\n /**\n * The Z axis or depth axis for 3D plots.\n *\n * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n * access to the axis.\n *\n * @sample {highcharts} highcharts/3d/scatter-zaxis-categories/\n * Z-Axis with Categories\n * @sample {highcharts} highcharts/3d/scatter-zaxis-grid/\n * Z-Axis with styling\n *\n * @type {*|Array<*>}\n * @extends xAxis\n * @since 5.0.0\n * @product highcharts\n * @excluding breaks, crosshair, height, left, lineColor, lineWidth,\n * nameToX, showEmpty, top, width\n * @apioption zAxis\n */\n /**\n * The Y axis or value axis. Normally this is the vertical axis,\n * though if the chart is inverted this is the horizontal axis.\n * In case of multiple axes, the yAxis node is an array of\n * configuration objects.\n *\n * See [the Axis object](/class-reference/Highcharts.Axis) for programmatic\n * access to the axis.\n *\n * @type {*|Array<*>}\n * @extends xAxis\n * @excluding currentDateIndicator,ordinal,overscroll\n * @optionparent yAxis\n */\n AxisDefaults.yAxis = {\n /**\n * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`,\n * `category` or `treegrid`. Defaults to `treegrid` for Gantt charts,\n * `linear` for other chart types.\n *\n * In a datetime axis, the numbers are given in milliseconds, and tick\n * marks are placed on appropriate values, like full hours or days. In a\n * category or treegrid axis, the [point names](#series.line.data.name)\n * of the chart's series are used for categories, if a\n * [categories](#xAxis.categories) array is not defined.\n *\n * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n * Logarithmic with minor grid lines\n * @sample {highcharts} highcharts/yaxis/type-log-negative/\n * Logarithmic with extension to emulate negative values\n * @sample {gantt} gantt/treegrid-axis/demo\n * Treegrid axis\n *\n * @type {Highcharts.AxisTypeValue}\n * @default {highcharts} linear\n * @default {gantt} treegrid\n * @product highcharts gantt\n * @apioption yAxis.type\n */\n /**\n * The height of the Y axis. If it's a number, it is interpreted as\n * pixels.\n *\n * Since Highcharts 2: If it's a percentage string, it is interpreted as\n * percentages of the total plot height.\n *\n * @see [yAxis.top](#yAxis.top)\n *\n * @sample {highstock} stock/demo/candlestick-and-volume/\n * Percentage height panes\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption yAxis.height\n */\n /**\n * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n * to represent the maximum value of the Y axis.\n *\n * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n * Min and max colors\n *\n * @type {Highcharts.ColorType}\n * @default #003399\n * @since 4.0\n * @product highcharts\n * @apioption yAxis.maxColor\n */\n /**\n * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n * to represent the minimum value of the Y axis.\n *\n * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n * Min and max color\n *\n * @type {Highcharts.ColorType}\n * @default #e6ebf5\n * @since 4.0\n * @product highcharts\n * @apioption yAxis.minColor\n */\n /**\n * Whether to reverse the axis so that the highest number is closest\n * to the origin.\n *\n * @sample {highcharts} highcharts/yaxis/reversed/\n * Reversed Y axis\n * @sample {highstock} stock/xaxis/reversed/\n * Reversed Y axis\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock} false\n * @default {highmaps} true\n * @default {gantt} true\n * @apioption yAxis.reversed\n */\n /**\n * If `true`, the first series in a stack will be drawn on top in a\n * positive, non-reversed Y axis. If `false`, the first series is in\n * the base of the stack.\n *\n * @sample {highcharts} highcharts/yaxis/reversedstacks-false/\n * Non-reversed stacks\n * @sample {highstock} highcharts/yaxis/reversedstacks-false/\n * Non-reversed stacks\n *\n * @type {boolean}\n * @default true\n * @since 3.0.10\n * @product highcharts highstock\n * @apioption yAxis.reversedStacks\n */\n reversedStacks: true,\n /**\n * Solid gauge series only. Color stops for the solid gauge. Use this\n * in cases where a linear gradient between a `minColor` and `maxColor`\n * is not sufficient. The stops is an array of tuples, where the first\n * item is a float between 0 and 1 assigning the relative position in\n * the gradient, and the second item is the color.\n *\n * For solid gauges, the Y axis also inherits the concept of\n * [data classes](https://api.highcharts.com/highmaps#colorAxis.dataClasses)\n * from the Highmaps color axis.\n *\n * @sample {highcharts} highcharts/demo/gauge-solid/\n * Gauge with stops\n *\n * @see [minColor](#yAxis.minColor)\n * @see [maxColor](#yAxis.maxColor)\n *\n * @type {Array>}\n * @since 4.0\n * @product highcharts\n * @apioption yAxis.stops\n */\n /**\n * The pixel width of the major tick marks.\n *\n * @sample {highcharts} highcharts/xaxis/tickwidth/ 10 px width\n * @sample {highstock} stock/xaxis/ticks/ Formatted ticks on X axis\n *\n * @type {number}\n * @default 0\n * @product highcharts highstock gantt\n * @apioption yAxis.tickWidth\n */\n /**\n * Whether to force the axis to end on a tick. Use this option with\n * the `maxPadding` option to control the axis end.\n *\n * This option is always disabled, when panning type is\n * either `y` or `xy`.\n *\n * @see [type](#chart.panning.type)\n *\n *\n * @sample {highcharts} highcharts/yaxis/endontick/\n * True by default\n * @sample {highcharts} highcharts/yaxis/endontick-false/\n * False\n * @sample {highstock} stock/demo/basic-line/\n * True by default\n * @sample {highstock} stock/xaxis/endontick/\n * False for Y axis\n *\n * @since 1.2.0\n */\n endOnTick: true,\n /**\n * Padding of the max value relative to the length of the axis. A\n * padding of 0.05 will make a 100px axis 5px longer. This is useful\n * when you don't want the highest data value to appear on the edge\n * of the plot area. When the axis' `max` option is set or a max extreme\n * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n *\n * Also the `softThreshold` option takes precedence over `maxPadding`,\n * so if the data is tangent to the threshold, `maxPadding` may not\n * apply unless `softThreshold` is set to false.\n *\n * @sample {highcharts} highcharts/yaxis/maxpadding-02/\n * Max padding of 0.2\n * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n * Greater min- and maxPadding\n *\n * @since 1.2.0\n * @product highcharts highstock gantt\n */\n maxPadding: 0.05,\n /**\n * Padding of the min value relative to the length of the axis. A\n * padding of 0.05 will make a 100px axis 5px longer. This is useful\n * when you don't want the lowest data value to appear on the edge\n * of the plot area. When the axis' `min` option is set or a max extreme\n * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n *\n * Also the `softThreshold` option takes precedence over `minPadding`,\n * so if the data is tangent to the threshold, `minPadding` may not\n * apply unless `softThreshold` is set to false.\n *\n * @sample {highcharts} highcharts/yaxis/minpadding/\n * Min padding of 0.2\n * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n * Greater min- and maxPadding\n *\n * @since 1.2.0\n * @product highcharts highstock gantt\n */\n minPadding: 0.05,\n /**\n * @productdesc {highstock}\n * In Highcharts Stock 1.x, the Y axis was placed\n * on the left side by default.\n *\n * @sample {highcharts} highcharts/yaxis/opposite/\n * Secondary Y axis opposite\n * @sample {highstock} stock/xaxis/opposite/\n * Y axis on left side\n *\n * @type {boolean}\n * @default {highstock} true\n * @default {highcharts} false\n * @product highstock highcharts gantt\n * @apioption yAxis.opposite\n */\n /**\n * @see [tickInterval](#xAxis.tickInterval)\n * @see [tickPositioner](#xAxis.tickPositioner)\n * @see [tickPositions](#xAxis.tickPositions)\n */\n tickPixelInterval: 72,\n /**\n * Whether to show the last tick label.\n *\n * @productdesc {highcharts|gantt}\n * Defaults to `true` on cartesian charts, and `false` on polar charts.\n *\n * @productdesc {highstock}\n * Defaults to `true` for categorized yAxis and `false` for other types\n * of yAxis.\n *\n * @default undefined\n */\n showLastLabel: true,\n /**\n * @extends xAxis.labels\n */\n labels: {\n /**\n * The label's pixel distance from the perimeter of the plot area.\n * On cartesian charts, this is overridden if the `labels.y` setting\n * is set.\n *\n * On polar charts, if it's a percentage string, it is interpreted\n * the same as [series.radius](#plotOptions.gauge.radius), so the\n * label can be aligned under the gauge's shape.\n *\n * @sample {highcharts} highcharts/yaxis/labels-distance/\n * Polar chart, labels centered under the arc\n *\n * @type {number|string}\n * @product highcharts\n * @apioption yAxis.labels.distance\n */\n /**\n * The y position offset of all labels relative to the tick\n * positions on the axis. For polar and radial axis consider the use\n * of the [distance](#yAxis.labels.distance) option.\n *\n * @sample {highcharts} highcharts/xaxis/labels-x/\n * Y axis labels placed on grid lines\n *\n * @type {number}\n * @default {highcharts} 3\n * @default {highstock} -2\n * @default {highmaps} 3\n * @apioption yAxis.labels.y\n */\n /**\n * What part of the string the given position is anchored to. Can\n * be one of `\"left\"`, `\"center\"` or `\"right\"`. The exact position\n * also depends on the `labels.x` setting.\n *\n * Angular gauges and solid gauges defaults to `\"center\"`.\n * Solid gauges with two labels have additional option `\"auto\"`\n * for automatic horizontal and vertical alignment.\n *\n * @sample {highcharts} highcharts/yaxis/labels-align-left/\n * Left\n * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n * Solid gauge labels auto aligned\n *\n * @type {Highcharts.AlignValue}\n * @default {highstock} right\n * @apioption yAxis.labels.align\n */\n /**\n * The x position offset of all labels relative to the tick\n * positions on the axis. Defaults to -15 for left axis, 15 for\n * right axis.\n *\n * @sample {highcharts} highcharts/xaxis/labels-x/\n * Y axis labels placed on grid lines\n *\n * @type {number}\n */\n x: void 0\n },\n /**\n * @sample {highcharts} highcharts/yaxis/max-200/\n * Y axis max of 200\n * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n * Y axis max on logarithmic axis\n * @sample {highstock} stock/yaxis/min-max/\n * Fixed min and max on Y axis\n *\n * @apioption yAxis.max\n */\n /**\n * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n * -50 with startOnTick to false\n * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n * -50 with startOnTick true by default\n * @sample {highstock} stock/yaxis/min-max/\n * Fixed min and max on Y axis\n *\n * @apioption yAxis.min\n */\n /**\n * An optional scrollbar to display on the Y axis in response to\n * limiting the minimum an maximum of the axis values.\n *\n * In styled mode, all the presentational options for the scrollbar\n * are replaced by the classes `.highcharts-scrollbar-thumb`,\n * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n *\n * @sample {highstock} stock/yaxis/scrollbar/\n * Scrollbar on the Y axis\n *\n * @extends scrollbar\n * @since 4.2.6\n * @product highstock\n * @excluding height\n * @apioption yAxis.scrollbar\n */\n /**\n * Enable the scrollbar on the Y axis.\n *\n * @sample {highstock} stock/yaxis/scrollbar/\n * Enabled on Y axis\n *\n * @type {boolean}\n * @default false\n * @since 4.2.6\n * @product highstock\n * @apioption yAxis.scrollbar.enabled\n */\n /**\n * Pixel margin between the scrollbar and the axis elements.\n *\n * @type {number}\n * @default 10\n * @since 4.2.6\n * @product highstock\n * @apioption yAxis.scrollbar.margin\n */\n /* eslint-disable highcharts/doclet-apioption-last */\n /**\n * Defines the position of the scrollbar. By default, it is positioned\n * on the opposite of the main axis (right side of the chart).\n * However, in the case of RTL languages could be set to `false`\n * which positions the scrollbar on the left.\n *\n * Works only for vertical axes.\n * This means yAxis in a non-inverted chart and xAxis in the inverted.\n *\n * @sample stock/yaxis/scrollbar-opposite/\n * A scrollbar not on the opposite side\n *\n * @type {boolean}\n * @default true\n * @since 9.3.0\n *\n * @apioption yAxis.scrollbar.opposite\n * @apioption xAxis.scrollbar.opposite\n *\n */\n /* eslint-enable highcharts/doclet-apioption-last */\n /**\n * Whether to show the scrollbar when it is fully zoomed out at max\n * range. Setting it to `false` on the Y axis makes the scrollbar stay\n * hidden until the user zooms in, like common in browsers.\n *\n * @type {boolean}\n * @default true\n * @since 4.2.6\n * @product highstock\n * @apioption yAxis.scrollbar.showFull\n */\n /**\n * The width of a vertical scrollbar or height of a horizontal\n * scrollbar. Defaults to 20 on touch devices.\n *\n * @type {number}\n * @default 14\n * @since 4.2.6\n * @product highstock\n * @apioption yAxis.scrollbar.size\n */\n /**\n * Z index of the scrollbar elements.\n *\n * @type {number}\n * @default 3\n * @since 4.2.6\n * @product highstock\n * @apioption yAxis.scrollbar.zIndex\n */\n /**\n * A soft maximum for the axis. If the series data maximum is less\n * than this, the axis will stay at this maximum, but if the series\n * data maximum is higher, the axis will flex to show all data.\n *\n * **Note**: The [series.softThreshold](\n * #plotOptions.series.softThreshold) option takes precedence over this\n * option.\n *\n * @sample highcharts/yaxis/softmin-softmax/\n * Soft min and max\n *\n * @type {number}\n * @since 5.0.1\n * @product highcharts highstock gantt\n * @apioption yAxis.softMax\n */\n /**\n * A soft minimum for the axis. If the series data minimum is greater\n * than this, the axis will stay at this minimum, but if the series\n * data minimum is lower, the axis will flex to show all data.\n *\n * **Note**: The [series.softThreshold](\n * #plotOptions.series.softThreshold) option takes precedence over this\n * option.\n *\n * @sample highcharts/yaxis/softmin-softmax/\n * Soft min and max\n *\n * @type {number}\n * @since 5.0.1\n * @product highcharts highstock gantt\n * @apioption yAxis.softMin\n */\n /**\n * Defines the horizontal alignment of the stack total label. Can be one\n * of `\"left\"`, `\"center\"` or `\"right\"`. The default value is calculated\n * at runtime and depends on orientation and whether the stack is\n * positive or negative.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-align-left/\n * Aligned to the left\n * @sample {highcharts} highcharts/yaxis/stacklabels-align-center/\n * Aligned in center\n * @sample {highcharts} highcharts/yaxis/stacklabels-align-right/\n * Aligned to the right\n *\n * @type {Highcharts.AlignValue}\n * @since 2.1.5\n * @product highcharts\n * @apioption yAxis.stackLabels.align\n */\n /**\n * A format string for the data label. Available variables are the same\n * as for `formatter`.\n *\n * @type {string}\n * @default {total}\n * @since 3.0.2\n * @product highcharts highstock\n * @apioption yAxis.stackLabels.format\n */\n /**\n * Rotation of the labels in degrees.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-rotation/\n * Labels rotated 45°\n *\n * @type {number}\n * @default 0\n * @since 2.1.5\n * @product highcharts\n * @apioption yAxis.stackLabels.rotation\n */\n /**\n * The text alignment for the label. While `align` determines where the\n * texts anchor point is placed with regards to the stack, `textAlign`\n * determines how the text is aligned against its anchor point. Possible\n * values are `\"left\"`, `\"center\"` and `\"right\"`. The default value is\n * calculated at runtime and depends on orientation and whether the\n * stack is positive or negative.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-textalign-left/\n * Label in center position but text-aligned left\n *\n * @type {Highcharts.AlignValue}\n * @since 2.1.5\n * @product highcharts\n * @apioption yAxis.stackLabels.textAlign\n */\n /**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type {boolean}\n * @default false\n * @since 3.0\n * @product highcharts highstock\n * @apioption yAxis.stackLabels.useHTML\n */\n /**\n * Defines the vertical alignment of the stack total label. Can be one\n * of `\"top\"`, `\"middle\"` or `\"bottom\"`. The default value is calculated\n * at runtime and depends on orientation and whether the stack is\n * positive or negative.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-top/\n * Vertically aligned top\n * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-middle/\n * Vertically aligned middle\n * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-bottom/\n * Vertically aligned bottom\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.1.5\n * @product highcharts\n * @apioption yAxis.stackLabels.verticalAlign\n */\n /**\n * The x position offset of the label relative to the left of the\n * stacked bar. The default value is calculated at runtime and depends\n * on orientation and whether the stack is positive or negative.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-x/\n * Stack total labels with x offset\n *\n * @type {number}\n * @since 2.1.5\n * @product highcharts\n * @apioption yAxis.stackLabels.x\n */\n /**\n * The y position offset of the label relative to the tick position\n * on the axis. The default value is calculated at runtime and depends\n * on orientation and whether the stack is positive or negative.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-y/\n * Stack total labels with y offset\n *\n * @type {number}\n * @since 2.1.5\n * @product highcharts\n * @apioption yAxis.stackLabels.y\n */\n /**\n * Whether to force the axis to start on a tick. Use this option with\n * the `maxPadding` option to control the axis start.\n *\n * This option is always disabled, when panning type is\n * either `y` or `xy`.\n *\n * @see [type](#chart.panning.type)\n *\n * @sample {highcharts} highcharts/xaxis/startontick-false/\n * False by default\n * @sample {highcharts} highcharts/xaxis/startontick-true/\n * True\n * @sample {highstock} stock/xaxis/endontick/\n * False for Y axis\n *\n * @since 1.2.0\n * @product highcharts highstock gantt\n */\n startOnTick: true,\n title: {\n /**\n * The pixel distance between the axis labels and the title.\n * Positive values are outside the axis line, negative are inside.\n *\n * @sample {highcharts} highcharts/xaxis/title-margin/\n * Y axis title margin of 60\n *\n * @type {number}\n * @default 40\n * @apioption yAxis.title.margin\n */\n /**\n * The actual text of the axis title. Horizontal texts can contain\n * HTML, but rotated texts are painted using vector techniques and\n * must be clean text. The Y axis title is disabled by setting the\n * `text` option to `undefined`.\n *\n * @sample {highcharts} highcharts/xaxis/title-text/\n * Custom HTML\n *\n * @type {string|null}\n * @default {highcharts} Values\n * @default {highstock} undefined\n * @product highcharts highstock gantt\n */\n text: 'Values'\n },\n /**\n * The top position of the Y axis. If it's a number, it is interpreted\n * as pixel position relative to the chart.\n *\n * Since Highcharts 2: If it's a percentage string, it is interpreted as\n * percentages of the plot height, offset from plot area top.\n *\n * @see [yAxis.height](#yAxis.height)\n *\n * @sample {highstock} stock/demo/candlestick-and-volume/\n * Percentage height panes\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption yAxis.top\n */\n /**\n * The stack labels show the total value for each bar in a stacked\n * column or bar chart. The label will be placed on top of positive\n * columns and below negative columns. In case of an inverted column\n * chart or a bar chart the label is placed to the right of positive\n * bars and to the left of negative bars.\n *\n * @product highcharts\n */\n stackLabels: {\n /**\n * Enable or disable the initial animation when a series is\n * displayed for the `stackLabels`. The animation can also be set as\n * a configuration object. Please note that this option only\n * applies to the initial animation.\n * For other animations, see [chart.animation](#chart.animation)\n * and the animation parameter under the API methods.\n * The following properties are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * @sample {highcharts} highcharts/plotoptions/animation-defer/\n * Animation defer settings\n * @type {boolean|Partial}\n * @since 8.2.0\n * @apioption yAxis.stackLabels.animation\n */\n animation: {},\n /**\n * The animation delay time in milliseconds.\n * Set to `0` renders stackLabel immediately.\n * As `undefined` inherits defer time from the [series.animation.defer](#plotOptions.series.animation.defer).\n *\n * @type {number}\n * @since 8.2.0\n * @apioption yAxis.stackLabels.animation.defer\n */\n /**\n * Allow the stack labels to overlap.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-allowoverlap-false/\n * Default false\n *\n * @since 5.0.13\n * @product highcharts\n */\n allowOverlap: false,\n /**\n * The background color or gradient for the stack label.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n * Stack labels box options\n * @type {Highcharts.ColorType}\n * @since 8.1.0\n * @apioption yAxis.stackLabels.backgroundColor\n */\n /**\n * The border color for the stack label. Defaults to `undefined`.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n * Stack labels box options\n * @type {Highcharts.ColorType}\n * @since 8.1.0\n * @apioption yAxis.stackLabels.borderColor\n */\n /**\n * The border radius in pixels for the stack label.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n * Stack labels box options\n * @type {number}\n * @default 0\n * @since 8.1.0\n * @apioption yAxis.stackLabels.borderRadius\n */\n /**\n * The border width in pixels for the stack label.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n * Stack labels box options\n * @type {number}\n * @default 0\n * @since 8.1.0\n * @apioption yAxis.stackLabels.borderWidth\n */\n /**\n * Enable or disable the stack total labels.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-enabled/\n * Enabled stack total labels\n * @sample {highcharts} highcharts/yaxis/stacklabels-enabled-waterfall/\n * Enabled stack labels in waterfall chart\n *\n * @since 2.1.5\n * @product highcharts\n */\n enabled: false,\n /**\n * Whether to hide stack labels that are outside the plot area.\n * By default, the stack label is moved\n * inside the plot area according to the\n * [overflow](/highcharts/#yAxis/stackLabels/overflow)\n * option.\n *\n * @type {boolean}\n * @since 7.1.3\n */\n crop: true,\n /**\n * How to handle stack total labels that flow outside the plot area.\n * The default is set to `\"justify\"`,\n * which aligns them inside the plot area.\n * For columns and bars, this means it will be moved inside the bar.\n * To display stack labels outside the plot area,\n * set `crop` to `false` and `overflow` to `\"allow\"`.\n *\n * @sample highcharts/yaxis/stacklabels-overflow/\n * Stack labels flows outside the plot area.\n *\n * @type {Highcharts.DataLabelsOverflowValue}\n * @since 7.1.3\n */\n overflow: 'justify',\n /* eslint-disable valid-jsdoc */\n /**\n * Callback JavaScript function to format the label. The value is\n * given by `this.total`.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-formatter/\n * Added units to stack total value\n *\n * @type {Highcharts.FormatterCallbackFunction}\n * @since 2.1.5\n * @product highcharts\n */\n formatter: function () {\n const { numberFormatter } = this.axis.chart;\n /* eslint-enable valid-jsdoc */\n return numberFormatter(this.total || 0, -1);\n },\n /**\n * CSS styles for the label.\n *\n * In styled mode, the styles are set in the\n * `.highcharts-stack-label` class.\n *\n * @sample {highcharts} highcharts/yaxis/stacklabels-style/\n * Red stack total labels\n *\n * @type {Highcharts.CSSObject}\n * @since 2.1.5\n * @product highcharts\n */\n style: {\n /** @internal */\n color: \"#000000\" /* Palette.neutralColor100 */,\n /**\n * @type {number|string}\n */\n fontSize: '0.7em',\n /** @internal */\n fontWeight: 'bold',\n /** @internal */\n textOutline: '1px contrast'\n }\n },\n gridLineWidth: 1,\n lineWidth: 0\n };\n})(AxisDefaults || (AxisDefaults = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_AxisDefaults = (AxisDefaults);\n\n;// ./code/es-modules/Core/Foundation.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { addEvent: Foundation_addEvent, isFunction: Foundation_isFunction, objectEach: Foundation_objectEach, removeEvent: Foundation_removeEvent } = Core_Utilities;\n/* *\n *\n * Class Namespace\n *\n * */\nvar Foundation;\n(function (Foundation) {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Register event options. If an event handler is set on the options, it\n * should be subject to Chart.update, Axis.update and Series.update. This is\n * contrary to general handlers that are set directly using addEvent either\n * on the class or on the instance. #6538, #6943, #10861.\n * @private\n */\n function registerEventOptions(component, options) {\n // A lookup over those events that are added by _options_ (not\n // programmatically). These are updated through .update()\n component.eventOptions = component.eventOptions || {};\n // Register event listeners\n Foundation_objectEach(options.events, function (event, eventType) {\n // If event does not exist, or is changed by the .update()\n // function\n if (component.eventOptions[eventType] !== event) {\n // Remove existing if set by option\n if (component.eventOptions[eventType]) {\n Foundation_removeEvent(component, eventType, component.eventOptions[eventType]);\n delete component.eventOptions[eventType];\n }\n if (Foundation_isFunction(event)) {\n component.eventOptions[eventType] = event;\n Foundation_addEvent(component, eventType, event, {\n order: 0 // #14080 fire those events as firsts\n });\n }\n }\n });\n }\n Foundation.registerEventOptions = registerEventOptions;\n})(Foundation || (Foundation = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Core_Foundation = (Foundation);\n\n;// ./code/es-modules/Core/Axis/Tick.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { deg2rad: Tick_deg2rad } = Core_Globals;\n\nconst { clamp: Tick_clamp, correctFloat: Tick_correctFloat, defined: Tick_defined, destroyObjectProperties: Tick_destroyObjectProperties, extend: Tick_extend, fireEvent: Tick_fireEvent, getAlignFactor: Tick_getAlignFactor, isNumber: Tick_isNumber, merge: Tick_merge, objectEach: Tick_objectEach, pick: Tick_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Tick class.\n *\n * @class\n * @name Highcharts.Tick\n *\n * @param {Highcharts.Axis} axis\n * The axis of the tick.\n *\n * @param {number} pos\n * The position of the tick on the axis in terms of axis values.\n *\n * @param {string} [type]\n * The type of tick, either 'minor' or an empty string\n *\n * @param {boolean} [noLabel=false]\n * Whether to disable the label or not. Defaults to false.\n *\n * @param {Object} [parameters]\n * Optional parameters for the tick.\n */\nclass Tick {\n /* *\n *\n * Constructors\n *\n * */\n constructor(axis, pos, type, noLabel, parameters) {\n this.isNew = true;\n this.isNewLabel = true;\n /**\n * The related axis of the tick.\n * @name Highcharts.Tick#axis\n * @type {Highcharts.Axis}\n */\n this.axis = axis;\n /**\n * The logical position of the tick on the axis in terms of axis values.\n * @name Highcharts.Tick#pos\n * @type {number}\n */\n this.pos = pos;\n /**\n * The tick type, which can be `\"minor\"`, or an empty string.\n * @name Highcharts.Tick#type\n * @type {string}\n */\n this.type = type || '';\n this.parameters = parameters || {};\n /**\n * The mark offset of the tick on the axis. Usually `undefined`, numeric\n * for grid axes.\n * @name Highcharts.Tick#tickmarkOffset\n * @type {number|undefined}\n */\n this.tickmarkOffset = this.parameters.tickmarkOffset;\n this.options = this.parameters.options;\n Tick_fireEvent(this, 'init');\n if (!type && !noLabel) {\n this.addLabel();\n }\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Write the tick label.\n *\n * @private\n * @function Highcharts.Tick#addLabel\n */\n addLabel() {\n const tick = this, axis = tick.axis, options = axis.options, chart = axis.chart, categories = axis.categories, log = axis.logarithmic, names = axis.names, pos = tick.pos, labelOptions = Tick_pick(tick.options && tick.options.labels, options.labels), tickPositions = axis.tickPositions, isFirst = pos === tickPositions[0], isLast = pos === tickPositions[tickPositions.length - 1], animateLabels = (!labelOptions.step || labelOptions.step === 1) &&\n axis.tickInterval === 1, tickPositionInfo = tickPositions.info;\n let label = tick.label, dateTimeLabelFormat, dateTimeLabelFormats, i;\n // The context value\n let value = this.parameters.category || (categories ?\n Tick_pick(categories[pos], names[pos], pos) :\n pos);\n if (log && Tick_isNumber(value)) {\n value = Tick_correctFloat(log.lin2log(value));\n }\n // Set the datetime label format. If a higher rank is set for this\n // position, use that. If not, use the general format.\n if (axis.dateTime) {\n if (tickPositionInfo) {\n dateTimeLabelFormats = chart.time.resolveDTLFormat(options.dateTimeLabelFormats[(!options.grid &&\n tickPositionInfo.higherRanks[pos]) ||\n tickPositionInfo.unitName]);\n dateTimeLabelFormat = dateTimeLabelFormats.main;\n }\n else if (Tick_isNumber(value)) { // #1441\n dateTimeLabelFormat = axis.dateTime.getXDateFormat(value, options.dateTimeLabelFormats ||\n {});\n }\n }\n // Set properties for access in render method\n /**\n * True if the tick is the first one on the axis.\n * @name Highcharts.Tick#isFirst\n * @readonly\n * @type {boolean|undefined}\n */\n tick.isFirst = isFirst;\n /**\n * True if the tick is the last one on the axis.\n * @name Highcharts.Tick#isLast\n * @readonly\n * @type {boolean|undefined}\n */\n tick.isLast = isLast;\n // Get the string\n const ctx = {\n axis,\n chart,\n dateTimeLabelFormat: dateTimeLabelFormat,\n isFirst,\n isLast,\n pos,\n tick: tick,\n tickPositionInfo,\n value\n };\n // Fire an event that allows modifying the context for use in\n // `labels.format` and `labels.formatter`.\n Tick_fireEvent(this, 'labelFormat', ctx);\n // Label formatting. When `labels.format` is given, we first run the\n // defaultFormatter and append the result to the context as `text`.\n // Handy for adding prefix or suffix while keeping default number\n // formatting.\n const labelFormatter = (ctx) => {\n if (labelOptions.formatter) {\n return labelOptions.formatter.call(ctx, ctx);\n }\n if (labelOptions.format) {\n ctx.text = axis.defaultLabelFormatter.call(ctx);\n return Core_Templating.format(labelOptions.format, ctx, chart);\n }\n return axis.defaultLabelFormatter.call(ctx);\n };\n const str = labelFormatter.call(ctx, ctx);\n // Set up conditional formatting based on the format list if existing.\n const list = dateTimeLabelFormats && dateTimeLabelFormats.list;\n if (list) {\n tick.shortenLabel = function () {\n for (i = 0; i < list.length; i++) {\n Tick_extend(ctx, { dateTimeLabelFormat: list[i] });\n label.attr({\n text: labelFormatter.call(ctx, ctx)\n });\n if (label.getBBox().width <\n axis.getSlotWidth(tick) - 2 *\n (labelOptions.padding || 0)) {\n return;\n }\n }\n label.attr({\n text: ''\n });\n };\n }\n else {\n // #15692\n tick.shortenLabel = void 0;\n }\n // Call only after first render\n if (animateLabels && axis._addedPlotLB) {\n tick.moveLabel(str, labelOptions);\n }\n // First call\n if (!Tick_defined(label) && !tick.movedLabel) {\n /**\n * The rendered text label of the tick.\n * @name Highcharts.Tick#label\n * @type {Highcharts.SVGElement|undefined}\n */\n tick.label = label = tick.createLabel(str, labelOptions);\n // Base value to detect change for new calls to getBBox\n tick.rotation = 0;\n // Update\n }\n else if (label && label.textStr !== str && !animateLabels) {\n // When resetting text, also reset the width if dynamically set\n // (#8809)\n if (label.textWidth &&\n !labelOptions.style.width &&\n !label.styles.width) {\n label.css({ width: null });\n }\n label.attr({ text: str });\n label.textPxLength = label.getBBox().width;\n }\n }\n /**\n * Render and return the label of the tick.\n *\n * @private\n * @function Highcharts.Tick#createLabel\n */\n createLabel(str, labelOptions, xy) {\n const axis = this.axis, { renderer, styledMode } = axis.chart, label = Tick_defined(str) && labelOptions.enabled ?\n renderer\n .text(str, xy?.x, xy?.y, labelOptions.useHTML)\n .add(axis.labelGroup) :\n void 0;\n // Un-rotated length\n if (label) {\n const whiteSpace = labelOptions.style.whiteSpace || 'normal';\n // Without position absolute, IE export sometimes is wrong\n if (!styledMode) {\n label.css(Tick_merge(labelOptions.style, { whiteSpace: 'nowrap' }));\n }\n label.textPxLength = label.getBBox().width;\n if (!styledMode) {\n label.css({ whiteSpace });\n }\n }\n return label;\n }\n /**\n * Destructor for the tick prototype\n *\n * @private\n * @function Highcharts.Tick#destroy\n */\n destroy() {\n Tick_destroyObjectProperties(this, this.axis);\n }\n /**\n * Gets the x and y positions for ticks in terms of pixels.\n *\n * @private\n * @function Highcharts.Tick#getPosition\n *\n * @param {boolean} horiz\n * Whether the tick is on an horizontal axis or not.\n *\n * @param {number} tickPos\n * Position of the tick.\n *\n * @param {number} tickmarkOffset\n * Tickmark offset for all ticks.\n *\n * @param {boolean} [old]\n * Whether the axis has changed or not.\n *\n * @return {Highcharts.PositionObject}\n * The tick position.\n *\n * @emits Highcharts.Tick#event:afterGetPosition\n */\n getPosition(horiz, tickPos, tickmarkOffset, old) {\n const axis = this.axis, chart = axis.chart, cHeight = (old && chart.oldChartHeight) || chart.chartHeight, pos = {\n x: horiz ?\n Tick_correctFloat(axis.translate(tickPos + tickmarkOffset, void 0, void 0, old) +\n axis.transB) :\n (axis.left +\n axis.offset +\n (axis.opposite ?\n (((old && chart.oldChartWidth) ||\n chart.chartWidth) -\n axis.right -\n axis.left) :\n 0)),\n y: horiz ?\n (cHeight -\n axis.bottom +\n axis.offset -\n (axis.opposite ? axis.height : 0)) :\n Tick_correctFloat(cHeight -\n axis.translate(tickPos + tickmarkOffset, void 0, void 0, old) -\n axis.transB)\n };\n // Chrome workaround for #10516\n pos.y = Tick_clamp(pos.y, -1e9, 1e9);\n Tick_fireEvent(this, 'afterGetPosition', { pos: pos });\n return pos;\n }\n /**\n * Get the x, y position of the tick label\n * @private\n */\n getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n const axis = this.axis, transA = axis.transA, reversed = ( // #7911\n axis.isLinked && axis.linkedParent ?\n axis.linkedParent.reversed :\n axis.reversed), staggerLines = axis.staggerLines, rotCorr = axis.tickRotCorr || { x: 0, y: 0 }, \n // Adjust for label alignment if we use reserveSpace: true (#5286)\n labelOffsetCorrection = (!horiz && !axis.reserveSpaceDefault ?\n -axis.labelOffset * (axis.labelAlign === 'center' ? 0.5 : 1) :\n 0), distance = labelOptions.distance, pos = {};\n let yOffset, line;\n if (axis.side === 0) {\n yOffset = label.rotation ? -distance : -label.getBBox().height;\n }\n else if (axis.side === 2) {\n yOffset = rotCorr.y + distance;\n }\n else {\n // #3140, #3140\n yOffset = Math.cos(label.rotation * Tick_deg2rad) *\n (rotCorr.y - label.getBBox(false, 0).height / 2);\n }\n if (Tick_defined(labelOptions.y)) {\n yOffset = axis.side === 0 && axis.horiz ?\n labelOptions.y + yOffset :\n labelOptions.y;\n }\n x = x +\n Tick_pick(labelOptions.x, [0, 1, 0, -1][axis.side] * distance) +\n labelOffsetCorrection +\n rotCorr.x -\n (tickmarkOffset && horiz ?\n tickmarkOffset * transA * (reversed ? -1 : 1) :\n 0);\n y = y + yOffset - (tickmarkOffset && !horiz ?\n tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n // Correct for staggered labels\n if (staggerLines) {\n line = (index / (step || 1) % staggerLines);\n if (axis.opposite) {\n line = staggerLines - line - 1;\n }\n y += line * (axis.labelOffset / staggerLines);\n }\n pos.x = x;\n pos.y = Math.round(y);\n Tick_fireEvent(this, 'afterGetLabelPosition', { pos: pos, tickmarkOffset: tickmarkOffset, index: index });\n return pos;\n }\n /**\n * Get the offset height or width of the label\n *\n * @private\n * @function Highcharts.Tick#getLabelSize\n */\n getLabelSize() {\n return this.label ?\n this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n 0;\n }\n /**\n * Extendible method to return the path of the marker\n * @private\n */\n getMarkPath(x, y, tickLength, tickWidth, horiz = false, renderer) {\n return renderer.crispLine([[\n 'M',\n x,\n y\n ], [\n 'L',\n x + (horiz ? 0 : -tickLength),\n y + (horiz ? tickLength : 0)\n ]], tickWidth);\n }\n /**\n * Handle the label overflow by adjusting the labels to the left and right\n * edge, or hide them if they collide into the neighbour label.\n *\n * @private\n * @function Highcharts.Tick#handleOverflow\n */\n handleOverflow(xy) {\n const tick = this, axis = this.axis, labelOptions = axis.options.labels, pxPos = xy.x, chartWidth = axis.chart.chartWidth, spacing = axis.chart.spacing, leftBound = Tick_pick(axis.labelLeft, Math.min(axis.pos, spacing[3])), rightBound = Tick_pick(axis.labelRight, Math.max(!axis.isRadial ? axis.pos + axis.len : 0, chartWidth - spacing[1])), label = this.label, rotation = this.rotation, factor = Tick_getAlignFactor(axis.labelAlign || label.attr('align')), labelWidth = label.getBBox().width, slotWidth = axis.getSlotWidth(tick), xCorrection = factor, css = {};\n let modifiedSlotWidth = slotWidth, goRight = 1, leftPos, rightPos, textWidth;\n // Check if the label overshoots the chart spacing box. If it does, move\n // it. If it now overshoots the slotWidth, add ellipsis.\n if (!rotation && labelOptions.overflow === 'justify') {\n leftPos = pxPos - factor * labelWidth;\n rightPos = pxPos + (1 - factor) * labelWidth;\n if (leftPos < leftBound) {\n modifiedSlotWidth =\n xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n }\n else if (rightPos > rightBound) {\n modifiedSlotWidth =\n rightBound - xy.x + modifiedSlotWidth * factor;\n goRight = -1;\n }\n modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n xy.x += (goRight *\n (slotWidth -\n modifiedSlotWidth -\n xCorrection * (slotWidth - Math.min(labelWidth, modifiedSlotWidth))));\n }\n // If the label width exceeds the available space, set a text width\n // to be picked up below. Also, if a width has been set before, we\n // need to set a new one because the reported labelWidth will be\n // limited by the box (#3938).\n if (labelWidth > modifiedSlotWidth ||\n (axis.autoRotation && (label.styles || {}).width)) {\n textWidth = modifiedSlotWidth;\n }\n // Add ellipsis to prevent rotated labels to be clipped against the edge\n // of the chart\n }\n else if (rotation < 0 &&\n pxPos - factor * labelWidth < leftBound) {\n textWidth = Math.round(pxPos / Math.cos(rotation * Tick_deg2rad) - leftBound);\n }\n else if (rotation > 0 &&\n pxPos + factor * labelWidth > rightBound) {\n textWidth = Math.round((chartWidth - pxPos) /\n Math.cos(rotation * Tick_deg2rad));\n }\n if (textWidth && label) {\n if (tick.shortenLabel) {\n tick.shortenLabel();\n }\n else {\n label.css(Tick_extend(css, {\n width: Math.floor(textWidth) + 'px',\n lineClamp: axis.isRadial ? 0 : 1\n }));\n }\n }\n }\n /**\n * Try to replace the label if the same one already exists.\n *\n * @private\n * @function Highcharts.Tick#moveLabel\n */\n moveLabel(str, labelOptions) {\n const tick = this, label = tick.label, axis = tick.axis;\n let moved = false, labelPos;\n if (label && label.textStr === str) {\n tick.movedLabel = label;\n moved = true;\n delete tick.label;\n }\n else { // Find a label with the same string\n Tick_objectEach(axis.ticks, function (currentTick) {\n if (!moved &&\n !currentTick.isNew &&\n currentTick !== tick &&\n currentTick.label &&\n currentTick.label.textStr === str) {\n tick.movedLabel = currentTick.label;\n moved = true;\n currentTick.labelPos = tick.movedLabel.xy;\n delete currentTick.label;\n }\n });\n }\n // Create new label if the actual one is moved\n if (!moved && (tick.labelPos || label)) {\n labelPos = tick.labelPos || label.xy;\n tick.movedLabel = tick.createLabel(str, labelOptions, labelPos);\n if (tick.movedLabel) {\n tick.movedLabel.attr({ opacity: 0 });\n }\n }\n }\n /**\n * Put everything in place\n *\n * @private\n * @param {number} index\n *\n * @param {boolean} [old]\n * Use old coordinates to prepare an animation into new position\n *\n * @param {number} [opacity]\n */\n render(index, old, opacity) {\n const tick = this, axis = tick.axis, horiz = axis.horiz, pos = tick.pos, tickmarkOffset = Tick_pick(tick.tickmarkOffset, axis.tickmarkOffset), xy = tick.getPosition(horiz, pos, tickmarkOffset, old), x = xy.x, y = xy.y, axisStart = axis.pos, axisEnd = axisStart + axis.len, pxPos = horiz ? x : y;\n // Anything that is not between `axis.pos` and `axis.pos + axis.length`\n // should not be visible (#20166). The `correctFloat` is for reversed\n // axes in Safari.\n if (!axis.chart.polar &&\n tick.isNew &&\n (Tick_correctFloat(pxPos) < axisStart || pxPos > axisEnd)) {\n opacity = 0;\n }\n const labelOpacity = Tick_pick(opacity, tick.label && tick.label.newOpacity, // #15528\n 1);\n opacity = Tick_pick(opacity, 1);\n this.isActive = true;\n // Create the grid line\n this.renderGridLine(old, opacity);\n // Create the tick mark\n this.renderMark(xy, opacity);\n // The label is created on init - now move it into place\n this.renderLabel(xy, old, labelOpacity, index);\n tick.isNew = false;\n Tick_fireEvent(this, 'afterRender');\n }\n /**\n * Renders the gridLine.\n *\n * @private\n * @function Highcharts.Tick#renderGridLine\n * @param {boolean} old Whether or not the tick is old\n * @param {number} opacity The opacity of the grid line\n */\n renderGridLine(old, opacity) {\n const tick = this, axis = tick.axis, options = axis.options, attribs = {}, pos = tick.pos, type = tick.type, tickmarkOffset = Tick_pick(tick.tickmarkOffset, axis.tickmarkOffset), renderer = axis.chart.renderer;\n let gridLine = tick.gridLine, gridLinePath, gridLineWidth = options.gridLineWidth, gridLineColor = options.gridLineColor, dashStyle = options.gridLineDashStyle;\n if (tick.type === 'minor') {\n gridLineWidth = options.minorGridLineWidth;\n gridLineColor = options.minorGridLineColor;\n dashStyle = options.minorGridLineDashStyle;\n }\n if (!gridLine) {\n if (!axis.chart.styledMode) {\n attribs.stroke = gridLineColor;\n attribs['stroke-width'] = gridLineWidth || 0;\n attribs.dashstyle = dashStyle;\n }\n if (!type) {\n attribs.zIndex = 1;\n }\n if (old) {\n opacity = 0;\n }\n /**\n * The rendered grid line of the tick.\n * @name Highcharts.Tick#gridLine\n * @type {Highcharts.SVGElement|undefined}\n */\n tick.gridLine = gridLine = renderer.path()\n .attr(attribs)\n .addClass('highcharts-' + (type ? type + '-' : '') + 'grid-line')\n .add(axis.gridGroup);\n }\n if (gridLine) {\n gridLinePath = axis.getPlotLinePath({\n value: pos + tickmarkOffset,\n lineWidth: gridLine.strokeWidth(),\n force: 'pass',\n old: old,\n acrossPanes: false // #18025\n });\n // If the parameter 'old' is set, the current call will be followed\n // by another call, therefore do not do any animations this time\n if (gridLinePath) {\n gridLine[old || tick.isNew ? 'attr' : 'animate']({\n d: gridLinePath,\n opacity: opacity\n });\n }\n }\n }\n /**\n * Renders the tick mark.\n *\n * @private\n * @function Highcharts.Tick#renderMark\n * @param {Highcharts.PositionObject} xy The position vector of the mark\n * @param {number} opacity The opacity of the mark\n */\n renderMark(xy, opacity) {\n const tick = this, axis = tick.axis, options = axis.options, renderer = axis.chart.renderer, type = tick.type, tickSize = axis.tickSize(type ? type + 'Tick' : 'tick'), x = xy.x, y = xy.y, tickWidth = Tick_pick(options[type !== 'minor' ? 'tickWidth' : 'minorTickWidth'], !type && axis.isXAxis ? 1 : 0), // X axis defaults to 1\n tickColor = options[type !== 'minor' ? 'tickColor' : 'minorTickColor'];\n let mark = tick.mark;\n const isNewMark = !mark;\n if (tickSize) {\n // Negate the length\n if (axis.opposite) {\n tickSize[0] = -tickSize[0];\n }\n // First time, create it\n if (!mark) {\n /**\n * The rendered mark of the tick.\n * @name Highcharts.Tick#mark\n * @type {Highcharts.SVGElement|undefined}\n */\n tick.mark = mark = renderer.path()\n .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n .add(axis.axisGroup);\n if (!axis.chart.styledMode) {\n mark.attr({\n stroke: tickColor,\n 'stroke-width': tickWidth\n });\n }\n }\n mark[isNewMark ? 'attr' : 'animate']({\n d: tick.getMarkPath(x, y, tickSize[0], mark.strokeWidth(), axis.horiz, renderer),\n opacity: opacity\n });\n }\n }\n /**\n * Renders the tick label.\n * Note: The label should already be created in init(), so it should only\n * have to be moved into place.\n *\n * @private\n * @function Highcharts.Tick#renderLabel\n * @param {Highcharts.PositionObject} xy The position vector of the label\n * @param {boolean} old Whether or not the tick is old\n * @param {number} opacity The opacity of the label\n * @param {number} index The index of the tick\n */\n renderLabel(xy, old, opacity, index) {\n const tick = this, axis = tick.axis, horiz = axis.horiz, options = axis.options, label = tick.label, labelOptions = options.labels, step = labelOptions.step, tickmarkOffset = Tick_pick(tick.tickmarkOffset, axis.tickmarkOffset), x = xy.x, y = xy.y;\n let show = true;\n if (label && Tick_isNumber(x)) {\n label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n // Apply show first and show last. If the tick is both first and\n // last, it is a single centered tick, in which case we show the\n // label anyway (#2100).\n if ((tick.isFirst &&\n !tick.isLast &&\n !options.showFirstLabel) ||\n (tick.isLast &&\n !tick.isFirst &&\n !options.showLastLabel)) {\n show = false;\n // Handle label overflow and show or hide accordingly\n }\n else if (horiz &&\n !labelOptions.step &&\n !labelOptions.rotation &&\n !old &&\n opacity !== 0) {\n tick.handleOverflow(xy);\n }\n // Apply step\n if (step && index % step) {\n // Show those indices dividable by step\n show = false;\n }\n // Set the new position, and show or hide\n if (show && Tick_isNumber(xy.y)) {\n xy.opacity = opacity;\n label[tick.isNewLabel ? 'attr' : 'animate'](xy).show(true);\n tick.isNewLabel = false;\n }\n else {\n label.hide(); // #1338, #15863\n tick.isNewLabel = true;\n }\n }\n }\n /**\n * Replace labels with the moved ones to perform animation. Additionally\n * destroy unused labels.\n *\n * @private\n * @function Highcharts.Tick#replaceMovedLabel\n */\n replaceMovedLabel() {\n const tick = this, label = tick.label, axis = tick.axis;\n // Animate and destroy\n if (label && !tick.isNew) {\n label.animate({ opacity: 0 }, void 0, label.destroy);\n delete tick.label;\n }\n axis.isDirty = true;\n tick.label = tick.movedLabel;\n delete tick.movedLabel;\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_Tick = (Tick);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Optional parameters for the tick.\n * @private\n * @interface Highcharts.TickParametersObject\n */ /**\n* Set category for the tick.\n* @name Highcharts.TickParametersObject#category\n* @type {string|undefined}\n*/ /**\n* @name Highcharts.TickParametersObject#options\n* @type {Highcharts.Dictionary|undefined}\n*/ /**\n* Set tickmarkOffset for the tick.\n* @name Highcharts.TickParametersObject#tickmarkOffset\n* @type {number|undefined}\n*/\n/**\n * Additional time tick information.\n *\n * @interface Highcharts.TimeTicksInfoObject\n * @extends Highcharts.TimeNormalizedObject\n */ /**\n* @name Highcharts.TimeTicksInfoObject#higherRanks\n* @type {Array}\n*/ /**\n* @name Highcharts.TimeTicksInfoObject#totalRange\n* @type {number}\n*/\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Axis/Axis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject: Axis_animObject } = AnimationUtilities;\n\nconst { xAxis, yAxis } = Axis_AxisDefaults;\n\n\nconst { defaultOptions: Axis_defaultOptions } = Defaults;\n\nconst { registerEventOptions } = Core_Foundation;\n\nconst { deg2rad: Axis_deg2rad } = Core_Globals;\n\n\nconst { arrayMax: Axis_arrayMax, arrayMin: Axis_arrayMin, clamp: Axis_clamp, correctFloat: Axis_correctFloat, defined: Axis_defined, destroyObjectProperties: Axis_destroyObjectProperties, erase: Axis_erase, error: Axis_error, extend: Axis_extend, fireEvent: Axis_fireEvent, getClosestDistance: Axis_getClosestDistance, insertItem: Axis_insertItem, isArray: Axis_isArray, isNumber: Axis_isNumber, isString: Axis_isString, merge: Axis_merge, normalizeTickInterval: Axis_normalizeTickInterval, objectEach: Axis_objectEach, pick: Axis_pick, relativeLength: Axis_relativeLength, removeEvent: Axis_removeEvent, splat: Axis_splat, syncTimeout: Axis_syncTimeout } = Core_Utilities;\nconst getNormalizedTickInterval = (axis, tickInterval) => Axis_normalizeTickInterval(tickInterval, void 0, void 0, Axis_pick(axis.options.allowDecimals, \n// If the tick interval is greater than 0.5, avoid decimals, as\n// linear axes are often used to render discrete values (#3363). If\n// a tick amount is set, allow decimals by default, as it increases\n// the chances for a good fit.\ntickInterval < 0.5 || axis.tickAmount !== void 0), !!axis.tickAmount);\nAxis_extend(Axis_defaultOptions, { xAxis, yAxis: Axis_merge(xAxis, yAxis) });\n/* *\n *\n * Class\n *\n * */\n/**\n * Create a new axis object. Called internally when instantiating a new chart or\n * adding axes by {@link Highcharts.Chart#addAxis}.\n *\n * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n * series cartesian chart, there is one X axis and one Y axis.\n *\n * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n * an array of Axis objects. If there is only one axis, it can be referenced\n * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n * pattern goes for Y axes.\n *\n * If you need to get the axes from a series object, use the `series.xAxis` and\n * `series.yAxis` properties. These are not arrays, as one series can only be\n * associated to one X and one Y axis.\n *\n * A third way to reference the axis programmatically is by `id`. Add an `id` in\n * the axis configuration options, and get the axis by\n * {@link Highcharts.Chart#get}.\n *\n * Configuration options for the axes are given in options.xAxis and\n * options.yAxis.\n *\n * @class\n * @name Highcharts.Axis\n *\n * @param {Highcharts.Chart} chart\n * The Chart instance to apply the axis on.\n *\n * @param {Highcharts.AxisOptions} userOptions\n * Axis options\n */\nclass Axis {\n /* *\n *\n * Constructors\n *\n * */\n constructor(chart, userOptions, coll) {\n this.init(chart, userOptions, coll);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Overrideable function to initialize the axis.\n *\n * @see {@link Axis}\n *\n * @function Highcharts.Axis#init\n *\n * @param {Highcharts.Chart} chart\n * The Chart instance to apply the axis on.\n *\n * @param {AxisOptions} userOptions\n * Axis options.\n *\n * @emits Highcharts.Axis#event:afterInit\n * @emits Highcharts.Axis#event:init\n */\n init(chart, userOptions, coll = this.coll) {\n const isXAxis = coll === 'xAxis', axis = this, horiz = axis.isZAxis || (chart.inverted ? !isXAxis : isXAxis);\n /**\n * The Chart that the axis belongs to.\n *\n * @name Highcharts.Axis#chart\n * @type {Highcharts.Chart}\n */\n axis.chart = chart;\n /**\n * Whether the axis is horizontal.\n *\n * @name Highcharts.Axis#horiz\n * @type {boolean|undefined}\n */\n axis.horiz = horiz;\n /**\n * Whether the axis is the x-axis.\n *\n * @name Highcharts.Axis#isXAxis\n * @type {boolean|undefined}\n */\n axis.isXAxis = isXAxis;\n /**\n * The collection where the axis belongs, for example `xAxis`, `yAxis`\n * or `colorAxis`. Corresponds to properties on Chart, for example\n * {@link Chart.xAxis}.\n *\n * @name Highcharts.Axis#coll\n * @type {string}\n */\n axis.coll = coll;\n Axis_fireEvent(this, 'init', { userOptions: userOptions });\n // Needed in setOptions\n axis.opposite = Axis_pick(userOptions.opposite, axis.opposite);\n /**\n * The side on which the axis is rendered. 0 is top, 1 is right, 2\n * is bottom and 3 is left.\n *\n * @name Highcharts.Axis#side\n * @type {number}\n */\n axis.side = Axis_pick(userOptions.side, axis.side, (horiz ?\n (axis.opposite ? 0 : 2) : // Top : bottom\n (axis.opposite ? 1 : 3)) // Right : left\n );\n /**\n * Current options for the axis after merge of defaults and user's\n * options.\n *\n * @name Highcharts.Axis#options\n * @type {Highcharts.AxisOptions}\n */\n axis.setOptions(userOptions);\n const options = axis.options, labelsOptions = options.labels;\n // Set the type and fire an event\n axis.type ?? (axis.type = options.type || 'linear');\n axis.uniqueNames ?? (axis.uniqueNames = options.uniqueNames ?? true);\n Axis_fireEvent(axis, 'afterSetType');\n /**\n * User's options for this axis without defaults.\n *\n * @name Highcharts.Axis#userOptions\n * @type {Highcharts.AxisOptions}\n */\n axis.userOptions = userOptions;\n axis.minPixelPadding = 0;\n /**\n * Whether the axis is reversed. Based on the `axis.reversed`,\n * option, but inverted charts have reversed xAxis by default.\n *\n * @name Highcharts.Axis#reversed\n * @type {boolean}\n */\n axis.reversed = Axis_pick(options.reversed, axis.reversed);\n axis.visible = options.visible;\n axis.zoomEnabled = options.zoomEnabled;\n // Initial categories\n axis.hasNames = this.type === 'category' || options.categories === true;\n /**\n * If categories are present for the axis, names are used instead of\n * numbers for that axis.\n *\n * Since Highcharts 3.0, categories can also be extracted by giving each\n * point a name and setting axis type to `category`. However, if you\n * have multiple series, best practice remains defining the `categories`\n * array.\n *\n * @see [xAxis.categories](/highcharts/xAxis.categories)\n *\n * @name Highcharts.Axis#categories\n * @type {Array}\n * @readonly\n */\n axis.categories = (Axis_isArray(options.categories) && options.categories) ||\n (axis.hasNames ? [] : void 0);\n if (!axis.names) { // Preserve on update (#3830)\n axis.names = [];\n axis.names.keys = {};\n }\n // Placeholder for plotlines and plotbands groups\n axis.plotLinesAndBandsGroups = {};\n // Shorthand types\n axis.positiveValuesOnly = !!axis.logarithmic;\n // Flag, if axis is linked to another axis\n axis.isLinked = Axis_defined(options.linkedTo);\n /**\n * List of major ticks mapped by position on axis.\n *\n * @see {@link Highcharts.Tick}\n *\n * @name Highcharts.Axis#ticks\n * @type {Highcharts.Dictionary}\n */\n axis.ticks = {};\n axis.labelEdge = [];\n /**\n * List of minor ticks mapped by position on the axis.\n *\n * @see {@link Highcharts.Tick}\n *\n * @name Highcharts.Axis#minorTicks\n * @type {Highcharts.Dictionary}\n */\n axis.minorTicks = {};\n // List of plotLines/Bands\n axis.plotLinesAndBands = [];\n // Alternate bands\n axis.alternateBands = {};\n /**\n * The length of the axis in terms of pixels.\n *\n * @name Highcharts.Axis#len\n * @type {number}\n */\n axis.len ?? (axis.len = 0);\n axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n axis.range = options.range;\n axis.offset = options.offset || 0;\n /**\n * The maximum value of the axis. In a logarithmic axis, this is the\n * logarithm of the real value, and the real value can be obtained from\n * {@link Axis#getExtremes}.\n *\n * @name Highcharts.Axis#max\n * @type {number|undefined}\n */\n axis.max = void 0;\n /**\n * The minimum value of the axis. In a logarithmic axis, this is the\n * logarithm of the real value, and the real value can be obtained from\n * {@link Axis#getExtremes}.\n *\n * @name Highcharts.Axis#min\n * @type {number|undefined}\n */\n axis.min = void 0;\n /**\n * The processed crosshair options.\n *\n * @name Highcharts.Axis#crosshair\n * @type {boolean|Highcharts.AxisCrosshairOptions}\n */\n const crosshair = Axis_pick(options.crosshair, Axis_splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1]);\n axis.crosshair = crosshair === true ? {} : crosshair;\n // Register. Don't add it again on Axis.update().\n if (chart.axes.indexOf(axis) === -1) { //\n if (isXAxis) { // #2713\n chart.axes.splice(chart.xAxis.length, 0, axis);\n }\n else {\n chart.axes.push(axis);\n }\n Axis_insertItem(this, chart[this.coll]);\n }\n chart.orderItems(axis.coll);\n /**\n * All series associated to the axis.\n *\n * @name Highcharts.Axis#series\n * @type {Array}\n */\n axis.series = axis.series || []; // Populated by Series\n // Reversed axis\n if (chart.inverted &&\n !axis.isZAxis &&\n isXAxis &&\n !Axis_defined(axis.reversed)) {\n axis.reversed = true;\n }\n axis.labelRotation = Axis_isNumber(labelsOptions.rotation) ?\n labelsOptions.rotation :\n void 0;\n // Register event listeners\n registerEventOptions(axis, options);\n Axis_fireEvent(this, 'afterInit');\n }\n /**\n * Merge and set options.\n *\n * @private\n * @function Highcharts.Axis#setOptions\n *\n * @param {Highcharts.AxisOptions} userOptions\n * Axis options.\n *\n * @emits Highcharts.Axis#event:afterSetOptions\n */\n setOptions(userOptions) {\n const sideSpecific = this.horiz ?\n // Top and bottom axis defaults\n {\n labels: {\n autoRotation: [-45],\n padding: 3\n },\n margin: 15\n } :\n // Left and right axis, title rotated 90 or 270 degrees\n // respectively\n {\n labels: {\n padding: 1\n },\n title: {\n rotation: 90 * this.side\n }\n };\n this.options = Axis_merge(sideSpecific, Axis_defaultOptions[this.coll], userOptions);\n Axis_fireEvent(this, 'afterSetOptions', { userOptions });\n }\n /**\n * The default label formatter. The context is a special config object for\n * the label. In apps, use the\n * [labels.formatter](https://api.highcharts.com/highcharts/xAxis.labels.formatter)\n * instead, except when a modification is needed.\n *\n * @function Highcharts.Axis#defaultLabelFormatter\n *\n * @param {Highcharts.AxisLabelsFormatterContextObject} this\n * Formatter context of axis label.\n *\n * @param {Highcharts.AxisLabelsFormatterContextObject} [ctx]\n * Formatter context of axis label.\n *\n * @return {string}\n * The formatted label content.\n */\n defaultLabelFormatter() {\n const axis = this.axis, chart = this.chart, { numberFormatter } = chart, value = Axis_isNumber(this.value) ? this.value : NaN, time = axis.chart.time, categories = axis.categories, dateTimeLabelFormat = this.dateTimeLabelFormat, lang = Axis_defaultOptions.lang, numericSymbols = lang.numericSymbols, numSymMagnitude = lang.numericSymbolMagnitude || 1000, \n // Make sure the same symbol is added for all labels on a linear\n // axis\n numericSymbolDetector = axis.logarithmic ?\n Math.abs(value) :\n axis.tickInterval;\n let i = numericSymbols && numericSymbols.length, multi, ret;\n if (categories) {\n ret = `${this.value}`;\n }\n else if (dateTimeLabelFormat) { // Datetime axis\n ret = time.dateFormat(dateTimeLabelFormat, value, true);\n }\n else if (i &&\n numericSymbols &&\n numericSymbolDetector >= 1000) {\n // Decide whether we should add a numeric symbol like k (thousands)\n // or M (millions). If we are to enable this in tooltip or other\n // places as well, we can move this logic to the numberFormatter and\n // enable it by a parameter.\n while (i-- && typeof ret === 'undefined') {\n multi = Math.pow(numSymMagnitude, i + 1);\n if (\n // Only accept a numeric symbol when the distance is more\n // than a full unit. So for example if the symbol is k, we\n // don't accept numbers like 0.5k.\n numericSymbolDetector >= multi &&\n // Accept one decimal before the symbol. Accepts 0.5k but\n // not 0.25k. How does this work with the previous?\n (value * 10) % multi === 0 &&\n numericSymbols[i] !== null &&\n value !== 0) { // #5480\n ret = numberFormatter(value / multi, -1) + numericSymbols[i];\n }\n }\n }\n if (typeof ret === 'undefined') {\n if (Math.abs(value) >= 10000) { // Add thousands separators\n ret = numberFormatter(value, -1);\n }\n else { // Small numbers\n ret = numberFormatter(value, -1, void 0, ''); // #2466\n }\n }\n return ret;\n }\n /**\n * Get the minimum and maximum for the series of each axis. The function\n * analyzes the axis series and updates `this.dataMin` and `this.dataMax`.\n *\n * @private\n * @function Highcharts.Axis#getSeriesExtremes\n *\n * @emits Highcharts.Axis#event:afterGetSeriesExtremes\n * @emits Highcharts.Axis#event:getSeriesExtremes\n */\n getSeriesExtremes() {\n const axis = this;\n let xExtremes;\n Axis_fireEvent(this, 'getSeriesExtremes', null, function () {\n axis.hasVisibleSeries = false;\n // Reset properties in case we're redrawing (#3353)\n axis.dataMin = axis.dataMax = axis.threshold = void 0;\n axis.softThreshold = !axis.isXAxis;\n // Loop through this axis' series\n axis.series.forEach((series) => {\n if (series.reserveSpace()) {\n const seriesOptions = series.options;\n let xData, threshold = seriesOptions.threshold, seriesDataMin, seriesDataMax;\n axis.hasVisibleSeries = true;\n // Validate threshold in logarithmic axes\n if (axis.positiveValuesOnly && (threshold || 0) <= 0) {\n threshold = void 0;\n }\n // Get dataMin and dataMax for X axes\n if (axis.isXAxis) {\n xData = series.getColumn('x');\n if (xData.length) {\n xData = axis.logarithmic ?\n xData.filter((x) => x > 0) :\n xData;\n xExtremes = series.getXExtremes(xData);\n // If xData contains values which is not numbers,\n // then filter them out. To prevent performance hit,\n // we only do this after we have already found\n // seriesDataMin because in most cases all data is\n // valid. #5234.\n seriesDataMin = xExtremes.min;\n seriesDataMax = xExtremes.max;\n if (!Axis_isNumber(seriesDataMin) &&\n // #5010:\n !(seriesDataMin instanceof Date)) {\n xData = xData.filter(Axis_isNumber);\n xExtremes = series.getXExtremes(xData);\n // Do it again with valid data\n seriesDataMin = xExtremes.min;\n seriesDataMax = xExtremes.max;\n }\n if (xData.length) {\n axis.dataMin = Math.min(Axis_pick(axis.dataMin, seriesDataMin), seriesDataMin);\n axis.dataMax = Math.max(Axis_pick(axis.dataMax, seriesDataMax), seriesDataMax);\n }\n }\n // Get dataMin and dataMax for Y axes, as well as handle\n // stacking and processed data\n }\n else {\n // Get this particular series extremes\n const dataExtremes = series.applyExtremes();\n // Get the dataMin and dataMax so far. If percentage is\n // used, the min and max are always 0 and 100. If\n // seriesDataMin and seriesDataMax is null, then series\n // doesn't have active y data, we continue with nulls\n if (Axis_isNumber(dataExtremes.dataMin)) {\n seriesDataMin = dataExtremes.dataMin;\n axis.dataMin = Math.min(Axis_pick(axis.dataMin, seriesDataMin), seriesDataMin);\n }\n if (Axis_isNumber(dataExtremes.dataMax)) {\n seriesDataMax = dataExtremes.dataMax;\n axis.dataMax = Math.max(Axis_pick(axis.dataMax, seriesDataMax), seriesDataMax);\n }\n // Adjust to threshold\n if (Axis_defined(threshold)) {\n axis.threshold = threshold;\n }\n // If any series has a hard threshold, it takes\n // precedence\n if (!seriesOptions.softThreshold ||\n axis.positiveValuesOnly) {\n axis.softThreshold = false;\n }\n }\n }\n });\n });\n Axis_fireEvent(this, 'afterGetSeriesExtremes');\n }\n /**\n * Translate from axis value to pixel position on the chart, or back. Use\n * the `toPixels` and `toValue` functions in applications.\n *\n * @private\n * @function Highcharts.Axis#translate\n */\n translate(val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n const axis = (this.linkedParent || this), // #1417\n localMin = (old && axis.old ? axis.old.min : axis.min);\n if (!Axis_isNumber(localMin)) {\n return NaN;\n }\n const minPixelPadding = axis.minPixelPadding, doPostTranslate = (axis.isOrdinal ||\n axis.brokenAxis?.hasBreaks ||\n (axis.logarithmic && handleLog)) && axis.lin2val;\n let sign = 1, cvsOffset = 0, localA = old && axis.old ? axis.old.transA : axis.transA, returnValue = 0;\n if (!localA) {\n localA = axis.transA;\n }\n // In vertical axes, the canvas coordinates start from 0 at the top like\n // in SVG.\n if (cvsCoord) {\n sign *= -1; // Canvas coordinates inverts the value\n cvsOffset = axis.len;\n }\n // Handle reversed axis\n if (axis.reversed) {\n sign *= -1;\n cvsOffset -= sign * (axis.sector || axis.len);\n }\n // From pixels to value\n if (backwards) { // Reverse translation\n val = val * sign + cvsOffset;\n val -= minPixelPadding;\n // From chart pixel to value:\n returnValue = val / localA + localMin;\n if (doPostTranslate) { // Log, ordinal and broken axis\n returnValue = axis.lin2val(returnValue);\n }\n // From value to pixels\n }\n else {\n if (doPostTranslate) { // Log, ordinal and broken axis\n val = axis.val2lin(val);\n }\n const value = sign * (val - localMin) * localA;\n returnValue = value +\n cvsOffset +\n (sign * minPixelPadding) +\n (Axis_isNumber(pointPlacement) ? localA * pointPlacement : 0);\n if (!axis.isRadial) {\n returnValue = Axis_correctFloat(returnValue);\n }\n }\n return returnValue;\n }\n /**\n * Translate a value in terms of axis units into pixels within the chart.\n *\n * @function Highcharts.Axis#toPixels\n *\n * @param {number|string} value\n * A value in terms of axis units. For datetime axes, a timestamp or\n * date/time string is accepted.\n *\n * @param {boolean} [paneCoordinates=false]\n * Whether to return the pixel coordinate relative to the chart or just the\n * axis/pane itself.\n *\n * @return {number}\n * Pixel position of the value on the chart or axis.\n */\n toPixels(value, paneCoordinates) {\n return this.translate(this.chart?.time.parse(value) ?? NaN, false, !this.horiz, void 0, true) + (paneCoordinates ? 0 : this.pos);\n }\n /**\n * Translate a pixel position along the axis to a value in terms of axis\n * units.\n *\n * @function Highcharts.Axis#toValue\n *\n * @param {number} pixel\n * The pixel value coordinate.\n *\n * @param {boolean} [paneCoordinates=false]\n * Whether the input pixel is relative to the chart or just the axis/pane\n * itself.\n *\n * @return {number}\n * The axis value.\n */\n toValue(pixel, paneCoordinates) {\n return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, void 0, true);\n }\n /**\n * Create the path for a plot line that goes from the given value on\n * this axis, across the plot to the opposite side. Also used internally for\n * grid lines and crosshairs.\n *\n * @function Highcharts.Axis#getPlotLinePath\n *\n * @param {Highcharts.AxisPlotLinePathOptionsObject} options\n * Options for the path.\n *\n * @return {Highcharts.SVGPathArray|null}\n * The SVG path definition for the plot line.\n */\n getPlotLinePath(options) {\n const axis = this, chart = axis.chart, axisLeft = axis.left, axisTop = axis.top, old = options.old, value = options.value, lineWidth = options.lineWidth, cHeight = (old && chart.oldChartHeight) || chart.chartHeight, cWidth = (old && chart.oldChartWidth) || chart.chartWidth, transB = axis.transB;\n let translatedValue = options.translatedValue, force = options.force, x1, y1, x2, y2, skip;\n // eslint-disable-next-line valid-jsdoc\n /**\n * Check if x is between a and b. If not, either move to a/b\n * or skip, depending on the force parameter.\n * @private\n */\n function between(x, a, b) {\n if (force !== 'pass' && (x < a || x > b)) {\n if (force) {\n x = Axis_clamp(x, a, b);\n }\n else {\n skip = true;\n }\n }\n return x;\n }\n const evt = {\n value,\n lineWidth,\n old,\n force,\n acrossPanes: options.acrossPanes,\n translatedValue\n };\n Axis_fireEvent(this, 'getPlotLinePath', evt, function (e) {\n translatedValue = Axis_pick(translatedValue, axis.translate(value, void 0, void 0, old));\n // Keep the translated value within sane bounds, and avoid Infinity\n // to fail the isNumber test (#7709).\n translatedValue = Axis_clamp(translatedValue, -1e9, 1e9);\n x1 = x2 = translatedValue + transB;\n y1 = y2 = cHeight - translatedValue - transB;\n if (!Axis_isNumber(translatedValue)) { // No min or max\n skip = true;\n force = false; // #7175, don't force it when path is invalid\n }\n else if (axis.horiz) {\n y1 = axisTop;\n y2 = cHeight - axis.bottom + (axis.options.isInternal ?\n 0 :\n (chart.scrollablePixelsY || 0)); // #20354, scrollablePixelsY shouldn't be used for navigator\n x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n }\n else {\n x1 = axisLeft;\n x2 = cWidth - axis.right + (chart.scrollablePixelsX || 0);\n y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n }\n e.path = skip && !force ?\n void 0 :\n chart.renderer.crispLine([['M', x1, y1], ['L', x2, y2]], lineWidth || 1);\n });\n return evt.path;\n }\n /**\n * Internal function to get the tick positions of a linear axis to round\n * values like whole tens or every five.\n *\n * @function Highcharts.Axis#getLinearTickPositions\n *\n * @param {number} tickInterval\n * The normalized tick interval.\n *\n * @param {number} min\n * Axis minimum.\n *\n * @param {number} max\n * Axis maximum.\n *\n * @return {Array}\n * An array of axis values where ticks should be placed.\n */\n getLinearTickPositions(tickInterval, min, max) {\n const roundedMin = Axis_correctFloat(Math.floor(min / tickInterval) * tickInterval), roundedMax = Axis_correctFloat(Math.ceil(max / tickInterval) * tickInterval), tickPositions = [];\n let pos, lastPos, precision;\n // When the precision is higher than what we filter out in\n // correctFloat, skip it (#6183).\n if (Axis_correctFloat(roundedMin + tickInterval) === roundedMin) {\n precision = 20;\n }\n // For single points, add a tick regardless of the relative position\n // (#2662, #6274)\n if (this.single) {\n return [min];\n }\n // Populate the intermediate values\n pos = roundedMin;\n while (pos <= roundedMax) {\n // Place the tick on the rounded value\n tickPositions.push(pos);\n // Always add the raw tickInterval, not the corrected one.\n pos = Axis_correctFloat(pos + tickInterval, precision);\n // If the interval is not big enough in the current min - max range\n // to actually increase the loop variable, we need to break out to\n // prevent endless loop. Issue #619\n if (pos === lastPos) {\n break;\n }\n // Record the last value\n lastPos = pos;\n }\n return tickPositions;\n }\n /**\n * Resolve the new minorTicks/minorTickInterval options into the legacy\n * loosely typed minorTickInterval option.\n *\n * @function Highcharts.Axis#getMinorTickInterval\n *\n * @return {number|\"auto\"|null}\n * Legacy option\n */\n getMinorTickInterval() {\n const { minorTicks, minorTickInterval } = this.options;\n if (minorTicks === true) {\n return Axis_pick(minorTickInterval, 'auto');\n }\n if (minorTicks === false) {\n return;\n }\n return minorTickInterval;\n }\n /**\n * Internal function to return the minor tick positions. For logarithmic\n * axes, the same logic as for major ticks is reused.\n *\n * @function Highcharts.Axis#getMinorTickPositions\n *\n * @return {Array}\n * An array of axis values where ticks should be placed.\n */\n getMinorTickPositions() {\n const axis = this, options = axis.options, tickPositions = axis.tickPositions, minorTickInterval = axis.minorTickInterval, pointRangePadding = axis.pointRangePadding || 0, min = (axis.min || 0) - pointRangePadding, // #1498\n max = (axis.max || 0) + pointRangePadding, // #1498\n range = axis.brokenAxis?.hasBreaks ?\n axis.brokenAxis.unitLength : max - min;\n let minorTickPositions = [], pos;\n // If minor ticks get too dense, they are hard to read, and may cause\n // long running script. So we don't draw them.\n if (range && range / minorTickInterval < axis.len / 3) { // #3875\n const logarithmic = axis.logarithmic;\n if (logarithmic) {\n // For each interval in the major ticks, compute the minor ticks\n // separately.\n this.paddedTicks.forEach(function (_pos, i, paddedTicks) {\n if (i) {\n minorTickPositions.push.apply(minorTickPositions, logarithmic.getLogTickPositions(minorTickInterval, paddedTicks[i - 1], paddedTicks[i], true));\n }\n });\n }\n else if (axis.dateTime &&\n this.getMinorTickInterval() === 'auto') { // #1314\n minorTickPositions = minorTickPositions.concat(axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(minorTickInterval), min, max, options.startOfWeek));\n }\n else {\n for (pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval) {\n // Very, very, tight grid lines (#5771)\n if (pos === minorTickPositions[0]) {\n break;\n }\n minorTickPositions.push(pos);\n }\n }\n }\n if (minorTickPositions.length !== 0) {\n axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n }\n return minorTickPositions;\n }\n /**\n * Adjust the min and max for the minimum range. Keep in mind that the\n * series data is not yet processed, so we don't have information on data\n * cropping and grouping, or updated `axis.pointRange` or\n * `series.pointRange`. The data can't be processed until we have finally\n * established min and max.\n *\n * @private\n * @function Highcharts.Axis#adjustForMinRange\n */\n adjustForMinRange() {\n const axis = this, options = axis.options, logarithmic = axis.logarithmic, time = axis.chart.time;\n let { max, min, minRange } = axis, zoomOffset, spaceAvailable, closestDataRange, minArgs, maxArgs;\n // Set the automatic minimum range based on the closest point distance\n if (axis.isXAxis &&\n typeof minRange === 'undefined' &&\n !logarithmic) {\n if (Axis_defined(options.min) ||\n Axis_defined(options.max) ||\n Axis_defined(options.floor) ||\n Axis_defined(options.ceiling)) {\n // Setting it to null, as opposed to undefined, signals we don't\n // run this block again as per the condition above.\n minRange = null;\n }\n else {\n // Find the closest distance between raw data points, as opposed\n // to closestPointRange that applies to processed points\n // (cropped and grouped)\n closestDataRange = Axis_getClosestDistance(axis.series.map((s) => {\n const xData = s.getColumn('x');\n // If xIncrement, we only need to measure the two first\n // points to get the distance. Saves processing time.\n return s.xIncrement ? xData.slice(0, 2) : xData;\n })) || 0;\n minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n }\n }\n // If minRange is exceeded, adjust\n if (Axis_isNumber(max) &&\n Axis_isNumber(min) &&\n Axis_isNumber(minRange) &&\n max - min < minRange) {\n spaceAvailable =\n axis.dataMax - axis.dataMin >=\n minRange;\n zoomOffset = (minRange - max + min) / 2;\n // If min and max options have been set, don't go beyond it\n minArgs = [\n min - zoomOffset,\n time.parse(options.min) ?? (min - zoomOffset)\n ];\n // If space is available, stay within the data range\n if (spaceAvailable) {\n minArgs[2] = logarithmic ?\n logarithmic.log2lin(axis.dataMin) :\n axis.dataMin;\n }\n min = Axis_arrayMax(minArgs);\n maxArgs = [\n min + minRange,\n time.parse(options.max) ?? (min + minRange)\n ];\n // If space is available, stay within the data range\n if (spaceAvailable) {\n maxArgs[2] = logarithmic ?\n logarithmic.log2lin(axis.dataMax) :\n axis.dataMax;\n }\n max = Axis_arrayMin(maxArgs);\n // Now if the max is adjusted, adjust the min back\n if (max - min < minRange) {\n minArgs[0] = max - minRange;\n minArgs[1] = time.parse(options.min) ?? (max - minRange);\n min = Axis_arrayMax(minArgs);\n }\n }\n // Record modified extremes\n axis.minRange = minRange;\n axis.min = min;\n axis.max = max;\n }\n /**\n * Find the closestPointRange across all series, including the single data\n * series.\n *\n * @private\n * @function Highcharts.Axis#getClosest\n */\n getClosest() {\n let closestSingleDistance, closestDistance;\n if (this.categories) {\n closestDistance = 1;\n }\n else {\n const singleXs = [];\n this.series.forEach(function (series) {\n const seriesClosest = series.closestPointRange, xData = series.getColumn('x');\n if (xData.length === 1) {\n singleXs.push(xData[0]);\n }\n else if (series.sorted &&\n Axis_defined(seriesClosest) &&\n series.reserveSpace()) {\n closestDistance = Axis_defined(closestDistance) ?\n Math.min(closestDistance, seriesClosest) :\n seriesClosest;\n }\n });\n if (singleXs.length) {\n singleXs.sort((a, b) => a - b);\n closestSingleDistance = Axis_getClosestDistance([singleXs]);\n }\n }\n if (closestSingleDistance && closestDistance) {\n return Math.min(closestSingleDistance, closestDistance);\n }\n return closestSingleDistance || closestDistance;\n }\n /**\n * When a point name is given and no x, search for the name in the existing\n * categories, or if categories aren't provided, search names or create a\n * new category (#2522).\n *\n * @private\n * @function Highcharts.Axis#nameToX\n *\n * @param {Highcharts.Point} point\n * The point to inspect.\n *\n * @return {number}\n * The X value that the point is given.\n */\n nameToX(point) {\n const explicitCategories = Axis_isArray(this.options.categories), names = explicitCategories ? this.categories : this.names;\n let nameX = point.options.x, x;\n point.series.requireSorting = false;\n if (!Axis_defined(nameX)) {\n nameX = this.uniqueNames && names ?\n (explicitCategories ?\n names.indexOf(point.name) :\n Axis_pick(names.keys[point.name], -1)) :\n point.series.autoIncrement();\n }\n if (nameX === -1) { // Not found in current categories\n if (!explicitCategories && names) {\n x = names.length;\n }\n }\n else if (Axis_isNumber(nameX)) {\n x = nameX;\n }\n // Write the last point's name to the names array\n if (typeof x !== 'undefined') {\n this.names[x] = point.name;\n // Backwards mapping is much faster than array searching (#7725)\n this.names.keys[point.name] = x;\n }\n else if (point.x) {\n x = point.x; // #17438\n }\n return x;\n }\n /**\n * When changes have been done to series data, update the axis.names.\n *\n * @private\n * @function Highcharts.Axis#updateNames\n */\n updateNames() {\n const axis = this, names = this.names, i = names.length;\n if (i > 0) {\n Object.keys(names.keys).forEach(function (key) {\n delete (names.keys)[key];\n });\n names.length = 0;\n this.minRange = this.userMinRange; // Reset\n (this.series || []).forEach((series) => {\n // Reset incrementer (#5928)\n series.xIncrement = null;\n // When adding a series, points are not yet generated\n if (!series.points || series.isDirtyData) {\n // When we're updating the series with data that is longer\n // than it was, and cropThreshold is passed, we need to make\n // sure that the axis.max is increased _before_ running the\n // premature processData. Otherwise this early iteration of\n // processData will crop the points to axis.max, and the\n // names array will be too short (#5857).\n axis.max = Math.max(axis.max || 0, series.dataTable.rowCount - 1);\n series.processData();\n series.generatePoints();\n }\n const xData = series.getColumn('x').slice();\n series.data.forEach((point, i) => {\n let x = xData[i];\n if (point?.options &&\n typeof point.name !== 'undefined' // #9562\n ) {\n x = axis.nameToX(point);\n if (typeof x !== 'undefined' && x !== point.x) {\n xData[i] = point.x = x;\n }\n }\n });\n series.dataTable.setColumn('x', xData);\n });\n }\n }\n /**\n * Update translation information.\n *\n * @private\n * @function Highcharts.Axis#setAxisTranslation\n *\n * @emits Highcharts.Axis#event:afterSetAxisTranslation\n */\n setAxisTranslation() {\n const axis = this, range = axis.max - axis.min, linkedParent = axis.linkedParent, hasCategories = !!axis.categories, isXAxis = axis.isXAxis;\n let pointRange = axis.axisPointRange || 0, closestPointRange, minPointOffset = 0, pointRangePadding = 0, ordinalCorrection, transA = axis.transA;\n // Adjust translation for padding. Y axis with categories need to go\n // through the same (#1784).\n if (isXAxis || hasCategories || pointRange) {\n // Get the closest points\n closestPointRange = axis.getClosest();\n if (linkedParent) {\n minPointOffset = linkedParent.minPointOffset;\n pointRangePadding = linkedParent.pointRangePadding;\n }\n else {\n axis.series.forEach(function (series) {\n const seriesPointRange = hasCategories ?\n 1 :\n (isXAxis ?\n Axis_pick(series.options.pointRange, closestPointRange, 0) :\n (axis.axisPointRange || 0)), // #2806\n pointPlacement = series.options.pointPlacement;\n pointRange = Math.max(pointRange, seriesPointRange);\n if (!axis.single || hasCategories) {\n // TODO: series should internally set x- and y-\n // pointPlacement to simplify this logic.\n const isPointPlacementAxis = series.is('xrange') ?\n !isXAxis :\n isXAxis;\n // The `minPointOffset` is the value padding to the left\n // of the axis in order to make room for points with a\n // pointRange, typically columns, or line/scatter points\n // on a category axis. When the `pointPlacement` option\n // is 'between' or 'on', this padding does not apply.\n minPointOffset = Math.max(minPointOffset, isPointPlacementAxis && Axis_isString(pointPlacement) ?\n 0 :\n seriesPointRange / 2);\n // Determine the total padding needed to the length of\n // the axis to make room for the pointRange. If the\n // series' pointPlacement is 'on', no padding is added.\n pointRangePadding = Math.max(pointRangePadding, isPointPlacementAxis && pointPlacement === 'on' ?\n 0 :\n seriesPointRange);\n }\n });\n }\n // Record minPointOffset and pointRangePadding\n ordinalCorrection = (axis.ordinal && axis.ordinal.slope && closestPointRange) ?\n axis.ordinal.slope / closestPointRange :\n 1; // #988, #1853\n axis.minPointOffset = minPointOffset =\n minPointOffset * ordinalCorrection;\n axis.pointRangePadding =\n pointRangePadding = pointRangePadding * ordinalCorrection;\n // The `pointRange` is the width reserved for each point, like in a\n // column chart\n axis.pointRange = Math.min(pointRange, axis.single && hasCategories ? 1 : range);\n // The `closestPointRange` is the closest distance between points.\n // In columns it is mostly equal to pointRange, but in lines\n // pointRange is 0 while closestPointRange is some other value\n if (isXAxis && closestPointRange) {\n axis.closestPointRange = closestPointRange;\n }\n }\n // Secondary values\n axis.translationSlope = axis.transA = transA =\n axis.staticScale ||\n axis.len / ((range + pointRangePadding) || 1);\n // Translation addend\n axis.transB = axis.horiz ? axis.left : axis.bottom;\n axis.minPixelPadding = transA * minPointOffset;\n Axis_fireEvent(this, 'afterSetAxisTranslation');\n }\n /**\n * @private\n * @function Highcharts.Axis#minFromRange\n */\n minFromRange() {\n const { max, min } = this;\n return Axis_isNumber(max) && Axis_isNumber(min) && max - min || void 0;\n }\n /**\n * Set the tick positions to round values and optionally extend the extremes\n * to the nearest tick.\n *\n * @private\n * @function Highcharts.Axis#setTickInterval\n *\n * @param {boolean} secondPass\n * TO-DO: parameter description\n *\n * @emits Highcharts.Axis#event:foundExtremes\n */\n setTickInterval(secondPass) {\n const axis = this, { categories, chart, dataMax, dataMin, dateTime, isXAxis, logarithmic, options, softThreshold } = axis, time = chart.time, threshold = Axis_isNumber(axis.threshold) ? axis.threshold : void 0, minRange = axis.minRange || 0, { ceiling, floor, linkedTo, softMax, softMin } = options, linkedParent = Axis_isNumber(linkedTo) && chart[axis.coll]?.[linkedTo], tickPixelIntervalOption = options.tickPixelInterval;\n let maxPadding = options.maxPadding, minPadding = options.minPadding, range = 0, linkedParentExtremes, \n // Only non-negative tickInterval is valid, #12961\n tickIntervalOption = Axis_isNumber(options.tickInterval) && options.tickInterval >= 0 ?\n options.tickInterval : void 0, thresholdMin, thresholdMax, hardMin, hardMax;\n if (!dateTime && !categories && !linkedParent) {\n this.getTickAmount();\n }\n // Min or max set either by zooming/setExtremes or initial options\n hardMin = Axis_pick(axis.userMin, time.parse(options.min));\n hardMax = Axis_pick(axis.userMax, time.parse(options.max));\n // Linked axis gets the extremes from the parent axis\n if (linkedParent) {\n axis.linkedParent = linkedParent;\n linkedParentExtremes = linkedParent.getExtremes();\n axis.min = Axis_pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n axis.max = Axis_pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n if (this.type !== linkedParent.type) {\n // Can't link axes of different type\n Axis_error(11, true, chart);\n }\n // Initial min and max from the extreme data values\n }\n else {\n // Adjust to hard threshold\n if (softThreshold &&\n Axis_defined(threshold) &&\n Axis_isNumber(dataMax) &&\n Axis_isNumber(dataMin)) {\n if (dataMin >= threshold) {\n thresholdMin = threshold;\n minPadding = 0;\n }\n else if (dataMax <= threshold) {\n thresholdMax = threshold;\n maxPadding = 0;\n }\n }\n axis.min = Axis_pick(hardMin, thresholdMin, dataMin);\n axis.max = Axis_pick(hardMax, thresholdMax, dataMax);\n }\n if (Axis_isNumber(axis.max) && Axis_isNumber(axis.min)) {\n if (logarithmic) {\n if (axis.positiveValuesOnly &&\n !secondPass &&\n Math.min(axis.min, Axis_pick(dataMin, axis.min)) <= 0) { // #978\n // Can't plot negative values on log axis\n Axis_error(10, true, chart);\n }\n // The correctFloat cures #934, float errors on full tens. But\n // it was too aggressive for #4360 because of conversion back to\n // lin, therefore use precision 15.\n axis.min = Axis_correctFloat(logarithmic.log2lin(axis.min), 16);\n axis.max = Axis_correctFloat(logarithmic.log2lin(axis.max), 16);\n }\n // Handle zoomed range\n if (axis.range && Axis_isNumber(dataMin)) {\n // #618, #6773:\n axis.userMin = axis.min = hardMin = Math.max(dataMin, axis.minFromRange() || 0);\n axis.userMax = hardMax = axis.max;\n axis.range = void 0; // Don't use it when running setExtremes\n }\n }\n // Hook for Highcharts Stock Scroller and bubble axis padding\n Axis_fireEvent(axis, 'foundExtremes');\n // Adjust min and max for the minimum range\n axis.adjustForMinRange();\n if (Axis_isNumber(axis.min) && Axis_isNumber(axis.max)) {\n // Handle options for floor, ceiling, softMin and softMax (#6359)\n if (!Axis_isNumber(axis.userMin) &&\n Axis_isNumber(softMin) &&\n softMin < axis.min) {\n axis.min = hardMin = softMin; // #6894\n }\n if (!Axis_isNumber(axis.userMax) &&\n Axis_isNumber(softMax) &&\n softMax > axis.max) {\n axis.max = hardMax = softMax; // #6894\n }\n // Pad the values to get clear of the chart's edges. To avoid\n // tickInterval taking the padding into account, we do this after\n // computing tick interval (#1337).\n if (!categories &&\n !axis.axisPointRange &&\n !axis.stacking?.usePercentage &&\n !linkedParent) {\n range = axis.max - axis.min;\n if (range) {\n if (!Axis_defined(hardMin) && minPadding) {\n axis.min -= range * minPadding;\n }\n if (!Axis_defined(hardMax) && maxPadding) {\n axis.max += range * maxPadding;\n }\n }\n }\n if (!Axis_isNumber(axis.userMin) && Axis_isNumber(floor)) {\n axis.min = Math.max(axis.min, floor);\n }\n if (!Axis_isNumber(axis.userMax) && Axis_isNumber(ceiling)) {\n axis.max = Math.min(axis.max, ceiling);\n }\n // When the threshold is soft, adjust the extreme value only if the\n // data extreme and the padded extreme land on either side of the\n // threshold. For example, a series of [0, 1, 2, 3] would make the\n // yAxis add a tick for -1 because of the default `minPadding` and\n // `startOnTick` options. This is prevented by the `softThreshold`\n // option.\n if (softThreshold &&\n Axis_isNumber(dataMin) &&\n Axis_isNumber(dataMax)) {\n const numThreshold = threshold || 0;\n if (!Axis_defined(hardMin) &&\n axis.min < numThreshold &&\n dataMin >= numThreshold) {\n axis.min = options.minRange ?\n Math.min(numThreshold, axis.max - minRange) :\n numThreshold;\n }\n else if (!Axis_defined(hardMax) &&\n axis.max > numThreshold &&\n dataMax <= numThreshold) {\n axis.max = options.minRange ?\n Math.max(numThreshold, axis.min + minRange) :\n numThreshold;\n }\n }\n // If min is bigger than highest, or if max less than lowest value,\n // the chart should not render points. (#14417)\n if (!chart.polar && axis.min > axis.max) {\n if (Axis_defined(options.min)) {\n axis.max = axis.min;\n }\n else if (Axis_defined(options.max)) {\n axis.min = axis.max;\n }\n }\n range = axis.max - axis.min;\n }\n // Get tickInterval\n if (axis.min === axis.max ||\n !Axis_isNumber(axis.min) ||\n !Axis_isNumber(axis.max)) {\n axis.tickInterval = 1;\n }\n else if (linkedParent &&\n !tickIntervalOption &&\n tickPixelIntervalOption === linkedParent.options.tickPixelInterval) {\n axis.tickInterval = tickIntervalOption = linkedParent.tickInterval;\n }\n else {\n axis.tickInterval = Axis_pick(tickIntervalOption, this.tickAmount ?\n range / Math.max(this.tickAmount - 1, 1) :\n void 0, \n // For categorized axis, 1 is default, for linear axis use\n // tickPix\n categories ?\n 1 :\n // Don't let it be more than the data range\n range * tickPixelIntervalOption /\n Math.max(axis.len, tickPixelIntervalOption));\n }\n // Now we're finished detecting min and max, crop and group series data.\n // This is in turn needed in order to find tick positions in ordinal\n // axes.\n if (isXAxis && !secondPass) {\n const hasExtremesChanged = axis.min !== axis.old?.min ||\n axis.max !== axis.old?.max;\n // First process all series assigned to that axis.\n axis.series.forEach(function (series) {\n // Allows filtering out points outside the plot area.\n series.forceCrop = series.forceCropping?.();\n series.processData(hasExtremesChanged);\n });\n // Then apply grouping if needed. The hasExtremesChanged helps to\n // decide if the data grouping should be skipped in the further\n // calculations #16319.\n Axis_fireEvent(this, 'postProcessData', { hasExtremesChanged });\n }\n // Set the translation factor used in translate function\n axis.setAxisTranslation();\n // Hook for ordinal axes and radial axes\n Axis_fireEvent(this, 'initialAxisTranslation');\n // In column-like charts, don't cramp in more ticks than there are\n // points (#1943, #4184)\n if (axis.pointRange && !tickIntervalOption) {\n axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n }\n // Before normalizing the tick interval, handle minimum tick interval.\n // This applies only if tickInterval is not defined.\n const minTickInterval = Axis_pick(options.minTickInterval, \n // In datetime axes, don't go below the data interval, except when\n // there are scatter-like series involved (#13369).\n dateTime &&\n !axis.series.some((s) => !s.sorted) ?\n axis.closestPointRange : 0);\n if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n axis.tickInterval = minTickInterval;\n }\n // For linear axes, normalize the interval\n if (!dateTime && !logarithmic && !tickIntervalOption) {\n axis.tickInterval = getNormalizedTickInterval(axis, axis.tickInterval);\n }\n // Prevent ticks from getting so close that we can't draw the labels\n if (!this.tickAmount) {\n axis.tickInterval = axis.unsquish();\n }\n this.setTickPositions();\n }\n /**\n * Now we have computed the normalized tickInterval, get the tick positions.\n *\n * @private\n * @function Highcharts.Axis#setTickPositions\n *\n * @emits Highcharts.Axis#event:afterSetTickPositions\n */\n setTickPositions() {\n const axis = this, options = this.options, tickPositionsOption = options.tickPositions, tickPositioner = options.tickPositioner, minorTickIntervalOption = this.getMinorTickInterval(), allowEndOnTick = !this.isPanning, startOnTick = allowEndOnTick && options.startOnTick, endOnTick = allowEndOnTick && options.endOnTick;\n let tickPositions = [], tickPositionerResult;\n // Set the tickmarkOffset\n this.tickmarkOffset = (this.categories &&\n options.tickmarkPlacement === 'between' &&\n this.tickInterval === 1) ? 0.5 : 0; // #3202\n // When there is only one point, or all points have the same value on\n // this axis, then min and max are equal and tickPositions.length is 0\n // or 1. In this case, add some padding in order to center the point,\n // but leave it with one tick. #1337.\n this.single =\n this.min === this.max &&\n Axis_defined(this.min) &&\n !this.tickAmount &&\n (\n // Data is on integer (#6563)\n this.min % 1 === 0 ||\n // Between integers and decimals are not allowed (#6274)\n options.allowDecimals !== false);\n /**\n * Contains the current positions that are laid out on the axis. The\n * positions are numbers in terms of axis values. In a category axis\n * they are integers, in a datetime axis they are also integers, but\n * designating milliseconds.\n *\n * This property is read only - for modifying the tick positions, use\n * the `tickPositioner` callback or [axis.tickPositions(\n * https://api.highcharts.com/highcharts/xAxis.tickPositions) option\n * instead.\n *\n * @name Highcharts.Axis#tickPositions\n * @type {Highcharts.AxisTickPositionsArray|undefined}\n */\n if (tickPositionsOption) {\n // Find the tick positions. Work on a copy (#1565)\n tickPositions = tickPositionsOption.slice();\n }\n else if (Axis_isNumber(this.min) && Axis_isNumber(this.max)) {\n // Too many ticks (#6405). Create a friendly warning and provide two\n // ticks so at least we can show the data series.\n if (!axis.ordinal?.positions &&\n ((this.max - this.min) /\n this.tickInterval >\n Math.max(2 * this.len, 200))) {\n tickPositions = [this.min, this.max];\n Axis_error(19, false, this.chart);\n }\n else if (axis.dateTime) {\n tickPositions = axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(this.tickInterval, options.units), this.min, this.max, options.startOfWeek, axis.ordinal?.positions, this.closestPointRange, true);\n }\n else if (axis.logarithmic) {\n tickPositions = axis.logarithmic.getLogTickPositions(this.tickInterval, this.min, this.max);\n }\n else {\n const startingTickInterval = this.tickInterval;\n let adjustedTickInterval = startingTickInterval;\n while (adjustedTickInterval <= startingTickInterval * 2) {\n tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);\n // If there are more tick positions than the set tickAmount,\n // increase the tickInterval and continue until it fits.\n // (#17100)\n if (this.tickAmount &&\n tickPositions.length > this.tickAmount) {\n this.tickInterval = getNormalizedTickInterval(this, adjustedTickInterval *= 1.1);\n }\n else {\n break;\n }\n }\n }\n // Too dense ticks, keep only the first and last (#4477)\n if (tickPositions.length > this.len) {\n tickPositions = [\n tickPositions[0],\n tickPositions[tickPositions.length - 1]\n ];\n // Reduce doubled value (#7339)\n if (tickPositions[0] === tickPositions[1]) {\n tickPositions.length = 1;\n }\n }\n // Run the tick positioner callback, that allows modifying auto tick\n // positions.\n if (tickPositioner) {\n // Make it available to the positioner\n this.tickPositions = tickPositions;\n tickPositionerResult = tickPositioner.apply(axis, [this.min, this.max]);\n if (tickPositionerResult) {\n tickPositions = tickPositionerResult;\n }\n }\n }\n this.tickPositions = tickPositions;\n // Get minorTickInterval\n this.minorTickInterval =\n minorTickIntervalOption === 'auto' && this.tickInterval ?\n this.tickInterval / options.minorTicksPerMajor :\n minorTickIntervalOption;\n // Reset min/max or remove extremes based on start/end on tick\n this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n this.trimTicks(tickPositions, startOnTick, endOnTick);\n if (!this.isLinked && Axis_isNumber(this.min) && Axis_isNumber(this.max)) {\n // Substract half a unit (#2619, #2846, #2515, #3390), but not in\n // case of multiple ticks (#6897)\n if (this.single &&\n tickPositions.length < 2 &&\n !this.categories &&\n !this.series.some((s) => (s.is('heatmap') && s.options.pointPlacement === 'between'))) {\n this.min -= 0.5;\n this.max += 0.5;\n }\n if (!tickPositionsOption && !tickPositionerResult) {\n this.adjustTickAmount();\n }\n }\n Axis_fireEvent(this, 'afterSetTickPositions');\n }\n /**\n * Handle startOnTick and endOnTick by either adapting to padding min/max or\n * rounded min/max. Also handle single data points.\n *\n * @private\n * @function Highcharts.Axis#trimTicks\n *\n * @param {Array} tickPositions\n * TO-DO: parameter description\n *\n * @param {boolean} [startOnTick]\n * TO-DO: parameter description\n *\n * @param {boolean} [endOnTick]\n * TO-DO: parameter description\n */\n trimTicks(tickPositions, startOnTick, endOnTick) {\n const roundedMin = tickPositions[0], roundedMax = tickPositions[tickPositions.length - 1], minPointOffset = (!this.isOrdinal && this.minPointOffset) || 0; // (#12716)\n Axis_fireEvent(this, 'trimTicks');\n if (!this.isLinked) {\n if (startOnTick && roundedMin !== -Infinity) { // #6502\n this.min = roundedMin;\n }\n else {\n while (this.min - minPointOffset > tickPositions[0]) {\n tickPositions.shift();\n }\n }\n if (endOnTick) {\n this.max = roundedMax;\n }\n else {\n while (this.max + minPointOffset <\n tickPositions[tickPositions.length - 1]) {\n tickPositions.pop();\n }\n }\n // If no tick are left, set one tick in the middle (#3195)\n if (tickPositions.length === 0 &&\n Axis_defined(roundedMin) &&\n !this.options.tickPositions) {\n tickPositions.push((roundedMax + roundedMin) / 2);\n }\n }\n }\n /**\n * Check if there are multiple axes in the same pane.\n *\n * @private\n * @function Highcharts.Axis#alignToOthers\n *\n * @return {boolean|undefined}\n * True if there are other axes.\n */\n alignToOthers() {\n const axis = this, chart = axis.chart, alignedAxes = [this], options = axis.options, chartOptions = chart.options.chart, alignThresholds = (this.coll === 'yAxis' &&\n chartOptions.alignThresholds), thresholdAlignments = [];\n let hasOther;\n axis.thresholdAlignment = void 0;\n if ((\n // Only if alignTicks or alignThresholds is true\n (chartOptions.alignTicks !== false && options.alignTicks) ||\n alignThresholds) &&\n // Disabled when startOnTick or endOnTick are false (#7604)\n options.startOnTick !== false &&\n options.endOnTick !== false &&\n // Don't try to align ticks on a log axis, they are not evenly\n // spaced (#6021)\n !axis.logarithmic) {\n // Get a key identifying which pane the axis belongs to\n const getKey = (axis) => {\n const { horiz, options } = axis;\n return [\n horiz ? options.left : options.top,\n options.width,\n options.height,\n options.pane\n ].join(',');\n };\n const thisKey = getKey(this);\n chart[this.coll].forEach(function (otherAxis) {\n const { series } = otherAxis;\n if (\n // #4442\n series.length &&\n series.some((s) => s.visible) &&\n otherAxis !== axis &&\n getKey(otherAxis) === thisKey) {\n hasOther = true; // #4201\n alignedAxes.push(otherAxis);\n }\n });\n }\n if (hasOther && alignThresholds) {\n // Handle alignThresholds. The `thresholdAlignments` array keeps\n // records of where each axis in the group wants its threshold, from\n // 0 which is on `axis.min`, to 1 which is on `axis.max`.\n alignedAxes.forEach((otherAxis) => {\n const threshAlign = otherAxis.getThresholdAlignment(axis);\n if (Axis_isNumber(threshAlign)) {\n thresholdAlignments.push(threshAlign);\n }\n });\n // For each of the axes in the group, record the average\n // `thresholdAlignment`.\n const thresholdAlignment = thresholdAlignments.length > 1 ?\n thresholdAlignments.reduce((sum, n) => (sum += n), 0) / thresholdAlignments.length :\n void 0;\n alignedAxes.forEach((axis) => {\n axis.thresholdAlignment = thresholdAlignment;\n });\n }\n return hasOther;\n }\n /**\n * Where the axis wants its threshold, from 0 which is on `axis.min`, to 1 which\n * is on `axis.max`.\n *\n * @private\n * @function Highcharts.Axis#getThresholdAlignment\n */\n getThresholdAlignment(callerAxis) {\n if (!Axis_isNumber(this.dataMin) ||\n (this !== callerAxis &&\n this.series.some((s) => (s.isDirty || s.isDirtyData)))) {\n this.getSeriesExtremes();\n }\n if (Axis_isNumber(this.threshold)) {\n let thresholdAlignment = Axis_clamp(((this.threshold - (this.dataMin || 0)) /\n ((this.dataMax || 0) - (this.dataMin || 0))), 0, 1);\n if (this.options.reversed) {\n thresholdAlignment = 1 - thresholdAlignment;\n }\n return thresholdAlignment;\n }\n }\n /**\n * Find the max ticks of either the x and y axis collection, and record it\n * in `this.tickAmount`.\n *\n * @private\n * @function Highcharts.Axis#getTickAmount\n */\n getTickAmount() {\n const axis = this, options = this.options, tickPixelInterval = options.tickPixelInterval;\n let tickAmount = options.tickAmount;\n if (!Axis_defined(options.tickInterval) &&\n !tickAmount &&\n this.len < tickPixelInterval &&\n !this.isRadial &&\n !axis.logarithmic &&\n options.startOnTick &&\n options.endOnTick) {\n tickAmount = 2;\n }\n if (!tickAmount && this.alignToOthers()) {\n // Add 1 because 4 tick intervals require 5 ticks (including first\n // and last)\n tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n }\n // For tick amounts of 2 and 3, compute five ticks and remove the\n // intermediate ones. This prevents the axis from adding ticks that are\n // too far away from the data extremes.\n if (tickAmount < 4) {\n this.finalTickAmt = tickAmount;\n tickAmount = 5;\n }\n this.tickAmount = tickAmount;\n }\n /**\n * When using multiple axes, adjust the number of ticks to match the highest\n * number of ticks in that group.\n *\n * @private\n * @function Highcharts.Axis#adjustTickAmount\n */\n adjustTickAmount() {\n const axis = this, { finalTickAmt, max, min, options, tickPositions, tickAmount, thresholdAlignment } = axis, currentTickAmount = tickPositions?.length, threshold = Axis_pick(axis.threshold, axis.softThreshold ? 0 : null);\n let len, i, tickInterval = axis.tickInterval, thresholdTickIndex;\n const \n // Extend the tickPositions by appending a position\n append = () => tickPositions.push(Axis_correctFloat(tickPositions[tickPositions.length - 1] +\n tickInterval)), \n // Extend the tickPositions by prepending a position\n prepend = () => tickPositions.unshift(Axis_correctFloat(tickPositions[0] - tickInterval));\n // If `thresholdAlignment` is a number, it means the `alignThresholds`\n // option is true. The `thresholdAlignment` is a scalar value between 0\n // and 1 for where the threshold should be relative to `axis.min` and\n // `axis.max`. Now that we know the tick amount, convert this to the\n // tick index. Unless `thresholdAlignment` is exactly 0 or 1, avoid the\n // first or last tick because that would lead to series being clipped.\n if (Axis_isNumber(thresholdAlignment)) {\n thresholdTickIndex = thresholdAlignment < 0.5 ?\n Math.ceil(thresholdAlignment * (tickAmount - 1)) :\n Math.floor(thresholdAlignment * (tickAmount - 1));\n if (options.reversed) {\n thresholdTickIndex = tickAmount - 1 - thresholdTickIndex;\n }\n }\n if (axis.hasData() && Axis_isNumber(min) && Axis_isNumber(max)) { // #14769\n // Adjust extremes and translation to the modified tick positions\n const adjustExtremes = () => {\n axis.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n // Do not crop when ticks are not extremes (#9841)\n axis.min = options.startOnTick ?\n tickPositions[0] :\n Math.min(min, tickPositions[0]);\n axis.max = options.endOnTick ?\n tickPositions[tickPositions.length - 1] :\n Math.max(max, tickPositions[tickPositions.length - 1]);\n };\n // When the axis is subject to the alignThresholds option. Use\n // axis.threshold because the local threshold includes the\n // `softThreshold`.\n if (Axis_isNumber(thresholdTickIndex) && Axis_isNumber(axis.threshold)) {\n // Throw away the previously computed tickPositions and start\n // from scratch with only the threshold itself, then add ticks\n // below the threshold first, then fill up above the threshold.\n // If we are not able to fill up to axis.max, double the\n // tickInterval and run again.\n while (tickPositions[thresholdTickIndex] !== threshold ||\n tickPositions.length !== tickAmount ||\n tickPositions[0] > min ||\n tickPositions[tickPositions.length - 1] < max) {\n tickPositions.length = 0;\n tickPositions.push(axis.threshold);\n while (tickPositions.length < tickAmount) {\n if (\n // Start by prepending positions until the threshold\n // is at the required index...\n tickPositions[thresholdTickIndex] === void 0 ||\n tickPositions[thresholdTickIndex] > axis.threshold) {\n prepend();\n }\n else {\n // ... then append positions until we have the\n // required length\n append();\n }\n }\n // Safety vent\n if (tickInterval > axis.tickInterval * 8) {\n break;\n }\n tickInterval *= 2;\n }\n adjustExtremes();\n }\n else if (currentTickAmount < tickAmount) {\n while (tickPositions.length < tickAmount) {\n // Extend evenly for both sides unless we're on the\n // threshold (#3965)\n if (tickPositions.length % 2 || min === threshold) {\n append();\n }\n else {\n prepend();\n }\n }\n adjustExtremes();\n }\n // The finalTickAmt property is set in getTickAmount\n if (Axis_defined(finalTickAmt)) {\n i = len = tickPositions.length;\n while (i--) {\n if (\n // Remove every other tick\n (finalTickAmt === 3 && i % 2 === 1) ||\n // Remove all but first and last\n (finalTickAmt <= 2 && i > 0 && i < len - 1)) {\n tickPositions.splice(i, 1);\n }\n }\n axis.finalTickAmt = void 0;\n }\n }\n }\n /**\n * Set the scale based on data min and max, user set min and max or options.\n *\n * @private\n * @function Highcharts.Axis#setScale\n *\n * @emits Highcharts.Axis#event:afterSetScale\n */\n setScale() {\n const axis = this, { coll, stacking } = axis;\n let isDirtyData = false, isXAxisDirty = false;\n axis.series.forEach((series) => {\n isDirtyData = isDirtyData || series.isDirtyData || series.isDirty;\n // When x axis is dirty, we need new data extremes for y as\n // well:\n isXAxisDirty = (isXAxisDirty ||\n (series.xAxis && series.xAxis.isDirty) ||\n false);\n });\n // Set the new axisLength\n axis.setAxisSize();\n const isDirtyAxisLength = axis.len !== (axis.old && axis.old.len);\n // Do we really need to go through all this?\n if (isDirtyAxisLength ||\n isDirtyData ||\n isXAxisDirty ||\n axis.isLinked ||\n axis.forceRedraw ||\n axis.userMin !== (axis.old && axis.old.userMin) ||\n axis.userMax !== (axis.old && axis.old.userMax) ||\n axis.alignToOthers()) {\n if (stacking && coll === 'yAxis') {\n stacking.buildStacks();\n }\n axis.forceRedraw = false;\n // #18066 delete minRange property to ensure that it will be\n // calculated again after dirty data in series\n if (!axis.userMinRange) {\n axis.minRange = void 0;\n }\n // Get data extremes if needed\n axis.getSeriesExtremes();\n // Get fixed positions based on tickInterval\n axis.setTickInterval();\n if (stacking && coll === 'xAxis') {\n stacking.buildStacks();\n }\n // Mark as dirty if it is not already set to dirty and extremes have\n // changed. #595.\n if (!axis.isDirty) {\n axis.isDirty =\n isDirtyAxisLength ||\n axis.min !== axis.old?.min ||\n axis.max !== axis.old?.max;\n }\n }\n else if (stacking) {\n stacking.cleanStacks();\n }\n // Recalculate all extremes object when the data has changed. It is\n // required when vertical panning is enabled.\n if (isDirtyData) {\n delete axis.allExtremes;\n }\n Axis_fireEvent(this, 'afterSetScale');\n }\n /**\n * Set the minimum and maximum of the axes after render time. If the\n * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n * values are rounded off to the nearest tick. To prevent this, these\n * options can be set to false before calling setExtremes. Also, setExtremes\n * will not allow a range lower than the `minRange` option, which by default\n * is the range of five points.\n *\n * @sample highcharts/members/axis-setextremes/\n * Set extremes from a button\n * @sample highcharts/members/axis-setextremes-datetime/\n * Set extremes on a datetime axis\n * @sample highcharts/members/axis-setextremes-off-ticks/\n * Set extremes off ticks\n * @sample stock/members/axis-setextremes/\n * Set extremes in Highcharts Stock\n *\n * @function Highcharts.Axis#setExtremes\n *\n * @param {number|string} [newMin]\n * The new minimum value. For datetime axes, date strings are accepted.\n *\n * @param {number|string} [newMax]\n * The new maximum value. For datetime axes, date strings are accepted.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call to\n * {@link Highcharts.Chart#redraw}\n *\n * @param {boolean|Partial} [animation=true]\n * Enable or modify animations.\n *\n * @param {*} [eventArguments]\n * Arguments to be accessed in event handler.\n *\n * @emits Highcharts.Axis#event:setExtremes\n */\n setExtremes(min, max, redraw = true, animation, eventArguments) {\n const chart = this.chart;\n this.series.forEach((serie) => {\n delete serie.kdTree;\n });\n min = chart.time.parse(min);\n max = chart.time.parse(max);\n // Extend the arguments with min and max\n eventArguments = Axis_extend(eventArguments, { min, max });\n // Fire the event\n Axis_fireEvent(this, 'setExtremes', eventArguments, (e) => {\n this.userMin = e.min;\n this.userMax = e.max;\n this.eventArgs = e;\n if (redraw) {\n chart.redraw(animation);\n }\n });\n }\n /**\n * Update the axis metrics.\n *\n * @private\n * @function Highcharts.Axis#setAxisSize\n */\n setAxisSize() {\n const chart = this.chart, options = this.options, \n // [top, right, bottom, left]\n offsets = options.offsets || [0, 0, 0, 0], horiz = this.horiz, \n // Check for percentage based input values. Rounding fixes problems\n // with column overflow and plot line filtering (#4898, #4899)\n width = this.width = Math.round(Axis_relativeLength(Axis_pick(options.width, chart.plotWidth - offsets[3] + offsets[1]), chart.plotWidth)), height = this.height = Math.round(Axis_relativeLength(Axis_pick(options.height, chart.plotHeight - offsets[0] + offsets[2]), chart.plotHeight)), top = this.top = Math.round(Axis_relativeLength(Axis_pick(options.top, chart.plotTop + offsets[0]), chart.plotHeight, chart.plotTop)), left = this.left = Math.round(Axis_relativeLength(Axis_pick(options.left, chart.plotLeft + offsets[3]), chart.plotWidth, chart.plotLeft));\n // Expose basic values to use in Series object and navigator\n this.bottom = chart.chartHeight - height - top;\n this.right = chart.chartWidth - width - left;\n // Direction agnostic properties\n this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n /**\n * The position of the axis in terms of pixels, compared to the chart\n * edge. In a horizontal axis it is the same as `chart.plotLeft` unless\n * the axis is explicitly positioned, and in a default vertical axis it\n * is the same as `chart.plotTop`.\n *\n * @name Highcharts.Axis#pos\n * @type {number}\n */\n this.pos = horiz ? left : top; // Distance from SVG origin\n }\n /**\n * Get the current extremes for the axis.\n *\n * @sample highcharts/members/axis-getextremes/\n * Report extremes by click on a button\n *\n * @function Highcharts.Axis#getExtremes\n *\n * @return {Highcharts.ExtremesObject}\n * An object containing extremes information.\n */\n getExtremes() {\n const axis = this, log = axis.logarithmic;\n return {\n min: log ?\n Axis_correctFloat(log.lin2log(axis.min)) :\n axis.min,\n max: log ?\n Axis_correctFloat(log.lin2log(axis.max)) :\n axis.max,\n dataMin: axis.dataMin,\n dataMax: axis.dataMax,\n userMin: axis.userMin,\n userMax: axis.userMax\n };\n }\n /**\n * Get the zero plane either based on zero or on the min or max value.\n * Used in bar and area plots.\n *\n * @function Highcharts.Axis#getThreshold\n *\n * @param {number} threshold\n * The threshold in axis values.\n *\n * @return {number}\n * The translated threshold position in terms of pixels, and corrected to\n * stay within the axis bounds.\n */\n getThreshold(threshold) {\n const axis = this, log = axis.logarithmic, realMin = log ? log.lin2log(axis.min) : axis.min, realMax = log ? log.lin2log(axis.max) : axis.max;\n if (threshold === null || threshold === -Infinity) {\n threshold = realMin;\n }\n else if (threshold === Infinity) {\n threshold = realMax;\n }\n else if (realMin > threshold) {\n threshold = realMin;\n }\n else if (realMax < threshold) {\n threshold = realMax;\n }\n return axis.translate(threshold, 0, 1, 0, 1);\n }\n /**\n * Compute auto alignment for the axis label based on which side the axis is\n * on and the given rotation for the label.\n *\n * @private\n * @function Highcharts.Axis#autoLabelAlign\n *\n * @param {number} rotation\n * The rotation in degrees as set by either the `rotation` or `autoRotation`\n * options.\n *\n * @return {Highcharts.AlignValue}\n * Can be `\"center\"`, `\"left\"` or `\"right\"`.\n */\n autoLabelAlign(rotation) {\n const angle = (Axis_pick(rotation, 0) - (this.side * 90) + 720) % 360, evt = { align: 'center' };\n Axis_fireEvent(this, 'autoLabelAlign', evt, function (e) {\n if (angle > 15 && angle < 165) {\n e.align = 'right';\n }\n else if (angle > 195 && angle < 345) {\n e.align = 'left';\n }\n });\n return evt.align;\n }\n /**\n * Get the tick length and width for the axis based on axis options.\n *\n * @private\n * @function Highcharts.Axis#tickSize\n *\n * @param {string} [prefix]\n * 'tick' or 'minorTick'\n *\n * @return {Array|undefined}\n * An array of tickLength and tickWidth\n */\n tickSize(prefix) {\n const options = this.options, tickWidth = Axis_pick(options[prefix === 'tick' ? 'tickWidth' : 'minorTickWidth'], \n // Default to 1 on linear and datetime X axes\n prefix === 'tick' && this.isXAxis && !this.categories ? 1 : 0);\n let tickLength = options[prefix === 'tick' ? 'tickLength' : 'minorTickLength'], tickSize;\n if (tickWidth && tickLength) {\n // Negate the length\n if (options[prefix + 'Position'] === 'inside') {\n tickLength = -tickLength;\n }\n tickSize = [tickLength, tickWidth];\n }\n const e = { tickSize };\n Axis_fireEvent(this, 'afterTickSize', e);\n return e.tickSize;\n }\n /**\n * Return the size of the labels.\n *\n * @private\n * @function Highcharts.Axis#labelMetrics\n */\n labelMetrics() {\n const renderer = this.chart.renderer, ticks = this.ticks, tick = ticks[Object.keys(ticks)[0]] || {};\n return this.chart.renderer.fontMetrics(tick.label ||\n tick.movedLabel ||\n renderer.box);\n }\n /**\n * Prevent the ticks from getting so close we can't draw the labels. On a\n * horizontal axis, this is handled by rotating the labels, removing ticks\n * and adding ellipsis. On a vertical axis remove ticks and add ellipsis.\n *\n * @private\n * @function Highcharts.Axis#unsquish\n */\n unsquish() {\n const labelOptions = this.options.labels, padding = labelOptions.padding || 0, horiz = this.horiz, tickInterval = this.tickInterval, slotSize = this.len / (((this.categories ? 1 : 0) +\n this.max -\n this.min) /\n tickInterval), rotationOption = labelOptions.rotation, \n // We don't know the actual rendered line height at this point, but\n // it defaults to 0.8em\n lineHeight = Axis_correctFloat(this.labelMetrics().h * 0.8), range = Math.max(this.max - this.min, 0), \n // Return the multiple of tickInterval that is needed to avoid\n // collision\n getStep = function (spaceNeeded) {\n let step = (spaceNeeded + 2 * padding) / (slotSize || 1);\n step = step > 1 ? Math.ceil(step) : 1;\n // Guard for very small or negative angles (#9835)\n if (step * tickInterval > range &&\n spaceNeeded !== Infinity &&\n slotSize !== Infinity &&\n range) {\n step = Math.ceil(range / tickInterval);\n }\n return Axis_correctFloat(step * tickInterval);\n };\n let newTickInterval = tickInterval, rotation, bestScore = Number.MAX_VALUE, autoRotation;\n if (horiz) {\n if (!labelOptions.staggerLines) {\n if (Axis_isNumber(rotationOption)) {\n autoRotation = [rotationOption];\n }\n else if (slotSize < labelOptions.autoRotationLimit) {\n autoRotation = labelOptions.autoRotation;\n }\n }\n if (autoRotation) {\n let step, score;\n // Loop over the given autoRotation options, and determine which\n // gives the best score. The best score is that with the lowest\n // number of steps and a rotation closest to horizontal.\n for (const rot of autoRotation) {\n if (rot === rotationOption ||\n (rot && rot >= -90 && rot <= 90)) { // #3891\n step = getStep(Math.abs(lineHeight / Math.sin(Axis_deg2rad * rot)));\n score = step + Math.abs(rot / 360);\n if (score < bestScore) {\n bestScore = score;\n rotation = rot;\n newTickInterval = step;\n }\n }\n }\n }\n }\n else { // #4411\n newTickInterval = getStep(lineHeight * 0.75);\n }\n this.autoRotation = autoRotation;\n this.labelRotation = Axis_pick(rotation, Axis_isNumber(rotationOption) ? rotationOption : 0);\n return labelOptions.step ? tickInterval : newTickInterval;\n }\n /**\n * Get the general slot width for labels/categories on this axis. This may\n * change between the pre-render (from Axis.getOffset) and the final tick\n * rendering and placement.\n *\n * @private\n * @function Highcharts.Axis#getSlotWidth\n *\n * @param {Highcharts.Tick} [tick] Optionally, calculate the slot width\n * basing on tick label. It is used in highcharts-3d module, where the slots\n * has different widths depending on perspective angles.\n *\n * @return {number}\n * The pixel width allocated to each axis label.\n */\n getSlotWidth(tick) {\n // #5086, #1580, #1931\n const chart = this.chart, horiz = this.horiz, labelOptions = this.options.labels, slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), marginLeft = chart.margin[3];\n // Used by grid axis\n if (tick && Axis_isNumber(tick.slotWidth)) { // #13221, can be 0\n return tick.slotWidth;\n }\n if (horiz && labelOptions.step < 2 && !this.isRadial) {\n if (labelOptions.rotation) { // #4415\n return 0;\n }\n return ((this.staggerLines || 1) * this.len) / slotCount;\n }\n if (!horiz) {\n // #7028\n const cssWidth = labelOptions.style.width;\n if (cssWidth !== void 0) {\n return parseInt(String(cssWidth), 10);\n }\n if (marginLeft) {\n return marginLeft - chart.spacing[3];\n }\n }\n // Last resort, a fraction of the available size\n return chart.chartWidth * 0.33;\n }\n /**\n * Render the axis labels and determine whether ellipsis or rotation need to\n * be applied.\n *\n * @private\n * @function Highcharts.Axis#renderUnsquish\n */\n renderUnsquish() {\n const chart = this.chart, renderer = chart.renderer, tickPositions = this.tickPositions, ticks = this.ticks, labelOptions = this.options.labels, labelStyleOptions = labelOptions.style, horiz = this.horiz, slotWidth = this.getSlotWidth(), innerWidth = Math.max(1, Math.round(slotWidth - (horiz ?\n 2 * (labelOptions.padding || 0) :\n labelOptions.distance || 0 // #21172\n ))), attr = {}, labelMetrics = this.labelMetrics(), lineClampOption = labelStyleOptions.lineClamp;\n let commonWidth, lineClamp = lineClampOption ?? (Math.floor(this.len / (tickPositions.length * labelMetrics.h)) || 1), maxLabelLength = 0;\n // Set rotation option unless it is \"auto\", like in gauges\n if (!Axis_isString(labelOptions.rotation)) {\n // #4443\n attr.rotation = labelOptions.rotation || 0;\n }\n // Get the longest label length\n tickPositions.forEach(function (tickPosition) {\n const tick = ticks[tickPosition];\n // Replace label - sorting animation\n if (tick.movedLabel) {\n tick.replaceMovedLabel();\n }\n const textPxLength = tick.label?.textPxLength || 0;\n if (textPxLength > maxLabelLength) {\n maxLabelLength = textPxLength;\n }\n });\n this.maxLabelLength = maxLabelLength;\n // Handle auto rotation on horizontal axis\n if (this.autoRotation) {\n // Apply rotation only if the label is too wide for the slot, and\n // the label is wider than its height.\n if (maxLabelLength > innerWidth &&\n maxLabelLength > labelMetrics.h) {\n attr.rotation = this.labelRotation;\n }\n else {\n this.labelRotation = 0;\n }\n // Handle word-wrap or ellipsis on vertical axis\n }\n else if (slotWidth) {\n // For word-wrap or ellipsis\n commonWidth = innerWidth;\n }\n // Add ellipsis if the label length is significantly longer than ideal\n if (attr.rotation) {\n commonWidth = (maxLabelLength > chart.chartHeight * 0.5 ?\n chart.chartHeight * 0.33 :\n maxLabelLength);\n if (!lineClampOption) {\n lineClamp = 1;\n }\n }\n // Set the explicit or automatic label alignment\n this.labelAlign = labelOptions.align ||\n this.autoLabelAlign(this.labelRotation);\n if (this.labelAlign) {\n attr.align = this.labelAlign;\n }\n // Apply general and specific CSS\n tickPositions.forEach(function (pos) {\n const tick = ticks[pos], label = tick && tick.label, widthOption = labelStyleOptions.width, css = {};\n if (label) {\n // This needs to go before the CSS in old IE (#4502)\n label.attr(attr);\n if (tick.shortenLabel) {\n tick.shortenLabel();\n }\n else if (commonWidth &&\n !widthOption &&\n // Setting width in this case messes with the bounding box\n // (#7975)\n labelStyleOptions.whiteSpace !== 'nowrap' &&\n (\n // Speed optimizing, #7656\n commonWidth < (label.textPxLength || 0) ||\n // Resetting CSS, #4928\n label.element.tagName === 'SPAN')) {\n label.css(Axis_extend(css, {\n width: `${commonWidth}px`,\n lineClamp\n }));\n // Reset previously shortened label (#8210)\n }\n else if (label.styles.width && !css.width && !widthOption) {\n label.css({ width: 'auto' });\n }\n tick.rotation = attr.rotation;\n }\n }, this);\n // Note: Why is this not part of getLabelPosition?\n this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n }\n /**\n * Return true if the axis has associated data.\n *\n * @function Highcharts.Axis#hasData\n *\n * @return {boolean}\n * True if the axis has associated visible series and those series have\n * either valid data points or explicit `min` and `max` settings.\n */\n hasData() {\n return this.series.some(function (s) {\n return s.hasData();\n }) ||\n (this.options.showEmpty &&\n Axis_defined(this.min) &&\n Axis_defined(this.max));\n }\n /**\n * Adds the title defined in axis.options.title.\n *\n * @function Highcharts.Axis#addTitle\n *\n * @param {boolean} [display]\n * Whether or not to display the title.\n */\n addTitle(display) {\n const axis = this, renderer = axis.chart.renderer, horiz = axis.horiz, opposite = axis.opposite, options = axis.options, axisTitleOptions = options.title, styledMode = axis.chart.styledMode;\n let textAlign;\n if (!axis.axisTitle) {\n textAlign = axisTitleOptions.textAlign;\n if (!textAlign) {\n textAlign = (horiz ? {\n low: 'left',\n middle: 'center',\n high: 'right'\n } : {\n low: opposite ? 'right' : 'left',\n middle: 'center',\n high: opposite ? 'left' : 'right'\n })[axisTitleOptions.align];\n }\n axis.axisTitle = renderer\n .text(axisTitleOptions.text || '', 0, 0, axisTitleOptions.useHTML)\n .attr({\n zIndex: 7,\n rotation: axisTitleOptions.rotation || 0,\n align: textAlign\n })\n .addClass('highcharts-axis-title');\n // #7814, don't mutate style option\n if (!styledMode) {\n axis.axisTitle.css(Axis_merge(axisTitleOptions.style));\n }\n axis.axisTitle.add(axis.axisGroup);\n axis.axisTitle.isNew = true;\n }\n // Max width defaults to the length of the axis\n if (!styledMode &&\n !axisTitleOptions.style.width &&\n !axis.isRadial) {\n axis.axisTitle.css({\n width: axis.len + 'px'\n });\n }\n // Hide or show the title depending on whether showEmpty is set\n axis.axisTitle[display ? 'show' : 'hide'](display);\n }\n /**\n * Generates a tick for initial positioning.\n *\n * @private\n * @function Highcharts.Axis#generateTick\n *\n * @param {number} pos\n * The tick position in axis values.\n *\n * @param {number} [i]\n * The index of the tick in {@link Axis.tickPositions}.\n */\n generateTick(pos) {\n const axis = this, ticks = axis.ticks;\n if (!ticks[pos]) {\n ticks[pos] = new Axis_Tick(axis, pos);\n }\n else {\n ticks[pos].addLabel(); // Update labels depending on tick interval\n }\n }\n /**\n * Create the axisGroup and gridGroup elements on first iteration.\n *\n * @private\n * @function Highcharts.Axis#getOffset\n *\n * @emits Highcharts.Axis#event:afterGetOffset\n */\n createGroups() {\n const { axisParent, // Used in color axis\n chart, coll, options } = this, renderer = chart.renderer;\n const createGroup = (name, suffix, zIndex) => renderer.g(name)\n .attr({ zIndex })\n .addClass(`highcharts-${coll.toLowerCase()}${suffix} ` +\n (this.isRadial ? `highcharts-radial-axis${suffix} ` : '') +\n (options.className || ''))\n .add(axisParent);\n if (!this.axisGroup) {\n this.gridGroup = createGroup('grid', '-grid', options.gridZIndex);\n this.axisGroup = createGroup('axis', '', options.zIndex);\n this.labelGroup = createGroup('axis-labels', '-labels', options.labels.zIndex);\n }\n }\n /**\n * Render the tick labels to a preliminary position to get their sizes\n *\n * @private\n * @function Highcharts.Axis#getOffset\n *\n * @emits Highcharts.Axis#event:afterGetOffset\n */\n getOffset() {\n const axis = this, { chart, horiz, options, side, ticks, tickPositions, coll } = axis, invertedSide = (chart.inverted && !axis.isZAxis ?\n [1, 0, 3, 2][side] :\n side), hasData = axis.hasData(), axisTitleOptions = options.title, labelOptions = options.labels, hasCrossing = Axis_isNumber(options.crossing), axisOffset = chart.axisOffset, clipOffset = chart.clipOffset, directionFactor = [-1, 1, 1, -1][side];\n let showAxis, titleOffset = 0, titleOffsetOption, titleMargin = 0, labelOffset = 0, // Reset\n labelOffsetPadded, lineHeightCorrection;\n // For reuse in Axis.render\n axis.showAxis = showAxis = hasData || options.showEmpty;\n // Set/reset staggerLines\n axis.staggerLines = (axis.horiz && labelOptions.staggerLines) || void 0;\n axis.createGroups();\n if (hasData || axis.isLinked) {\n // Generate ticks\n tickPositions.forEach(function (pos) {\n axis.generateTick(pos);\n });\n axis.renderUnsquish();\n // Left side must be align: right and right side must\n // have align: left for labels\n axis.reserveSpaceDefault = (side === 0 ||\n side === 2 ||\n { 1: 'left', 3: 'right' }[side] === axis.labelAlign);\n if (Axis_pick(labelOptions.reserveSpace, hasCrossing ? false : null, axis.labelAlign === 'center' ? true : null, axis.reserveSpaceDefault)) {\n tickPositions.forEach(function (pos) {\n // Get the highest offset\n labelOffset = Math.max(ticks[pos].getLabelSize(), labelOffset);\n });\n }\n if (axis.staggerLines) {\n labelOffset *= axis.staggerLines;\n }\n axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n }\n else { // Doesn't have data\n Axis_objectEach(ticks, function (tick, n) {\n tick.destroy();\n delete ticks[n];\n });\n }\n if (axisTitleOptions?.text &&\n axisTitleOptions.enabled !== false) {\n axis.addTitle(showAxis);\n if (showAxis &&\n !hasCrossing &&\n axisTitleOptions.reserveSpace !== false) {\n axis.titleOffset = titleOffset =\n axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n titleOffsetOption = axisTitleOptions.offset;\n titleMargin = Axis_defined(titleOffsetOption) ?\n 0 :\n Axis_pick(axisTitleOptions.margin, horiz ? 5 : 10);\n }\n }\n // Render the axis line\n axis.renderLine();\n // Handle automatic or user set offset\n axis.offset = directionFactor * Axis_pick(options.offset, axisOffset[side] ? axisOffset[side] + (options.margin || 0) : 0);\n axis.tickRotCorr = axis.tickRotCorr || { x: 0, y: 0 }; // Polar\n if (side === 0) {\n lineHeightCorrection = -axis.labelMetrics().h;\n }\n else if (side === 2) {\n lineHeightCorrection = axis.tickRotCorr.y;\n }\n else {\n lineHeightCorrection = 0;\n }\n // Find the padded label offset\n labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n if (labelOffset) {\n labelOffsetPadded -= lineHeightCorrection;\n labelOffsetPadded += directionFactor * (horiz ?\n Axis_pick(labelOptions.y, axis.tickRotCorr.y +\n directionFactor * labelOptions.distance) :\n Axis_pick(labelOptions.x, directionFactor * labelOptions.distance));\n }\n axis.axisTitleMargin = Axis_pick(titleOffsetOption, labelOffsetPadded);\n if (axis.getMaxLabelDimensions) {\n axis.maxLabelDimensions = axis.getMaxLabelDimensions(ticks, tickPositions);\n }\n // Due to GridAxis.tickSize, tickSize should be calculated after ticks\n // has rendered.\n if (coll !== 'colorAxis' && clipOffset) {\n const tickSize = this.tickSize('tick');\n axisOffset[side] = Math.max(axisOffset[side], (axis.axisTitleMargin || 0) + titleOffset +\n directionFactor * axis.offset, labelOffsetPadded, // #3027\n tickPositions && tickPositions.length && tickSize ?\n tickSize[0] + directionFactor * axis.offset :\n 0 // #4866\n );\n // Decide the clipping needed to keep the graph inside\n // the plot area and axis lines\n const clip = !axis.axisLine || options.offset ?\n 0 :\n // #4308, #4371\n axis.axisLine.strokeWidth() / 2;\n clipOffset[invertedSide] = Math.max(clipOffset[invertedSide], clip);\n }\n Axis_fireEvent(this, 'afterGetOffset');\n }\n /**\n * Internal function to get the path for the axis line. Extended for polar\n * charts.\n *\n * @function Highcharts.Axis#getLinePath\n *\n * @param {number} lineWidth\n * The line width in pixels.\n *\n * @return {Highcharts.SVGPathArray}\n * The SVG path definition in array form.\n */\n getLinePath(lineWidth) {\n const chart = this.chart, opposite = this.opposite, offset = this.offset, horiz = this.horiz, lineLeft = this.left + (opposite ? this.width : 0) + offset, lineTop = chart.chartHeight - this.bottom -\n (opposite ? this.height : 0) + offset;\n if (opposite) {\n lineWidth *= -1; // Crispify the other way - #1480, #1687\n }\n return chart.renderer\n .crispLine([\n [\n 'M',\n horiz ?\n this.left :\n lineLeft,\n horiz ?\n lineTop :\n this.top\n ],\n [\n 'L',\n horiz ?\n chart.chartWidth - this.right :\n lineLeft,\n horiz ?\n lineTop :\n chart.chartHeight - this.bottom\n ]\n ], lineWidth);\n }\n /**\n * Render the axis line. Called internally when rendering and redrawing the\n * axis.\n *\n * @function Highcharts.Axis#renderLine\n */\n renderLine() {\n if (!this.axisLine) {\n this.axisLine = this.chart.renderer.path()\n .addClass('highcharts-axis-line')\n .add(this.axisGroup);\n if (!this.chart.styledMode) {\n this.axisLine.attr({\n stroke: this.options.lineColor,\n 'stroke-width': this.options.lineWidth,\n zIndex: 7\n });\n }\n }\n }\n /**\n * Position the axis title.\n *\n * @private\n * @function Highcharts.Axis#getTitlePosition\n *\n * @return {Highcharts.PositionObject}\n * X and Y positions for the title.\n */\n getTitlePosition(axisTitle) {\n // Compute anchor points for each of the title align options\n const horiz = this.horiz, axisLeft = this.left, axisTop = this.top, axisLength = this.len, axisTitleOptions = this.options.title, margin = horiz ? axisLeft : axisTop, opposite = this.opposite, offset = this.offset, xOption = axisTitleOptions.x, yOption = axisTitleOptions.y, fontMetrics = this.chart.renderer.fontMetrics(axisTitle), \n // The part of a multiline text that is below the baseline of the\n // first line. Subtract 1 to preserve pixel-perfectness from the\n // old behaviour (v5.0.12), where only one line was allowed.\n textHeightOvershoot = axisTitle ? Math.max(axisTitle.getBBox(false, 0).height - fontMetrics.h - 1, 0) : 0, \n // The position in the length direction of the axis\n alongAxis = ({\n low: margin + (horiz ? 0 : axisLength),\n middle: margin + axisLength / 2,\n high: margin + (horiz ? axisLength : 0)\n })[axisTitleOptions.align], \n // The position in the perpendicular direction of the axis\n offAxis = (horiz ? axisTop + this.height : axisLeft) +\n (horiz ? 1 : -1) * // Horizontal axis reverses the margin\n (opposite ? -1 : 1) * // So does opposite axes\n (this.axisTitleMargin || 0) +\n [\n -textHeightOvershoot, // Top\n textHeightOvershoot, // Right\n fontMetrics.f, // Bottom\n -textHeightOvershoot // Left\n ][this.side], titlePosition = {\n x: horiz ?\n alongAxis + xOption :\n offAxis + (opposite ? this.width : 0) + offset + xOption,\n y: horiz ?\n offAxis + yOption - (opposite ? this.height : 0) + offset :\n alongAxis + yOption\n };\n Axis_fireEvent(this, 'afterGetTitlePosition', { titlePosition: titlePosition });\n return titlePosition;\n }\n /**\n * Render a minor tick into the given position. If a minor tick already\n * exists in this position, move it.\n *\n * @function Highcharts.Axis#renderMinorTick\n *\n * @param {number} pos\n * The position in axis values.\n *\n * @param {boolean} slideIn\n * Whether the tick should animate in from last computed position\n */\n renderMinorTick(pos, slideIn) {\n const axis = this;\n const minorTicks = axis.minorTicks;\n if (!minorTicks[pos]) {\n minorTicks[pos] = new Axis_Tick(axis, pos, 'minor');\n }\n // Render new ticks in old position\n if (slideIn && minorTicks[pos].isNew) {\n minorTicks[pos].render(null, true);\n }\n minorTicks[pos].render(null, false, 1);\n }\n /**\n * Render a major tick into the given position. If a tick already exists\n * in this position, move it.\n *\n * @function Highcharts.Axis#renderTick\n *\n * @param {number} pos\n * The position in axis values.\n *\n * @param {number} i\n * The tick index.\n *\n * @param {boolean} slideIn\n * Whether the tick should animate in from last computed position\n */\n renderTick(pos, i, slideIn) {\n const axis = this, isLinked = axis.isLinked, ticks = axis.ticks;\n // Linked axes need an extra check to find out if\n if (!isLinked ||\n (pos >= axis.min && pos <= axis.max) ||\n (axis.grid && axis.grid.isColumn)) {\n if (!ticks[pos]) {\n ticks[pos] = new Axis_Tick(axis, pos);\n }\n // NOTE this seems like overkill. Could be handled in tick.render by\n // setting old position in attr, then set new position in animate.\n // render new ticks in old position\n if (slideIn && ticks[pos].isNew) {\n // Start with negative opacity so that it is visible from\n // halfway into the animation\n ticks[pos].render(i, true, -1);\n }\n ticks[pos].render(i);\n }\n }\n /**\n * Render the axis.\n *\n * @private\n * @function Highcharts.Axis#render\n *\n * @emits Highcharts.Axis#event:afterRender\n */\n render() {\n const axis = this, chart = axis.chart, log = axis.logarithmic, renderer = chart.renderer, options = axis.options, isLinked = axis.isLinked, tickPositions = axis.tickPositions, axisTitle = axis.axisTitle, ticks = axis.ticks, minorTicks = axis.minorTicks, alternateBands = axis.alternateBands, stackLabelOptions = options.stackLabels, alternateGridColor = options.alternateGridColor, crossing = options.crossing, tickmarkOffset = axis.tickmarkOffset, axisLine = axis.axisLine, showAxis = axis.showAxis, animation = Axis_animObject(renderer.globalAnimation);\n let from, to;\n // Reset\n axis.labelEdge.length = 0;\n axis.overlap = false;\n // Mark all elements inActive before we go over and mark the active ones\n [ticks, minorTicks, alternateBands].forEach(function (coll) {\n Axis_objectEach(coll, function (tick) {\n tick.isActive = false;\n });\n });\n // Crossing\n if (Axis_isNumber(crossing)) {\n const otherAxis = this.isXAxis ? chart.yAxis[0] : chart.xAxis[0], directionFactor = [1, -1, -1, 1][this.side];\n if (otherAxis) {\n let px = otherAxis.toPixels(crossing, true);\n if (axis.horiz) {\n px = otherAxis.len - px;\n }\n axis.offset = directionFactor * px;\n }\n }\n // If the series has data draw the ticks. Else only the line and title\n if (axis.hasData() || isLinked) {\n const slideInTicks = axis.chart.hasRendered &&\n axis.old && Axis_isNumber(axis.old.min);\n // Minor ticks\n if (axis.minorTickInterval && !axis.categories) {\n axis.getMinorTickPositions().forEach(function (pos) {\n axis.renderMinorTick(pos, slideInTicks);\n });\n }\n // Major ticks. Pull out the first item and render it last so that\n // we can get the position of the neighbour label. #808.\n if (tickPositions.length) { // #1300\n tickPositions.forEach(function (pos, i) {\n axis.renderTick(pos, i, slideInTicks);\n });\n // In a categorized axis, the tick marks are displayed\n // between labels. So we need to add a tick mark and\n // grid line at the left edge of the X axis.\n if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n if (!ticks[-1]) {\n ticks[-1] = new Axis_Tick(axis, -1, null, true);\n }\n ticks[-1].render(-1);\n }\n }\n // Alternate grid color\n if (alternateGridColor) {\n tickPositions.forEach(function (pos, i) {\n to = typeof tickPositions[i + 1] !== 'undefined' ?\n tickPositions[i + 1] + tickmarkOffset :\n axis.max - tickmarkOffset;\n if (i % 2 === 0 &&\n pos < axis.max &&\n to <= axis.max + (chart.polar ?\n -tickmarkOffset :\n tickmarkOffset)) { // #2248, #4660\n if (!alternateBands[pos]) {\n // Should be imported from PlotLineOrBand.js, but\n // the dependency cycle with axis is a problem\n alternateBands[pos] = new Core_Globals.PlotLineOrBand(axis, {});\n }\n from = pos + tickmarkOffset; // #949\n alternateBands[pos].options = {\n from: log ? log.lin2log(from) : from,\n to: log ? log.lin2log(to) : to,\n color: alternateGridColor,\n className: 'highcharts-alternate-grid'\n };\n alternateBands[pos].render();\n alternateBands[pos].isActive = true;\n }\n });\n }\n // Custom plot lines and bands\n if (!axis._addedPlotLB) { // Only first time\n axis._addedPlotLB = true;\n (options.plotLines || [])\n .concat(options.plotBands || [])\n .forEach(function (plotLineOptions) {\n axis\n .addPlotBandOrLine(plotLineOptions);\n });\n }\n } // End if hasData\n // Remove inactive ticks\n [ticks, minorTicks, alternateBands].forEach(function (coll) {\n const forDestruction = [], delay = animation.duration, destroyInactiveItems = function () {\n let i = forDestruction.length;\n while (i--) {\n // When resizing rapidly, the same items\n // may be destroyed in different timeouts,\n // or the may be reactivated\n if (coll[forDestruction[i]] &&\n !coll[forDestruction[i]].isActive) {\n coll[forDestruction[i]].destroy();\n delete coll[forDestruction[i]];\n }\n }\n };\n Axis_objectEach(coll, function (tick, pos) {\n if (!tick.isActive) {\n // Render to zero opacity\n tick.render(pos, false, 0);\n tick.isActive = false;\n forDestruction.push(pos);\n }\n });\n // When the objects are finished fading out, destroy them\n Axis_syncTimeout(destroyInactiveItems, coll === alternateBands ||\n !chart.hasRendered ||\n !delay ?\n 0 :\n delay);\n });\n // Set the axis line path\n if (axisLine) {\n axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n d: this.getLinePath(axisLine.strokeWidth())\n });\n axisLine.isPlaced = true;\n // Show or hide the line depending on options.showEmpty\n axisLine[showAxis ? 'show' : 'hide'](showAxis);\n }\n if (axisTitle && showAxis) {\n axisTitle[axisTitle.isNew ? 'attr' : 'animate'](axis.getTitlePosition(axisTitle));\n axisTitle.isNew = false;\n }\n // Stacked totals:\n if (stackLabelOptions && stackLabelOptions.enabled && axis.stacking) {\n axis.stacking.renderStackTotals();\n }\n // End stacked totals\n // Record old scaling for updating/animation. Pinch base must be\n // preserved until the pinch ends.\n axis.old = {\n len: axis.len,\n max: axis.max,\n min: axis.min,\n transA: axis.transA,\n userMax: axis.userMax,\n userMin: axis.userMin\n };\n axis.isDirty = false;\n Axis_fireEvent(this, 'afterRender');\n }\n /**\n * Redraw the axis to reflect changes in the data or axis extremes. Called\n * internally from Highcharts.Chart#redraw.\n *\n * @private\n * @function Highcharts.Axis#redraw\n */\n redraw() {\n if (this.visible) {\n // Render the axis\n this.render();\n // Move plot lines and bands\n this.plotLinesAndBands.forEach(function (plotLine) {\n plotLine.render();\n });\n }\n // Mark associated series as dirty and ready for redraw\n this.series.forEach(function (series) {\n series.isDirty = true;\n });\n }\n /**\n * Returns an array of axis properties, that should be untouched during\n * reinitialization.\n *\n * @private\n * @function Highcharts.Axis#getKeepProps\n */\n getKeepProps() {\n return (this.keepProps || Axis.keepProps);\n }\n /**\n * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n * to fully remove the axis.\n *\n * @private\n * @function Highcharts.Axis#destroy\n *\n * @param {boolean} [keepEvents]\n * Whether to preserve events, used internally in Axis.update.\n */\n destroy(keepEvents) {\n const axis = this, plotLinesAndBands = axis.plotLinesAndBands, eventOptions = this.eventOptions;\n Axis_fireEvent(this, 'destroy', { keepEvents: keepEvents });\n // Remove the events\n if (!keepEvents) {\n Axis_removeEvent(axis);\n }\n // Destroy collections\n [axis.ticks, axis.minorTicks, axis.alternateBands].forEach(function (coll) {\n Axis_destroyObjectProperties(coll);\n });\n if (plotLinesAndBands) {\n let i = plotLinesAndBands.length;\n while (i--) { // #1975\n plotLinesAndBands[i].destroy();\n }\n }\n // Destroy elements\n [\n 'axisLine', 'axisTitle', 'axisGroup',\n 'gridGroup', 'labelGroup', 'cross', 'scrollbar'\n ].forEach(function (prop) {\n if (axis[prop]) {\n axis[prop] = axis[prop].destroy();\n }\n });\n // Destroy each generated group for plotlines and plotbands\n for (const plotGroup in axis.plotLinesAndBandsGroups) { // eslint-disable-line guard-for-in\n axis.plotLinesAndBandsGroups[plotGroup] =\n axis.plotLinesAndBandsGroups[plotGroup].destroy();\n }\n // Delete all properties and fall back to the prototype.\n Axis_objectEach(axis, function (val, key) {\n if (axis.getKeepProps().indexOf(key) === -1) {\n delete axis[key];\n }\n });\n this.eventOptions = eventOptions;\n }\n /**\n * Internal function to draw a crosshair.\n *\n * @function Highcharts.Axis#drawCrosshair\n *\n * @param {Highcharts.PointerEventObject} [e]\n * The event arguments from the modified pointer event, extended with\n * `chartX` and `chartY`\n *\n * @param {Highcharts.Point} [point]\n * The Point object if the crosshair snaps to points.\n *\n * @emits Highcharts.Axis#event:afterDrawCrosshair\n * @emits Highcharts.Axis#event:drawCrosshair\n */\n drawCrosshair(e, point) {\n const options = this.crosshair, snap = Axis_pick(options && options.snap, true), chart = this.chart;\n let path, pos, categorized, graphic = this.cross, crossOptions;\n Axis_fireEvent(this, 'drawCrosshair', { e: e, point: point });\n // Use last available event when updating non-snapped crosshairs without\n // mouse interaction (#5287)\n if (!e) {\n e = this.cross && this.cross.e;\n }\n if (\n // Disabled in options\n !options ||\n // Snap\n ((Axis_defined(point) || !snap) === false)) {\n this.hideCrosshair();\n }\n else {\n // Get the path\n if (!snap) {\n pos = e &&\n (this.horiz ?\n e.chartX - this.pos :\n this.len - e.chartY + this.pos);\n }\n else if (Axis_defined(point)) {\n // #3834\n pos = Axis_pick(this.coll !== 'colorAxis' ?\n point.crosshairPos : // 3D axis extension\n null, this.isXAxis ?\n point.plotX :\n this.len - point.plotY);\n }\n if (Axis_defined(pos)) {\n crossOptions = {\n // Value, only used on radial\n value: point && (this.isXAxis ?\n point.x :\n Axis_pick(point.stackY, point.y)),\n translatedValue: pos\n };\n if (chart.polar) {\n // Additional information required for crosshairs in\n // polar chart\n Axis_extend(crossOptions, {\n isCrosshair: true,\n chartX: e && e.chartX,\n chartY: e && e.chartY,\n point: point\n });\n }\n path = this.getPlotLinePath(crossOptions) ||\n null; // #3189\n }\n if (!Axis_defined(path)) {\n this.hideCrosshair();\n return;\n }\n categorized = this.categories && !this.isRadial;\n // Draw the cross\n if (!graphic) {\n this.cross = graphic = chart.renderer\n .path()\n .addClass('highcharts-crosshair highcharts-crosshair-' +\n (categorized ? 'category ' : 'thin ') +\n (options.className || ''))\n .attr({\n zIndex: Axis_pick(options.zIndex, 2)\n })\n .add();\n // Presentational attributes\n if (!chart.styledMode) {\n graphic.attr({\n stroke: options.color ||\n (categorized ?\n Color_Color\n .parse(\"#ccd3ff\" /* Palette.highlightColor20 */)\n .setOpacity(0.25)\n .get() :\n \"#cccccc\" /* Palette.neutralColor20 */),\n 'stroke-width': Axis_pick(options.width, 1)\n }).css({\n 'pointer-events': 'none'\n });\n if (options.dashStyle) {\n graphic.attr({\n dashstyle: options.dashStyle\n });\n }\n }\n }\n graphic.show().attr({\n d: path\n });\n if (categorized && !options.width) {\n graphic.attr({\n 'stroke-width': this.transA\n });\n }\n this.cross.e = e;\n }\n Axis_fireEvent(this, 'afterDrawCrosshair', { e: e, point: point });\n }\n /**\n * Hide the crosshair if visible.\n *\n * @function Highcharts.Axis#hideCrosshair\n */\n hideCrosshair() {\n if (this.cross) {\n this.cross.hide();\n }\n Axis_fireEvent(this, 'afterHideCrosshair');\n }\n /**\n * Update an axis object with a new set of options. The options are merged\n * with the existing options, so only new or altered options need to be\n * specified.\n *\n * @sample highcharts/members/axis-update/\n * Axis update demo\n *\n * @function Highcharts.Axis#update\n *\n * @param {Highcharts.AxisOptions} options\n * The new options that will be merged in with existing options on the axis.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the axis is altered. If doing more\n * operations on the chart, it is a good idea to set redraw to false and\n * call {@link Chart#redraw} after.\n */\n update(options, redraw) {\n const chart = this.chart;\n options = Axis_merge(this.userOptions, options);\n this.destroy(true);\n this.init(chart, options);\n chart.isDirtyBox = true;\n if (Axis_pick(redraw, true)) {\n chart.redraw();\n }\n }\n /**\n * Remove the axis from the chart.\n *\n * @sample highcharts/members/chart-addaxis/\n * Add and remove axes\n *\n * @function Highcharts.Axis#remove\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart following the remove.\n */\n remove(redraw) {\n const chart = this.chart, coll = this.coll, axisSeries = this.series;\n let i = axisSeries.length;\n // Remove associated series (#2687)\n while (i--) {\n if (axisSeries[i]) {\n axisSeries[i].remove(false);\n }\n }\n // Remove the axis\n Axis_erase(chart.axes, this);\n Axis_erase(chart[coll] || [], this);\n chart.orderItems(coll);\n this.destroy();\n chart.isDirtyBox = true;\n if (Axis_pick(redraw, true)) {\n chart.redraw();\n }\n }\n /**\n * Update the axis title by options after render time.\n *\n * @sample highcharts/members/axis-settitle/\n * Set a new Y axis title\n *\n * @function Highcharts.Axis#setTitle\n *\n * @param {Highcharts.AxisTitleOptions} titleOptions\n * The additional title options.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after setting the title.\n */\n setTitle(titleOptions, redraw) {\n this.update({ title: titleOptions }, redraw);\n }\n /**\n * Set new axis categories and optionally redraw.\n *\n * @sample highcharts/members/axis-setcategories/\n * Set categories by click on a button\n *\n * @function Highcharts.Axis#setCategories\n *\n * @param {Array} categories\n * The new categories.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart.\n */\n setCategories(categories, redraw) {\n this.update({ categories: categories }, redraw);\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n// Properties to survive after destroy, needed for Axis.update (#4317,\n// #5773, #5881).\nAxis.keepProps = [\n 'coll',\n 'extKey',\n 'hcEvents',\n 'len',\n 'names',\n 'series',\n 'userMax',\n 'userMin'\n];\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_Axis = (Axis);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Options for the path on the Axis to be calculated.\n * @interface Highcharts.AxisPlotLinePathOptionsObject\n */ /**\n* Axis value.\n* @name Highcharts.AxisPlotLinePathOptionsObject#value\n* @type {number|undefined}\n*/ /**\n* Line width used for calculation crisp line coordinates. Defaults to 1.\n* @name Highcharts.AxisPlotLinePathOptionsObject#lineWidth\n* @type {number|undefined}\n*/ /**\n* If `false`, the function will return null when it falls outside the axis\n* bounds. If `true`, the function will return a path aligned to the plot area\n* sides if it falls outside. If `pass`, it will return a path outside.\n* @name Highcharts.AxisPlotLinePathOptionsObject#force\n* @type {string|boolean|undefined}\n*/ /**\n* Used in Highcharts Stock. When `true`, plot paths\n* (crosshair, plotLines, gridLines)\n* will be rendered on all axes when defined on the first axis.\n* @name Highcharts.AxisPlotLinePathOptionsObject#acrossPanes\n* @type {boolean|undefined}\n*/ /**\n* Use old coordinates (for resizing and rescaling).\n* If not set, defaults to `false`.\n* @name Highcharts.AxisPlotLinePathOptionsObject#old\n* @type {boolean|undefined}\n*/ /**\n* If given, return the plot line path of a pixel position on the axis.\n* @name Highcharts.AxisPlotLinePathOptionsObject#translatedValue\n* @type {number|undefined}\n*/ /**\n* Used in Polar axes. Reverse the positions for concatenation of polygonal\n* plot bands\n* @name Highcharts.AxisPlotLinePathOptionsObject#reverse\n* @type {boolean|undefined}\n*/\n/**\n * Options for crosshairs on axes.\n *\n * @product highstock\n *\n * @typedef {Highcharts.XAxisCrosshairOptions|Highcharts.YAxisCrosshairOptions} Highcharts.AxisCrosshairOptions\n */\n/**\n * @typedef {\"navigator\"|\"pan\"|\"rangeSelectorButton\"|\"rangeSelectorInput\"|\"scrollbar\"|\"traverseUpButton\"|\"zoom\"} Highcharts.AxisExtremesTriggerValue\n */\n/**\n * @callback Highcharts.AxisEventCallbackFunction\n *\n * @param {Highcharts.Axis} this\n */\n/**\n * @callback Highcharts.AxisLabelsFormatterCallbackFunction\n *\n * @param {Highcharts.AxisLabelsFormatterContextObject} this\n *\n * @param {Highcharts.AxisLabelsFormatterContextObject} ctx\n *\n * @return {string}\n */\n/**\n * @interface Highcharts.AxisLabelsFormatterContextObject\n */ /**\n* The axis item of the label\n* @name Highcharts.AxisLabelsFormatterContextObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* The chart instance.\n* @name Highcharts.AxisLabelsFormatterContextObject#chart\n* @type {Highcharts.Chart}\n*/ /**\n* Default formatting of date/time labels.\n* @name Highcharts.AxisLabelsFormatterContextObject#dateTimeLabelFormat\n* @type {string|undefined}\n*/ /**\n* Whether the label belongs to the first tick on the axis.\n* @name Highcharts.AxisLabelsFormatterContextObject#isFirst\n* @type {boolean}\n*/ /**\n* Whether the label belongs to the last tick on the axis.\n* @name Highcharts.AxisLabelsFormatterContextObject#isLast\n* @type {boolean}\n*/ /**\n* The position on the axis in terms of axis values. For category axes, a\n* zero-based index. For datetime axes, the JavaScript time in milliseconds\n* since 1970.\n* @name Highcharts.AxisLabelsFormatterContextObject#pos\n* @type {number}\n*/ /**\n* The preformatted text as the result of the default formatting. For example\n* dates will be formatted as strings, and numbers with language-specific comma\n* separators, thousands separators and numeric symbols like `k` or `M`.\n* @name Highcharts.AxisLabelsFormatterContextObject#text\n* @type {string|undefined}\n*/ /**\n* The Tick instance.\n* @name Highcharts.AxisLabelsFormatterContextObject#tick\n* @type {Highcharts.Tick}\n*/ /**\n* This can be either a numeric value or a category string.\n* @name Highcharts.AxisLabelsFormatterContextObject#value\n* @type {number|string}\n*/\n/**\n * Options for axes.\n *\n * @typedef {Highcharts.XAxisOptions|Highcharts.YAxisOptions|Highcharts.ZAxisOptions} Highcharts.AxisOptions\n */\n/**\n * @callback Highcharts.AxisPointBreakEventCallbackFunction\n *\n * @param {Highcharts.Axis} this\n *\n * @param {Highcharts.AxisPointBreakEventObject} evt\n */\n/**\n * @interface Highcharts.AxisPointBreakEventObject\n */ /**\n* @name Highcharts.AxisPointBreakEventObject#brk\n* @type {Highcharts.Dictionary}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#point\n* @type {Highcharts.Point}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#preventDefault\n* @type {Function}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#target\n* @type {Highcharts.SVGElement}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#type\n* @type {\"pointBreak\"|\"pointInBreak\"}\n*/\n/**\n * @callback Highcharts.AxisSetExtremesEventCallbackFunction\n *\n * @param {Highcharts.Axis} this\n *\n * @param {Highcharts.AxisSetExtremesEventObject} evt\n */\n/**\n * @interface Highcharts.AxisSetExtremesEventObject\n * @extends Highcharts.ExtremesObject\n */ /**\n* @name Highcharts.AxisSetExtremesEventObject#preventDefault\n* @type {Function}\n*/ /**\n* @name Highcharts.AxisSetExtremesEventObject#target\n* @type {Highcharts.SVGElement}\n*/ /**\n* @name Highcharts.AxisSetExtremesEventObject#trigger\n* @type {Highcharts.AxisExtremesTriggerValue|string}\n*/ /**\n* @name Highcharts.AxisSetExtremesEventObject#type\n* @type {\"setExtremes\"}\n*/\n/**\n * @callback Highcharts.AxisTickPositionerCallbackFunction\n *\n * @param {Highcharts.Axis} this\n *\n * @return {Highcharts.AxisTickPositionsArray}\n */\n/**\n * @interface Highcharts.AxisTickPositionsArray\n * @augments Array\n */\n/**\n * @typedef {\"high\"|\"low\"|\"middle\"} Highcharts.AxisTitleAlignValue\n */\n/**\n * @typedef {Highcharts.XAxisTitleOptions|Highcharts.YAxisTitleOptions|Highcharts.ZAxisTitleOptions} Highcharts.AxisTitleOptions\n */\n/**\n * @typedef {\"linear\"|\"logarithmic\"|\"datetime\"|\"category\"|\"treegrid\"} Highcharts.AxisTypeValue\n */\n/**\n * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n * function.\n *\n * @interface Highcharts.ExtremesObject\n */ /**\n* The maximum value of the axis' associated series.\n* @name Highcharts.ExtremesObject#dataMax\n* @type {number}\n*/ /**\n* The minimum value of the axis' associated series.\n* @name Highcharts.ExtremesObject#dataMin\n* @type {number}\n*/ /**\n* The maximum axis value, either automatic or set manually. If the `max` option\n* is not set, `maxPadding` is 0 and `endOnTick` is false, this value will be\n* the same as `dataMax`.\n* @name Highcharts.ExtremesObject#max\n* @type {number}\n*/ /**\n* The minimum axis value, either automatic or set manually. If the `min` option\n* is not set, `minPadding` is 0 and `startOnTick` is false, this value will be\n* the same as `dataMin`.\n* @name Highcharts.ExtremesObject#min\n* @type {number}\n*/ /**\n* The user defined maximum, either from the `max` option or from a zoom or\n* `setExtremes` action.\n* @name Highcharts.ExtremesObject#userMax\n* @type {number|undefined}\n*/ /**\n* The user defined minimum, either from the `min` option or from a zoom or\n* `setExtremes` action.\n* @name Highcharts.ExtremesObject#userMin\n* @type {number|undefined}\n*/\n/**\n * Formatter function for the text of a crosshair label.\n *\n * @callback Highcharts.XAxisCrosshairLabelFormatterCallbackFunction\n *\n * @param {Highcharts.Axis} this\n * Axis context\n *\n * @param {number} value\n * Y value of the data point\n *\n * @return {string}\n */\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Axis/DateTimeAxis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { addEvent: DateTimeAxis_addEvent, getMagnitude: DateTimeAxis_getMagnitude, normalizeTickInterval: DateTimeAxis_normalizeTickInterval, timeUnits: DateTimeAxis_timeUnits } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\n/* eslint-disable valid-jsdoc */\nvar DateTimeAxis;\n(function (DateTimeAxis) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Extends axis class with date and time support.\n * @private\n */\n function compose(AxisClass) {\n if (!AxisClass.keepProps.includes('dateTime')) {\n AxisClass.keepProps.push('dateTime');\n const axisProto = AxisClass.prototype;\n axisProto.getTimeTicks = getTimeTicks;\n DateTimeAxis_addEvent(AxisClass, 'afterSetType', onAfterSetType);\n }\n return AxisClass;\n }\n DateTimeAxis.compose = compose;\n /**\n * Set the tick positions to a time unit that makes sense, for example\n * on the first of each month or on every Monday. Return an array with\n * the time positions. Used in datetime axes as well as for grouping\n * data on a datetime axis.\n *\n * @private\n * @function Highcharts.Axis#getTimeTicks\n * @param {Highcharts.TimeNormalizeObject} normalizedInterval\n * The interval in axis values (ms) and the count.\n * @param {number} min\n * The minimum in axis values.\n * @param {number} max\n * The maximum in axis values.\n */\n function getTimeTicks() {\n return this.chart.time.getTimeTicks.apply(this.chart.time, arguments);\n }\n /**\n * @private\n */\n function onAfterSetType() {\n if (this.type !== 'datetime') {\n this.dateTime = void 0;\n return;\n }\n if (!this.dateTime) {\n this.dateTime = new Additions(this);\n }\n }\n /* *\n *\n * Classes\n *\n * */\n class Additions {\n /* *\n *\n * Constructors\n *\n * */\n constructor(axis) {\n this.axis = axis;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Get a normalized tick interval for dates. Returns a configuration\n * object with unit range (interval), count and name. Used to prepare\n * data for `getTimeTicks`. Previously this logic was part of\n * getTimeTicks, but as `getTimeTicks` now runs of segments in stock\n * charts, the normalizing logic was extracted in order to prevent it\n * for running over again for each segment having the same interval.\n * #662, #697.\n * @private\n */\n normalizeTimeTickInterval(tickInterval, unitsOption) {\n const units = (unitsOption || [[\n // Unit name\n 'millisecond',\n // Allowed multiples\n [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]\n ], [\n 'second',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'minute',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'hour',\n [1, 2, 3, 4, 6, 8, 12]\n ], [\n 'day',\n [1, 2]\n ], [\n 'week',\n [1, 2]\n ], [\n 'month',\n [1, 2, 3, 4, 6]\n ], [\n 'year',\n null\n ]]);\n let unit = units[units.length - 1], // Default unit is years\n interval = DateTimeAxis_timeUnits[unit[0]], multiples = unit[1], i;\n // Loop through the units to find the one that best fits the\n // tickInterval\n for (i = 0; i < units.length; i++) {\n unit = units[i];\n interval = DateTimeAxis_timeUnits[unit[0]];\n multiples = unit[1];\n if (units[i + 1]) {\n // `lessThan` is in the middle between the highest multiple\n // and the next unit.\n const lessThan = (interval *\n multiples[multiples.length - 1] +\n DateTimeAxis_timeUnits[units[i + 1][0]]) / 2;\n // Break and keep the current unit\n if (tickInterval <= lessThan) {\n break;\n }\n }\n }\n // Prevent 2.5 years intervals, though 25, 250 etc. are allowed\n if (interval === DateTimeAxis_timeUnits.year && tickInterval < 5 * interval) {\n multiples = [1, 2, 5];\n }\n // Get the count\n const count = DateTimeAxis_normalizeTickInterval(tickInterval / interval, multiples, unit[0] === 'year' ? // #1913, #2360\n Math.max(DateTimeAxis_getMagnitude(tickInterval / interval), 1) :\n 1);\n return {\n unitRange: interval,\n count: count,\n unitName: unit[0]\n };\n }\n /**\n * Get the best date format for a specific X value based on the closest\n * point range on the axis.\n *\n * @private\n */\n getXDateFormat(x, dateTimeLabelFormats) {\n const { axis } = this, time = axis.chart.time;\n return axis.closestPointRange ?\n time.getDateFormat(axis.closestPointRange, x, axis.options.startOfWeek, dateTimeLabelFormats) ||\n // #2546, 2581\n time.resolveDTLFormat(dateTimeLabelFormats.year).main :\n time.resolveDTLFormat(dateTimeLabelFormats.day).main;\n }\n }\n DateTimeAxis.Additions = Additions;\n})(DateTimeAxis || (DateTimeAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_DateTimeAxis = (DateTimeAxis);\n\n;// ./code/es-modules/Core/Axis/LogarithmicAxis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { addEvent: LogarithmicAxis_addEvent, normalizeTickInterval: LogarithmicAxis_normalizeTickInterval, pick: LogarithmicAxis_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * @private\n */\nvar LogarithmicAxis;\n(function (LogarithmicAxis) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Provides logarithmic support for axes.\n * @private\n */\n function compose(AxisClass) {\n if (!AxisClass.keepProps.includes('logarithmic')) {\n AxisClass.keepProps.push('logarithmic');\n LogarithmicAxis_addEvent(AxisClass, 'afterSetType', onAfterSetType);\n LogarithmicAxis_addEvent(AxisClass, 'afterInit', onAfterInit);\n }\n return AxisClass;\n }\n LogarithmicAxis.compose = compose;\n /**\n * @private\n */\n function onAfterSetType() {\n if (this.type !== 'logarithmic') {\n this.logarithmic = void 0;\n }\n else {\n this.logarithmic ?? (this.logarithmic = new Additions(this));\n }\n }\n /**\n * @private\n */\n function onAfterInit() {\n const axis = this;\n const log = axis.logarithmic;\n // Extend logarithmic axis\n if (log) {\n axis.lin2val = function (num) {\n return log.lin2log(num);\n };\n axis.val2lin = function (num) {\n return log.log2lin(num);\n };\n }\n }\n /* *\n *\n * Class\n *\n * */\n /**\n * Provides logarithmic support for axes.\n * @private\n * @class\n */\n class Additions {\n /* *\n *\n * Constructors\n *\n * */\n constructor(axis) {\n this.axis = axis;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Set the tick positions of a logarithmic axis.\n */\n getLogTickPositions(interval, min, max, minor) {\n const log = this;\n const axis = log.axis;\n const axisLength = axis.len;\n const options = axis.options;\n // Since we use this method for both major and minor ticks,\n // use a local variable and return the result\n let positions = [];\n // Reset\n if (!minor) {\n log.minorAutoInterval = void 0;\n }\n // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n if (interval >= 0.5) {\n interval = Math.round(interval);\n positions = axis.getLinearTickPositions(interval, min, max);\n // Second case: We need intermediary ticks. For example\n // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n }\n else if (interval >= 0.08) {\n const roundedMin = Math.floor(min);\n let intermediate, i, j, len, pos, lastPos, break2;\n if (interval > 0.3) {\n intermediate = [1, 2, 4];\n // 0.2 equals five minor ticks per 1, 10, 100 etc\n }\n else if (interval > 0.15) {\n intermediate = [1, 2, 4, 6, 8];\n }\n else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n }\n for (i = roundedMin; i < max + 1 && !break2; i++) {\n len = intermediate.length;\n for (j = 0; j < len && !break2; j++) {\n pos = log.log2lin(log.lin2log(i) * intermediate[j]);\n // #1670, lastPos is #3113\n if (pos > min &&\n (!minor || lastPos <= max) &&\n typeof lastPos !== 'undefined') {\n positions.push(lastPos);\n }\n if (lastPos > max) {\n break2 = true;\n }\n lastPos = pos;\n }\n }\n // Third case: We are so deep in between whole logarithmic values,\n // that we might as well handle the tick positions like a linear\n // axis. For example 1.01, 1.02, 1.03, 1.04.\n }\n else {\n const realMin = log.lin2log(min), realMax = log.lin2log(max), tickIntervalOption = minor ?\n axis.getMinorTickInterval() :\n options.tickInterval, filteredTickIntervalOption = tickIntervalOption === 'auto' ?\n null :\n tickIntervalOption, tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1), totalPixelLength = minor ?\n axisLength / axis.tickPositions.length :\n axisLength;\n interval = LogarithmicAxis_pick(filteredTickIntervalOption, log.minorAutoInterval, (realMax - realMin) *\n tickPixelIntervalOption / (totalPixelLength || 1));\n interval = LogarithmicAxis_normalizeTickInterval(interval);\n positions = axis.getLinearTickPositions(interval, realMin, realMax).map(log.log2lin);\n if (!minor) {\n log.minorAutoInterval = interval / 5;\n }\n }\n // Set the axis-level tickInterval variable\n if (!minor) {\n axis.tickInterval = interval;\n }\n return positions;\n }\n lin2log(num) {\n return Math.pow(10, num);\n }\n log2lin(num) {\n return Math.log(num) / Math.LN10;\n }\n }\n LogarithmicAxis.Additions = Additions;\n})(LogarithmicAxis || (LogarithmicAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_LogarithmicAxis = (LogarithmicAxis);\n\n;// ./code/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { erase: PlotLineOrBandAxis_erase, extend: PlotLineOrBandAxis_extend, isNumber: PlotLineOrBandAxis_isNumber } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar PlotLineOrBandAxis;\n(function (PlotLineOrBandAxis) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Variables\n *\n * */\n let PlotLineOrBandClass;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Add a plot band after render time.\n *\n * @sample highcharts/members/axis-addplotband/\n * Toggle the plot band from a button\n *\n * @function Highcharts.Axis#addPlotBand\n *\n * @param {Highcharts.AxisPlotBandsOptions} options\n * A configuration object for the plot band, as defined in\n * [xAxis.plotBands](https://api.highcharts.com/highcharts/xAxis.plotBands).\n *\n * @return {Highcharts.PlotLineOrBand|undefined}\n * The added plot band, or `undefined` if the options are not valid.\n */\n function addPlotBand(options) {\n return this.addPlotBandOrLine(options, 'plotBands');\n }\n /**\n * Add a plot band or plot line after render time. Called from\n * addPlotBand and addPlotLine internally.\n *\n * @private\n * @function Highcharts.Axis#addPlotBandOrLine\n * @param {Highcharts.AxisPlotBandsOptions|Highcharts.AxisPlotLinesOptions} options\n * The plotBand or plotLine configuration object.\n */\n function addPlotBandOrLine(options, coll) {\n const userOptions = this.userOptions;\n let obj = new PlotLineOrBandClass(this, options);\n if (this.visible) {\n obj = obj.render();\n }\n if (obj) { // #2189\n if (!this._addedPlotLB) {\n this._addedPlotLB = true;\n (userOptions.plotLines || [])\n .concat(userOptions.plotBands || [])\n .forEach((plotLineOptions) => {\n this.addPlotBandOrLine(plotLineOptions);\n });\n }\n // Add it to the user options for exporting and Axis.update\n if (coll) {\n // Workaround Microsoft/TypeScript issue #32693\n const updatedOptions = (userOptions[coll] || []);\n updatedOptions.push(options);\n userOptions[coll] = updatedOptions;\n }\n this.plotLinesAndBands.push(obj);\n }\n return obj;\n }\n /**\n * Add a plot line after render time.\n *\n * @sample highcharts/members/axis-addplotline/\n * Toggle the plot line from a button\n *\n * @function Highcharts.Axis#addPlotLine\n *\n * @param {Highcharts.AxisPlotLinesOptions} options\n * A configuration object for the plot line, as defined in\n * [xAxis.plotLines](https://api.highcharts.com/highcharts/xAxis.plotLines).\n *\n * @return {Highcharts.PlotLineOrBand|undefined}\n * The added plot line, or `undefined` if the options are not valid.\n */\n function addPlotLine(options) {\n return this.addPlotBandOrLine(options, 'plotLines');\n }\n /**\n * @private\n */\n function compose(PlotLineOrBandType, AxisClass) {\n const axisProto = AxisClass.prototype;\n if (!axisProto.addPlotBand) {\n PlotLineOrBandClass = PlotLineOrBandType;\n PlotLineOrBandAxis_extend(axisProto, {\n addPlotBand,\n addPlotLine,\n addPlotBandOrLine,\n getPlotBandPath,\n removePlotBand,\n removePlotLine,\n removePlotBandOrLine\n });\n }\n return AxisClass;\n }\n PlotLineOrBandAxis.compose = compose;\n /**\n * Internal function to create the SVG path definition for a plot band.\n *\n * @function Highcharts.Axis#getPlotBandPath\n *\n * @param {number} from\n * The axis value to start from.\n *\n * @param {number} to\n * The axis value to end on.\n *\n * @param {Highcharts.AxisPlotBandsOptions|Highcharts.AxisPlotLinesOptions} options\n * The plotBand or plotLine configuration object.\n *\n * @return {Highcharts.SVGPathArray}\n * The SVG path definition in array form.\n */\n function getPlotBandPath(from, to, options) {\n options = options || this.options;\n const toPath = this.getPlotLinePath({\n value: to,\n force: true,\n acrossPanes: options.acrossPanes\n }), result = [], horiz = this.horiz, outside = !PlotLineOrBandAxis_isNumber(this.min) ||\n !PlotLineOrBandAxis_isNumber(this.max) ||\n (from < this.min && to < this.min) ||\n (from > this.max && to > this.max), path = this.getPlotLinePath({\n value: from,\n force: true,\n acrossPanes: options.acrossPanes\n });\n let i, \n // #4964 check if chart is inverted or plotband is on yAxis\n plus = 1, isFlat;\n if (path && toPath) {\n // Flat paths don't need labels (#3836)\n if (outside) {\n isFlat = path.toString() === toPath.toString();\n plus = 0;\n }\n // Go over each subpath - for panes in Highcharts Stock\n for (i = 0; i < path.length; i += 2) {\n const pathStart = path[i], pathEnd = path[i + 1], toPathStart = toPath[i], toPathEnd = toPath[i + 1];\n // Type checking all affected path segments. Consider\n // something smarter.\n if ((pathStart[0] === 'M' || pathStart[0] === 'L') &&\n (pathEnd[0] === 'M' || pathEnd[0] === 'L') &&\n (toPathStart[0] === 'M' || toPathStart[0] === 'L') &&\n (toPathEnd[0] === 'M' || toPathEnd[0] === 'L')) {\n // Add 1 pixel when coordinates are the same\n if (horiz && toPathStart[1] === pathStart[1]) {\n toPathStart[1] += plus;\n toPathEnd[1] += plus;\n }\n else if (!horiz && toPathStart[2] === pathStart[2]) {\n toPathStart[2] += plus;\n toPathEnd[2] += plus;\n }\n result.push(['M', pathStart[1], pathStart[2]], ['L', pathEnd[1], pathEnd[2]], ['L', toPathEnd[1], toPathEnd[2]], ['L', toPathStart[1], toPathStart[2]], ['Z']);\n }\n result.isFlat = isFlat;\n }\n }\n return result;\n }\n /**\n * Remove a plot band by its id.\n *\n * @sample highcharts/members/axis-removeplotband/\n * Remove plot band by id\n * @sample highcharts/members/axis-addplotband/\n * Toggle the plot band from a button\n *\n * @function Highcharts.Axis#removePlotBand\n *\n * @param {string} id\n * The plot band's `id` as given in the original configuration\n * object or in the `addPlotBand` option.\n */\n function removePlotBand(id) {\n this.removePlotBandOrLine(id);\n }\n /**\n * Remove a plot band or plot line from the chart by id. Called\n * internally from `removePlotBand` and `removePlotLine`.\n * @private\n * @function Highcharts.Axis#removePlotBandOrLine\n */\n function removePlotBandOrLine(id) {\n const plotLinesAndBands = this.plotLinesAndBands, options = this.options, userOptions = this.userOptions;\n if (plotLinesAndBands) { // #15639\n let i = plotLinesAndBands.length;\n while (i--) {\n if (plotLinesAndBands[i].id === id) {\n plotLinesAndBands[i].destroy();\n }\n }\n ([\n options.plotLines || [],\n userOptions.plotLines || [],\n options.plotBands || [],\n userOptions.plotBands || []\n ]).forEach(function (arr) {\n i = arr.length;\n while (i--) {\n if ((arr[i] || {}).id === id) {\n PlotLineOrBandAxis_erase(arr, arr[i]);\n }\n }\n });\n }\n }\n /**\n * Remove a plot line by its id.\n *\n * @sample highcharts/xaxis/plotlines-id/\n * Remove plot line by id\n * @sample highcharts/members/axis-addplotline/\n * Toggle the plot line from a button\n *\n * @function Highcharts.Axis#removePlotLine\n *\n * @param {string} id\n * The plot line's `id` as given in the original configuration\n * object or in the `addPlotLine` option.\n */\n function removePlotLine(id) {\n this.removePlotBandOrLine(id);\n }\n})(PlotLineOrBandAxis || (PlotLineOrBandAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const PlotLineOrBand_PlotLineOrBandAxis = (PlotLineOrBandAxis);\n\n;// ./code/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { addEvent: PlotLineOrBand_addEvent, arrayMax: PlotLineOrBand_arrayMax, arrayMin: PlotLineOrBand_arrayMin, defined: PlotLineOrBand_defined, destroyObjectProperties: PlotLineOrBand_destroyObjectProperties, erase: PlotLineOrBand_erase, fireEvent: PlotLineOrBand_fireEvent, merge: PlotLineOrBand_merge, objectEach: PlotLineOrBand_objectEach, pick: PlotLineOrBand_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The object wrapper for plot lines and plot bands\n *\n * @class\n * @name Highcharts.PlotLineOrBand\n *\n * @param {Highcharts.Axis} axis\n * Related axis.\n *\n * @param {Highcharts.AxisPlotLinesOptions|Highcharts.AxisPlotBandsOptions} [options]\n * Options to use.\n */\nclass PlotLineOrBand {\n /* *\n *\n * Static Functions\n *\n * */\n static compose(ChartClass, AxisClass) {\n PlotLineOrBand_addEvent(ChartClass, 'afterInit', function () {\n this.labelCollectors.push(() => {\n const labels = [];\n for (const axis of this.axes) {\n for (const { label, options } of axis.plotLinesAndBands) {\n if (label && !options?.label?.allowOverlap) {\n labels.push(label);\n }\n }\n }\n return labels;\n });\n });\n return PlotLineOrBand_PlotLineOrBandAxis.compose(PlotLineOrBand, AxisClass);\n }\n /* *\n *\n * Constructor\n *\n * */\n constructor(axis, options) {\n /**\n * Related axis.\n *\n * @name Highcharts.PlotLineOrBand#axis\n * @type {Highcharts.Axis}\n */\n this.axis = axis;\n /**\n * Options of the plot line or band.\n *\n * @name Highcharts.PlotLineOrBand#options\n * @type {AxisPlotBandsOptions|AxisPlotLinesOptions}\n */\n this.options = options;\n this.id = options.id;\n }\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable no-invalid-this, valid-jsdoc */\n /**\n * Render the plot line or plot band. If it is already existing,\n * move it.\n * @private\n * @function Highcharts.PlotLineOrBand#render\n */\n render() {\n PlotLineOrBand_fireEvent(this, 'render');\n const { axis, options } = this, { horiz, logarithmic } = axis, { color, events, zIndex = 0 } = options, { renderer, time } = axis.chart, groupAttribs = {}, \n // These properties only exist on either band or line\n to = time.parse(options.to), from = time.parse(options.from), value = time.parse(options.value), borderWidth = options.borderWidth;\n let optionsLabel = options.label, { label, svgElem } = this, path = [], group;\n const isBand = PlotLineOrBand_defined(from) && PlotLineOrBand_defined(to), isLine = PlotLineOrBand_defined(value), isNew = !svgElem, attribs = {\n 'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') +\n (options.className || '')\n };\n let groupName = isBand ? 'bands' : 'lines';\n // Set the presentational attributes\n if (!axis.chart.styledMode) {\n if (isLine) {\n attribs.stroke = color || \"#999999\" /* Palette.neutralColor40 */;\n attribs['stroke-width'] = PlotLineOrBand_pick(options.width, 1);\n if (options.dashStyle) {\n attribs.dashstyle = options.dashStyle;\n }\n }\n else if (isBand) { // Plot band\n attribs.fill = color || \"#e6e9ff\" /* Palette.highlightColor10 */;\n if (borderWidth) {\n attribs.stroke = options.borderColor;\n attribs['stroke-width'] = borderWidth;\n }\n }\n }\n // Grouping and zIndex\n groupAttribs.zIndex = zIndex;\n groupName += '-' + zIndex;\n group = axis.plotLinesAndBandsGroups[groupName];\n if (!group) {\n axis.plotLinesAndBandsGroups[groupName] = group =\n renderer.g('plot-' + groupName)\n .attr(groupAttribs).add();\n }\n // Create the path\n if (!svgElem) {\n /**\n * SVG element of the plot line or band.\n *\n * @name Highcharts.PlotLineOrBand#svgElem\n * @type {Highcharts.SVGElement}\n */\n this.svgElem = svgElem = renderer\n .path()\n .attr(attribs)\n .add(group);\n }\n // Set the path or return\n if (PlotLineOrBand_defined(value)) { // Plot line\n path = axis.getPlotLinePath({\n value: logarithmic?.log2lin(value) ?? value,\n lineWidth: svgElem.strokeWidth(),\n acrossPanes: options.acrossPanes\n });\n }\n else if (PlotLineOrBand_defined(from) && PlotLineOrBand_defined(to)) { // Plot band\n path = axis.getPlotBandPath(logarithmic?.log2lin(from) ?? from, logarithmic?.log2lin(to) ?? to, options);\n }\n else {\n return;\n }\n // Common for lines and bands. Add events only if they were not added\n // before.\n if (!this.eventsAdded && events) {\n PlotLineOrBand_objectEach(events, (event, eventType) => {\n svgElem?.on(eventType, (e) => {\n events[eventType].apply(this, [e]);\n });\n });\n this.eventsAdded = true;\n }\n if ((isNew || !svgElem.d) && path?.length) {\n svgElem.attr({ d: path });\n }\n else if (svgElem) {\n if (path) {\n svgElem.show();\n svgElem.animate({ d: path });\n }\n else if (svgElem.d) {\n svgElem.hide();\n if (label) {\n this.label = label = label.destroy();\n }\n }\n }\n // The plot band/line label\n if (optionsLabel &&\n (PlotLineOrBand_defined(optionsLabel.text) || PlotLineOrBand_defined(optionsLabel.formatter)) &&\n path?.length &&\n axis.width > 0 &&\n axis.height > 0 &&\n !path.isFlat) {\n // Apply defaults\n optionsLabel = PlotLineOrBand_merge({\n align: horiz && isBand ? 'center' : void 0,\n x: horiz ? !isBand && 4 : 10,\n verticalAlign: !horiz && isBand ? 'middle' : void 0,\n y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n rotation: horiz && !isBand ? 90 : 0,\n ...(isBand ? { inside: true } : {})\n }, optionsLabel);\n this.renderLabel(optionsLabel, path, isBand, zIndex);\n // Move out of sight\n }\n else if (label) {\n label.hide();\n }\n // Chainable\n return this;\n }\n /**\n * Render and align label for plot line or band.\n * @private\n * @function Highcharts.PlotLineOrBand#renderLabel\n */\n renderLabel(optionsLabel, path, isBand, zIndex) {\n const plotLine = this, axis = plotLine.axis, renderer = axis.chart.renderer, inside = optionsLabel.inside;\n let label = plotLine.label;\n // Add the SVG element\n if (!label) {\n /**\n * SVG element of the label.\n *\n * @name Highcharts.PlotLineOrBand#label\n * @type {Highcharts.SVGElement}\n */\n plotLine.label = label = renderer\n .text(this.getLabelText(optionsLabel), 0, 0, optionsLabel.useHTML)\n .attr({\n align: optionsLabel.textAlign || optionsLabel.align,\n rotation: optionsLabel.rotation,\n 'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') +\n '-label ' + (optionsLabel.className || ''),\n zIndex\n });\n if (!axis.chart.styledMode) {\n label.css(PlotLineOrBand_merge({\n fontSize: '0.8em',\n textOverflow: (isBand && !inside) ? '' : 'ellipsis'\n }, optionsLabel.style));\n }\n label.add();\n }\n // Get the bounding box and align the label\n // #3000 changed to better handle choice between plotband or plotline\n const xBounds = path.xBounds ||\n [path[0][1], path[1][1], (isBand ? path[2][1] : path[0][1])], yBounds = path.yBounds ||\n [path[0][2], path[1][2], (isBand ? path[2][2] : path[0][2])], x = PlotLineOrBand_arrayMin(xBounds), y = PlotLineOrBand_arrayMin(yBounds), bBoxWidth = PlotLineOrBand_arrayMax(xBounds) - x;\n label.align(optionsLabel, false, {\n x,\n y,\n width: bBoxWidth,\n height: PlotLineOrBand_arrayMax(yBounds) - y\n });\n if (!label.alignValue ||\n label.alignValue === 'left' ||\n PlotLineOrBand_defined(inside)) {\n label.css({\n width: (optionsLabel.style?.width || ((!isBand ||\n !inside) ? (label.rotation === 90 ?\n axis.height - (label.alignAttr.y -\n axis.top) : (optionsLabel.clip ?\n axis.width :\n axis.chart.chartWidth) - (label.alignAttr.x - axis.left)) :\n bBoxWidth)) + 'px'\n });\n }\n label.show(true);\n }\n /**\n * Get label's text content.\n * @private\n * @function Highcharts.PlotLineOrBand#getLabelText\n */\n getLabelText(optionsLabel) {\n return PlotLineOrBand_defined(optionsLabel.formatter) ?\n optionsLabel.formatter\n .call(this) :\n optionsLabel.text;\n }\n /**\n * Remove the plot line or band.\n *\n * @function Highcharts.PlotLineOrBand#destroy\n */\n destroy() {\n // Remove it from the lookup\n PlotLineOrBand_erase(this.axis.plotLinesAndBands, this);\n delete this.axis;\n PlotLineOrBand_destroyObjectProperties(this);\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const PlotLineOrBand_PlotLineOrBand = (PlotLineOrBand);\n/* *\n *\n * API Options\n *\n * */\n/**\n * Options for plot bands on axes.\n *\n * @typedef {Highcharts.XAxisPlotBandsOptions|Highcharts.YAxisPlotBandsOptions|Highcharts.ZAxisPlotBandsOptions} Highcharts.AxisPlotBandsOptions\n */\n/**\n * Options for plot band labels on axes.\n *\n * @typedef {Highcharts.XAxisPlotBandsLabelOptions|Highcharts.YAxisPlotBandsLabelOptions|Highcharts.ZAxisPlotBandsLabelOptions} Highcharts.AxisPlotBandsLabelOptions\n */\n/**\n * Options for plot lines on axes.\n *\n * @typedef {Highcharts.XAxisPlotLinesOptions|Highcharts.YAxisPlotLinesOptions|Highcharts.ZAxisPlotLinesOptions} Highcharts.AxisPlotLinesOptions\n */\n/**\n * Options for plot line labels on axes.\n *\n * @typedef {Highcharts.XAxisPlotLinesLabelOptions|Highcharts.YAxisPlotLinesLabelOptions|Highcharts.ZAxisPlotLinesLabelOptions} Highcharts.AxisPlotLinesLabelOptions\n */\n('');\n/* *\n *\n * API Options\n *\n * */\n/**\n * An array of colored bands stretching across the plot area marking an\n * interval on the axis.\n *\n * In styled mode, the plot bands are styled by the `.highcharts-plot-band`\n * class in addition to the `className` option.\n *\n * @productdesc {highcharts}\n * In a gauge, a plot band on the Y axis (value axis) will stretch along the\n * perimeter of the gauge.\n *\n * @type {Array<*>}\n * @product highcharts highstock gantt\n * @apioption xAxis.plotBands\n */\n/**\n * Flag to decide if plotBand should be rendered across all panes.\n *\n * @since 7.1.2\n * @product highstock\n * @type {boolean}\n * @default true\n * @apioption xAxis.plotBands.acrossPanes\n */\n/**\n * Border color for the plot band. Also requires `borderWidth` to be set.\n *\n * @type {Highcharts.ColorString}\n * @apioption xAxis.plotBands.borderColor\n */\n/**\n * Border radius for the plot band. Applies only to gauges. Can be a pixel\n * value or a percentage, for example `50%`.\n *\n * @type {number|string}\n * @since 11.4.2\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge-borderradius\n * Angular gauge with rounded plot bands\n * @apioption xAxis.plotBands.borderRadius\n */\n/**\n * Border width for the plot band. Also requires `borderColor` to be set.\n *\n * @type {number}\n * @default 0\n * @apioption xAxis.plotBands.borderWidth\n */\n/**\n * A custom class name, in addition to the default `highcharts-plot-band`,\n * to apply to each individual band.\n *\n * @type {string}\n * @since 5.0.0\n * @apioption xAxis.plotBands.className\n */\n/**\n * The color of the plot band.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n * Color band\n * @sample {highstock} stock/xaxis/plotbands/\n * Plot band on Y axis\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default ${palette.highlightColor10}\n * @apioption xAxis.plotBands.color\n */\n/**\n * An object defining mouse events for the plot band. Supported properties\n * are `click`, `mouseover`, `mouseout`, `mousemove`.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-events/\n * Mouse events demonstrated\n *\n * @since 1.2\n * @apioption xAxis.plotBands.events\n */\n/**\n * Click event on a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotBands.events.click\n */\n/**\n * Mouse move event on a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotBands.events.mousemove\n */\n/**\n * Mouse out event on the corner of a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotBands.events.mouseout\n */\n/**\n * Mouse over event on a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotBands.events.mouseover\n */\n/**\n * The start position of the plot band in axis units.\n *\n * On datetime axes, the value can be given as a timestamp or a date string.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n * Datetime axis\n * @sample {highcharts} highcharts/xaxis/plotbands-from/\n * Categorized axis\n * @sample {highstock} stock/xaxis/plotbands/\n * Plot band on Y axis\n *\n * @type {number|string}\n * @apioption xAxis.plotBands.from\n */\n/**\n * An id used for identifying the plot band in Axis.removePlotBand.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-id/\n * Remove plot band by id\n * @sample {highstock} highcharts/xaxis/plotbands-id/\n * Remove plot band by id\n *\n * @type {string}\n * @apioption xAxis.plotBands.id\n */\n/**\n * The end position of the plot band in axis units.\n *\n * On datetime axes, the value can be given as a timestamp or a date string.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n * Datetime axis\n * @sample {highcharts} highcharts/xaxis/plotbands-from/\n * Categorized axis\n * @sample {highstock} stock/xaxis/plotbands/\n * Plot band on Y axis\n *\n * @type {number|string}\n * @apioption xAxis.plotBands.to\n */\n/**\n * The z index of the plot band within the chart, relative to other\n * elements. Using the same z index as another element may give\n * unpredictable results, as the last rendered element will be on top.\n * Values from 0 to 20 make sense.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n * Behind plot lines by default\n * @sample {highcharts} highcharts/xaxis/plotbands-zindex/\n * Above plot lines\n * @sample {highcharts} highcharts/xaxis/plotbands-zindex-above-series/\n * Above plot lines and series\n *\n * @type {number}\n * @since 1.2\n * @apioption xAxis.plotBands.zIndex\n */\n/**\n * Text labels for the plot bands\n *\n * @product highcharts highstock gantt\n * @apioption xAxis.plotBands.label\n */\n/**\n * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n * \"right\".\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n * Aligned to the right\n * @sample {highstock} stock/xaxis/plotbands-label/\n * Plot band with labels\n *\n * @type {Highcharts.AlignValue}\n * @default center\n * @since 2.1\n * @apioption xAxis.plotBands.label.align\n */\n/**\n * Whether or not the label can be hidden if it overlaps with another label.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-allowoverlap/\n * A Plotband label overlapping another\n *\n * @type {boolean}\n * @default undefined\n * @since 11.4.8\n * @apioption xAxis.plotBands.label.allowOverlap\n */\n/**\n * Wether or not the text of the label can exceed the width of the label.\n *\n * @type {boolean}\n * @product highcharts highstock gantt\n * @sample {highcharts} highcharts/xaxis/plotbands-label-textwidth/\n * Displaying text with text-wrapping/ellipsis, or the full text.\n *\n * @default true\n * @since 11.4.6\n * @apioption xAxis.plotBands.label.inside\n */\n/**\n * Rotation of the text label in degrees .\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n * Vertical text\n *\n * @type {number}\n * @default 0\n * @since 2.1\n * @apioption xAxis.plotBands.label.rotation\n */\n/**\n * CSS styles for the text label.\n *\n * In styled mode, the labels are styled by the\n * `.highcharts-plot-band-label` class.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-style/\n * Blue and bold label\n *\n * @type {Highcharts.CSSObject}\n * @since 2.1\n * @apioption xAxis.plotBands.label.style\n */\n/**\n * The string text itself. A subset of HTML is supported.\n *\n * @type {string}\n * @since 2.1\n * @apioption xAxis.plotBands.label.text\n */\n/**\n * The text alignment for the label. While `align` determines where the\n * texts anchor point is placed within the plot band, `textAlign` determines\n * how the text is aligned against its anchor point. Possible values are\n * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n * Vertical text in center position but text-aligned left\n *\n * @type {Highcharts.AlignValue}\n * @since 2.1\n * @apioption xAxis.plotBands.label.textAlign\n */\n/**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type {boolean}\n * @default false\n * @since 3.0.3\n * @apioption xAxis.plotBands.label.useHTML\n */\n/**\n * Vertical alignment of the label relative to the plot band. Can be one of\n * \"top\", \"middle\" or \"bottom\".\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-verticalalign/\n * Vertically centered label\n * @sample {highstock} stock/xaxis/plotbands-label/\n * Plot band with labels\n *\n * @type {Highcharts.VerticalAlignValue}\n * @default top\n * @since 2.1\n * @apioption xAxis.plotBands.label.verticalAlign\n */\n/**\n * Horizontal position relative the alignment. Default varies by\n * orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n * Aligned 10px from the right edge\n * @sample {highstock} stock/xaxis/plotbands-label/\n * Plot band with labels\n *\n * @type {number}\n * @since 2.1\n * @apioption xAxis.plotBands.label.x\n */\n/**\n * Vertical position of the text baseline relative to the alignment. Default\n * varies by orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-y/\n * Label on x axis\n * @sample {highstock} stock/xaxis/plotbands-label/\n * Plot band with labels\n *\n * @type {number}\n * @since 2.1\n * @apioption xAxis.plotBands.label.y\n */\n/**\n * An array of lines stretching across the plot area, marking a specific\n * value on one of the axes.\n *\n * In styled mode, the plot lines are styled by the\n * `.highcharts-plot-line` class in addition to the `className` option.\n *\n * @type {Array<*>}\n * @product highcharts highstock gantt\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n * Basic plot line\n * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n * Solid gauge plot line\n * @apioption xAxis.plotLines\n */\n/**\n * Flag to decide if plotLine should be rendered across all panes.\n *\n * @sample {highstock} stock/xaxis/plotlines-acrosspanes/\n * Plot lines on different panes\n *\n * @since 7.1.2\n * @product highstock\n * @type {boolean}\n * @default true\n * @apioption xAxis.plotLines.acrossPanes\n */\n/**\n * A custom class name, in addition to the default `highcharts-plot-line`,\n * to apply to each individual line.\n *\n * @type {string}\n * @since 5.0.0\n * @apioption xAxis.plotLines.className\n */\n/**\n * The color of the line.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n * A red line from X axis\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {Highcharts.ColorString}\n * @default ${palette.neutralColor40}\n * @apioption xAxis.plotLines.color\n */\n/**\n * The dashing or dot style for the plot line. For possible values see\n * [this overview](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-dashstyle/\n * Dash and dot pattern\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {Highcharts.DashStyleValue}\n * @default Solid\n * @since 1.2\n * @apioption xAxis.plotLines.dashStyle\n */\n/**\n * An object defining mouse events for the plot line. Supported\n * properties are `click`, `mouseover`, `mouseout`, `mousemove`.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-events/\n * Mouse events demonstrated\n *\n * @since 1.2\n * @apioption xAxis.plotLines.events\n */\n/**\n * Click event on a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotLines.events.click\n */\n/**\n * Mouse move event on a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotLines.events.mousemove\n */\n/**\n * Mouse out event on the corner of a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotLines.events.mouseout\n */\n/**\n * Mouse over event on a plot band.\n *\n * @type {Highcharts.EventCallbackFunction}\n * @apioption xAxis.plotLines.events.mouseover\n */\n/**\n * An id used for identifying the plot line in Axis.removePlotLine.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-id/\n * Remove plot line by id\n *\n * @type {string}\n * @apioption xAxis.plotLines.id\n */\n/**\n * The position of the line in axis units.\n *\n * On datetime axes, the value can be given as a timestamp or a date string.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n * Between two categories on X axis\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {number|string}\n * @apioption xAxis.plotLines.value\n */\n/**\n * The width or thickness of the plot line.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n * 2px wide line from X axis\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {number}\n * @default 2\n * @apioption xAxis.plotLines.width\n */\n/**\n * The z index of the plot line within the chart.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-zindex-behind/\n * Behind plot lines by default\n * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above/\n * Above plot lines\n * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above-all/\n * Above plot lines and series\n *\n * @type {number}\n * @since 1.2\n * @apioption xAxis.plotLines.zIndex\n */\n/**\n * Text labels for the plot bands\n *\n * @apioption xAxis.plotLines.label\n */\n/**\n * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n * \"right\".\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n * Aligned to the right\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {Highcharts.AlignValue}\n * @default left\n * @since 2.1\n * @apioption xAxis.plotLines.label.align\n */\n/**\n * Whether to hide labels that are outside the plot area.\n *\n * @type {boolean}\n * @default false\n * @since 10.3.3\n * @apioption xAxis.plotLines.labels.clip\n */\n/**\n * Callback JavaScript function to format the label. Useful properties like\n * the value of plot line or the range of plot band (`from` & `to`\n * properties) can be found in `this.options` object.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-plotbands-label-formatter\n * Label formatters for plot line and plot band.\n * @type {Highcharts.FormatterCallbackFunction}\n * @apioption xAxis.plotLines.label.formatter\n */\n/**\n * Rotation of the text label in degrees. Defaults to 0 for horizontal plot\n * lines and 90 for vertical lines.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n * Slanted text\n *\n * @type {number}\n * @since 2.1\n * @apioption xAxis.plotLines.label.rotation\n */\n/**\n * CSS styles for the text label.\n *\n * In styled mode, the labels are styled by the\n * `.highcharts-plot-line-label` class.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-style/\n * Blue and bold label\n *\n * @type {Highcharts.CSSObject}\n * @since 2.1\n * @apioption xAxis.plotLines.label.style\n */\n/**\n * The text itself. A subset of HTML is supported.\n *\n * @type {string}\n * @since 2.1\n * @apioption xAxis.plotLines.label.text\n */\n/**\n * The text alignment for the label. While `align` determines where the\n * texts anchor point is placed within the plot band, `textAlign` determines\n * how the text is aligned against its anchor point. Possible values are\n * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-textalign/\n * Text label in bottom position\n *\n * @type {Highcharts.AlignValue}\n * @since 2.1\n * @apioption xAxis.plotLines.label.textAlign\n */\n/**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type {boolean}\n * @default false\n * @since 3.0.3\n * @apioption xAxis.plotLines.label.useHTML\n */\n/**\n * Vertical alignment of the label relative to the plot line. Can be\n * one of \"top\", \"middle\" or \"bottom\".\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n * Vertically centered label\n *\n * @type {Highcharts.VerticalAlignValue}\n * @default {highcharts} top\n * @default {highstock} top\n * @since 2.1\n * @apioption xAxis.plotLines.label.verticalAlign\n */\n/**\n * Horizontal position relative the alignment. Default varies by\n * orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n * Aligned 10px from the right edge\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {number}\n * @since 2.1\n * @apioption xAxis.plotLines.label.x\n */\n/**\n * Vertical position of the text baseline relative to the alignment. Default\n * varies by orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-y/\n * Label below the plot line\n * @sample {highstock} stock/xaxis/plotlines/\n * Plot line on Y axis\n *\n * @type {number}\n * @since 2.1\n * @apioption xAxis.plotLines.label.y\n */\n/**\n * @type {Array<*>}\n * @extends xAxis.plotBands\n * @apioption yAxis.plotBands\n */\n/**\n * In a gauge chart, this option determines the inner radius of the\n * plot band that stretches along the perimeter. It can be given as\n * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n * By default, the inner radius is controlled by the [thickness](\n * #yAxis.plotBands.thickness) option.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n * Gauge plot band\n *\n * @type {number|string}\n * @since 2.3\n * @product highcharts\n * @apioption yAxis.plotBands.innerRadius\n */\n/**\n * In a gauge chart, this option determines the outer radius of the\n * plot band that stretches along the perimeter. It can be given as\n * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n * Gauge plot band\n *\n * @type {number|string}\n * @default 100%\n * @since 2.3\n * @product highcharts\n * @apioption yAxis.plotBands.outerRadius\n */\n/**\n * In a gauge chart, this option sets the width of the plot band\n * stretching along the perimeter. It can be given as a percentage\n * string, like `\"10%\"`, or as a pixel number, like `10`. The default\n * value 10 is the same as the default [tickLength](#yAxis.tickLength),\n * thus making the plot band act as a background for the tick markers.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n * Gauge plot band\n *\n * @type {number|string}\n * @default 10\n * @since 2.3\n * @product highcharts\n * @apioption yAxis.plotBands.thickness\n */\n/**\n * @type {Array<*>}\n * @extends xAxis.plotLines\n * @apioption yAxis.plotLines\n */\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Tooltip.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject: Tooltip_animObject } = AnimationUtilities;\n\nconst { format: Tooltip_format } = Core_Templating;\n\nconst { composed: Tooltip_composed, dateFormats, doc: Tooltip_doc, isSafari } = Core_Globals;\n\nconst { distribute } = Renderer_RendererUtilities;\n\n\nconst { addEvent: Tooltip_addEvent, clamp: Tooltip_clamp, css: Tooltip_css, discardElement: Tooltip_discardElement, extend: Tooltip_extend, fireEvent: Tooltip_fireEvent, isArray: Tooltip_isArray, isNumber: Tooltip_isNumber, isObject: Tooltip_isObject, isString: Tooltip_isString, merge: Tooltip_merge, pick: Tooltip_pick, pushUnique: Tooltip_pushUnique, splat: Tooltip_splat, syncTimeout: Tooltip_syncTimeout } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * Tooltip of a chart.\n *\n * @class\n * @name Highcharts.Tooltip\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.TooltipOptions} options\n * Tooltip options.\n *\n * @param {Highcharts.Pointer} pointer\n * The pointer instance.\n */\nclass Tooltip {\n /* *\n *\n * Constructors\n *\n * */\n constructor(chart, options, pointer) {\n /* *\n *\n * Properties\n *\n * */\n this.allowShared = true;\n this.crosshairs = [];\n this.distance = 0;\n this.isHidden = true;\n this.isSticky = false;\n this.options = {};\n this.outside = false;\n this.chart = chart;\n this.init(chart, options);\n this.pointer = pointer;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Build the body (lines) of the tooltip by iterating over the items and\n * returning one entry for each item, abstracting this functionality allows\n * to easily overwrite and extend it.\n *\n * @private\n * @function Highcharts.Tooltip#bodyFormatter\n */\n bodyFormatter(points) {\n return points.map((point) => {\n const tooltipOptions = point.series.tooltipOptions, formatPrefix = point.formatPrefix || 'point';\n return (tooltipOptions[formatPrefix + 'Formatter'] ||\n point.tooltipFormatter).call(point, tooltipOptions[formatPrefix + 'Format'] || '');\n });\n }\n /**\n * Destroy the single tooltips in a split tooltip.\n * If the tooltip is active then it is not destroyed, unless forced to.\n *\n * @private\n * @function Highcharts.Tooltip#cleanSplit\n *\n * @param {boolean} [force]\n * Force destroy all tooltips.\n */\n cleanSplit(force) {\n this.chart.series.forEach(function (series) {\n const tt = series && series.tt;\n if (tt) {\n if (!tt.isActive || force) {\n series.tt = tt.destroy();\n }\n else {\n tt.isActive = false;\n }\n }\n });\n }\n /**\n * In case no user defined formatter is given, this will be used. Note that\n * the context here is an object holding point, series, x, y etc.\n *\n * @function Highcharts.Tooltip#defaultFormatter\n *\n * @param {Highcharts.Tooltip} tooltip\n *\n * @return {string|Array}\n * Returns a string (single tooltip and shared)\n * or an array of strings (split tooltip)\n */\n defaultFormatter(tooltip) {\n const hoverPoints = this.points || Tooltip_splat(this);\n let s;\n // Build the header\n s = [tooltip.headerFooterFormatter(hoverPoints[0])];\n // Build the values\n s = s.concat(tooltip.bodyFormatter(hoverPoints));\n // Footer\n s.push(tooltip.headerFooterFormatter(hoverPoints[0], true));\n return s;\n }\n /**\n * Removes and destroys the tooltip and its elements.\n *\n * @function Highcharts.Tooltip#destroy\n */\n destroy() {\n // Destroy and clear local variables\n if (this.label) {\n this.label = this.label.destroy();\n }\n if (this.split) {\n this.cleanSplit(true);\n if (this.tt) {\n this.tt = this.tt.destroy();\n }\n }\n if (this.renderer) {\n this.renderer = this.renderer.destroy();\n Tooltip_discardElement(this.container);\n }\n Core_Utilities.clearTimeout(this.hideTimer);\n }\n /**\n * Extendable method to get the anchor position of the tooltip\n * from a point or set of points\n *\n * @private\n * @function Highcharts.Tooltip#getAnchor\n */\n getAnchor(points, mouseEvent) {\n const { chart, pointer } = this, inverted = chart.inverted, plotTop = chart.plotTop, plotLeft = chart.plotLeft;\n let ret;\n points = Tooltip_splat(points);\n // If reversedStacks are false the tooltip position should be taken from\n // the last point (#17948)\n if (points[0].series &&\n points[0].series.yAxis &&\n !points[0].series.yAxis.options.reversedStacks) {\n points = points.slice().reverse();\n }\n // When tooltip follows mouse, relate the position to the mouse\n if (this.followPointer && mouseEvent) {\n if (typeof mouseEvent.chartX === 'undefined') {\n mouseEvent = pointer.normalize(mouseEvent);\n }\n ret = [\n mouseEvent.chartX - plotLeft,\n mouseEvent.chartY - plotTop\n ];\n // Some series types use a specificly calculated tooltip position for\n // each point\n }\n else if (points[0].tooltipPos) {\n ret = points[0].tooltipPos;\n // Calculate the average position and adjust for axis positions\n }\n else {\n let chartX = 0, chartY = 0;\n points.forEach(function (point) {\n const pos = point.pos(true);\n if (pos) {\n chartX += pos[0];\n chartY += pos[1];\n }\n });\n chartX /= points.length;\n chartY /= points.length;\n // When shared, place the tooltip next to the mouse (#424)\n if (this.shared && points.length > 1 && mouseEvent) {\n if (inverted) {\n chartX = mouseEvent.chartX;\n }\n else {\n chartY = mouseEvent.chartY;\n }\n }\n // Use the average position for multiple points\n ret = [chartX - plotLeft, chartY - plotTop];\n }\n return ret.map(Math.round);\n }\n /**\n * Get the CSS class names for the tooltip's label. Styles the label\n * by `colorIndex` or user-defined CSS.\n *\n * @function Highcharts.Tooltip#getClassName\n *\n * @return {string}\n * The class names.\n */\n getClassName(point, isSplit, isHeader) {\n const options = this.options, series = point.series, seriesOptions = series.options;\n return [\n options.className,\n 'highcharts-label',\n isHeader && 'highcharts-tooltip-header',\n isSplit ? 'highcharts-tooltip-box' : 'highcharts-tooltip',\n !isHeader && 'highcharts-color-' + Tooltip_pick(point.colorIndex, series.colorIndex),\n (seriesOptions && seriesOptions.className)\n ].filter(Tooltip_isString).join(' ');\n }\n /**\n * Creates the Tooltip label element if it does not exist, then returns it.\n *\n * @function Highcharts.Tooltip#getLabel\n *\n * @return {Highcharts.SVGElement}\n * Tooltip label\n */\n getLabel({ anchorX, anchorY } = { anchorX: 0, anchorY: 0 }) {\n const tooltip = this, styledMode = this.chart.styledMode, options = this.options, doSplit = this.split && this.allowShared;\n let container = this.container, renderer = this.chart.renderer;\n // If changing from a split tooltip to a non-split tooltip, we must\n // destroy it in order to get the SVG right. #13868.\n if (this.label) {\n const wasSplit = !this.label.hasClass('highcharts-label');\n if ((!doSplit && wasSplit) || (doSplit && !wasSplit)) {\n this.destroy();\n }\n }\n if (!this.label) {\n if (this.outside) {\n const chart = this.chart, chartStyle = chart.options.chart.style, Renderer = Renderer_RendererRegistry.getRendererType();\n /**\n * Reference to the tooltip's container, when\n * [Highcharts.Tooltip#outside] is set to true, otherwise\n * it's undefined.\n *\n * @name Highcharts.Tooltip#container\n * @type {Highcharts.HTMLDOMElement|undefined}\n */\n this.container = container = Core_Globals.doc.createElement('div');\n container.className = ('highcharts-tooltip-container ' +\n (chart.renderTo.className.match(/(highcharts[a-zA-Z0-9-]+)\\s?/gm) || [].join(' ')));\n // We need to set pointerEvents = 'none' as otherwise it makes\n // the area under the tooltip non-hoverable even after the\n // tooltip disappears, #19035.\n Tooltip_css(container, {\n position: 'absolute',\n top: '1px',\n pointerEvents: 'none',\n zIndex: Math.max(this.options.style.zIndex || 0, (chartStyle && chartStyle.zIndex || 0) + 3)\n });\n /**\n * Reference to the tooltip's renderer, when\n * [Highcharts.Tooltip#outside] is set to true, otherwise\n * it's undefined.\n *\n * @name Highcharts.Tooltip#renderer\n * @type {Highcharts.SVGRenderer|undefined}\n */\n this.renderer = renderer = new Renderer(container, 0, 0, chartStyle, void 0, void 0, renderer.styledMode);\n }\n // Create the label\n if (doSplit) {\n this.label = renderer.g('tooltip');\n }\n else {\n this.label = renderer\n .label('', anchorX, anchorY, options.shape, void 0, void 0, options.useHTML, void 0, 'tooltip')\n .attr({\n padding: options.padding,\n r: options.borderRadius\n });\n if (!styledMode) {\n this.label\n .attr({\n fill: options.backgroundColor,\n 'stroke-width': options.borderWidth || 0\n })\n // #2301, #2657\n .css(options.style)\n .css({\n pointerEvents: (options.style.pointerEvents ||\n (this.shouldStickOnContact() ? 'auto' : 'none'))\n });\n }\n }\n // Split tooltip use updateTooltipContainer to position the tooltip\n // container.\n if (tooltip.outside) {\n const label = this.label;\n [label.xSetter, label.ySetter].forEach((setter, i) => {\n label[i ? 'ySetter' : 'xSetter'] = (value) => {\n setter.call(label, tooltip.distance);\n label[i ? 'y' : 'x'] = value;\n if (container) {\n container.style[i ? 'top' : 'left'] = `${value}px`;\n }\n };\n });\n }\n this.label\n .attr({ zIndex: 8 })\n .shadow(options.shadow)\n .add();\n }\n if (container && !container.parentElement) {\n Core_Globals.doc.body.appendChild(container);\n }\n return this.label;\n }\n /**\n * Get the total area available area to place the tooltip\n *\n * @private\n */\n getPlayingField() {\n const { body, documentElement } = Tooltip_doc, { chart, distance, outside } = this;\n return {\n width: outside ?\n // Subtract distance to prevent scrollbars\n Math.max(body.scrollWidth, documentElement.scrollWidth, body.offsetWidth, documentElement.offsetWidth, documentElement.clientWidth) - (2 * distance) - 2 :\n chart.chartWidth,\n height: outside ?\n Math.max(body.scrollHeight, documentElement.scrollHeight, body.offsetHeight, documentElement.offsetHeight, documentElement.clientHeight) :\n chart.chartHeight\n };\n }\n /**\n * Place the tooltip in a chart without spilling over and not covering the\n * point itself.\n *\n * @function Highcharts.Tooltip#getPosition\n *\n * @param {number} boxWidth\n * Width of the tooltip box.\n *\n * @param {number} boxHeight\n * Height of the tooltip box.\n *\n * @param {Highcharts.Point} point\n * Tooltip related point.\n *\n * @return {Highcharts.PositionObject}\n * Recommended position of the tooltip.\n */\n getPosition(boxWidth, boxHeight, point) {\n const { distance, chart, outside, pointer } = this, { inverted, plotLeft, plotTop, polar } = chart, { plotX = 0, plotY = 0 } = point, ret = {}, \n // Don't use h if chart isn't inverted (#7242) ???\n h = (inverted && point.h) || 0, // #4117 ???\n { height: outerHeight, width: outerWidth } = this.getPlayingField(), chartPosition = pointer.getChartPosition(), scaleX = (val) => (val * chartPosition.scaleX), scaleY = (val) => (val * chartPosition.scaleY), \n // Build parameter arrays for firstDimension()/secondDimension()\n buildDimensionArray = (dim) => {\n const isX = dim === 'x';\n return [\n dim, // Dimension - x or y\n isX ? outerWidth : outerHeight,\n isX ? boxWidth : boxHeight\n ].concat(outside ? [\n // If we are using tooltip.outside, we need to scale the\n // position to match scaling of the container in case there\n // is a transform/zoom on the container. #11329\n isX ? scaleX(boxWidth) : scaleY(boxHeight),\n isX ? chartPosition.left - distance +\n scaleX(plotX + plotLeft) :\n chartPosition.top - distance +\n scaleY(plotY + plotTop),\n 0,\n isX ? outerWidth : outerHeight\n ] : [\n // Not outside, no scaling is needed\n isX ? boxWidth : boxHeight,\n isX ? plotX + plotLeft : plotY + plotTop,\n isX ? plotLeft : plotTop,\n isX ? plotLeft + chart.plotWidth :\n plotTop + chart.plotHeight\n ]);\n };\n let first = buildDimensionArray('y'), second = buildDimensionArray('x'), swapped;\n // Handle negative points or reversed axis (#13780)\n let flipped = !!point.negative;\n if (!polar &&\n chart.hoverSeries?.yAxis?.reversed) {\n flipped = !flipped;\n }\n // The far side is right or bottom\n const preferFarSide = !this.followPointer &&\n Tooltip_pick(point.ttBelow, polar ? false : !inverted === flipped), // #4984\n /*\n * Handle the preferred dimension. When the preferred dimension is\n * tooltip on top or bottom of the point, it will look for space\n * there.\n *\n * @private\n */\n firstDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n point, min, max) {\n const scaledDist = outside ?\n (dim === 'y' ? scaleY(distance) : scaleX(distance)) :\n distance, scaleDiff = (innerSize - scaledInnerSize) / 2, roomLeft = scaledInnerSize < point - distance, roomRight = point + distance + scaledInnerSize < outerSize, alignedLeft = point - scaledDist - innerSize + scaleDiff, alignedRight = point + scaledDist - scaleDiff;\n if (preferFarSide && roomRight) {\n ret[dim] = alignedRight;\n }\n else if (!preferFarSide && roomLeft) {\n ret[dim] = alignedLeft;\n }\n else if (roomLeft) {\n ret[dim] = Math.min(max - scaledInnerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n }\n else if (roomRight) {\n ret[dim] = Math.max(min, alignedRight + h + innerSize > outerSize ?\n alignedRight :\n alignedRight + h);\n }\n else {\n return false;\n }\n }, \n /*\n * Handle the secondary dimension. If the preferred dimension is\n * tooltip on top or bottom of the point, the second dimension is to\n * align the tooltip above the point, trying to align center but\n * allowing left or right align within the chart box.\n *\n * @private\n */\n secondDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n point) {\n // Too close to the edge, return false and swap dimensions\n if (point < distance || point > outerSize - distance) {\n return false;\n }\n // Align left/top\n if (point < innerSize / 2) {\n ret[dim] = 1;\n // Align right/bottom\n }\n else if (point > outerSize - scaledInnerSize / 2) {\n ret[dim] = outerSize - scaledInnerSize - 2;\n // Align center\n }\n else {\n ret[dim] = point - innerSize / 2;\n }\n }, \n /*\n * Swap the dimensions\n */\n swap = function (count) {\n [first, second] = [second, first];\n swapped = count;\n }, run = () => {\n if (firstDimension.apply(0, first) !== false) {\n if (secondDimension.apply(0, second) === false &&\n !swapped) {\n swap(true);\n run();\n }\n }\n else if (!swapped) {\n swap(true);\n run();\n }\n else {\n ret.x = ret.y = 0;\n }\n };\n // Under these conditions, prefer the tooltip on the side of the point\n if ((inverted && !polar) || this.len > 1) {\n swap();\n }\n run();\n return ret;\n }\n /**\n * Hides the tooltip with a fade out animation.\n *\n * @function Highcharts.Tooltip#hide\n *\n * @param {number} [delay]\n * The fade out in milliseconds. If no value is provided the value\n * of the tooltip.hideDelay option is used. A value of 0 disables\n * the fade out animation.\n */\n hide(delay) {\n const tooltip = this;\n // Disallow duplicate timers (#1728, #1766)\n Core_Utilities.clearTimeout(this.hideTimer);\n delay = Tooltip_pick(delay, this.options.hideDelay);\n if (!this.isHidden) {\n this.hideTimer = Tooltip_syncTimeout(function () {\n const label = tooltip.getLabel();\n // If there is a delay, fade out with the default duration. If\n // the hideDelay is 0, we assume no animation is wanted, so we\n // pass 0 duration. #12994.\n tooltip.getLabel().animate({\n opacity: 0\n }, {\n duration: delay ? 150 : delay,\n complete: () => {\n // #3088, assuming we're only using this for tooltips\n label.hide();\n // Clear the container for outside tooltip (#18490)\n if (tooltip.container) {\n tooltip.container.remove();\n }\n }\n });\n tooltip.isHidden = true;\n }, delay);\n }\n }\n /**\n * Initialize tooltip.\n *\n * @private\n * @function Highcharts.Tooltip#init\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.TooltipOptions} options\n * Tooltip options.\n */\n init(chart, options) {\n /**\n * Chart of the tooltip.\n *\n * @readonly\n * @name Highcharts.Tooltip#chart\n * @type {Highcharts.Chart}\n */\n this.chart = chart;\n /**\n * Used tooltip options.\n *\n * @readonly\n * @name Highcharts.Tooltip#options\n * @type {Highcharts.TooltipOptions}\n */\n this.options = options;\n /**\n * List of crosshairs.\n *\n * @private\n * @readonly\n * @name Highcharts.Tooltip#crosshairs\n * @type {Array}\n */\n this.crosshairs = [];\n /**\n * Tooltips are initially hidden.\n *\n * @private\n * @readonly\n * @name Highcharts.Tooltip#isHidden\n * @type {boolean}\n */\n this.isHidden = true;\n /**\n * True, if the tooltip is split into one label per series, with the\n * header close to the axis.\n *\n * @readonly\n * @name Highcharts.Tooltip#split\n * @type {boolean|undefined}\n */\n this.split = options.split && !chart.inverted && !chart.polar;\n /**\n * When the tooltip is shared, the entire plot area will capture mouse\n * movement or touch events.\n *\n * @readonly\n * @name Highcharts.Tooltip#shared\n * @type {boolean|undefined}\n */\n this.shared = options.shared || this.split;\n /**\n * Whether to allow the tooltip to render outside the chart's SVG\n * element box. By default (false), the tooltip is rendered within the\n * chart's SVG element, which results in the tooltip being aligned\n * inside the chart area.\n *\n * @readonly\n * @name Highcharts.Tooltip#outside\n * @type {boolean}\n *\n * @todo\n * Split tooltip does not support outside in the first iteration. Should\n * not be too complicated to implement.\n */\n this.outside = Tooltip_pick(options.outside, Boolean(chart.scrollablePixelsX || chart.scrollablePixelsY));\n }\n shouldStickOnContact(pointerEvent) {\n return !!(!this.followPointer &&\n this.options.stickOnContact &&\n (!pointerEvent || this.pointer.inClass(pointerEvent.target, 'highcharts-tooltip')));\n }\n /**\n * Moves the tooltip with a soft animation to a new position.\n *\n * @private\n * @function Highcharts.Tooltip#move\n *\n * @param {number} x\n *\n * @param {number} y\n *\n * @param {number} anchorX\n *\n * @param {number} anchorY\n */\n move(x, y, anchorX, anchorY) {\n const tooltip = this, animation = Tooltip_animObject(!tooltip.isHidden && tooltip.options.animation), skipAnchor = tooltip.followPointer || (tooltip.len || 0) > 1, attr = { x, y };\n if (!skipAnchor) {\n attr.anchorX = anchorX;\n attr.anchorY = anchorY;\n }\n animation.step = () => tooltip.drawTracker();\n tooltip.getLabel().animate(attr, animation);\n }\n /**\n * Refresh the tooltip's text and position.\n *\n * @function Highcharts.Tooltip#refresh\n *\n * @param {Highcharts.Point|Array} pointOrPoints\n * Either a point or an array of points.\n *\n * @param {Highcharts.PointerEventObject} [mouseEvent]\n * Mouse event, that is responsible for the refresh and should be\n * used for the tooltip update.\n */\n refresh(pointOrPoints, mouseEvent) {\n const tooltip = this, { chart, options, pointer, shared } = this, points = Tooltip_splat(pointOrPoints), point = points[0], formatString = options.format, formatter = options.formatter || tooltip.defaultFormatter, styledMode = chart.styledMode;\n let wasShared = tooltip.allowShared;\n if (!options.enabled || !point.series) { // #16820\n return;\n }\n Core_Utilities.clearTimeout(this.hideTimer);\n // A switch saying if this specific tooltip configuration allows shared\n // or split modes\n tooltip.allowShared = !(!Tooltip_isArray(pointOrPoints) &&\n pointOrPoints.series &&\n pointOrPoints.series.noSharedTooltip);\n wasShared = wasShared && !tooltip.allowShared;\n // Get the reference point coordinates (pie charts use tooltipPos)\n tooltip.followPointer = (!tooltip.split && point.series.tooltipOptions.followPointer);\n const anchor = tooltip.getAnchor(pointOrPoints, mouseEvent), x = anchor[0], y = anchor[1];\n // Shared tooltip, array is sent over\n if (shared && tooltip.allowShared) {\n pointer.applyInactiveState(points);\n // Now set hover state for the chosen ones:\n points.forEach((item) => item.setState('hover'));\n point.points = points;\n }\n this.len = points.length; // #6128\n const text = Tooltip_isString(formatString) ?\n Tooltip_format(formatString, point, chart) :\n formatter.call(point, tooltip);\n // Reset the preliminary circular references\n point.points = void 0;\n // Register the current series\n const currentSeries = point.series;\n this.distance = Tooltip_pick(currentSeries.tooltipOptions.distance, 16);\n // Update the inner HTML\n if (text === false) {\n this.hide();\n }\n else {\n // Update text\n if (tooltip.split && tooltip.allowShared) { // #13868\n this.renderSplit(text, points);\n }\n else {\n let checkX = x;\n let checkY = y;\n if (mouseEvent && pointer.isDirectTouch) {\n checkX = mouseEvent.chartX - chart.plotLeft;\n checkY = mouseEvent.chartY - chart.plotTop;\n }\n // #11493, #13095\n if (chart.polar ||\n currentSeries.options.clip === false ||\n points.some((p) => // #16004\n pointer.isDirectTouch || // ##17929\n p.series.shouldShowTooltip(checkX, checkY))) {\n const label = tooltip.getLabel(wasShared && tooltip.tt || {});\n // Prevent the tooltip from flowing over the chart box\n // (#6659)\n if (!options.style.width || styledMode) {\n label.css({\n width: (this.outside ?\n this.getPlayingField() :\n chart.spacingBox).width + 'px'\n });\n }\n label.attr({\n // Add class before the label BBox calculation (#21035)\n 'class': tooltip.getClassName(point),\n text: text && text.join ?\n text.join('') :\n text\n });\n // When the length of the label has increased, immediately\n // update the x position to prevent tooltip from flowing\n // outside the viewport during animation (#21371)\n if (this.outside) {\n label.attr({\n x: Tooltip_clamp(label.x || 0, 0, this.getPlayingField().width -\n (label.width || 0) -\n 1)\n });\n }\n if (!styledMode) {\n label.attr({\n stroke: (options.borderColor ||\n point.color ||\n currentSeries.color ||\n \"#666666\" /* Palette.neutralColor60 */)\n });\n }\n tooltip.updatePosition({\n plotX: x,\n plotY: y,\n negative: point.negative,\n ttBelow: point.ttBelow,\n h: anchor[2] || 0\n });\n }\n else {\n tooltip.hide();\n return;\n }\n }\n // Show it\n if (tooltip.isHidden && tooltip.label) {\n tooltip.label.attr({\n opacity: 1\n }).show();\n }\n tooltip.isHidden = false;\n }\n Tooltip_fireEvent(this, 'refresh');\n }\n /**\n * Render the split tooltip. Loops over each point's text and adds\n * a label next to the point, then uses the distribute function to\n * find best non-overlapping positions.\n *\n * @private\n * @function Highcharts.Tooltip#renderSplit\n *\n * @param {string|Array<(boolean|string)>} labels\n *\n * @param {Array} points\n */\n renderSplit(labels, points) {\n const tooltip = this;\n const { chart, chart: { chartWidth, chartHeight, plotHeight, plotLeft, plotTop, scrollablePixelsY = 0, scrollablePixelsX, styledMode }, distance, options, options: { positioner }, pointer } = tooltip;\n const { scrollLeft = 0, scrollTop = 0 } = chart.scrollablePlotArea?.scrollingContainer || {};\n // The area which the tooltip should be limited to. Limit to scrollable\n // plot area if enabled, otherwise limit to the chart container. If\n // outside is true it should be the whole viewport\n const bounds = (tooltip.outside &&\n typeof scrollablePixelsX !== 'number') ?\n Tooltip_doc.documentElement.getBoundingClientRect() : {\n left: scrollLeft,\n right: scrollLeft + chartWidth,\n top: scrollTop,\n bottom: scrollTop + chartHeight\n };\n const tooltipLabel = tooltip.getLabel();\n const ren = this.renderer || chart.renderer;\n const headerTop = Boolean(chart.xAxis[0] && chart.xAxis[0].opposite);\n const { left: chartLeft, top: chartTop } = pointer.getChartPosition();\n let distributionBoxTop = plotTop + scrollTop;\n let headerHeight = 0;\n let adjustedPlotHeight = plotHeight - scrollablePixelsY;\n /**\n * Calculates the anchor position for the partial tooltip\n *\n * @private\n * @param {Highcharts.Point} point The point related to the tooltip\n * @return {Object} Returns an object with anchorX and anchorY\n */\n function getAnchor(point) {\n const { isHeader, plotX = 0, plotY = 0, series } = point;\n let anchorX;\n let anchorY;\n if (isHeader) {\n // Set anchorX to plotX\n anchorX = Math.max(plotLeft + plotX, plotLeft);\n // Set anchorY to center of visible plot area.\n anchorY = plotTop + plotHeight / 2;\n }\n else {\n const { xAxis, yAxis } = series;\n // Set anchorX to plotX. Limit to within xAxis.\n anchorX = xAxis.pos + Tooltip_clamp(plotX, -distance, xAxis.len + distance);\n // Set anchorY, limit to the scrollable plot area\n if (series.shouldShowTooltip(0, yAxis.pos - plotTop + plotY, {\n ignoreX: true\n })) {\n anchorY = yAxis.pos + plotY;\n }\n }\n // Limit values to plot area\n anchorX = Tooltip_clamp(anchorX, bounds.left - distance, bounds.right + distance);\n return { anchorX, anchorY };\n }\n /**\n * Calculates the position of the partial tooltip\n *\n * @private\n * @param {number} anchorX\n * The partial tooltip anchor x position\n *\n * @param {number} anchorY\n * The partial tooltip anchor y position\n *\n * @param {boolean|undefined} isHeader\n * Whether the partial tooltip is a header\n *\n * @param {number} boxWidth\n * Width of the partial tooltip\n *\n * @return {Highcharts.PositionObject}\n * Returns the partial tooltip x and y position\n */\n function defaultPositioner(anchorX, anchorY, isHeader, boxWidth, alignedLeft = true) {\n let y;\n let x;\n if (isHeader) {\n y = headerTop ? 0 : adjustedPlotHeight;\n x = Tooltip_clamp(anchorX - (boxWidth / 2), bounds.left, bounds.right - boxWidth - (tooltip.outside ? chartLeft : 0));\n }\n else {\n y = anchorY - distributionBoxTop;\n x = alignedLeft ?\n anchorX - boxWidth - distance :\n anchorX + distance;\n x = Tooltip_clamp(x, alignedLeft ? x : bounds.left, bounds.right);\n }\n // NOTE: y is relative to distributionBoxTop\n return { x, y };\n }\n /**\n * Updates the attributes and styling of the partial tooltip. Creates a\n * new partial tooltip if it does not exists.\n *\n * @private\n * @param {Highcharts.SVGElement|undefined} partialTooltip\n * The partial tooltip to update\n * @param {Highcharts.Point} point\n * The point related to the partial tooltip\n * @param {boolean|string} str The text for the partial tooltip\n * @return {Highcharts.SVGElement} Returns the updated partial tooltip\n */\n function updatePartialTooltip(partialTooltip, point, str) {\n let tt = partialTooltip;\n const { isHeader, series } = point;\n if (!tt) {\n const attribs = {\n padding: options.padding,\n r: options.borderRadius\n };\n if (!styledMode) {\n attribs.fill = options.backgroundColor;\n attribs['stroke-width'] = options.borderWidth ?? 1;\n }\n tt = ren\n .label('', 0, 0, (options[isHeader ? 'headerShape' : 'shape']), void 0, void 0, options.useHTML)\n .addClass(tooltip.getClassName(point, true, isHeader))\n .attr(attribs)\n .add(tooltipLabel);\n }\n tt.isActive = true;\n tt.attr({\n text: str\n });\n if (!styledMode) {\n tt.css(options.style)\n .attr({\n stroke: (options.borderColor ||\n point.color ||\n series.color ||\n \"#333333\" /* Palette.neutralColor80 */)\n });\n }\n return tt;\n }\n // Graceful degradation for legacy formatters\n if (Tooltip_isString(labels)) {\n labels = [false, labels];\n }\n // Create the individual labels for header and points, ignore footer\n let boxes = labels.slice(0, points.length + 1).reduce(function (boxes, str, i) {\n if (str !== false && str !== '') {\n const point = (points[i - 1] ||\n {\n // Item 0 is the header. Instead of this, we could also\n // use the crosshair label\n isHeader: true,\n plotX: points[0].plotX,\n plotY: plotHeight,\n series: {}\n });\n const isHeader = point.isHeader;\n // Store the tooltip label reference on the series\n const owner = isHeader ? tooltip : point.series;\n const tt = owner.tt = updatePartialTooltip(owner.tt, point, str.toString());\n // Get X position now, so we can move all to the other side in\n // case of overflow\n const bBox = tt.getBBox();\n const boxWidth = bBox.width + tt.strokeWidth();\n if (isHeader) {\n headerHeight = bBox.height;\n adjustedPlotHeight += headerHeight;\n if (headerTop) {\n distributionBoxTop -= headerHeight;\n }\n }\n const { anchorX, anchorY } = getAnchor(point);\n if (typeof anchorY === 'number') {\n const size = bBox.height + 1;\n const boxPosition = (positioner ?\n positioner.call(tooltip, boxWidth, size, point) :\n defaultPositioner(anchorX, anchorY, isHeader, boxWidth));\n boxes.push({\n // 0-align to the top, 1-align to the bottom\n align: positioner ? 0 : void 0,\n anchorX,\n anchorY,\n boxWidth,\n point,\n rank: Tooltip_pick(boxPosition.rank, isHeader ? 1 : 0),\n size,\n target: boxPosition.y,\n tt,\n x: boxPosition.x\n });\n }\n else {\n // Hide tooltips which anchorY is outside the visible plot\n // area\n tt.isActive = false;\n }\n }\n return boxes;\n }, []);\n // Realign the tooltips towards the right if there is not enough space\n // to the left and there is space to the right\n if (!positioner && boxes.some((box) => {\n // Always realign if the beginning of a label is outside bounds\n const { outside } = tooltip;\n const boxStart = (outside ? chartLeft : 0) + box.anchorX;\n if (boxStart < bounds.left &&\n boxStart + box.boxWidth < bounds.right) {\n return true;\n }\n // Otherwise, check if there is more space available to the right\n return boxStart < (chartLeft - bounds.left) + box.boxWidth &&\n bounds.right - boxStart > boxStart;\n })) {\n boxes = boxes.map((box) => {\n const { x, y } = defaultPositioner(box.anchorX, box.anchorY, box.point.isHeader, box.boxWidth, false);\n return Tooltip_extend(box, {\n target: y,\n x\n });\n });\n }\n // Clean previous run (for missing points)\n tooltip.cleanSplit();\n // Distribute and put in place\n distribute(boxes, adjustedPlotHeight);\n const boxExtremes = {\n left: chartLeft,\n right: chartLeft\n };\n // Get the extremes from series tooltips\n boxes.forEach(function (box) {\n const { x, boxWidth, isHeader } = box;\n if (!isHeader) {\n if (tooltip.outside && chartLeft + x < boxExtremes.left) {\n boxExtremes.left = chartLeft + x;\n }\n if (!isHeader &&\n tooltip.outside &&\n boxExtremes.left + boxWidth > boxExtremes.right) {\n boxExtremes.right = chartLeft + x;\n }\n }\n });\n boxes.forEach(function (box) {\n const { x, anchorX, anchorY, pos, point: { isHeader } } = box;\n const attributes = {\n visibility: typeof pos === 'undefined' ? 'hidden' : 'inherit',\n x,\n /* NOTE: y should equal pos to be consistent with !split\n * tooltip, but is currently relative to plotTop. Is left as is\n * to avoid breaking change. Remove distributionBoxTop to make\n * it consistent.\n */\n y: (pos || 0) + distributionBoxTop,\n anchorX,\n anchorY\n };\n // Handle left-aligned tooltips overflowing the chart area\n if (tooltip.outside && x < anchorX) {\n const offset = chartLeft - boxExtremes.left;\n // Skip this if there is no overflow\n if (offset > 0) {\n if (!isHeader) {\n attributes.x = x + offset;\n attributes.anchorX = anchorX + offset;\n }\n if (isHeader) {\n attributes.x = (boxExtremes.right - boxExtremes.left) / 2;\n attributes.anchorX = anchorX + offset;\n }\n }\n }\n // Put the label in place\n box.tt.attr(attributes);\n });\n /* If we have a separate tooltip container, then update the necessary\n * container properties.\n * Test that tooltip has its own container and renderer before executing\n * the operation.\n */\n const { container, outside, renderer } = tooltip;\n if (outside && container && renderer) {\n // Set container size to fit the bounds\n const { width, height, x, y } = tooltipLabel.getBBox();\n renderer.setSize(width + x, height + y, false);\n // Position the tooltip container to the chart container\n container.style.left = boxExtremes.left + 'px';\n container.style.top = chartTop + 'px';\n }\n // Workaround for #18927, artefacts left by the shadows of split\n // tooltips in Safari v16 (2023). Check again with later versions if we\n // can remove this.\n if (isSafari) {\n tooltipLabel.attr({\n // Force a redraw of the whole group by chaining the opacity\n // slightly\n opacity: tooltipLabel.opacity === 1 ? 0.999 : 1\n });\n }\n }\n /**\n * If the `stickOnContact` option is active, this will add a tracker shape.\n *\n * @private\n * @function Highcharts.Tooltip#drawTracker\n */\n drawTracker() {\n const tooltip = this;\n if (!this.shouldStickOnContact()) {\n if (tooltip.tracker) {\n tooltip.tracker = tooltip.tracker.destroy();\n }\n return;\n }\n const chart = tooltip.chart;\n const label = tooltip.label;\n const points = tooltip.shared ? chart.hoverPoints : chart.hoverPoint;\n if (!label || !points) {\n return;\n }\n const box = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n // Combine anchor and tooltip\n const anchorPos = this.getAnchor(points);\n const labelBBox = label.getBBox();\n anchorPos[0] += chart.plotLeft - (label.translateX || 0);\n anchorPos[1] += chart.plotTop - (label.translateY || 0);\n // When the mouse pointer is between the anchor point and the label,\n // the label should stick.\n box.x = Math.min(0, anchorPos[0]);\n box.y = Math.min(0, anchorPos[1]);\n box.width = (anchorPos[0] < 0 ?\n Math.max(Math.abs(anchorPos[0]), labelBBox.width - anchorPos[0]) :\n Math.max(Math.abs(anchorPos[0]), labelBBox.width));\n box.height = (anchorPos[1] < 0 ?\n Math.max(Math.abs(anchorPos[1]), labelBBox.height - Math.abs(anchorPos[1])) :\n Math.max(Math.abs(anchorPos[1]), labelBBox.height));\n if (tooltip.tracker) {\n tooltip.tracker.attr(box);\n }\n else {\n tooltip.tracker = label.renderer\n .rect(box)\n .addClass('highcharts-tracker')\n .add(label);\n if (!chart.styledMode) {\n tooltip.tracker.attr({\n fill: 'rgba(0,0,0,0)'\n });\n }\n }\n }\n /**\n * @private\n */\n styledModeFormat(formatString) {\n return formatString\n .replace('style=\"font-size: 0.8em\"', 'class=\"highcharts-header\"')\n .replace(/style=\"color:{(point|series)\\.color}\"/g, 'class=\"highcharts-color-{$1.colorIndex} ' +\n '{series.options.className} ' +\n '{point.options.className}\"');\n }\n /**\n * Format the footer/header of the tooltip\n * #3397: abstraction to enable formatting of footer and header\n *\n * @private\n * @function Highcharts.Tooltip#headerFooterFormatter\n */\n headerFooterFormatter(point, isFooter) {\n const series = point.series, tooltipOptions = series.tooltipOptions, xAxis = series.xAxis, dateTime = xAxis && xAxis.dateTime, e = {\n isFooter,\n point\n };\n let xDateFormat = tooltipOptions.xDateFormat || '', formatString = tooltipOptions[isFooter ? 'footerFormat' : 'headerFormat'];\n Tooltip_fireEvent(this, 'headerFormatter', e, function (e) {\n // Guess the best date format based on the closest point distance\n // (#568, #3418)\n if (dateTime && !xDateFormat && Tooltip_isNumber(point.key)) {\n xDateFormat = dateTime.getXDateFormat(point.key, tooltipOptions.dateTimeLabelFormats);\n }\n // Insert the footer date format if any\n if (dateTime && xDateFormat) {\n if (Tooltip_isObject(xDateFormat)) {\n const format = xDateFormat;\n dateFormats[0] = (timestamp) => series.chart.time.dateFormat(format, timestamp);\n xDateFormat = '%0';\n }\n (point.tooltipDateKeys || ['key']).forEach((key) => {\n formatString = formatString.replace(new RegExp('point\\\\.' + key + '([ \\\\)}])', ''), `(point.${key}:${xDateFormat})$1`);\n });\n }\n // Replace default header style with class name\n if (series.chart.styledMode) {\n formatString = this.styledModeFormat(formatString);\n }\n e.text = Tooltip_format(formatString, point, this.chart);\n });\n return e.text || '';\n }\n /**\n * Updates the tooltip with the provided tooltip options.\n *\n * @function Highcharts.Tooltip#update\n *\n * @param {Highcharts.TooltipOptions} options\n * The tooltip options to update.\n */\n update(options) {\n this.destroy();\n this.init(this.chart, Tooltip_merge(true, this.options, options));\n }\n /**\n * Find the new position and perform the move\n *\n * @private\n * @function Highcharts.Tooltip#updatePosition\n *\n * @param {Highcharts.Point} point\n */\n updatePosition(point) {\n const { chart, container, distance, options, pointer, renderer } = this, { height = 0, width = 0 } = this.getLabel(), \n // Needed for outside: true (#11688)\n { left, top, scaleX, scaleY } = pointer.getChartPosition(), pos = (options.positioner || this.getPosition).call(this, width, height, point), doc = Core_Globals.doc;\n let anchorX = (point.plotX || 0) + chart.plotLeft, anchorY = (point.plotY || 0) + chart.plotTop, pad;\n // Set the renderer size dynamically to prevent document size to change.\n // Renderer only exists when tooltip is outside.\n if (renderer && container) {\n // Corrects positions, occurs with tooltip positioner (#16944)\n if (options.positioner) {\n pos.x += left - distance;\n pos.y += top - distance;\n }\n // Pad it by the border width and distance. Add 2 to make room for\n // the default shadow (#19314).\n pad = (options.borderWidth || 0) + 2 * distance + 2;\n renderer.setSize(\n // Clamp width to keep tooltip in viewport (#21698)\n // and subtract one since tooltip container has 'left: 1px;'\n Tooltip_clamp(width + pad, 0, doc.documentElement.clientWidth) - 1, height + pad, false);\n // Anchor and tooltip container need scaling if chart container has\n // scale transform/css zoom. #11329.\n if (scaleX !== 1 || scaleY !== 1) {\n Tooltip_css(container, {\n transform: `scale(${scaleX}, ${scaleY})`\n });\n anchorX *= scaleX;\n anchorY *= scaleY;\n }\n anchorX += left - pos.x;\n anchorY += top - pos.y;\n }\n // Do the move\n this.move(Math.round(pos.x), Math.round(pos.y || 0), // Can be undefined (#3977)\n anchorX, anchorY);\n }\n}\n/* *\n *\n * Class namespace\n *\n * */\n(function (Tooltip) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n function compose(PointerClass) {\n if (Tooltip_pushUnique(Tooltip_composed, 'Core.Tooltip')) {\n Tooltip_addEvent(PointerClass, 'afterInit', function () {\n const chart = this.chart;\n if (chart.options.tooltip) {\n /**\n * Tooltip object for points of series.\n *\n * @name Highcharts.Chart#tooltip\n * @type {Highcharts.Tooltip}\n */\n chart.tooltip = new Tooltip(chart, chart.options.tooltip, this);\n }\n });\n }\n }\n Tooltip.compose = compose;\n})(Tooltip || (Tooltip = {}));\n/* *\n *\n * Default export\n *\n * */\n/* harmony default export */ const Core_Tooltip = (Tooltip);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Callback function to format the text of the tooltip from scratch.\n *\n * In case of single or shared tooltips, a string should be returned. In case\n * of split tooltips, it should return an array where the first item is the\n * header, and subsequent items are mapped to the points. Return `false` to\n * disable tooltip for a specific point on series.\n *\n * @callback Highcharts.TooltipFormatterCallbackFunction\n *\n * @param {Highcharts.Point} this\n * The formatter's context is the hovered `Point` instance. In case of shared or\n * split tooltips, all points are available in `this.points`.\n *\n * @param {Highcharts.Tooltip} tooltip\n * The tooltip instance\n *\n * @return {false|string|Array<(string|null|undefined)>|null|undefined}\n * Formatted text or false\n */\n/**\n * A callback function to place the tooltip in a specific position.\n *\n * @callback Highcharts.TooltipPositionerCallbackFunction\n *\n * @param {Highcharts.Tooltip} this\n * Tooltip context of the callback.\n *\n * @param {number} labelWidth\n * Width of the tooltip.\n *\n * @param {number} labelHeight\n * Height of the tooltip.\n *\n * @param {Highcharts.TooltipPositionerPointObject} point\n * Point information for positioning a tooltip.\n *\n * @return {Highcharts.PositionObject}\n * New position for the tooltip.\n */\n/**\n * Point information for positioning a tooltip.\n *\n * @interface Highcharts.TooltipPositionerPointObject\n * @extends Highcharts.Point\n */ /**\n* If `tooltip.split` option is enabled and positioner is called for each of the\n* boxes separately, this property indicates the call on the xAxis header, which\n* is not a point itself.\n* @name Highcharts.TooltipPositionerPointObject#isHeader\n* @type {boolean}\n*/ /**\n* The reference point relative to the plot area. Add chart.plotLeft to get the\n* full coordinates.\n* @name Highcharts.TooltipPositionerPointObject#plotX\n* @type {number}\n*/ /**\n* The reference point relative to the plot area. Add chart.plotTop to get the\n* full coordinates.\n* @name Highcharts.TooltipPositionerPointObject#plotY\n* @type {number}\n*/\n/**\n * @typedef {\"callout\"|\"circle\"|\"rect\"} Highcharts.TooltipShapeValue\n */\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Series/Point.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { animObject: Point_animObject } = AnimationUtilities;\n\nconst { defaultOptions: Point_defaultOptions } = Defaults;\n\nconst { format: Point_format } = Core_Templating;\n\nconst { addEvent: Point_addEvent, crisp: Point_crisp, erase: Point_erase, extend: Point_extend, fireEvent: Point_fireEvent, getNestedProperty: Point_getNestedProperty, isArray: Point_isArray, isFunction: Point_isFunction, isNumber: Point_isNumber, isObject: Point_isObject, merge: Point_merge, pick: Point_pick, syncTimeout: Point_syncTimeout, removeEvent: Point_removeEvent, uniqueKey: Point_uniqueKey } = Core_Utilities;\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/* *\n *\n * Class\n *\n * */\n/**\n * The Point object. The point objects are generated from the `series.data`\n * configuration objects or raw numbers. They can be accessed from the\n * `Series.points` array. Other ways to instantiate points are through {@link\n * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n *\n * @class\n * @name Highcharts.Point\n */\nclass Point {\n /**\n * For categorized axes this property holds the category name for the\n * point. For other axes it holds the X value.\n *\n * @name Highcharts.Point#category\n * @type {number|string}\n */\n /**\n * The name of the point. The name can be given as the first position of the\n * point configuration array, or as a `name` property in the configuration:\n *\n * @example\n * // Array config\n * data: [\n * ['John', 1],\n * ['Jane', 2]\n * ]\n *\n * // Object config\n * data: [{\n * name: 'John',\n * y: 1\n * }, {\n * name: 'Jane',\n * y: 2\n * }]\n *\n * @name Highcharts.Point#name\n * @type {string}\n */\n /**\n * The point's name if it is defined, or its category in case of a category,\n * otherwise the x value. Convenient for tooltip and data label formatting.\n *\n * @name Highcharts.Point#key\n * @type {number|string}\n */\n /**\n * The point's options as applied in the initial configuration, or\n * extended through `Point.update`.\n *\n * In TypeScript you have to extend `PointOptionsObject` via an\n * additional interface to allow custom data options:\n *\n * ```\n * declare interface PointOptionsObject {\n * customProperty: string;\n * }\n * ```\n *\n * @name Highcharts.Point#options\n * @type {Highcharts.PointOptionsObject}\n */\n /**\n * The percentage for points in a stacked series, pies or gauges.\n *\n * @name Highcharts.Point#percentage\n * @type {number|undefined}\n */\n /**\n * The series object associated with the point.\n *\n * @name Highcharts.Point#series\n * @type {Highcharts.Series}\n */\n /**\n * The attributes of the rendered SVG shape like in `column` or `pie`\n * series.\n *\n * @readonly\n * @name Highcharts.Point#shapeArgs\n * @type {Readonly|undefined}\n */\n /**\n * The total of values in either a stack for stacked series, or a pie in a\n * pie series.\n *\n * @name Highcharts.Point#total\n * @type {number|undefined}\n */\n /**\n * For certain series types, like pie charts, where individual points can\n * be shown or hidden.\n *\n * @name Highcharts.Point#visible\n * @type {boolean}\n * @default true\n */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Animate SVG elements associated with the point.\n *\n * @private\n * @function Highcharts.Point#animateBeforeDestroy\n */\n animateBeforeDestroy() {\n const point = this, animateParams = { x: point.startXPos, opacity: 0 }, graphicalProps = point.getGraphicalProps();\n graphicalProps.singular.forEach(function (prop) {\n const isDataLabel = prop === 'dataLabel';\n point[prop] = point[prop].animate(isDataLabel ? {\n x: point[prop].startXPos,\n y: point[prop].startYPos,\n opacity: 0\n } : animateParams);\n });\n graphicalProps.plural.forEach(function (plural) {\n point[plural].forEach(function (item) {\n if (item.element) {\n item.animate(Point_extend({ x: point.startXPos }, (item.startYPos ? {\n x: item.startXPos,\n y: item.startYPos\n } : {})));\n }\n });\n });\n }\n /**\n * Apply the options containing the x and y data and possible some extra\n * properties. Called on point init or from point.update.\n *\n * @private\n * @function Highcharts.Point#applyOptions\n *\n * @param {Highcharts.PointOptionsType} options\n * The point options as defined in series.data.\n *\n * @param {number} [x]\n * Optionally, the x value.\n *\n * @return {Highcharts.Point}\n * The Point instance.\n */\n applyOptions(options, x) {\n const point = this, series = point.series, pointValKey = series.options.pointValKey || series.pointValKey;\n options = Point.prototype.optionsToObject.call(this, options);\n // Copy options directly to point\n Point_extend(point, options);\n point.options = point.options ?\n Point_extend(point.options, options) :\n options;\n // Since options are copied into the Point instance, some accidental\n // options must be shielded (#5681)\n if (options.group) {\n delete point.group;\n }\n if (options.dataLabels) {\n delete point.dataLabels;\n }\n /**\n * The y value of the point.\n * @name Highcharts.Point#y\n * @type {number|undefined}\n */\n // For higher dimension series types. For instance, for ranges, point.y\n // is mapped to point.low.\n if (pointValKey) {\n point.y = Point.prototype.getNestedProperty.call(point, pointValKey);\n }\n // The point is initially selected by options (#5777)\n if (point.selected) {\n point.state = 'select';\n }\n /**\n * The x value of the point.\n * @name Highcharts.Point#x\n * @type {number}\n */\n // If no x is set by now, get auto incremented value. All points must\n // have an x value, however the y value can be null to create a gap in\n // the series\n if ('name' in point &&\n typeof x === 'undefined' &&\n series.xAxis &&\n series.xAxis.hasNames) {\n point.x = series.xAxis.nameToX(point);\n }\n if (typeof point.x === 'undefined' && series) {\n point.x = x ?? series.autoIncrement();\n }\n else if (Point_isNumber(options.x) && series.options.relativeXValue) {\n point.x = series.autoIncrement(options.x);\n // If x is a string, try to parse it to a datetime\n }\n else if (typeof point.x === 'string') {\n x ?? (x = series.chart.time.parse(point.x));\n if (Point_isNumber(x)) {\n point.x = x;\n }\n }\n point.isNull = this.isValid && !this.isValid();\n point.formatPrefix = point.isNull ? 'null' : 'point'; // #9233, #10874\n return point;\n }\n /**\n * Destroy a point to clear memory. Its reference still stays in\n * `series.data`.\n *\n * @private\n * @function Highcharts.Point#destroy\n */\n destroy() {\n if (!this.destroyed) {\n const point = this, series = point.series, chart = series.chart, dataSorting = series.options.dataSorting, hoverPoints = chart.hoverPoints, globalAnimation = point.series.chart.renderer.globalAnimation, animation = Point_animObject(globalAnimation);\n /**\n * Allow to call after animation.\n * @private\n */\n const destroyPoint = () => {\n // Remove all events and elements\n if (point.graphic ||\n point.graphics ||\n point.dataLabel ||\n point.dataLabels) {\n Point_removeEvent(point);\n point.destroyElements();\n }\n for (const prop in point) { // eslint-disable-line guard-for-in\n delete point[prop];\n }\n };\n if (point.legendItem) {\n // Pies have legend items\n chart.legend.destroyItem(point);\n }\n if (hoverPoints) {\n point.setState();\n Point_erase(hoverPoints, point);\n if (!hoverPoints.length) {\n chart.hoverPoints = null;\n }\n }\n if (point === chart.hoverPoint) {\n point.onMouseOut();\n }\n // Remove properties after animation\n if (!dataSorting || !dataSorting.enabled) {\n destroyPoint();\n }\n else {\n this.animateBeforeDestroy();\n Point_syncTimeout(destroyPoint, animation.duration);\n }\n chart.pointCount--;\n }\n this.destroyed = true;\n }\n /**\n * Destroy SVG elements associated with the point.\n *\n * @private\n * @function Highcharts.Point#destroyElements\n * @param {Highcharts.Dictionary} [kinds]\n */\n destroyElements(kinds) {\n const point = this, props = point.getGraphicalProps(kinds);\n props.singular.forEach(function (prop) {\n point[prop] = point[prop].destroy();\n });\n props.plural.forEach(function (plural) {\n point[plural].forEach(function (item) {\n if (item && item.element) {\n item.destroy();\n }\n });\n delete point[plural];\n });\n }\n /**\n * Fire an event on the Point object.\n *\n * @private\n * @function Highcharts.Point#firePointEvent\n *\n * @param {string} eventType\n * Type of the event.\n *\n * @param {Highcharts.Dictionary|Event} [eventArgs]\n * Additional event arguments.\n *\n * @param {Highcharts.EventCallbackFunction|Function} [defaultFunction]\n * Default event handler.\n *\n * @emits Highcharts.Point#event:*\n */\n firePointEvent(eventType, eventArgs, defaultFunction) {\n const point = this, series = this.series, seriesOptions = series.options;\n // Load event handlers on demand to save time on mouseover/out\n point.manageEvent(eventType);\n // Add default handler if in selection mode\n if (eventType === 'click' && seriesOptions.allowPointSelect) {\n defaultFunction = function (event) {\n // Control key is for Windows, meta (= Cmd key) for Mac, Shift\n // for Opera.\n if (!point.destroyed && point.select) { // #2911, #19075\n point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n }\n };\n }\n Point_fireEvent(point, eventType, eventArgs, defaultFunction);\n }\n /**\n * Get the CSS class names for individual points. Used internally where the\n * returned value is set on every point.\n *\n * @function Highcharts.Point#getClassName\n *\n * @return {string}\n * The class names.\n */\n getClassName() {\n const point = this;\n return 'highcharts-point' +\n (point.selected ? ' highcharts-point-select' : '') +\n (point.negative ? ' highcharts-negative' : '') +\n (point.isNull ? ' highcharts-null-point' : '') +\n (typeof point.colorIndex !== 'undefined' ?\n ' highcharts-color-' + point.colorIndex : '') +\n (point.options.className ? ' ' + point.options.className : '') +\n (point.zone && point.zone.className ? ' ' +\n point.zone.className.replace('highcharts-negative', '') : '');\n }\n /**\n * Get props of all existing graphical point elements.\n *\n * @private\n * @function Highcharts.Point#getGraphicalProps\n */\n getGraphicalProps(kinds) {\n const point = this, props = [], graphicalProps = { singular: [], plural: [] };\n let prop, i;\n kinds = kinds || { graphic: 1, dataLabel: 1 };\n if (kinds.graphic) {\n props.push('graphic', 'connector' // Used by dumbbell\n );\n }\n if (kinds.dataLabel) {\n props.push('dataLabel', 'dataLabelPath', 'dataLabelUpper');\n }\n i = props.length;\n while (i--) {\n prop = props[i];\n if (point[prop]) {\n graphicalProps.singular.push(prop);\n }\n }\n [\n 'graphic',\n 'dataLabel'\n ].forEach(function (prop) {\n const plural = prop + 's';\n if (kinds[prop] && point[plural]) {\n graphicalProps.plural.push(plural);\n }\n });\n return graphicalProps;\n }\n /**\n * Returns the value of the point property for a given value.\n * @private\n */\n getNestedProperty(key) {\n if (!key) {\n return;\n }\n if (key.indexOf('custom.') === 0) {\n return Point_getNestedProperty(key, this.options);\n }\n return this[key];\n }\n /**\n * In a series with `zones`, return the zone that the point belongs to.\n *\n * @function Highcharts.Point#getZone\n *\n * @return {Highcharts.SeriesZonesOptionsObject}\n * The zone item.\n */\n getZone() {\n const series = this.series, zones = series.zones, zoneAxis = series.zoneAxis || 'y';\n let zone, i = 0;\n zone = zones[i];\n while (this[zoneAxis] >= zone.value) {\n zone = zones[++i];\n }\n // For resetting or reusing the point (#8100)\n if (!this.nonZonedColor) {\n this.nonZonedColor = this.color;\n }\n if (zone && zone.color && !this.options.color) {\n this.color = zone.color;\n }\n else {\n this.color = this.nonZonedColor;\n }\n return zone;\n }\n /**\n * Utility to check if point has new shape type. Used in column series and\n * all others that are based on column series.\n * @private\n */\n hasNewShapeType() {\n const point = this;\n const oldShapeType = point.graphic &&\n (point.graphic.symbolName || point.graphic.element.nodeName);\n return oldShapeType !== this.shapeType;\n }\n /**\n * Initialize the point. Called internally based on the `series.data`\n * option.\n *\n * @function Highcharts.Point#init\n *\n * @param {Highcharts.Series} series\n * The series object containing this point.\n *\n * @param {Highcharts.PointOptionsType} options\n * The data in either number, array or object format.\n *\n * @param {number} [x]\n * Optionally, the X value of the point.\n *\n * @return {Highcharts.Point}\n * The Point instance.\n *\n * @emits Highcharts.Point#event:afterInit\n */\n constructor(series, options, x) {\n this.formatPrefix = 'point';\n this.visible = true;\n // For tooltip and data label formatting\n this.point = this;\n this.series = series;\n this.applyOptions(options, x);\n // Add a unique ID to the point if none is assigned\n this.id ?? (this.id = Point_uniqueKey());\n this.resolveColor();\n series.chart.pointCount++;\n Point_fireEvent(this, 'afterInit');\n }\n /**\n * Determine if point is valid.\n * @private\n * @function Highcharts.Point#isValid\n */\n isValid() {\n return ((Point_isNumber(this.x) ||\n this.x instanceof Date) &&\n Point_isNumber(this.y));\n }\n /**\n * Transform number or array configs into objects. Also called for object\n * configs. Used internally to unify the different configuration formats for\n * points. For example, a simple number `10` in a line series will be\n * transformed to `{ y: 10 }`, and an array config like `[1, 10]` in a\n * scatter series will be transformed to `{ x: 1, y: 10 }`.\n *\n * @function Highcharts.Point#optionsToObject\n *\n * @param {Highcharts.PointOptionsType} options\n * Series data options.\n *\n * @return {Highcharts.Dictionary<*>}\n * Transformed point options.\n */\n optionsToObject(options) {\n const series = this.series, keys = series.options.keys, pointArrayMap = keys || series.pointArrayMap || ['y'], valueCount = pointArrayMap.length;\n let ret = {}, firstItemType, i = 0, j = 0;\n if (Point_isNumber(options) || options === null) {\n ret[pointArrayMap[0]] = options;\n }\n else if (Point_isArray(options)) {\n // With leading x value\n if (!keys && options.length > valueCount) {\n firstItemType = typeof options[0];\n if (firstItemType === 'string') {\n if (series.xAxis?.dateTime) {\n ret.x = series.chart.time.parse(options[0]);\n }\n else {\n ret.name = options[0];\n }\n }\n else if (firstItemType === 'number') {\n ret.x = options[0];\n }\n i++;\n }\n while (j < valueCount) {\n // Skip undefined positions for keys\n if (!keys || typeof options[i] !== 'undefined') {\n if (pointArrayMap[j].indexOf('.') > 0) {\n // Handle nested keys, e.g. ['color.pattern.image']\n // Avoid function call unless necessary.\n Point.prototype.setNestedProperty(ret, options[i], pointArrayMap[j]);\n }\n else {\n ret[pointArrayMap[j]] = options[i];\n }\n }\n i++;\n j++;\n }\n }\n else if (typeof options === 'object') {\n ret = options;\n // This is the fastest way to detect if there are individual point\n // dataLabels that need to be considered in drawDataLabels. These\n // can only occur in object configs.\n if (options.dataLabels) {\n // Override the prototype function to always return true,\n // regardless of whether data labels are enabled series-wide\n series.hasDataLabels = () => true;\n }\n // Same approach as above for markers\n if (options.marker) {\n series._hasPointMarkers = true;\n }\n }\n return ret;\n }\n /**\n * Get the pixel position of the point relative to the plot area.\n * @function Highcharts.Point#pos\n *\n * @sample highcharts/point/position\n * Get point's position in pixels.\n *\n * @param {boolean} chartCoordinates\n * If true, the returned position is relative to the full chart area.\n * If false, it is relative to the plot area determined by the axes.\n *\n * @param {number|undefined} plotY\n * A custom plot y position to be computed. Used internally for some\n * series types that have multiple `y` positions, like area range (low\n * and high values).\n *\n * @return {Array|undefined}\n * Coordinates of the point if the point exists.\n */\n pos(chartCoordinates, plotY = this.plotY) {\n if (!this.destroyed) {\n const { plotX, series } = this, { chart, xAxis, yAxis } = series;\n let posX = 0, posY = 0;\n if (Point_isNumber(plotX) && Point_isNumber(plotY)) {\n if (chartCoordinates) {\n posX = xAxis ? xAxis.pos : chart.plotLeft;\n posY = yAxis ? yAxis.pos : chart.plotTop;\n }\n return chart.inverted && xAxis && yAxis ?\n [yAxis.len - plotY + posY, xAxis.len - plotX + posX] :\n [plotX + posX, plotY + posY];\n }\n }\n }\n /**\n * @private\n * @function Highcharts.Point#resolveColor\n */\n resolveColor() {\n const series = this.series, optionsChart = series.chart.options.chart, styledMode = series.chart.styledMode;\n let color, colors, colorCount = optionsChart.colorCount, colorIndex;\n // Remove points nonZonedColor for later recalculation\n delete this.nonZonedColor;\n if (series.options.colorByPoint) {\n if (!styledMode) {\n colors = series.options.colors || series.chart.options.colors;\n color = colors[series.colorCounter];\n colorCount = colors.length;\n }\n colorIndex = series.colorCounter;\n series.colorCounter++;\n // Loop back to zero\n if (series.colorCounter === colorCount) {\n series.colorCounter = 0;\n }\n }\n else {\n if (!styledMode) {\n color = series.color;\n }\n colorIndex = series.colorIndex;\n }\n /**\n * The point's current color index, used in styled mode instead of\n * `color`. The color index is inserted in class names used for styling.\n *\n * @name Highcharts.Point#colorIndex\n * @type {number|undefined}\n */\n this.colorIndex = Point_pick(this.options.colorIndex, colorIndex);\n /**\n * The point's current color.\n *\n * @name Highcharts.Point#color\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n */\n this.color = Point_pick(this.options.color, color);\n }\n /**\n * Set a value in an object, on the property defined by key. The key\n * supports nested properties using dot notation. The function modifies the\n * input object and does not make a copy.\n *\n * @function Highcharts.Point#setNestedProperty\n *\n * @param {T} object\n * The object to set the value on.\n *\n * @param {*} value\n * The value to set.\n *\n * @param {string} key\n * Key to the property to set.\n *\n * @return {T}\n * The modified object.\n */\n setNestedProperty(object, value, key) {\n const nestedKeys = key.split('.');\n nestedKeys.reduce(function (result, key, i, arr) {\n const isLastKey = arr.length - 1 === i;\n result[key] = (isLastKey ?\n value :\n Point_isObject(result[key], true) ?\n result[key] :\n {});\n return result[key];\n }, object);\n return object;\n }\n shouldDraw() {\n return !this.isNull;\n }\n /**\n * Extendable method for formatting each point's tooltip line.\n *\n * @function Highcharts.Point#tooltipFormatter\n *\n * @param {string} pointFormat\n * The point format.\n *\n * @return {string}\n * A string to be concatenated in to the common tooltip text.\n */\n tooltipFormatter(pointFormat) {\n // Insert options for valueDecimals, valuePrefix, and valueSuffix\n const { chart, pointArrayMap = ['y'], tooltipOptions } = this.series, { valueDecimals = '', valuePrefix = '', valueSuffix = '' } = tooltipOptions;\n // Replace default point style with class name\n if (chart.styledMode) {\n pointFormat = chart.tooltip?.styledModeFormat(pointFormat) ||\n pointFormat;\n }\n // Loop over the point array map and replace unformatted values with\n // sprintf formatting markup\n pointArrayMap.forEach((key) => {\n key = '{point.' + key; // Without the closing bracket\n if (valuePrefix || valueSuffix) {\n pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), valuePrefix + key + '}' + valueSuffix);\n }\n pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), key + ':,.' + valueDecimals + 'f}');\n });\n return Point_format(pointFormat, this, chart);\n }\n /**\n * Update point with new options (typically x/y data) and optionally redraw\n * the series.\n *\n * @sample highcharts/members/point-update-column/\n * Update column value\n * @sample highcharts/members/point-update-pie/\n * Update pie slice\n * @sample maps/members/point-update/\n * Update map area value in Highmaps\n *\n * @function Highcharts.Point#update\n *\n * @param {Highcharts.PointOptionsType} options\n * The point options. Point options are handled as described under\n * the `series.type.data` item for each series type. For example\n * for a line series, if options is a single number, the point will\n * be given that number as the marin y value. If it is an array, it\n * will be interpreted as x and y values respectively. If it is an\n * object, advanced options are applied.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the point is updated. If doing\n * more operations on the chart, it is best practice to set\n * `redraw` to false and call `chart.redraw()` after.\n *\n * @param {boolean|Partial} [animation=true]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @emits Highcharts.Point#event:update\n */\n update(options, redraw, animation, runEvent) {\n const point = this, series = point.series, graphic = point.graphic, chart = series.chart, seriesOptions = series.options;\n let i;\n redraw = Point_pick(redraw, true);\n /**\n * @private\n */\n function update() {\n point.applyOptions(options);\n // Update visuals, #4146\n // Handle mock graphic elements for a11y, #12718\n const hasMockGraphic = graphic && point.hasMockGraphic;\n const shouldDestroyGraphic = point.y === null ?\n !hasMockGraphic :\n hasMockGraphic;\n if (graphic && shouldDestroyGraphic) {\n point.graphic = graphic.destroy();\n delete point.hasMockGraphic;\n }\n if (Point_isObject(options, true)) {\n // Destroy so we can get new elements\n if (graphic && graphic.element) {\n // \"null\" is also a valid symbol\n if (options &&\n options.marker &&\n typeof options.marker.symbol !== 'undefined') {\n point.graphic = graphic.destroy();\n }\n }\n if (options?.dataLabels && point.dataLabel) {\n point.dataLabel = point.dataLabel.destroy(); // #2468\n }\n }\n // Record changes in the data table\n i = point.index;\n const row = {};\n for (const key of series.dataColumnKeys()) {\n row[key] = point[key];\n }\n series.dataTable.setRow(row, i);\n // Record the options to options.data. If the old or the new config\n // is an object, use point options, otherwise use raw options\n // (#4701, #4916).\n seriesOptions.data[i] = (Point_isObject(seriesOptions.data[i], true) ||\n Point_isObject(options, true)) ?\n point.options :\n Point_pick(options, seriesOptions.data[i]);\n // Redraw\n series.isDirty = series.isDirtyData = true;\n if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n chart.isDirtyBox = true;\n }\n if (seriesOptions.legendType === 'point') { // #1831, #1885\n chart.isDirtyLegend = true;\n }\n if (redraw) {\n chart.redraw(animation);\n }\n }\n // Fire the event with a default handler of doing the update\n if (runEvent === false) { // When called from setData\n update();\n }\n else {\n point.firePointEvent('update', { options: options }, update);\n }\n }\n /**\n * Remove a point and optionally redraw the series and if necessary the axes\n *\n * @sample highcharts/plotoptions/series-point-events-remove/\n * Remove point and confirm\n * @sample highcharts/members/point-remove/\n * Remove pie slice\n * @sample maps/members/point-remove/\n * Remove selected points in Highmaps\n *\n * @function Highcharts.Point#remove\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call. When\n * doing more operations on the chart, for example running\n * `point.remove()` in a loop, it is best practice to set `redraw`\n * to false and call `chart.redraw()` after.\n *\n * @param {boolean|Partial} [animation=false]\n * Whether to apply animation, and optionally animation\n * configuration.\n */\n remove(redraw, animation) {\n this.series.removePoint(this.series.data.indexOf(this), redraw, animation);\n }\n /**\n * Toggle the selection status of a point.\n *\n * @see Highcharts.Chart#getSelectedPoints\n *\n * @sample highcharts/members/point-select/\n * Select a point from a button\n * @sample highcharts/members/point-select-lasso/\n * Lasso selection\n * @sample highcharts/chart/events-selection-points/\n * Rectangle selection\n * @sample maps/series/data-id/\n * Select a point in Highmaps\n *\n * @function Highcharts.Point#select\n *\n * @param {boolean} [selected]\n * When `true`, the point is selected. When `false`, the point is\n * unselected. When `null` or `undefined`, the selection state is toggled.\n *\n * @param {boolean} [accumulate=false]\n * When `true`, the selection is added to other selected points.\n * When `false`, other selected points are deselected. Internally in\n * Highcharts, when\n * [allowPointSelect](https://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect)\n * is `true`, selected points are accumulated on Control, Shift or Cmd\n * clicking the point.\n *\n * @emits Highcharts.Point#event:select\n * @emits Highcharts.Point#event:unselect\n */\n select(selected, accumulate) {\n const point = this, series = point.series, chart = series.chart;\n selected = Point_pick(selected, !point.selected);\n this.selectedStaging = selected;\n // Fire the event with the default handler\n point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n /**\n * Whether the point is selected or not.\n *\n * @see Point#select\n * @see Chart#getSelectedPoints\n *\n * @name Highcharts.Point#selected\n * @type {boolean}\n */\n point.selected = point.options.selected = selected;\n series.options.data[series.data.indexOf(point)] =\n point.options;\n point.setState(selected && 'select');\n // Unselect all other points unless Ctrl or Cmd + click\n if (!accumulate) {\n chart.getSelectedPoints().forEach(function (loopPoint) {\n const loopSeries = loopPoint.series;\n if (loopPoint.selected && loopPoint !== point) {\n loopPoint.selected = loopPoint.options.selected =\n false;\n loopSeries.options.data[loopSeries.data.indexOf(loopPoint)] = loopPoint.options;\n // Programmatically selecting a point should restore\n // normal state, but when click happened on other\n // point, set inactive state to match other points\n loopPoint.setState(chart.hoverPoints &&\n loopSeries.options.inactiveOtherPoints ?\n 'inactive' : '');\n loopPoint.firePointEvent('unselect');\n }\n });\n }\n });\n delete this.selectedStaging;\n }\n /**\n * Runs on mouse over the point. Called internally from mouse and touch\n * events.\n *\n * @function Highcharts.Point#onMouseOver\n *\n * @param {Highcharts.PointerEventObject} [e]\n * The event arguments.\n */\n onMouseOver(e) {\n const point = this, series = point.series, { inverted, pointer } = series.chart;\n if (pointer) {\n e = e ?\n pointer.normalize(e) :\n // In cases where onMouseOver is called directly without an\n // event\n pointer.getChartCoordinatesFromPoint(point, inverted);\n pointer.runPointActions(e, point);\n }\n }\n /**\n * Runs on mouse out from the point. Called internally from mouse and touch\n * events.\n *\n * @function Highcharts.Point#onMouseOut\n * @emits Highcharts.Point#event:mouseOut\n */\n onMouseOut() {\n const point = this, chart = point.series.chart;\n point.firePointEvent('mouseOut');\n if (!point.series.options.inactiveOtherPoints) {\n (chart.hoverPoints || []).forEach(function (p) {\n p.setState();\n });\n }\n chart.hoverPoints = chart.hoverPoint = null;\n }\n /**\n * Manage specific event from the series' and point's options. Only do it on\n * demand, to save processing time on hovering.\n *\n * @private\n * @function Highcharts.Point#importEvents\n */\n manageEvent(eventType) {\n const point = this, options = Point_merge(point.series.options.point, point.options), userEvent = options.events?.[eventType];\n if (Point_isFunction(userEvent) &&\n (!point.hcEvents?.[eventType] ||\n // Some HC modules, like marker-clusters, draggable-poins etc.\n // use events in their logic, so we need to be sure, that\n // callback function is different\n point.hcEvents?.[eventType]?.map((el) => el.fn)\n .indexOf(userEvent) === -1)) {\n // While updating the existing callback event the old one should be\n // removed\n point.importedUserEvent?.();\n point.importedUserEvent = Point_addEvent(point, eventType, userEvent);\n if (point.hcEvents) {\n point.hcEvents[eventType].userEvent = true;\n }\n }\n else if (point.importedUserEvent &&\n !userEvent &&\n point.hcEvents?.[eventType] &&\n point.hcEvents?.[eventType].userEvent) {\n Point_removeEvent(point, eventType);\n delete point.hcEvents[eventType];\n if (!Object.keys(point.hcEvents)) {\n delete point.importedUserEvent;\n }\n }\n }\n /**\n * Set the point's state.\n *\n * @function Highcharts.Point#setState\n *\n * @param {Highcharts.PointStateValue|\"\"} [state]\n * The new state, can be one of `'hover'`, `'select'`, `'inactive'`,\n * or `''` (an empty string), `'normal'` or `undefined` to set to\n * normal state.\n * @param {boolean} [move]\n * State for animation.\n *\n * @emits Highcharts.Point#event:afterSetState\n */\n setState(state, move) {\n const point = this, series = point.series, previousState = point.state, stateOptions = (series.options.states[state || 'normal'] ||\n {}), markerOptions = (Point_defaultOptions.plotOptions[series.type].marker &&\n series.options.marker), normalDisabled = (markerOptions && markerOptions.enabled === false), markerStateOptions = ((markerOptions &&\n markerOptions.states &&\n markerOptions.states[state || 'normal']) || {}), stateDisabled = markerStateOptions.enabled === false, pointMarker = point.marker || {}, chart = series.chart, hasMarkers = (markerOptions && series.markerAttribs);\n let halo = series.halo, markerAttribs, pointAttribs, pointAttribsAnimation, stateMarkerGraphic = series.stateMarkerGraphic, newSymbol;\n state = state || ''; // Empty string\n if (\n // Already has this state\n (state === point.state && !move) ||\n // Selected points don't respond to hover\n (point.selected && state !== 'select') ||\n // Series' state options is disabled\n (stateOptions.enabled === false) ||\n // General point marker's state options is disabled\n (state && (stateDisabled ||\n (normalDisabled &&\n markerStateOptions.enabled === false))) ||\n // Individual point marker's state options is disabled\n (state &&\n pointMarker.states &&\n pointMarker.states[state] &&\n pointMarker.states[state].enabled === false) // #1610\n ) {\n return;\n }\n point.state = state;\n if (hasMarkers) {\n markerAttribs = series.markerAttribs(point, state);\n }\n // Apply hover styles to the existing point\n // Prevent from mocked null points (#14966)\n if (point.graphic && !point.hasMockGraphic) {\n if (previousState) {\n point.graphic.removeClass('highcharts-point-' + previousState);\n }\n if (state) {\n point.graphic.addClass('highcharts-point-' + state);\n }\n if (!chart.styledMode) {\n pointAttribs = series.pointAttribs(point, state);\n pointAttribsAnimation = Point_pick(chart.options.chart.animation, stateOptions.animation);\n const opacity = pointAttribs.opacity;\n // Some inactive points (e.g. slices in pie) should apply\n // opacity also for their labels\n if (series.options.inactiveOtherPoints && Point_isNumber(opacity)) {\n (point.dataLabels || []).forEach(function (label) {\n if (label &&\n !label.hasClass('highcharts-data-label-hidden')) {\n label.animate({ opacity }, pointAttribsAnimation);\n if (label.connector) {\n label.connector.animate({ opacity }, pointAttribsAnimation);\n }\n }\n });\n }\n point.graphic.animate(pointAttribs, pointAttribsAnimation);\n }\n if (markerAttribs) {\n point.graphic.animate(markerAttribs, Point_pick(\n // Turn off globally:\n chart.options.chart.animation, markerStateOptions.animation, markerOptions.animation));\n }\n // Zooming in from a range with no markers to a range with markers\n if (stateMarkerGraphic) {\n stateMarkerGraphic.hide();\n }\n }\n else {\n // If a graphic is not applied to each point in the normal state,\n // create a shared graphic for the hover state\n if (state && markerStateOptions) {\n newSymbol = pointMarker.symbol || series.symbol;\n // If the point has another symbol than the previous one, throw\n // away the state marker graphic and force a new one (#1459)\n if (stateMarkerGraphic &&\n stateMarkerGraphic.currentSymbol !== newSymbol) {\n stateMarkerGraphic = stateMarkerGraphic.destroy();\n }\n // Add a new state marker graphic\n if (markerAttribs) {\n if (!stateMarkerGraphic) {\n if (newSymbol) {\n series.stateMarkerGraphic = stateMarkerGraphic =\n chart.renderer\n .symbol(newSymbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, Point_merge(markerOptions, markerStateOptions))\n .add(series.markerGroup);\n stateMarkerGraphic.currentSymbol = newSymbol;\n }\n // Move the existing graphic\n }\n else {\n stateMarkerGraphic[move ? 'animate' : 'attr']({\n x: markerAttribs.x,\n y: markerAttribs.y\n });\n }\n }\n if (!chart.styledMode && stateMarkerGraphic &&\n point.state !== 'inactive') {\n stateMarkerGraphic.attr(series.pointAttribs(point, state));\n }\n }\n if (stateMarkerGraphic) {\n stateMarkerGraphic[state && point.isInside ? 'show' : 'hide'](); // #2450\n stateMarkerGraphic.element.point = point; // #4310\n stateMarkerGraphic.addClass(point.getClassName(), true);\n }\n }\n // Show me your halo\n const haloOptions = stateOptions.halo;\n const markerGraphic = (point.graphic || stateMarkerGraphic);\n const markerVisibility = (markerGraphic && markerGraphic.visibility || 'inherit');\n if (haloOptions &&\n haloOptions.size &&\n markerGraphic &&\n markerVisibility !== 'hidden' &&\n !point.isCluster) {\n if (!halo) {\n series.halo = halo = chart.renderer.path()\n // #5818, #5903, #6705\n .add(markerGraphic.parentGroup);\n }\n halo.show()[move ? 'animate' : 'attr']({\n d: point.haloPath(haloOptions.size)\n });\n halo.attr({\n 'class': 'highcharts-halo highcharts-color-' +\n Point_pick(point.colorIndex, series.colorIndex) +\n (point.className ? ' ' + point.className : ''),\n 'visibility': markerVisibility,\n 'zIndex': -1 // #4929, #8276\n });\n halo.point = point; // #6055\n if (!chart.styledMode) {\n halo.attr(Point_extend({\n 'fill': point.color || series.color,\n 'fill-opacity': haloOptions.opacity\n }, HTML_AST.filterUserAttributes(haloOptions.attributes || {})));\n }\n }\n else if (halo?.point?.haloPath &&\n !halo.point.destroyed) {\n // Animate back to 0 on the current halo point (#6055)\n halo.animate({ d: halo.point.haloPath(0) }, null, \n // Hide after unhovering. The `complete` callback runs in the\n // halo's context (#7681).\n halo.hide);\n }\n Point_fireEvent(point, 'afterSetState', { state });\n }\n /**\n * Get the path definition for the halo, which is usually a shadow-like\n * circle around the currently hovered point.\n *\n * @function Highcharts.Point#haloPath\n *\n * @param {number} size\n * The radius of the circular halo.\n *\n * @return {Highcharts.SVGPathArray}\n * The path definition.\n */\n haloPath(size) {\n const pos = this.pos();\n return pos ? this.series.chart.renderer.symbols.circle(Point_crisp(pos[0], 1) - size, pos[1] - size, size * 2, size * 2) : [];\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_Point = (Point);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Function callback when a series point is clicked. Return false to cancel the\n * action.\n *\n * @callback Highcharts.PointClickCallbackFunction\n *\n * @param {Highcharts.Point} this\n * The point where the event occurred.\n *\n * @param {Highcharts.PointClickEventObject} event\n * Event arguments.\n */\n/**\n * Common information for a click event on a series point.\n *\n * @interface Highcharts.PointClickEventObject\n * @extends Highcharts.PointerEventObject\n */ /**\n* Clicked point.\n* @name Highcharts.PointClickEventObject#point\n* @type {Highcharts.Point}\n*/\n/**\n * Gets fired when the mouse leaves the area close to the point.\n *\n * @callback Highcharts.PointMouseOutCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {global.PointerEvent} event\n * Event that occurred.\n */\n/**\n * Gets fired when the mouse enters the area close to the point.\n *\n * @callback Highcharts.PointMouseOverCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {global.Event} event\n * Event that occurred.\n */\n/**\n * The generic point options for all series.\n *\n * In TypeScript you have to extend `PointOptionsObject` with an additional\n * declaration to allow custom data options:\n *\n * ```\n * declare interface PointOptionsObject {\n * customProperty: string;\n * }\n * ```\n *\n * @interface Highcharts.PointOptionsObject\n */\n/**\n * Possible option types for a data point. Use `null` to indicate a gap.\n *\n * @typedef {number|string|Highcharts.PointOptionsObject|Array<(number|string|null)>|null} Highcharts.PointOptionsType\n */\n/**\n * Gets fired when the point is removed using the `.remove()` method.\n *\n * @callback Highcharts.PointRemoveCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {global.Event} event\n * Event that occurred.\n */\n/**\n * Possible key values for the point state options.\n *\n * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.PointStateValue\n */\n/**\n * Gets fired when the point is updated programmatically through the `.update()`\n * method.\n *\n * @callback Highcharts.PointUpdateCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {Highcharts.PointUpdateEventObject} event\n * Event that occurred.\n */\n/**\n * Information about the update event.\n *\n * @interface Highcharts.PointUpdateEventObject\n * @extends global.Event\n */ /**\n* Options data of the update event.\n* @name Highcharts.PointUpdateEventObject#options\n* @type {Highcharts.PointOptionsType}\n*/\n/**\n * @interface Highcharts.PointEventsOptionsObject\n */ /**\n* Fires when the point is selected either programmatically or following a click\n* on the point. One parameter, `event`, is passed to the function. Returning\n* `false` cancels the operation.\n* @name Highcharts.PointEventsOptionsObject#select\n* @type {Highcharts.PointSelectCallbackFunction|undefined}\n*/ /**\n* Fires when the point is unselected either programmatically or following a\n* click on the point. One parameter, `event`, is passed to the function.\n* Returning `false` cancels the operation.\n* @name Highcharts.PointEventsOptionsObject#unselect\n* @type {Highcharts.PointUnselectCallbackFunction|undefined}\n*/\n/**\n * Information about the select/unselect event.\n *\n * @interface Highcharts.PointInteractionEventObject\n * @extends global.Event\n */ /**\n* @name Highcharts.PointInteractionEventObject#accumulate\n* @type {boolean}\n*/\n/**\n * Gets fired when the point is selected either programmatically or following a\n * click on the point.\n *\n * @callback Highcharts.PointSelectCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {Highcharts.PointInteractionEventObject} event\n * Event that occurred.\n */\n/**\n * Fires when the point is unselected either programmatically or following a\n * click on the point.\n *\n * @callback Highcharts.PointUnselectCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {Highcharts.PointInteractionEventObject} event\n * Event that occurred.\n */\n''; // Keeps doclets above in JS file.\n\n;// ./code/es-modules/Core/Pointer.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { parse: Pointer_color } = Color_Color;\n\nconst { charts: Pointer_charts, composed: Pointer_composed, isTouchDevice: Pointer_isTouchDevice } = Core_Globals;\n\nconst { addEvent: Pointer_addEvent, attr: Pointer_attr, css: Pointer_css, extend: Pointer_extend, find: Pointer_find, fireEvent: Pointer_fireEvent, isNumber: Pointer_isNumber, isObject: Pointer_isObject, objectEach: Pointer_objectEach, offset: Pointer_offset, pick: Pointer_pick, pushUnique: Pointer_pushUnique, splat: Pointer_splat } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The mouse and touch tracker object. Each {@link Chart} item has one\n * associated Pointer item that can be accessed from the {@link Chart.pointer}\n * property.\n *\n * @class\n * @name Highcharts.Pointer\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.Options} options\n * The root options object. The pointer uses options from the chart and tooltip\n * structures.\n */\nclass Pointer {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Set inactive state to all series that are not currently hovered,\n * or, if `inactiveOtherPoints` is set to true, set inactive state to\n * all points within that series.\n *\n * @private\n * @function Highcharts.Pointer#applyInactiveState\n *\n * @param {Array} points\n * Currently hovered points\n */\n applyInactiveState(points) {\n let activeSeries = [], series;\n // Get all active series from the hovered points\n (points || []).forEach(function (item) {\n series = item.series;\n // Include itself\n activeSeries.push(series);\n // Include parent series\n if (series.linkedParent) {\n activeSeries.push(series.linkedParent);\n }\n // Include all child series\n if (series.linkedSeries) {\n activeSeries = activeSeries.concat(series.linkedSeries);\n }\n // Include navigator series\n if (series.navigatorSeries) {\n activeSeries.push(series.navigatorSeries);\n }\n });\n // Now loop over all series, filtering out active series\n this.chart.series.forEach(function (inactiveSeries) {\n if (activeSeries.indexOf(inactiveSeries) === -1) {\n // Inactive series\n inactiveSeries.setState('inactive', true);\n }\n else if (inactiveSeries.options.inactiveOtherPoints) {\n // Active series, but other points should be inactivated\n inactiveSeries.setAllPointsToState('inactive');\n }\n });\n }\n /**\n * Destroys the Pointer object and disconnects DOM events.\n *\n * @function Highcharts.Pointer#destroy\n */\n destroy() {\n const pointer = this;\n this.eventsToUnbind.forEach((unbind) => unbind());\n this.eventsToUnbind = [];\n if (!Core_Globals.chartCount) {\n Pointer.unbindDocumentMouseUp.forEach((el) => el.unbind());\n Pointer.unbindDocumentMouseUp.length = 0;\n if (Pointer.unbindDocumentTouchEnd) {\n Pointer.unbindDocumentTouchEnd = (Pointer.unbindDocumentTouchEnd());\n }\n }\n // Memory and CPU leak\n clearInterval(pointer.tooltipTimeout);\n Pointer_objectEach(pointer, function (_val, prop) {\n pointer[prop] = void 0;\n });\n }\n /**\n * Calculate attrs for selection marker.\n * @private\n * @function Highcharts.Pointer#getSelectionMarkerAttrs\n * @emits getSelectionMarkerAttrs\n */\n getSelectionMarkerAttrs(chartX, chartY) {\n const e = {\n args: { chartX, chartY },\n attrs: {},\n shapeType: 'rect'\n };\n Pointer_fireEvent(this, 'getSelectionMarkerAttrs', e, (e) => {\n const { chart, zoomHor, zoomVert } = this, { mouseDownX = 0, mouseDownY = 0 } = chart, attrs = e.attrs;\n let size;\n attrs.x = chart.plotLeft;\n attrs.y = chart.plotTop;\n attrs.width = zoomHor ? 1 : chart.plotWidth;\n attrs.height = zoomVert ? 1 : chart.plotHeight;\n // Adjust the width of the selection marker. Firefox needs at\n // least one pixel width or height in order to return a bounding\n // box.\n if (zoomHor) {\n size = chartX - mouseDownX;\n attrs.width = Math.max(1, Math.abs(size));\n attrs.x = (size > 0 ? 0 : size) + mouseDownX;\n }\n // Adjust the height of the selection marker\n if (zoomVert) {\n size = chartY - mouseDownY;\n attrs.height = Math.max(1, Math.abs(size));\n attrs.y = (size > 0 ? 0 : size) + mouseDownY;\n }\n });\n return e;\n }\n /**\n * Perform a drag operation in response to a mousemove event while the mouse\n * is down.\n * @private\n * @function Highcharts.Pointer#drag\n */\n drag(e) {\n const { chart } = this, { mouseDownX = 0, mouseDownY = 0 } = chart, { panning, panKey, selectionMarkerFill } = chart.options.chart, plotLeft = chart.plotLeft, plotTop = chart.plotTop, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, panningEnabled = Pointer_isObject(panning) ?\n panning.enabled :\n panning, panKeyPressed = panKey && e[`${panKey}Key`];\n let chartX = e.chartX, chartY = e.chartY, clickedInside, selectionMarker = this.selectionMarker;\n // If the device supports both touch and mouse (like IE11), and we are\n // touch-dragging inside the plot area, don't handle the mouse event.\n // #4339.\n if (selectionMarker && selectionMarker.touch) {\n return;\n }\n // If the mouse is outside the plot area, adjust to coordinates\n // inside to prevent the selection marker from going outside\n if (chartX < plotLeft) {\n chartX = plotLeft;\n }\n else if (chartX > plotLeft + plotWidth) {\n chartX = plotLeft + plotWidth;\n }\n if (chartY < plotTop) {\n chartY = plotTop;\n }\n else if (chartY > plotTop + plotHeight) {\n chartY = plotTop + plotHeight;\n }\n // Determine if the mouse has moved more than 10px\n this.hasDragged = Math.sqrt(Math.pow(mouseDownX - chartX, 2) +\n Math.pow(mouseDownY - chartY, 2));\n if (this.hasDragged > 10) {\n clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop, {\n visiblePlotOnly: true\n });\n const { shapeType, attrs } = this.getSelectionMarkerAttrs(chartX, chartY);\n // Make a selection\n if ((chart.hasCartesianSeries || chart.mapView) &&\n this.hasZoom &&\n clickedInside &&\n !panKeyPressed) {\n if (!selectionMarker) {\n this.selectionMarker = selectionMarker =\n chart.renderer[shapeType]();\n selectionMarker\n .attr({\n 'class': 'highcharts-selection-marker',\n zIndex: 7\n })\n .add();\n if (!chart.styledMode) {\n selectionMarker.attr({\n fill: selectionMarkerFill ||\n Pointer_color(\"#334eff\" /* Palette.highlightColor80 */)\n .setOpacity(0.25).get()\n });\n }\n }\n }\n if (selectionMarker) {\n selectionMarker.attr(attrs);\n }\n // Panning\n if (clickedInside && !selectionMarker && panningEnabled) {\n chart.pan(e, panning);\n }\n }\n }\n /**\n * Start a drag operation.\n * @private\n * @function Highcharts.Pointer#dragStart\n */\n dragStart(e) {\n const chart = this.chart;\n // Record the start position\n chart.mouseIsDown = e.type;\n chart.cancelClick = false;\n chart.mouseDownX = e.chartX;\n chart.mouseDownY = e.chartY;\n }\n /**\n * Get selection box to calculate extremes\n * @private\n * @function Highcharts.Pointer#getSelectionBox\n * @emits getSelectionBox\n */\n getSelectionBox(marker) {\n const e = {\n args: { marker },\n result: marker.getBBox()\n };\n Pointer_fireEvent(this, 'getSelectionBox', e);\n return e.result;\n }\n /**\n * On mouse up or touch end across the entire document, drop the selection.\n * @private\n * @function Highcharts.Pointer#drop\n */\n drop(e) {\n const { chart, selectionMarker } = this;\n // During a mouse, touch or mousewheel pan, the `startOnTick` and\n // `endOnTick` options are ignored. Otherwise the zooming or panning\n // would be jumpy, or even not performed because the end ticks would\n // block it. After the touch has ended, we undo this and render again.\n let redraw;\n for (const axis of chart.axes) {\n if (axis.isPanning) {\n axis.isPanning = false;\n if (axis.options.startOnTick ||\n axis.options.endOnTick ||\n axis.series.some((s) => s.boosted)) {\n axis.forceRedraw = true;\n axis.setExtremes(axis.userMin, axis.userMax, false);\n redraw = true;\n }\n }\n }\n if (redraw) {\n chart.redraw();\n }\n if (selectionMarker && e) {\n // A selection has been made\n if (this.hasDragged) {\n const from = this.getSelectionBox(selectionMarker);\n chart.transform({\n axes: chart.axes.filter((a) => a.zoomEnabled &&\n ((a.coll === 'xAxis' && this.zoomX) ||\n (a.coll === 'yAxis' && this.zoomY))),\n selection: {\n originalEvent: e, // #4890\n xAxis: [],\n yAxis: [],\n ...from\n },\n from\n });\n }\n if (Pointer_isNumber(chart.index)) {\n this.selectionMarker = selectionMarker.destroy();\n }\n }\n // Reset all. Check isNumber because it may be destroyed on mouse up\n // (#877)\n if (chart && Pointer_isNumber(chart.index)) {\n Pointer_css(chart.container, { cursor: chart._cursor });\n chart.cancelClick = this.hasDragged > 10; // #370\n chart.mouseIsDown = false;\n this.hasDragged = 0;\n this.pinchDown = [];\n }\n }\n /**\n * Finds the closest point to a set of coordinates, using the k-d-tree\n * algorithm.\n *\n * @function Highcharts.Pointer#findNearestKDPoint\n *\n * @param {Array} series\n * All the series to search in.\n *\n * @param {boolean|undefined} shared\n * Whether it is a shared tooltip or not.\n *\n * @param {Highcharts.PointerEventObject} e\n * The pointer event object, containing chart coordinates of the pointer.\n *\n * @return {Highcharts.Point|undefined}\n * The point closest to given coordinates.\n */\n findNearestKDPoint(series, shared, e) {\n let closest;\n /** @private */\n function sort(p1, p2) {\n const isCloserX = p1.distX - p2.distX, isCloser = p1.dist - p2.dist, isAbove = (p2.series.group?.zIndex -\n p1.series.group?.zIndex);\n let result;\n // We have two points which are not in the same place on xAxis\n // and shared tooltip:\n if (isCloserX !== 0 && shared) { // #5721\n result = isCloserX;\n // Points are not exactly in the same place on x/yAxis:\n }\n else if (isCloser !== 0) {\n result = isCloser;\n // The same xAxis and yAxis position, sort by z-index:\n }\n else if (isAbove !== 0) {\n result = isAbove;\n // The same zIndex, sort by array index:\n }\n else {\n result =\n p1.series.index > p2.series.index ?\n -1 :\n 1;\n }\n return result;\n }\n series.forEach(function (s) {\n const noSharedTooltip = s.noSharedTooltip && shared, compareX = (!noSharedTooltip &&\n s.options.findNearestPointBy.indexOf('y') < 0), point = s.searchPoint(e, compareX);\n if ( // Check that we actually found a point on the series.\n Pointer_isObject(point, true) && point.series &&\n // Use the new point if it is closer.\n (!Pointer_isObject(closest, true) ||\n (sort(closest, point) > 0))) {\n closest = point;\n }\n });\n return closest;\n }\n /**\n * @private\n * @function Highcharts.Pointer#getChartCoordinatesFromPoint\n */\n getChartCoordinatesFromPoint(point, inverted) {\n const { xAxis, yAxis } = point.series, shapeArgs = point.shapeArgs;\n if (xAxis && yAxis) {\n let x = point.clientX ?? point.plotX ?? 0, y = point.plotY || 0;\n if (point.isNode &&\n shapeArgs &&\n Pointer_isNumber(shapeArgs.x) &&\n Pointer_isNumber(shapeArgs.y)) {\n x = shapeArgs.x;\n y = shapeArgs.y;\n }\n return inverted ? {\n chartX: yAxis.len + yAxis.pos - y,\n chartY: xAxis.len + xAxis.pos - x\n } : {\n chartX: x + xAxis.pos,\n chartY: y + yAxis.pos\n };\n }\n if (shapeArgs && shapeArgs.x && shapeArgs.y) {\n // E.g. pies do not have axes\n return {\n chartX: shapeArgs.x,\n chartY: shapeArgs.y\n };\n }\n }\n /**\n * Return the cached chartPosition if it is available on the Pointer,\n * otherwise find it. Running offset is quite expensive, so it should be\n * avoided when we know the chart hasn't moved.\n *\n * @function Highcharts.Pointer#getChartPosition\n *\n * @return {Highcharts.ChartPositionObject}\n * The offset of the chart container within the page\n */\n getChartPosition() {\n if (this.chartPosition) {\n return this.chartPosition;\n }\n const { container } = this.chart;\n const pos = Pointer_offset(container);\n this.chartPosition = {\n left: pos.left,\n top: pos.top,\n scaleX: 1,\n scaleY: 1\n };\n const { offsetHeight, offsetWidth } = container;\n // #13342 - tooltip was not visible in Chrome, when chart\n // updates height.\n if (offsetWidth > 2 && // #13342\n offsetHeight > 2 // #13342\n ) {\n this.chartPosition.scaleX = pos.width / offsetWidth;\n this.chartPosition.scaleY = pos.height / offsetHeight;\n }\n return this.chartPosition;\n }\n /**\n * Get the click position in terms of axis values.\n *\n * @function Highcharts.Pointer#getCoordinates\n *\n * @param {Highcharts.PointerEventObject} e\n * Pointer event, extended with `chartX` and `chartY` properties.\n *\n * @return {Highcharts.PointerAxisCoordinatesObject}\n * Axis coordinates.\n */\n getCoordinates(e) {\n const coordinates = {\n xAxis: [],\n yAxis: []\n };\n for (const axis of this.chart.axes) {\n coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n axis,\n value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n });\n }\n return coordinates;\n }\n /**\n * Calculates what is the current hovered point/points and series.\n *\n * @private\n * @function Highcharts.Pointer#getHoverData\n *\n * @param {Highcharts.Point|undefined} existingHoverPoint\n * The point currently being hovered.\n *\n * @param {Highcharts.Series|undefined} existingHoverSeries\n * The series currently being hovered.\n *\n * @param {Array} series\n * All the series in the chart.\n *\n * @param {boolean} isDirectTouch\n * Is the pointer directly hovering the point.\n *\n * @param {boolean|undefined} shared\n * Whether it is a shared tooltip or not.\n *\n * @param {Highcharts.PointerEventObject} [e]\n * The triggering event, containing chart coordinates of the pointer.\n *\n * @return {Object}\n * Object containing resulting hover data: hoverPoint, hoverSeries, and\n * hoverPoints.\n */\n getHoverData(existingHoverPoint, existingHoverSeries, series, isDirectTouch, shared, e) {\n const hoverPoints = [], useExisting = !!(isDirectTouch && existingHoverPoint), filter = function (s) {\n return (s.visible &&\n !(!shared && s.directTouch) && // #3821\n Pointer_pick(s.options.enableMouseTracking, true));\n };\n let hoverSeries = existingHoverSeries, \n // Which series to look in for the hover point\n searchSeries, \n // Parameters needed for beforeGetHoverData event.\n eventArgs = {\n chartX: e ? e.chartX : void 0,\n chartY: e ? e.chartY : void 0,\n shared: shared\n };\n // Find chart.hoverPane and update filter method in polar.\n Pointer_fireEvent(this, 'beforeGetHoverData', eventArgs);\n const notSticky = hoverSeries && !hoverSeries.stickyTracking;\n searchSeries = notSticky ?\n // Only search on hovered series if it has stickyTracking false\n [hoverSeries] :\n // Filter what series to look in.\n series.filter((s) => s.stickyTracking &&\n (eventArgs.filter || filter)(s));\n // Use existing hovered point or find the one closest to coordinates.\n const hoverPoint = useExisting || !e ?\n existingHoverPoint :\n this.findNearestKDPoint(searchSeries, shared, e);\n // Assign hover series\n hoverSeries = hoverPoint && hoverPoint.series;\n // If we have a hoverPoint, assign hoverPoints.\n if (hoverPoint) {\n // When tooltip is shared, it displays more than one point\n if (shared && !hoverSeries.noSharedTooltip) {\n searchSeries = series.filter(function (s) {\n return eventArgs.filter ?\n eventArgs.filter(s) : filter(s) && !s.noSharedTooltip;\n });\n // Get all points with the same x value as the hoverPoint\n searchSeries.forEach(function (s) {\n let point = Pointer_find(s.points, function (p) {\n return p.x === hoverPoint.x && !p.isNull;\n });\n if (Pointer_isObject(point)) {\n /*\n * Boost returns a minimal point. Convert it to a usable\n * point for tooltip and states.\n */\n if (s.boosted && s.boost) {\n point = s.boost.getPoint(point);\n }\n hoverPoints.push(point);\n }\n });\n }\n else {\n hoverPoints.push(hoverPoint);\n }\n }\n // Check whether the hoverPoint is inside pane we are hovering over.\n eventArgs = { hoverPoint: hoverPoint };\n Pointer_fireEvent(this, 'afterGetHoverData', eventArgs);\n return {\n hoverPoint: eventArgs.hoverPoint,\n hoverSeries: hoverSeries,\n hoverPoints: hoverPoints\n };\n }\n /**\n * @private\n * @function Highcharts.Pointer#getPointFromEvent\n */\n getPointFromEvent(e) {\n let target = e.target, point;\n while (target && !point) {\n point = target.point;\n target = target.parentNode;\n }\n return point;\n }\n /**\n * @private\n * @function Highcharts.Pointer#onTrackerMouseOut\n */\n onTrackerMouseOut(e) {\n const chart = this.chart;\n const relatedTarget = e.relatedTarget;\n const series = chart.hoverSeries;\n this.isDirectTouch = false;\n if (series &&\n relatedTarget &&\n !series.stickyTracking &&\n !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465, #5553\n !this.inClass(relatedTarget, 'highcharts-tracker'))) {\n series.onMouseOut();\n }\n }\n /**\n * Utility to detect whether an element has, or has a parent with, a\n * specific class name. Used on detection of tracker objects and on deciding\n * whether hovering the tooltip should cause the active series to mouse out.\n *\n * @function Highcharts.Pointer#inClass\n *\n * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n * The element to investigate.\n *\n * @param {string} className\n * The class name to look for.\n *\n * @return {boolean|undefined}\n * True if either the element or one of its parents has the given class\n * name.\n */\n inClass(element, className) {\n let elem = element, elemClassName;\n while (elem) {\n elemClassName = Pointer_attr(elem, 'class');\n if (elemClassName) {\n if (elemClassName.indexOf(className) !== -1) {\n return true;\n }\n if (elemClassName.indexOf('highcharts-container') !== -1) {\n return false;\n }\n }\n elem = elem.parentElement;\n }\n }\n /**\n * Initialize the Pointer.\n *\n * @private\n * @function Highcharts.Pointer#init\n *\n * @param {Highcharts.Chart} chart\n * The Chart instance.\n *\n * @param {Highcharts.Options} options\n * The root options object. The pointer uses options from the chart and\n * tooltip structures.\n */\n constructor(chart, options) {\n this.hasDragged = 0;\n this.pointerCaptureEventsToUnbind = [];\n this.eventsToUnbind = [];\n // Store references\n this.options = options;\n this.chart = chart;\n // Do we need to handle click on a touch device?\n this.runChartClick = Boolean(options.chart.events?.click);\n this.pinchDown = [];\n this.setDOMEvents();\n Pointer_fireEvent(this, 'afterInit');\n }\n /**\n * Takes a browser event object and extends it with custom Highcharts\n * properties `chartX` and `chartY` in order to work on the internal\n * coordinate system.\n *\n * On map charts, the properties `lon` and `lat` are added to the event\n * object given that the chart has projection information.\n *\n * @function Highcharts.Pointer#normalize\n *\n * @param {global.MouseEvent|global.PointerEvent|global.TouchEvent} e\n * Event object in standard browsers.\n *\n * @param {Highcharts.OffsetObject} [chartPosition]\n * Additional chart offset.\n *\n * @return {Highcharts.PointerEventObject}\n * A browser event with extended properties `chartX` and `chartY`.\n */\n normalize(e, chartPosition) {\n const touches = e.touches;\n // Position for iOS (#2757)\n const ePos = (touches ?\n touches.length ?\n touches.item(0) :\n (Pointer_pick(// #13534\n touches.changedTouches, e.changedTouches))[0] :\n e);\n // Get mouse position\n if (!chartPosition) {\n chartPosition = this.getChartPosition();\n }\n let chartX = ePos.pageX - chartPosition.left, chartY = ePos.pageY - chartPosition.top;\n // #11329 - when there is scaling on a parent element, we need to take\n // this into account\n chartX /= chartPosition.scaleX;\n chartY /= chartPosition.scaleY;\n return Pointer_extend(e, {\n chartX: Math.round(chartX),\n chartY: Math.round(chartY)\n });\n }\n /**\n * @private\n * @function Highcharts.Pointer#onContainerClick\n */\n onContainerClick(e) {\n const chart = this.chart;\n const hoverPoint = chart.hoverPoint;\n const pEvt = this.normalize(e);\n const plotLeft = chart.plotLeft;\n const plotTop = chart.plotTop;\n if (!chart.cancelClick) {\n // On tracker click, fire the series and point events. #783, #1583\n if (hoverPoint &&\n this.inClass(pEvt.target, 'highcharts-tracker')) {\n // The series click event\n Pointer_fireEvent(hoverPoint.series, 'click', Pointer_extend(pEvt, {\n point: hoverPoint\n }));\n // The point click event\n if (chart.hoverPoint) { // It may be destroyed (#1844)\n hoverPoint.firePointEvent('click', pEvt);\n }\n // When clicking outside a tracker, fire a chart event\n }\n else {\n Pointer_extend(pEvt, this.getCoordinates(pEvt));\n // Fire a click event in the chart\n if (chart.isInsidePlot(pEvt.chartX - plotLeft, pEvt.chartY - plotTop, {\n visiblePlotOnly: true\n })) {\n Pointer_fireEvent(chart, 'click', pEvt);\n }\n }\n }\n }\n /**\n * @private\n * @function Highcharts.Pointer#onContainerMouseDown\n */\n onContainerMouseDown(e) {\n const isPrimaryButton = ((e.buttons || e.button) & 1) === 1;\n e = this.normalize(e);\n // #11635, Firefox does not reliably fire move event after click scroll\n if (Core_Globals.isFirefox &&\n e.button !== 0) {\n this.onContainerMouseMove(e);\n }\n // #11635, limiting to primary button\n if (typeof e.button === 'undefined' ||\n isPrimaryButton) {\n this.zoomOption(e);\n // #295, #13737 solve conflict between container drag and chart zoom\n if (isPrimaryButton) {\n e.preventDefault?.();\n }\n this.dragStart(e);\n }\n }\n /**\n * When mouse leaves the container, hide the tooltip.\n * @private\n * @function Highcharts.Pointer#onContainerMouseLeave\n */\n onContainerMouseLeave(e) {\n const { pointer } = Pointer_charts[Pointer_pick(Pointer.hoverChartIndex, -1)] || {};\n e = this.normalize(e);\n this.onContainerMouseMove(e);\n // #4886, MS Touch end fires mouseleave but with no related target\n if (pointer &&\n !this.inClass(e.relatedTarget, 'highcharts-tooltip')) {\n pointer.reset();\n // Also reset the chart position, used in #149 fix\n pointer.chartPosition = void 0;\n }\n }\n /**\n * When mouse enters the container, delete pointer's chartPosition.\n * @private\n * @function Highcharts.Pointer#onContainerMouseEnter\n */\n onContainerMouseEnter() {\n delete this.chartPosition;\n }\n /**\n * The mousemove, touchmove and touchstart event handler\n * @private\n * @function Highcharts.Pointer#onContainerMouseMove\n */\n onContainerMouseMove(e) {\n const chart = this.chart, tooltip = chart.tooltip, pEvt = this.normalize(e);\n this.setHoverChartIndex(e);\n if (chart.mouseIsDown === 'mousedown' || this.touchSelect(pEvt)) {\n this.drag(pEvt);\n }\n // Show the tooltip and run mouse over events (#977)\n if (!chart.openMenu &&\n (this.inClass(pEvt.target, 'highcharts-tracker') ||\n chart.isInsidePlot(pEvt.chartX - chart.plotLeft, pEvt.chartY - chart.plotTop, {\n visiblePlotOnly: true\n })) &&\n // If the tooltip has stickOnContact enabled, do nothing. This\n // applies regardless of any combinations of the `split` and\n // `useHTML` options.\n !(tooltip &&\n tooltip.shouldStickOnContact(pEvt))) {\n if (this.inClass(pEvt.target, 'highcharts-no-tooltip')) {\n this.reset(false, 0);\n }\n else {\n this.runPointActions(pEvt);\n }\n }\n }\n /**\n * @private\n * @function Highcharts.Pointer#onDocumentTouchEnd\n */\n onDocumentTouchEnd(e) {\n this.onDocumentMouseUp(e);\n }\n /**\n * @private\n * @function Highcharts.Pointer#onContainerTouchMove\n */\n onContainerTouchMove(e) {\n if (this.touchSelect(e)) {\n this.onContainerMouseMove(e);\n }\n else {\n this.touch(e);\n }\n }\n /**\n * @private\n * @function Highcharts.Pointer#onContainerTouchStart\n */\n onContainerTouchStart(e) {\n if (this.touchSelect(e)) {\n this.onContainerMouseDown(e);\n }\n else {\n this.zoomOption(e);\n this.touch(e, true);\n }\n }\n /**\n * Special handler for mouse move that will hide the tooltip when the mouse\n * leaves the plotarea. Issue #149 workaround. The mouseleave event does not\n * always fire.\n * @private\n * @function Highcharts.Pointer#onDocumentMouseMove\n */\n onDocumentMouseMove(e) {\n const chart = this.chart;\n const tooltip = chart.tooltip;\n const chartPosition = this.chartPosition;\n const pEvt = this.normalize(e, chartPosition);\n // If we're outside, hide the tooltip\n if (chartPosition &&\n !chart.isInsidePlot(pEvt.chartX - chart.plotLeft, pEvt.chartY - chart.plotTop, {\n visiblePlotOnly: true\n }) &&\n !(tooltip &&\n tooltip.shouldStickOnContact(pEvt)) && (pEvt.target === chart.container.ownerDocument ||\n !this.inClass(pEvt.target, 'highcharts-tracker'))) {\n this.reset();\n }\n }\n /**\n * @private\n * @function Highcharts.Pointer#onDocumentMouseUp\n */\n onDocumentMouseUp(e) {\n Pointer_charts[Pointer_pick(Pointer.hoverChartIndex, -1)]\n ?.pointer\n ?.drop(e);\n }\n /**\n * Handle touch events with two touches\n * @private\n * @function Highcharts.Pointer#pinch\n */\n pinch(e) {\n const pointer = this, { chart, hasZoom, lastTouches } = pointer, touches = [].map.call(e.touches || [], \n // Normalize each touch\n (touch) => pointer.normalize(touch)), touchesLength = touches.length, fireClickEvent = touchesLength === 1 && ((pointer.inClass(e.target, 'highcharts-tracker') &&\n chart.runTrackerClick) ||\n pointer.runChartClick), tooltip = chart.tooltip, followTouchMove = touchesLength === 1 &&\n Pointer_pick(tooltip?.options.followTouchMove, true);\n // Don't initiate panning until the user has pinched. This prevents us\n // from blocking page scrolling as users scroll down a long page\n // (#4210).\n if (touchesLength > 1) {\n pointer.initiated = true;\n }\n else if (followTouchMove) {\n // #16119: Prevent blocking scroll when single-finger panning is\n // not enabled\n pointer.initiated = false;\n }\n // On touch devices, only proceed to trigger click if a handler is\n // defined\n if (hasZoom &&\n pointer.initiated &&\n !fireClickEvent &&\n e.cancelable !== false) {\n e.preventDefault();\n }\n // Register the touch start position\n if (e.type === 'touchstart') {\n pointer.pinchDown = touches;\n pointer.res = true; // Reset on next move\n chart.mouseDownX = e.chartX;\n // Optionally move the tooltip on touchmove\n }\n else if (followTouchMove) {\n this.runPointActions(pointer.normalize(e));\n // Event type is touchmove, handle panning and pinching. The length can\n // be 0 when releasing, if touchend fires first\n }\n else if (lastTouches) {\n Pointer_fireEvent(chart, 'touchpan', {\n originalEvent: e,\n touches\n }, () => {\n const boxFromTouches = (touches) => {\n const finger0 = touches[0], finger1 = touches[1] || finger0;\n return {\n x: finger0.chartX,\n y: finger0.chartY,\n width: finger1.chartX - finger0.chartX,\n height: finger1.chartY - finger0.chartY\n };\n };\n chart.transform({\n axes: chart.axes\n .filter((axis) => axis.zoomEnabled &&\n ((this.zoomHor && axis.horiz) ||\n (this.zoomVert && !axis.horiz))),\n to: boxFromTouches(touches),\n from: boxFromTouches(lastTouches),\n trigger: e.type\n });\n });\n if (pointer.res) {\n pointer.res = false;\n this.reset(false, 0);\n }\n }\n pointer.lastTouches = touches;\n }\n /**\n * Run translation operations\n * @private\n * @function Highcharts.Pointer#pinchTranslate\n * /\n public pinchTranslate(\n pinchDown: Array,\n touches: Array,\n transform: any,\n selectionMarker: any,\n clip: any,\n lastValidTouch: any\n ): void {\n if (this.zoomHor) {\n this.pinchTranslateDirection(\n true,\n pinchDown,\n touches,\n transform,\n selectionMarker,\n clip,\n lastValidTouch\n );\n }\n if (this.zoomVert) {\n this.pinchTranslateDirection(\n false,\n pinchDown,\n touches,\n transform,\n selectionMarker,\n clip,\n lastValidTouch\n );\n }\n }\n */\n /**\n * Run translation operations for each direction (horizontal and vertical)\n * independently.\n * @private\n * @function Highcharts.Pointer#pinchTranslateDirection\n * /\n public pinchTranslateDirection(\n horiz: boolean,\n pinchDown: Array,\n touches: Array,\n transform: any,\n selectionMarker: any,\n clip: any,\n lastValidTouch: any,\n forcedScale?: number\n ): void {\n const chart = this.chart,\n xy: ('x'|'y') = horiz ? 'x' : 'y',\n XY: ('X'|'Y') = horiz ? 'X' : 'Y',\n sChartXY: ('chartX'|'chartY') = ('chart' + XY) as any,\n wh = horiz ? 'width' : 'height',\n plotLeftTop = (chart as any)['plot' + (horiz ? 'Left' : 'Top')],\n inverted = chart.inverted,\n bounds = chart.bounds[horiz ? 'h' : 'v'],\n singleTouch = pinchDown.length === 1,\n touch0Start = pinchDown[0][sChartXY],\n touch1Start = !singleTouch && pinchDown[1][sChartXY],\n setScale = function (): void {\n // Don't zoom if fingers are too close on this axis\n if (\n typeof touch1Now === 'number' &&\n Math.abs(touch0Start - touch1Start) > 20\n ) {\n scale = forcedScale ||\n Math.abs(touch0Now - touch1Now) /\n Math.abs(touch0Start - touch1Start);\n }\n\n clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n selectionWH = (chart as any)[\n 'plot' + (horiz ? 'Width' : 'Height')\n ] / scale;\n };\n\n let selectionWH: any,\n selectionXY,\n clipXY: any,\n scale = forcedScale || 1,\n touch0Now = touches[0][sChartXY],\n touch1Now = !singleTouch && touches[1][sChartXY],\n outOfBounds;\n\n // Set the scale, first pass\n setScale();\n\n // The clip position (x or y) is altered if out of bounds, the selection\n // position is not\n selectionXY = clipXY;\n\n // Out of bounds\n if (selectionXY < bounds.min) {\n selectionXY = bounds.min;\n outOfBounds = true;\n } else if (selectionXY + selectionWH > bounds.max) {\n selectionXY = bounds.max - selectionWH;\n outOfBounds = true;\n }\n\n // Is the chart dragged off its bounds, determined by dataMin and\n // dataMax?\n if (outOfBounds) {\n\n // Modify the touchNow position in order to create an elastic drag\n // movement. This indicates to the user that the chart is responsive\n // but can't be dragged further.\n touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n if (typeof touch1Now === 'number') {\n touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n }\n\n // Set the scale, second pass to adapt to the modified touchNow\n // positions\n setScale();\n\n } else {\n lastValidTouch[xy] = [touch0Now, touch1Now];\n }\n\n // Set geometry for clipping, selection and transformation\n if (!inverted) {\n clip[xy] = clipXY - plotLeftTop;\n clip[wh] = selectionWH;\n }\n const scaleKey = inverted ?\n (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n const transformScale = inverted ? 1 / scale : scale;\n\n selectionMarker[wh] = selectionWH;\n selectionMarker[xy] = selectionXY;\n // Invert scale if needed (#19217)\n transform[scaleKey] = scale * (inverted && !horiz ? -1 : 1);\n transform['translate' + XY] = (transformScale * plotLeftTop) +\n (touch0Now - (transformScale * touch0Start));\n }\n */\n /**\n * Reset the tracking by hiding the tooltip, the hover series state and the\n * hover point\n *\n * @function Highcharts.Pointer#reset\n *\n * @param {boolean} [allowMove]\n * Instead of destroying the tooltip altogether, allow moving it if\n * possible.\n *\n * @param {number} [delay]\n */\n reset(allowMove, delay) {\n const pointer = this, chart = pointer.chart, hoverSeries = chart.hoverSeries, hoverPoint = chart.hoverPoint, hoverPoints = chart.hoverPoints, tooltip = chart.tooltip, tooltipPoints = tooltip && tooltip.shared ?\n hoverPoints :\n hoverPoint;\n // Check if the points have moved outside the plot area (#1003, #4736,\n // #5101)\n if (allowMove && tooltipPoints) {\n Pointer_splat(tooltipPoints).forEach(function (point) {\n if (point.series.isCartesian &&\n typeof point.plotX === 'undefined') {\n allowMove = false;\n }\n });\n }\n // Just move the tooltip, #349\n if (allowMove) {\n if (tooltip && tooltipPoints && Pointer_splat(tooltipPoints).length) {\n tooltip.refresh(tooltipPoints);\n if (tooltip.shared && hoverPoints) { // #8284\n hoverPoints.forEach(function (point) {\n point.setState(point.state, true);\n if (point.series.isCartesian) {\n if (point.series.xAxis.crosshair) {\n point.series.xAxis\n .drawCrosshair(null, point);\n }\n if (point.series.yAxis.crosshair) {\n point.series.yAxis\n .drawCrosshair(null, point);\n }\n }\n });\n }\n else if (hoverPoint) { // #2500\n hoverPoint.setState(hoverPoint.state, true);\n chart.axes.forEach(function (axis) {\n if (axis.crosshair &&\n hoverPoint.series[axis.coll] === axis) {\n axis.drawCrosshair(null, hoverPoint);\n }\n });\n }\n }\n // Full reset\n }\n else {\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n if (hoverPoints) {\n hoverPoints.forEach(function (point) {\n point.setState();\n });\n }\n if (hoverSeries) {\n hoverSeries.onMouseOut();\n }\n if (tooltip) {\n tooltip.hide(delay);\n }\n if (pointer.unDocMouseMove) {\n pointer.unDocMouseMove = pointer.unDocMouseMove();\n }\n // Remove crosshairs\n chart.axes.forEach(function (axis) {\n axis.hideCrosshair();\n });\n chart.hoverPoints = chart.hoverPoint = void 0;\n }\n }\n /**\n * With line type charts with a single tracker, get the point closest to the\n * mouse. Run Point.onMouseOver and display tooltip for the point or points.\n *\n * @private\n * @function Highcharts.Pointer#runPointActions\n *\n * @emits Highcharts.Point#event:mouseOut\n * @emits Highcharts.Point#event:mouseOver\n */\n runPointActions(e, p, force) {\n const pointer = this, chart = pointer.chart, series = chart.series, tooltip = (chart.tooltip && chart.tooltip.options.enabled ?\n chart.tooltip :\n void 0), shared = (tooltip ?\n tooltip.shared :\n false);\n let hoverPoint = p || chart.hoverPoint, hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries;\n const // `onMouseOver` or already hovering a series with directTouch\n isDirectTouch = (!e || e.type !== 'touchmove') && (!!p || ((hoverSeries && hoverSeries.directTouch) &&\n pointer.isDirectTouch)), hoverData = this.getHoverData(hoverPoint, hoverSeries, series, isDirectTouch, shared, e);\n // Update variables from hoverData.\n hoverPoint = hoverData.hoverPoint;\n hoverSeries = hoverData.hoverSeries;\n const points = hoverData.hoverPoints, followPointer = hoverSeries &&\n hoverSeries.tooltipOptions.followPointer &&\n !hoverSeries.tooltipOptions.split, useSharedTooltip = (shared &&\n hoverSeries &&\n !hoverSeries.noSharedTooltip);\n // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n // #3926, #4200\n if (hoverPoint &&\n (force ||\n hoverPoint !== chart.hoverPoint ||\n (tooltip && tooltip.isHidden))) {\n (chart.hoverPoints || []).forEach(function (p) {\n if (points.indexOf(p) === -1) {\n p.setState();\n }\n });\n // Set normal state to previous series\n if (chart.hoverSeries !== hoverSeries) {\n hoverSeries.onMouseOver();\n }\n pointer.applyInactiveState(points);\n // Do mouseover on all points (#3919, #3985, #4410, #5622)\n (points || []).forEach(function (p) {\n p.setState('hover');\n });\n // If tracking is on series in stead of on each point,\n // fire mouseOver on hover point. // #4448\n if (chart.hoverPoint) {\n chart.hoverPoint.firePointEvent('mouseOut');\n }\n // Hover point may have been destroyed in the event handlers (#7127)\n if (!hoverPoint.series) {\n return;\n }\n /**\n * Contains all hovered points.\n *\n * @name Highcharts.Chart#hoverPoints\n * @type {Array|null}\n */\n chart.hoverPoints = points;\n /**\n * Contains the original hovered point.\n *\n * @name Highcharts.Chart#hoverPoint\n * @type {Highcharts.Point|null}\n */\n chart.hoverPoint = hoverPoint;\n /**\n * Hover state should not be lost when axis is updated (#12569)\n * Axis.update runs pointer.reset which uses chart.hoverPoint.state\n * to apply state which does not exist in hoverPoint yet.\n * The mouseOver event should be triggered when hoverPoint\n * is correct.\n */\n hoverPoint.firePointEvent('mouseOver', void 0, () => {\n // Draw tooltip if necessary\n if (tooltip && hoverPoint) {\n tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n }\n });\n // Update positions (regardless of kdpoint or hoverPoint)\n }\n else if (followPointer && tooltip && !tooltip.isHidden) {\n const anchor = tooltip.getAnchor([{}], e);\n if (chart.isInsidePlot(anchor[0], anchor[1], {\n visiblePlotOnly: true\n })) {\n tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\n }\n }\n // Start the event listener to pick up the tooltip and crosshairs\n if (!pointer.unDocMouseMove) {\n pointer.unDocMouseMove = Pointer_addEvent(chart.container.ownerDocument, 'mousemove', (e) => Pointer_charts[Pointer.hoverChartIndex ?? -1]\n ?.pointer\n ?.onDocumentMouseMove(e));\n pointer.eventsToUnbind.push(pointer.unDocMouseMove);\n }\n // Issues related to crosshair #4927, #5269 #5066, #5658\n chart.axes.forEach(function drawAxisCrosshair(axis) {\n const snap = Pointer_pick((axis.crosshair || {}).snap, true);\n let point;\n if (snap) {\n point = chart.hoverPoint; // #13002\n if (!point || point.series[axis.coll] !== axis) {\n point = Pointer_find(points, (p) => p.series && p.series[axis.coll] === axis);\n }\n }\n // Axis has snapping crosshairs, and one of the hover points belongs\n // to axis. Always call drawCrosshair when it is not snap.\n if (point || !snap) {\n axis.drawCrosshair(e, point);\n // Axis has snapping crosshairs, but no hover point belongs to axis\n }\n else {\n axis.hideCrosshair();\n }\n });\n }\n /**\n * Set the JS DOM events on the container and document. This method should\n * contain a one-to-one assignment between methods and their handlers. Any\n * advanced logic should be moved to the handler reflecting the event's\n * name.\n * @private\n * @function Highcharts.Pointer#setDOMEvents\n */\n setDOMEvents() {\n const container = this.chart.container, ownerDoc = container.ownerDocument;\n container.onmousedown = this.onContainerMouseDown.bind(this);\n container.onmousemove = this.onContainerMouseMove.bind(this);\n container.onclick = this.onContainerClick.bind(this);\n this.eventsToUnbind.push(Pointer_addEvent(container, 'mouseenter', this.onContainerMouseEnter.bind(this)), Pointer_addEvent(container, 'mouseleave', this.onContainerMouseLeave.bind(this)));\n if (!Pointer.unbindDocumentMouseUp.some((el) => el.doc === ownerDoc)) {\n Pointer.unbindDocumentMouseUp.push({\n doc: ownerDoc,\n unbind: Pointer_addEvent(ownerDoc, 'mouseup', this.onDocumentMouseUp.bind(this))\n });\n }\n // In case we are dealing with overflow, reset the chart position when\n // scrolling parent elements\n let parent = this.chart.renderTo.parentElement;\n while (parent && parent.tagName !== 'BODY') {\n this.eventsToUnbind.push(Pointer_addEvent(parent, 'scroll', () => {\n delete this.chartPosition;\n }));\n parent = parent.parentElement;\n }\n this.eventsToUnbind.push(Pointer_addEvent(container, 'touchstart', this.onContainerTouchStart.bind(this), { passive: false }), Pointer_addEvent(container, 'touchmove', this.onContainerTouchMove.bind(this), { passive: false }));\n if (!Pointer.unbindDocumentTouchEnd) {\n Pointer.unbindDocumentTouchEnd = Pointer_addEvent(ownerDoc, 'touchend', this.onDocumentTouchEnd.bind(this), { passive: false });\n }\n this.setPointerCapture();\n Pointer_addEvent(this.chart, 'redraw', this.setPointerCapture.bind(this));\n }\n /**\n * Sets, or removes on update, pointer events using pointer capture for\n * tooltip.followTouchMove if any series has findNearestPointBy that\n * includes the y dimension.\n * @private\n * @function Highcharts.Pointer#setPointerCapture\n */\n setPointerCapture() {\n // Only for touch\n if (!Pointer_isTouchDevice) {\n return;\n }\n const pointer = this, events = pointer.pointerCaptureEventsToUnbind, chart = pointer.chart, container = chart.container, followTouchMove = Pointer_pick(chart.options.tooltip?.followTouchMove, true), shouldHave = followTouchMove && chart.series.some((series) => series.options.findNearestPointBy\n .indexOf('y') > -1);\n if (!pointer.hasPointerCapture && shouldHave) {\n // Add\n // Bind\n events.push(Pointer_addEvent(container, 'pointerdown', (e) => {\n if (e.target?.hasPointerCapture(e.pointerId)) {\n e.target?.releasePointerCapture(e.pointerId);\n }\n }), Pointer_addEvent(container, 'pointermove', (e) => {\n chart.pointer?.getPointFromEvent(e)?.onMouseOver(e);\n }));\n if (!chart.styledMode) {\n Pointer_css(container, { 'touch-action': 'none' });\n }\n // Mostly for styled mode\n container.className += ' highcharts-no-touch-action';\n pointer.hasPointerCapture = true;\n }\n else if (pointer.hasPointerCapture && !shouldHave) {\n // Remove\n // Unbind\n events.forEach((e) => e());\n events.length = 0;\n if (!chart.styledMode) {\n Pointer_css(container, {\n 'touch-action': Pointer_pick(chart.options.chart.style?.['touch-action'], 'manipulation')\n });\n }\n // Mostly for styled mode\n container.className = container.className.replace(' highcharts-no-touch-action', '');\n pointer.hasPointerCapture = false;\n }\n }\n /**\n * Sets the index of the hovered chart and leaves the previous hovered\n * chart, to reset states like tooltip.\n * @private\n * @function Highcharts.Pointer#setHoverChartIndex\n */\n setHoverChartIndex(e) {\n const chart = this.chart;\n const hoverChart = Core_Globals.charts[Pointer_pick(Pointer.hoverChartIndex, -1)];\n if (hoverChart &&\n hoverChart !== chart) {\n const relatedTargetObj = { relatedTarget: chart.container };\n if (e && !e?.relatedTarget) {\n // #17192, Non-enumerable properties of \"e\" are dropped with\n // spreading (...e). Using Object.assign ensures integrity.\n Object.assign({}, e, relatedTargetObj);\n }\n hoverChart.pointer?.onContainerMouseLeave(e || relatedTargetObj);\n }\n if (!hoverChart ||\n !hoverChart.mouseIsDown) {\n Pointer.hoverChartIndex = chart.index;\n }\n }\n /**\n * General touch handler shared by touchstart and touchmove.\n * @private\n * @function Highcharts.Pointer#touch\n */\n touch(e, start) {\n const { chart, pinchDown = [] } = this;\n let hasMoved, isInside;\n this.setHoverChartIndex();\n e = this.normalize(e);\n if (e.touches.length === 1) {\n isInside = chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop, {\n visiblePlotOnly: true\n });\n if (isInside && !chart.openMenu) {\n // Run mouse events and display tooltip etc\n if (start) {\n this.runPointActions(e);\n }\n // Android fires touchmove events after the touchstart even if\n // the finger hasn't moved, or moved only a pixel or two. In iOS\n // however, the touchmove doesn't fire unless the finger moves\n // more than ~4px. So we emulate this behaviour in Android by\n // checking how much it moved, and cancelling on small\n // distances. #3450. Tested and still relevant as of 2024.\n if (e.type === 'touchmove') {\n hasMoved = pinchDown[0] ? // #5266\n (Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n Math.pow(pinchDown[0].chartY - e.chartY, 2)) >= 16 :\n false;\n }\n if (Pointer_pick(hasMoved, true)) {\n this.pinch(e);\n }\n }\n else if (start) {\n // Hide the tooltip on touching outside the plot area (#1203)\n this.reset();\n }\n }\n else if (e.touches.length === 2) {\n this.pinch(e);\n }\n }\n /**\n * Returns true if the chart is set up for zooming by single touch and the\n * event is capable\n * @private\n * @function Highcharts.Pointer#touchSelect\n */\n touchSelect(e) {\n return Boolean(this.chart.zooming.singleTouch &&\n e.touches &&\n e.touches.length === 1);\n }\n /**\n * Resolve the zoomType option, this is reset on all touch start and mouse\n * down events.\n * @private\n * @function Highcharts.Pointer#zoomOption\n */\n zoomOption(e) {\n const chart = this.chart, inverted = chart.inverted;\n let zoomType = chart.zooming.type || '', zoomX, zoomY;\n // Look for the pinchType option\n if (/touch/.test(e.type)) {\n zoomType = Pointer_pick(chart.zooming.pinchType, zoomType);\n }\n this.zoomX = zoomX = /x/.test(zoomType);\n this.zoomY = zoomY = /y/.test(zoomType);\n this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n this.hasZoom = zoomX || zoomY;\n }\n}\nPointer.unbindDocumentMouseUp = [];\n/* *\n *\n * Class Namespace\n *\n * */\n(function (Pointer) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n function compose(ChartClass) {\n if (Pointer_pushUnique(Pointer_composed, 'Core.Pointer')) {\n Pointer_addEvent(ChartClass, 'beforeRender', function () {\n /**\n * The Pointer that keeps track of mouse and touch\n * interaction.\n *\n * @memberof Highcharts.Chart\n * @name pointer\n * @type {Highcharts.Pointer}\n * @instance\n */\n this.pointer = new Pointer(this, this.options);\n });\n }\n }\n Pointer.compose = compose;\n})(Pointer || (Pointer = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Core_Pointer = (Pointer);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Chart position and scale.\n *\n * @interface Highcharts.ChartPositionObject\n */ /**\n* @name Highcharts.ChartPositionObject#left\n* @type {number}\n*/ /**\n* @name Highcharts.ChartPositionObject#scaleX\n* @type {number}\n*/ /**\n* @name Highcharts.ChartPositionObject#scaleY\n* @type {number}\n*/ /**\n* @name Highcharts.ChartPositionObject#top\n* @type {number}\n*/\n/**\n * One position in relation to an axis.\n *\n * @interface Highcharts.PointerAxisCoordinateObject\n */ /**\n* Related axis.\n*\n* @name Highcharts.PointerAxisCoordinateObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Axis value.\n*\n* @name Highcharts.PointerAxisCoordinateObject#value\n* @type {number}\n*/\n/**\n * Positions in terms of axis values.\n *\n * @interface Highcharts.PointerAxisCoordinatesObject\n */ /**\n* Positions on the x-axis.\n* @name Highcharts.PointerAxisCoordinatesObject#xAxis\n* @type {Array}\n*/ /**\n* Positions on the y-axis.\n* @name Highcharts.PointerAxisCoordinatesObject#yAxis\n* @type {Array}\n*/\n/**\n * Pointer coordinates.\n *\n * @interface Highcharts.PointerCoordinatesObject\n */ /**\n* @name Highcharts.PointerCoordinatesObject#chartX\n* @type {number}\n*/ /**\n* @name Highcharts.PointerCoordinatesObject#chartY\n* @type {number}\n*/\n/**\n * A native browser mouse or touch event, extended with position information\n * relative to the {@link Chart.container}.\n *\n * @interface Highcharts.PointerEventObject\n * @extends global.PointerEvent\n */ /**\n* The X coordinate of the pointer interaction relative to the chart.\n*\n* @name Highcharts.PointerEventObject#chartX\n* @type {number}\n*/ /**\n* The Y coordinate of the pointer interaction relative to the chart.\n*\n* @name Highcharts.PointerEventObject#chartY\n* @type {number}\n*/\n/**\n * Axis-specific data of a selection.\n *\n * @interface Highcharts.SelectDataObject\n */ /**\n* The selected Axis.\n* @name Highcharts.SelectDataObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* The maximum axis value, either automatic or set manually.\n* @name Highcharts.SelectDataObject#max\n* @type {number}\n*/ /**\n* The minimum axis value, either automatic or set manually.\n* @name Highcharts.SelectDataObject#min\n* @type {number}\n*/\n/**\n * Object for select events.\n * The primary axes are `xAxis[0]` and `yAxis[0]`. Remember the unit of a\n * datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * @interface Highcharts.SelectEventObject\n */ /**\n* The related browser event.\n* @name Highcharts.SelectEventObject#originalEvent\n* @type {global.Event}\n*/ /**\n* Prevents the default action for the event, if called.\n* @name Highcharts.SelectEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Indicates a reset event to restore default state.\n* @name Highcharts.SelectEventObject#resetSelection\n* @type {boolean|undefined}\n*/ /**\n* Arrays containing the axes of each dimension and each axis' min and max\n* values.\n* @name Highcharts.SelectEventObject#xAxis\n* @type {Array}\n*/ /**\n* Arrays containing the axes of each dimension and each axis' min and max\n* values.\n* @name Highcharts.SelectEventObject#yAxis\n* @type {Array}\n*/\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Data/DataTableCore.js\n/* *\n *\n * (c) 2009-2024 Highsoft AS\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * Authors:\n * - Sophie Bremer\n * - Gøran Slettemark\n * - Torstein Hønsi\n *\n * */\n\n\nconst { fireEvent: DataTableCore_fireEvent, isArray: DataTableCore_isArray, objectEach: DataTableCore_objectEach, uniqueKey: DataTableCore_uniqueKey } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * Class to manage columns and rows in a table structure. It provides methods\n * to add, remove, and manipulate columns and rows, as well as to retrieve data\n * from specific cells.\n *\n * @class\n * @name Highcharts.DataTable\n *\n * @param {Highcharts.DataTableOptions} [options]\n * Options to initialize the new DataTable instance.\n */\nclass DataTableCore {\n /**\n * Constructs an instance of the DataTable class.\n *\n * @example\n * const dataTable = new Highcharts.DataTableCore({\n * columns: {\n * year: [2020, 2021, 2022, 2023],\n * cost: [11, 13, 12, 14],\n * revenue: [12, 15, 14, 18]\n * }\n * });\n\n *\n * @param {Highcharts.DataTableOptions} [options]\n * Options to initialize the new DataTable instance.\n */\n constructor(options = {}) {\n /**\n * Whether the ID was automatic generated or given in the constructor.\n *\n * @name Highcharts.DataTable#autoId\n * @type {boolean}\n */\n this.autoId = !options.id;\n this.columns = {};\n /**\n * ID of the table for indentification purposes.\n *\n * @name Highcharts.DataTable#id\n * @type {string}\n */\n this.id = (options.id || DataTableCore_uniqueKey());\n this.modified = this;\n this.rowCount = 0;\n this.versionTag = DataTableCore_uniqueKey();\n let rowCount = 0;\n DataTableCore_objectEach(options.columns || {}, (column, columnName) => {\n this.columns[columnName] = column.slice();\n rowCount = Math.max(rowCount, column.length);\n });\n this.applyRowCount(rowCount);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Applies a row count to the table by setting the `rowCount` property and\n * adjusting the length of all columns.\n *\n * @private\n * @param {number} rowCount The new row count.\n */\n applyRowCount(rowCount) {\n this.rowCount = rowCount;\n DataTableCore_objectEach(this.columns, (column) => {\n if (DataTableCore_isArray(column)) { // Not on typed array\n column.length = rowCount;\n }\n });\n }\n /**\n * Fetches the given column by the canonical column name. Simplified version\n * of the full `DataTable.getRow` method, always returning by reference.\n *\n * @param {string} columnName\n * Name of the column to get.\n *\n * @return {Highcharts.DataTableColumn|undefined}\n * A copy of the column, or `undefined` if not found.\n */\n getColumn(columnName, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n asReference) {\n return this.columns[columnName];\n }\n /**\n * Retrieves all or the given columns. Simplified version of the full\n * `DataTable.getColumns` method, always returning by reference.\n *\n * @param {Array} [columnNames]\n * Column names to retrieve.\n *\n * @return {Highcharts.DataTableColumnCollection}\n * Collection of columns. If a requested column was not found, it is\n * `undefined`.\n */\n getColumns(columnNames, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n asReference) {\n return (columnNames || Object.keys(this.columns)).reduce((columns, columnName) => {\n columns[columnName] = this.columns[columnName];\n return columns;\n }, {});\n }\n /**\n * Retrieves the row at a given index.\n *\n * @param {number} rowIndex\n * Row index to retrieve. First row has index 0.\n *\n * @param {Array} [columnNames]\n * Column names to retrieve.\n *\n * @return {Record|undefined}\n * Returns the row values, or `undefined` if not found.\n */\n getRow(rowIndex, columnNames) {\n return (columnNames || Object.keys(this.columns)).map((key) => this.columns[key]?.[rowIndex]);\n }\n /**\n * Sets cell values for a column. Will insert a new column, if not found.\n *\n * @param {string} columnName\n * Column name to set.\n *\n * @param {Highcharts.DataTableColumn} [column]\n * Values to set in the column.\n *\n * @param {number} [rowIndex=0]\n * Index of the first row to change. (Default: 0)\n *\n * @param {Record} [eventDetail]\n * Custom information for pending events.\n *\n * @emits #setColumns\n * @emits #afterSetColumns\n */\n setColumn(columnName, column = [], rowIndex = 0, eventDetail) {\n this.setColumns({ [columnName]: column }, rowIndex, eventDetail);\n }\n /**\n * * Sets cell values for multiple columns. Will insert new columns, if not\n * found. Simplified version of the full `DataTable.setColumns`, limited to\n * full replacement of the columns (undefined `rowIndex`).\n *\n * @param {Highcharts.DataTableColumnCollection} columns\n * Columns as a collection, where the keys are the column names.\n *\n * @param {number} [rowIndex]\n * Index of the first row to change. Keep undefined to reset.\n *\n * @param {Record} [eventDetail]\n * Custom information for pending events.\n *\n * @emits #setColumns\n * @emits #afterSetColumns\n */\n setColumns(columns, rowIndex, eventDetail) {\n let rowCount = this.rowCount;\n DataTableCore_objectEach(columns, (column, columnName) => {\n this.columns[columnName] = column.slice();\n rowCount = column.length;\n });\n this.applyRowCount(rowCount);\n if (!eventDetail?.silent) {\n DataTableCore_fireEvent(this, 'afterSetColumns');\n this.versionTag = DataTableCore_uniqueKey();\n }\n }\n /**\n * Sets cell values of a row. Will insert a new row if no index was\n * provided, or if the index is higher than the total number of table rows.\n * A simplified version of the full `DateTable.setRow`, limited to objects.\n *\n * @param {Record} row\n * Cell values to set.\n *\n * @param {number} [rowIndex]\n * Index of the row to set. Leave `undefind` to add as a new row.\n *\n * @param {boolean} [insert]\n * Whether to insert the row at the given index, or to overwrite the row.\n *\n * @param {Record} [eventDetail]\n * Custom information for pending events.\n *\n * @emits #afterSetRows\n */\n setRow(row, rowIndex = this.rowCount, insert, eventDetail) {\n const { columns } = this, indexRowCount = insert ? this.rowCount + 1 : rowIndex + 1;\n DataTableCore_objectEach(row, (cellValue, columnName) => {\n const column = columns[columnName] ||\n eventDetail?.addColumns !== false && new Array(indexRowCount);\n if (column) {\n if (insert) {\n column.splice(rowIndex, 0, cellValue);\n }\n else {\n column[rowIndex] = cellValue;\n }\n columns[columnName] = column;\n }\n });\n if (indexRowCount > this.rowCount) {\n this.applyRowCount(indexRowCount);\n }\n if (!eventDetail?.silent) {\n DataTableCore_fireEvent(this, 'afterSetRows');\n this.versionTag = DataTableCore_uniqueKey();\n }\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Data_DataTableCore = (DataTableCore);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A column of values in a data table.\n * @typedef {Array} Highcharts.DataTableColumn\n */ /**\n* A collection of data table columns defined by a object where the key is the\n* column name and the value is an array of the column values.\n* @typedef {Record} Highcharts.DataTableColumnCollection\n*/\n/**\n * Options for the `DataTable` or `DataTableCore` classes.\n * @interface Highcharts.DataTableOptions\n */ /**\n* The column options for the data table. The columns are defined by an object\n* where the key is the column ID and the value is an array of the column\n* values.\n*\n* @name Highcharts.DataTableOptions.columns\n* @type {Highcharts.DataTableColumnCollection|undefined}\n*/ /**\n* Custom ID to identify the new DataTable instance.\n*\n* @name Highcharts.DataTableOptions.id\n* @type {string|undefined}\n*/\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Legend/LegendSymbol.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { extend: LegendSymbol_extend, merge: LegendSymbol_merge, pick: LegendSymbol_pick } = Core_Utilities;\n/* *\n *\n * Namespace\n *\n * */\nvar LegendSymbol;\n(function (LegendSymbol) {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Draw a line, a point marker and an area in the legend.\n *\n * @private\n * @function Highcharts.LegendSymbolMixin.areaMarker\n *\n * @param {Highcharts.Legend} legend\n * The legend object.\n */\n function areaMarker(legend, item) {\n lineMarker.call(this, legend, item, true);\n }\n LegendSymbol.areaMarker = areaMarker;\n /**\n * Draw a line and a point marker in the legend.\n *\n * @private\n * @function Highcharts.LegendSymbolMixin.lineMarker\n *\n * @param {Highcharts.Legend} legend\n * The legend object.\n */\n function lineMarker(legend, item, hasArea) {\n const legendItem = this.legendItem = this.legendItem || {}, { chart, options } = this, { baseline = 0, symbolWidth, symbolHeight } = legend, symbol = this.symbol || 'circle', generalRadius = symbolHeight / 2, renderer = chart.renderer, legendItemGroup = legendItem.group, verticalCenter = baseline - Math.round((legend.fontMetrics?.b || symbolHeight) *\n // Render line and marker slightly higher to make room for the\n // area\n (hasArea ? 0.4 : 0.3)), attr = {};\n let legendSymbol, markerOptions = options.marker, lineSizer = 0;\n // Draw the line\n if (!chart.styledMode) {\n attr['stroke-width'] = Math.min(options.lineWidth || 0, 24);\n if (options.dashStyle) {\n attr.dashstyle = options.dashStyle;\n }\n else if (options.linecap !== 'square') {\n attr['stroke-linecap'] = 'round';\n }\n }\n legendItem.line = renderer\n .path()\n .addClass('highcharts-graph')\n .attr(attr)\n .add(legendItemGroup);\n if (hasArea) {\n legendItem.area = renderer\n .path()\n .addClass('highcharts-area')\n .add(legendItemGroup);\n }\n if (attr['stroke-linecap']) {\n lineSizer = Math.min(legendItem.line.strokeWidth(), symbolWidth) / 2;\n }\n if (symbolWidth) {\n const d = [\n ['M', lineSizer, verticalCenter],\n ['L', symbolWidth - lineSizer, verticalCenter]\n ];\n legendItem.line.attr({ d });\n legendItem.area?.attr({\n d: [\n ...d,\n ['L', symbolWidth - lineSizer, baseline],\n ['L', lineSizer, baseline]\n ]\n });\n }\n // Draw the marker\n if (markerOptions && markerOptions.enabled !== false && symbolWidth) {\n // Do not allow the marker to be larger than the symbolHeight\n let radius = Math.min(LegendSymbol_pick(markerOptions.radius, generalRadius), generalRadius);\n // Restrict symbol markers size\n if (symbol.indexOf('url') === 0) {\n markerOptions = LegendSymbol_merge(markerOptions, {\n width: symbolHeight,\n height: symbolHeight\n });\n radius = 0;\n }\n legendItem.symbol = legendSymbol = renderer\n .symbol(symbol, (symbolWidth / 2) - radius, verticalCenter - radius, 2 * radius, 2 * radius, LegendSymbol_extend({ context: 'legend' }, markerOptions))\n .addClass('highcharts-point')\n .add(legendItemGroup);\n legendSymbol.isMarker = true;\n }\n }\n LegendSymbol.lineMarker = lineMarker;\n /**\n * Get the series' symbol in the legend.\n *\n * This method should be overridable to create custom symbols through\n * Highcharts.seriesTypes[type].prototype.drawLegendSymbol.\n *\n * @private\n * @function Highcharts.LegendSymbolMixin.rectangle\n *\n * @param {Highcharts.Legend} legend\n * The legend object\n *\n * @param {Highcharts.Point|Highcharts.Series} item\n * The series (this) or point\n */\n function rectangle(legend, item) {\n const legendItem = item.legendItem || {}, options = legend.options, symbolHeight = legend.symbolHeight, square = options.squareSymbol, symbolWidth = square ? symbolHeight : legend.symbolWidth;\n legendItem.symbol = this.chart.renderer\n .rect(square ? (legend.symbolWidth - symbolHeight) / 2 : 0, legend.baseline - symbolHeight + 1, // #3988\n symbolWidth, symbolHeight, LegendSymbol_pick(legend.options.symbolRadius, symbolHeight / 2))\n .addClass('highcharts-point')\n .attr({\n zIndex: 3\n })\n .add(legendItem.group);\n }\n LegendSymbol.rectangle = rectangle;\n})(LegendSymbol || (LegendSymbol = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Legend_LegendSymbol = (LegendSymbol);\n\n;// ./code/es-modules/Core/Series/SeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * General options for all series types.\n *\n * @optionparent plotOptions.series\n */\nconst seriesDefaults = {\n // Base series options\n /**\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n * of a line graph. Round means that lines are rounded in the ends and\n * bends.\n *\n * @type {Highcharts.SeriesLinecapValue}\n * @default round\n * @since 3.0.7\n * @apioption plotOptions.line.linecap\n */\n /**\n * Pixel width of the graph line.\n *\n * @see In styled mode, the line stroke-width can be set with the\n * `.highcharts-graph` class name.\n *\n * @sample {highcharts} highcharts/plotoptions/series-linewidth-general/\n * On all series\n * @sample {highcharts} highcharts/plotoptions/series-linewidth-specific/\n * On one single series\n *\n * @product highcharts highstock\n */\n lineWidth: 2,\n /**\n * For some series, there is a limit that shuts down animation\n * by default when the total number of points in the chart is too high.\n * For example, for a column chart and its derivatives, animation does\n * not run if there is more than 250 points totally. To disable this\n * cap, set `animationLimit` to `Infinity`. This option works if animation\n * is fired on individual points, not on a group of points like e.g. during\n * the initial animation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-animationlimit/\n * Animation limit on updating individual points\n *\n * @type {number}\n * @apioption plotOptions.series.animationLimit\n */\n /**\n * Allow this series' points to be selected by clicking on the graphic\n * (columns, point markers, pie slices, map areas etc).\n *\n * The selected points can be handled by point select and unselect\n * events, or collectively by the [getSelectedPoints\n * ](/class-reference/Highcharts.Chart#getSelectedPoints) function.\n *\n * And alternative way of selecting points is through dragging.\n *\n * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-line/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-pie/\n * Pie\n * @sample {highcharts} highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Map area\n * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n * Map bubble\n *\n * @since 1.2.0\n *\n * @private\n */\n allowPointSelect: false,\n /**\n * When true, each point or column edge is rounded to its nearest pixel\n * in order to render sharp on screen. In some cases, when there are a\n * lot of densely packed columns, this leads to visible difference\n * in column widths or distance between columns. In these cases,\n * setting `crisp` to `false` may look better, even though each column\n * is rendered blurry.\n *\n * @sample {highcharts} highcharts/plotoptions/column-crisp-false/\n * Crisp is false\n *\n * @since 5.0.10\n * @product highcharts highstock gantt\n *\n * @private\n */\n crisp: true,\n /**\n * If true, a checkbox is displayed next to the legend item to allow\n * selecting the series. The state of the checkbox is determined by\n * the `selected` option.\n *\n * @productdesc {highmaps}\n * Note that if a `colorAxis` is defined, the color axis is represented\n * in the legend, not the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-showcheckbox-true/\n * Show select box\n *\n * @since 1.2.0\n *\n * @private\n */\n showCheckbox: false,\n /**\n * Enable or disable the initial animation when a series is displayed.\n * The animation can also be set as a configuration object. Please\n * note that this option only applies to the initial animation of the\n * series itself. For other animations, see [chart.animation](\n * #chart.animation) and the animation parameter under the API methods.\n * The following properties are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * - `duration`: The duration of the animation in milliseconds. (Defaults to\n * `1000`)\n *\n * - `easing`: Can be a string reference to an easing function set on\n * the `Math` object or a function. See the _Custom easing function_\n * demo below. (Defaults to `easeInOutSine`)\n *\n * Due to poor performance, animation is disabled in old IE browsers\n * for several chart types.\n *\n * @sample {highcharts} highcharts/plotoptions/series-animation-disabled/\n * Animation disabled\n * @sample {highcharts} highcharts/plotoptions/series-animation-slower/\n * Slower animation\n * @sample {highcharts} highcharts/plotoptions/series-animation-easing/\n * Custom easing function\n * @sample {highstock} stock/plotoptions/animation-slower/\n * Slower animation\n * @sample {highstock} stock/plotoptions/animation-easing/\n * Custom easing function\n * @sample {highmaps} maps/plotoptions/series-animation-true/\n * Animation enabled on map series\n * @sample {highmaps} maps/plotoptions/mapbubble-animation-false/\n * Disabled on mapbubble series\n *\n * @type {boolean|Highcharts.AnimationOptionsObject}\n * @default {highcharts} true\n * @default {highstock} true\n * @default {highmaps} false\n *\n * @private\n */\n animation: {\n /** @ignore-option */\n duration: 1000\n },\n /**\n * An additional class name to apply to the series' graphical elements.\n * This option does not replace default class names of the graphical\n * element. Changes to the series' color will also be reflected in a\n * chart's legend and tooltip.\n *\n * @sample {highcharts} highcharts/css/point-series-classname\n * Series and point class name\n *\n * @type {string}\n * @since 5.0.0\n * @apioption plotOptions.series.className\n */\n /**\n * Disable this option to allow series rendering in the whole plotting\n * area.\n *\n * **Note:** Clipping should be always enabled when\n * [chart.zoomType](#chart.zoomType) is set\n *\n * @sample {highcharts} highcharts/plotoptions/series-clip/\n * Disabled clipping\n *\n * @default true\n * @type {boolean}\n * @since 3.0.0\n * @apioption plotOptions.series.clip\n */\n /**\n * The main color of the series. In line type series it applies to the\n * line and the point markers unless otherwise specified. In bar type\n * series it applies to the bars unless a color is specified per point.\n * The default value is pulled from the `options.colors` array.\n *\n * In styled mode, the color can be defined by the\n * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n * color can be set with the `.highcharts-series`,\n * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n * `.highcharts-series-{n}` class, or individual classes given by the\n * `className` option.\n *\n * @productdesc {highmaps}\n * In maps, the series color is rarely used, as most choropleth maps use\n * the color to denote the value of each point. The series color can\n * however be used in a map with multiple series holding categorized\n * data.\n *\n * @sample {highcharts} highcharts/plotoptions/series-color-general/\n * General plot option\n * @sample {highcharts} highcharts/plotoptions/series-color-specific/\n * One specific series\n * @sample {highcharts} highcharts/plotoptions/series-color-area/\n * Area color\n * @sample {highcharts} highcharts/series/infographic/\n * Pattern fill\n * @sample {highmaps} maps/demo/category-map/\n * Category map by multiple series\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption plotOptions.series.color\n */\n /**\n * Styled mode only. A specific color index to use for the series, so its\n * graphic representations are given the class name `highcharts-color-{n}`.\n *\n * Since v11, CSS variables on the form `--highcharts-color-{n}` make\n * changing the color scheme very convenient.\n *\n * @sample {highcharts} highcharts/css/colorindex/ Series and point color\n * index\n *\n * @type {number}\n * @since 5.0.0\n * @apioption plotOptions.series.colorIndex\n */\n /**\n * Whether to connect a graph line across null points, or render a gap\n * between the two points on either side of the null.\n *\n * In stacked area chart, if `connectNulls` is set to true,\n * null points are interpreted as 0.\n *\n * @sample {highcharts} highcharts/plotoptions/series-connectnulls-false/\n * False by default\n * @sample {highcharts} highcharts/plotoptions/series-connectnulls-true/\n * True\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock\n * @apioption plotOptions.series.connectNulls\n */\n /**\n * You can set the cursor to \"pointer\" if you have click events attached\n * to the series, to signal to the user that the points and lines can\n * be clicked.\n *\n * In styled mode, the series cursor can be set with the same classes\n * as listed under [series.color](#plotOptions.series.color).\n *\n * @sample {highcharts} highcharts/plotoptions/series-cursor-line/\n * On line graph\n * @sample {highcharts} highcharts/plotoptions/series-cursor-column/\n * On columns\n * @sample {highcharts} highcharts/plotoptions/series-cursor-scatter/\n * On scatter markers\n * @sample {highstock} stock/plotoptions/cursor/\n * Pointer on a line graph\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Map area\n * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n * Map bubble\n *\n * @type {string|Highcharts.CursorValue}\n * @apioption plotOptions.series.cursor\n */\n /**\n * A reserved subspace to store options and values for customized\n * functionality. Here you can add additional data for your own event\n * callbacks and formatter callbacks.\n *\n * @sample {highcharts} highcharts/point/custom/\n * Point and series with custom data\n *\n * @type {Highcharts.Dictionary<*>}\n * @apioption plotOptions.series.custom\n */\n /**\n * Name of the dash style to use for the graph, or for some series types\n * the outline of each shape.\n *\n * In styled mode, the\n * [stroke dash-array](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/series-dashstyle/)\n * can be set with the same classes as listed under\n * [series.color](#plotOptions.series.color).\n *\n * @sample {highcharts} highcharts/plotoptions/series-dashstyle-all/\n * Possible values demonstrated\n * @sample {highcharts} highcharts/plotoptions/series-dashstyle/\n * Chart suitable for printing in black and white\n * @sample {highstock} highcharts/plotoptions/series-dashstyle-all/\n * Possible values demonstrated\n * @sample {highmaps} highcharts/plotoptions/series-dashstyle-all/\n * Possible values demonstrated\n * @sample {highmaps} maps/plotoptions/series-dashstyle/\n * Dotted borders on a map\n *\n * @type {Highcharts.DashStyleValue}\n * @default Solid\n * @since 2.1\n * @apioption plotOptions.series.dashStyle\n */\n /**\n * A description of the series to add to the screen reader information\n * about the series.\n *\n * @type {string}\n * @since 5.0.0\n * @requires modules/accessibility\n * @apioption plotOptions.series.description\n */\n /**\n * Options for the series data sorting.\n *\n * @type {Highcharts.DataSortingOptionsObject}\n * @since 8.0.0\n * @product highcharts highstock\n * @apioption plotOptions.series.dataSorting\n */\n /**\n * Enable or disable data sorting for the series. Use [xAxis.reversed](\n * #xAxis.reversed) to change the sorting order.\n *\n * @sample {highcharts} highcharts/datasorting/animation/\n * Data sorting in scatter-3d\n * @sample {highcharts} highcharts/datasorting/labels-animation/\n * Axis labels animation\n * @sample {highcharts} highcharts/datasorting/dependent-sorting/\n * Dependent series sorting\n * @sample {highcharts} highcharts/datasorting/independent-sorting/\n * Independent series sorting\n *\n * @type {boolean}\n * @since 8.0.0\n * @apioption plotOptions.series.dataSorting.enabled\n */\n /**\n * Whether to allow matching points by name in an update. If this option\n * is disabled, points will be matched by order.\n *\n * @sample {highcharts} highcharts/datasorting/match-by-name/\n * Enabled match by name\n *\n * @type {boolean}\n * @since 8.0.0\n * @apioption plotOptions.series.dataSorting.matchByName\n */\n /**\n * Determines what data value should be used to sort by.\n *\n * @sample {highcharts} highcharts/datasorting/sort-key/\n * Sort key as `z` value\n *\n * @type {string}\n * @since 8.0.0\n * @default y\n * @apioption plotOptions.series.dataSorting.sortKey\n */\n /**\n * Enable or disable the mouse tracking for a specific series. This\n * includes point tooltips and click events on graphs and points. For\n * large datasets it improves performance.\n *\n * @sample {highcharts} highcharts/plotoptions/series-enablemousetracking-false/\n * No mouse tracking\n * @sample {highmaps} maps/plotoptions/series-enablemousetracking-false/\n * No mouse tracking\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.enableMouseTracking\n */\n enableMouseTracking: true,\n /**\n * Whether to use the Y extremes of the total chart width or only the\n * zoomed area when zooming in on parts of the X axis. By default, the\n * Y axis adjusts to the min and max of the visible data. Cartesian\n * series only.\n *\n * @type {boolean}\n * @default false\n * @since 4.1.6\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.getExtremesFromAll\n */\n /**\n * Highlight only the hovered point and fade the remaining points.\n *\n * Scatter-type series require enabling the 'inactive' marker state and\n * adjusting opacity. Note that this approach could affect performance\n * with large datasets.\n *\n * @sample {highcharts} highcharts/plotoptions/series-inactiveotherpoints-enabled/\n * Chart with inactiveOtherPoints option enabled.\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.inactiveOtherPoints\n */\n /**\n * An array specifying which option maps to which key in the data point\n * array. This makes it convenient to work with unstructured data arrays\n * from different sources.\n *\n * @see [series.data](#series.line.data)\n *\n * @sample {highcharts|highstock} highcharts/series/data-keys/\n * An extended data array with keys\n * @sample {highcharts|highstock} highcharts/series/data-nested-keys/\n * Nested keys used to access object properties\n *\n * @type {Array}\n * @since 4.1.6\n * @apioption plotOptions.series.keys\n */\n /**\n * The line cap used for line ends and line joins on the graph.\n *\n * @sample highcharts/series-line/linecap/\n * Line cap comparison\n *\n * @type {Highcharts.SeriesLinecapValue}\n * @default round\n * @product highcharts highstock\n * @apioption plotOptions.series.linecap\n */\n /**\n * The [id](#series.id) of another series to link to. Additionally,\n * the value can be \":previous\" to link to the previous series. When\n * two series are linked, only the first one appears in the legend.\n * Toggling the visibility of this also toggles the linked series.\n *\n * If master series uses data sorting and linked series does not have\n * its own sorting definition, the linked series will be sorted in the\n * same order as the master one.\n *\n * @sample {highcharts|highstock} highcharts/demo/arearange-line/\n * Linked series\n *\n * @type {string}\n * @since 3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.linkedTo\n */\n /**\n * Options for the corresponding navigator series if `showInNavigator`\n * is `true` for this series. Available options are the same as any\n * series, documented at [plotOptions](#plotOptions.series) and\n * [series](#series).\n *\n * These options are merged with options in [navigator.series](\n * #navigator.series), and will take precedence if the same option is\n * defined both places.\n *\n * @see [navigator.series](#navigator.series)\n *\n * @type {Highcharts.PlotSeriesOptions}\n * @since 5.0.0\n * @product highstock\n * @apioption plotOptions.series.navigatorOptions\n */\n /**\n * The color for the parts of the graph or points that are below the\n * [threshold](#plotOptions.series.threshold). Note that `zones` takes\n * precedence over the negative color. Using `negativeColor` is\n * equivalent to applying a zone with value of 0.\n *\n * @see In styled mode, a negative color is applied by setting this option\n * to `true` combined with the `.highcharts-negative` class name.\n *\n * @sample {highcharts} highcharts/plotoptions/series-negative-color/\n * Spline, area and column\n * @sample {highcharts} highcharts/plotoptions/arearange-negativecolor/\n * Arearange\n * @sample {highcharts} highcharts/css/series-negative-color/\n * Styled mode\n * @sample {highstock} highcharts/plotoptions/series-negative-color/\n * Spline, area and column\n * @sample {highstock} highcharts/plotoptions/arearange-negativecolor/\n * Arearange\n * @sample {highmaps} highcharts/plotoptions/series-negative-color/\n * Spline, area and column\n * @sample {highmaps} highcharts/plotoptions/arearange-negativecolor/\n * Arearange\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 3.0\n * @apioption plotOptions.series.negativeColor\n */\n /**\n * Same as\n * [accessibility.point.descriptionFormat](#accessibility.point.descriptionFormat),\n * but for an individual series. Overrides the chart wide configuration.\n *\n * @type {Function}\n * @since 11.1.0\n * @apioption plotOptions.series.pointDescriptionFormat\n */\n /**\n * Same as\n * [accessibility.series.descriptionFormatter](#accessibility.series.descriptionFormatter),\n * but for an individual series. Overrides the chart wide configuration.\n *\n * @type {Function}\n * @since 5.0.12\n * @apioption plotOptions.series.pointDescriptionFormatter\n */\n /**\n * If no x values are given for the points in a series, `pointInterval`\n * defines the interval of the x values. For example, if a series\n * contains one value every decade starting from year 0, set\n * `pointInterval` to `10`. In true `datetime` axes, the `pointInterval`\n * is set in milliseconds.\n *\n * It can be also be combined with `pointIntervalUnit` to draw irregular\n * time intervals.\n *\n * If combined with `relativeXValue`, an x value can be set on each\n * point, and the `pointInterval` is added x times to the `pointStart`\n * setting.\n *\n * Please note that this options applies to the _series data_, not the\n * interval of the axis ticks, which is independent.\n *\n * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n * Datetime X axis\n * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n * Relative x value\n * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n * Using pointStart and pointInterval\n * @sample {highstock} stock/plotoptions/relativexvalue/\n * Relative x value\n *\n * @type {number}\n * @default 1\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.pointInterval\n */\n /**\n * On datetime series, this allows for setting the\n * [pointInterval](#plotOptions.series.pointInterval) to irregular time\n * units, `day`, `month` and `year`. A day is usually the same as 24\n * hours, but `pointIntervalUnit` also takes the DST crossover into\n * consideration when dealing with local time. Combine this option with\n * `pointInterval` to draw weeks, quarters, 6 months, 10 years etc.\n *\n * Please note that this options applies to the _series data_, not the\n * interval of the axis ticks, which is independent.\n *\n * @sample {highcharts} highcharts/plotoptions/series-pointintervalunit/\n * One point a month\n * @sample {highstock} highcharts/plotoptions/series-pointintervalunit/\n * One point a month\n *\n * @type {string}\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @validvalue [\"day\", \"month\", \"year\"]\n * @apioption plotOptions.series.pointIntervalUnit\n */\n /**\n * Possible values: `\"on\"`, `\"between\"`, `number`.\n *\n * In a column chart, when pointPlacement is `\"on\"`, the point will not\n * create any padding of the X axis. In a polar column chart this means\n * that the first column points directly north. If the pointPlacement is\n * `\"between\"`, the columns will be laid out between ticks. This is\n * useful for example for visualising an amount between two points in\n * time or in a certain sector of a polar chart.\n *\n * Since Highcharts 3.0.2, the point placement can also be numeric,\n * where 0 is on the axis value, -0.5 is between this value and the\n * previous, and 0.5 is between this value and the next. Unlike the\n * textual options, numeric point placement options won't affect axis\n * padding.\n *\n * Note that pointPlacement needs a [pointRange](\n * #plotOptions.series.pointRange) to work. For column series this is\n * computed, but for line-type series it needs to be set.\n *\n * For the `xrange` series type and gantt charts, if the Y axis is a\n * category axis, the `pointPlacement` applies to the Y axis rather than\n * the (typically datetime) X axis.\n *\n * Defaults to `undefined` in cartesian charts, `\"between\"` in polar\n * charts.\n *\n * @see [xAxis.tickmarkPlacement](#xAxis.tickmarkPlacement)\n *\n * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-between/\n * Between in a column chart\n * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-numeric/\n * Numeric placement for custom layout\n * @sample {highcharts|highstock} maps/plotoptions/heatmap-pointplacement/\n * Placement in heatmap\n *\n * @type {string|number}\n * @since 2.3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.pointPlacement\n */\n /**\n * If no x values are given for the points in a series, `pointStart`\n * defines on what value to start. For example, if a series contains one\n * yearly value starting from 1945, set `pointStart` to 1945.\n *\n * The `pointStart` setting can be a number, or a datetime string that is\n * parsed according to the `time.timezone` setting.\n *\n * If combined with `relativeXValue`, an x value can be set on each\n * point. The x value from the point options is multiplied by\n * `pointInterval` and added to `pointStart` to produce a modified x\n * value.\n *\n * @sample {highcharts} highcharts/plotoptions/series-pointstart-linear/\n * Linear\n * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n * Datetime\n * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n * Relative x value\n * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n * Using pointStart and pointInterval\n * @sample {highstock} stock/plotoptions/relativexvalue/\n * Relative x value\n *\n * @type {number|string}\n * @default 0\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.pointStart\n */\n /**\n * When true, X values in the data set are relative to the current\n * `pointStart`, `pointInterval` and `pointIntervalUnit` settings. This\n * allows compression of the data for datasets with irregular X values.\n *\n * The real X values are computed on the formula `f(x) = ax + b`, where\n * `a` is the `pointInterval` (optionally with a time unit given by\n * `pointIntervalUnit`), and `b` is the `pointStart`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n * Relative X value\n * @sample {highstock} stock/plotoptions/relativexvalue/\n * Relative X value\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock\n * @apioption plotOptions.series.relativeXValue\n */\n /**\n * Whether to select the series initially. If `showCheckbox` is true,\n * the checkbox next to the series name in the legend will be checked\n * for a selected series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-selected/\n * One out of two series selected\n *\n * @type {boolean}\n * @default false\n * @since 1.2.0\n * @apioption plotOptions.series.selected\n */\n /**\n * Whether to apply a drop shadow to the graph line. Since 2.3 the\n * shadow can be an object configuration containing `color`, `offsetX`,\n * `offsetY`, `opacity` and `width`.\n *\n * Note that in some cases, like stacked columns or other dense layouts, the\n * series may cast shadows on each other. In that case, the\n * `chart.seriesGroupShadow` allows applying a common drop shadow to the\n * whole series group.\n *\n * @sample {highcharts} highcharts/plotoptions/series-shadow/\n * Shadow enabled\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption plotOptions.series.shadow\n */\n /**\n * Whether to display this particular series or series type in the\n * legend. Standalone series are shown in legend by default, and linked\n * series are not. Since v7.2.0 it is possible to show series that use\n * colorAxis by setting this option to `true`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n * One series in the legend, one hidden\n *\n * @type {boolean}\n * @apioption plotOptions.series.showInLegend\n */\n /**\n * Whether or not to show the series in the navigator. Takes precedence\n * over [navigator.baseSeries](#navigator.baseSeries) if defined.\n *\n * @type {boolean}\n * @since 5.0.0\n * @product highstock\n * @apioption plotOptions.series.showInNavigator\n */\n /**\n * If set to `true`, the accessibility module will skip past the points\n * in this series for keyboard navigation.\n *\n * @type {boolean}\n * @since 5.0.12\n * @apioption plotOptions.series.skipKeyboardNavigation\n */\n /**\n * Whether to stack the values of each series on top of each other.\n * Possible values are `undefined` to disable, `\"normal\"` to stack by\n * value or `\"percent\"`.\n *\n * When stacking is enabled, data must be sorted\n * in ascending X order.\n *\n * Some stacking options are related to specific series types. In the\n * streamgraph series type, the stacking option is set to `\"stream\"`.\n * The second one is `\"overlap\"`, which only applies to waterfall\n * series.\n *\n * @see [yAxis.reversedStacks](#yAxis.reversedStacks)\n *\n * @sample {highcharts} highcharts/plotoptions/series-stacking-line/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-stacking-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-stacking-bar/\n * Bar\n * @sample {highcharts} highcharts/plotoptions/series-stacking-area/\n * Area\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-line/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-bar/\n * Bar\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-area/\n * Area\n * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-normal-stacking\n * Waterfall with normal stacking\n * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-overlap-stacking\n * Waterfall with overlap stacking\n * @sample {highstock} stock/plotoptions/stacking/\n * Area\n *\n * @type {string}\n * @product highcharts highstock\n * @validvalue [\"normal\", \"overlap\", \"percent\", \"stream\"]\n * @apioption plotOptions.series.stacking\n */\n /**\n * Whether to apply steps to the line. Possible values are `left`,\n * `center` and `right`.\n *\n * @sample {highcharts} highcharts/plotoptions/line-step/\n * Different step line options\n * @sample {highcharts} highcharts/plotoptions/area-step/\n * Stepped, stacked area\n * @sample {highstock} stock/plotoptions/line-step/\n * Step line\n *\n * @type {string}\n * @since 1.2.5\n * @product highcharts highstock\n * @validvalue [\"left\", \"center\", \"right\"]\n * @apioption plotOptions.series.step\n */\n /**\n * The threshold, also called zero level or base level. For line type\n * series this is only used in conjunction with\n * [negativeColor](#plotOptions.series.negativeColor).\n *\n * @see [softThreshold](#plotOptions.series.softThreshold).\n *\n * @type {number|null}\n * @default 0\n * @since 3.0\n * @product highcharts highstock\n * @apioption plotOptions.series.threshold\n */\n /**\n * Set the initial visibility of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-visible/\n * Two series, one hidden and one visible\n * @sample {highstock} stock/plotoptions/series-visibility/\n * Hidden series\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.visible\n */\n /**\n * Defines the Axis on which the zones are applied.\n *\n * @see [zones](#plotOptions.series.zones)\n *\n * @sample {highcharts} highcharts/series/color-zones-zoneaxis-x/\n * Zones on the X-Axis\n * @sample {highstock} highcharts/series/color-zones-zoneaxis-x/\n * Zones on the X-Axis\n *\n * @type {string}\n * @default y\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zoneAxis\n */\n /**\n * General event handlers for the series items. These event hooks can\n * also be attached to the series at run time using the\n * `Highcharts.addEvent` function.\n *\n * @declare Highcharts.SeriesEventsOptionsObject\n *\n * @private\n */\n events: {},\n /**\n * Fires after the series has finished its initial animation, or in case\n * animation is disabled, immediately as the series is displayed.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-afteranimate/\n * Show label after animate\n * @sample {highstock} highcharts/plotoptions/series-events-afteranimate/\n * Show label after animate\n *\n * @type {Highcharts.SeriesAfterAnimateCallbackFunction}\n * @since 4.0\n * @product highcharts highstock gantt\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.afterAnimate\n */\n /**\n * Fires when the checkbox next to the series' name in the legend is\n * clicked. One parameter, `event`, is passed to the function. The state\n * of the checkbox is found by `event.checked`. The checked item is\n * found by `event.item`. Return `false` to prevent the default action\n * which is to toggle the select state of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n * Alert checkbox status\n *\n * @type {Highcharts.SeriesCheckboxClickCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.checkboxClick\n */\n /**\n * Fires when the series is clicked. One parameter, `event`, is passed\n * to the function, containing common event information. Additionally,\n * `event.point` holds a pointer to the nearest point on the graph.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-click/\n * Alert click info\n * @sample {highstock} stock/plotoptions/series-events-click/\n * Alert click info\n * @sample {highmaps} maps/plotoptions/series-events-click/\n * Display click info in subtitle\n *\n * @type {Highcharts.SeriesClickCallbackFunction}\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.click\n */\n /**\n * Fires when the series is hidden after chart generation time, either\n * by clicking the legend item or by calling `.hide()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-hide/\n * Alert when the series is hidden by clicking the legend item\n *\n * @type {Highcharts.SeriesHideCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.hide\n */\n /**\n * Fires when the legend item belonging to the series is clicked. One\n * parameter, `event`, is passed to the function. The default action\n * is to toggle the visibility of the series. This can be prevented\n * by returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * [legend.events.itemClick](#legend.events.itemClick).\n *\n * @type {Highcharts.SeriesLegendItemClickCallbackFunction}\n * @deprecated 11.4.4\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.legendItemClick\n */\n /**\n * Fires when the mouse leaves the graph. One parameter, `event`, is\n * passed to the function, containing common event information. If the\n * [stickyTracking](#plotOptions.series) option is true, `mouseOut`\n * doesn't happen before the mouse enters another graph or leaves the\n * plot area.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n * With sticky tracking by default\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n * Without sticky tracking\n *\n * @type {Highcharts.SeriesMouseOutCallbackFunction}\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.mouseOut\n */\n /**\n * Fires when the mouse enters the graph. One parameter, `event`, is\n * passed to the function, containing common event information.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n * With sticky tracking by default\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n * Without sticky tracking\n *\n * @type {Highcharts.SeriesMouseOverCallbackFunction}\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.mouseOver\n */\n /**\n * Fires when the series is shown after chart generation time, either\n * by clicking the legend item or by calling `.show()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-show/\n * Alert when the series is shown by clicking the legend item.\n *\n * @type {Highcharts.SeriesShowCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.show\n */\n /**\n * Options for the point markers of line and scatter-like series. Properties\n * like `fillColor`, `lineColor` and `lineWidth` define the visual\n * appearance of the markers. The `symbol` option defines the shape. Other\n * series types, like column series, don't have markers, but have visual\n * options on the series level instead.\n *\n * In styled mode, the markers can be styled with the `.highcharts-point`,\n * `.highcharts-point-hover` and `.highcharts-point-select` class names.\n *\n * @declare Highcharts.PointMarkerOptionsObject\n *\n * @sample {highmaps} maps/demo/mappoint-mapmarker\n * Using the mapmarker symbol for points\n *\n * @private\n */\n marker: {\n /**\n * Enable or disable the point marker. If `undefined`, the markers\n * are hidden when the data is dense, and shown for more widespread\n * data points.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-enabled/\n * Disabled markers\n * @sample {highcharts} highcharts/plotoptions/series-marker-enabled-false/\n * Disabled in normal state but enabled on hover\n * @sample {highstock} stock/plotoptions/series-marker/\n * Enabled markers\n *\n * @type {boolean}\n * @default {highcharts} undefined\n * @default {highstock} false\n * @apioption plotOptions.series.marker.enabled\n */\n /**\n * The threshold for how dense the point markers should be before\n * they are hidden, given that `enabled` is not defined. The number\n * indicates the horizontal distance between the two closest points\n * in the series, as multiples of the `marker.radius`. In other\n * words, the default value of 2 means points are hidden if\n * overlapping horizontally.\n *\n * @sample highcharts/plotoptions/series-marker-enabledthreshold\n * A higher threshold\n *\n * @since 6.0.5\n */\n enabledThreshold: 2,\n /**\n * The fill color of the point marker. When `undefined`, the series'\n * or point's color is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n * White fill\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption plotOptions.series.marker.fillColor\n */\n /**\n * Image markers only. Set the image width explicitly. When using\n * this option, a `width` must also be set.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n *\n * @type {number}\n * @since 4.0.4\n * @apioption plotOptions.series.marker.height\n */\n /**\n * The color of the point marker's outline. When `undefined`, the\n * series' or point's color is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n * Inherit from series color (undefined)\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n lineColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * The width of the point marker's outline.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n * 2px blue marker\n */\n lineWidth: 0,\n /**\n * The radius of the point marker.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-radius/\n * Bigger markers\n *\n * @default {highstock} 2\n * @default {highcharts} 4\n *\n */\n radius: 4,\n /**\n * A predefined shape or symbol for the marker. When undefined, the\n * symbol is pulled from options.symbols. Other possible values are\n * `'circle'`, `'square'`,`'diamond'`, `'triangle'` and\n * `'triangle-down'`.\n *\n * Additionally, the URL to a graphic can be given on this form:\n * `'url(graphic.png)'`. Note that for the image to be applied to\n * exported charts, its URL needs to be accessible by the export\n * server.\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n * used by its method name, as shown in the demo.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/\n * Predefined, graphic and custom markers\n * @sample {highstock} highcharts/plotoptions/series-marker-symbol/\n * Predefined, graphic and custom markers\n * @sample {highmaps} maps/demo/mappoint-mapmarker\n * Using the mapmarker symbol for points\n *\n * @type {string}\n * @apioption plotOptions.series.marker.symbol\n */\n /**\n * Image markers only. Set the image width explicitly. When using\n * this option, a `height` must also be set.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n *\n * @type {number}\n * @since 4.0.4\n * @apioption plotOptions.series.marker.width\n */\n /**\n * States for a single point marker.\n *\n * @declare Highcharts.PointStatesOptionsObject\n */\n states: {\n /**\n * The normal state of a single point marker. Currently only\n * used for setting animation when returning to normal state\n * from hover.\n *\n * @declare Highcharts.PointStatesNormalOptionsObject\n */\n normal: {\n /**\n * Animation when returning to normal state after hovering.\n *\n * @type {boolean|Partial}\n */\n animation: true\n },\n /**\n * The hover state for a single point marker.\n *\n * @declare Highcharts.PointStatesHoverOptionsObject\n */\n hover: {\n /**\n * Animation when hovering over the marker.\n *\n * @type {boolean|Partial}\n */\n animation: {\n /** @internal */\n duration: 150\n },\n /**\n * Enable or disable the point marker.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-enabled/\n * Disabled hover state\n */\n enabled: true,\n /**\n * The fill color of the marker in hover state. When\n * `undefined`, the series' or point's fillColor for normal\n * state is used.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption plotOptions.series.marker.states.hover.fillColor\n */\n /**\n * The color of the point marker's outline. When\n * `undefined`, the series' or point's lineColor for normal\n * state is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linecolor/\n * White fill color, black line color\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption plotOptions.series.marker.states.hover.lineColor\n */\n /**\n * The width of the point marker's outline. When\n * `undefined`, the series' or point's lineWidth for normal\n * state is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linewidth/\n * 3px line width\n *\n * @type {number}\n * @apioption plotOptions.series.marker.states.hover.lineWidth\n */\n /**\n * The radius of the point marker. In hover state, it\n * defaults to the normal state's radius + 2 as per the\n * [radiusPlus](#plotOptions.series.marker.states.hover.radiusPlus)\n * option.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-radius/\n * 10px radius\n *\n * @type {number}\n * @apioption plotOptions.series.marker.states.hover.radius\n */\n /**\n * The number of pixels to increase the radius of the\n * hovered point.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels greater radius on hover\n * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels greater radius on hover\n *\n * @since 4.0.3\n */\n radiusPlus: 2,\n /**\n * The additional line width for a hovered point.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 2 pixels wider on hover\n * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 2 pixels wider on hover\n *\n * @since 4.0.3\n */\n lineWidthPlus: 1\n },\n /**\n * The appearance of the point marker when selected. In order to\n * allow a point to be selected, set the\n * `series.allowPointSelect` option to true.\n *\n * @declare Highcharts.PointStatesSelectOptionsObject\n */\n select: {\n /**\n * Enable or disable visible feedback for selection.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-enabled/\n * Disabled select state\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.marker.states.select.enabled\n */\n /**\n * The radius of the point marker. In hover state, it\n * defaults to the normal state's radius + 2.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-radius/\n * 10px radius for selected points\n *\n * @type {number}\n * @apioption plotOptions.series.marker.states.select.radius\n */\n /**\n * The fill color of the point marker.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-fillcolor/\n * Solid red discs for selected points\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n fillColor: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * The color of the point marker's outline. When\n * `undefined`, the series' or point's color is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linecolor/\n * Red line color for selected points\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n lineColor: \"#000000\" /* Palette.neutralColor100 */,\n /**\n * The width of the point marker's outline.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linewidth/\n * 3px line width for selected points\n */\n lineWidth: 2\n }\n }\n },\n /**\n * Properties for each single point.\n *\n * @declare Highcharts.PlotSeriesPointOptions\n *\n * @private\n */\n point: {\n /**\n * Fires when a point is clicked. One parameter, `event`, is passed\n * to the function, containing common event information.\n *\n * If the `series.allowPointSelect` option is true, the default\n * action for the point's click event is to toggle the point's\n * select state. Returning `false` cancels this action.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-click/\n * Click marker to alert values\n * @sample {highcharts} highcharts/plotoptions/series-point-events-click-column/\n * Click column\n * @sample {highcharts} highcharts/plotoptions/series-point-events-click-url/\n * Go to URL\n * @sample {highmaps} maps/plotoptions/series-point-events-click/\n * Click marker to display values\n * @sample {highmaps} maps/plotoptions/series-point-events-click-url/\n * Go to URL\n *\n * @type {Highcharts.PointClickCallbackFunction}\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.click\n */\n /**\n * Fires when the mouse leaves the area close to the point. One\n * parameter, `event`, is passed to the function, containing common\n * event information.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n * Show values in the chart's corner on mouse over\n *\n * @type {Highcharts.PointMouseOutCallbackFunction}\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.mouseOut\n */\n /**\n * Fires when the mouse enters the area close to the point. One\n * parameter, `event`, is passed to the function, containing common\n * event information.\n *\n * Returning `false` cancels the default behavior, which is to show a\n * tooltip for the point.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n * Show values in the chart's corner on mouse over\n *\n * @type {Highcharts.PointMouseOverCallbackFunction}\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.mouseOver\n */\n /**\n * Fires when the point is removed using the `.remove()` method. One\n * parameter, `event`, is passed to the function. Returning `false`\n * cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-remove/\n * Remove point and confirm\n *\n * @type {Highcharts.PointRemoveCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.remove\n */\n /**\n * Fires when the point is selected either programmatically or\n * following a click on the point. One parameter, `event`, is passed\n * to the function. Returning `false` cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-select/\n * Report the last selected point\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Report select and unselect\n *\n * @type {Highcharts.PointSelectCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.select\n */\n /**\n * Fires when the point is unselected either programmatically or\n * following a click on the point. One parameter, `event`, is passed\n * to the function.\n * Returning `false` cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-unselect/\n * Report the last unselected point\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Report select and unselect\n *\n * @type {Highcharts.PointUnselectCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.unselect\n */\n /**\n * Fires when the point is updated programmatically through the\n * `.update()` method. One parameter, `event`, is passed to the\n * function. The new point options can be accessed through\n * `event.options`. Returning `false` cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-update/\n * Confirm point updating\n *\n * @type {Highcharts.PointUpdateCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.update\n */\n /**\n * Events for each single point.\n *\n * @declare Highcharts.PointEventsOptionsObject\n */\n events: {}\n },\n /**\n * Options for the series data labels, appearing next to each data\n * point.\n *\n * Since v6.2.0, multiple data labels can be applied to each single\n * point by defining them as an array of configs.\n *\n * In styled mode, the data labels can be styled with the\n * `.highcharts-data-label-box` and `.highcharts-data-label` class names\n * ([see example](https://www.highcharts.com/samples/highcharts/css/series-datalabels)).\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled\n * Data labels enabled\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-multiple\n * Multiple data labels on a bar series\n * @sample {highcharts} highcharts/css/series-datalabels\n * Styled mode example\n * @sample {highmaps} maps/demo/color-axis\n * Choropleth map with data labels\n * @sample {highmaps} maps/demo/mappoint-datalabels-mapmarker\n * Using data labels as map markers\n *\n * @type {*|Array<*>}\n * @product highcharts highstock highmaps gantt\n *\n * @private\n */\n dataLabels: {\n /**\n * Enable or disable the initial animation when a series is displayed\n * for the `dataLabels`. The animation can also be set as a\n * configuration object. Please note that this option only applies to\n * the initial animation.\n *\n * For other animations, see [chart.animation](#chart.animation) and the\n * animation parameter under the API methods. The following properties\n * are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * @sample {highcharts} highcharts/plotoptions/animation-defer/\n * Animation defer settings\n *\n * @type {boolean|Partial}\n * @since 8.2.0\n * @apioption plotOptions.series.dataLabels.animation\n */\n animation: {},\n /**\n * The animation delay time in milliseconds. Set to `0` to render the\n * data labels immediately. As `undefined` inherits defer time from the\n * [series.animation.defer](#plotOptions.series.animation.defer).\n *\n * @type {number}\n * @since 8.2.0\n * @apioption plotOptions.series.dataLabels.animation.defer\n */\n /**\n * The alignment of the data label compared to the point. If `right`,\n * the right side of the label should be touching the point. For points\n * with an extent, like columns, the alignments also dictates how to\n * align it inside the box, as given with the\n * [inside](#plotOptions.column.dataLabels.inside) option. Can be one of\n * `left`, `center` or `right`.\n *\n * @sample {highcharts}\n * highcharts/plotoptions/series-datalabels-align-left/ Left\n * aligned\n * @sample {highcharts}\n * highcharts/plotoptions/bar-datalabels-align-inside-bar/ Data\n * labels inside the bar\n *\n * @type {Highcharts.AlignValue|null}\n */\n align: 'center',\n /**\n * Alignment method for data labels. If set to `plotEdges`, the labels\n * are aligned within the plot area in the direction of the y-axis. So\n * in a regular column chart, the labels are aligned vertically\n * according to the `verticalAlign` setting. In a bar chart, which is\n * inverted, the labels are aligned horizontally according to the\n * `align` setting. Applies to cartesian series only.\n *\n * @sample {highcharts} highcharts/series-bar/datalabels-alignto/\n * Align to plot edges\n *\n * @type {string}\n * @since 11.4.2\n * @apioption plotOptions.series.dataLabels.alignTo\n */\n /**\n * Whether to allow data labels to overlap. To make the labels less\n * sensitive for overlapping, the\n * [dataLabels.padding](#plotOptions.series.dataLabels.padding)\n * can be set to 0.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-allowoverlap-false/\n * Don't allow overlap\n *\n * @type {boolean}\n * @default false\n * @since 4.1.0\n * @apioption plotOptions.series.dataLabels.allowOverlap\n */\n /**\n * The background color or gradient for the data label. Setting it to\n * `auto` will use the point's color.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/demo/mappoint-datalabels-mapmarker\n * Data labels as map markers\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.backgroundColor\n */\n /**\n * The border color for the data label. Setting it to `auto` will use\n * the point's color. Defaults to `undefined`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.borderColor\n */\n /**\n * The border radius in pixels for the data label.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {number}\n * @default 0\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.borderRadius\n */\n /**\n * The border width in pixels for the data label.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {number}\n * @default 0\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.borderWidth\n */\n borderWidth: 0,\n /**\n * A class name for the data label. Particularly in styled mode,\n * this can be used to give each series' or point's data label\n * unique styling. In addition to this option, a default color class\n * name is added so that we can give the labels a contrast text\n * shadow.\n *\n * @sample {highcharts} highcharts/css/data-label-contrast/\n * Contrast text shadow\n * @sample {highcharts} highcharts/css/series-datalabels/\n * Styling by CSS\n *\n * @type {string}\n * @since 5.0.0\n * @apioption plotOptions.series.dataLabels.className\n */\n /**\n * This options is deprecated.\n * Use [style.color](#plotOptions.series.dataLabels.style) instead.\n *\n * The text color for the data labels. Defaults to `undefined`. For\n * certain series types, like column or map, the data labels can be\n * drawn inside the points. In this case the data label will be\n * drawn with maximum contrast by default. Additionally, it will be\n * given a `text-outline` style with the opposite color, to further\n * increase the contrast. This can be overridden by setting the\n * `text-outline` style to `none` in the `dataLabels.style` option.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-color/\n * Red data labels\n * @sample {highmaps} maps/demo/color-axis/\n * White data labels\n *\n * @see [style.color](#plotOptions.series.dataLabels.style)\n *\n * @type {Highcharts.ColorType}\n * @deprecated 10.3\n * @apioption plotOptions.series.dataLabels.color\n */\n /**\n * Whether to hide data labels that are outside the plot area. By\n * default, the data label is moved inside the plot area according\n * to the\n * [overflow](#plotOptions.series.dataLabels.overflow)\n * option.\n *\n * @type {boolean}\n * @default true\n * @since 2.3.3\n * @apioption plotOptions.series.dataLabels.crop\n */\n /**\n * Whether to defer displaying the data labels until the initial\n * series animation has finished. Setting to `false` renders the\n * data label immediately. If set to `true` inherits the defer\n * time set in [plotOptions.series.animation](#plotOptions.series.animation).\n *\n * @since 4.0.0\n * @type {boolean}\n * @product highcharts highstock gantt\n */\n defer: true,\n /**\n * Enable or disable the data labels.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled/\n * Data labels enabled\n * @sample {highmaps} maps/demo/color-axis/\n * Data labels enabled\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.dataLabels.enabled\n */\n /**\n * A declarative filter to control of which data labels to display.\n * The declarative filter is designed for use when callback\n * functions are not available, like when the chart options require\n * a pure JSON structure or for use with graphical editors. For\n * programmatic control, use the `formatter` instead, and return\n * `undefined` to disable a single data label.\n *\n * @example\n * filter: {\n * property: 'percentage',\n * operator: '>',\n * value: 4\n * }\n *\n * @sample {highcharts} highcharts/demo/pie-monochrome\n * Data labels filtered by percentage\n *\n * @declare Highcharts.DataLabelsFilterOptionsObject\n * @since 6.0.3\n * @apioption plotOptions.series.dataLabels.filter\n */\n /**\n * The operator to compare by. Can be one of `>`, `<`, `>=`, `<=`,\n * `==`, `===`, `!=` and `!==`.\n *\n * @type {string}\n * @validvalue [\">\", \"<\", \">=\", \"<=\", \"==\", \"===\", \"!=\", \"!==\"]\n * @apioption plotOptions.series.dataLabels.filter.operator\n */\n /**\n * The point property to filter by. Point options are passed\n * directly to properties, additionally there are `y` value,\n * `percentage` and others listed under {@link Highcharts.Point}\n * members.\n *\n * @type {string}\n * @apioption plotOptions.series.dataLabels.filter.property\n */\n /**\n * The value to compare against.\n *\n * @type {number}\n * @apioption plotOptions.series.dataLabels.filter.value\n */\n /**\n * A\n * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for the data label. Available variables are the same as for\n * `formatter`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n * Add a unit\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-format-subexpression/\n * Complex logic in the format string\n * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n * Formatted value in the data label\n *\n * @type {string}\n * @default y\n * @default point.value\n * @since 3.0\n * @apioption plotOptions.series.dataLabels.format\n */\n // eslint-disable-next-line valid-jsdoc\n /**\n * Callback JavaScript function to format the data label. Note that if a\n * `format` is defined, the format takes precedence and the formatter is\n * ignored.\n *\n * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n * Formatted value\n *\n * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n */\n formatter: function () {\n const { numberFormatter } = this.series.chart;\n return typeof this.y !== 'number' ?\n '' : numberFormatter(this.y, -1);\n },\n /**\n * For points with an extent, like columns or map areas, whether to\n * align the data label inside the box or to the actual value point.\n * Defaults to `false` in most cases, `true` in stacked columns.\n *\n * @type {boolean}\n * @since 3.0\n * @apioption plotOptions.series.dataLabels.inside\n */\n /**\n * Format for points with the value of null. Works analogously to\n * [format](#plotOptions.series.dataLabels.format). `nullFormat` can\n * be applied only to series which support displaying null points\n * i.e `heatmap` or `tilemap`. Does not work with series that don't\n * display null points, like `line`, `column`, `bar` or `pie`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-nullformat/\n * Format data label for null points in heat map\n *\n * @type {boolean|string}\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.nullFormat\n */\n /**\n * Callback JavaScript function that defines formatting for points\n * with the value of null. Works analogously to\n * [formatter](#plotOptions.series.dataLabels.formatter).\n * `nullFormatter` can be applied only to series which support\n * displaying null points i.e `heatmap` or `tilemap`. Does not work\n * with series that don't display null points, like `line`, `column`,\n * `bar` or `pie`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-nullformat/\n * Format data label for null points in heat map\n *\n * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.nullFormatter\n */\n /**\n * How to handle data labels that flow outside the plot area. The\n * default is `\"justify\"`, which aligns them inside the plot area.\n * For columns and bars, this means it will be moved inside the bar.\n * To display data labels outside the plot area, set `crop` to\n * `false` and `overflow` to `\"allow\"`.\n *\n * @type {Highcharts.DataLabelsOverflowValue}\n * @default justify\n * @since 3.0.6\n * @apioption plotOptions.series.dataLabels.overflow\n */\n /**\n * When either the `borderWidth` or the `backgroundColor` is set,\n * this is the padding within the box.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @since 2.2.1\n */\n padding: 5,\n /**\n * Aligns data labels relative to points. If `center` alignment is\n * not possible, it defaults to `right`.\n *\n * @type {Highcharts.AlignValue}\n * @default center\n * @apioption plotOptions.series.dataLabels.position\n */\n /**\n * Text rotation in degrees. Note that due to a more complex\n * structure, backgrounds, borders and padding will be lost on a\n * rotated data label.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n * Vertical labels\n *\n * @type {number}\n * @default 0\n * @apioption plotOptions.series.dataLabels.rotation\n */\n /**\n * The shadow of the box. Works best with `borderWidth` or\n * `backgroundColor`. Since 2.3 the shadow can be an object\n * configuration containing `color`, `offsetX`, `offsetY`, `opacity`\n * and `width`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.shadow\n */\n /**\n * The name of a symbol to use for the border around the label.\n * Symbols are predefined functions on the Renderer object.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-shape/\n * A callout for annotations\n *\n * @type {string}\n * @default square\n * @since 4.1.2\n * @apioption plotOptions.series.dataLabels.shape\n */\n /**\n * Styles for the label. The default `color` setting is\n * `\"contrast\"`, which is a pseudo color that Highcharts picks up\n * and applies the maximum contrast to the underlying point item,\n * for example the bar in a bar chart.\n *\n * The `textOutline` is a pseudo property that applies an outline of\n * the given width with the given color, which by default is the\n * maximum contrast to the text. So a bright text color will result\n * in a black text outline for maximum readability on a mixed\n * background. In some cases, especially with grayscale text, the\n * text outline doesn't work well, in which cases it can be disabled\n * by setting it to `\"none\"`. When `useHTML` is true, the\n * `textOutline` will not be picked up. In this, case, the same\n * effect can be acheived through the `text-shadow` CSS property.\n *\n * For some series types, where each point has an extent, like for\n * example tree maps, the data label may overflow the point. There\n * are two strategies for handling overflow. By default, the text\n * will wrap to multiple lines. The other strategy is to set\n * `style.textOverflow` to `ellipsis`, which will keep the text on\n * one line plus it will break inside long words.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-style/\n * Bold labels\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow/\n * Long labels truncated with an ellipsis in a pie\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap/\n * Long labels are wrapped in a pie\n * @sample {highmaps} maps/demo/color-axis/\n * Bold labels\n *\n * @type {Highcharts.CSSObject}\n * @since 4.1.0\n * @apioption plotOptions.series.dataLabels.style\n */\n style: {\n /** @internal */\n fontSize: '0.7em',\n /** @internal */\n fontWeight: 'bold',\n /** @internal */\n color: 'contrast',\n /** @internal */\n textOutline: '1px contrast'\n },\n /**\n * Options for a label text which should follow marker's shape.\n * Border and background are disabled for a label that follows a\n * path.\n *\n * **Note:** Only SVG-based renderer supports this option. Setting\n * `useHTML` to true will disable this option.\n *\n * @declare Highcharts.DataLabelsTextPathOptionsObject\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.textPath\n */\n /**\n * Presentation attributes for the text path.\n *\n * @type {Highcharts.SVGAttributes}\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.textPath.attributes\n */\n /**\n * Enable or disable `textPath` option for link's or marker's data\n * labels.\n *\n * @type {boolean}\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.textPath.enabled\n */\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.dataLabels.useHTML\n */\n /**\n * The vertical alignment of a data label. Can be one of `top`,\n * `middle` or `bottom`. The default value depends on the data, for\n * instance in a column chart, the label is above positive values\n * and below negative values.\n *\n * @type {Highcharts.VerticalAlignValue|null}\n * @since 2.3.3\n */\n verticalAlign: 'bottom',\n /**\n * The x position offset of the label relative to the point in\n * pixels.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n * Vertical and positioned\n * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n * Data labels inside the bar\n */\n x: 0,\n /**\n * The z index of the data labels. Use a `zIndex` of 6 to display it above\n * the series, or use a `zIndex` of 2 to display it behind the series.\n *\n * @type {number}\n * @default 6\n * @since 2.3.5\n * @apioption plotOptions.series.dataLabels.zIndex\n */\n /**\n * The y position offset of the label relative to the point in\n * pixels.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n * Vertical and positioned\n */\n y: 0\n },\n /**\n * When the series contains less points than the crop threshold, all\n * points are drawn, even if the points fall outside the visible plot\n * area at the current zoom. The advantage of drawing all points\n * (including markers and columns), is that animation is performed on\n * updates. On the other hand, when the series contains more points than\n * the crop threshold, the series data is cropped to only contain points\n * that fall within the plot area. The advantage of cropping away\n * invisible points is to increase performance on large series.\n *\n * @since 2.2\n * @product highcharts highstock\n *\n * @private\n */\n cropThreshold: 300,\n /**\n * Opacity of a series parts: line, fill (e.g. area) and dataLabels.\n *\n * @see [states.inactive.opacity](#plotOptions.series.states.inactive.opacity)\n *\n * @since 7.1.0\n *\n * @private\n */\n opacity: 1,\n /**\n * The width of each point on the x axis. For example in a column chart\n * with one value each day, the pointRange would be 1 day (= 24 * 3600\n * * 1000 milliseconds). This is normally computed automatically, but\n * this option can be used to override the automatic value.\n *\n * @product highstock\n *\n * @private\n */\n pointRange: 0,\n /**\n * When this is true, the series will not cause the Y axis to cross\n * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n * unless the data actually crosses the plane.\n *\n * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n * 3 will make the Y axis show negative values according to the\n * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n * at 0.\n *\n * @since 4.1.9\n * @product highcharts highstock\n *\n * @private\n */\n softThreshold: true,\n /**\n * @declare Highcharts.SeriesStatesOptionsObject\n *\n * @private\n */\n states: {\n /**\n * The normal state of a series, or for point items in column, pie\n * and similar series. Currently only used for setting animation\n * when returning to normal state from hover.\n *\n * @declare Highcharts.SeriesStatesNormalOptionsObject\n */\n normal: {\n /**\n * Animation when returning to normal state after hovering.\n *\n * @type {boolean|Partial}\n */\n animation: true\n },\n /**\n * Options for the hovered series. These settings override the\n * normal state options when a series is moused over or touched.\n *\n * @declare Highcharts.SeriesStatesHoverOptionsObject\n */\n hover: {\n /**\n * Enable separate styles for the hovered series to visualize\n * that the user hovers either the series itself or the legend.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-pie/\n * Pie\n *\n * @type {boolean}\n * @default true\n * @since 1.2\n * @apioption plotOptions.series.states.hover.enabled\n */\n /**\n * Animation setting for hovering the graph in line-type series.\n *\n * @type {boolean|Partial}\n * @since 5.0.8\n * @product highcharts highstock\n */\n animation: {\n /**\n * The duration of the hover animation in milliseconds. By\n * default the hover state animates quickly in, and slowly\n * back to normal.\n *\n * @internal\n */\n duration: 150\n },\n /**\n * Pixel width of the graph line. By default this property is\n * undefined, and the `lineWidthPlus` property dictates how much\n * to increase the linewidth from normal state.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidth/\n * 5px line on hover\n *\n * @type {number}\n * @product highcharts highstock\n * @apioption plotOptions.series.states.hover.lineWidth\n */\n /**\n * The additional line width for the graph of a hovered series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels wider\n * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels wider\n *\n * @since 4.0.3\n * @product highcharts highstock\n */\n lineWidthPlus: 1,\n /**\n * In Highcharts 1.0, the appearance of all markers belonging\n * to the hovered series. For settings on the hover state of the\n * individual point, see\n * [marker.states.hover](#plotOptions.series.marker.states.hover).\n *\n * @deprecated\n *\n * @extends plotOptions.series.marker\n * @excluding states, symbol\n * @product highcharts highstock\n */\n marker: {\n // `lineWidth: base + 1`,\n // `radius: base + 1`\n },\n /**\n * Options for the halo appearing around the hovered point in\n * line-type series as well as outside the hovered slice in pie\n * charts. By default the halo is filled by the current point or\n * series color with an opacity of 0.25\\. The halo can be\n * disabled by setting the `halo` option to `null`.\n *\n * In styled mode, the halo is styled with the\n * `.highcharts-halo` class, with colors inherited from\n * `.highcharts-color-{n}`.\n *\n * @sample {highcharts} highcharts/plotoptions/halo/\n * Halo options\n * @sample {highstock} highcharts/plotoptions/halo/\n * Halo options\n *\n * @declare Highcharts.SeriesStatesHoverHaloOptionsObject\n * @type {null|*}\n * @since 4.0\n * @product highcharts highstock\n */\n halo: {\n /**\n * A collection of SVG attributes to override the appearance\n * of the halo, for example `fill`, `stroke` and\n * `stroke-width`.\n *\n * @type {Highcharts.SVGAttributes}\n * @since 4.0\n * @product highcharts highstock\n * @apioption plotOptions.series.states.hover.halo.attributes\n */\n /**\n * The pixel size of the halo. For point markers this is the\n * radius of the halo. For pie slices it is the width of the\n * halo outside the slice. For bubbles it defaults to 5 and\n * is the width of the halo outside the bubble.\n *\n * @since 4.0\n * @product highcharts highstock\n */\n size: 10,\n /**\n * Opacity for the halo unless a specific fill is overridden\n * using the `attributes` setting. Note that Highcharts is\n * only able to apply opacity to colors of hex or rgb(a)\n * formats.\n *\n * @since 4.0\n * @product highcharts highstock\n */\n opacity: 0.25\n }\n },\n /**\n * Specific options for point in selected states, after being\n * selected by\n * [allowPointSelect](#plotOptions.series.allowPointSelect)\n * or programmatically.\n *\n * @sample maps/plotoptions/series-allowpointselect/\n * Allow point select demo\n *\n * @declare Highcharts.SeriesStatesSelectOptionsObject\n * @extends plotOptions.series.states.hover\n * @excluding brightness\n */\n select: {\n animation: {\n /** @internal */\n duration: 0\n }\n },\n /**\n * The opposite state of a hover for series.\n *\n * @sample highcharts/plotoptions/series-states-inactive-disabled\n * Disabled inactive state\n *\n * @declare Highcharts.SeriesStatesInactiveOptionsObject\n */\n inactive: {\n /**\n * Enable or disable the inactive state for a series\n *\n * @sample highcharts/plotoptions/series-states-inactive-disabled\n * Disabled inactive state\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.states.inactive.enabled\n */\n /**\n * The animation for entering the inactive state.\n *\n * @type {boolean|Partial}\n */\n animation: {\n /** @internal */\n duration: 150\n },\n /**\n * Opacity of series elements (dataLabels, line, area).\n *\n * @type {number}\n */\n opacity: 0.2\n }\n },\n /**\n * Sticky tracking of mouse events. When true, the `mouseOut` event on a\n * series isn't triggered until the mouse moves over another series, or\n * out of the plot area. When false, the `mouseOut` event on a series is\n * triggered when the mouse leaves the area around the series' graph or\n * markers. This also implies the tooltip when not shared. When\n * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n * will be hidden when moving the mouse between series. Defaults to true\n * for line and area type series, but to false for columns, pies etc.\n *\n * **Note:** The boost module will force this option because of\n * technical limitations.\n *\n * @sample {highcharts} highcharts/plotoptions/series-stickytracking-true/\n * True by default\n * @sample {highcharts} highcharts/plotoptions/series-stickytracking-false/\n * False\n *\n * @default {highcharts} true\n * @default {highstock} true\n * @default {highmaps} false\n * @since 2.0\n *\n * @private\n */\n stickyTracking: true,\n /**\n * A configuration object for the tooltip rendering of each single\n * series. Properties are inherited from [tooltip](#tooltip), but only\n * the following properties can be defined on a series level.\n *\n * @declare Highcharts.SeriesTooltipOptionsObject\n * @since 2.3\n * @extends tooltip\n * @excluding animation, backgroundColor, borderColor, borderRadius,\n * borderWidth, className, crosshairs, enabled, formatter,\n * headerShape, hideDelay, outside, padding, positioner,\n * shadow, shape, shared, snap, split, stickOnContact,\n * style, useHTML\n * @apioption plotOptions.series.tooltip\n */\n /**\n * When a series contains a `data` array that is longer than this, the\n * Series class looks for data configurations of plain numbers or arrays of\n * numbers. The first and last valid points are checked. If found, the rest\n * of the data is assumed to be the same. This saves expensive data checking\n * and indexing in long series, and makes data-heavy charts render faster.\n *\n * Set it to `0` disable.\n *\n * Note:\n * - In boost mode turbo threshold is forced. Only array of numbers or two\n * dimensional arrays are allowed.\n * - In version 11.4.3 and earlier, if object configurations were passed\n * beyond the turbo threshold, a warning was logged in the console and the\n * data series didn't render.\n *\n * @since 2.2\n * @product highcharts highstock gantt\n *\n * @private\n */\n turboThreshold: 1000,\n /**\n * An array defining zones within a series. Zones can be applied to the\n * X axis, Y axis or Z axis for bubbles, according to the `zoneAxis`\n * option. The zone definitions have to be in ascending order regarding\n * to the value.\n *\n * In styled mode, the color zones are styled with the\n * `.highcharts-zone-{n}` class, or custom classed from the `className`\n * option\n * ([view live demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/color-zones/)).\n *\n * @see [zoneAxis](#plotOptions.series.zoneAxis)\n *\n * @sample {highcharts} highcharts/series/color-zones-simple/\n * Color zones\n * @sample {highstock} highcharts/series/color-zones-simple/\n * Color zones\n *\n * @declare Highcharts.SeriesZonesOptionsObject\n * @type {Array<*>}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones\n */\n /**\n * Styled mode only. A custom class name for the zone.\n *\n * @sample highcharts/css/color-zones/\n * Zones styled by class name\n *\n * @type {string}\n * @since 5.0.0\n * @apioption plotOptions.series.zones.className\n */\n /**\n * Defines the color of the series.\n *\n * @see [series color](#plotOptions.series.color)\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.color\n */\n /**\n * A name for the dash style to use for the graph.\n *\n * @see [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n *\n * @sample {highcharts|highstock} highcharts/series/color-zones-dashstyle-dot/\n * Dashed line indicates prognosis\n *\n * @type {Highcharts.DashStyleValue}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.dashStyle\n */\n /**\n * Defines the fill color for the series (in area type series)\n *\n * @see [fillColor](#plotOptions.area.fillColor)\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.fillColor\n */\n /**\n * The value up to where the zone extends, if undefined the zones\n * stretches to the last value in the series.\n *\n * @type {number}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.value\n */\n /**\n * When using dual or multiple color axes, this number defines which\n * colorAxis the particular series is connected to. It refers to\n * either the\n * {@link #colorAxis.id|axis id}\n * or the index of the axis in the colorAxis array, with 0 being the\n * first. Set this option to false to prevent a series from connecting\n * to the default color axis.\n *\n * Since v7.2.0 the option can also be an axis id or an axis index\n * instead of a boolean flag.\n *\n * @sample highcharts/coloraxis/coloraxis-with-pie/\n * Color axis with pie series\n * @sample highcharts/coloraxis/multiple-coloraxis/\n * Multiple color axis\n *\n * @type {number|string|boolean}\n * @default 0\n * @product highcharts highstock highmaps\n * @apioption plotOptions.series.colorAxis\n */\n /**\n * Determines what data value should be used to calculate point color\n * if `colorAxis` is used. Requires to set `min` and `max` if some\n * custom point property is used or if approximation for data grouping\n * is set to `'sum'`.\n *\n * @sample highcharts/coloraxis/custom-color-key/\n * Custom color key\n * @sample highcharts/coloraxis/color-key-with-stops/\n * Custom colorKey with color axis stops\n * @sample highcharts/coloraxis/changed-default-color-key/\n * Changed default color key\n *\n * @type {string}\n * @default y\n * @since 7.2.0\n * @product highcharts highstock highmaps\n * @apioption plotOptions.series.colorKey\n */\n /**\n * What type of legend symbol to render for this series. Can be one of\n * `areaMarker`, `lineMarker` or `rectangle`.\n *\n * @validvalue [\"areaMarker\", \"lineMarker\", \"rectangle\"]\n *\n * @sample {highcharts} highcharts/series/legend-symbol/\n * Change the legend symbol\n *\n * @type {string}\n * @default rectangle\n * @since 11.0.1\n * @apioption plotOptions.series.legendSymbol\n */\n /**\n * Defines the color of the legend symbol for this series. Defaults to\n * undefined, in which case the series color is used. Does not work with\n * styled mode.\n *\n * @sample {highcharts|highstock} highcharts/series/legend-symbol-color/\n * Change the legend symbol color\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default undefined\n * @since 12.0.0\n * @product highcharts highstock highmaps\n * @apioption plotOptions.series.legendSymbolColor\n */\n /**\n * Determines whether the series should look for the nearest point\n * in both dimensions or just the x-dimension when hovering the series.\n * Defaults to `'xy'` for scatter series and `'x'` for most other\n * series. If the data has duplicate x-values, it is recommended to\n * set this to `'xy'` to allow hovering over all points.\n *\n * Applies only to series types using nearest neighbor search (not\n * direct hover) for tooltip.\n *\n * @sample {highcharts} highcharts/series/findnearestpointby/\n * Different hover behaviors\n * @sample {highstock} highcharts/series/findnearestpointby/\n * Different hover behaviors\n * @sample {highmaps} highcharts/series/findnearestpointby/\n * Different hover behaviors\n *\n * @since 5.0.10\n * @validvalue [\"x\", \"xy\"]\n *\n * @private\n */\n findNearestPointBy: 'x'\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const SeriesDefaults = (seriesDefaults);\n\n;// ./code/es-modules/Core/Series/SeriesRegistry.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { defaultOptions: SeriesRegistry_defaultOptions } = Defaults;\n\n\nconst { extend: SeriesRegistry_extend, extendClass: SeriesRegistry_extendClass, merge: SeriesRegistry_merge } = Core_Utilities;\n/* *\n *\n * Namespace\n *\n * */\nvar SeriesRegistry;\n(function (SeriesRegistry) {\n /* *\n *\n * Properties\n *\n * */\n /**\n * @internal\n * @todo Move `Globals.seriesTypes` code to her.\n */\n SeriesRegistry.seriesTypes = Core_Globals.seriesTypes;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Registers class pattern of a series.\n *\n * @private\n */\n function registerSeriesType(seriesType, SeriesClass) {\n const defaultPlotOptions = SeriesRegistry_defaultOptions.plotOptions || {}, seriesOptions = SeriesClass.defaultOptions, seriesProto = SeriesClass.prototype;\n seriesProto.type = seriesType;\n if (!seriesProto.pointClass) {\n seriesProto.pointClass = Series_Point;\n }\n if (SeriesRegistry.seriesTypes[seriesType]) {\n return false;\n }\n if (seriesOptions) {\n defaultPlotOptions[seriesType] = seriesOptions;\n }\n SeriesRegistry.seriesTypes[seriesType] = SeriesClass;\n return true;\n }\n SeriesRegistry.registerSeriesType = registerSeriesType;\n /**\n * Old factory to create new series prototypes.\n *\n * @deprecated\n * @function Highcharts.seriesType\n *\n * @param {string} type\n * The series type name.\n *\n * @param {string} parent\n * The parent series type name. Use `line` to inherit from the basic\n * {@link Series} object.\n *\n * @param {Highcharts.SeriesOptionsType|Highcharts.Dictionary<*>} options\n * The additional default options that are merged with the parent's options.\n *\n * @param {Highcharts.Dictionary<*>} [props]\n * The properties (functions and primitives) to set on the new prototype.\n *\n * @param {Highcharts.Dictionary<*>} [pointProps]\n * Members for a series-specific extension of the {@link Point} prototype if\n * needed.\n *\n * @return {Highcharts.Series}\n * The newly created prototype as extended from {@link Series} or its\n * derivatives.\n */\n function seriesType(type, parent, options, seriesProto, pointProto) {\n const defaultPlotOptions = SeriesRegistry_defaultOptions.plotOptions || {};\n parent = parent || '';\n // Merge the options\n defaultPlotOptions[type] = SeriesRegistry_merge(defaultPlotOptions[parent], options);\n // Create the class\n delete SeriesRegistry.seriesTypes[type];\n registerSeriesType(type, SeriesRegistry_extendClass(SeriesRegistry.seriesTypes[parent] || function () { }, seriesProto));\n SeriesRegistry.seriesTypes[type].prototype.type = type;\n // Create the point class if needed\n if (pointProto) {\n class PointClass extends Series_Point {\n }\n SeriesRegistry_extend(PointClass.prototype, pointProto);\n SeriesRegistry.seriesTypes[type].prototype.pointClass = PointClass;\n }\n return SeriesRegistry.seriesTypes[type];\n }\n SeriesRegistry.seriesType = seriesType;\n})(SeriesRegistry || (SeriesRegistry = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_SeriesRegistry = (SeriesRegistry);\n\n;// ./code/es-modules/Core/Series/Series.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject: Series_animObject, setAnimation: Series_setAnimation } = AnimationUtilities;\n\n\nconst { defaultOptions: Series_defaultOptions } = Defaults;\n\nconst { registerEventOptions: Series_registerEventOptions } = Core_Foundation;\n\nconst { svg: Series_svg, win: Series_win } = Core_Globals;\n\n\n\n\nconst { seriesTypes } = Series_SeriesRegistry;\n\n\nconst { arrayMax: Series_arrayMax, arrayMin: Series_arrayMin, clamp: Series_clamp, correctFloat: Series_correctFloat, crisp: Series_crisp, defined: Series_defined, destroyObjectProperties: Series_destroyObjectProperties, diffObjects: Series_diffObjects, erase: Series_erase, error: Series_error, extend: Series_extend, find: Series_find, fireEvent: Series_fireEvent, getClosestDistance: Series_getClosestDistance, getNestedProperty: Series_getNestedProperty, insertItem: Series_insertItem, isArray: Series_isArray, isNumber: Series_isNumber, isString: Series_isString, merge: Series_merge, objectEach: Series_objectEach, pick: Series_pick, removeEvent: Series_removeEvent, syncTimeout: Series_syncTimeout } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * This is the base series prototype that all other series types inherit from.\n * A new series is initialized either through the\n * [series](https://api.highcharts.com/highcharts/series)\n * option structure, or after the chart is initialized, through\n * {@link Highcharts.Chart#addSeries}.\n *\n * The object can be accessed in a number of ways. All series and point event\n * handlers give a reference to the `series` object. The chart object has a\n * {@link Highcharts.Chart#series|series} property that is a collection of all\n * the chart's series. The point objects and axis objects also have the same\n * reference.\n *\n * Another way to reference the series programmatically is by `id`. Add an id\n * in the series configuration options, and get the series object by\n * {@link Highcharts.Chart#get}.\n *\n * Configuration options for the series are given in three levels. Options for\n * all series in a chart are given in the\n * [plotOptions.series](https://api.highcharts.com/highcharts/plotOptions.series)\n * object. Then options for all series of a specific type\n * are given in the plotOptions of that type, for example `plotOptions.line`.\n * Next, options for one single series are given in the series array, or as\n * arguments to `chart.addSeries`.\n *\n * The data in the series is stored in various arrays.\n *\n * - First, `series.options.data` contains all the original config options for\n * each point whether added by options or methods like `series.addPoint`.\n *\n * - The `series.dataTable` refers to an instance of [DataTableCore](https://api.highcharts.com/class-reference/Highcharts.Data)\n * or `DataTable` that contains the data in a tabular format. Individual\n * columns can be read from `series.getColumn()`.\n *\n * - Next, `series.data` contains those values converted to points, but in case\n * the series data length exceeds the `cropThreshold`, or if the data is\n * grouped, `series.data` doesn't contain all the points. It only contains the\n * points that have been created on demand.\n *\n * - Then there's `series.points` that contains all currently visible point\n * objects. In case of cropping, the cropped-away points are not part of this\n * array. The `series.points` array starts at `series.cropStart` compared to\n * `series.data` and `series.options.data`. If however the series data is\n * grouped, these can't be correlated one to one.\n *\n * @class\n * @name Highcharts.Series\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.SeriesOptionsType|object} options\n * The series options.\n */\nclass Series {\n constructor() {\n /* *\n *\n * Static Properties\n *\n * */\n this.zoneAxis = 'y';\n // eslint-enable valid-jsdoc\n }\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n init(chart, userOptions) {\n Series_fireEvent(this, 'init', { options: userOptions });\n // Create the data table\n this.dataTable ?? (this.dataTable = new Data_DataTableCore());\n const series = this, chartSeries = chart.series;\n // The 'eventsToUnbind' property moved from prototype into the\n // Series init to avoid reference to the same array between\n // the different series and charts. #12959, #13937\n this.eventsToUnbind = [];\n /**\n * Read only. The chart that the series belongs to.\n *\n * @name Highcharts.Series#chart\n * @type {Highcharts.Chart}\n */\n series.chart = chart;\n /**\n * Read only. The series' type, like \"line\", \"area\", \"column\" etc.\n * The type in the series options anc can be altered using\n * {@link Series#update}.\n *\n * @name Highcharts.Series#type\n * @type {string}\n */\n /**\n * Read only. The series' current options. To update, use\n * {@link Series#update}.\n *\n * @name Highcharts.Series#options\n * @type {Highcharts.SeriesOptionsType}\n */\n series.options = series.setOptions(userOptions);\n const options = series.options, visible = options.visible !== false;\n /**\n * All child series that are linked to the current series through the\n * [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n * option.\n *\n * @name Highcharts.Series#linkedSeries\n * @type {Array}\n * @readonly\n */\n series.linkedSeries = [];\n // Bind the axes\n series.bindAxes();\n Series_extend(series, {\n /**\n * The series name as given in the options. Defaults to\n * \"Series {n}\".\n *\n * @name Highcharts.Series#name\n * @type {string}\n */\n name: options.name,\n state: '',\n /**\n * Read only. The series' visibility state as set by {@link\n * Series#show}, {@link Series#hide}, or in the initial\n * configuration.\n *\n * @name Highcharts.Series#visible\n * @type {boolean}\n */\n visible, // True by default\n /**\n * Read only. The series' selected state as set by {@link\n * Highcharts.Series#select}.\n *\n * @name Highcharts.Series#selected\n * @type {boolean}\n */\n selected: options.selected === true // False by default\n });\n Series_registerEventOptions(this, options);\n const events = options.events;\n if ((events && events.click) ||\n (options.point &&\n options.point.events &&\n options.point.events.click) ||\n options.allowPointSelect) {\n chart.runTrackerClick = true;\n }\n series.getColor();\n series.getSymbol();\n // Mark cartesian\n if (series.isCartesian) {\n chart.hasCartesianSeries = true;\n }\n // Get the index and register the series in the chart. The index is\n // one more than the current latest series index (#5960).\n let lastSeries;\n if (chartSeries.length) {\n lastSeries = chartSeries[chartSeries.length - 1];\n }\n series._i = Series_pick(lastSeries && lastSeries._i, -1) + 1;\n series.opacity = series.options.opacity;\n // Insert the series and re-order all series above the insertion\n // point.\n chart.orderItems('series', Series_insertItem(this, chartSeries));\n // Set options for series with sorting and set data later.\n if (options.dataSorting && options.dataSorting.enabled) {\n series.setDataSortingOptions();\n }\n else if (!series.points && !series.data) {\n series.setData(options.data, false);\n }\n Series_fireEvent(this, 'afterInit');\n }\n /**\n * Check whether the series item is itself or inherits from a certain\n * series type.\n *\n * @function Highcharts.Series#is\n * @param {string} type The type of series to check for, can be either\n * featured or custom series types. For example `column`, `pie`,\n * `ohlc` etc.\n *\n * @return {boolean}\n * True if this item is or inherits from the given type.\n */\n is(type) {\n return seriesTypes[type] && this instanceof seriesTypes[type];\n }\n /**\n * Set the xAxis and yAxis properties of cartesian series, and register\n * the series in the `axis.series` array.\n *\n * @private\n * @function Highcharts.Series#bindAxes\n */\n bindAxes() {\n const series = this, seriesOptions = series.options, chart = series.chart;\n let axisOptions;\n Series_fireEvent(this, 'bindAxes', null, function () {\n // Repeat for xAxis and yAxis\n (series.axisTypes || []).forEach(function (coll) {\n // Loop through the chart's axis objects\n (chart[coll] || []).forEach(function (axis) {\n axisOptions = axis.options;\n // Apply if the series xAxis or yAxis option matches\n // the number of the axis, or if undefined, use the\n // first axis\n if (Series_pick(seriesOptions[coll], 0) === axis.index ||\n (typeof seriesOptions[coll] !==\n 'undefined' &&\n seriesOptions[coll] === axisOptions.id)) {\n // Register this series in the axis.series lookup\n Series_insertItem(series, axis.series);\n // Set this series.xAxis or series.yAxis reference\n /**\n * Read only. The unique xAxis object associated\n * with the series.\n *\n * @name Highcharts.Series#xAxis\n * @type {Highcharts.Axis}\n */\n /**\n * Read only. The unique yAxis object associated\n * with the series.\n *\n * @name Highcharts.Series#yAxis\n * @type {Highcharts.Axis}\n */\n series[coll] = axis;\n // Mark dirty for redraw\n axis.isDirty = true;\n }\n });\n // The series needs an X and an Y axis\n if (!series[coll] &&\n series.optionalAxis !== coll) {\n Series_error(18, true, chart);\n }\n });\n });\n Series_fireEvent(this, 'afterBindAxes');\n }\n /**\n * Define hasData functions for series. These return true if there\n * are data points on this series within the plot area.\n *\n * @private\n * @function Highcharts.Series#hasData\n */\n hasData() {\n return ((this.visible &&\n typeof this.dataMax !== 'undefined' &&\n typeof this.dataMin !== 'undefined') || ( // #3703\n this.visible &&\n this.dataTable.rowCount > 0 // #9758\n ));\n }\n /**\n * Determine whether the marker in a series has changed.\n *\n * @private\n * @function Highcharts.Series#hasMarkerChanged\n */\n hasMarkerChanged(options, oldOptions) {\n const marker = options.marker, oldMarker = oldOptions.marker || {};\n return marker && ((oldMarker.enabled && !marker.enabled) ||\n oldMarker.symbol !== marker.symbol || // #10870, #15946\n oldMarker.height !== marker.height || // #16274\n oldMarker.width !== marker.width // #16274\n );\n }\n /**\n * Return an auto incremented x value based on the pointStart and\n * pointInterval options. This is only used if an x value is not given\n * for the point that calls autoIncrement.\n *\n * @private\n * @function Highcharts.Series#autoIncrement\n */\n autoIncrement(x) {\n const options = this.options, { pointIntervalUnit, relativeXValue } = this.options, time = this.chart.time, xIncrement = this.xIncrement ??\n time.parse(options.pointStart) ??\n 0;\n let pointInterval;\n this.pointInterval = pointInterval = Series_pick(this.pointInterval, options.pointInterval, 1);\n if (relativeXValue && Series_isNumber(x)) {\n pointInterval *= x;\n }\n // Added code for pointInterval strings\n if (pointIntervalUnit) {\n const d = time.toParts(xIncrement);\n if (pointIntervalUnit === 'day') {\n d[2] += pointInterval;\n }\n else if (pointIntervalUnit === 'month') {\n d[1] += pointInterval;\n }\n else if (pointIntervalUnit === 'year') {\n d[0] += pointInterval;\n }\n pointInterval = time.makeTime.apply(time, d) - xIncrement;\n }\n if (relativeXValue && Series_isNumber(x)) {\n return xIncrement + pointInterval;\n }\n this.xIncrement = xIncrement + pointInterval;\n return xIncrement;\n }\n /**\n * Internal function to set properties for series if data sorting is\n * enabled.\n *\n * @private\n * @function Highcharts.Series#setDataSortingOptions\n */\n setDataSortingOptions() {\n const options = this.options;\n Series_extend(this, {\n requireSorting: false,\n sorted: false,\n enabledDataSorting: true,\n allowDG: false\n });\n // To allow unsorted data for column series.\n if (!Series_defined(options.pointRange)) {\n options.pointRange = 1;\n }\n }\n /**\n * Set the series options by merging from the options tree. Called\n * internally on initializing and updating series. This function will\n * not redraw the series. For API usage, use {@link Series#update}.\n * @private\n * @function Highcharts.Series#setOptions\n * @param {Highcharts.SeriesOptionsType} itemOptions\n * The series options.\n * @emits Highcharts.Series#event:afterSetOptions\n */\n setOptions(itemOptions) {\n const chart = this.chart, chartOptions = chart.options, plotOptions = chartOptions.plotOptions, userOptions = chart.userOptions || {}, seriesUserOptions = Series_merge(itemOptions), styledMode = chart.styledMode, e = {\n plotOptions: plotOptions,\n userOptions: seriesUserOptions\n };\n let zone;\n Series_fireEvent(this, 'setOptions', e);\n // These may be modified by the event\n const typeOptions = e.plotOptions[this.type], userPlotOptions = (userOptions.plotOptions || {}), userPlotOptionsSeries = userPlotOptions.series || {}, defaultPlotOptionsType = (Series_defaultOptions.plotOptions[this.type] || {}), userPlotOptionsType = userPlotOptions[this.type] || {};\n // Use copy to prevent undetected changes (#9762)\n /**\n * Contains series options by the user without defaults.\n * @name Highcharts.Series#userOptions\n * @type {Highcharts.SeriesOptionsType}\n */\n this.userOptions = e.userOptions;\n const options = Series_merge(typeOptions, plotOptions.series, \n // #3881, chart instance plotOptions[type] should trump\n // plotOptions.series\n userPlotOptionsType, seriesUserOptions);\n // The tooltip options are merged between global and series specific\n // options. Importance order asscendingly:\n // globals: (1)tooltip, (2)plotOptions.series,\n // (3)plotOptions[this.type]\n // init userOptions with possible later updates: 4-6 like 1-3 and\n // (7)this series options\n this.tooltipOptions = Series_merge(Series_defaultOptions.tooltip, // 1\n Series_defaultOptions.plotOptions.series?.tooltip, // 2\n defaultPlotOptionsType?.tooltip, // 3\n chart.userOptions.tooltip, // 4\n userPlotOptions.series?.tooltip, // 5\n userPlotOptionsType.tooltip, // 6\n seriesUserOptions.tooltip // 7\n );\n // When shared tooltip, stickyTracking is true by default,\n // unless user says otherwise.\n this.stickyTracking = Series_pick(seriesUserOptions.stickyTracking, userPlotOptionsType.stickyTracking, userPlotOptionsSeries.stickyTracking, (this.tooltipOptions.shared && !this.noSharedTooltip ?\n true :\n options.stickyTracking));\n // Delete marker object if not allowed (#1125)\n if (typeOptions.marker === null) {\n delete options.marker;\n }\n // Handle color zones\n this.zoneAxis = options.zoneAxis || 'y';\n const zones = this.zones = // #20440, create deep copy of zones options\n (options.zones || []).map((z) => ({ ...z }));\n if ((options.negativeColor || options.negativeFillColor) &&\n !options.zones) {\n zone = {\n value: options[this.zoneAxis + 'Threshold'] ||\n options.threshold ||\n 0,\n className: 'highcharts-negative'\n };\n if (!styledMode) {\n zone.color = options.negativeColor;\n zone.fillColor = options.negativeFillColor;\n }\n zones.push(zone);\n }\n // Push one extra zone for the rest\n if (zones.length && Series_defined(zones[zones.length - 1].value)) {\n zones.push(styledMode ? {} : {\n color: this.color,\n fillColor: this.fillColor\n });\n }\n Series_fireEvent(this, 'afterSetOptions', { options: options });\n return options;\n }\n /**\n * Return series name in \"Series {Number}\" format or the one defined by\n * a user. This method can be simply overridden as series name format\n * can vary (e.g. technical indicators).\n *\n * @function Highcharts.Series#getName\n *\n * @return {string}\n * The series name.\n */\n getName() {\n // #4119\n return Series_pick(this.options.name, 'Series ' + (this.index + 1));\n }\n /**\n * @private\n * @function Highcharts.Series#getCyclic\n */\n getCyclic(prop, value, defaults) {\n const chart = this.chart, indexName = `${prop}Index`, counterName = `${prop}Counter`, len = (\n // Symbol count\n defaults?.length ||\n // Color count\n chart.options.chart.colorCount);\n let i, setting;\n if (!value) {\n // Pick up either the colorIndex option, or the series.colorIndex\n // after Series.update()\n setting = Series_pick(prop === 'color' ? this.options.colorIndex : void 0, this[indexName]);\n if (Series_defined(setting)) { // After Series.update()\n i = setting;\n }\n else {\n // #6138\n if (!chart.series.length) {\n chart[counterName] = 0;\n }\n i = chart[counterName] % len;\n chart[counterName] += 1;\n }\n if (defaults) {\n value = defaults[i];\n }\n }\n // Set the colorIndex\n if (typeof i !== 'undefined') {\n this[indexName] = i;\n }\n this[prop] = value;\n }\n /**\n * Get the series' color based on either the options or pulled from\n * global options.\n *\n * @private\n * @function Highcharts.Series#getColor\n */\n getColor() {\n if (this.chart.styledMode) {\n this.getCyclic('color');\n }\n else if (this.options.colorByPoint) {\n this.color = \"#cccccc\" /* Palette.neutralColor20 */;\n }\n else {\n this.getCyclic('color', this.options.color ||\n Series_defaultOptions.plotOptions[this.type].color, this.chart.options.colors);\n }\n }\n /**\n * Get all points' instances created for this series.\n *\n * @private\n * @function Highcharts.Series#getPointsCollection\n */\n getPointsCollection() {\n return (this.hasGroupedData ? this.points : this.data) || [];\n }\n /**\n * Get the series' symbol based on either the options or pulled from\n * global options.\n *\n * @private\n * @function Highcharts.Series#getSymbol\n */\n getSymbol() {\n const seriesMarkerOption = this.options.marker;\n this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);\n }\n /**\n * Shorthand to get one of the series' data columns from `Series.dataTable`.\n *\n * @private\n * @function Highcharts.Series#getColumn\n */\n getColumn(columnName, modified) {\n return (modified ? this.dataTable.modified : this.dataTable)\n .getColumn(columnName, true) || [];\n }\n /**\n * Finds the index of an existing point that matches the given point\n * options.\n *\n * @private\n * @function Highcharts.Series#findPointIndex\n * @param {Highcharts.PointOptionsObject} optionsObject\n * The options of the point.\n * @param {number} fromIndex\n * The index to start searching from, used for optimizing series with\n * required sorting.\n * @return {number|undefined}\n * Returns the index of a matching point, or undefined if no match is found.\n */\n findPointIndex(optionsObject, fromIndex) {\n const id = optionsObject.id, x = optionsObject.x, oldData = this.points, dataSorting = this.options.dataSorting;\n let matchingPoint, matchedById, pointIndex;\n if (id) {\n const item = this.chart.get(id);\n if (item instanceof Series_Point) {\n matchingPoint = item;\n }\n }\n else if (this.linkedParent ||\n this.enabledDataSorting ||\n this.options.relativeXValue) {\n let matcher = (oldPoint) => !oldPoint.touched &&\n oldPoint.index === optionsObject.index;\n if (dataSorting && dataSorting.matchByName) {\n matcher = (oldPoint) => !oldPoint.touched &&\n oldPoint.name === optionsObject.name;\n }\n else if (this.options.relativeXValue) {\n matcher = (oldPoint) => !oldPoint.touched &&\n oldPoint.options.x === optionsObject.x;\n }\n matchingPoint = Series_find(oldData, matcher);\n // Add unmatched point as a new point\n if (!matchingPoint) {\n return void 0;\n }\n }\n if (matchingPoint) {\n pointIndex = matchingPoint && matchingPoint.index;\n if (typeof pointIndex !== 'undefined') {\n matchedById = true;\n }\n }\n // Search for the same X in the existing data set\n if (typeof pointIndex === 'undefined' && Series_isNumber(x)) {\n pointIndex = this.getColumn('x').indexOf(x, fromIndex);\n }\n // Reduce pointIndex if data is cropped\n if (pointIndex !== -1 &&\n typeof pointIndex !== 'undefined' &&\n this.cropped) {\n pointIndex = (pointIndex >= this.cropStart) ?\n pointIndex - this.cropStart : pointIndex;\n }\n if (!matchedById &&\n Series_isNumber(pointIndex) &&\n oldData[pointIndex] && oldData[pointIndex].touched) {\n pointIndex = void 0;\n }\n return pointIndex;\n }\n /**\n * Internal function called from setData. If the point count is the same\n * as it was, or if there are overlapping X values, just run\n * Point.update which is cheaper, allows animation, and keeps references\n * to points. This also allows adding or removing points if the X-es\n * don't match.\n *\n * @private\n * @function Highcharts.Series#updateData\n */\n updateData(data, animation) {\n const options = this.options, dataSorting = options.dataSorting, oldData = this.points, pointsToAdd = [], requireSorting = this.requireSorting, equalLength = data.length === oldData.length;\n let hasUpdatedByKey, i, point, lastIndex, succeeded = true;\n this.xIncrement = null;\n // Iterate the new data\n data.forEach(function (pointOptions, i) {\n const optionsObject = (Series_defined(pointOptions) &&\n this.pointClass.prototype.optionsToObject.call({ series: this }, pointOptions)) || {};\n let pointIndex;\n // Get the x of the new data point\n const x = optionsObject.x, id = optionsObject.id;\n if (id || Series_isNumber(x)) {\n pointIndex = this.findPointIndex(optionsObject, lastIndex);\n // Matching X not found\n // or used already due to ununique x values (#8995),\n // add point (but later)\n if (pointIndex === -1 ||\n typeof pointIndex === 'undefined') {\n pointsToAdd.push(pointOptions);\n // Matching X found, update\n }\n else if (oldData[pointIndex] &&\n pointOptions !== options.data[pointIndex]) {\n oldData[pointIndex].update(pointOptions, false, null, false);\n // Mark it touched, below we will remove all points that\n // are not touched.\n oldData[pointIndex].touched = true;\n // Speed optimize by only searching after last known\n // index. Performs ~20% bettor on large data sets.\n if (requireSorting) {\n lastIndex = pointIndex + 1;\n }\n // Point exists, no changes, don't remove it\n }\n else if (oldData[pointIndex]) {\n oldData[pointIndex].touched = true;\n }\n // If the length is equal and some of the nodes had a\n // match in the same position, we don't want to remove\n // non-matches.\n if (!equalLength ||\n i !== pointIndex ||\n (dataSorting && dataSorting.enabled) ||\n this.hasDerivedData) {\n hasUpdatedByKey = true;\n }\n }\n else {\n // Gather all points that are not matched\n pointsToAdd.push(pointOptions);\n }\n }, this);\n // Remove points that don't exist in the updated data set\n if (hasUpdatedByKey) {\n i = oldData.length;\n while (i--) {\n point = oldData[i];\n if (point && !point.touched && point.remove) {\n point.remove(false, animation);\n }\n }\n // If we did not find keys (ids or x-values), and the length is the\n // same, update one-to-one\n }\n else if (equalLength && (!dataSorting || !dataSorting.enabled)) {\n data.forEach(function (point, i) {\n // .update doesn't exist on a linked, hidden series (#3709)\n // (#10187)\n if (point !== oldData[i].y && !oldData[i].destroyed) {\n oldData[i].update(point, false, null, false);\n }\n });\n // Don't add new points since those configs are used above\n pointsToAdd.length = 0;\n // Did not succeed in updating data\n }\n else {\n succeeded = false;\n }\n oldData.forEach(function (point) {\n if (point) {\n point.touched = false;\n }\n });\n if (!succeeded) {\n return false;\n }\n // Add new points\n pointsToAdd.forEach(function (point) {\n this.addPoint(point, false, null, null, false);\n }, this);\n const xData = this.getColumn('x');\n if (this.xIncrement === null &&\n xData.length) {\n this.xIncrement = Series_arrayMax(xData);\n this.autoIncrement();\n }\n return true;\n }\n dataColumnKeys() {\n return ['x', ...(this.pointArrayMap || ['y'])];\n }\n /**\n * Apply a new set of data to the series and optionally redraw it. The\n * new data array is passed by reference (except in case of\n * `updatePoints`), and may later be mutated when updating the chart\n * data.\n *\n * Note the difference in behaviour when setting the same amount of\n * points, or a different amount of points, as handled by the\n * `updatePoints` parameter.\n *\n * @sample highcharts/members/series-setdata/\n * Set new data from a button\n * @sample highcharts/members/series-setdata-pie/\n * Set data in a pie\n * @sample stock/members/series-setdata/\n * Set new data in Highcharts Stock\n * @sample maps/members/series-setdata/\n * Set new data in Highmaps\n *\n * @function Highcharts.Series#setData\n *\n * @param {Array} data\n * Takes an array of data in the same format as described under\n * `series.{type}.data` for the given series type, for example a\n * line series would take data in the form described under\n * [series.line.data](https://api.highcharts.com/highcharts/series.line.data).\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If\n * doing more operations on the chart, it is a good idea to set\n * redraw to false and call {@link Chart#redraw} after.\n *\n * @param {boolean|Partial} [animation]\n * When the updated data is the same length as the existing data,\n * points will be updated by default, and animation visualizes\n * how the points are changed. Set false to disable animation, or\n * a configuration object to set duration or easing.\n *\n * @param {boolean} [updatePoints=true]\n * When this is true, points will be updated instead of replaced\n * whenever possible. This occurs a) when the updated data is the\n * same length as the existing data, b) when points are matched\n * by their id's, or c) when points can be matched by X values.\n * This allows updating with animation and performs better. In\n * this case, the original array is not passed by reference. Set\n * `false` to prevent.\n */\n setData(data, redraw = true, animation, updatePoints) {\n const series = this, oldData = series.points, oldDataLength = (oldData && oldData.length) || 0, options = series.options, chart = series.chart, dataSorting = options.dataSorting, xAxis = series.xAxis, turboThreshold = options.turboThreshold, table = this.dataTable, dataColumnKeys = this.dataColumnKeys(), pointValKey = series.pointValKey || 'y', pointArrayMap = series.pointArrayMap || [], valueCount = pointArrayMap.length, keys = options.keys;\n let i, updatedData, indexOfX = 0, indexOfY = 1, copiedData;\n if (!chart.options.chart.allowMutatingData) { // #4259\n // Remove old reference\n if (options.data) {\n delete series.options.data;\n }\n if (series.userOptions.data) {\n delete series.userOptions.data;\n }\n copiedData = Series_merge(true, data);\n }\n data = copiedData || data || [];\n const dataLength = data.length;\n if (dataSorting && dataSorting.enabled) {\n data = this.sortData(data);\n }\n // First try to run Point.update which is cheaper, allows animation, and\n // keeps references to points.\n if (chart.options.chart.allowMutatingData &&\n updatePoints !== false &&\n dataLength &&\n oldDataLength &&\n !series.cropped &&\n !series.hasGroupedData &&\n series.visible &&\n // Soft updating has no benefit in boost, and causes JS error\n // (#8355)\n !series.boosted) {\n updatedData = this.updateData(data, animation);\n }\n if (!updatedData) {\n // Reset properties\n series.xIncrement = null;\n series.colorCounter = 0; // For series with colorByPoint (#1547)\n // In turbo mode, look for one- or twodimensional arrays of numbers.\n // The first and the last valid value are tested, and we assume that\n // all the rest are defined the same way. Although the 'for' loops\n // are similar, they are repeated inside each if-else conditional\n // for max performance.\n let runTurbo = turboThreshold && dataLength > turboThreshold;\n if (runTurbo) {\n const firstPoint = series.getFirstValidPoint(data), lastPoint = series.getFirstValidPoint(data, dataLength - 1, -1), isShortArray = (a) => Boolean(Series_isArray(a) && (keys || Series_isNumber(a[0])));\n // Assume all points are numbers\n if (Series_isNumber(firstPoint) && Series_isNumber(lastPoint)) {\n const x = [], valueData = [];\n for (const value of data) {\n x.push(this.autoIncrement());\n valueData.push(value);\n }\n table.setColumns({\n x,\n [pointValKey]: valueData\n });\n // Assume all points are arrays when first point is\n }\n else if (isShortArray(firstPoint) &&\n isShortArray(lastPoint)) {\n if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n // When autoX is 1, the x is skipped: [low, high]. When\n // autoX is 0, the x is included: [x, low, high]\n const autoX = firstPoint.length === valueCount ?\n 1 : 0, colArray = new Array(dataColumnKeys.length)\n .fill(0).map(() => []);\n for (const pt of data) {\n if (autoX) {\n colArray[0].push(this.autoIncrement());\n }\n for (let j = autoX; j <= valueCount; j++) {\n colArray[j]?.push(pt[j - autoX]);\n }\n }\n table.setColumns(dataColumnKeys.reduce((columns, columnName, i) => {\n columns[columnName] = colArray[i];\n return columns;\n }, {}));\n }\n else { // [x, y]\n if (keys) {\n indexOfX = keys.indexOf('x');\n indexOfY = keys.indexOf('y');\n indexOfX = indexOfX >= 0 ? indexOfX : 0;\n indexOfY = indexOfY >= 0 ? indexOfY : 1;\n }\n if (firstPoint.length === 1) {\n indexOfY = 0;\n }\n const xData = [], valueData = [];\n if (indexOfX === indexOfY) {\n for (const pt of data) {\n xData.push(this.autoIncrement());\n valueData.push(pt[indexOfY]);\n }\n }\n else {\n for (const pt of data) {\n xData.push(pt[indexOfX]);\n valueData.push(pt[indexOfY]);\n }\n }\n table.setColumns({\n x: xData,\n [pointValKey]: valueData\n });\n }\n }\n else {\n // Highcharts expects configs to be numbers or arrays in\n // turbo mode\n runTurbo = false;\n }\n }\n if (!runTurbo) {\n const columns = dataColumnKeys.reduce((columns, columnName) => {\n columns[columnName] = [];\n return columns;\n }, {});\n for (i = 0; i < dataLength; i++) {\n const pt = series.pointClass.prototype.applyOptions.apply({ series }, [data[i]]);\n for (const key of dataColumnKeys) {\n columns[key][i] = pt[key];\n }\n }\n table.setColumns(columns);\n }\n // Forgetting to cast strings to numbers is a common caveat when\n // handling CSV or JSON\n if (Series_isString(this.getColumn('y')[0])) {\n Series_error(14, true, chart);\n }\n series.data = [];\n series.options.data = series.userOptions.data = data;\n // Destroy old points\n i = oldDataLength;\n while (i--) {\n oldData[i]?.destroy();\n }\n // Reset minRange (#878)\n if (xAxis) {\n xAxis.minRange = xAxis.userMinRange;\n }\n // Redraw\n series.isDirty = chart.isDirtyBox = true;\n series.isDirtyData = !!oldData;\n animation = false;\n }\n // Typically for pie series, points need to be processed and\n // generated prior to rendering the legend\n if (options.legendType === 'point') {\n this.processData();\n this.generatePoints();\n }\n if (redraw) {\n chart.redraw(animation);\n }\n }\n /**\n * Internal function to sort series data\n *\n * @private\n * @function Highcharts.Series#sortData\n * @param {Array} data\n * Force data grouping.\n */\n sortData(data) {\n const series = this, options = series.options, dataSorting = options.dataSorting, sortKey = dataSorting.sortKey || 'y', getPointOptionsObject = function (series, pointOptions) {\n return (Series_defined(pointOptions) &&\n series.pointClass.prototype.optionsToObject.call({\n series: series\n }, pointOptions)) || {};\n };\n data.forEach(function (pointOptions, i) {\n data[i] = getPointOptionsObject(series, pointOptions);\n data[i].index = i;\n }, this);\n // Sorting\n const sortedData = data.concat().sort((a, b) => {\n const aValue = Series_getNestedProperty(sortKey, a);\n const bValue = Series_getNestedProperty(sortKey, b);\n return bValue < aValue ? -1 : bValue > aValue ? 1 : 0;\n });\n // Set x value depending on the position in the array\n sortedData.forEach(function (point, i) {\n point.x = i;\n }, this);\n // Set the same x for linked series points if they don't have their\n // own sorting\n if (series.linkedSeries) {\n series.linkedSeries.forEach(function (linkedSeries) {\n const options = linkedSeries.options, seriesData = options.data;\n if ((!options.dataSorting ||\n !options.dataSorting.enabled) &&\n seriesData) {\n seriesData.forEach(function (pointOptions, i) {\n seriesData[i] = getPointOptionsObject(linkedSeries, pointOptions);\n if (data[i]) {\n seriesData[i].x = data[i].x;\n seriesData[i].index = i;\n }\n });\n linkedSeries.setData(seriesData, false);\n }\n });\n }\n return data;\n }\n /**\n * Internal function to process the data by cropping away unused data\n * points if the series is longer than the crop threshold. This saves\n * computing time for large series.\n *\n * @private\n * @function Highcharts.Series#getProcessedData\n * @param {boolean} [forceExtremesFromAll]\n * Force getting extremes of a total series data range.\n */\n getProcessedData(forceExtremesFromAll) {\n const series = this, { dataTable: table, isCartesian, options, xAxis } = series, cropThreshold = options.cropThreshold, getExtremesFromAll = forceExtremesFromAll ||\n // X-range series etc, #21003\n series.getExtremesFromAll, logarithmic = xAxis?.logarithmic, dataLength = table.rowCount;\n let croppedData, cropped, cropStart = 0, xExtremes, min, max, xData = series.getColumn('x'), modified = table, updatingNames = false;\n if (xAxis) {\n // Corrected for log axis (#3053)\n xExtremes = xAxis.getExtremes();\n min = xExtremes.min;\n max = xExtremes.max;\n updatingNames = !!(xAxis.categories && !xAxis.names.length);\n // Optionally filter out points outside the plot area\n if (isCartesian &&\n series.sorted &&\n !getExtremesFromAll &&\n (!cropThreshold ||\n dataLength > cropThreshold ||\n series.forceCrop)) {\n // It's outside current extremes\n if (xData[dataLength - 1] < min ||\n xData[0] > max) {\n modified = new Data_DataTableCore();\n // Only crop if it's actually spilling out\n }\n else if (\n // Don't understand why this condition is needed\n series.getColumn(series.pointValKey || 'y').length && (xData[0] < min ||\n xData[dataLength - 1] > max)) {\n croppedData = this.cropData(table, min, max);\n modified = croppedData.modified;\n cropStart = croppedData.start;\n cropped = true;\n }\n }\n }\n // Find the closest distance between processed points\n xData = modified.getColumn('x') || [];\n const closestPointRange = Series_getClosestDistance([\n logarithmic ?\n xData.map(logarithmic.log2lin) :\n xData\n ], \n // Unsorted data is not supported by the line tooltip, as well as\n // data grouping and navigation in Stock charts (#725) and width\n // calculation of columns (#1900). Avoid warning during the\n // premature processing pass in updateNames (#16104).\n () => (series.requireSorting &&\n !updatingNames &&\n Series_error(15, false, series.chart)));\n return {\n modified,\n cropped,\n cropStart,\n closestPointRange\n };\n }\n /**\n * Internal function to apply processed data.\n * In Highcharts Stock, this function is extended to provide data grouping.\n *\n * @private\n * @function Highcharts.Series#processData\n * @param {boolean} [force]\n * Force data grouping.\n */\n processData(force) {\n const series = this, xAxis = series.xAxis, table = series.dataTable;\n // If the series data or axes haven't changed, don't go through\n // this. Return false to pass the message on to override methods\n // like in data grouping.\n if (series.isCartesian &&\n !series.isDirty &&\n !xAxis.isDirty &&\n !series.yAxis.isDirty &&\n !force) {\n return false;\n }\n const processedData = series.getProcessedData();\n // Record the properties\n table.modified = processedData.modified;\n series.cropped = processedData.cropped; // Undefined or true\n series.cropStart = processedData.cropStart;\n series.closestPointRange = (series.basePointRange = processedData.closestPointRange);\n Series_fireEvent(series, 'afterProcessData');\n }\n /**\n * Iterate over xData and crop values between min and max. Returns\n * object containing crop start/end cropped xData with corresponding\n * part of yData, dataMin and dataMax within the cropped range.\n *\n * @private\n * @function Highcharts.Series#cropData\n */\n cropData(table, min, max) {\n const xData = table.getColumn('x', true) || [], dataLength = xData.length, columns = {};\n let i, j, start = 0, end = dataLength;\n // Iterate up to find slice start\n for (i = 0; i < dataLength; i++) {\n if (xData[i] >= min) {\n start = Math.max(0, i - 1);\n break;\n }\n }\n // Proceed to find slice end\n for (j = i; j < dataLength; j++) {\n if (xData[j] > max) {\n end = j + 1;\n break;\n }\n }\n for (const key of this.dataColumnKeys()) {\n const column = table.getColumn(key, true);\n if (column) {\n columns[key] = column.slice(start, end);\n }\n }\n return {\n modified: new Data_DataTableCore({ columns }),\n start,\n end\n };\n }\n /**\n * Generate the data point after the data has been processed by cropping\n * away unused points and optionally grouped in Highcharts Stock.\n *\n * @private\n * @function Highcharts.Series#generatePoints\n */\n generatePoints() {\n const series = this, options = series.options, dataOptions = series.processedData || options.data, table = series.dataTable.modified, xData = series.getColumn('x', true), PointClass = series.pointClass, processedDataLength = table.rowCount, cropStart = series.cropStart || 0, hasGroupedData = series.hasGroupedData, keys = options.keys, points = [], groupCropStartIndex = (options.dataGrouping &&\n options.dataGrouping.groupAll ?\n cropStart :\n 0), categories = series.xAxis?.categories, pointArrayMap = series.pointArrayMap || ['y'], \n // Create a configuration object out of a data row\n dataColumnKeys = this.dataColumnKeys();\n let dataLength, cursor, point, i, data = series.data, pOptions;\n if (!data && !hasGroupedData) {\n const arr = [];\n arr.length = dataOptions?.length || 0;\n data = series.data = arr;\n }\n if (keys && hasGroupedData) {\n // Grouped data has already applied keys (#6590)\n series.options.keys = false;\n }\n for (i = 0; i < processedDataLength; i++) {\n cursor = cropStart + i;\n if (!hasGroupedData) {\n point = data[cursor];\n pOptions = dataOptions ?\n dataOptions[cursor] :\n table.getRow(i, pointArrayMap);\n // #970:\n if (!point &&\n pOptions !== void 0) {\n data[cursor] = point = new PointClass(series, pOptions, xData[i]);\n }\n }\n else {\n // Splat the y data in case of ohlc data array\n point = new PointClass(series, table.getRow(i, dataColumnKeys) || []);\n point.dataGroup = series.groupMap[groupCropStartIndex + i];\n if (point.dataGroup?.options) {\n point.options = point.dataGroup.options;\n Series_extend(point, point.dataGroup.options);\n // Collision of props and options (#9770)\n delete point.dataLabels;\n }\n }\n if (point) { // #6279\n /**\n * Contains the point's index in the `Series.points` array.\n *\n * @name Highcharts.Point#index\n * @type {number}\n * @readonly\n */\n // For faster access in Point.update\n point.index = hasGroupedData ?\n (groupCropStartIndex + i) : cursor;\n points[i] = point;\n // Set point properties for convenient access in tooltip and\n // data labels\n point.category = categories?.[point.x] ?? point.x;\n point.key = point.name ?? point.category;\n }\n }\n // Restore keys options (#6590)\n series.options.keys = keys;\n // Hide cropped-away points - this only runs when the number of\n // points is above cropThreshold, or when switching view from\n // non-grouped data to grouped data (#637)\n if (data &&\n (processedDataLength !== (dataLength = data.length) ||\n hasGroupedData)) {\n for (i = 0; i < dataLength; i++) {\n // When has grouped data, clear all points\n if (i === cropStart && !hasGroupedData) {\n i += processedDataLength;\n }\n if (data[i]) {\n data[i].destroyElements();\n data[i].plotX = void 0; // #1003\n }\n }\n }\n /**\n * Read only. An array containing those values converted to points.\n * In case the series data length exceeds the `cropThreshold`, or if\n * the data is grouped, `series.data` doesn't contain all the\n * points. Also, in case a series is hidden, the `data` array may be\n * empty. In case of cropping, the `data` array may contain `undefined`\n * values, instead of points. To access raw values,\n * `series.options.data` will always be up to date. `Series.data` only\n * contains the points that have been created on demand. To modify the\n * data, use\n * {@link Highcharts.Series#setData} or\n * {@link Highcharts.Point#update}.\n *\n * @see Series.points\n *\n * @name Highcharts.Series#data\n * @type {Array}\n */\n series.data = data;\n /**\n * An array containing all currently visible point objects. In case\n * of cropping, the cropped-away points are not part of this array.\n * The `series.points` array starts at `series.cropStart` compared\n * to `series.data` and `series.options.data`. If however the series\n * data is grouped, these can't be correlated one to one. To modify\n * the data, use {@link Highcharts.Series#setData} or\n * {@link Highcharts.Point#update}.\n *\n * @name Highcharts.Series#points\n * @type {Array}\n */\n series.points = points;\n Series_fireEvent(this, 'afterGeneratePoints');\n }\n /**\n * Get current X extremes for the visible data.\n *\n * @private\n * @function Highcharts.Series#getXExtremes\n * @param {Array} xData\n * The data to inspect. Defaults to the current data within the visible\n * range.\n */\n getXExtremes(xData) {\n return {\n min: Series_arrayMin(xData),\n max: Series_arrayMax(xData)\n };\n }\n /**\n * Calculate Y extremes for the visible data. The result is returned\n * as an object with `dataMin` and `dataMax` properties.\n *\n * @private\n * @function Highcharts.Series#getExtremes\n * @param {Array} [yData]\n * The data to inspect. Defaults to the current data within the visible\n * range.\n * @param {boolean} [forceExtremesFromAll]\n * Force getting extremes of a total series data range.\n */\n getExtremes(yData, forceExtremesFromAll) {\n const { xAxis, yAxis } = this, getExtremesFromAll = forceExtremesFromAll ||\n this.getExtremesFromAll ||\n this.options.getExtremesFromAll, // #4599, #21003\n table = getExtremesFromAll && this.cropped ?\n this.dataTable :\n this.dataTable.modified, rowCount = table.rowCount, customData = yData || this.stackedYData, yAxisData = customData ?\n [customData] :\n (this.keysAffectYAxis || this.pointArrayMap || ['y'])?.map((key) => table.getColumn(key, true) || []) || [], xData = this.getColumn('x', true), activeYData = [], \n // Handle X outside the viewed area. This does not work with\n // non-sorted data like scatter (#7639).\n shoulder = this.requireSorting && !this.is('column') ?\n 1 : 0, \n // #2117, need to compensate for log X axis\n positiveValuesOnly = yAxis ? yAxis.positiveValuesOnly : false, doAll = getExtremesFromAll ||\n this.cropped ||\n !xAxis; // For colorAxis support\n let xExtremes, x, i, xMin = 0, xMax = 0;\n if (xAxis) {\n xExtremes = xAxis.getExtremes();\n xMin = xExtremes.min;\n xMax = xExtremes.max;\n }\n for (i = 0; i < rowCount; i++) {\n x = xData[i];\n // Check if it is within the selected x axis range\n if (doAll ||\n ((xData[i + shoulder] || x) >= xMin &&\n (xData[i - shoulder] || x) <= xMax)) {\n for (const values of yAxisData) {\n const val = values[i];\n // For points within the visible range, including the\n // first point outside the visible range (#7061),\n // consider y extremes.\n if (Series_isNumber(val) &&\n (val > 0 || !positiveValuesOnly)) {\n activeYData.push(val);\n }\n }\n }\n }\n const dataExtremes = {\n activeYData, // Needed for Stock Cumulative Sum\n dataMin: Series_arrayMin(activeYData),\n dataMax: Series_arrayMax(activeYData)\n };\n Series_fireEvent(this, 'afterGetExtremes', { dataExtremes });\n return dataExtremes;\n }\n /**\n * Set the current data extremes as `dataMin` and `dataMax` on the\n * Series item. Use this only when the series properties should be\n * updated.\n *\n * @private\n * @function Highcharts.Series#applyExtremes\n */\n applyExtremes() {\n const dataExtremes = this.getExtremes();\n /**\n * Contains the minimum value of the series' data point. Some series\n * types like `networkgraph` do not support this property as they\n * lack a `y`-value.\n * @name Highcharts.Series#dataMin\n * @type {number|undefined}\n * @readonly\n */\n this.dataMin = dataExtremes.dataMin;\n /**\n * Contains the maximum value of the series' data point. Some series\n * types like `networkgraph` do not support this property as they\n * lack a `y`-value.\n * @name Highcharts.Series#dataMax\n * @type {number|undefined}\n * @readonly\n */\n this.dataMax = dataExtremes.dataMax;\n return dataExtremes;\n }\n /**\n * Find and return the first non nullish point in the data\n *\n * @private\n * @function Highcharts.Series.getFirstValidPoint\n * @param {Array} data\n * Array of options for points\n * @param {number} [start=0]\n * Index to start searching from\n * @param {number} [increment=1]\n * Index increment, set -1 to search backwards\n */\n getFirstValidPoint(data, start = 0, increment = 1) {\n const dataLength = data.length;\n let i = start;\n while (i >= 0 && i < dataLength) {\n if (Series_defined(data[i])) {\n return data[i];\n }\n i += increment;\n }\n }\n /**\n * Translate data points from raw data values to chart specific\n * positioning data needed later in the `drawPoints` and `drawGraph`\n * functions. This function can be overridden in plugins and custom\n * series type implementations.\n *\n * @function Highcharts.Series#translate\n *\n * @emits Highcharts.Series#events:translate\n */\n translate() {\n this.generatePoints();\n const series = this, options = series.options, stacking = options.stacking, xAxis = series.xAxis, enabledDataSorting = series.enabledDataSorting, yAxis = series.yAxis, points = series.points, dataLength = points.length, pointPlacement = series.pointPlacementToXValue(), // #7860\n dynamicallyPlaced = Boolean(pointPlacement), threshold = options.threshold, stackThreshold = options.startFromThreshold ? threshold : 0;\n let i, plotX, lastPlotX, stackIndicator, closestPointRangePx = Number.MAX_VALUE;\n /**\n * Plotted coordinates need to be within a limited range. Drawing\n * too far outside the viewport causes various rendering issues\n * (#3201, #3923, #7555).\n * @private\n */\n function limitedRange(val) {\n return Series_clamp(val, -1e9, 1e9);\n }\n // Translate each point\n for (i = 0; i < dataLength; i++) {\n const point = points[i], xValue = point.x;\n let stackItem, stackValues, yValue = point.y, lowValue = point.low;\n const stacks = stacking && yAxis.stacking?.stacks[(series.negStacks &&\n yValue <\n (stackThreshold ? 0 : threshold) ?\n '-' :\n '') + series.stackKey];\n plotX = xAxis.translate(// #3923\n xValue, false, false, false, true, pointPlacement);\n /**\n * The translated X value for the point in terms of pixels. Relative\n * to the X axis position if the series has one, otherwise relative\n * to the plot area. Depending on the series type this value might\n * not be defined.\n *\n * In an inverted chart the x-axis is going from the bottom to the\n * top so the `plotX` value is the number of pixels from the bottom\n * of the axis.\n *\n * @see Highcharts.Point#pos\n * @name Highcharts.Point#plotX\n * @type {number|undefined}\n */\n point.plotX = Series_isNumber(plotX) ? Series_correctFloat(// #5236\n limitedRange(plotX) // #3923\n ) : void 0;\n // Calculate the bottom y value for stacked series\n if (stacking &&\n series.visible &&\n stacks &&\n stacks[xValue]) {\n stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);\n if (!point.isNull && stackIndicator.key) {\n stackItem = stacks[xValue];\n stackValues = stackItem.points[stackIndicator.key];\n }\n if (stackItem && Series_isArray(stackValues)) {\n lowValue = stackValues[0];\n yValue = stackValues[1];\n if (lowValue === stackThreshold &&\n stackIndicator.key === stacks[xValue].base) {\n lowValue = Series_pick(Series_isNumber(threshold) ? threshold : yAxis.min);\n }\n // #1200, #1232\n if (yAxis.positiveValuesOnly &&\n Series_defined(lowValue) &&\n lowValue <= 0) {\n lowValue = void 0;\n }\n point.total = point.stackTotal = Series_pick(stackItem.total);\n point.percentage = Series_defined(point.y) && stackItem.total ?\n (point.y / stackItem.total * 100) : void 0;\n point.stackY = yValue;\n // In case of variwide series (where widths of points are\n // different in most cases), stack labels are positioned\n // wrongly, so the call of the setOffset is omitted here and\n // labels are correctly positioned later, at the end of the\n // variwide's translate function (#10962)\n if (!series.irregularWidths) {\n stackItem.setOffset(series.pointXOffset || 0, series.barW || 0, void 0, void 0, void 0, series.xAxis);\n }\n }\n }\n // Set translated yBottom or remove it\n point.yBottom = Series_defined(lowValue) ?\n limitedRange(yAxis.translate(lowValue, false, true, false, true)) :\n void 0;\n // General hook, used for Highcharts Stock compare and cumulative\n if (series.dataModify) {\n yValue = series.dataModify.modifyValue(yValue, i);\n }\n // Set the plotY value, reset it for redraws #3201, #18422\n let plotY;\n if (Series_isNumber(yValue) && point.plotX !== void 0) {\n plotY = yAxis.translate(yValue, false, true, false, true);\n plotY = Series_isNumber(plotY) ? limitedRange(plotY) : void 0;\n }\n /**\n * The translated Y value for the point in terms of pixels. Relative\n * to the Y axis position if the series has one, otherwise relative\n * to the plot area. Depending on the series type this value might\n * not be defined.\n *\n * In an inverted chart the y-axis is going from right to left\n * so the `plotY` value is the number of pixels from the right\n * of the `yAxis`.\n *\n * @see Highcharts.Point#pos\n * @name Highcharts.Point#plotY\n * @type {number|undefined}\n */\n point.plotY = plotY;\n point.isInside = this.isPointInside(point);\n // Set client related positions for mouse tracking\n point.clientX = dynamicallyPlaced ?\n Series_correctFloat(xAxis.translate(xValue, false, false, false, true, pointPlacement)) :\n plotX; // #1514, #5383, #5518\n // Negative points #19028\n point.negative = (point.y || 0) < (threshold || 0);\n // Determine auto enabling of markers (#3635, #5099)\n if (!point.isNull && point.visible !== false) {\n if (typeof lastPlotX !== 'undefined') {\n closestPointRangePx = Math.min(closestPointRangePx, Math.abs(plotX - lastPlotX));\n }\n lastPlotX = plotX;\n }\n // Find point zone\n point.zone = this.zones.length ? point.getZone() : void 0;\n // Animate new points with data sorting\n if (!point.graphic && series.group && enabledDataSorting) {\n point.isNew = true;\n }\n }\n series.closestPointRangePx = closestPointRangePx;\n Series_fireEvent(this, 'afterTranslate');\n }\n /**\n * Return the series points with null points filtered out.\n *\n * @function Highcharts.Series#getValidPoints\n *\n * @param {Array} [points]\n * The points to inspect, defaults to {@link Series.points}.\n *\n * @param {boolean} [insideOnly=false]\n * Whether to inspect only the points that are inside the visible view.\n *\n * @param {boolean} [allowNull=false]\n * Whether to allow null points to pass as valid points.\n *\n * @return {Array}\n * The valid points.\n */\n getValidPoints(points, insideOnly, allowNull) {\n const chart = this.chart;\n // #3916, #5029, #5085\n return (points || this.points || []).filter(function (point) {\n const { plotX, plotY } = point, \n // Undefined plotY is treated as null when negative values\n // in log axis (#18422)\n asNull = !allowNull && (point.isNull || !Series_isNumber(plotY));\n if (asNull || (insideOnly && !chart.isInsidePlot(plotX, plotY, { inverted: chart.inverted }))) {\n return false;\n }\n return point.visible !== false;\n });\n }\n /**\n * Get the clipping for the series. Could be called for a series to\n * initiate animating the clip or to set the final clip (only width\n * and x).\n *\n * @private\n * @function Highcharts.Series#getClip\n */\n getClipBox() {\n const { chart, xAxis, yAxis } = this;\n // If no axes on the series, use global clipBox\n let { x, y, width, height } = Series_merge(chart.clipBox);\n // Otherwise, use clipBox.width which is corrected for plotBorderWidth\n // and clipOffset\n if (xAxis && xAxis.len !== chart.plotSizeX) {\n width = xAxis.len;\n }\n if (yAxis && yAxis.len !== chart.plotSizeY) {\n height = yAxis.len;\n }\n // If the chart is inverted and the series is not invertible, the chart\n // clip box should be inverted, but not the series clip box (#20264)\n if (chart.inverted && !this.invertible) {\n [width, height] = [height, width];\n }\n return { x, y, width, height };\n }\n /**\n * Get the shared clip key, creating it if it doesn't exist.\n *\n * @private\n * @function Highcharts.Series#getSharedClipKey\n */\n getSharedClipKey() {\n this.sharedClipKey = (this.options.xAxis || 0) + ',' +\n (this.options.yAxis || 0);\n return this.sharedClipKey;\n }\n /**\n * Set the clipping for the series. For animated series the clip is later\n * modified.\n *\n * @private\n * @function Highcharts.Series#setClip\n */\n setClip() {\n const { chart, group, markerGroup } = this, sharedClips = chart.sharedClips, renderer = chart.renderer, clipBox = this.getClipBox(), sharedClipKey = this.getSharedClipKey(); // #4526\n let clipRect = sharedClips[sharedClipKey];\n // If a clipping rectangle for the same set of axes does not exist,\n // create it\n if (!clipRect) {\n sharedClips[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n // When setting chart size, or when the series is rendered again before\n // starting animating, in compliance to a responsive rule\n }\n else {\n clipRect.animate(clipBox);\n }\n if (group) {\n // When clip is false, reset to no clip after animation\n group.clip(this.options.clip === false ? void 0 : clipRect);\n }\n // Unclip temporary animation clip\n if (markerGroup) {\n markerGroup.clip();\n }\n }\n /**\n * Animate in the series. Called internally twice. First with the `init`\n * parameter set to true, which sets up the initial state of the\n * animation. Then when ready, it is called with the `init` parameter\n * undefined, in order to perform the actual animation.\n *\n * @function Highcharts.Series#animate\n *\n * @param {boolean} [init]\n * Initialize the animation.\n */\n animate(init) {\n const { chart, group, markerGroup } = this, inverted = chart.inverted, animation = Series_animObject(this.options.animation), \n // The key for temporary animation clips\n animationClipKey = [\n this.getSharedClipKey(),\n animation.duration,\n animation.easing,\n animation.defer\n ].join(',');\n let animationClipRect = chart.sharedClips[animationClipKey], markerAnimationClipRect = chart.sharedClips[animationClipKey + 'm'];\n // Initialize the animation. Set up the clipping rectangle.\n if (init && group) {\n const clipBox = this.getClipBox();\n // Create temporary animation clips\n if (!animationClipRect) {\n clipBox.width = 0;\n if (inverted) {\n clipBox.x = chart.plotHeight;\n }\n animationClipRect = chart.renderer.clipRect(clipBox);\n chart.sharedClips[animationClipKey] = animationClipRect;\n // The marker clip box. The number 99 is a safe margin to avoid\n // markers being clipped during animation.\n const markerClipBox = {\n x: inverted ? -99 : -99,\n y: inverted ? -99 : -99,\n width: inverted ? chart.plotWidth + 199 : 99,\n height: inverted ? 99 : chart.plotHeight + 199\n };\n markerAnimationClipRect = chart.renderer.clipRect(markerClipBox);\n chart.sharedClips[animationClipKey + 'm'] = markerAnimationClipRect;\n }\n else {\n // When height changes during animation, typically due to\n // responsive settings\n animationClipRect.attr('height', clipBox.height);\n }\n group.clip(animationClipRect);\n markerGroup?.clip(markerAnimationClipRect);\n // Run the animation\n }\n else if (animationClipRect &&\n // Only first series in this pane\n !animationClipRect.hasClass('highcharts-animating')) {\n const finalBox = this.getClipBox(), step = animation.step;\n // Only do this when there are actually markers, or we have multiple\n // series (#20473)\n if (markerGroup?.element.childNodes.length ||\n chart.series.length > 1) {\n // To provide as smooth animation as possible, update the marker\n // group clipping in steps of the main group animation\n animation.step = function (val, fx) {\n if (step) {\n step.apply(fx, arguments);\n }\n if (fx.prop === 'width' &&\n markerAnimationClipRect?.element) {\n markerAnimationClipRect.attr(inverted ? 'height' : 'width', val + 99);\n }\n };\n }\n animationClipRect\n .addClass('highcharts-animating')\n .animate(finalBox, animation);\n }\n }\n /**\n * This runs after animation to land on the final plot clipping.\n *\n * @private\n * @function Highcharts.Series#afterAnimate\n *\n * @emits Highcharts.Series#event:afterAnimate\n */\n afterAnimate() {\n this.setClip();\n // Destroy temporary clip rectangles that are no longer in use\n Series_objectEach(this.chart.sharedClips, (clip, key, sharedClips) => {\n if (clip && !this.chart.container.querySelector(`[clip-path=\"url(#${clip.id})\"]`)) {\n clip.destroy();\n delete sharedClips[key];\n }\n });\n this.finishedAnimating = true;\n Series_fireEvent(this, 'afterAnimate');\n }\n /**\n * Draw the markers for line-like series types, and columns or other\n * graphical representation for {@link Point} objects for other series\n * types. The resulting element is typically stored as\n * {@link Point.graphic}, and is created on the first call and updated\n * and moved on subsequent calls.\n *\n * @function Highcharts.Series#drawPoints\n */\n drawPoints(points = this.points) {\n const series = this, chart = series.chart, styledMode = chart.styledMode, { colorAxis, options } = series, seriesMarkerOptions = options.marker, markerGroup = series[series.specialGroup || 'markerGroup'], xAxis = series.xAxis, globallyEnabled = Series_pick(seriesMarkerOptions.enabled, !xAxis || xAxis.isRadial ? true : null, \n // Use larger or equal as radius is null in bubbles (#6321)\n series.closestPointRangePx >= (seriesMarkerOptions.enabledThreshold *\n seriesMarkerOptions.radius));\n let i, point, graphic, verb, pointMarkerOptions, hasPointMarker, markerAttribs;\n if (seriesMarkerOptions.enabled !== false ||\n series._hasPointMarkers) {\n for (i = 0; i < points.length; i++) {\n point = points[i];\n graphic = point.graphic;\n verb = graphic ? 'animate' : 'attr';\n pointMarkerOptions = point.marker || {};\n hasPointMarker = !!point.marker;\n const shouldDrawMarker = ((globallyEnabled &&\n typeof pointMarkerOptions.enabled === 'undefined') || pointMarkerOptions.enabled) && !point.isNull && point.visible !== false;\n // Only draw the point if y is defined\n if (shouldDrawMarker) {\n // Shortcuts\n const symbol = Series_pick(pointMarkerOptions.symbol, series.symbol, 'rect');\n markerAttribs = series.markerAttribs(point, (point.selected && 'select'));\n // Set starting position for point sliding animation.\n if (series.enabledDataSorting) {\n point.startXPos = xAxis.reversed ?\n -(markerAttribs.width || 0) :\n xAxis.width;\n }\n const isInside = point.isInside !== false;\n if (!graphic &&\n isInside &&\n ((markerAttribs.width || 0) > 0 || point.hasImage)) {\n /**\n * SVG graphic representing the point in the chart. In\n * some cases it may be a hidden graphic to improve\n * accessibility.\n *\n * Typically this is a simple shape, like a `rect`\n * for column charts or `path` for line markers, but\n * for some complex series types like boxplot or 3D\n * charts, the graphic may be a `g` element\n * containing other shapes. The graphic is generated\n * the first time {@link Series#drawPoints} runs,\n * and updated and moved on subsequent runs.\n *\n * @see Highcharts.Point#graphics\n *\n * @name Highcharts.Point#graphic\n * @type {Highcharts.SVGElement|undefined}\n */\n point.graphic = graphic = chart.renderer\n .symbol(symbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, hasPointMarker ?\n pointMarkerOptions :\n seriesMarkerOptions)\n .add(markerGroup);\n // Sliding animation for new points\n if (series.enabledDataSorting &&\n chart.hasRendered) {\n graphic.attr({\n x: point.startXPos\n });\n verb = 'animate';\n }\n }\n if (graphic && verb === 'animate') { // Update\n // Since the marker group isn't clipped, each\n // individual marker must be toggled\n graphic[isInside ? 'show' : 'hide'](isInside)\n .animate(markerAttribs);\n }\n // Presentational attributes\n if (graphic) {\n const pointAttr = series.pointAttribs(point, ((styledMode || !point.selected) ?\n void 0 :\n 'select'));\n if (!styledMode) {\n graphic[verb](pointAttr);\n }\n else if (colorAxis) { // #14114\n graphic['css']({\n fill: pointAttr.fill\n });\n }\n }\n if (graphic) {\n graphic.addClass(point.getClassName(), true);\n }\n }\n else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n }\n }\n }\n /**\n * Get non-presentational attributes for a point. Used internally for\n * both styled mode and classic. Can be overridden for different series\n * types.\n *\n * @see Series#pointAttribs\n *\n * @function Highcharts.Series#markerAttribs\n *\n * @param {Highcharts.Point} point\n * The Point to inspect.\n *\n * @param {string} [state]\n * The state, can be either `hover`, `select` or undefined.\n *\n * @return {Highcharts.SVGAttributes}\n * A hash containing those attributes that are not settable from CSS.\n */\n markerAttribs(point, state) {\n const seriesOptions = this.options, seriesMarkerOptions = seriesOptions.marker, pointMarkerOptions = point.marker || {}, symbol = (pointMarkerOptions.symbol ||\n seriesMarkerOptions.symbol), attribs = {};\n let seriesStateOptions, pointStateOptions, radius = Series_pick(pointMarkerOptions.radius, seriesMarkerOptions && seriesMarkerOptions.radius);\n // Handle hover and select states\n if (state) {\n seriesStateOptions = seriesMarkerOptions.states[state];\n pointStateOptions = pointMarkerOptions.states &&\n pointMarkerOptions.states[state];\n radius = Series_pick(pointStateOptions && pointStateOptions.radius, seriesStateOptions && seriesStateOptions.radius, radius && radius + (seriesStateOptions && seriesStateOptions.radiusPlus ||\n 0));\n }\n point.hasImage = symbol && symbol.indexOf('url') === 0;\n if (point.hasImage) {\n radius = 0; // And subsequently width and height is not set\n }\n const pos = point.pos();\n if (Series_isNumber(radius) && pos) {\n if (seriesOptions.crisp) {\n pos[0] = Series_crisp(pos[0], point.hasImage ?\n 0 :\n symbol === 'rect' ?\n // Rectangle symbols need crisp edges, others don't\n seriesMarkerOptions?.lineWidth || 0 :\n 1);\n }\n attribs.x = pos[0] - radius;\n attribs.y = pos[1] - radius;\n }\n if (radius) {\n attribs.width = attribs.height = 2 * radius;\n }\n return attribs;\n }\n /**\n * Internal function to get presentational attributes for each point.\n * Unlike {@link Series#markerAttribs}, this function should return\n * those attributes that can also be set in CSS. In styled mode,\n * `pointAttribs` won't be called.\n *\n * @private\n * @function Highcharts.Series#pointAttribs\n *\n * @param {Highcharts.Point} [point]\n * The point instance to inspect.\n *\n * @param {string} [state]\n * The point state, can be either `hover`, `select` or 'normal'. If\n * undefined, normal state is assumed.\n *\n * @return {Highcharts.SVGAttributes}\n * The presentational attributes to be set on the point.\n */\n pointAttribs(point, state) {\n const seriesMarkerOptions = this.options.marker, pointOptions = point && point.options, pointMarkerOptions = ((pointOptions && pointOptions.marker) || {}), pointColorOption = pointOptions && pointOptions.color, pointColor = point && point.color, zoneColor = point && point.zone && point.zone.color;\n let seriesStateOptions, pointStateOptions, color = this.color, fill, stroke, strokeWidth = Series_pick(pointMarkerOptions.lineWidth, seriesMarkerOptions.lineWidth), opacity = 1;\n color = (pointColorOption ||\n zoneColor ||\n pointColor ||\n color);\n fill = (pointMarkerOptions.fillColor ||\n seriesMarkerOptions.fillColor ||\n color);\n stroke = (pointMarkerOptions.lineColor ||\n seriesMarkerOptions.lineColor ||\n color);\n // Handle hover and select states\n state = state || 'normal';\n if (state) {\n seriesStateOptions = (seriesMarkerOptions.states[state] || {});\n pointStateOptions = (pointMarkerOptions.states &&\n pointMarkerOptions.states[state]) || {};\n strokeWidth = Series_pick(pointStateOptions.lineWidth, seriesStateOptions.lineWidth, strokeWidth + Series_pick(pointStateOptions.lineWidthPlus, seriesStateOptions.lineWidthPlus, 0));\n fill = (pointStateOptions.fillColor ||\n seriesStateOptions.fillColor ||\n fill);\n stroke = (pointStateOptions.lineColor ||\n seriesStateOptions.lineColor ||\n stroke);\n opacity = Series_pick(pointStateOptions.opacity, seriesStateOptions.opacity, opacity);\n }\n return {\n 'stroke': stroke,\n 'stroke-width': strokeWidth,\n 'fill': fill,\n 'opacity': opacity\n };\n }\n /**\n * Clear DOM objects and free up memory.\n *\n * @private\n * @function Highcharts.Series#destroy\n *\n * @emits Highcharts.Series#event:destroy\n */\n destroy(keepEventsForUpdate) {\n const series = this, chart = series.chart, issue134 = /AppleWebKit\\/533/.test(Series_win.navigator.userAgent), data = series.data || [];\n let destroy, i, point, axis;\n // Add event hook\n Series_fireEvent(series, 'destroy', { keepEventsForUpdate });\n // Remove events\n this.removeEvents(keepEventsForUpdate);\n // Erase from axes\n (series.axisTypes || []).forEach(function (AXIS) {\n axis = series[AXIS];\n if (axis && axis.series) {\n Series_erase(axis.series, series);\n axis.isDirty = axis.forceRedraw = true;\n }\n });\n // Remove legend items\n if (series.legendItem) {\n series.chart.legend.destroyItem(series);\n }\n // Destroy all points with their elements\n i = data.length;\n while (i--) {\n point = data[i];\n if (point && point.destroy) {\n point.destroy();\n }\n }\n for (const zone of series.zones) {\n // Destroy SVGElement's but preserve primitive props (#20426)\n Series_destroyObjectProperties(zone, void 0, true);\n }\n // Clear the animation timeout if we are destroying the series\n // during initial animation\n Core_Utilities.clearTimeout(series.animationTimeout);\n // Destroy all SVGElements associated to the series\n Series_objectEach(series, function (val, prop) {\n // Survive provides a hook for not destroying\n if (val instanceof SVG_SVGElement && !val.survive) {\n // Issue 134 workaround\n destroy = issue134 && prop === 'group' ?\n 'hide' :\n 'destroy';\n val[destroy]();\n }\n });\n // Remove from hoverSeries\n if (chart.hoverSeries === series) {\n chart.hoverSeries = void 0;\n }\n Series_erase(chart.series, series);\n chart.orderItems('series');\n // Clear all members\n Series_objectEach(series, function (val, prop) {\n if (!keepEventsForUpdate || prop !== 'hcEvents') {\n delete series[prop];\n }\n });\n }\n /**\n * Clip the graphs into zones for colors and styling.\n *\n * @private\n * @function Highcharts.Series#applyZones\n */\n applyZones() {\n const series = this, { area, chart, graph, zones, points, xAxis, yAxis, zoneAxis } = series, { inverted, renderer } = chart, axis = this[`${zoneAxis}Axis`], { isXAxis, len = 0, minPointOffset = 0 } = axis || {}, halfWidth = (graph?.strokeWidth() || 0) / 2 + 1, \n // Avoid points that are so close to the threshold that the graph\n // line would be split\n avoidClose = (zone, plotX = 0, plotY = 0) => {\n if (inverted) {\n plotY = len - plotY;\n }\n const { translated = 0, lineClip } = zone, distance = plotY - translated;\n lineClip?.push([\n 'L',\n plotX,\n Math.abs(distance) < halfWidth ?\n plotY - halfWidth * (distance <= 0 ? -1 : 1) :\n translated\n ]);\n };\n if (zones.length &&\n (graph || area) &&\n axis &&\n Series_isNumber(axis.min)) {\n const axisMax = axis.getExtremes().max + minPointOffset, \n // Invert the x and y coordinates of inverted charts\n invertPath = (path) => {\n path.forEach((segment, i) => {\n if (segment[0] === 'M' || segment[0] === 'L') {\n path[i] = [\n segment[0],\n isXAxis ? len - segment[1] : segment[1],\n isXAxis ? segment[2] : len - segment[2]\n ];\n }\n });\n };\n // Reset\n zones.forEach((zone) => {\n zone.lineClip = [];\n zone.translated = Series_clamp(axis.toPixels(Series_pick(zone.value, axisMax), true) || 0, 0, len);\n });\n // The use of the Color Threshold assumes there are no gaps so it is\n // safe to hide the original graph and area unless it is not\n // waterfall series, then use showLine property to set lines between\n // columns to be visible (#7862)\n if (graph && !this.showLine) {\n graph.hide();\n }\n if (area) {\n area.hide();\n }\n // Prepare for adaptive clips, avoiding segments close to the\n // threshold (#19709)\n if (zoneAxis === 'y' &&\n // Overheat protection\n points.length < xAxis.len) {\n for (const point of points) {\n const { plotX, plotY, zone } = point, zoneBelow = zone && zones[zones.indexOf(zone) - 1];\n // Close to upper boundary\n if (zone) {\n avoidClose(zone, plotX, plotY);\n }\n // Close to lower boundary\n if (zoneBelow) {\n avoidClose(zoneBelow, plotX, plotY);\n }\n }\n }\n // Compute and apply the clips\n let lastLineClip = [], \n // Starting point of the first zone. Offset for category axis\n // (#22188).\n lastTranslated = axis.toPixels(axis.getExtremes().min - minPointOffset, true);\n zones.forEach((zone) => {\n const lineClip = zone.lineClip || [], translated = Math.round(zone.translated || 0);\n if (xAxis.reversed) {\n lineClip.reverse();\n }\n let { clip, simpleClip } = zone, x1 = 0, y1 = 0, x2 = xAxis.len, y2 = yAxis.len;\n if (isXAxis) {\n x1 = translated;\n x2 = lastTranslated;\n }\n else {\n y1 = translated;\n y2 = lastTranslated;\n }\n // Adaptive clips\n const simplePath = [\n ['M', x1, y1],\n ['L', x2, y1],\n ['L', x2, y2],\n ['L', x1, y2],\n ['Z']\n ], adaptivePath = [\n simplePath[0],\n ...lineClip,\n simplePath[1],\n simplePath[2],\n ...lastLineClip,\n simplePath[3],\n simplePath[4]\n ];\n lastLineClip = lineClip.reverse();\n lastTranslated = translated;\n if (inverted) {\n invertPath(adaptivePath);\n if (area) {\n invertPath(simplePath);\n }\n }\n /* Debug clip paths\n zone.path?.destroy();\n zone.path = chart.renderer.path(adaptivePath)\n .attr({\n stroke: zone.color || this.color || 'gray',\n 'stroke-width': 1,\n 'dashstyle': 'Dash'\n })\n .add(series.group);\n // */\n if (clip) {\n clip.animate({ d: adaptivePath });\n simpleClip?.animate({ d: simplePath });\n }\n else {\n clip = zone.clip = renderer.path(adaptivePath);\n if (area) {\n simpleClip = zone.simpleClip = renderer.path(simplePath);\n }\n }\n // When no data, graph zone is not applied and after setData\n // clip was ignored. As a result, it should be applied each\n // time.\n if (graph) {\n zone.graph?.clip(clip);\n }\n if (area) {\n zone.area?.clip(simpleClip);\n }\n });\n }\n else if (series.visible) {\n // If zones were removed, restore graph and area\n if (graph) {\n graph.show();\n }\n if (area) {\n area.show();\n }\n }\n }\n /**\n * General abstraction for creating plot groups like series.group,\n * series.dataLabelsGroup and series.markerGroup. On subsequent calls,\n * the group will only be adjusted to the updated plot size.\n *\n * @private\n * @function Highcharts.Series#plotGroup\n */\n plotGroup(prop, name, visibility, zIndex, parent) {\n let group = this[prop];\n const isNew = !group, attrs = {\n visibility,\n zIndex: zIndex || 0.1 // Pointer logic uses this\n };\n // Avoid setting undefined opacity, or in styled mode\n if (Series_defined(this.opacity) &&\n !this.chart.styledMode && this.state !== 'inactive' // #13719\n ) {\n attrs.opacity = this.opacity;\n }\n // Generate it on first call\n if (!group) {\n this[prop] = group = this.chart.renderer\n .g()\n .add(parent);\n }\n // Add the class names, and replace existing ones as response to\n // Series.update (#6660)\n group.addClass(('highcharts-' + name +\n ' highcharts-series-' + this.index +\n ' highcharts-' + this.type + '-series ' +\n (Series_defined(this.colorIndex) ?\n 'highcharts-color-' + this.colorIndex + ' ' :\n '') +\n (this.options.className || '') +\n (group.hasClass('highcharts-tracker') ?\n ' highcharts-tracker' :\n '')), true);\n // Place it on first and subsequent (redraw) calls\n group.attr(attrs)[isNew ? 'attr' : 'animate'](this.getPlotBox(name));\n return group;\n }\n /**\n * Get the translation and scale for the plot area of this series.\n *\n * @function Highcharts.Series#getPlotBox\n */\n getPlotBox(name) {\n let horAxis = this.xAxis, vertAxis = this.yAxis;\n const chart = this.chart, inverted = (chart.inverted &&\n !chart.polar &&\n horAxis &&\n this.invertible &&\n name === 'series');\n // Swap axes for inverted (#2339)\n if (chart.inverted) {\n horAxis = vertAxis;\n vertAxis = this.xAxis;\n }\n return {\n translateX: horAxis ? horAxis.left : chart.plotLeft,\n translateY: vertAxis ? vertAxis.top : chart.plotTop,\n rotation: inverted ? 90 : 0,\n rotationOriginX: inverted ?\n (horAxis.len - vertAxis.len) / 2 :\n 0,\n rotationOriginY: inverted ?\n (horAxis.len + vertAxis.len) / 2 :\n 0,\n scaleX: inverted ? -1 : 1, // #1623\n scaleY: 1\n };\n }\n /**\n * Removes the event handlers attached previously with addEvents.\n * @private\n * @function Highcharts.Series#removeEvents\n */\n removeEvents(keepEventsForUpdate) {\n const { eventsToUnbind } = this;\n if (!keepEventsForUpdate) {\n // Remove all events\n Series_removeEvent(this);\n }\n if (eventsToUnbind.length) {\n // Remove only internal events for proper update. #12355 solves\n // problem with multiple destroy events\n eventsToUnbind.forEach((unbind) => {\n unbind();\n });\n eventsToUnbind.length = 0;\n }\n }\n /**\n * Render the graph and markers. Called internally when first rendering\n * and later when redrawing the chart. This function can be extended in\n * plugins, but normally shouldn't be called directly.\n *\n * @function Highcharts.Series#render\n *\n * @emits Highcharts.Series#event:afterRender\n */\n render() {\n const series = this, { chart, options, hasRendered } = series, animOptions = Series_animObject(options.animation), visibility = series.visible ?\n 'inherit' : 'hidden', // #2597\n zIndex = options.zIndex, chartSeriesGroup = chart.seriesGroup;\n let animDuration = series.finishedAnimating ?\n 0 : animOptions.duration;\n Series_fireEvent(this, 'render');\n // The group\n series.plotGroup('group', 'series', visibility, zIndex, chartSeriesGroup);\n series.markerGroup = series.plotGroup('markerGroup', 'markers', visibility, zIndex, chartSeriesGroup);\n // Initial clipping, applies to columns etc. (#3839).\n if (options.clip !== false) {\n series.setClip();\n }\n // Initialize the animation\n if (animDuration) {\n series.animate?.(true);\n }\n // Draw the graph if any\n if (series.drawGraph) {\n series.drawGraph();\n series.applyZones();\n }\n // Draw the points\n if (series.visible) {\n series.drawPoints();\n }\n // Draw the data labels\n series.drawDataLabels?.();\n // In pie charts, slices are added to the DOM, but actual rendering\n // is postponed until labels reserved their space\n series.redrawPoints?.();\n // Draw the mouse tracking area\n if (options.enableMouseTracking) {\n series.drawTracker?.();\n }\n // Run the animation\n if (animDuration) {\n series.animate?.();\n }\n // Call the afterAnimate function on animation complete (but don't\n // overwrite the animation.complete option which should be available\n // to the user).\n if (!hasRendered) {\n // Additional time if defer is defined before afterAnimate\n // will be triggered\n if (animDuration && animOptions.defer) {\n animDuration += animOptions.defer;\n }\n series.animationTimeout = Series_syncTimeout(() => {\n series.afterAnimate();\n }, animDuration || 0);\n }\n // Means data is in accordance with what you see\n series.isDirty = false;\n // (See #322) series.isDirty = series.isDirtyData = false; // means\n // data is in accordance with what you see\n series.hasRendered = true;\n Series_fireEvent(series, 'afterRender');\n }\n /**\n * Redraw the series. This function is called internally from\n * `chart.redraw` and normally shouldn't be called directly.\n * @private\n * @function Highcharts.Series#redraw\n */\n redraw() {\n // Cache it here as it is set to false in render, but used after\n const wasDirty = this.isDirty || this.isDirtyData;\n this.translate();\n this.render();\n if (wasDirty) { // #3868, #3945\n delete this.kdTree;\n }\n }\n /**\n * Whether to reserve space for the series, either because it is visible or\n * because the `chart.ignoreHiddenSeries` option is false.\n *\n * @private\n */\n reserveSpace() {\n return this.visible || !this.chart.options.chart.ignoreHiddenSeries;\n }\n /**\n * Find the nearest point from a pointer event. This applies to series that\n * use k-d-trees to get the nearest point. Native pointer events must be\n * normalized using `Pointer.normalize`, that adds `chartX` and `chartY`\n * properties.\n *\n * @sample highcharts/demo/synchronized-charts\n * Synchronized charts with tooltips\n *\n * @function Highcharts.Series#searchPoint\n *\n * @param {Highcharts.PointerEvent} e\n * The normalized pointer event\n * @param {boolean} [compareX=false]\n * Search only by the X value, not Y\n *\n * @return {Point|undefined}\n * The closest point to the pointer event\n */\n searchPoint(e, compareX) {\n const { xAxis, yAxis } = this, inverted = this.chart.inverted;\n return this.searchKDTree({\n clientX: inverted ?\n xAxis.len - e.chartY + xAxis.pos :\n e.chartX - xAxis.pos,\n plotY: inverted ?\n yAxis.len - e.chartX + yAxis.pos :\n e.chartY - yAxis.pos\n }, compareX, e);\n }\n /**\n * Build the k-d-tree that is used by mouse and touch interaction to get\n * the closest point. Line-like series typically have a one-dimensional\n * tree where points are searched along the X axis, while scatter-like\n * series typically search in two dimensions, X and Y.\n *\n * @private\n * @function Highcharts.Series#buildKDTree\n */\n buildKDTree(e) {\n // Prevent multiple k-d-trees from being built simultaneously\n // (#6235)\n this.buildingKdTree = true;\n const series = this, dimensions = series.options.findNearestPointBy\n .indexOf('y') > -1 ? 2 : 1;\n /**\n * Internal function\n * @private\n */\n function kdtree(points, depth, dimensions) {\n const length = points?.length;\n let axis, median;\n if (length) {\n // Alternate between the axis\n axis = series.kdAxisArray[depth % dimensions];\n // Sort point array\n points.sort((a, b) => (a[axis] || 0) - (b[axis] || 0));\n median = Math.floor(length / 2);\n // Build and return node\n return {\n point: points[median],\n left: kdtree(points.slice(0, median), depth + 1, dimensions),\n right: kdtree(points.slice(median + 1), depth + 1, dimensions)\n };\n }\n }\n /**\n * Start the recursive build process with a clone of the points\n * array and null points filtered out. (#3873)\n * @private\n */\n function startRecursive() {\n series.kdTree = kdtree(series.getValidPoints(void 0, \n // For line-type series restrict to plot area, but\n // column-type series not (#3916, #4511)\n !series.directTouch), dimensions, dimensions);\n series.buildingKdTree = false;\n }\n delete series.kdTree;\n // For testing tooltips, don't build async. Also if touchstart, we may\n // be dealing with click events on mobile, so don't delay (#6817).\n Series_syncTimeout(startRecursive, series.options.kdNow || e?.type === 'touchstart' ? 0 : 1);\n }\n /**\n * @private\n * @function Highcharts.Series#searchKDTree\n */\n searchKDTree(point, compareX, e, suppliedPointEvaluator, suppliedBSideCheckEvaluator) {\n const series = this, [kdX, kdY] = this.kdAxisArray, kdComparer = compareX ? 'distX' : 'dist', kdDimensions = (series.options.findNearestPointBy || '')\n .indexOf('y') > -1 ? 2 : 1, useRadius = !!series.isBubble, pointEvaluator = suppliedPointEvaluator || ((p1, p2, comparisonProp) => [\n (p1[comparisonProp] || 0) < (p2[comparisonProp] || 0) ?\n p1 :\n p2,\n false\n ]), bSideCheckEvaluator = suppliedBSideCheckEvaluator || ((a, b) => a < b);\n /**\n * Set the one and two dimensional distance on the point object.\n * @private\n */\n function setDistance(p1, p2) {\n const p1kdX = p1[kdX], p2kdX = p2[kdX], x = (Series_defined(p1kdX) && Series_defined(p2kdX)) ? p1kdX - p2kdX : null, p1kdY = p1[kdY], p2kdY = p2[kdY], y = (Series_defined(p1kdY) && Series_defined(p2kdY)) ? p1kdY - p2kdY : 0, radius = useRadius ? (p2.marker?.radius || 0) : 0;\n p2.dist = Math.sqrt(((x && x * x) || 0) + y * y) - radius;\n p2.distX = Series_defined(x) ? (Math.abs(x) - radius) : Number.MAX_VALUE;\n }\n /**\n * @private\n */\n function doSearch(search, tree, depth, dimensions) {\n const point = tree.point, axis = series.kdAxisArray[depth % dimensions];\n let ret = point, flip = false;\n setDistance(search, point);\n // Pick side based on distance to splitting point\n const tdist = (search[axis] || 0) - (point[axis] || 0) +\n (useRadius ? (point.marker?.radius || 0) : 0), sideA = tdist < 0 ? 'left' : 'right', sideB = tdist < 0 ? 'right' : 'left';\n // End of tree\n if (tree[sideA]) {\n [ret, flip] = pointEvaluator(point, doSearch(search, tree[sideA], depth + 1, dimensions), kdComparer);\n }\n if (tree[sideB]) {\n const sqrtTDist = Math.sqrt(tdist * tdist), retDist = ret[kdComparer];\n // Compare distance to current best to splitting point to decide\n // whether to check side B or no\n if (bSideCheckEvaluator(sqrtTDist, retDist, flip)) {\n ret = pointEvaluator(ret, doSearch(search, tree[sideB], depth + 1, dimensions), kdComparer)[0];\n }\n }\n return ret;\n }\n if (!this.kdTree && !this.buildingKdTree) {\n this.buildKDTree(e);\n }\n if (this.kdTree) {\n return doSearch(point, this.kdTree, kdDimensions, kdDimensions);\n }\n }\n /**\n * @private\n * @function Highcharts.Series#pointPlacementToXValue\n */\n pointPlacementToXValue() {\n const { options, xAxis } = this;\n let factor = options.pointPlacement;\n // Point placement is relative to each series pointRange (#5889)\n if (factor === 'between') {\n factor = xAxis.reversed ? -0.5 : 0.5; // #11955\n }\n return Series_isNumber(factor) ?\n factor * (options.pointRange || xAxis.pointRange) :\n 0;\n }\n /**\n * @private\n * @function Highcharts.Series#isPointInside\n */\n isPointInside(point) {\n const { chart, xAxis, yAxis } = this, { plotX = -1, plotY = -1 } = point, isInside = (plotY >= 0 &&\n plotY <= (yAxis ? yAxis.len : chart.plotHeight) &&\n plotX >= 0 &&\n plotX <= (xAxis ? xAxis.len : chart.plotWidth));\n return isInside;\n }\n /**\n * Draw the tracker object that sits above all data labels and markers to\n * track mouse events on the graph or points. For the line type charts\n * the tracker uses the same graphPath, but with a greater stroke width\n * for better control.\n * @private\n */\n drawTracker() {\n const series = this, options = series.options, trackByArea = options.trackByArea, trackerPath = [].concat((trackByArea ? series.areaPath : series.graphPath) || []), chart = series.chart, pointer = chart.pointer, renderer = chart.renderer, snap = chart.options.tooltip?.snap || 0, onMouseOver = () => {\n if (options.enableMouseTracking &&\n chart.hoverSeries !== series) {\n series.onMouseOver();\n }\n }, \n /*\n * Empirical lowest possible opacities for TRACKER_FILL for an\n * element to stay invisible but clickable\n * IE9: 0.00000000001 (unlimited)\n * IE10: 0.0001 (exporting only)\n * FF: 0.00000000001 (unlimited)\n * Chrome: 0.000001\n * Safari: 0.000001\n * Opera: 0.00000000001 (unlimited)\n */\n TRACKER_FILL = 'rgba(192,192,192,' + (Series_svg ? 0.0001 : 0.002) + ')';\n let tracker = series.tracker;\n // Draw the tracker\n if (tracker) {\n tracker.attr({ d: trackerPath });\n }\n else if (series.graph) { // Create\n series.tracker = tracker = renderer.path(trackerPath)\n .attr({\n visibility: series.visible ? 'inherit' : 'hidden',\n zIndex: 2\n })\n .addClass(trackByArea ?\n 'highcharts-tracker-area' :\n 'highcharts-tracker-line')\n .add(series.group);\n if (!chart.styledMode) {\n tracker.attr({\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round', // #1225\n stroke: TRACKER_FILL,\n fill: trackByArea ? TRACKER_FILL : 'none',\n 'stroke-width': series.graph.strokeWidth() +\n (trackByArea ? 0 : 2 * snap)\n });\n }\n // The tracker is added to the series group, which is clipped, but\n // is covered by the marker group. So the marker group also needs to\n // capture events.\n [\n series.tracker,\n series.markerGroup,\n series.dataLabelsGroup\n ].forEach((tracker) => {\n if (tracker) {\n tracker.addClass('highcharts-tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', (e) => {\n pointer?.onTrackerMouseOut(e);\n });\n if (options.cursor && !chart.styledMode) {\n tracker.css({ cursor: options.cursor });\n }\n tracker.on('touchstart', onMouseOver);\n }\n });\n }\n Series_fireEvent(this, 'afterDrawTracker');\n }\n /**\n * Add a point to the series after render time. The point can be added at\n * the end, or by giving it an X value, to the start or in the middle of the\n * series.\n *\n * @sample highcharts/members/series-addpoint-append/\n * Append point\n * @sample highcharts/members/series-addpoint-append-and-shift/\n * Append and shift\n * @sample highcharts/members/series-addpoint-x-and-y/\n * Both X and Y values given\n * @sample highcharts/members/series-addpoint-pie/\n * Append pie slice\n * @sample stock/members/series-addpoint/\n * Append 100 points in Highcharts Stock\n * @sample stock/members/series-addpoint-shift/\n * Append and shift in Highcharts Stock\n * @sample maps/members/series-addpoint/\n * Add a point in Highmaps\n *\n * @function Highcharts.Series#addPoint\n *\n * @param {Highcharts.PointOptionsType} options\n * The point options. If options is a single number, a point with\n * that y value is appended to the series. If it is an array, it will\n * be interpreted as x and y values respectively. If it is an\n * object, advanced options as outlined under `series.data` are\n * applied.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the point is added. When adding\n * more than one point, it is highly recommended that the redraw\n * option be set to false, and instead {@link Chart#redraw} is\n * explicitly called after the adding of points is finished.\n * Otherwise, the chart will redraw after adding each point.\n *\n * @param {boolean} [shift=false]\n * If true, a point is shifted off the start of the series as one is\n * appended to the end.\n *\n * @param {boolean|Partial} [animation]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @param {boolean} [withEvent=true]\n * Used internally, whether to fire the series `addPoint` event.\n *\n * @emits Highcharts.Series#event:addPoint\n */\n addPoint(options, redraw, shift, animation, withEvent) {\n const series = this, seriesOptions = series.options, { chart, data, dataTable: table, xAxis } = series, names = xAxis && xAxis.hasNames && xAxis.names, dataOptions = seriesOptions.data, xData = series.getColumn('x');\n let isInTheMiddle, i;\n // Optional redraw, defaults to true\n redraw = Series_pick(redraw, true);\n // Get options and push the point to xData, yData and series.options. In\n // series.generatePoints the Point instance will be created on demand\n // and pushed to the series.data array.\n const point = { series: series };\n series.pointClass.prototype.applyOptions.apply(point, [options]);\n const x = point.x;\n // Get the insertion point\n i = xData.length;\n if (series.requireSorting && x < xData[i - 1]) {\n isInTheMiddle = true;\n while (i && xData[i - 1] > x) {\n i--;\n }\n }\n // Insert the row at the given index\n table.setRow(point, i, true, { addColumns: false });\n if (names && point.name) {\n names[x] = point.name;\n }\n dataOptions?.splice(i, 0, options);\n if (isInTheMiddle ||\n // When processedData is present we need to splice an empty slot\n // into series.data, otherwise generatePoints won't pick it up.\n series.processedData) {\n series.data.splice(i, 0, null);\n series.processData();\n }\n // Generate points to be added to the legend (#1329)\n if (seriesOptions.legendType === 'point') {\n series.generatePoints();\n }\n // Shift the first point off the parallel arrays\n if (shift) {\n if (data[0] && !!data[0].remove) {\n data[0].remove(false);\n }\n else {\n [\n data,\n dataOptions,\n ...Object.values(table.getColumns())\n ].filter(Series_defined).forEach((coll) => {\n coll.shift();\n });\n table.rowCount -= 1;\n Series_fireEvent(table, 'afterDeleteRows');\n }\n }\n // Fire event\n if (withEvent !== false) {\n Series_fireEvent(series, 'addPoint', { point: point });\n }\n // Redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n chart.redraw(animation); // Animation is set anyway on redraw, #5665\n }\n }\n /**\n * Remove a point from the series. Unlike the\n * {@link Highcharts.Point#remove} method, this can also be done on a point\n * that is not instantiated because it is outside the view or subject to\n * Highcharts Stock data grouping.\n *\n * @sample highcharts/members/series-removepoint/\n * Remove cropped point\n *\n * @function Highcharts.Series#removePoint\n *\n * @param {number} i\n * The index of the point in the {@link Highcharts.Series.data|data}\n * array.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the point is added. When\n * removing more than one point, it is highly recommended that the\n * `redraw` option be set to `false`, and instead {@link\n * Highcharts.Chart#redraw} is explicitly called after the adding of\n * points is finished.\n *\n * @param {boolean|Partial} [animation]\n * Whether and optionally how the series should be animated.\n *\n * @emits Highcharts.Point#event:remove\n */\n removePoint(i, redraw, animation) {\n const series = this, { chart, data, points, dataTable: table } = series, point = data[i], remove = function () {\n // Splice out the point's data from all parallel arrays\n [\n // #4935\n points?.length === data.length ? points : void 0,\n data,\n series.options.data,\n ...Object.values(table.getColumns())\n ].filter(Series_defined).forEach((coll) => {\n coll.splice(i, 1);\n });\n // Shorthand row deletion in order to avoid including the whole\n // `deleteRows` function in the DataTableCore module.\n table.rowCount -= 1;\n Series_fireEvent(table, 'afterDeleteRows');\n point?.destroy();\n // Redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n chart.redraw();\n }\n };\n Series_setAnimation(animation, chart);\n redraw = Series_pick(redraw, true);\n // Fire the event with a default handler of removing the point\n if (point) {\n point.firePointEvent('remove', null, remove);\n }\n else {\n remove();\n }\n }\n /**\n * Remove a series and optionally redraw the chart.\n *\n * @sample highcharts/members/series-remove/\n * Remove first series from a button\n *\n * @function Highcharts.Series#remove\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call to\n * {@link Highcharts.Chart#redraw}.\n *\n * @param {boolean|Partial} [animation]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @param {boolean} [withEvent=true]\n * Used internally, whether to fire the series `remove` event.\n *\n * @emits Highcharts.Series#event:remove\n */\n remove(redraw, animation, withEvent, keepEvents) {\n const series = this, chart = series.chart;\n /**\n * @private\n */\n function remove() {\n // Destroy elements\n series.destroy(keepEvents);\n // Redraw\n chart.isDirtyLegend = chart.isDirtyBox = true;\n chart.linkSeries(keepEvents);\n if (Series_pick(redraw, true)) {\n chart.redraw(animation);\n }\n }\n // Fire the event with a default handler of removing the point\n if (withEvent !== false) {\n Series_fireEvent(series, 'remove', null, remove);\n }\n else {\n remove();\n }\n }\n /**\n * Update the series with a new set of options. For a clean and precise\n * handling of new options, all methods and elements from the series are\n * removed, and it is initialized from scratch. Therefore, this method is\n * more performance expensive than some other utility methods like {@link\n * Series#setData} or {@link Series#setVisible}.\n *\n * Note that `Series.update` may mutate the passed `data` options.\n *\n * @sample highcharts/members/series-update/\n * Updating series options\n * @sample maps/members/series-update/\n * Update series options in Highmaps\n *\n * @function Highcharts.Series#update\n *\n * @param {Highcharts.SeriesOptionsType} options\n * New options that will be merged with the series' existing options.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing\n * more operations on the chart, it is a good idea to set redraw to\n * false and call {@link Chart#redraw} after.\n *\n * @emits Highcharts.Series#event:update\n * @emits Highcharts.Series#event:afterUpdate\n */\n update(options, redraw) {\n options = Series_diffObjects(options, this.userOptions);\n Series_fireEvent(this, 'update', { options: options });\n const series = this, chart = series.chart, \n // Must use user options when changing type because series.options\n // is merged in with type specific plotOptions\n oldOptions = series.userOptions, initialType = series.initialType || series.type, plotOptions = chart.options.plotOptions, initialSeriesProto = seriesTypes[initialType].prototype, groups = [\n 'group',\n 'markerGroup',\n 'dataLabelsGroup',\n 'transformGroup'\n ], optionsToCheck = [\n 'dataGrouping',\n 'pointStart',\n 'pointInterval',\n 'pointIntervalUnit',\n 'keys'\n ], \n // Animation must be enabled when calling update before the initial\n // animation has first run. This happens when calling update\n // directly after chart initialization, or when applying responsive\n // rules (#6912).\n animation = series.finishedAnimating && { animation: false }, kinds = {};\n let seriesOptions, n, preserve = [\n 'colorIndex',\n 'eventOptions',\n 'navigatorSeries',\n 'symbolIndex',\n 'baseSeries'\n ], newType = (options.type ||\n oldOptions.type ||\n chart.options.chart.type);\n const keepPoints = !(\n // Indicators, histograms etc recalculate the data. It should be\n // possible to omit this.\n this.hasDerivedData ||\n // New type requires new point classes\n (newType && newType !== this.type) ||\n // New options affecting how the data points are built\n typeof options.keys !== 'undefined' ||\n typeof options.pointStart !== 'undefined' ||\n typeof options.pointInterval !== 'undefined' ||\n typeof options.relativeXValue !== 'undefined' ||\n options.joinBy ||\n options.mapData || // #11636\n // Changes to data grouping requires new points in new group\n optionsToCheck.some((option) => series.hasOptionChanged(option)));\n newType = newType || initialType;\n if (keepPoints) {\n preserve.push('data', 'isDirtyData', \n // GeoHeatMap interpolation\n 'isDirtyCanvas', 'points', 'dataTable', 'processedData', // #17057\n 'xIncrement', 'cropped', '_hasPointMarkers', 'hasDataLabels', \n // Networkgraph (#14397)\n 'nodes', 'layout', \n // Treemap\n 'level', \n // Map specific, consider moving it to series-specific preserve-\n // properties (#10617)\n 'mapMap', 'mapData', 'minY', 'maxY', 'minX', 'maxX', 'transformGroups' // #18857\n );\n if (options.visible !== false) {\n preserve.push('area', 'graph');\n }\n series.parallelArrays.forEach(function (key) {\n preserve.push(key + 'Data');\n });\n if (options.data) {\n // `setData` uses `dataSorting` options so we need to update\n // them earlier\n if (options.dataSorting) {\n Series_extend(series.options.dataSorting, options.dataSorting);\n }\n this.setData(options.data, false);\n }\n }\n else {\n this.dataTable.modified = this.dataTable;\n }\n // Do the merge, with some forced options\n options = Series_merge(oldOptions, {\n // When oldOptions.index is null it should't be cleared.\n // Otherwise navigator series will have wrong indexes (#10193).\n index: oldOptions.index === void 0 ?\n series.index : oldOptions.index,\n pointStart: \n // When updating from blank (#7933)\n plotOptions?.series?.pointStart ??\n oldOptions.pointStart ??\n // When updating after addPoint\n series.getColumn('x')[0]\n }, !keepPoints && { data: series.options.data }, options, animation);\n // Merge does not merge arrays, but replaces them. Since points were\n // updated, `series.options.data` has correct merged options, use it:\n if (keepPoints && options.data) {\n options.data = series.options.data;\n }\n // Make sure preserved properties are not destroyed (#3094)\n preserve = groups.concat(preserve);\n preserve.forEach(function (prop) {\n preserve[prop] = series[prop];\n delete series[prop];\n });\n let casting = false;\n if (seriesTypes[newType]) {\n casting = newType !== series.type;\n // Destroy the series and delete all properties, it will be\n // reinserted within the `init` call below\n series.remove(false, false, false, true);\n if (casting) {\n // #20264: Re-detect a certain chart properties from new series\n chart.propFromSeries();\n // Modern browsers including IE11\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(series, seriesTypes[newType].prototype);\n // Legacy (IE < 11)\n }\n else {\n const ownEvents = Object.hasOwnProperty.call(series, 'hcEvents') && series.hcEvents;\n for (n in initialSeriesProto) { // eslint-disable-line guard-for-in\n series[n] = void 0;\n }\n // Reinsert all methods and properties from the new type\n // prototype (#2270, #3719).\n Series_extend(series, seriesTypes[newType].prototype);\n // The events are tied to the prototype chain, don't copy if\n // they're not the series' own\n if (ownEvents) {\n series.hcEvents = ownEvents;\n }\n else {\n delete series.hcEvents;\n }\n }\n }\n }\n else {\n Series_error(17, true, chart, { missingModuleFor: newType });\n }\n // Re-register groups (#3094) and other preserved properties\n preserve.forEach(function (prop) {\n series[prop] = preserve[prop];\n });\n series.init(chart, options);\n // Remove particular elements of the points. Check `series.options`\n // because we need to consider the options being set on plotOptions as\n // well.\n if (keepPoints && this.points) {\n seriesOptions = series.options;\n // What kind of elements to destroy\n if (seriesOptions.visible === false) {\n kinds.graphic = 1;\n kinds.dataLabel = 1;\n }\n else {\n // If the marker got disabled or changed its symbol, width or\n // height - destroy\n if (this.hasMarkerChanged(seriesOptions, oldOptions)) {\n kinds.graphic = 1;\n }\n if (!series.hasDataLabels?.()) {\n kinds.dataLabel = 1;\n }\n }\n for (const point of this.points) {\n if (point && point.series) {\n point.resolveColor();\n // Destroy elements in order to recreate based on updated\n // series options.\n if (Object.keys(kinds).length) {\n point.destroyElements(kinds);\n }\n if (seriesOptions.showInLegend === false &&\n point.legendItem) {\n chart.legend.destroyItem(point);\n }\n }\n }\n }\n series.initialType = initialType;\n chart.linkSeries(); // Links are lost in series.remove (#3028)\n // Set data for series with sorting enabled if it isn't set yet (#19715)\n chart.setSortedData();\n // #15383: Fire updatedData if the type has changed to keep linked\n // series such as indicators updated\n if (casting && series.linkedSeries.length) {\n series.isDirtyData = true;\n }\n Series_fireEvent(this, 'afterUpdate');\n if (Series_pick(redraw, true)) {\n chart.redraw(keepPoints ? void 0 : false);\n }\n }\n /**\n * Used from within series.update\n * @private\n */\n setName(name) {\n this.name = this.options.name = this.userOptions.name = name;\n this.chart.isDirtyLegend = true;\n }\n /**\n * Check if the option has changed.\n * @private\n */\n hasOptionChanged(optionName) {\n const chart = this.chart, option = this.options[optionName], plotOptions = chart.options.plotOptions, oldOption = this.userOptions[optionName], plotOptionsOption = Series_pick(plotOptions?.[this.type]?.[optionName], plotOptions?.series?.[optionName]);\n // Check if `plotOptions` are defined already, #19203\n if (oldOption && !Series_defined(plotOptionsOption)) {\n return option !== oldOption;\n }\n return option !== Series_pick(plotOptionsOption, option);\n }\n /**\n * Runs on mouse over the series graphical items.\n *\n * @function Highcharts.Series#onMouseOver\n * @emits Highcharts.Series#event:mouseOver\n */\n onMouseOver() {\n const series = this, chart = series.chart, hoverSeries = chart.hoverSeries, pointer = chart.pointer;\n pointer?.setHoverChartIndex();\n // Set normal state to previous series\n if (hoverSeries && hoverSeries !== series) {\n hoverSeries.onMouseOut();\n }\n // Trigger the event, but to save processing time,\n // only if defined\n if (series.options.events.mouseOver) {\n Series_fireEvent(series, 'mouseOver');\n }\n // Hover this\n series.setState('hover');\n /**\n * Contains the original hovered series.\n *\n * @name Highcharts.Chart#hoverSeries\n * @type {Highcharts.Series|null}\n */\n chart.hoverSeries = series;\n }\n /**\n * Runs on mouse out of the series graphical items.\n *\n * @function Highcharts.Series#onMouseOut\n *\n * @emits Highcharts.Series#event:mouseOut\n */\n onMouseOut() {\n // Trigger the event only if listeners exist\n const series = this, options = series.options, chart = series.chart, tooltip = chart.tooltip, hoverPoint = chart.hoverPoint;\n // #182, set to null before the mouseOut event fires\n chart.hoverSeries = null;\n // Trigger mouse out on the point, which must be in this series\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n // Fire the mouse out event\n if (series && options.events.mouseOut) {\n Series_fireEvent(series, 'mouseOut');\n }\n // Hide the tooltip\n if (tooltip &&\n !series.stickyTracking &&\n (!tooltip.shared || series.noSharedTooltip)) {\n tooltip.hide();\n }\n // Reset all inactive states\n chart.series.forEach(function (s) {\n s.setState('', true);\n });\n }\n /**\n * Set the state of the series. Called internally on mouse interaction\n * operations, but it can also be called directly to visually\n * highlight a series.\n *\n * @function Highcharts.Series#setState\n *\n * @param {Highcharts.SeriesStateValue|\"\"} [state]\n * The new state, can be either `'hover'`, `'inactive'`, `'select'`,\n * or `''` (an empty string), `'normal'` or `undefined` to set to\n * normal state.\n * @param {boolean} [inherit]\n * Determines if state should be inherited by points too.\n */\n setState(state, inherit) {\n const series = this, options = series.options, graph = series.graph, inactiveOtherPoints = options.inactiveOtherPoints, stateOptions = options.states, \n // By default a quick animation to hover/inactive,\n // slower to un-hover\n stateAnimation = Series_pick((stateOptions[state || 'normal'] &&\n stateOptions[state || 'normal'].animation), series.chart.options.chart.animation);\n let lineWidth = options.lineWidth, opacity = options.opacity;\n state = state || '';\n if (series.state !== state) {\n // Toggle class names\n [\n series.group,\n series.markerGroup,\n series.dataLabelsGroup\n ].forEach(function (group) {\n if (group) {\n // Old state\n if (series.state) {\n group.removeClass('highcharts-series-' + series.state);\n }\n // New state\n if (state) {\n group.addClass('highcharts-series-' + state);\n }\n }\n });\n series.state = state;\n if (!series.chart.styledMode) {\n if (stateOptions[state] &&\n stateOptions[state].enabled === false) {\n return;\n }\n if (state) {\n lineWidth = (stateOptions[state].lineWidth ||\n lineWidth + (stateOptions[state].lineWidthPlus || 0)); // #4035\n opacity = Series_pick(stateOptions[state].opacity, opacity);\n }\n if (graph && !graph.dashstyle && Series_isNumber(lineWidth)) {\n // Animate the graph stroke-width\n for (const graphElement of [\n graph,\n ...this.zones.map((zone) => zone.graph)\n ]) {\n graphElement?.animate({\n 'stroke-width': lineWidth\n }, stateAnimation);\n }\n }\n // For some types (pie, networkgraph, sankey) opacity is\n // resolved on a point level\n if (!inactiveOtherPoints) {\n [\n series.group,\n series.markerGroup,\n series.dataLabelsGroup,\n series.labelBySeries\n ].forEach(function (group) {\n if (group) {\n group.animate({\n opacity: opacity\n }, stateAnimation);\n }\n });\n }\n }\n }\n // Don't loop over points on a series that doesn't apply inactive state\n // to siblings markers (e.g. line, column)\n if (inherit && inactiveOtherPoints && series.points) {\n series.setAllPointsToState(state || void 0);\n }\n }\n /**\n * Set the state for all points in the series.\n *\n * @function Highcharts.Series#setAllPointsToState\n *\n * @private\n *\n * @param {string} [state]\n * Can be either `hover` or undefined to set to normal state.\n */\n setAllPointsToState(state) {\n this.points.forEach(function (point) {\n if (point.setState) {\n point.setState(state);\n }\n });\n }\n /**\n * Show or hide the series.\n *\n * @function Highcharts.Series#setVisible\n *\n * @param {boolean} [visible]\n * True to show the series, false to hide. If undefined, the visibility is\n * toggled.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing more\n * operations on the chart, it is a good idea to set redraw to false and\n * call {@link Chart#redraw|chart.redraw()} after.\n *\n * @emits Highcharts.Series#event:hide\n * @emits Highcharts.Series#event:show\n */\n setVisible(vis, redraw) {\n const series = this, chart = series.chart, ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries, oldVisibility = series.visible;\n // If called without an argument, toggle visibility\n series.visible =\n vis =\n series.options.visible =\n series.userOptions.visible =\n typeof vis === 'undefined' ? !oldVisibility : vis; // #5618\n const showOrHide = vis ? 'show' : 'hide';\n // Show or hide elements\n [\n 'group',\n 'dataLabelsGroup',\n 'markerGroup',\n 'tracker',\n 'tt'\n ].forEach((key) => {\n series[key]?.[showOrHide]();\n });\n // Hide tooltip (#1361)\n if (chart.hoverSeries === series ||\n chart.hoverPoint?.series === series) {\n series.onMouseOut();\n }\n if (series.legendItem) {\n chart.legend.colorizeItem(series, vis);\n }\n // Rescale or adapt to resized chart\n series.isDirty = true;\n // In a stack, all other series are affected\n if (series.options.stacking) {\n chart.series.forEach((otherSeries) => {\n if (otherSeries.options.stacking && otherSeries.visible) {\n otherSeries.isDirty = true;\n }\n });\n }\n // Show or hide linked series\n series.linkedSeries.forEach((otherSeries) => {\n otherSeries.setVisible(vis, false);\n });\n if (ignoreHiddenSeries) {\n chart.isDirtyBox = true;\n }\n Series_fireEvent(series, showOrHide);\n if (redraw !== false) {\n chart.redraw();\n }\n }\n /**\n * Show the series if hidden.\n *\n * @sample highcharts/members/series-hide/\n * Toggle visibility from a button\n *\n * @function Highcharts.Series#show\n * @emits Highcharts.Series#event:show\n */\n show() {\n this.setVisible(true);\n }\n /**\n * Hide the series if visible. If the\n * [chart.ignoreHiddenSeries](https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries)\n * option is true, the chart is redrawn without this series.\n *\n * @sample highcharts/members/series-hide/\n * Toggle visibility from a button\n *\n * @function Highcharts.Series#hide\n * @emits Highcharts.Series#event:hide\n */\n hide() {\n this.setVisible(false);\n }\n /**\n * Select or unselect the series. This means its\n * {@link Highcharts.Series.selected|selected}\n * property is set, the checkbox in the legend is toggled and when selected,\n * the series is returned by the {@link Highcharts.Chart#getSelectedSeries}\n * function.\n *\n * @sample highcharts/members/series-select/\n * Select a series from a button\n *\n * @function Highcharts.Series#select\n *\n * @param {boolean} [selected]\n * True to select the series, false to unselect. If undefined, the selection\n * state is toggled.\n *\n * @emits Highcharts.Series#event:select\n * @emits Highcharts.Series#event:unselect\n */\n select(selected) {\n const series = this;\n series.selected =\n selected =\n this.options.selected = (typeof selected === 'undefined' ?\n !series.selected :\n selected);\n if (series.checkbox) {\n series.checkbox.checked = selected;\n }\n Series_fireEvent(series, selected ? 'select' : 'unselect');\n }\n /**\n * Checks if a tooltip should be shown for a given point.\n *\n * @private\n */\n shouldShowTooltip(plotX, plotY, options = {}) {\n options.series = this;\n options.visiblePlotOnly = true;\n return this.chart.isInsidePlot(plotX, plotY, options);\n }\n /**\n * Draws the legend symbol based on the legendSymbol user option.\n *\n * @private\n */\n drawLegendSymbol(legend, item) {\n Legend_LegendSymbol[this.options.legendSymbol || 'rectangle']\n ?.call(this, legend, item);\n }\n}\nSeries.defaultOptions = SeriesDefaults;\n/**\n * Registry of all available series types.\n *\n * @name Highcharts.Series.types\n * @type {Highcharts.Dictionary}\n */\nSeries.types = Series_SeriesRegistry.seriesTypes;\n/* *\n *\n * Static Functions\n *\n * */\n/**\n * Registers a series class to be accessible via `Series.types`.\n *\n * @function Highcharts.Series.registerType\n *\n * @param {string} seriesType\n * The series type as an identifier string in lower case.\n *\n * @param {Function} SeriesClass\n * The series class as a class pattern or a constructor function with\n * prototype.\n */\nSeries.registerType = Series_SeriesRegistry.registerSeriesType;\nSeries_extend(Series.prototype, {\n axisTypes: ['xAxis', 'yAxis'],\n coll: 'series',\n colorCounter: 0,\n directTouch: false,\n invertible: true,\n isCartesian: true,\n kdAxisArray: ['clientX', 'plotY'],\n // Each point's x and y values are stored in this.xData and this.yData:\n parallelArrays: ['x', 'y'],\n pointClass: Series_Point,\n requireSorting: true,\n // Requires the data to be sorted:\n sorted: true\n});\n/* *\n *\n * Registry\n *\n * */\nSeries_SeriesRegistry.series = Series;\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_Series = (Series);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * This is a placeholder type of the possible series options for\n * [Highcharts](../highcharts/series), [Highcharts Stock](../highstock/series),\n * [Highmaps](../highmaps/series), and [Gantt](../gantt/series).\n *\n * In TypeScript is this dynamically generated to reference all possible types\n * of series options.\n *\n * @ignore-declaration\n * @typedef {Highcharts.SeriesOptions|Highcharts.Dictionary<*>} Highcharts.SeriesOptionsType\n */\n/**\n * Options for `dataSorting`.\n *\n * @interface Highcharts.DataSortingOptionsObject\n * @since 8.0.0\n */ /**\n* Enable or disable data sorting for the series.\n* @name Highcharts.DataSortingOptionsObject#enabled\n* @type {boolean|undefined}\n*/ /**\n* Whether to allow matching points by name in an update.\n* @name Highcharts.DataSortingOptionsObject#matchByName\n* @type {boolean|undefined}\n*/ /**\n* Determines what data value should be used to sort by.\n* @name Highcharts.DataSortingOptionsObject#sortKey\n* @type {string|undefined}\n*/\n/**\n * Function callback when a series has been animated.\n *\n * @callback Highcharts.SeriesAfterAnimateCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesAfterAnimateEventObject} event\n * Event arguments.\n */\n/**\n * Event information regarding completed animation of a series.\n *\n * @interface Highcharts.SeriesAfterAnimateEventObject\n */ /**\n* Animated series.\n* @name Highcharts.SeriesAfterAnimateEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesAfterAnimateEventObject#type\n* @type {\"afterAnimate\"}\n*/\n/**\n * Function callback when the checkbox next to the series' name in the legend is\n * clicked.\n *\n * @callback Highcharts.SeriesCheckboxClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesCheckboxClickEventObject} event\n * Event arguments.\n */\n/**\n * Event information regarding check of a series box.\n *\n * @interface Highcharts.SeriesCheckboxClickEventObject\n */ /**\n* Whether the box has been checked.\n* @name Highcharts.SeriesCheckboxClickEventObject#checked\n* @type {boolean}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#item\n* @type {Highcharts.Series}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesCheckboxClickEventObject#type\n* @type {\"checkboxClick\"}\n*/\n/**\n * Function callback when a series is clicked. Return false to cancel toogle\n * actions.\n *\n * @callback Highcharts.SeriesClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesClickEventObject} event\n * Event arguments.\n */\n/**\n * Common information for a click event on a series.\n *\n * @interface Highcharts.SeriesClickEventObject\n * @extends global.Event\n */ /**\n* Nearest point on the graph.\n* @name Highcharts.SeriesClickEventObject#point\n* @type {Highcharts.Point}\n*/\n/**\n * Gets fired when the series is hidden after chart generation time, either by\n * clicking the legend item or by calling `.hide()`.\n *\n * @callback Highcharts.SeriesHideCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin` of a line\n * graph.\n *\n * @typedef {\"butt\"|\"round\"|\"square\"|string} Highcharts.SeriesLinecapValue\n */\n/**\n * Gets fired when the legend item belonging to the series is clicked. The\n * default action is to toggle the visibility of the series. This can be\n * prevented by returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickCallbackFunction.\n *\n * @deprecated 11.4.4\n * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesLegendItemClickEventObject} event\n * The event that occurred.\n */\n/**\n * Information about the event.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickEventObject.\n *\n * @deprecated 11.4.4\n * @interface Highcharts.SeriesLegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n* @type {global.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the series.\n* @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesCheckboxClickEventObject#type\n* @type {\"checkboxClick\"}\n*/\n/**\n * Gets fired when the mouse leaves the graph.\n *\n * @callback Highcharts.SeriesMouseOutCallbackFunction\n *\n * @param {Highcharts.Series} this\n * Series where the event occurred.\n *\n * @param {global.PointerEvent} event\n * Event that occurred.\n */\n/**\n * Gets fired when the mouse enters the graph.\n *\n * @callback Highcharts.SeriesMouseOverCallbackFunction\n *\n * @param {Highcharts.Series} this\n * Series where the event occurred.\n *\n * @param {global.PointerEvent} event\n * Event that occurred.\n */\n/**\n * Translation and scale for the plot area of a series.\n *\n * @interface Highcharts.SeriesPlotBoxObject\n */ /**\n* @name Highcharts.SeriesPlotBoxObject#scaleX\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#scaleY\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#translateX\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#translateY\n* @type {number}\n*/\n/**\n * Gets fired when the series is shown after chart generation time, either by\n * clicking the legend item or by calling `.show()`.\n *\n * @callback Highcharts.SeriesShowCallbackFunction\n *\n * @param {Highcharts.Series} this\n * Series where the event occurred.\n *\n * @param {global.Event} event\n * Event that occurred.\n */\n/**\n * Possible key values for the series state options.\n *\n * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.SeriesStateValue\n */\n''; // Detach doclets above\n/* *\n *\n * API Options\n *\n * */\n/**\n * Series options for specific data and the data itself. In TypeScript you\n * have to cast the series options to specific series types, to get all\n * possible options for a series.\n *\n * @example\n * // TypeScript example\n * Highcharts.chart('container', {\n * series: [{\n * color: '#06C',\n * data: [[0, 1], [2, 3]]\n * } as Highcharts.SeriesLineOptions ]\n * });\n *\n * @type {Array<*>}\n * @apioption series\n */\n/**\n * An id for the series. This can be used after render time to get a pointer\n * to the series object through `chart.get()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-id/\n * Get series by id\n *\n * @type {string}\n * @since 1.2.0\n * @apioption series.id\n */\n/**\n * The index of the series in the chart, affecting the internal index in the\n * `chart.series` array, the visible Z index as well as the order in the\n * legend.\n *\n * @type {number}\n * @since 2.3.0\n * @apioption series.index\n */\n/**\n * The sequential index of the series in the legend.\n *\n * @see [legend.reversed](#legend.reversed),\n * [yAxis.reversedStacks](#yAxis.reversedStacks)\n *\n * @sample {highcharts|highstock} highcharts/series/legendindex/\n * Legend in opposite order\n *\n * @type {number}\n * @apioption series.legendIndex\n */\n/**\n * The name of the series as shown in the legend, tooltip etc.\n *\n * @sample {highcharts} highcharts/series/name/\n * Series name\n * @sample {highmaps} maps/demo/category-map/\n * Series name\n *\n * @type {string}\n * @apioption series.name\n */\n/**\n * This option allows grouping series in a stacked chart. The stack option\n * can be a string or anything else, as long as the grouped series' stack\n * options match each other after conversion into a string.\n *\n * @sample {highcharts} highcharts/series/stack/\n * Stacked and grouped columns\n * @sample {highcharts} highcharts/series/stack-centerincategory/\n * Stacked and grouped, centered in category\n *\n * @type {number|string}\n * @since 2.1\n * @product highcharts highstock\n * @apioption series.stack\n */\n/**\n * The type of series, for example `line` or `column`. By default, the\n * series type is inherited from [chart.type](#chart.type), so unless the\n * chart is a combination of series types, there is no need to set it on the\n * series level.\n *\n * @sample {highcharts} highcharts/series/type/\n * Line and column in the same chart\n * @sample highcharts/series/type-dynamic/\n * Dynamic types with button selector\n * @sample {highmaps} maps/demo/mapline-mappoint/\n * Multiple types in the same map\n *\n * @type {string}\n * @apioption series.type\n */\n/**\n * When using dual or multiple x axes, this number defines which xAxis the\n * particular series is connected to. It refers to either the\n * {@link #xAxis.id|axis id}\n * or the index of the axis in the xAxis array, with 0 being the first.\n *\n * @type {number|string}\n * @default 0\n * @product highcharts highstock\n * @apioption series.xAxis\n */\n/**\n * When using dual or multiple y axes, this number defines which yAxis the\n * particular series is connected to. It refers to either the\n * {@link #yAxis.id|axis id}\n * or the index of the axis in the yAxis array, with 0 being the first.\n *\n * @sample {highcharts} highcharts/series/yaxis/\n * Apply the column series to the secondary Y axis\n *\n * @type {number|string}\n * @default 0\n * @product highcharts highstock\n * @apioption series.yAxis\n */\n/**\n * Define the visual z index of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-zindex-default/\n * With no z index, the series defined last are on top\n * @sample {highcharts} highcharts/plotoptions/series-zindex/\n * With a z index, the series with the highest z index is on top\n * @sample {highstock} highcharts/plotoptions/series-zindex-default/\n * With no z index, the series defined last are on top\n * @sample {highstock} highcharts/plotoptions/series-zindex/\n * With a z index, the series with the highest z index is on top\n *\n * @type {number}\n * @product highcharts highstock\n * @apioption series.zIndex\n */\n''; // Include precedent doclets in transpiled\n\n;// ./code/es-modules/Core/Legend/Legend.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject: Legend_animObject, setAnimation: Legend_setAnimation } = AnimationUtilities;\n\nconst { registerEventOptions: Legend_registerEventOptions } = Core_Foundation;\n\nconst { composed: Legend_composed, marginNames } = Core_Globals;\n\n\n\nconst { distribute: Legend_distribute } = Renderer_RendererUtilities;\n\nconst { format: Legend_format } = Core_Templating;\n\nconst { addEvent: Legend_addEvent, createElement: Legend_createElement, css: Legend_css, defined: Legend_defined, discardElement: Legend_discardElement, find: Legend_find, fireEvent: Legend_fireEvent, isNumber: Legend_isNumber, merge: Legend_merge, pick: Legend_pick, pushUnique: Legend_pushUnique, relativeLength: Legend_relativeLength, stableSort: Legend_stableSort, syncTimeout: Legend_syncTimeout } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The overview of the chart's series. The legend object is instantiated\n * internally in the chart constructor, and is available from the `chart.legend`\n * property. Each chart has only one legend.\n *\n * @class\n * @name Highcharts.Legend\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.LegendOptions} options\n * Legend options.\n */\nclass Legend {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Initialize the legend.\n *\n * @private\n * @function Highcharts.Legend#init\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.LegendOptions} options\n * Legend options.\n */\n constructor(chart, options) {\n /* *\n *\n * Properties\n *\n * */\n this.allItems = [];\n this.initialItemY = 0;\n this.itemHeight = 0;\n this.itemMarginBottom = 0;\n this.itemMarginTop = 0;\n this.itemX = 0;\n this.itemY = 0;\n this.lastItemY = 0;\n this.lastLineHeight = 0;\n this.legendHeight = 0;\n this.legendWidth = 0;\n this.maxItemWidth = 0;\n this.maxLegendWidth = 0;\n this.offsetWidth = 0;\n this.padding = 0;\n this.pages = [];\n this.symbolHeight = 0;\n this.symbolWidth = 0;\n this.titleHeight = 0;\n this.totalItemWidth = 0;\n this.widthOption = 0;\n /**\n * Chart of this legend.\n *\n * @readonly\n * @name Highcharts.Legend#chart\n * @type {Highcharts.Chart}\n */\n this.chart = chart;\n this.setOptions(options);\n if (options.enabled) {\n // Render it\n this.render();\n Legend_registerEventOptions(this, options);\n // Move checkboxes\n Legend_addEvent(this.chart, 'endResize', function () {\n this.legend.positionCheckboxes();\n });\n }\n // On Legend.init and Legend.update, make sure that proximate layout\n // events are either added or removed (#18362).\n Legend_addEvent(this.chart, 'render', () => {\n if (this.options.enabled && this.proximate) {\n this.proximatePositions();\n this.positionItems();\n }\n });\n }\n /**\n * @private\n * @function Highcharts.Legend#setOptions\n * @param {Highcharts.LegendOptions} options\n */\n setOptions(options) {\n const padding = Legend_pick(options.padding, 8);\n /**\n * Legend options.\n *\n * @readonly\n * @name Highcharts.Legend#options\n * @type {Highcharts.LegendOptions}\n */\n this.options = options;\n if (!this.chart.styledMode) {\n this.itemStyle = options.itemStyle;\n this.itemHiddenStyle = Legend_merge(this.itemStyle, options.itemHiddenStyle);\n }\n this.itemMarginTop = options.itemMarginTop;\n this.itemMarginBottom = options.itemMarginBottom;\n this.padding = padding;\n this.initialItemY = padding - 5; // 5 is pixels above the text\n this.symbolWidth = Legend_pick(options.symbolWidth, 16);\n this.pages = [];\n this.proximate = options.layout === 'proximate' && !this.chart.inverted;\n // #12705: baseline has to be reset on every update\n this.baseline = void 0;\n }\n /**\n * Update the legend with new options. Equivalent to running `chart.update`\n * with a legend configuration option.\n *\n * @sample highcharts/legend/legend-update/\n * Legend update\n *\n * @function Highcharts.Legend#update\n *\n * @param {Highcharts.LegendOptions} options\n * Legend options.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the axis is altered. If doing more\n * operations on the chart, it is a good idea to set redraw to false and\n * call {@link Chart#redraw} after. Whether to redraw the chart.\n *\n * @emits Highcharts.Legends#event:afterUpdate\n */\n update(options, redraw) {\n const chart = this.chart;\n this.setOptions(Legend_merge(true, this.options, options));\n if ('events' in this.options) {\n // Legend event handlers\n Legend_registerEventOptions(this, this.options);\n }\n this.destroy();\n chart.isDirtyLegend = chart.isDirtyBox = true;\n if (Legend_pick(redraw, true)) {\n chart.redraw();\n }\n Legend_fireEvent(this, 'afterUpdate', { redraw });\n }\n /**\n * Set the colors for the legend item.\n *\n * @private\n * @function Highcharts.Legend#colorizeItem\n * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n * A Series or Point instance\n * @param {boolean} [visible=false]\n * Dimmed or colored\n *\n * @todo\n * Make events official: Fires the event `afterColorizeItem`.\n */\n colorizeItem(item, visible) {\n const originalColor = item.color, { area, group, label, line, symbol } = item.legendItem || {};\n if (item instanceof Series_Series || item instanceof Series_Point) {\n item.color = item.options?.legendSymbolColor || originalColor;\n }\n group?.[visible ? 'removeClass' : 'addClass']('highcharts-legend-item-hidden');\n if (!this.chart.styledMode) {\n const { itemHiddenStyle = {} } = this, hiddenColor = itemHiddenStyle.color, { fillColor, fillOpacity, lineColor, marker } = item.options, colorizeHidden = (attr) => {\n if (!visible) {\n if (attr.fill) {\n attr.fill = hiddenColor;\n }\n if (attr.stroke) {\n attr.stroke = hiddenColor;\n }\n }\n return attr;\n };\n label?.css(Legend_merge(visible ? this.itemStyle : itemHiddenStyle));\n line?.attr(colorizeHidden({ stroke: lineColor || item.color }));\n if (symbol) {\n // Apply marker options\n symbol.attr(colorizeHidden(marker && symbol.isMarker ? // #585\n item.pointAttribs() :\n { fill: item.color }));\n }\n area?.attr(colorizeHidden({\n fill: fillColor || item.color,\n 'fill-opacity': fillColor ? 1 : (fillOpacity ?? 0.75)\n }));\n }\n item.color = originalColor;\n Legend_fireEvent(this, 'afterColorizeItem', { item, visible });\n }\n /**\n * @private\n * @function Highcharts.Legend#positionItems\n */\n positionItems() {\n // Now that the legend width and height are established, put the items\n // in the final position\n this.allItems.forEach(this.positionItem, this);\n if (!this.chart.isResizing) {\n this.positionCheckboxes();\n }\n }\n /**\n * Position the legend item.\n *\n * @private\n * @function Highcharts.Legend#positionItem\n * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n * The item to position\n */\n positionItem(item) {\n const legend = this, { group, x = 0, y = 0 } = item.legendItem || {}, options = legend.options, symbolPadding = options.symbolPadding, ltr = !options.rtl, checkbox = item.checkbox;\n if (group && group.element) {\n const attribs = {\n translateX: ltr ?\n x :\n legend.legendWidth - x - 2 * symbolPadding - 4,\n translateY: y\n };\n const complete = () => {\n Legend_fireEvent(this, 'afterPositionItem', { item });\n };\n group[Legend_defined(group.translateY) ? 'animate' : 'attr'](attribs, void 0, complete);\n }\n if (checkbox) {\n checkbox.x = x;\n checkbox.y = y;\n }\n }\n /**\n * Destroy a single legend item, used internally on removing series items.\n *\n * @private\n * @function Highcharts.Legend#destroyItem\n * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n * The item to remove\n */\n destroyItem(item) {\n const checkbox = item.checkbox, legendItem = item.legendItem || {};\n // Destroy SVG elements\n for (const key of ['group', 'label', 'line', 'symbol']) {\n if (legendItem[key]) {\n legendItem[key] = legendItem[key].destroy();\n }\n }\n if (checkbox) {\n Legend_discardElement(checkbox);\n }\n item.legendItem = void 0;\n }\n /**\n * Destroy the legend. Used internally. To reflow objects, `chart.redraw`\n * must be called after destruction.\n *\n * @private\n * @function Highcharts.Legend#destroy\n */\n destroy() {\n const legend = this;\n // Destroy items\n for (const item of this.getAllItems()) {\n this.destroyItem(item);\n }\n // Destroy legend elements\n for (const key of [\n 'clipRect',\n 'up',\n 'down',\n 'pager',\n 'nav',\n 'box',\n 'title',\n 'group'\n ]) {\n if (legend[key]) {\n legend[key] = legend[key].destroy();\n }\n }\n this.display = null; // Reset in .render on update.\n }\n /**\n * Position the checkboxes after the width is determined.\n *\n * @private\n * @function Highcharts.Legend#positionCheckboxes\n */\n positionCheckboxes() {\n const alignAttr = this.group && this.group.alignAttr, clipHeight = this.clipHeight || this.legendHeight, titleHeight = this.titleHeight;\n let translateY;\n if (alignAttr) {\n translateY = alignAttr.translateY;\n this.allItems.forEach(function (item) {\n const checkbox = item.checkbox;\n let top;\n if (checkbox) {\n top = translateY + titleHeight + checkbox.y +\n (this.scrollOffset || 0) + 3;\n Legend_css(checkbox, {\n left: (alignAttr.translateX + item.checkboxOffset +\n checkbox.x - 20) + 'px',\n top: top + 'px',\n display: this.proximate || (top > translateY - 6 &&\n top < translateY + clipHeight - 6) ?\n '' :\n 'none'\n });\n }\n }, this);\n }\n }\n /**\n * Render the legend title on top of the legend.\n *\n * @private\n * @function Highcharts.Legend#renderTitle\n */\n renderTitle() {\n const options = this.options, padding = this.padding, titleOptions = options.title;\n let bBox, titleHeight = 0;\n if (titleOptions.text) {\n if (!this.title) {\n /**\n * SVG element of the legend title.\n *\n * @readonly\n * @name Highcharts.Legend#title\n * @type {Highcharts.SVGElement}\n */\n this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, void 0, void 0, void 0, options.useHTML, void 0, 'legend-title')\n .attr({ zIndex: 1 });\n if (!this.chart.styledMode) {\n this.title.css(titleOptions.style);\n }\n this.title.add(this.group);\n }\n // Set the max title width (#7253)\n if (!titleOptions.width) {\n this.title.css({\n width: this.maxLegendWidth + 'px'\n });\n }\n bBox = this.title.getBBox();\n titleHeight = bBox.height;\n this.offsetWidth = bBox.width; // #1717\n this.contentGroup.attr({ translateY: titleHeight });\n }\n this.titleHeight = titleHeight;\n }\n /**\n * Set the legend item text.\n *\n * @function Highcharts.Legend#setText\n * @param {Highcharts.Point|Highcharts.Series} item\n * The item for which to update the text in the legend.\n */\n setText(item) {\n const options = this.options;\n item.legendItem.label.attr({\n text: options.labelFormat ?\n Legend_format(options.labelFormat, item, this.chart) :\n options.labelFormatter.call(item)\n });\n }\n /**\n * Render a single specific legend item. Called internally from the `render`\n * function.\n *\n * @private\n * @function Highcharts.Legend#renderItem\n * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n * The item to render.\n */\n renderItem(item) {\n const legend = this, legendItem = item.legendItem = item.legendItem || {}, chart = legend.chart, renderer = chart.renderer, options = legend.options, horizontal = options.layout === 'horizontal', symbolWidth = legend.symbolWidth, symbolPadding = options.symbolPadding || 0, itemStyle = legend.itemStyle, itemHiddenStyle = legend.itemHiddenStyle, itemDistance = horizontal ? Legend_pick(options.itemDistance, 20) : 0, ltr = !options.rtl, isSeries = !item.series, series = !isSeries && item.series.drawLegendSymbol ?\n item.series :\n item, seriesOptions = series.options, showCheckbox = (!!legend.createCheckboxForItem &&\n seriesOptions &&\n seriesOptions.showCheckbox), useHTML = options.useHTML, itemClassName = item.options.className;\n let label = legendItem.label, \n // Full width minus text width\n itemExtraWidth = symbolWidth + symbolPadding +\n itemDistance + (showCheckbox ? 20 : 0);\n if (!label) { // Generate it once, later move it\n // Generate the group box, a group to hold the symbol and text. Text\n // is to be appended in Legend class.\n legendItem.group = renderer\n .g('legend-item')\n .addClass('highcharts-' + series.type + '-series ' +\n 'highcharts-color-' + item.colorIndex +\n (itemClassName ? ' ' + itemClassName : '') +\n (isSeries ?\n ' highcharts-series-' + item.index :\n ''))\n .attr({ zIndex: 1 })\n .add(legend.scrollGroup);\n // Generate the list item text and add it to the group\n legendItem.label = label = renderer.text('', ltr ?\n symbolWidth + symbolPadding :\n -symbolPadding, legend.baseline || 0, useHTML);\n if (!chart.styledMode) {\n // Merge to prevent modifying original (#1021)\n label.css(Legend_merge(item.visible ?\n itemStyle :\n itemHiddenStyle));\n }\n label\n .attr({\n align: ltr ? 'left' : 'right',\n zIndex: 2\n })\n .add(legendItem.group);\n // Get the baseline for the first item - the font size is equal for\n // all\n if (!legend.baseline) {\n legend.fontMetrics = renderer.fontMetrics(label);\n legend.baseline =\n legend.fontMetrics.f + 3 + legend.itemMarginTop;\n label.attr('y', legend.baseline);\n legend.symbolHeight =\n Legend_pick(options.symbolHeight, legend.fontMetrics.f);\n if (options.squareSymbol) {\n legend.symbolWidth = Legend_pick(options.symbolWidth, Math.max(legend.symbolHeight, 16));\n itemExtraWidth = legend.symbolWidth + symbolPadding +\n itemDistance + (showCheckbox ? 20 : 0);\n if (ltr) {\n label.attr('x', legend.symbolWidth + symbolPadding);\n }\n }\n }\n // Draw the legend symbol inside the group box\n series.drawLegendSymbol(legend, item);\n if (legend.setItemEvents) {\n legend.setItemEvents(item, label, useHTML);\n }\n }\n // Add the HTML checkbox on top\n if (showCheckbox && !item.checkbox && legend.createCheckboxForItem) {\n legend.createCheckboxForItem(item);\n }\n // Colorize the items\n legend.colorizeItem(item, item.visible);\n // Take care of max width and text overflow (#6659)\n if (chart.styledMode || !itemStyle.width) {\n label.css({\n width: ((options.itemWidth ||\n legend.widthOption ||\n chart.spacingBox.width) - itemExtraWidth) + 'px'\n });\n }\n // Always update the text\n legend.setText(item);\n // Calculate the positions for the next line\n const bBox = label.getBBox();\n const fontMetricsH = (legend.fontMetrics && legend.fontMetrics.h) || 0;\n item.itemWidth = item.checkboxOffset =\n options.itemWidth ||\n legendItem.labelWidth ||\n bBox.width + itemExtraWidth;\n legend.maxItemWidth = Math.max(legend.maxItemWidth, item.itemWidth);\n legend.totalItemWidth += item.itemWidth;\n legend.itemHeight = item.itemHeight = Math.round(legendItem.labelHeight ||\n // Use bBox for multiline (#16398)\n (bBox.height > fontMetricsH * 1.5 ? bBox.height : fontMetricsH));\n }\n /**\n * Get the position of the item in the layout. We now know the\n * maxItemWidth from the previous loop.\n *\n * @private\n * @function Highcharts.Legend#layoutItem\n * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n */\n layoutItem(item) {\n const options = this.options, padding = this.padding, horizontal = options.layout === 'horizontal', itemHeight = item.itemHeight, itemMarginBottom = this.itemMarginBottom, itemMarginTop = this.itemMarginTop, itemDistance = horizontal ? Legend_pick(options.itemDistance, 20) : 0, maxLegendWidth = this.maxLegendWidth, itemWidth = (options.alignColumns &&\n this.totalItemWidth > maxLegendWidth) ?\n this.maxItemWidth :\n item.itemWidth, legendItem = item.legendItem || {};\n // If the item exceeds the width, start a new line\n if (horizontal &&\n this.itemX - padding + itemWidth > maxLegendWidth) {\n this.itemX = padding;\n if (this.lastLineHeight) { // Not for the first line (#10167)\n this.itemY += (itemMarginTop +\n this.lastLineHeight +\n itemMarginBottom);\n }\n this.lastLineHeight = 0; // Reset for next line (#915, #3976)\n }\n // Set the edge positions\n this.lastItemY = itemMarginTop + this.itemY + itemMarginBottom;\n this.lastLineHeight = Math.max(// #915\n itemHeight, this.lastLineHeight);\n // Cache the position of the newly generated or reordered items\n legendItem.x = this.itemX;\n legendItem.y = this.itemY;\n // Advance\n if (horizontal) {\n this.itemX += itemWidth;\n }\n else {\n this.itemY +=\n itemMarginTop + itemHeight + itemMarginBottom;\n this.lastLineHeight = itemHeight;\n }\n // The width of the widest item\n this.offsetWidth = this.widthOption || Math.max((horizontal ? this.itemX - padding - (item.checkbox ?\n // Decrease by itemDistance only when no checkbox #4853\n 0 :\n itemDistance) : itemWidth) + padding, this.offsetWidth);\n }\n /**\n * Get all items, which is one item per series for most series and one\n * item per point for pie series and its derivatives. Fires the event\n * `afterGetAllItems`.\n *\n * @private\n * @function Highcharts.Legend#getAllItems\n * @return {Array<(Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series)>}\n * The current items in the legend.\n * @emits Highcharts.Legend#event:afterGetAllItems\n */\n getAllItems() {\n let allItems = [];\n this.chart.series.forEach(function (series) {\n const seriesOptions = series && series.options;\n // Handle showInLegend. If the series is linked to another series,\n // defaults to false.\n if (series && Legend_pick(seriesOptions.showInLegend, !Legend_defined(seriesOptions.linkedTo) ? void 0 : false, true)) {\n // Use points or series for the legend item depending on\n // legendType\n allItems = allItems.concat((series.legendItem || {}).labels ||\n (seriesOptions.legendType === 'point' ?\n series.data :\n series));\n }\n });\n Legend_fireEvent(this, 'afterGetAllItems', { allItems });\n return allItems;\n }\n /**\n * Get a short, three letter string reflecting the alignment and layout.\n *\n * @private\n * @function Highcharts.Legend#getAlignment\n * @return {string}\n * The alignment, empty string if floating\n */\n getAlignment() {\n const options = this.options;\n // Use the first letter of each alignment option in order to detect\n // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n if (this.proximate) {\n return options.align.charAt(0) + 'tv';\n }\n return options.floating ? '' : (options.align.charAt(0) +\n options.verticalAlign.charAt(0) +\n options.layout.charAt(0));\n }\n /**\n * Adjust the chart margins by reserving space for the legend on only one\n * side of the chart. If the position is set to a corner, top or bottom is\n * reserved for horizontal legends and left or right for vertical ones.\n *\n * @private\n * @function Highcharts.Legend#adjustMargins\n * @param {Array} margin\n * @param {Array} spacing\n */\n adjustMargins(margin, spacing) {\n const chart = this.chart, options = this.options, alignment = this.getAlignment();\n if (alignment) {\n ([\n /(lth|ct|rth)/,\n /(rtv|rm|rbv)/,\n /(rbh|cb|lbh)/,\n /(lbv|lm|ltv)/\n ]).forEach(function (alignments, side) {\n if (alignments.test(alignment) && !Legend_defined(margin[side])) {\n // Now we have detected on which side of the chart we should\n // reserve space for the legend\n chart[marginNames[side]] = Math.max(chart[marginNames[side]], (chart.legend[(side + 1) % 2 ? 'legendHeight' : 'legendWidth'] +\n [1, -1, -1, 1][side] * options[(side % 2) ? 'x' : 'y'] +\n Legend_pick(options.margin, 12) +\n spacing[side] +\n (chart.titleOffset[side] || 0)));\n }\n });\n }\n }\n /**\n * @private\n * @function Highcharts.Legend#proximatePositions\n */\n proximatePositions() {\n const chart = this.chart, boxes = [], alignLeft = this.options.align === 'left';\n this.allItems.forEach(function (item) {\n let lastPoint, height, useFirstPoint = alignLeft, target, top;\n if (item.yAxis) {\n if (item.xAxis.options.reversed) {\n useFirstPoint = !useFirstPoint;\n }\n if (item.points) {\n lastPoint = Legend_find(useFirstPoint ?\n item.points :\n item.points.slice(0).reverse(), function (item) {\n return Legend_isNumber(item.plotY);\n });\n }\n height = this.itemMarginTop +\n item.legendItem.label.getBBox().height +\n this.itemMarginBottom;\n top = item.yAxis.top - chart.plotTop;\n if (item.visible) {\n target = lastPoint ?\n lastPoint.plotY :\n item.yAxis.height;\n target += top - 0.3 * height;\n }\n else {\n target = top + item.yAxis.height;\n }\n boxes.push({\n target: target,\n size: height,\n item\n });\n }\n }, this);\n let legendItem;\n for (const box of Legend_distribute(boxes, chart.plotHeight)) {\n legendItem = box.item.legendItem || {};\n if (Legend_isNumber(box.pos)) {\n legendItem.y = chart.plotTop - chart.spacing[0] + box.pos;\n }\n }\n }\n /**\n * Render the legend. This method can be called both before and after\n * `chart.render`. If called after, it will only rearrange items instead\n * of creating new ones. Called internally on initial render and after\n * redraws.\n *\n * @private\n * @function Highcharts.Legend#render\n */\n render() {\n const legend = this, chart = legend.chart, renderer = chart.renderer, options = legend.options, padding = legend.padding, \n // Add each series or point\n allItems = legend.getAllItems();\n let display, legendWidth, legendHeight, legendGroup = legend.group, allowedWidth, box = legend.box;\n legend.itemX = padding;\n legend.itemY = legend.initialItemY;\n legend.offsetWidth = 0;\n legend.lastItemY = 0;\n legend.widthOption = Legend_relativeLength(options.width, chart.spacingBox.width - padding);\n // Compute how wide the legend is allowed to be\n allowedWidth = chart.spacingBox.width - 2 * padding - options.x;\n if (['rm', 'lm'].indexOf(legend.getAlignment().substring(0, 2)) > -1) {\n allowedWidth /= 2;\n }\n legend.maxLegendWidth = legend.widthOption || allowedWidth;\n if (!legendGroup) {\n /**\n * SVG group of the legend.\n *\n * @readonly\n * @name Highcharts.Legend#group\n * @type {Highcharts.SVGElement}\n */\n legend.group = legendGroup = renderer\n .g('legend')\n .addClass(options.className || '')\n .attr({ zIndex: 7 })\n .add();\n legend.contentGroup = renderer\n .g()\n .attr({ zIndex: 1 }) // Above background\n .add(legendGroup);\n legend.scrollGroup = renderer\n .g()\n .add(legend.contentGroup);\n }\n legend.renderTitle();\n // Sort by legendIndex\n Legend_stableSort(allItems, (a, b) => ((a.options && a.options.legendIndex) || 0) -\n ((b.options && b.options.legendIndex) || 0));\n // Reversed legend\n if (options.reversed) {\n allItems.reverse();\n }\n /**\n * All items for the legend, which is an array of series for most series\n * and an array of points for pie series and its derivatives.\n *\n * @readonly\n * @name Highcharts.Legend#allItems\n * @type {Array<(Highcharts.Point|Highcharts.Series)>}\n */\n legend.allItems = allItems;\n legend.display = display = !!allItems.length;\n // Render the items. First we run a loop to set the text and properties\n // and read all the bounding boxes. The next loop computes the item\n // positions based on the bounding boxes.\n legend.lastLineHeight = 0;\n legend.maxItemWidth = 0;\n legend.totalItemWidth = 0;\n legend.itemHeight = 0;\n allItems.forEach(legend.renderItem, legend);\n allItems.forEach(legend.layoutItem, legend);\n // Get the box\n legendWidth = (legend.widthOption || legend.offsetWidth) + padding;\n legendHeight = legend.lastItemY + legend.lastLineHeight +\n legend.titleHeight;\n legendHeight = legend.handleOverflow(legendHeight);\n legendHeight += padding;\n // Draw the border and/or background\n if (!box) {\n /**\n * SVG element of the legend box.\n *\n * @readonly\n * @name Highcharts.Legend#box\n * @type {Highcharts.SVGElement}\n */\n legend.box = box = renderer.rect()\n .addClass('highcharts-legend-box')\n .attr({\n r: options.borderRadius\n })\n .add(legendGroup);\n }\n // Presentational\n if (!chart.styledMode) {\n box\n .attr({\n stroke: options.borderColor,\n 'stroke-width': options.borderWidth || 0,\n fill: options.backgroundColor || 'none'\n })\n .shadow(options.shadow);\n }\n if (legendWidth > 0 && legendHeight > 0) {\n box[box.placed ? 'animate' : 'attr'](box.crisp.call({}, {\n x: 0,\n y: 0,\n width: legendWidth,\n height: legendHeight\n }, box.strokeWidth()));\n }\n // Hide the border if no items\n legendGroup[display ? 'show' : 'hide']();\n // Open for responsiveness\n if (chart.styledMode && legendGroup.getStyle('display') === 'none') {\n legendWidth = legendHeight = 0;\n }\n legend.legendWidth = legendWidth;\n legend.legendHeight = legendHeight;\n if (display) {\n legend.align();\n }\n if (!this.proximate) {\n this.positionItems();\n }\n Legend_fireEvent(this, 'afterRender');\n }\n /**\n * Align the legend to chart's box.\n *\n * @private\n * @function Highcharts.align\n * @param {Highcharts.BBoxObject} alignTo\n */\n align(alignTo = this.chart.spacingBox) {\n const chart = this.chart, options = this.options;\n // If aligning to the top and the layout is horizontal, adjust for\n // the title (#7428)\n let y = alignTo.y;\n if (/(lth|ct|rth)/.test(this.getAlignment()) &&\n chart.titleOffset[0] > 0) {\n y += chart.titleOffset[0];\n }\n else if (/(lbh|cb|rbh)/.test(this.getAlignment()) &&\n chart.titleOffset[2] > 0) {\n y -= chart.titleOffset[2];\n }\n if (y !== alignTo.y) {\n alignTo = Legend_merge(alignTo, { y });\n }\n if (!chart.hasRendered) {\n // Avoid animation when adjusting alignment for responsiveness and\n // colorAxis label layout\n this.group.placed = false;\n }\n this.group.align(Legend_merge(options, {\n width: this.legendWidth,\n height: this.legendHeight,\n verticalAlign: this.proximate ? 'top' : options.verticalAlign\n }), true, alignTo);\n }\n /**\n * Set up the overflow handling by adding navigation with up and down arrows\n * below the legend.\n *\n * @private\n * @function Highcharts.Legend#handleOverflow\n */\n handleOverflow(legendHeight) {\n const legend = this, chart = this.chart, renderer = chart.renderer, options = this.options, optionsY = options.y, alignTop = options.verticalAlign === 'top', padding = this.padding, maxHeight = options.maxHeight, navOptions = options.navigation, animation = Legend_pick(navOptions.animation, true), arrowSize = navOptions.arrowSize || 12, pages = this.pages, allItems = this.allItems, clipToHeight = function (height) {\n if (typeof height === 'number') {\n clipRect.attr({\n height: height\n });\n }\n else if (clipRect) { // Reset (#5912)\n legend.clipRect = clipRect.destroy();\n legend.contentGroup.clip();\n }\n // Use HTML\n if (legend.contentGroup.div) {\n legend.contentGroup.div.style.clip = height ?\n 'rect(' + padding + 'px,9999px,' +\n (padding + height) + 'px,0)' :\n 'auto';\n }\n }, addTracker = function (key) {\n legend[key] = renderer\n .circle(0, 0, arrowSize * 1.3)\n .translate(arrowSize / 2, arrowSize / 2)\n .add(nav);\n if (!chart.styledMode) {\n legend[key].attr('fill', 'rgba(0,0,0,0.0001)');\n }\n return legend[key];\n };\n let clipHeight, lastY, legendItem, spaceHeight = (chart.spacingBox.height +\n (alignTop ? -optionsY : optionsY) - padding), nav = this.nav, clipRect = this.clipRect;\n // Adjust the height\n if (options.layout === 'horizontal' &&\n options.verticalAlign !== 'middle' &&\n !options.floating) {\n spaceHeight /= 2;\n }\n if (maxHeight) {\n spaceHeight = Math.min(spaceHeight, maxHeight);\n }\n // Reset the legend height and adjust the clipping rectangle\n pages.length = 0;\n if (legendHeight &&\n spaceHeight > 0 &&\n legendHeight > spaceHeight &&\n navOptions.enabled !== false) {\n this.clipHeight = clipHeight =\n Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n this.currentPage = Legend_pick(this.currentPage, 1);\n this.fullHeight = legendHeight;\n // Fill pages with Y positions so that the top of each a legend item\n // defines the scroll top for each page (#2098)\n allItems.forEach((item, i) => {\n legendItem = item.legendItem || {};\n const y = legendItem.y || 0, h = Math.round(legendItem.label.getBBox().height);\n let len = pages.length;\n if (!len || (y - pages[len - 1] > clipHeight &&\n (lastY || y) !== pages[len - 1])) {\n pages.push(lastY || y);\n len++;\n }\n // Keep track of which page each item is on\n legendItem.pageIx = len - 1;\n if (lastY) {\n (allItems[i - 1].legendItem || {}).pageIx = len - 1;\n }\n // Add the last page if needed (#2617, #13683)\n if (\n // Check the last item\n i === allItems.length - 1 &&\n // If adding next page is needed (#18768)\n y + h - pages[len - 1] > clipHeight &&\n y > pages[len - 1]) {\n pages.push(y);\n legendItem.pageIx = len;\n }\n if (y !== lastY) {\n lastY = y;\n }\n });\n // Only apply clipping if needed. Clipping causes blurred legend in\n // PDF export (#1787)\n if (!clipRect) {\n clipRect = legend.clipRect =\n renderer.clipRect(0, padding - 2, 9999, 0);\n legend.contentGroup.clip(clipRect);\n }\n clipToHeight(clipHeight);\n // Add navigation elements\n if (!nav) {\n this.nav = nav = renderer.g()\n .attr({ zIndex: 1 })\n .add(this.group);\n this.up = renderer\n .symbol('triangle', 0, 0, arrowSize, arrowSize)\n .add(nav);\n addTracker('upTracker')\n .on('click', function () {\n legend.scroll(-1, animation);\n });\n this.pager = renderer.text('', 15, 10)\n .addClass('highcharts-legend-navigation');\n if (!chart.styledMode && navOptions.style) {\n this.pager.css(navOptions.style);\n }\n this.pager.add(nav);\n this.down = renderer\n .symbol('triangle-down', 0, 0, arrowSize, arrowSize)\n .add(nav);\n addTracker('downTracker')\n .on('click', function () {\n legend.scroll(1, animation);\n });\n }\n // Set initial position\n legend.scroll(0);\n legendHeight = spaceHeight;\n // Reset\n }\n else if (nav) {\n clipToHeight();\n this.nav = nav.destroy(); // #6322\n this.scrollGroup.attr({\n translateY: 1\n });\n this.clipHeight = 0; // #1379\n }\n return legendHeight;\n }\n /**\n * Scroll the legend by a number of pages.\n *\n * @private\n * @function Highcharts.Legend#scroll\n *\n * @param {number} scrollBy\n * The number of pages to scroll.\n *\n * @param {boolean|Partial} [animation]\n * Whether and how to apply animation.\n *\n */\n scroll(scrollBy, animation) {\n const chart = this.chart, pages = this.pages, pageCount = pages.length, clipHeight = this.clipHeight, navOptions = this.options.navigation, pager = this.pager, padding = this.padding;\n let currentPage = this.currentPage + scrollBy;\n // When resizing while looking at the last page\n if (currentPage > pageCount) {\n currentPage = pageCount;\n }\n if (currentPage > 0) {\n if (typeof animation !== 'undefined') {\n Legend_setAnimation(animation, chart);\n }\n this.nav.attr({\n translateX: padding,\n translateY: clipHeight + this.padding + 7 + this.titleHeight,\n visibility: 'inherit'\n });\n [this.up, this.upTracker].forEach(function (elem) {\n elem.attr({\n 'class': currentPage === 1 ?\n 'highcharts-legend-nav-inactive' :\n 'highcharts-legend-nav-active'\n });\n });\n pager.attr({\n text: currentPage + '/' + pageCount\n });\n [this.down, this.downTracker].forEach(function (elem) {\n elem.attr({\n // Adjust to text width\n x: 18 + this.pager.getBBox().width,\n 'class': currentPage === pageCount ?\n 'highcharts-legend-nav-inactive' :\n 'highcharts-legend-nav-active'\n });\n }, this);\n if (!chart.styledMode) {\n this.up\n .attr({\n fill: currentPage === 1 ?\n navOptions.inactiveColor :\n navOptions.activeColor\n });\n this.upTracker\n .css({\n cursor: currentPage === 1 ? 'default' : 'pointer'\n });\n this.down\n .attr({\n fill: currentPage === pageCount ?\n navOptions.inactiveColor :\n navOptions.activeColor\n });\n this.downTracker\n .css({\n cursor: currentPage === pageCount ?\n 'default' :\n 'pointer'\n });\n }\n this.scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n this.scrollGroup.animate({\n translateY: this.scrollOffset\n });\n this.currentPage = currentPage;\n this.positionCheckboxes();\n // Fire event after scroll animation is complete\n const animOptions = Legend_animObject(Legend_pick(animation, chart.renderer.globalAnimation, true));\n Legend_syncTimeout(() => {\n Legend_fireEvent(this, 'afterScroll', { currentPage });\n }, animOptions.duration);\n }\n }\n /**\n * @private\n * @function Highcharts.Legend#setItemEvents\n * @param {Highcharts.BubbleLegendItem|Point|Highcharts.Series} item\n * @param {Highcharts.SVGElement} legendLabel\n * @param {boolean} [useHTML=false]\n * @emits Highcharts.Legend#event:itemClick\n */\n setItemEvents(item, legendLabel, useHTML) {\n const legend = this, legendItem = item.legendItem || {}, boxWrapper = legend.chart.renderer.boxWrapper, isPoint = item instanceof Series_Point, isSeries = item instanceof Series_Series, activeClass = 'highcharts-legend-' +\n (isPoint ? 'point' : 'series') + '-active', styledMode = legend.chart.styledMode, \n // When `useHTML`, the symbol is rendered in other group, so\n // we need to apply events listeners to both places\n legendElements = useHTML ?\n [legendLabel, legendItem.symbol] :\n [legendItem.group];\n const setOtherItemsState = (state) => {\n legend.allItems.forEach((otherItem) => {\n if (item !== otherItem) {\n [otherItem]\n .concat(otherItem.linkedSeries || [])\n .forEach((otherItem) => {\n otherItem.setState(state, !isPoint);\n });\n }\n });\n };\n // Set the events on the item group, or in case of useHTML, the item\n // itself (#1249)\n for (const element of legendElements) {\n if (element) {\n element\n .on('mouseover', function () {\n if (item.visible) {\n setOtherItemsState('inactive');\n }\n item.setState('hover');\n // A CSS class to dim or hide other than the hovered\n // series.\n // Works only if hovered series is visible (#10071).\n if (item.visible) {\n boxWrapper.addClass(activeClass);\n }\n if (!styledMode) {\n legendLabel.css(legend.options.itemHoverStyle);\n }\n })\n .on('mouseout', function () {\n if (!legend.chart.styledMode) {\n legendLabel.css(Legend_merge(item.visible ?\n legend.itemStyle :\n legend.itemHiddenStyle));\n }\n setOtherItemsState('');\n // A CSS class to dim or hide other than the hovered\n // series.\n boxWrapper.removeClass(activeClass);\n item.setState();\n })\n .on('click', function (event) {\n const defaultItemClick = function () {\n if (item.setVisible) {\n item.setVisible();\n }\n // Reset inactive state\n setOtherItemsState(item.visible ? 'inactive' : '');\n };\n // A CSS class to dim or hide other than the hovered\n // series. Event handling in iOS causes the activeClass\n // to be added prior to click in some cases (#7418).\n boxWrapper.removeClass(activeClass);\n Legend_fireEvent(legend, 'itemClick', {\n // Pass over the click/touch event. #4.\n browserEvent: event,\n legendItem: item\n }, defaultItemClick);\n // Deprecated logic\n // Click the name or symbol\n if (isPoint) {\n item.firePointEvent('legendItemClick', {\n browserEvent: event\n });\n }\n else if (isSeries) {\n Legend_fireEvent(item, 'legendItemClick', {\n browserEvent: event\n });\n }\n });\n }\n }\n }\n /**\n * @private\n * @function Highcharts.Legend#createCheckboxForItem\n * @param {Highcharts.BubbleLegendItem|Point|Highcharts.Series} item\n * @emits Highcharts.Series#event:checkboxClick\n */\n createCheckboxForItem(item) {\n const legend = this;\n item.checkbox = Legend_createElement('input', {\n type: 'checkbox',\n className: 'highcharts-legend-checkbox',\n checked: item.selected,\n defaultChecked: item.selected // Required by IE7\n }, legend.options.itemCheckboxStyle, legend.chart.container);\n Legend_addEvent(item.checkbox, 'click', function (event) {\n const target = event.target;\n Legend_fireEvent(item.series || item, 'checkboxClick', {\n checked: target.checked,\n item: item\n }, function () {\n item.select();\n });\n });\n }\n}\n/* *\n *\n * Class Namespace\n *\n * */\n(function (Legend) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n function compose(ChartClass) {\n if (Legend_pushUnique(Legend_composed, 'Core.Legend')) {\n Legend_addEvent(ChartClass, 'beforeMargins', function () {\n /**\n * The legend contains an interactive overview over chart items,\n * usually individual series or points depending on the series\n * type. The color axis and bubble legend are also rendered in\n * the chart legend.\n *\n * @name Highcharts.Chart#legend\n * @type {Highcharts.Legend}\n */\n this.legend = new Legend(this, this.options.legend);\n });\n }\n }\n Legend.compose = compose;\n})(Legend || (Legend = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Legend_Legend = (Legend);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @interface Highcharts.LegendItemObject\n */ /**\n* @name Highcharts.LegendItemObject#item\n* @type {Highcharts.SVGElement|undefined}\n*/ /**\n* @name Highcharts.LegendItemObject#line\n* @type {Highcharts.SVGElement|undefined}\n*/ /**\n* @name Highcharts.LegendItemObject#symbol\n* @type {Highcharts.SVGElement|undefined}\n*/\n/**\n * Gets fired when the legend item is clicked. The default\n * action is to toggle the visibility of the series or point. This can be\n * prevented by returning `false` or calling `event.preventDefault()`.\n *\n * @callback Highcharts.LegendItemClickCallbackFunction\n *\n * @param {Highcharts.Legend} this\n * The legend on which the event occurred.\n *\n * @param {Highcharts.LegendItemClickEventObject} event\n * The event that occurred.\n */\n/**\n * Information about the legend click event.\n *\n * @interface Highcharts.LegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.LegendItemClickEventObject#browserEvent\n* @type {Highcharts.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the series or point.\n* @name Highcharts.LegendItemClickEventObject#preventDefault\n* @type {Function}\n* */ /**\n* Related legend item, it can be series, point, color axis or data class from\n* color axis.\n* @name Highcharts.LegendItemClickEventObject#legendItem\n* @type {Highcharts.Series|Highcharts.Point|Highcharts.LegendItemObject}\n* */ /**\n* Related legend.\n* @name Highcharts.LegendItemClickEventObject#target\n* @type {Highcharts.Legend}\n*/ /**\n* Event type.\n* @name Highcharts.LegendItemClickEventObject#type\n* @type {\"itemClick\"}\n*/\n/**\n * Gets fired when the legend item belonging to a point is clicked. The default\n * action is to toggle the visibility of the point. This can be prevented by\n * returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickCallbackFunction.\n *\n * @deprecated 11.4.4\n * @callback Highcharts.PointLegendItemClickCallbackFunction\n *\n * @param {Highcharts.Point} this\n * The point on which the event occurred.\n *\n * @param {Highcharts.PointLegendItemClickEventObject} event\n * The event that occurred.\n */\n/**\n * Information about the legend click event.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickEventObject.\n *\n * @deprecated 11.4.4\n * @interface Highcharts.PointLegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.PointLegendItemClickEventObject#browserEvent\n* @type {Highcharts.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the point.\n* @name Highcharts.PointLegendItemClickEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Related point.\n* @name Highcharts.PointLegendItemClickEventObject#target\n* @type {Highcharts.Point}\n*/ /**\n* Event type.\n* @name Highcharts.PointLegendItemClickEventObject#type\n* @type {\"legendItemClick\"}\n*/\n/**\n * Series color as used by the legend and some series types.\n * @name Highcharts.Series#color\n * @type {Highcharts.ColorType|undefined}\n */ /**\n* Legend data for the series.\n* @name Highcharts.Series#legendItem\n* @type {Highcharts.LegendItemObject|undefined}\n* @since 10.3.0\n*/\n/**\n * Gets fired when the legend item belonging to a series is clicked. The default\n * action is to toggle the visibility of the series. This can be prevented by\n * returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickCallbackFunction.\n *\n * @deprecated 11.4.4\n * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesLegendItemClickEventObject} event\n * The event that occurred.\n */\n/**\n * Information about the legend click event.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickEventObject.\n *\n * @deprecated 11.4.4\n * @interface Highcharts.SeriesLegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n* @type {Highcharts.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the series.\n* @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesLegendItemClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesLegendItemClickEventObject#type\n* @type {\"legendItemClick\"}\n*/\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Chart/Chart.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animate: Chart_animate, animObject: Chart_animObject, setAnimation: Chart_setAnimation } = AnimationUtilities;\n\n\nconst { defaultOptions: Chart_defaultOptions } = Defaults;\n\nconst { numberFormat: Chart_numberFormat } = Core_Templating;\n\nconst { registerEventOptions: Chart_registerEventOptions } = Core_Foundation;\n\nconst { charts: Chart_charts, doc: Chart_doc, marginNames: Chart_marginNames, svg: Chart_svg, win: Chart_win } = Core_Globals;\n\n\n\nconst { seriesTypes: Chart_seriesTypes } = Series_SeriesRegistry;\n\n\n\n\n\nconst { addEvent: Chart_addEvent, attr: Chart_attr, createElement: Chart_createElement, css: Chart_css, defined: Chart_defined, diffObjects: Chart_diffObjects, discardElement: Chart_discardElement, erase: Chart_erase, error: Chart_error, extend: Chart_extend, find: Chart_find, fireEvent: Chart_fireEvent, getAlignFactor: Chart_getAlignFactor, getStyle: Chart_getStyle, isArray: Chart_isArray, isNumber: Chart_isNumber, isObject: Chart_isObject, isString: Chart_isString, merge: Chart_merge, objectEach: Chart_objectEach, pick: Chart_pick, pInt: Chart_pInt, relativeLength: Chart_relativeLength, removeEvent: Chart_removeEvent, splat: Chart_splat, syncTimeout: Chart_syncTimeout, uniqueKey: Chart_uniqueKey } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n *\n * @example\n * let chart = Highcharts.chart('container', {\n * title: {\n * text: 'My chart'\n * },\n * series: [{\n * data: [1, 3, 2, 4]\n * }]\n * })\n *\n * @class\n * @name Highcharts.Chart\n *\n * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n * The DOM element to render to, or its id.\n *\n * @param {Highcharts.Options} options\n * The chart options structure.\n *\n * @param {Highcharts.ChartCallbackFunction} [callback]\n * Function to run when the chart has loaded and all external images\n * are loaded. Defining a\n * [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n * handler is equivalent.\n */\nclass Chart {\n /**\n * Factory function for basic charts.\n *\n * @example\n * // Render a chart in to div#container\n * let chart = Highcharts.chart('container', {\n * title: {\n * text: 'My chart'\n * },\n * series: [{\n * data: [1, 3, 2, 4]\n * }]\n * });\n *\n * @function Highcharts.chart\n *\n * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n * The DOM element to render to, or its id.\n *\n * @param {Highcharts.Options} options\n * The chart options structure.\n *\n * @param {Highcharts.ChartCallbackFunction} [callback]\n * Function to run when the chart has loaded and all external images are\n * loaded. Defining a\n * [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n * handler is equivalent.\n *\n * @return {Highcharts.Chart}\n * Returns the Chart object.\n */\n static chart(a, b, c) {\n return new Chart(a, b, c);\n }\n // Implementation\n constructor(a, \n /* eslint-disable @typescript-eslint/no-unused-vars */\n b, c\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ) {\n this.sharedClips = {};\n const args = [\n // ES5 builds fail unless we cast it to an Array\n ...arguments\n ];\n // Remove the optional first argument, renderTo, and set it on this.\n if (Chart_isString(a) || a.nodeName) {\n this.renderTo = args.shift();\n }\n this.init(args[0], args[1]);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Function setting zoom options after chart init and after chart update.\n * Offers support for deprecated options.\n *\n * @private\n * @function Highcharts.Chart#setZoomOptions\n */\n setZoomOptions() {\n const chart = this, options = chart.options.chart, zooming = options.zooming;\n chart.zooming = {\n ...zooming,\n type: Chart_pick(options.zoomType, zooming.type),\n key: Chart_pick(options.zoomKey, zooming.key),\n pinchType: Chart_pick(options.pinchType, zooming.pinchType),\n singleTouch: Chart_pick(options.zoomBySingleTouch, zooming.singleTouch, false),\n resetButton: Chart_merge(zooming.resetButton, options.resetZoomButton)\n };\n }\n /**\n * Overridable function that initializes the chart. The constructor's\n * arguments are passed on directly.\n *\n * @function Highcharts.Chart#init\n *\n * @param {Highcharts.Options} userOptions\n * Custom options.\n *\n * @param {Function} [callback]\n * Function to run when the chart has loaded and all external\n * images are loaded.\n *\n *\n * @emits Highcharts.Chart#event:init\n * @emits Highcharts.Chart#event:afterInit\n */\n init(userOptions, callback) {\n // Fire the event with a default function\n Chart_fireEvent(this, 'init', { args: arguments }, function () {\n const options = Chart_merge(Chart_defaultOptions, userOptions), // Do the merge\n optionsChart = options.chart, renderTo = this.renderTo || optionsChart.renderTo;\n /**\n * The original options given to the constructor or a chart factory\n * like {@link Highcharts.chart} and {@link Highcharts.stockChart}.\n * The original options are shallow copied to avoid mutation. The\n * copy, `chart.userOptions`, may later be mutated to reflect\n * updated options throughout the lifetime of the chart.\n *\n * For collections, like `series`, `xAxis` and `yAxis`, the chart\n * user options should always be reflected by the item user option,\n * so for example the following should always be true:\n *\n * `chart.xAxis[0].userOptions === chart.userOptions.xAxis[0]`\n *\n * @name Highcharts.Chart#userOptions\n * @type {Highcharts.Options}\n */\n this.userOptions = Chart_extend({}, userOptions);\n if (!(this.renderTo = (Chart_isString(renderTo) ?\n Chart_doc.getElementById(renderTo) :\n renderTo))) {\n // Display an error if the renderTo is wrong\n Chart_error(13, true, this);\n }\n this.margin = [];\n this.spacing = [];\n // An array of functions that returns labels that should be\n // considered for anti-collision\n this.labelCollectors = [];\n this.callback = callback;\n this.isResizing = 0;\n /**\n * The options structure for the chart after merging\n * {@link #defaultOptions} and {@link #userOptions}. It contains\n * members for the sub elements like series, legend, tooltip etc.\n *\n * @name Highcharts.Chart#options\n * @type {Highcharts.Options}\n */\n this.options = options;\n /**\n * All the axes in the chart.\n *\n * @see Highcharts.Chart.xAxis\n * @see Highcharts.Chart.yAxis\n *\n * @name Highcharts.Chart#axes\n * @type {Array}\n */\n this.axes = [];\n /**\n * All the current series in the chart.\n *\n * @name Highcharts.Chart#series\n * @type {Array}\n */\n this.series = [];\n this.locale = options.lang.locale ??\n this.renderTo.closest('[lang]')?.lang;\n /**\n * The `Time` object associated with the chart. Since v6.0.5,\n * time settings can be applied individually for each chart. If\n * no individual settings apply, the `Time` object is shared by\n * all instances.\n *\n * @name Highcharts.Chart#time\n * @type {Highcharts.Time}\n */\n this.time = new Core_Time(Chart_extend(options.time || {}, {\n locale: this.locale\n }));\n options.time = this.time.options;\n /**\n * Callback function to override the default function that formats\n * all the numbers in the chart. Returns a string with the formatted\n * number.\n *\n * @name Highcharts.Chart#numberFormatter\n * @type {Highcharts.NumberFormatterCallbackFunction}\n */\n this.numberFormatter = (optionsChart.numberFormatter || Chart_numberFormat).bind(this);\n /**\n * Whether the chart is in styled mode, meaning all presentational\n * attributes are avoided.\n *\n * @name Highcharts.Chart#styledMode\n * @type {boolean}\n */\n this.styledMode = optionsChart.styledMode;\n this.hasCartesianSeries = optionsChart.showAxes;\n const chart = this;\n /**\n * Index position of the chart in the {@link Highcharts#charts}\n * property.\n *\n * @name Highcharts.Chart#index\n * @type {number}\n * @readonly\n */\n chart.index = Chart_charts.length; // Add the chart to the global lookup\n Chart_charts.push(chart);\n Core_Globals.chartCount++;\n // Chart event handlers\n Chart_registerEventOptions(this, optionsChart);\n /**\n * A collection of the X axes in the chart.\n *\n * @name Highcharts.Chart#xAxis\n * @type {Array}\n */\n chart.xAxis = [];\n /**\n * A collection of the Y axes in the chart.\n *\n * @name Highcharts.Chart#yAxis\n * @type {Array}\n *\n * @todo\n * Make events official: Fire the event `afterInit`.\n */\n chart.yAxis = [];\n chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n this.setZoomOptions();\n // Fire after init but before first render, before axes and series\n // have been initialized.\n Chart_fireEvent(chart, 'afterInit');\n chart.firstRender();\n });\n }\n /**\n * Internal function to unitialize an individual series.\n *\n * @private\n * @function Highcharts.Chart#initSeries\n */\n initSeries(options) {\n const chart = this, optionsChart = chart.options.chart, type = (options.type ||\n optionsChart.type), SeriesClass = Chart_seriesTypes[type];\n // No such series type\n if (!SeriesClass) {\n Chart_error(17, true, chart, { missingModuleFor: type });\n }\n const series = new SeriesClass();\n if (typeof series.init === 'function') {\n series.init(chart, options);\n }\n return series;\n }\n /**\n * Internal function to set data for all series with enabled sorting.\n *\n * @private\n * @function Highcharts.Chart#setSortedData\n */\n setSortedData() {\n this.getSeriesOrderByLinks().forEach(function (series) {\n // We need to set data for series with sorting after series init\n if (!series.points && !series.data && series.enabledDataSorting) {\n series.setData(series.options.data, false);\n }\n });\n }\n /**\n * Sort and return chart series in order depending on the number of linked\n * series.\n *\n * @private\n * @function Highcharts.Series#getSeriesOrderByLinks\n */\n getSeriesOrderByLinks() {\n return this.series.concat().sort(function (a, b) {\n if (a.linkedSeries.length || b.linkedSeries.length) {\n return b.linkedSeries.length - a.linkedSeries.length;\n }\n return 0;\n });\n }\n /**\n * Order all series or axes above a given index. When series or axes are\n * added and ordered by configuration, only the last series is handled\n * (#248, #1123, #2456, #6112). This function is called on series and axis\n * initialization and destroy.\n *\n * @private\n * @function Highcharts.Chart#orderItems\n * @param {string} coll The collection name\n * @param {number} [fromIndex=0]\n * If this is given, only the series above this index are handled.\n */\n orderItems(coll, fromIndex = 0) {\n const collection = this[coll], \n // Item options should be reflected in chart.options.series,\n // chart.options.yAxis etc\n optionsArray = this.options[coll] = Chart_splat(this.options[coll])\n .slice(), userOptionsArray = this.userOptions[coll] = this.userOptions[coll] ?\n Chart_splat(this.userOptions[coll]).slice() :\n [];\n if (this.hasRendered) {\n // Remove all above index\n optionsArray.splice(fromIndex);\n userOptionsArray.splice(fromIndex);\n }\n if (collection) {\n for (let i = fromIndex, iEnd = collection.length; i < iEnd; ++i) {\n const item = collection[i];\n if (item) {\n /**\n * Contains the series' index in the `Chart.series` array.\n *\n * @name Highcharts.Series#index\n * @type {number}\n * @readonly\n */\n item.index = i;\n if (item instanceof Series_Series) {\n item.name = item.getName();\n }\n if (!item.options.isInternal) {\n optionsArray[i] = item.options;\n userOptionsArray[i] = item.userOptions;\n }\n }\n }\n }\n }\n /**\n * Check whether a given point is within the plot area.\n *\n * @function Highcharts.Chart#isInsidePlot\n *\n * @param {number} plotX\n * Pixel x relative to the plot area.\n *\n * @param {number} plotY\n * Pixel y relative to the plot area.\n *\n * @param {Highcharts.ChartIsInsideOptionsObject} [options]\n * Options object.\n *\n * @return {boolean}\n * Returns true if the given point is inside the plot area.\n */\n isInsidePlot(plotX, plotY, options = {}) {\n const { inverted, plotBox, plotLeft, plotTop, scrollablePlotBox } = this, { scrollLeft = 0, scrollTop = 0 } = (options.visiblePlotOnly &&\n this.scrollablePlotArea?.scrollingContainer) || {}, series = options.series, box = (options.visiblePlotOnly && scrollablePlotBox) || plotBox, x = options.inverted ? plotY : plotX, y = options.inverted ? plotX : plotY, e = {\n x,\n y,\n isInsidePlot: true,\n options\n };\n if (!options.ignoreX) {\n const xAxis = (series &&\n (inverted && !this.polar ? series.yAxis : series.xAxis)) || {\n pos: plotLeft,\n len: Infinity\n };\n const chartX = options.paneCoordinates ?\n xAxis.pos + x : plotLeft + x;\n if (!(chartX >= Math.max(scrollLeft + plotLeft, xAxis.pos) &&\n chartX <= Math.min(scrollLeft + plotLeft + box.width, xAxis.pos + xAxis.len))) {\n e.isInsidePlot = false;\n }\n }\n if (!options.ignoreY && e.isInsidePlot) {\n const yAxis = (!inverted && options.axis &&\n !options.axis.isXAxis && options.axis) || (series && (inverted ? series.xAxis : series.yAxis)) || {\n pos: plotTop,\n len: Infinity\n };\n const chartY = options.paneCoordinates ?\n yAxis.pos + y : plotTop + y;\n if (!(chartY >= Math.max(scrollTop + plotTop, yAxis.pos) &&\n chartY <= Math.min(scrollTop + plotTop + box.height, yAxis.pos + yAxis.len))) {\n e.isInsidePlot = false;\n }\n }\n Chart_fireEvent(this, 'afterIsInsidePlot', e);\n return e.isInsidePlot;\n }\n /**\n * Redraw the chart after changes have been done to the data, axis extremes\n * chart size or chart elements. All methods for updating axes, series or\n * points have a parameter for redrawing the chart. This is `true` by\n * default. But in many cases you want to do more than one operation on the\n * chart before redrawing, for example add a number of points. In those\n * cases it is a waste of resources to redraw the chart for each new point\n * added. So you add the points and call `chart.redraw()` after.\n *\n * @function Highcharts.Chart#redraw\n *\n * @param {boolean|Partial} [animation]\n * If or how to apply animation to the redraw. When `undefined`, it applies\n * the animation that is set in the `chart.animation` option.\n *\n * @emits Highcharts.Chart#event:afterSetExtremes\n * @emits Highcharts.Chart#event:beforeRedraw\n * @emits Highcharts.Chart#event:predraw\n * @emits Highcharts.Chart#event:redraw\n * @emits Highcharts.Chart#event:render\n * @emits Highcharts.Chart#event:updatedData\n */\n redraw(animation) {\n Chart_fireEvent(this, 'beforeRedraw');\n const chart = this, axes = chart.hasCartesianSeries ? chart.axes : chart.colorAxis || [], series = chart.series, pointer = chart.pointer, legend = chart.legend, legendUserOptions = chart.userOptions.legend, renderer = chart.renderer, isHiddenChart = renderer.isHidden(), afterRedraw = [];\n let hasDirtyStacks, hasStackedSeries, i, isDirtyBox = chart.isDirtyBox, redrawLegend = chart.isDirtyLegend, serie;\n renderer.rootFontSize = renderer.boxWrapper.getStyle('font-size');\n // Handle responsive rules, not only on resize (#6130)\n if (chart.setResponsive) {\n chart.setResponsive(false);\n }\n // Set the global animation. When chart.hasRendered is not true, the\n // redraw call comes from a responsive rule and animation should not\n // occur.\n Chart_setAnimation(chart.hasRendered ? animation : false, chart);\n if (isHiddenChart) {\n chart.temporaryDisplay();\n }\n // Adjust title layout (reflow multiline text)\n chart.layOutTitles(false);\n // Link stacked series\n i = series.length;\n while (i--) {\n serie = series[i];\n if (serie.options.stacking || serie.options.centerInCategory) {\n hasStackedSeries = true;\n if (serie.isDirty) {\n hasDirtyStacks = true;\n break;\n }\n }\n }\n if (hasDirtyStacks) { // Mark others as dirty\n i = series.length;\n while (i--) {\n serie = series[i];\n if (serie.options.stacking) {\n serie.isDirty = true;\n }\n }\n }\n // Handle updated data in the series\n series.forEach(function (serie) {\n if (serie.isDirty) {\n if (serie.options.legendType === 'point') {\n if (typeof serie.updateTotals === 'function') {\n serie.updateTotals();\n }\n redrawLegend = true;\n }\n else if (legendUserOptions &&\n (!!legendUserOptions.labelFormatter ||\n legendUserOptions.labelFormat)) {\n redrawLegend = true; // #2165\n }\n }\n if (serie.isDirtyData) {\n Chart_fireEvent(serie, 'updatedData');\n }\n });\n // Handle added or removed series\n if (redrawLegend && legend && legend.options.enabled) {\n // Draw legend graphics\n legend.render();\n chart.isDirtyLegend = false;\n }\n // Reset stacks\n if (hasStackedSeries) {\n chart.getStacks();\n }\n // Set axes scales\n axes.forEach(function (axis) {\n axis.updateNames();\n axis.setScale();\n });\n chart.getMargins(); // #3098\n // If one axis is dirty, all axes must be redrawn (#792, #2169)\n axes.forEach(function (axis) {\n if (axis.isDirty) {\n isDirtyBox = true;\n }\n });\n // Redraw axes\n axes.forEach(function (axis) {\n // Fire 'afterSetExtremes' only if extremes are set\n const key = axis.min + ',' + axis.max;\n if (axis.extKey !== key) { // #821, #4452\n axis.extKey = key;\n // Prevent a recursive call to chart.redraw() (#1119)\n afterRedraw.push(function () {\n Chart_fireEvent(axis, 'afterSetExtremes', Chart_extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n delete axis.eventArgs;\n });\n }\n if (isDirtyBox || hasStackedSeries) {\n axis.redraw();\n }\n });\n // The plot areas size has changed\n if (isDirtyBox) {\n chart.drawChartBox();\n }\n // Fire an event before redrawing series, used by the boost module to\n // clear previous series renderings.\n Chart_fireEvent(chart, 'predraw');\n // Redraw affected series\n series.forEach(function (serie) {\n if ((isDirtyBox || serie.isDirty) && serie.visible) {\n serie.redraw();\n }\n // Set it here, otherwise we will have unlimited 'updatedData' calls\n // for a hidden series after setData(). Fixes #6012\n serie.isDirtyData = false;\n });\n // Move tooltip or reset\n if (pointer) {\n pointer.reset(true);\n }\n // Redraw if canvas\n renderer.draw();\n // Fire the events\n Chart_fireEvent(chart, 'redraw');\n Chart_fireEvent(chart, 'render');\n if (isHiddenChart) {\n chart.temporaryDisplay(true);\n }\n // Fire callbacks that are put on hold until after the redraw\n afterRedraw.forEach(function (callback) {\n callback.call();\n });\n }\n /**\n * Get an axis, series or point object by `id` as given in the configuration\n * options. Returns `undefined` if no item is found.\n *\n * @sample highcharts/plotoptions/series-id/\n * Get series by id\n *\n * @function Highcharts.Chart#get\n *\n * @param {string} id\n * The id as given in the configuration options.\n *\n * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n * The retrieved item.\n */\n get(id) {\n const series = this.series;\n /**\n * @private\n */\n function itemById(item) {\n return (item.id === id ||\n (item.options && item.options.id === id));\n }\n let ret = \n // Search axes\n Chart_find(this.axes, itemById) ||\n // Search series\n Chart_find(this.series, itemById);\n // Search points\n for (let i = 0; !ret && i < series.length; i++) {\n ret = Chart_find(series[i].points || [], itemById);\n }\n return ret;\n }\n /**\n * Create the Axis instances based on the config options.\n *\n * @private\n * @function Highcharts.Chart#createAxes\n * @emits Highcharts.Chart#event:afterCreateAxes\n * @emits Highcharts.Chart#event:createAxes\n */\n createAxes() {\n const options = this.userOptions;\n Chart_fireEvent(this, 'createAxes');\n for (const coll of ['xAxis', 'yAxis']) {\n const arr = options[coll] = Chart_splat(options[coll] || {});\n for (const axisOptions of arr) {\n // eslint-disable-next-line no-new\n new Axis_Axis(this, axisOptions, coll);\n }\n }\n Chart_fireEvent(this, 'afterCreateAxes');\n }\n /**\n * Returns an array of all currently selected points in the chart. Points\n * can be selected by clicking or programmatically by the\n * {@link Highcharts.Point#select}\n * function.\n *\n * @sample highcharts/plotoptions/series-allowpointselect-line/\n * Get selected points\n * @sample highcharts/members/point-select-lasso/\n * Lasso selection\n * @sample highcharts/chart/events-selection-points/\n * Rectangle selection\n *\n * @function Highcharts.Chart#getSelectedPoints\n *\n * @return {Array}\n * The currently selected points.\n */\n getSelectedPoints() {\n return this.series.reduce((acc, series) => {\n // For one-to-one points inspect series.data in order to retrieve\n // points outside the visible range (#6445). For grouped data,\n // inspect the generated series.points.\n series.getPointsCollection()\n .forEach((point) => {\n if (Chart_pick(point.selectedStaging, point.selected)) {\n acc.push(point);\n }\n });\n return acc;\n }, []);\n }\n /**\n * Returns an array of all currently selected series in the chart. Series\n * can be selected either programmatically by the\n * {@link Highcharts.Series#select}\n * function or by checking the checkbox next to the legend item if\n * [series.showCheckBox](https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox)\n * is true.\n *\n * @sample highcharts/members/chart-getselectedseries/\n * Get selected series\n *\n * @function Highcharts.Chart#getSelectedSeries\n *\n * @return {Array}\n * The currently selected series.\n */\n getSelectedSeries() {\n return this.series.filter((s) => s.selected);\n }\n /**\n * Set a new title or subtitle for the chart.\n *\n * @sample highcharts/members/chart-settitle/\n * Set title text and styles\n *\n * @function Highcharts.Chart#setTitle\n *\n * @param {Highcharts.TitleOptions} [titleOptions]\n * New title options. The title text itself is set by the\n * `titleOptions.text` property.\n *\n * @param {Highcharts.SubtitleOptions} [subtitleOptions]\n * New subtitle options. The subtitle text itself is set by the\n * `subtitleOptions.text` property.\n *\n * @param {boolean} [redraw]\n * Whether to redraw the chart or wait for a later call to\n * `chart.redraw()`.\n */\n setTitle(titleOptions, subtitleOptions, redraw) {\n this.applyDescription('title', titleOptions);\n this.applyDescription('subtitle', subtitleOptions);\n // The initial call also adds the caption. On update, chart.update will\n // relay to Chart.setCaption.\n this.applyDescription('caption', void 0);\n this.layOutTitles(redraw);\n }\n /**\n * Apply a title, subtitle or caption for the chart\n *\n * @private\n * @function Highcharts.Chart#applyDescription\n * @param key {string}\n * Either title, subtitle or caption\n * @param {Highcharts.TitleOptions|Highcharts.SubtitleOptions|Highcharts.CaptionOptions|undefined} explicitOptions\n * The options to set, will be merged with default options.\n */\n applyDescription(key, explicitOptions) {\n const chart = this;\n // Merge default options with explicit options\n const options = this.options[key] = Chart_merge(this.options[key], explicitOptions);\n let elem = this[key];\n if (elem && explicitOptions) {\n this[key] = elem = elem.destroy(); // Remove old\n }\n if (options && !elem) {\n elem = this.renderer.text(options.text, 0, 0, options.useHTML)\n .attr({\n align: options.align,\n 'class': 'highcharts-' + key,\n zIndex: options.zIndex || 4\n })\n .css({\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n })\n .add();\n // Update methods, relay to `applyDescription`\n elem.update = function (updateOptions, redraw) {\n chart.applyDescription(key, updateOptions);\n chart.layOutTitles(redraw);\n };\n // Presentational\n if (!this.styledMode) {\n elem.css(Chart_extend(key === 'title' ? {\n // #2944\n fontSize: this.options.isStock ? '1em' : '1.2em'\n } : {}, options.style));\n }\n // Get unwrapped text length and reset\n elem.textPxLength = elem.getBBox().width;\n elem.css({ whiteSpace: options.style?.whiteSpace });\n /**\n * The chart title. The title has an `update` method that allows\n * modifying the options directly or indirectly via\n * `chart.update`.\n *\n * @sample highcharts/members/title-update/\n * Updating titles\n *\n * @name Highcharts.Chart#title\n * @type {Highcharts.TitleObject}\n */\n /**\n * The chart subtitle. The subtitle has an `update` method that\n * allows modifying the options directly or indirectly via\n * `chart.update`.\n *\n * @name Highcharts.Chart#subtitle\n * @type {Highcharts.SubtitleObject}\n */\n this[key] = elem;\n }\n }\n /**\n * Internal function to lay out the chart title, subtitle and caption, and\n * cache the full offset height for use in `getMargins`. The result is\n * stored in `this.titleOffset`.\n *\n * @private\n * @function Highcharts.Chart#layOutTitles\n *\n * @param {boolean} [redraw=true]\n * @emits Highcharts.Chart#event:afterLayOutTitles\n */\n layOutTitles(redraw = true) {\n const titleOffset = [0, 0, 0], { options, renderer, spacingBox } = this;\n // Lay out the title, subtitle and caption respectively\n ['title', 'subtitle', 'caption'].forEach((key) => {\n const desc = this[key], descOptions = this.options[key], alignTo = Chart_merge(spacingBox), textPxLength = desc?.textPxLength || 0;\n if (desc && descOptions) {\n // Provide a hook for the exporting button to shift the title\n Chart_fireEvent(this, 'layOutTitle', { alignTo, key, textPxLength });\n const fontMetrics = renderer.fontMetrics(desc), baseline = fontMetrics.b, lineHeight = fontMetrics.h, verticalAlign = descOptions.verticalAlign || 'top', topAligned = verticalAlign === 'top', \n // Use minScale only for top-aligned titles. It is not\n // likely that we will need scaling for other positions, but\n // if it is requested, we need to adjust the vertical\n // position to the scale.\n minScale = topAligned && descOptions.minScale || 1, offset = key === 'title' ?\n topAligned ? -3 : 0 :\n // Floating subtitle (#6574)\n topAligned ? titleOffset[0] + 2 : 0, uncappedScale = Math.min(alignTo.width / textPxLength, 1), scale = Math.max(minScale, uncappedScale), alignAttr = Chart_merge({\n y: verticalAlign === 'bottom' ?\n baseline :\n offset + baseline\n }, {\n align: key === 'title' ?\n // Title defaults to center for short titles,\n // left for word-wrapped titles\n (uncappedScale < minScale ? 'left' : 'center') :\n // Subtitle defaults to the title.align\n this.title?.alignValue\n }, descOptions), width = descOptions.width || ((uncappedScale > minScale ?\n // One line\n this.chartWidth :\n // Allow word wrap\n alignTo.width) / scale);\n // No animation when switching alignment\n if (desc.alignValue !== alignAttr.align) {\n desc.placed = false;\n }\n // Set the width and read the height\n const height = Math.round(desc\n .css({ width: `${width}px` })\n // Skip the cache for HTML (#3481, #11666)\n .getBBox(descOptions.useHTML).height);\n alignAttr.height = height;\n // Perform scaling and alignment\n desc\n .align(alignAttr, false, alignTo)\n .attr({\n align: alignAttr.align,\n scaleX: scale,\n scaleY: scale,\n 'transform-origin': `${alignTo.x +\n textPxLength *\n scale *\n Chart_getAlignFactor(alignAttr.align)} ${lineHeight}`\n });\n // Adjust the rendered title offset\n if (!descOptions.floating) {\n const offset = height * (\n // When scaling down the title, preserve the offset as\n // long as it's only one line, but scale down the offset\n // if the title wraps to multiple lines.\n height < lineHeight * 1.2 ? 1 : scale);\n if (verticalAlign === 'top') {\n titleOffset[0] = Math.ceil(titleOffset[0] + offset);\n }\n else if (verticalAlign === 'bottom') {\n titleOffset[2] = Math.ceil(titleOffset[2] + offset);\n }\n }\n }\n }, this);\n // Handle title.margin and caption.margin\n if (titleOffset[0] &&\n (options.title?.verticalAlign || 'top') === 'top') {\n titleOffset[0] += options.title?.margin || 0;\n }\n if (titleOffset[2] &&\n options.caption?.verticalAlign === 'bottom') {\n titleOffset[2] += options.caption?.margin || 0;\n }\n const requiresDirtyBox = (!this.titleOffset ||\n this.titleOffset.join(',') !== titleOffset.join(','));\n // Used in getMargins\n this.titleOffset = titleOffset;\n Chart_fireEvent(this, 'afterLayOutTitles');\n if (!this.isDirtyBox && requiresDirtyBox) {\n this.isDirtyBox = this.isDirtyLegend = requiresDirtyBox;\n // Redraw if necessary (#2719, #2744)\n if (this.hasRendered && redraw && this.isDirtyBox) {\n this.redraw();\n }\n }\n }\n /**\n * Internal function to get the available size of the container element\n *\n * @private\n * @function Highcharts.Chart#getContainerBox\n */\n getContainerBox() {\n // Temporarily hide support divs from a11y and others, #21888\n const nonContainers = [].map.call(this.renderTo.children, (child) => {\n if (child !== this.container) {\n const display = child.style.display;\n child.style.display = 'none';\n return [child, display];\n }\n }), box = {\n width: Chart_getStyle(this.renderTo, 'width', true) || 0,\n height: (Chart_getStyle(this.renderTo, 'height', true) || 0)\n };\n // Restore the non-containers\n nonContainers.filter(Boolean).forEach(([div, display]) => {\n div.style.display = display;\n });\n return box;\n }\n /**\n * Internal function to get the chart width and height according to options\n * and container size. Sets {@link Chart.chartWidth} and\n * {@link Chart.chartHeight}.\n *\n * @private\n * @function Highcharts.Chart#getChartSize\n */\n getChartSize() {\n const chart = this, optionsChart = chart.options.chart, widthOption = optionsChart.width, heightOption = optionsChart.height, containerBox = chart.getContainerBox(), enableDefaultHeight = containerBox.height <= 1 ||\n ( // #21510, prevent infinite reflow\n !chart.renderTo.parentElement?.style.height &&\n chart.renderTo.style.height === '100%');\n /**\n * The current pixel width of the chart.\n *\n * @name Highcharts.Chart#chartWidth\n * @type {number}\n */\n chart.chartWidth = Math.max(// #1393\n 0, widthOption || containerBox.width || 600 // #1460\n );\n /**\n * The current pixel height of the chart.\n *\n * @name Highcharts.Chart#chartHeight\n * @type {number}\n */\n chart.chartHeight = Math.max(0, Chart_relativeLength(heightOption, chart.chartWidth) ||\n (enableDefaultHeight ? 400 : containerBox.height));\n chart.containerBox = containerBox;\n }\n /**\n * If the renderTo element has no offsetWidth, most likely one or more of\n * its parents are hidden. Loop up the DOM tree to temporarily display the\n * parents, then save the original display properties, and when the true\n * size is retrieved, reset them. Used on first render and on redraws.\n *\n * @private\n * @function Highcharts.Chart#temporaryDisplay\n *\n * @param {boolean} [revert]\n * Revert to the saved original styles.\n */\n temporaryDisplay(revert) {\n let node = this.renderTo, tempStyle;\n if (!revert) {\n while (node && node.style) {\n // When rendering to a detached node, it needs to be temporarily\n // attached in order to read styling and bounding boxes (#5783,\n // #7024).\n if (!Chart_doc.body.contains(node) && !node.parentNode) {\n node.hcOrigDetached = true;\n Chart_doc.body.appendChild(node);\n }\n if (Chart_getStyle(node, 'display', false) === 'none' ||\n node.hcOricDetached) {\n node.hcOrigStyle = {\n display: node.style.display,\n height: node.style.height,\n overflow: node.style.overflow\n };\n tempStyle = {\n display: 'block',\n overflow: 'hidden'\n };\n if (node !== this.renderTo) {\n tempStyle.height = 0;\n }\n Chart_css(node, tempStyle);\n // If it still doesn't have an offset width after setting\n // display to block, it probably has an !important priority\n // #2631, 6803\n if (!node.offsetWidth) {\n node.style.setProperty('display', 'block', 'important');\n }\n }\n node = node.parentNode;\n if (node === Chart_doc.body) {\n break;\n }\n }\n }\n else {\n while (node && node.style) {\n if (node.hcOrigStyle) {\n Chart_css(node, node.hcOrigStyle);\n delete node.hcOrigStyle;\n }\n if (node.hcOrigDetached) {\n Chart_doc.body.removeChild(node);\n node.hcOrigDetached = false;\n }\n node = node.parentNode;\n }\n }\n }\n /**\n * Set the {@link Chart.container|chart container's} class name, in\n * addition to `highcharts-container`.\n *\n * @function Highcharts.Chart#setClassName\n *\n * @param {string} [className]\n * The additional class name.\n */\n setClassName(className) {\n this.container.className = 'highcharts-container ' + (className || '');\n }\n /**\n * Get the containing element, determine the size and create the inner\n * container div to hold the chart.\n *\n * @private\n * @function Highcharts.Chart#afterGetContainer\n * @emits Highcharts.Chart#event:afterGetContainer\n */\n getContainer() {\n const chart = this, options = chart.options, optionsChart = options.chart, indexAttrName = 'data-highcharts-chart', containerId = Chart_uniqueKey(), renderTo = chart.renderTo;\n let containerStyle;\n // If the container already holds a chart, destroy it. The check for\n // hasRendered is there because web pages that are saved to disk from\n // the browser, will preserve the data-highcharts-chart attribute and\n // the SVG contents, but not an interactive chart. So in this case,\n // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n const oldChartIndex = Chart_pInt(Chart_attr(renderTo, indexAttrName));\n if (Chart_isNumber(oldChartIndex) &&\n Chart_charts[oldChartIndex] &&\n Chart_charts[oldChartIndex].hasRendered) {\n Chart_charts[oldChartIndex].destroy();\n }\n // Make a reference to the chart from the div\n Chart_attr(renderTo, indexAttrName, chart.index);\n // Remove previous chart\n renderTo.innerHTML = HTML_AST.emptyHTML;\n // If the container doesn't have an offsetWidth, it has or is a child of\n // a node that has display:none. We need to temporarily move it out to a\n // visible state to determine the size, else the legend and tooltips\n // won't render properly. The skipClone option is used in sparklines as\n // a micro optimization, saving about 1-2 ms each chart.\n if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n chart.temporaryDisplay();\n }\n // Get the width and height\n chart.getChartSize();\n const chartHeight = chart.chartHeight;\n let chartWidth = chart.chartWidth;\n // Allow table cells and flex-boxes to shrink without the chart blocking\n // them out (#6427)\n Chart_css(renderTo, { overflow: 'hidden' });\n // Create the inner container\n if (!chart.styledMode) {\n containerStyle = Chart_extend({\n position: 'relative',\n // Needed for context menu (avoidscrollbars) and content\n // overflow in IE\n overflow: 'hidden',\n width: chartWidth + 'px',\n height: chartHeight + 'px',\n textAlign: 'left',\n lineHeight: 'normal', // #427\n zIndex: 0, // #1072\n '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\n userSelect: 'none', // #13503\n 'touch-action': 'manipulation',\n outline: 'none',\n padding: '0px'\n }, optionsChart.style || {});\n }\n /**\n * The containing HTML element of the chart. The container is\n * dynamically inserted into the element given as the `renderTo`\n * parameter in the {@link Highcharts#chart} constructor.\n *\n * @name Highcharts.Chart#container\n * @type {Highcharts.HTMLDOMElement}\n */\n const container = Chart_createElement('div', {\n id: containerId\n }, containerStyle, renderTo);\n chart.container = container;\n // Adjust width if setting height affected it (#20334)\n chart.getChartSize();\n if (chartWidth !== chart.chartWidth) {\n chartWidth = chart.chartWidth;\n if (!chart.styledMode) {\n Chart_css(container, {\n width: Chart_pick(optionsChart.style?.width, chartWidth + 'px')\n });\n }\n }\n chart.containerBox = chart.getContainerBox();\n // Cache the cursor (#1650)\n chart._cursor = container.style.cursor;\n // Initialize the renderer\n const Renderer = optionsChart.renderer || !Chart_svg ?\n Renderer_RendererRegistry.getRendererType(optionsChart.renderer) :\n SVG_SVGRenderer;\n /**\n * The renderer instance of the chart. Each chart instance has only one\n * associated renderer.\n *\n * @name Highcharts.Chart#renderer\n * @type {Highcharts.SVGRenderer}\n */\n chart.renderer = new Renderer(container, chartWidth, chartHeight, void 0, optionsChart.forExport, options.exporting && options.exporting.allowHTML, chart.styledMode);\n // Set the initial animation from the options\n Chart_setAnimation(void 0, chart);\n chart.setClassName(optionsChart.className);\n if (!chart.styledMode) {\n chart.renderer.setStyle(optionsChart.style);\n }\n else {\n // Initialize definitions\n for (const key in options.defs) { // eslint-disable-line guard-for-in\n this.renderer.definition(options.defs[key]);\n }\n }\n // Add a reference to the charts index\n chart.renderer.chartIndex = chart.index;\n Chart_fireEvent(this, 'afterGetContainer');\n }\n /**\n * Calculate margins by rendering axis labels in a preliminary position.\n * Title, subtitle and legend have already been rendered at this stage, but\n * will be moved into their final positions.\n *\n * @private\n * @function Highcharts.Chart#getMargins\n * @emits Highcharts.Chart#event:getMargins\n */\n getMargins(skipAxes) {\n const { spacing, margin, titleOffset } = this;\n this.resetMargins();\n // Adjust for title and subtitle\n if (titleOffset[0] && !Chart_defined(margin[0])) {\n this.plotTop = Math.max(this.plotTop, titleOffset[0] + spacing[0]);\n }\n if (titleOffset[2] && !Chart_defined(margin[2])) {\n this.marginBottom = Math.max(this.marginBottom, titleOffset[2] + spacing[2]);\n }\n // Adjust for legend\n if (this.legend && this.legend.display) {\n this.legend.adjustMargins(margin, spacing);\n }\n Chart_fireEvent(this, 'getMargins');\n if (!skipAxes) {\n this.getAxisMargins();\n }\n }\n /**\n * @private\n * @function Highcharts.Chart#getAxisMargins\n */\n getAxisMargins() {\n const chart = this, \n // [top, right, bottom, left]\n axisOffset = chart.axisOffset = [0, 0, 0, 0], colorAxis = chart.colorAxis, margin = chart.margin, getOffset = function (axes) {\n axes.forEach(function (axis) {\n if (axis.visible) {\n axis.getOffset();\n }\n });\n };\n // Pre-render axes to get labels offset width\n if (chart.hasCartesianSeries) {\n getOffset(chart.axes);\n }\n else if (colorAxis && colorAxis.length) {\n getOffset(colorAxis);\n }\n // Add the axis offsets\n Chart_marginNames.forEach(function (m, side) {\n if (!Chart_defined(margin[side])) {\n chart[m] += axisOffset[side];\n }\n });\n chart.setChartSize();\n }\n /**\n * Return the current options of the chart, but only those that differ from\n * default options. Items that can be either an object or an array of\n * objects, like `series`, `xAxis` and `yAxis`, are always returned as\n * array.\n *\n * @sample highcharts/members/chart-getoptions\n *\n * @function Highcharts.Chart#getOptions\n *\n * @since 11.1.0\n */\n getOptions() {\n return Chart_diffObjects(this.userOptions, Chart_defaultOptions);\n }\n /**\n * Reflows the chart to its container. By default, the Resize Observer is\n * attached to the chart's div which allows to reflows the chart\n * automatically to its container, as per the\n * [chart.reflow](https://api.highcharts.com/highcharts/chart.reflow)\n * option.\n *\n * @sample highcharts/chart/events-container/\n * Pop up and reflow\n *\n * @function Highcharts.Chart#reflow\n *\n * @param {global.Event} [e]\n * Event arguments. Used primarily when the function is called\n * internally as a response to window resize.\n */\n reflow(e) {\n const chart = this, oldBox = chart.containerBox, containerBox = chart.getContainerBox();\n delete chart.pointer?.chartPosition;\n // Width and height checks for display:none. Target is doc in Opera\n // and win in Firefox, Chrome and IE9.\n if (!chart.isPrinting &&\n !chart.isResizing &&\n oldBox &&\n // When fired by resize observer inside hidden container\n containerBox.width) {\n if (containerBox.width !== oldBox.width ||\n containerBox.height !== oldBox.height) {\n Core_Utilities.clearTimeout(chart.reflowTimeout);\n // When called from window.resize, e is set, else it's called\n // directly (#2224)\n chart.reflowTimeout = Chart_syncTimeout(function () {\n // Set size, it may have been destroyed in the meantime\n // (#1257)\n if (chart.container) {\n chart.setSize(void 0, void 0, false);\n }\n }, e ? 100 : 0);\n }\n chart.containerBox = containerBox;\n }\n }\n /**\n * Toggle the event handlers necessary for auto resizing, depending on the\n * `chart.reflow` option.\n *\n * @private\n * @function Highcharts.Chart#setReflow\n */\n setReflow() {\n const chart = this;\n const runReflow = (e) => {\n if (chart.options?.chart.reflow && chart.hasLoaded) {\n chart.reflow(e);\n }\n };\n if (typeof ResizeObserver === 'function') {\n (new ResizeObserver(runReflow)).observe(chart.renderTo);\n // Fallback for more legacy browser versions.\n }\n else {\n const unbind = Chart_addEvent(Chart_win, 'resize', runReflow);\n Chart_addEvent(this, 'destroy', unbind);\n }\n }\n /**\n * Resize the chart to a given width and height. In order to set the width\n * only, the height argument may be skipped. To set the height only, pass\n * `undefined` for the width.\n *\n * @sample highcharts/members/chart-setsize-button/\n * Test resizing from buttons\n * @sample highcharts/members/chart-setsize-jquery-resizable/\n * Add a jQuery UI resizable\n * @sample stock/members/chart-setsize/\n * Highcharts Stock with UI resizable\n *\n * @function Highcharts.Chart#setSize\n *\n * @param {number|null} [width]\n * The new pixel width of the chart. Since v4.2.6, the argument can\n * be `undefined` in order to preserve the current value (when\n * setting height only), or `null` to adapt to the width of the\n * containing element.\n *\n * @param {number|null} [height]\n * The new pixel height of the chart. Since v4.2.6, the argument can\n * be `undefined` in order to preserve the current value, or `null`\n * in order to adapt to the height of the containing element.\n *\n * @param {boolean|Partial} [animation]\n * Whether and how to apply animation. When `undefined`, it applies\n * the animation that is set in the `chart.animation` option.\n *\n *\n * @emits Highcharts.Chart#event:endResize\n * @emits Highcharts.Chart#event:resize\n */\n setSize(width, height, animation) {\n const chart = this, renderer = chart.renderer;\n // Handle the isResizing counter\n chart.isResizing += 1;\n // Set the animation for the current process\n Chart_setAnimation(animation, chart);\n const globalAnimation = renderer.globalAnimation;\n chart.oldChartHeight = chart.chartHeight;\n chart.oldChartWidth = chart.chartWidth;\n if (typeof width !== 'undefined') {\n chart.options.chart.width = width;\n }\n if (typeof height !== 'undefined') {\n chart.options.chart.height = height;\n }\n chart.getChartSize();\n const { chartWidth, chartHeight, scrollablePixelsX = 0, scrollablePixelsY = 0 } = chart;\n // Avoid expensive redrawing if the computed size didn't change\n if (chart.isDirtyBox ||\n chartWidth !== chart.oldChartWidth ||\n chartHeight !== chart.oldChartHeight) {\n // Resize the container with the global animation applied if enabled\n // (#2503)\n if (!chart.styledMode) {\n (globalAnimation ? Chart_animate : Chart_css)(chart.container, {\n width: `${chartWidth + scrollablePixelsX}px`,\n height: `${chartHeight + scrollablePixelsY}px`\n }, globalAnimation);\n }\n chart.setChartSize(true);\n renderer.setSize(chartWidth, chartHeight, globalAnimation);\n // Handle axes\n chart.axes.forEach(function (axis) {\n axis.isDirty = true;\n axis.setScale();\n });\n chart.isDirtyLegend = true; // Force legend redraw\n chart.isDirtyBox = true; // Force redraw of plot and chart border\n chart.layOutTitles(); // #2857\n chart.getMargins();\n chart.redraw(globalAnimation);\n chart.oldChartHeight = void 0;\n Chart_fireEvent(chart, 'resize');\n // Fire endResize and set isResizing back. If animation is disabled,\n // fire without delay, but in a new thread to avoid triggering the\n // resize observer (#19027).\n setTimeout(() => {\n if (chart) {\n Chart_fireEvent(chart, 'endResize');\n }\n }, Chart_animObject(globalAnimation).duration);\n }\n // Handle resizing counter even if we've re-rendered or not (#20548).\n chart.isResizing -= 1;\n }\n /**\n * Set the public chart properties. This is done before and after the\n * pre-render to determine margin sizes.\n *\n * @private\n * @function Highcharts.Chart#setChartSize\n * @emits Highcharts.Chart#event:afterSetChartSize\n */\n setChartSize(skipAxes) {\n const chart = this, { chartHeight, chartWidth, inverted, spacing, renderer } = chart, clipOffset = chart.clipOffset, clipRoundFunc = Math[inverted ? 'floor' : 'round'];\n let plotLeft, plotTop, plotWidth, plotHeight;\n /**\n * The current left position of the plot area in pixels.\n *\n * @name Highcharts.Chart#plotLeft\n * @type {number}\n */\n chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n /**\n * The current top position of the plot area in pixels.\n *\n * @name Highcharts.Chart#plotTop\n * @type {number}\n */\n chart.plotTop = plotTop = Math.round(chart.plotTop);\n /**\n * The current width of the plot area in pixels.\n *\n * @name Highcharts.Chart#plotWidth\n * @type {number}\n */\n chart.plotWidth = plotWidth = Math.max(0, Math.round(chartWidth - plotLeft - chart.marginRight));\n /**\n * The current height of the plot area in pixels.\n *\n * @name Highcharts.Chart#plotHeight\n * @type {number}\n */\n chart.plotHeight = plotHeight = Math.max(0, Math.round(chartHeight - plotTop - chart.marginBottom));\n chart.plotSizeX = inverted ? plotHeight : plotWidth;\n chart.plotSizeY = inverted ? plotWidth : plotHeight;\n // Set boxes used for alignment\n chart.spacingBox = renderer.spacingBox = {\n x: spacing[3],\n y: spacing[0],\n width: chartWidth - spacing[3] - spacing[1],\n height: chartHeight - spacing[0] - spacing[2]\n };\n chart.plotBox = renderer.plotBox = {\n x: plotLeft,\n y: plotTop,\n width: plotWidth,\n height: plotHeight\n };\n // Compute the clipping box\n if (clipOffset) {\n chart.clipBox = {\n x: clipRoundFunc(clipOffset[3]),\n y: clipRoundFunc(clipOffset[0]),\n width: clipRoundFunc(chart.plotSizeX - clipOffset[1] - clipOffset[3]),\n height: clipRoundFunc(chart.plotSizeY - clipOffset[0] - clipOffset[2])\n };\n }\n if (!skipAxes) {\n chart.axes.forEach(function (axis) {\n axis.setAxisSize();\n axis.setAxisTranslation();\n });\n renderer.alignElements();\n }\n Chart_fireEvent(chart, 'afterSetChartSize', { skipAxes: skipAxes });\n }\n /**\n * Initial margins before auto size margins are applied.\n *\n * @private\n * @function Highcharts.Chart#resetMargins\n */\n resetMargins() {\n Chart_fireEvent(this, 'resetMargins');\n const chart = this, chartOptions = chart.options.chart, plotBorderWidth = chartOptions.plotBorderWidth || 0, halfWidth = plotBorderWidth / 2;\n // Create margin and spacing array\n ['margin', 'spacing'].forEach(function splashArrays(target) {\n const value = chartOptions[target], values = Chart_isObject(value) ? value : [value, value, value, value];\n [\n 'Top',\n 'Right',\n 'Bottom',\n 'Left'\n ].forEach(function (sideName, side) {\n chart[target][side] = Chart_pick(chartOptions[target + sideName], values[side]);\n });\n });\n // Set margin names like chart.plotTop, chart.plotLeft,\n // chart.marginRight, chart.marginBottom.\n Chart_marginNames.forEach(function (m, side) {\n chart[m] = Chart_pick(chart.margin[side], chart.spacing[side]);\n });\n chart.axisOffset = [0, 0, 0, 0]; // Top, right, bottom, left\n chart.clipOffset = [\n halfWidth,\n halfWidth,\n halfWidth,\n halfWidth\n ];\n chart.plotBorderWidth = plotBorderWidth;\n }\n /**\n * Internal function to draw or redraw the borders and backgrounds for chart\n * and plot area.\n *\n * @private\n * @function Highcharts.Chart#drawChartBox\n * @emits Highcharts.Chart#event:afterDrawChartBox\n */\n drawChartBox() {\n const chart = this, optionsChart = chart.options.chart, renderer = chart.renderer, chartWidth = chart.chartWidth, chartHeight = chart.chartHeight, styledMode = chart.styledMode, plotBGImage = chart.plotBGImage, chartBackgroundColor = optionsChart.backgroundColor, plotBackgroundColor = optionsChart.plotBackgroundColor, plotBackgroundImage = optionsChart.plotBackgroundImage, plotLeft = chart.plotLeft, plotTop = chart.plotTop, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, plotBox = chart.plotBox, clipRect = chart.clipRect, clipBox = chart.clipBox;\n let chartBackground = chart.chartBackground, plotBackground = chart.plotBackground, plotBorder = chart.plotBorder, chartBorderWidth, mgn, bgAttr, verb = 'animate';\n // Chart area\n if (!chartBackground) {\n chart.chartBackground = chartBackground = renderer.rect()\n .addClass('highcharts-background')\n .add();\n verb = 'attr';\n }\n if (!styledMode) {\n // Presentational\n chartBorderWidth = optionsChart.borderWidth || 0;\n mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n bgAttr = {\n fill: chartBackgroundColor || 'none'\n };\n if (chartBorderWidth || chartBackground['stroke-width']) { // #980\n bgAttr.stroke = optionsChart.borderColor;\n bgAttr['stroke-width'] = chartBorderWidth;\n }\n chartBackground\n .attr(bgAttr)\n .shadow(optionsChart.shadow);\n }\n else {\n chartBorderWidth = mgn = chartBackground.strokeWidth();\n }\n chartBackground[verb]({\n x: mgn / 2,\n y: mgn / 2,\n width: chartWidth - mgn - chartBorderWidth % 2,\n height: chartHeight - mgn - chartBorderWidth % 2,\n r: optionsChart.borderRadius\n });\n // Plot background\n verb = 'animate';\n if (!plotBackground) {\n verb = 'attr';\n chart.plotBackground = plotBackground = renderer.rect()\n .addClass('highcharts-plot-background')\n .add();\n }\n plotBackground[verb](plotBox);\n if (!styledMode) {\n // Presentational attributes for the background\n plotBackground\n .attr({\n fill: plotBackgroundColor || 'none'\n })\n .shadow(optionsChart.plotShadow);\n // Create the background image\n if (plotBackgroundImage) {\n if (!plotBGImage) {\n chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight).add();\n }\n else {\n if (plotBackgroundImage !== plotBGImage.attr('href')) {\n plotBGImage.attr('href', plotBackgroundImage);\n }\n plotBGImage.animate(plotBox);\n }\n }\n }\n // Plot clip\n if (!clipRect) {\n chart.clipRect = renderer.clipRect(clipBox);\n }\n else {\n clipRect.animate({\n width: clipBox.width,\n height: clipBox.height\n });\n }\n // Plot area border\n verb = 'animate';\n if (!plotBorder) {\n verb = 'attr';\n chart.plotBorder = plotBorder = renderer.rect()\n .addClass('highcharts-plot-border')\n .attr({\n zIndex: 1 // Above the grid\n })\n .add();\n }\n if (!styledMode) {\n // Presentational\n plotBorder.attr({\n stroke: optionsChart.plotBorderColor,\n 'stroke-width': optionsChart.plotBorderWidth || 0,\n fill: 'none'\n });\n }\n plotBorder[verb](plotBorder.crisp({\n x: plotLeft,\n y: plotTop,\n width: plotWidth,\n height: plotHeight\n }, -plotBorder.strokeWidth())); // #3282 plotBorder should be negative;\n // reset\n chart.isDirtyBox = false;\n Chart_fireEvent(this, 'afterDrawChartBox');\n }\n /**\n * Detect whether a certain chart property is needed based on inspecting its\n * options and series. This mainly applies to the chart.inverted property,\n * and in extensions to the chart.angular and chart.polar properties.\n *\n * @private\n * @function Highcharts.Chart#propFromSeries\n */\n propFromSeries() {\n const chart = this, optionsChart = chart.options.chart, seriesOptions = chart.options.series;\n let i, klass, value;\n /**\n * The flag is set to `true` if a series of the chart is inverted.\n *\n * @name Highcharts.Chart#inverted\n * @type {boolean|undefined}\n */\n ['inverted', 'angular', 'polar'].forEach(function (key) {\n // The default series type's class\n klass = Chart_seriesTypes[optionsChart.type];\n // Get the value from available chart-wide properties\n value =\n // It is set in the options:\n optionsChart[key] ||\n // The default series class:\n (klass && klass.prototype[key]);\n // Requires it\n // 4. Check if any the chart's series require it\n i = seriesOptions && seriesOptions.length;\n while (!value && i--) {\n klass = Chart_seriesTypes[seriesOptions[i].type];\n if (klass && klass.prototype[key]) {\n value = true;\n }\n }\n // Set the chart property\n chart[key] = value;\n });\n }\n /**\n * Internal function to link two or more series together, based on the\n * `linkedTo` option. This is done from `Chart.render`, and after\n * `Chart.addSeries` and `Series.remove`.\n *\n * @private\n * @function Highcharts.Chart#linkSeries\n * @emits Highcharts.Chart#event:afterLinkSeries\n */\n linkSeries(isUpdating) {\n const chart = this, chartSeries = chart.series;\n // Reset links\n chartSeries.forEach(function (series) {\n series.linkedSeries.length = 0;\n });\n // Apply new links\n chartSeries.forEach(function (series) {\n const { linkedTo } = series.options;\n if (Chart_isString(linkedTo)) {\n let linkedParent;\n if (linkedTo === ':previous') {\n linkedParent = chart.series[series.index - 1];\n }\n else {\n linkedParent = chart.get(linkedTo);\n }\n // #3341 avoid mutual linking\n if (linkedParent &&\n linkedParent.linkedParent !== series) {\n linkedParent.linkedSeries.push(series);\n /**\n * The parent series of the current series, if the current\n * series has a [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n * setting.\n *\n * @name Highcharts.Series#linkedParent\n * @type {Highcharts.Series}\n * @readonly\n */\n series.linkedParent = linkedParent;\n if (linkedParent.enabledDataSorting) {\n series.setDataSortingOptions();\n }\n series.visible = Chart_pick(series.options.visible, linkedParent.options.visible, series.visible); // #3879\n }\n }\n });\n Chart_fireEvent(this, 'afterLinkSeries', { isUpdating });\n }\n /**\n * Render series for the chart.\n *\n * @private\n * @function Highcharts.Chart#renderSeries\n */\n renderSeries() {\n this.series.forEach(function (serie) {\n serie.translate();\n serie.render();\n });\n }\n /**\n * Render all graphics for the chart. Runs internally on initialization.\n *\n * @private\n * @function Highcharts.Chart#render\n */\n render() {\n const chart = this, axes = chart.axes, colorAxis = chart.colorAxis, renderer = chart.renderer, axisLayoutRuns = chart.options.chart.axisLayoutRuns || 2, renderAxes = (axes) => {\n axes.forEach((axis) => {\n if (axis.visible) {\n axis.render();\n }\n });\n };\n let expectedSpace = 0, // Correction for X axis labels\n // If the plot area size has changed significantly, calculate tick\n // positions again\n redoHorizontal = true, redoVertical, run = 0;\n // Title\n chart.setTitle();\n // Fire an event before the margins are computed. This is where the\n // legend is assigned.\n Chart_fireEvent(chart, 'beforeMargins');\n // Get stacks\n chart.getStacks?.();\n // Get chart margins\n chart.getMargins(true);\n chart.setChartSize();\n for (const axis of axes) {\n const { options } = axis, { labels } = options;\n if (chart.hasCartesianSeries && // #20948\n axis.horiz &&\n axis.visible &&\n labels.enabled &&\n axis.series.length &&\n axis.coll !== 'colorAxis' &&\n !chart.polar) {\n expectedSpace = options.tickLength;\n axis.createGroups();\n // Calculate expected space based on dummy tick\n const mockTick = new Axis_Tick(axis, 0, '', true), label = mockTick.createLabel('x', labels);\n mockTick.destroy();\n if (label &&\n Chart_pick(labels.reserveSpace, !Chart_isNumber(options.crossing))) {\n expectedSpace = label.getBBox().height +\n labels.distance +\n Math.max(options.offset || 0, 0);\n }\n if (expectedSpace) {\n label?.destroy();\n break;\n }\n }\n }\n // Use Math.max to prevent negative plotHeight\n chart.plotHeight = Math.max(chart.plotHeight - expectedSpace, 0);\n while ((redoHorizontal || redoVertical || axisLayoutRuns > 1) &&\n run < axisLayoutRuns // #19794\n ) {\n const tempWidth = chart.plotWidth, tempHeight = chart.plotHeight;\n for (const axis of axes) {\n if (run === 0) {\n // Get margins by pre-rendering axes\n axis.setScale();\n }\n else if ((axis.horiz && redoHorizontal) ||\n (!axis.horiz && redoVertical)) {\n // Update to reflect the new margins\n axis.setTickInterval(true);\n }\n }\n if (run === 0) {\n chart.getAxisMargins();\n }\n else {\n // Check again for new, rotated or moved labels\n chart.getMargins();\n }\n redoHorizontal = (tempWidth / chart.plotWidth) > (run ? 1 : 1.1);\n redoVertical = (tempHeight / chart.plotHeight) > (run ? 1 : 1.05);\n run++;\n }\n // Draw the borders and backgrounds\n chart.drawChartBox();\n // Axes\n if (chart.hasCartesianSeries) {\n renderAxes(axes);\n }\n else if (colorAxis && colorAxis.length) {\n renderAxes(colorAxis);\n }\n // The series\n if (!chart.seriesGroup) {\n chart.seriesGroup = renderer.g('series-group')\n .attr({ zIndex: 3 })\n .shadow(chart.options.chart.seriesGroupShadow)\n .add();\n }\n chart.renderSeries();\n // Credits\n chart.addCredits();\n // Handle responsiveness\n if (chart.setResponsive) {\n chart.setResponsive();\n }\n // Set flag\n chart.hasRendered = true;\n }\n /**\n * Set a new credits label for the chart.\n *\n * @sample highcharts/credits/credits-update/\n * Add and update credits\n *\n * @function Highcharts.Chart#addCredits\n *\n * @param {Highcharts.CreditsOptions} [credits]\n * A configuration object for the new credits.\n */\n addCredits(credits) {\n const chart = this, creds = Chart_merge(true, this.options.credits, credits);\n if (creds.enabled && !this.credits) {\n /**\n * The chart's credits label. The label has an `update` method that\n * allows setting new options as per the\n * [credits options set](https://api.highcharts.com/highcharts/credits).\n *\n * @name Highcharts.Chart#credits\n * @type {Highcharts.SVGElement}\n */\n this.credits = this.renderer.text(creds.text + (this.mapCredits || ''), 0, 0)\n .addClass('highcharts-credits')\n .on('click', function () {\n if (creds.href) {\n Chart_win.location.href = creds.href;\n }\n })\n .attr({\n align: creds.position.align,\n zIndex: 8\n });\n if (!chart.styledMode) {\n this.credits.css(creds.style);\n }\n this.credits\n .add()\n .align(creds.position);\n // Dynamically update\n this.credits.update = function (options) {\n chart.credits = chart.credits.destroy();\n chart.addCredits(options);\n };\n }\n }\n /**\n * Remove the chart and purge memory. This method is called internally\n * before adding a second chart into the same container, as well as on\n * window unload to prevent leaks.\n *\n * @sample highcharts/members/chart-destroy/\n * Destroy the chart from a button\n * @sample stock/members/chart-destroy/\n * Destroy with Highcharts Stock\n *\n * @function Highcharts.Chart#destroy\n *\n * @emits Highcharts.Chart#event:destroy\n */\n destroy() {\n const chart = this, axes = chart.axes, series = chart.series, container = chart.container, parentNode = container && container.parentNode;\n let i;\n // Fire the chart.destroy event\n Chart_fireEvent(chart, 'destroy');\n // Delete the chart from charts lookup array\n if (chart.renderer.forExport) {\n Chart_erase(Chart_charts, chart); // #6569\n }\n else {\n Chart_charts[chart.index] = void 0;\n }\n Core_Globals.chartCount--;\n chart.renderTo.removeAttribute('data-highcharts-chart');\n // Remove events\n Chart_removeEvent(chart);\n // ==== Destroy collections:\n // Destroy axes\n i = axes.length;\n while (i--) {\n axes[i] = axes[i].destroy();\n }\n // Destroy scroller & scroller series before destroying base series\n if (this.scroller && this.scroller.destroy) {\n this.scroller.destroy();\n }\n // Destroy each series\n i = series.length;\n while (i--) {\n series[i] = series[i].destroy();\n }\n // ==== Destroy chart properties:\n [\n 'title', 'subtitle', 'chartBackground', 'plotBackground',\n 'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n 'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n 'renderer'\n ].forEach(function (name) {\n const prop = chart[name];\n if (prop && prop.destroy) {\n chart[name] = prop.destroy();\n }\n });\n // Remove container and all SVG, check container as it can break in IE\n // when destroyed before finished loading\n if (container) {\n container.innerHTML = HTML_AST.emptyHTML;\n Chart_removeEvent(container);\n if (parentNode) {\n Chart_discardElement(container);\n }\n }\n // Clean it all up\n Chart_objectEach(chart, function (val, key) {\n delete chart[key];\n });\n }\n /**\n * Prepare for first rendering after all data are loaded.\n *\n * @private\n * @function Highcharts.Chart#firstRender\n * @emits Highcharts.Chart#event:beforeRender\n */\n firstRender() {\n const chart = this, options = chart.options;\n // Create the container\n chart.getContainer();\n chart.resetMargins();\n chart.setChartSize();\n // Set the common chart properties (mainly invert) from the given series\n chart.propFromSeries();\n // Get axes\n chart.createAxes();\n // Initialize the series\n const series = Chart_isArray(options.series) ? options.series : [];\n options.series = []; // Avoid mutation\n series.forEach(\n // #9680\n function (serieOptions) {\n chart.initSeries(serieOptions);\n });\n chart.linkSeries();\n chart.setSortedData();\n // Run an event after axes and series are initialized, but before\n // render. At this stage, the series data is indexed and cached in the\n // xData and yData arrays, so we can access those before rendering. Used\n // in Highcharts Stock.\n Chart_fireEvent(chart, 'beforeRender');\n chart.render();\n chart.pointer?.getChartPosition(); // #14973\n // Fire the load event if there are no external images\n if (!chart.renderer.imgCount && !chart.hasLoaded) {\n chart.onload();\n }\n // If the chart was rendered outside the top container, put it back in\n // (#3679)\n chart.temporaryDisplay(true);\n }\n /**\n * Internal function that runs on chart load, async if any images are loaded\n * in the chart. Runs the callbacks and triggers the `load` and `render`\n * events.\n *\n * @private\n * @function Highcharts.Chart#onload\n * @emits Highcharts.Chart#event:load\n * @emits Highcharts.Chart#event:render\n */\n onload() {\n // Run callbacks, first the ones registered by modules, then user's one\n this.callbacks.concat([this.callback]).forEach(function (fn) {\n // Chart destroyed in its own callback (#3600)\n if (fn && typeof this.index !== 'undefined') {\n fn.apply(this, [this]);\n }\n }, this);\n Chart_fireEvent(this, 'load');\n Chart_fireEvent(this, 'render');\n // Set up auto resize, check for not destroyed (#6068)\n if (Chart_defined(this.index)) {\n this.setReflow();\n }\n this.warnIfA11yModuleNotLoaded();\n // Don't run again\n this.hasLoaded = true;\n }\n /**\n * Emit console warning if the a11y module is not loaded.\n * @private\n */\n warnIfA11yModuleNotLoaded() {\n const { options, title } = this;\n if (options && !this.accessibility) {\n // Make chart behave as an image with the title as alt text\n this.renderer.boxWrapper.attr({\n role: 'img',\n 'aria-label': ((title && title.element.textContent) || ''\n // #17753, < is not allowed in SVG attributes\n ).replace(/} [animation]\n * Whether to apply animation, and optionally animation\n * configuration. When `undefined`, it applies the animation that is\n * set in the `chart.animation` option.\n *\n * @return {Highcharts.Series}\n * The newly created series object.\n *\n * @emits Highcharts.Chart#event:addSeries\n * @emits Highcharts.Chart#event:afterAddSeries\n */\n addSeries(options, redraw, animation) {\n const chart = this;\n let series;\n if (options) { // <- not necessary\n redraw = Chart_pick(redraw, true); // Defaults to true\n Chart_fireEvent(chart, 'addSeries', { options: options }, function () {\n series = chart.initSeries(options);\n chart.isDirtyLegend = true;\n chart.linkSeries();\n if (series.enabledDataSorting) {\n // We need to call `setData` after `linkSeries`\n series.setData(options.data, false);\n }\n Chart_fireEvent(chart, 'afterAddSeries', { series: series });\n if (redraw) {\n chart.redraw(animation);\n }\n });\n }\n return series;\n }\n /**\n * Add an axis to the chart after render time. Note that this method should\n * never be used when adding data synchronously at chart render time, as it\n * adds expense to the calculations and rendering. When adding data at the\n * same time as the chart is initialized, add the axis as a configuration\n * option instead.\n *\n * @sample highcharts/members/chart-addaxis/\n * Add and remove axes\n *\n * @function Highcharts.Chart#addAxis\n *\n * @param {Highcharts.AxisOptions} options\n * The axis options.\n *\n * @param {boolean} [isX=false]\n * Whether it is an X axis or a value axis.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after adding.\n *\n * @param {boolean|Partial} [animation]\n * Whether and how to apply animation in the redraw. When\n * `undefined`, it applies the animation that is set in the\n * `chart.animation` option.\n *\n * @return {Highcharts.Axis}\n * The newly generated Axis object.\n */\n addAxis(options, isX, redraw, animation) {\n return this.createAxis(isX ? 'xAxis' : 'yAxis', { axis: options, redraw: redraw, animation: animation });\n }\n /**\n * Add a color axis to the chart after render time. Note that this method\n * should never be used when adding data synchronously at chart render time,\n * as it adds expense to the calculations and rendering. When adding data at\n * the same time as the chart is initialized, add the axis as a\n * configuration option instead.\n *\n * @sample highcharts/members/chart-addaxis/\n * Add and remove axes\n *\n * @function Highcharts.Chart#addColorAxis\n *\n * @param {Highcharts.ColorAxisOptions} options\n * The axis options.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after adding.\n *\n * @param {boolean|Partial} [animation]\n * Whether and how to apply animation in the redraw. When\n * `undefined`, it applies the animation that is set in the\n * `chart.animation` option.\n *\n * @return {Highcharts.Axis}\n * The newly generated Axis object.\n */\n addColorAxis(options, redraw, animation) {\n return this.createAxis('colorAxis', { axis: options, redraw: redraw, animation: animation });\n }\n /**\n * Factory for creating different axis types.\n *\n * @private\n * @function Highcharts.Chart#createAxis\n *\n * @param {string} coll\n * An axis type.\n *\n * @param {...Array<*>} arguments\n * All arguments for the constructor.\n *\n * @return {Highcharts.Axis}\n * The newly generated Axis object.\n */\n createAxis(coll, options) {\n const axis = new Axis_Axis(this, options.axis, coll);\n if (Chart_pick(options.redraw, true)) {\n this.redraw(options.animation);\n }\n return axis;\n }\n /**\n * Dim the chart and show a loading text or symbol. Options for the loading\n * screen are defined in {@link\n * https://api.highcharts.com/highcharts/loading|the loading options}.\n *\n * @sample highcharts/members/chart-hideloading/\n * Show and hide loading from a button\n * @sample highcharts/members/chart-showloading/\n * Apply different text labels\n * @sample stock/members/chart-show-hide-loading/\n * Toggle loading in Highcharts Stock\n *\n * @function Highcharts.Chart#showLoading\n *\n * @param {string} [str]\n * An optional text to show in the loading label instead of the\n * default one. The default text is set in\n * [lang.loading](https://api.highcharts.com/highcharts/lang.loading).\n */\n showLoading(str) {\n const chart = this, options = chart.options, loadingOptions = options.loading, setLoadingSize = function () {\n if (loadingDiv) {\n Chart_css(loadingDiv, {\n left: chart.plotLeft + 'px',\n top: chart.plotTop + 'px',\n width: chart.plotWidth + 'px',\n height: chart.plotHeight + 'px'\n });\n }\n };\n let loadingDiv = chart.loadingDiv, loadingSpan = chart.loadingSpan;\n // Create the layer at the first call\n if (!loadingDiv) {\n chart.loadingDiv = loadingDiv = Chart_createElement('div', {\n className: 'highcharts-loading highcharts-loading-hidden'\n }, null, chart.container);\n }\n if (!loadingSpan) {\n chart.loadingSpan = loadingSpan = Chart_createElement('span', { className: 'highcharts-loading-inner' }, null, loadingDiv);\n Chart_addEvent(chart, 'redraw', setLoadingSize); // #1080\n }\n loadingDiv.className = 'highcharts-loading';\n // Update text\n HTML_AST.setElementHTML(loadingSpan, Chart_pick(str, options.lang.loading, ''));\n if (!chart.styledMode) {\n // Update visuals\n Chart_css(loadingDiv, Chart_extend(loadingOptions.style, {\n zIndex: 10\n }));\n Chart_css(loadingSpan, loadingOptions.labelStyle);\n // Show it\n if (!chart.loadingShown) {\n Chart_css(loadingDiv, {\n opacity: 0,\n display: ''\n });\n Chart_animate(loadingDiv, {\n opacity: loadingOptions.style.opacity || 0.5\n }, {\n duration: loadingOptions.showDuration || 0\n });\n }\n }\n chart.loadingShown = true;\n setLoadingSize();\n }\n /**\n * Hide the loading layer.\n *\n * @see Highcharts.Chart#showLoading\n *\n * @sample highcharts/members/chart-hideloading/\n * Show and hide loading from a button\n * @sample stock/members/chart-show-hide-loading/\n * Toggle loading in Highcharts Stock\n *\n * @function Highcharts.Chart#hideLoading\n */\n hideLoading() {\n const options = this.options, loadingDiv = this.loadingDiv;\n if (loadingDiv) {\n loadingDiv.className =\n 'highcharts-loading highcharts-loading-hidden';\n if (!this.styledMode) {\n Chart_animate(loadingDiv, {\n opacity: 0\n }, {\n duration: options.loading.hideDuration || 100,\n complete: function () {\n Chart_css(loadingDiv, { display: 'none' });\n }\n });\n }\n }\n this.loadingShown = false;\n }\n /**\n * A generic function to update any element of the chart. Elements can be\n * enabled and disabled, moved, re-styled, re-formatted etc.\n *\n * A special case is configuration objects that take arrays, for example\n * [xAxis](https://api.highcharts.com/highcharts/xAxis),\n * [yAxis](https://api.highcharts.com/highcharts/yAxis) or\n * [series](https://api.highcharts.com/highcharts/series). For these\n * collections, an `id` option is used to map the new option set to an\n * existing object. If an existing object of the same id is not found, the\n * corresponding item is updated. So for example, running `chart.update`\n * with a series item without an id, will cause the existing chart's series\n * with the same index in the series array to be updated. When the\n * `oneToOne` parameter is true, `chart.update` will also take care of\n * adding and removing items from the collection. Read more under the\n * parameter description below.\n *\n * Note that when changing series data, `chart.update` may mutate the passed\n * data options.\n *\n * See also the\n * [responsive option set](https://api.highcharts.com/highcharts/responsive).\n * Switching between `responsive.rules` basically runs `chart.update` under\n * the hood.\n *\n * @sample highcharts/members/chart-update/\n * Update chart geometry\n *\n * @function Highcharts.Chart#update\n *\n * @param {Highcharts.Options} options\n * A configuration object for the new chart options.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart.\n *\n * @param {boolean} [oneToOne=false]\n * When `true`, the `series`, `xAxis`, `yAxis` and `annotations`\n * collections will be updated one to one, and items will be either\n * added or removed to match the new updated options. For example,\n * if the chart has two series and we call `chart.update` with a\n * configuration containing three series, one will be added. If we\n * call `chart.update` with one series, one will be removed. Setting\n * an empty `series` array will remove all series, but leaving out\n * the`series` property will leave all series untouched. If the\n * series have id's, the new series options will be matched by id,\n * and the remaining ones removed.\n *\n * @param {boolean|Partial} [animation]\n * Whether to apply animation, and optionally animation\n * configuration. When `undefined`, it applies the animation that is\n * set in the `chart.animation` option.\n *\n * @emits Highcharts.Chart#event:update\n * @emits Highcharts.Chart#event:afterUpdate\n */\n update(options, redraw, oneToOne, animation) {\n const chart = this, adders = {\n credits: 'addCredits',\n title: 'setTitle',\n subtitle: 'setSubtitle',\n caption: 'setCaption'\n }, isResponsiveOptions = options.isResponsiveOptions, itemsForRemoval = [];\n let updateAllAxes, updateAllSeries, runSetSize;\n Chart_fireEvent(chart, 'update', { options: options });\n // If there are responsive rules in action, undo the responsive rules\n // before we apply the updated options and replay the responsive rules\n // on top from the chart.redraw function (#9617).\n if (!isResponsiveOptions) {\n chart.setResponsive(false, true);\n }\n options = Chart_diffObjects(options, chart.options);\n chart.userOptions = Chart_merge(chart.userOptions, options);\n // If the top-level chart option is present, some special updates are\n // required\n const optionsChart = options.chart;\n if (optionsChart) {\n Chart_merge(true, chart.options.chart, optionsChart);\n // Add support for deprecated zooming options like zoomType, #17861\n this.setZoomOptions();\n // Setter function\n if ('className' in optionsChart) {\n chart.setClassName(optionsChart.className);\n }\n if ('inverted' in optionsChart ||\n 'polar' in optionsChart ||\n 'type' in optionsChart) {\n // Parse options.chart.inverted and options.chart.polar together\n // with the available series.\n chart.propFromSeries();\n updateAllAxes = true;\n }\n if ('alignTicks' in optionsChart) { // #6452\n updateAllAxes = true;\n }\n if ('events' in optionsChart) {\n // Chart event handlers\n Chart_registerEventOptions(this, optionsChart);\n }\n Chart_objectEach(optionsChart, function (val, key) {\n if (chart.propsRequireUpdateSeries.indexOf('chart.' + key) !==\n -1) {\n updateAllSeries = true;\n }\n // Only dirty box\n if (chart.propsRequireDirtyBox.indexOf(key) !== -1) {\n chart.isDirtyBox = true;\n }\n // Chart setSize\n if (chart.propsRequireReflow.indexOf(key) !== -1) {\n chart.isDirtyBox = true;\n if (!isResponsiveOptions) {\n runSetSize = true;\n }\n }\n });\n if (!chart.styledMode && optionsChart.style) {\n chart.renderer.setStyle(chart.options.chart.style || {});\n }\n }\n // Moved up, because tooltip needs updated plotOptions (#6218)\n if (!chart.styledMode && options.colors) {\n this.options.colors = options.colors;\n }\n // Some option structures correspond one-to-one to chart objects that\n // have update methods, for example\n // options.credits => chart.credits\n // options.legend => chart.legend\n // options.title => chart.title\n // options.tooltip => chart.tooltip\n // options.subtitle => chart.subtitle\n // options.mapNavigation => chart.mapNavigation\n // options.navigator => chart.navigator\n // options.scrollbar => chart.scrollbar\n Chart_objectEach(options, function (val, key) {\n if (chart[key] &&\n typeof chart[key].update === 'function') {\n chart[key].update(val, false);\n // If a one-to-one object does not exist, look for an adder function\n }\n else if (typeof chart[adders[key]] === 'function') {\n chart[adders[key]](val);\n // Else, just merge the options. For nodes like loading, noData,\n // plotOptions\n }\n else if (key !== 'colors' &&\n chart.collectionsWithUpdate.indexOf(key) === -1) {\n Chart_merge(true, chart.options[key], options[key]);\n }\n if (key !== 'chart' &&\n chart.propsRequireUpdateSeries.indexOf(key) !== -1) {\n updateAllSeries = true;\n }\n });\n // Setters for collections. For axes and series, each item is referred\n // by an id. If the id is not found, it defaults to the corresponding\n // item in the collection, so setting one series without an id, will\n // update the first series in the chart. Setting two series without\n // an id will update the first and the second respectively (#6019)\n // chart.update and responsive.\n this.collectionsWithUpdate.forEach(function (coll) {\n if (options[coll]) {\n Chart_splat(options[coll]).forEach(function (newOptions, i) {\n const hasId = Chart_defined(newOptions.id);\n let item;\n // Match by id\n if (hasId) {\n item = chart.get(newOptions.id);\n }\n // No match by id found, match by index instead\n if (!item && chart[coll]) {\n item = chart[coll][Chart_pick(newOptions.index, i)];\n // Check if we grabbed an item with an existing but\n // different id (#13541). Check that the item in this\n // position is not internal (navigator).\n if (item && ((hasId && Chart_defined(item.options.id)) ||\n item.options.isInternal)) {\n item = void 0;\n }\n }\n if (item && item.coll === coll) {\n item.update(newOptions, false);\n if (oneToOne) {\n item.touched = true;\n }\n }\n // If oneToOne and no matching item is found, add one\n if (!item && oneToOne && chart.collectionsWithInit[coll]) {\n chart.collectionsWithInit[coll][0].apply(chart, \n // [newOptions, ...extraArguments, redraw=false]\n [\n newOptions\n ].concat(\n // Not all initializers require extra args\n chart.collectionsWithInit[coll][1] || []).concat([\n false\n ])).touched = true;\n }\n });\n // Add items for removal\n if (oneToOne) {\n chart[coll].forEach(function (item) {\n if (!item.touched && !item.options.isInternal) {\n itemsForRemoval.push(item);\n }\n else {\n delete item.touched;\n }\n });\n }\n }\n });\n itemsForRemoval.forEach(function (item) {\n if (item.chart && item.remove) { // #9097, avoid removing twice\n item.remove(false);\n }\n });\n if (updateAllAxes) {\n chart.axes.forEach(function (axis) {\n axis.update({}, false);\n });\n }\n // Certain options require the whole series structure to be thrown away\n // and rebuilt\n if (updateAllSeries) {\n chart.getSeriesOrderByLinks().forEach(function (series) {\n // Avoid removed navigator series\n if (series.chart) {\n series.update({}, false);\n }\n }, this);\n }\n // Update size. Redraw is forced.\n const newWidth = optionsChart && optionsChart.width;\n const newHeight = optionsChart && (Chart_isString(optionsChart.height) ?\n Chart_relativeLength(optionsChart.height, newWidth || chart.chartWidth) :\n optionsChart.height);\n if (\n // In this case, run chart.setSize with newWidth and newHeight which\n // are undefined, only for reflowing chart elements because margin\n // or spacing has been set (#8190)\n runSetSize ||\n // In this case, the size is actually set\n (Chart_isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n (Chart_isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n chart.setSize(newWidth, newHeight, animation);\n }\n else if (Chart_pick(redraw, true)) {\n chart.redraw(animation);\n }\n Chart_fireEvent(chart, 'afterUpdate', {\n options: options,\n redraw: redraw,\n animation: animation\n });\n }\n /**\n * Shortcut to set the subtitle options. This can also be done from {@link\n * Chart#update} or {@link Chart#setTitle}.\n *\n * @function Highcharts.Chart#setSubtitle\n *\n * @param {Highcharts.SubtitleOptions} options\n * New subtitle options. The subtitle text itself is set by the\n * `options.text` property.\n */\n setSubtitle(options, redraw) {\n this.applyDescription('subtitle', options);\n this.layOutTitles(redraw);\n }\n /**\n * Set the caption options. This can also be done from {@link\n * Chart#update}.\n *\n * @function Highcharts.Chart#setCaption\n *\n * @param {Highcharts.CaptionOptions} options\n * New caption options. The caption text itself is set by the\n * `options.text` property.\n */\n setCaption(options, redraw) {\n this.applyDescription('caption', options);\n this.layOutTitles(redraw);\n }\n /**\n * Display the zoom button, so users can reset zoom to the default view\n * settings.\n *\n * @function Highcharts.Chart#showResetZoom\n *\n * @emits Highcharts.Chart#event:afterShowResetZoom\n * @emits Highcharts.Chart#event:beforeShowResetZoom\n */\n showResetZoom() {\n const chart = this, lang = Chart_defaultOptions.lang, btnOptions = chart.zooming.resetButton, theme = btnOptions.theme, alignTo = (btnOptions.relativeTo === 'chart' ||\n btnOptions.relativeTo === 'spacingBox' ?\n null :\n 'plotBox');\n /**\n * @private\n */\n function zoomOut() {\n chart.zoomOut();\n }\n Chart_fireEvent(this, 'beforeShowResetZoom', null, function () {\n chart.resetZoomButton = chart.renderer\n .button(lang.resetZoom, null, null, zoomOut, theme)\n .attr({\n align: btnOptions.position.align,\n title: lang.resetZoomTitle\n })\n .addClass('highcharts-reset-zoom')\n .add()\n .align(btnOptions.position, false, alignTo);\n });\n Chart_fireEvent(this, 'afterShowResetZoom');\n }\n /**\n * Zoom the chart out after a user has zoomed in. See also\n * [Axis.setExtremes](/class-reference/Highcharts.Axis#setExtremes).\n *\n * @function Highcharts.Chart#zoomOut\n *\n * @emits Highcharts.Chart#event:selection\n */\n zoomOut() {\n Chart_fireEvent(this, 'selection', { resetSelection: true }, () => this.transform({ reset: true, trigger: 'zoom' }));\n }\n /**\n * Pan the chart by dragging the mouse across the pane. This function is\n * called on mouse move, and the distance to pan is computed from chartX\n * compared to the first chartX position in the dragging operation.\n *\n * @private\n * @function Highcharts.Chart#pan\n * @param {Highcharts.PointerEventObject} event\n * @param {string} panning\n */\n pan(event, panning) {\n const chart = this, panningOptions = (typeof panning === 'object' ?\n panning :\n {\n enabled: panning,\n type: 'x'\n }), type = panningOptions.type, axes = type && chart[{\n x: 'xAxis',\n xy: 'axes',\n y: 'yAxis'\n }[type]]\n .filter((axis) => axis.options.panningEnabled && !axis.options.isInternal), chartOptions = chart.options.chart;\n if (chartOptions?.panning) {\n chartOptions.panning = panningOptions;\n }\n Chart_fireEvent(this, 'pan', { originalEvent: event }, () => {\n chart.transform({\n axes,\n event,\n to: {\n x: event.chartX - (chart.mouseDownX || 0),\n y: event.chartY - (chart.mouseDownY || 0)\n },\n trigger: 'pan'\n });\n Chart_css(chart.container, { cursor: 'move' });\n });\n }\n /**\n * Pan and scale the chart. Used internally by mouse-pan, touch-pan,\n * touch-zoom, and mousewheel zoom.\n *\n * The main positioning logic is created around two imaginary boxes. What is\n * currently within the `from` rectangle, should be transformed to fill up\n * the `to` rectangle.\n * - In a mouse zoom, the `from` rectangle is the selection, while the `to`\n * rectangle is the full plot area.\n * - In a touch zoom, the `from` rectangle is made up of the last two-finger\n * touch, while the `to`` rectangle is the current touch.\n * - In a mousewheel zoom, the `to` rectangle is a 10x10 px square,\n * while the `to` rectangle reflects the scale around that.\n *\n * @private\n * @function Highcharts.Chart#transform\n */\n transform(params) {\n const { axes = this.axes, event, from = {}, reset, selection, to = {}, trigger } = params, { inverted, time } = this;\n let hasZoomed = false, displayButton, isAnyAxisPanning;\n // Remove active points for shared tooltip\n this.hoverPoints?.forEach((point) => point.setState());\n for (const axis of axes) {\n const { horiz, len, minPointOffset = 0, options, reversed } = axis, wh = horiz ? 'width' : 'height', xy = horiz ? 'x' : 'y', toLength = Chart_pick(to[wh], axis.len), fromLength = Chart_pick(from[wh], axis.len), \n // If fingers pinched very close on this axis, treat as pan\n scale = Math.abs(toLength) < 10 ?\n 1 :\n toLength / fromLength, fromCenter = (from[xy] || 0) + fromLength / 2 - axis.pos, toCenter = (to[xy] ?? axis.pos) +\n toLength / 2 - axis.pos, move = fromCenter - toCenter / scale, pointRangeDirection = (reversed && !inverted) ||\n (!reversed && inverted) ?\n -1 :\n 1, minPx = move;\n // Zooming in multiple panes, zoom only in the pane that receives\n // the input\n if (!reset && (fromCenter < 0 || fromCenter > axis.len)) {\n continue;\n }\n let newMin = axis.toValue(minPx, true) +\n // Don't apply offset for selection (#20784)\n (selection || axis.isOrdinal ?\n 0 : minPointOffset * pointRangeDirection), newMax = axis.toValue(minPx + len / scale, true) -\n (\n // Don't apply offset for selection (#20784)\n selection || axis.isOrdinal ?\n 0 :\n ((minPointOffset * pointRangeDirection) ||\n // Polar zoom tests failed when this was not\n // commented:\n // (axis.isXAxis && axis.pointRangePadding) ||\n 0)), allExtremes = axis.allExtremes;\n if (newMin > newMax) {\n [newMin, newMax] = [newMax, newMin];\n }\n // General calculations of the full data extremes. It is calculated\n // on the first call to transform, then reused for subsequent\n // touch/pan calls. (#11315).\n if (scale === 1 &&\n !reset &&\n axis.coll === 'yAxis' &&\n !allExtremes) {\n for (const series of axis.series) {\n const seriesExtremes = series.getExtremes(series.getProcessedData(true).modified\n .getColumn('y') || [], true);\n allExtremes ?? (allExtremes = {\n dataMin: Number.MAX_VALUE,\n dataMax: -Number.MAX_VALUE\n });\n if (Chart_isNumber(seriesExtremes.dataMin) &&\n Chart_isNumber(seriesExtremes.dataMax)) {\n allExtremes.dataMin = Math.min(seriesExtremes.dataMin, allExtremes.dataMin);\n allExtremes.dataMax = Math.max(seriesExtremes.dataMax, allExtremes.dataMax);\n }\n }\n axis.allExtremes = allExtremes;\n }\n const { dataMin, dataMax, min, max } = Chart_extend(axis.getExtremes(), allExtremes || {}), optionsMin = time.parse(options.min), optionsMax = time.parse(options.max), \n // For boosted chart where data extremes are skipped\n safeDataMin = dataMin ?? optionsMin, safeDataMax = dataMax ?? optionsMax, range = newMax - newMin, padRange = axis.categories ? 0 : Math.min(range, safeDataMax - safeDataMin), paddedMin = safeDataMin - padRange * (Chart_defined(optionsMin) ? 0 : options.minPadding), paddedMax = safeDataMax + padRange * (Chart_defined(optionsMax) ? 0 : options.maxPadding), \n // We're allowed to zoom outside the data extremes if we're\n // dealing with a bubble chart, if we're panning, or if we're\n // pinching or mousewheeling in.\n allowZoomOutside = axis.allowZoomOutside ||\n scale === 1 ||\n (trigger !== 'zoom' && scale > 1), \n // Calculate the floor and the ceiling\n floor = Math.min(optionsMin ?? paddedMin, paddedMin, allowZoomOutside ? min : paddedMin), ceiling = Math.max(optionsMax ?? paddedMax, paddedMax, allowZoomOutside ? max : paddedMax);\n // It is not necessary to calculate extremes on ordinal axis,\n // because they are already calculated, so we don't want to override\n // them.\n if (!axis.isOrdinal ||\n axis.options.overscroll || // #21316\n scale !== 1 ||\n reset) {\n // If the new range spills over, either to the min or max,\n // adjust it.\n if (newMin < floor) {\n newMin = floor;\n if (scale >= 1) {\n newMax = newMin + range;\n }\n }\n if (newMax > ceiling) {\n newMax = ceiling;\n if (scale >= 1) {\n newMin = newMax - range;\n }\n }\n // Set new extremes if they are actually new\n if (reset || (axis.series.length &&\n (newMin !== min || newMax !== max) &&\n newMin >= floor &&\n newMax <= ceiling)) {\n if (selection) {\n selection[axis.coll].push({\n axis,\n min: newMin,\n max: newMax\n });\n }\n else {\n // Temporarily flag the axis as `isPanning` in order to\n // disallow certain axis padding options that would make\n // panning/zooming hard. Reset and redraw after the\n // operation has finished.\n axis.isPanning = trigger !== 'zoom';\n if (axis.isPanning) {\n isAnyAxisPanning = true; // #21319\n }\n axis.setExtremes(reset ? void 0 : newMin, reset ? void 0 : newMax, false, false, { move, trigger, scale });\n if (!reset &&\n (newMin > floor || newMax < ceiling) &&\n trigger !== 'mousewheel') {\n displayButton = true;\n }\n }\n hasZoomed = true;\n }\n if (event) {\n this[horiz ? 'mouseDownX' : 'mouseDownY'] =\n event[horiz ? 'chartX' : 'chartY'];\n }\n }\n }\n if (hasZoomed) {\n if (selection) {\n Chart_fireEvent(this, 'selection', selection, \n // Run transform again, this time without the selection data\n // so that the transform is applied.\n () => {\n delete params.selection;\n params.trigger = 'zoom';\n this.transform(params);\n });\n }\n else {\n // Show or hide the Reset zoom button, but not while panning\n if (displayButton &&\n !isAnyAxisPanning &&\n !this.resetZoomButton) {\n this.showResetZoom();\n }\n else if (!displayButton && this.resetZoomButton) {\n this.resetZoomButton = this.resetZoomButton.destroy();\n }\n this.redraw(trigger === 'zoom' &&\n (this.options.chart.animation ?? this.pointCount < 100));\n }\n }\n return hasZoomed;\n }\n}\nChart_extend(Chart.prototype, {\n // Hook for adding callbacks in modules\n callbacks: [],\n /**\n * These collections (arrays) implement `Chart.addSomething` method used in\n * chart.update() to create new object in the collection. Equivalent for\n * deleting is resolved by simple `Something.remove()`.\n *\n * Note: We need to define these references after initializers are bound to\n * chart's prototype.\n *\n * @private\n */\n collectionsWithInit: {\n // CollectionName: [ initializingMethod, [extraArguments] ]\n xAxis: [Chart.prototype.addAxis, [true]],\n yAxis: [Chart.prototype.addAxis, [false]],\n series: [Chart.prototype.addSeries]\n },\n /**\n * These collections (arrays) implement update() methods with support for\n * one-to-one option.\n * @private\n */\n collectionsWithUpdate: [\n 'xAxis',\n 'yAxis',\n 'series'\n ],\n /**\n * These properties cause isDirtyBox to be set to true when updating. Can be\n * extended from plugins.\n * @private\n */\n propsRequireDirtyBox: [\n 'backgroundColor',\n 'borderColor',\n 'borderWidth',\n 'borderRadius',\n 'plotBackgroundColor',\n 'plotBackgroundImage',\n 'plotBorderColor',\n 'plotBorderWidth',\n 'plotShadow',\n 'shadow'\n ],\n /**\n * These properties require a full reflow of chart elements, best\n * implemented through running `Chart.setSize` internally (#8190).\n * @private\n */\n propsRequireReflow: [\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'spacing',\n 'spacingTop',\n 'spacingRight',\n 'spacingBottom',\n 'spacingLeft'\n ],\n /**\n * These properties cause all series to be updated when updating. Can be\n * extended from plugins.\n * @private\n */\n propsRequireUpdateSeries: [\n 'chart.inverted',\n 'chart.polar',\n 'chart.ignoreHiddenSeries',\n 'chart.type',\n 'colors',\n 'plotOptions',\n 'time',\n 'tooltip'\n ]\n});\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Chart_Chart = (Chart);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Callback for chart constructors.\n *\n * @callback Highcharts.ChartCallbackFunction\n *\n * @param {Highcharts.Chart} chart\n * Created chart.\n */\n/**\n * Format a number and return a string based on input settings.\n *\n * @callback Highcharts.NumberFormatterCallbackFunction\n *\n * @param {number} number\n * The input number to format.\n *\n * @param {number} decimals\n * The amount of decimals. A value of -1 preserves the amount in the\n * input number.\n *\n * @param {string} [decimalPoint]\n * The decimal point, defaults to the one given in the lang options, or\n * a dot.\n *\n * @param {string} [thousandsSep]\n * The thousands separator, defaults to the one given in the lang\n * options, or a space character.\n *\n * @return {string} The formatted number.\n */\n/**\n * The chart title. The title has an `update` method that allows modifying the\n * options directly or indirectly via `chart.update`.\n *\n * @interface Highcharts.TitleObject\n * @extends Highcharts.SVGElement\n */ /**\n* Modify options for the title.\n*\n* @function Highcharts.TitleObject#update\n*\n* @param {Highcharts.TitleOptions} titleOptions\n* Options to modify.\n*\n* @param {boolean} [redraw=true]\n* Whether to redraw the chart after the title is altered. If doing more\n* operations on the chart, it is a good idea to set redraw to false and\n* call {@link Chart#redraw} after.\n*/\n/**\n * The chart subtitle. The subtitle has an `update` method that\n * allows modifying the options directly or indirectly via\n * `chart.update`.\n *\n * @interface Highcharts.SubtitleObject\n * @extends Highcharts.SVGElement\n */ /**\n* Modify options for the subtitle.\n*\n* @function Highcharts.SubtitleObject#update\n*\n* @param {Highcharts.SubtitleOptions} subtitleOptions\n* Options to modify.\n*\n* @param {boolean} [redraw=true]\n* Whether to redraw the chart after the subtitle is altered. If doing\n* more operations on the chart, it is a good idea to set redraw to false\n* and call {@link Chart#redraw} after.\n*/\n/**\n * The chart caption. The caption has an `update` method that\n * allows modifying the options directly or indirectly via\n * `chart.update`.\n *\n * @interface Highcharts.CaptionObject\n * @extends Highcharts.SVGElement\n */ /**\n* Modify options for the caption.\n*\n* @function Highcharts.CaptionObject#update\n*\n* @param {Highcharts.CaptionOptions} captionOptions\n* Options to modify.\n*\n* @param {boolean} [redraw=true]\n* Whether to redraw the chart after the caption is altered. If doing\n* more operations on the chart, it is a good idea to set redraw to false\n* and call {@link Chart#redraw} after.\n*/\n/**\n * @interface Highcharts.ChartIsInsideOptionsObject\n */ /**\n* @name Highcharts.ChartIsInsideOptionsObject#axis\n* @type {Highcharts.Axis|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#ignoreX\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#ignoreY\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#inverted\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#paneCoordinates\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#series\n* @type {Highcharts.Series|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#visiblePlotOnly\n* @type {boolean|undefined}\n*/\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Extensions/ScrollablePlotArea.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * Highcharts feature to make the Y axis stay fixed when scrolling the chart\n * horizontally on mobile devices. Supports left and right side axes.\n */\n\n\nconst { stop: ScrollablePlotArea_stop } = AnimationUtilities;\n\nconst { composed: ScrollablePlotArea_composed } = Core_Globals;\n\n\nconst { addEvent: ScrollablePlotArea_addEvent, createElement: ScrollablePlotArea_createElement, css: ScrollablePlotArea_css, defined: ScrollablePlotArea_defined, erase: ScrollablePlotArea_erase, merge: ScrollablePlotArea_merge, pushUnique: ScrollablePlotArea_pushUnique } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/** @private */\nfunction onChartRender() {\n let scrollablePlotArea = this.scrollablePlotArea;\n if ((this.scrollablePixelsX || this.scrollablePixelsY) &&\n !scrollablePlotArea) {\n this.scrollablePlotArea = scrollablePlotArea = new ScrollablePlotArea(this);\n }\n scrollablePlotArea?.applyFixed();\n}\n/** @private */\nfunction markDirty() {\n if (this.chart.scrollablePlotArea) {\n this.chart.scrollablePlotArea.isDirty = true;\n }\n}\nclass ScrollablePlotArea {\n static compose(AxisClass, ChartClass, SeriesClass) {\n if (ScrollablePlotArea_pushUnique(ScrollablePlotArea_composed, this.compose)) {\n ScrollablePlotArea_addEvent(AxisClass, 'afterInit', markDirty);\n ScrollablePlotArea_addEvent(ChartClass, 'afterSetChartSize', (e) => this.afterSetSize(e.target, e));\n ScrollablePlotArea_addEvent(ChartClass, 'render', onChartRender);\n ScrollablePlotArea_addEvent(SeriesClass, 'show', markDirty);\n }\n }\n static afterSetSize(chart, e) {\n const { minWidth, minHeight } = chart.options.chart.scrollablePlotArea || {}, { clipBox, plotBox, inverted, renderer } = chart;\n let scrollablePixelsX, scrollablePixelsY, recalculateHoriz;\n if (!renderer.forExport) {\n // The amount of pixels to scroll, the difference between chart\n // width and scrollable width\n if (minWidth) {\n chart.scrollablePixelsX = scrollablePixelsX = Math.max(0, minWidth - chart.chartWidth);\n if (scrollablePixelsX) {\n chart.scrollablePlotBox = ScrollablePlotArea_merge(chart.plotBox);\n plotBox.width = chart.plotWidth += scrollablePixelsX;\n clipBox[inverted ? 'height' : 'width'] += scrollablePixelsX;\n recalculateHoriz = true;\n }\n // Currently we can only do either X or Y\n }\n else if (minHeight) {\n chart.scrollablePixelsY = scrollablePixelsY = Math.max(0, minHeight - chart.chartHeight);\n if (ScrollablePlotArea_defined(scrollablePixelsY)) {\n chart.scrollablePlotBox = ScrollablePlotArea_merge(chart.plotBox);\n plotBox.height = chart.plotHeight += scrollablePixelsY;\n clipBox[inverted ? 'width' : 'height'] += scrollablePixelsY;\n recalculateHoriz = false;\n }\n }\n if (ScrollablePlotArea_defined(recalculateHoriz) && !e.skipAxes) {\n for (const axis of chart.axes) {\n // Apply the corrected plot size to the axes of the other\n // orientation than the scrolling direction\n if (axis.horiz === recalculateHoriz ||\n // Or parallel axes\n (chart.hasParallelCoordinates && axis.coll === 'yAxis')) {\n axis.setAxisSize();\n axis.setAxisTranslation();\n }\n }\n }\n }\n }\n constructor(chart) {\n const chartOptions = chart.options.chart, Renderer = Renderer_RendererRegistry.getRendererType(), scrollableOptions = chartOptions.scrollablePlotArea || {}, moveFixedElements = this.moveFixedElements.bind(this), styles = {\n WebkitOverflowScrolling: 'touch',\n overflowX: 'hidden',\n overflowY: 'hidden'\n };\n if (chart.scrollablePixelsX) {\n styles.overflowX = 'auto';\n }\n if (chart.scrollablePixelsY) {\n styles.overflowY = 'auto';\n }\n this.chart = chart;\n // Insert a container with relative position that scrolling and fixed\n // container renders to (#10555)\n const parentDiv = this.parentDiv = ScrollablePlotArea_createElement('div', {\n className: 'highcharts-scrolling-parent'\n }, {\n position: 'relative'\n }, chart.renderTo), \n // Add the necessary divs to provide scrolling\n scrollingContainer = this.scrollingContainer = ScrollablePlotArea_createElement('div', {\n 'className': 'highcharts-scrolling'\n }, styles, parentDiv), innerContainer = this.innerContainer = ScrollablePlotArea_createElement('div', {\n 'className': 'highcharts-inner-container'\n }, void 0, scrollingContainer), fixedDiv = this.fixedDiv = ScrollablePlotArea_createElement('div', {\n className: 'highcharts-fixed'\n }, {\n position: 'absolute',\n overflow: 'hidden',\n pointerEvents: 'none',\n zIndex: (chartOptions.style?.zIndex || 0) + 2,\n top: 0\n }, void 0, true), fixedRenderer = this.fixedRenderer = new Renderer(fixedDiv, chart.chartWidth, chart.chartHeight, chartOptions.style);\n // Mask\n this.mask = fixedRenderer\n .path()\n .attr({\n fill: chartOptions.backgroundColor || '#fff',\n 'fill-opacity': scrollableOptions.opacity ?? 0.85,\n zIndex: -1\n })\n .addClass('highcharts-scrollable-mask')\n .add();\n scrollingContainer.parentNode.insertBefore(fixedDiv, scrollingContainer);\n ScrollablePlotArea_css(chart.renderTo, { overflow: 'visible' });\n ScrollablePlotArea_addEvent(chart, 'afterShowResetZoom', moveFixedElements);\n ScrollablePlotArea_addEvent(chart, 'afterApplyDrilldown', moveFixedElements);\n ScrollablePlotArea_addEvent(chart, 'afterLayOutTitles', moveFixedElements);\n // On scroll, reset the chart position because it applies to the\n // scrolled container\n let lastHoverPoint;\n ScrollablePlotArea_addEvent(scrollingContainer, 'scroll', () => {\n const { pointer, hoverPoint } = chart;\n if (pointer) {\n delete pointer.chartPosition;\n if (hoverPoint) {\n lastHoverPoint = hoverPoint;\n }\n pointer.runPointActions(void 0, lastHoverPoint, true);\n }\n });\n // Now move the container inside\n innerContainer.appendChild(chart.container);\n }\n applyFixed() {\n const { chart, fixedRenderer, isDirty, scrollingContainer } = this, { axisOffset, chartWidth, chartHeight, container, plotHeight, plotLeft, plotTop, plotWidth, scrollablePixelsX = 0, scrollablePixelsY = 0 } = chart, chartOptions = chart.options.chart, scrollableOptions = chartOptions.scrollablePlotArea || {}, { scrollPositionX = 0, scrollPositionY = 0 } = scrollableOptions, scrollableWidth = chartWidth + scrollablePixelsX, scrollableHeight = chartHeight + scrollablePixelsY;\n // Set the size of the fixed renderer to the visible width\n fixedRenderer.setSize(chartWidth, chartHeight);\n if (isDirty ?? true) {\n this.isDirty = false;\n this.moveFixedElements();\n }\n // Increase the size of the scrollable renderer and background\n ScrollablePlotArea_stop(chart.container);\n ScrollablePlotArea_css(container, {\n width: `${scrollableWidth}px`,\n height: `${scrollableHeight}px`\n });\n chart.renderer.boxWrapper.attr({\n width: scrollableWidth,\n height: scrollableHeight,\n viewBox: [0, 0, scrollableWidth, scrollableHeight].join(' ')\n });\n chart.chartBackground?.attr({\n width: scrollableWidth,\n height: scrollableHeight\n });\n ScrollablePlotArea_css(scrollingContainer, {\n width: `${chartWidth}px`,\n height: `${chartHeight}px`\n });\n // Set scroll position the first time (this.isDirty was undefined at\n // the top of this function)\n if (!ScrollablePlotArea_defined(isDirty)) {\n scrollingContainer.scrollLeft = scrollablePixelsX * scrollPositionX;\n scrollingContainer.scrollTop = scrollablePixelsY * scrollPositionY;\n }\n // Mask behind the left and right side\n const maskTop = plotTop - axisOffset[0] - 1, maskLeft = plotLeft - axisOffset[3] - 1, maskBottom = plotTop + plotHeight + axisOffset[2] + 1, maskRight = plotLeft + plotWidth + axisOffset[1] + 1, maskPlotRight = plotLeft + plotWidth - scrollablePixelsX, maskPlotBottom = plotTop + plotHeight - scrollablePixelsY;\n let d = [['M', 0, 0]];\n if (scrollablePixelsX) {\n d = [\n // Left side\n ['M', 0, maskTop],\n ['L', plotLeft - 1, maskTop],\n ['L', plotLeft - 1, maskBottom],\n ['L', 0, maskBottom],\n ['Z'],\n // Right side\n ['M', maskPlotRight, maskTop],\n ['L', chartWidth, maskTop],\n ['L', chartWidth, maskBottom],\n ['L', maskPlotRight, maskBottom],\n ['Z']\n ];\n }\n else if (scrollablePixelsY) {\n d = [\n // Top side\n ['M', maskLeft, 0],\n ['L', maskLeft, plotTop - 1],\n ['L', maskRight, plotTop - 1],\n ['L', maskRight, 0],\n ['Z'],\n // Bottom side\n ['M', maskLeft, maskPlotBottom],\n ['L', maskLeft, chartHeight],\n ['L', maskRight, chartHeight],\n ['L', maskRight, maskPlotBottom],\n ['Z']\n ];\n }\n if (chart.redrawTrigger !== 'adjustHeight') {\n this.mask.attr({ d });\n }\n }\n /**\n * These elements are moved over to the fixed renderer and stay fixed when\n * the user scrolls the chart\n * @private\n */\n moveFixedElements() {\n const { container, inverted, scrollablePixelsX, scrollablePixelsY } = this.chart, fixedRenderer = this.fixedRenderer, fixedSelectors = ScrollablePlotArea.fixedSelectors;\n let axisClass;\n if (scrollablePixelsX && !inverted) {\n axisClass = '.highcharts-yaxis';\n }\n else if (scrollablePixelsX && inverted) {\n axisClass = '.highcharts-xaxis';\n }\n else if (scrollablePixelsY && !inverted) {\n axisClass = '.highcharts-xaxis';\n }\n else if (scrollablePixelsY && inverted) {\n axisClass = '.highcharts-yaxis';\n }\n if (axisClass && !(this.chart.hasParallelCoordinates &&\n axisClass === '.highcharts-yaxis')) {\n // Add if not added yet\n for (const className of [\n `${axisClass}:not(.highcharts-radial-axis)`,\n `${axisClass}-labels:not(.highcharts-radial-axis-labels)`\n ]) {\n ScrollablePlotArea_pushUnique(fixedSelectors, className);\n }\n }\n else {\n // Clear all axis related selectors\n for (const classBase of [\n '.highcharts-xaxis',\n '.highcharts-yaxis'\n ]) {\n for (const className of [\n `${classBase}:not(.highcharts-radial-axis)`,\n `${classBase}-labels:not(.highcharts-radial-axis-labels)`\n ]) {\n ScrollablePlotArea_erase(fixedSelectors, className);\n }\n }\n }\n for (const className of fixedSelectors) {\n [].forEach.call(container.querySelectorAll(className), (elem) => {\n (elem.namespaceURI === fixedRenderer.SVG_NS ?\n fixedRenderer.box :\n fixedRenderer.box.parentNode).appendChild(elem);\n elem.style.pointerEvents = 'auto';\n });\n }\n }\n}\nScrollablePlotArea.fixedSelectors = [\n '.highcharts-breadcrumbs-group',\n '.highcharts-contextbutton',\n '.highcharts-caption',\n '.highcharts-credits',\n '.highcharts-drillup-button',\n '.highcharts-legend',\n '.highcharts-legend-checkbox',\n '.highcharts-navigator-series',\n '.highcharts-navigator-xaxis',\n '.highcharts-navigator-yaxis',\n '.highcharts-navigator',\n '.highcharts-range-selector-group',\n '.highcharts-reset-zoom',\n '.highcharts-scrollbar',\n '.highcharts-subtitle',\n '.highcharts-title'\n];\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Extensions_ScrollablePlotArea = (ScrollablePlotArea);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Options for a scrollable plot area. This feature provides a minimum size for\n * the plot area of the chart. If the size gets smaller than this, typically\n * on mobile devices, a native browser scrollbar is presented. This scrollbar\n * provides smooth scrolling for the contents of the plot area, whereas the\n * title, legend and unaffected axes are fixed.\n *\n * Since v7.1.2, a scrollable plot area can be defined for either horizontal or\n * vertical scrolling, depending on whether the `minWidth` or `minHeight`\n * option is set.\n *\n * @sample highcharts/chart/scrollable-plotarea\n * Scrollable plot area\n * @sample highcharts/chart/scrollable-plotarea-vertical\n * Vertically scrollable plot area\n * @sample {gantt} gantt/chart/scrollable-plotarea-vertical\n * Gantt chart with vertically scrollable plot area\n *\n * @since 6.1.0\n * @product highcharts gantt\n * @apioption chart.scrollablePlotArea\n */\n/**\n * The minimum height for the plot area. If it gets smaller than this, the plot\n * area will become scrollable.\n *\n * @type {number}\n * @since 7.1.2\n * @apioption chart.scrollablePlotArea.minHeight\n */\n/**\n * The minimum width for the plot area. If it gets smaller than this, the plot\n * area will become scrollable.\n *\n * @type {number}\n * @since 6.1.0\n * @apioption chart.scrollablePlotArea.minWidth\n */\n/**\n * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n * 1, where 0 aligns the plot area to the left and 1 aligns it to the right.\n * Typically we would use 1 if the chart has right aligned Y axes.\n *\n * @type {number}\n * @since 6.1.0\n * @apioption chart.scrollablePlotArea.scrollPositionX\n */\n/**\n * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n * 1, where 0 aligns the plot area to the top and 1 aligns it to the bottom.\n *\n * @type {number}\n * @since 7.1.2\n * @apioption chart.scrollablePlotArea.scrollPositionY\n */\n/**\n * The opacity of mask applied on one of the sides of the plot\n * area.\n *\n * @sample {highcharts} highcharts/chart/scrollable-plotarea-opacity\n * Disabled opacity for the mask\n *\n * @type {number}\n * @default 0.85\n * @since 7.1.1\n * @apioption chart.scrollablePlotArea.opacity\n */\n(''); // Keep doclets above in transpiled file\n\n;// ./code/es-modules/Core/Axis/Stacking/StackItem.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { format: StackItem_format } = Core_Templating;\n\nconst { series: StackItem_Series } = Series_SeriesRegistry;\n\nconst { destroyObjectProperties: StackItem_destroyObjectProperties, fireEvent: StackItem_fireEvent, getAlignFactor: StackItem_getAlignFactor, isNumber: StackItem_isNumber, pick: StackItem_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The class for stacks. Each stack, on a specific X value and either negative\n * or positive, has its own stack item.\n * @private\n */\nclass StackItem {\n /* *\n *\n * Constructor\n *\n * */\n constructor(axis, options, negativeValue, x, stackOption) {\n const inverted = axis.chart.inverted, reversed = axis.reversed;\n this.axis = axis;\n // The stack goes to the left either if the stack has negative value\n // or when axis is reversed. XOR operator.\n const isNegative = (this.isNegative = !!negativeValue !== !!reversed);\n // Save the options to be able to style the label\n this.options = options = options || {};\n // Save the x value to be able to position the label later\n this.x = x;\n // Initialize total value\n this.total = null;\n this.cumulative = null;\n // This will keep each points' extremes stored by series.index and point\n // index\n this.points = {};\n this.hasValidPoints = false;\n // Save the stack option on the series configuration object,\n // and whether to treat it as percent\n this.stack = stackOption;\n this.leftCliff = 0;\n this.rightCliff = 0;\n // The align options and text align varies on whether the stack is\n // negative and if the chart is inverted or not.\n // First test the user supplied value, then use the dynamic.\n this.alignOptions = {\n align: options.align ||\n (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n verticalAlign: options.verticalAlign ||\n (inverted ? 'middle' : isNegative ? 'bottom' : 'top'),\n y: options.y,\n x: options.x\n };\n this.textAlign =\n options.textAlign ||\n (inverted ? (!isNegative ? 'left' : 'right') : 'center');\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n destroy() {\n StackItem_destroyObjectProperties(this, this.axis);\n }\n /**\n * Renders the stack total label and adds it to the stack label group.\n * @private\n */\n render(group) {\n const chart = this.axis.chart, options = this.options, formatOption = options.format, \n // Format the text in the label.\n str = formatOption ?\n StackItem_format(formatOption, this, chart) :\n options.formatter.call(this);\n // Change the text to reflect the new total and set visibility to hidden\n // in case the series is hidden\n if (this.label) {\n this.label.attr({ text: str, visibility: 'hidden' });\n }\n else {\n // Create new label\n this.label = chart.renderer.label(str, null, void 0, options.shape, void 0, void 0, options.useHTML, false, 'stack-labels');\n const attr = {\n r: options.borderRadius || 0,\n text: str,\n // Set default padding to 5 as it is in datalabels #12308\n padding: StackItem_pick(options.padding, 5),\n visibility: 'hidden' // Hidden until setOffset is called\n };\n if (!chart.styledMode) {\n attr.fill = options.backgroundColor;\n attr.stroke = options.borderColor;\n attr['stroke-width'] = options.borderWidth;\n this.label.css(options.style || {});\n }\n this.label.attr(attr);\n if (!this.label.added) {\n this.label.add(group); // Add to the labels-group\n }\n }\n // Rank it higher than data labels (#8742)\n this.label.labelrank = chart.plotSizeY;\n StackItem_fireEvent(this, 'afterRender');\n }\n /**\n * Sets the offset that the stack has from the x value and repositions the\n * label.\n * @private\n */\n setOffset(xOffset, width, boxBottom, boxTop, defaultX, xAxis) {\n const { alignOptions, axis, label, options, textAlign } = this, chart = axis.chart, stackBox = this.getStackBox({\n xOffset,\n width,\n boxBottom,\n boxTop,\n defaultX,\n xAxis\n }), { verticalAlign } = alignOptions;\n if (label && stackBox) {\n const labelBox = label.getBBox(void 0, 0), padding = label.padding;\n let isJustify = StackItem_pick(options.overflow, 'justify') === 'justify', visible;\n // Reset alignOptions property after justify #12337\n alignOptions.x = options.x || 0;\n alignOptions.y = options.y || 0;\n // Calculate the adjusted Stack position, to take into consideration\n // The size if the labelBox and vertical alignment as\n // well as the text alignment. It's need to be done to work with\n // default SVGLabel.align/justify methods.\n const { x, y } = this.adjustStackPosition({\n labelBox,\n verticalAlign,\n textAlign\n });\n stackBox.x -= x;\n stackBox.y -= y;\n // Align the label to the adjusted box.\n label.align(alignOptions, false, stackBox);\n // Check if label is inside the plotArea #12294\n visible = chart.isInsidePlot(label.alignAttr.x + alignOptions.x + x, label.alignAttr.y + alignOptions.y + y);\n if (!visible) {\n isJustify = false;\n }\n if (isJustify) {\n // Justify stackLabel into the alignBox\n StackItem_Series.prototype.justifyDataLabel.call(axis, label, alignOptions, label.alignAttr, labelBox, stackBox);\n }\n // Add attr to avoid the default animation of justifyDataLabel.\n // Also add correct rotation with its rotation origin. #15129\n label.attr({\n x: label.alignAttr.x,\n y: label.alignAttr.y,\n rotation: options.rotation,\n rotationOriginX: labelBox.width *\n StackItem_getAlignFactor(options.textAlign || 'center'),\n rotationOriginY: labelBox.height / 2\n });\n // Check if the dataLabel should be visible.\n if (StackItem_pick(!isJustify && options.crop, true)) {\n visible =\n StackItem_isNumber(label.x) &&\n StackItem_isNumber(label.y) &&\n chart.isInsidePlot(label.x - padding + (label.width || 0), label.y) &&\n chart.isInsidePlot(label.x + padding, label.y);\n }\n label[visible ? 'show' : 'hide']();\n }\n StackItem_fireEvent(this, 'afterSetOffset', { xOffset, width });\n }\n /**\n * Adjust the stack BBox position, to take into consideration the alignment\n * of the dataLabel. This is necessary to make the stackDataLabel work with\n * core methods like `SVGLabel.adjust` and `Series.justifyDataLabel`.\n * @param AdjustStackPositionProps\n * @return {{x: number, y: number}} Adjusted BBox position of the stack.\n */\n adjustStackPosition({ labelBox, verticalAlign, textAlign }) {\n return {\n x: labelBox.width / 2 +\n (labelBox.width / 2) * (2 * StackItem_getAlignFactor(textAlign) - 1),\n y: (labelBox.height / 2) * 2 * (1 - StackItem_getAlignFactor(verticalAlign))\n };\n }\n /**\n * Get the bbox of the stack.\n * @private\n * @function Highcharts.StackItem#getStackBox\n * @return {BBoxObject} The x, y, height, width of the stack.\n */\n getStackBox(stackBoxProps) {\n const stackItem = this, axis = this.axis, chart = axis.chart, { boxTop, defaultX, xOffset, width, boxBottom } = stackBoxProps, totalStackValue = axis.stacking.usePercentage ?\n 100 :\n StackItem_pick(boxTop, this.total, 0), y = axis.toPixels(totalStackValue), xAxis = stackBoxProps.xAxis || chart.xAxis[0], x = StackItem_pick(defaultX, xAxis.translate(this.x)) + xOffset, yZero = axis.toPixels(boxBottom ||\n (StackItem_isNumber(axis.min) &&\n axis.logarithmic &&\n axis.logarithmic.lin2log(axis.min)) ||\n 0), height = Math.abs(y - yZero), inverted = chart.inverted, neg = stackItem.isNegative;\n return inverted ?\n {\n x: (neg ? y : y - height) - chart.plotLeft,\n y: xAxis.height - x - width + xAxis.top - chart.plotTop,\n width: height,\n height: width\n } : {\n x: x + xAxis.transB - chart.plotLeft,\n y: (neg ? y - height : y) - chart.plotTop,\n width: width,\n height: height\n };\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Stacking_StackItem = (StackItem);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Stack of data points\n *\n * @product highcharts\n *\n * @interface Highcharts.StackItemObject\n */ /**\n* Alignment settings\n* @name Highcharts.StackItemObject#alignOptions\n* @type {Highcharts.AlignObject}\n*/ /**\n* Related axis\n* @name Highcharts.StackItemObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Cumulative value of the stacked data points\n* @name Highcharts.StackItemObject#cumulative\n* @type {number}\n*/ /**\n* True if on the negative side\n* @name Highcharts.StackItemObject#isNegative\n* @type {boolean}\n*/ /**\n* Related SVG element\n* @name Highcharts.StackItemObject#label\n* @type {Highcharts.SVGElement}\n*/ /**\n* Related stack options\n* @name Highcharts.StackItemObject#options\n* @type {Highcharts.YAxisStackLabelsOptions}\n*/ /**\n* Total value of the stacked data points\n* @name Highcharts.StackItemObject#total\n* @type {number}\n*/ /**\n* Shared x value of the stack\n* @name Highcharts.StackItemObject#x\n* @type {number}\n*/\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Axis/Stacking/StackingAxis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { getDeferredAnimation: StackingAxis_getDeferredAnimation } = AnimationUtilities;\n\n\nconst { series: { prototype: seriesProto } } = Series_SeriesRegistry;\n\n\nconst { addEvent: StackingAxis_addEvent, correctFloat: StackingAxis_correctFloat, defined: StackingAxis_defined, destroyObjectProperties: StackingAxis_destroyObjectProperties, fireEvent: StackingAxis_fireEvent, isNumber: StackingAxis_isNumber, objectEach: StackingAxis_objectEach, pick: StackingAxis_pick } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Generate stacks for each series and calculate stacks total values\n *\n * @private\n * @function Highcharts.Chart#getStacks\n */\nfunction chartGetStacks() {\n const chart = this, inverted = chart.inverted;\n // Reset stacks for each axis\n chart.axes.forEach((axis) => {\n if (axis.stacking && axis.stacking.stacks && axis.hasVisibleSeries) {\n axis.stacking.oldStacks = axis.stacking.stacks;\n }\n });\n chart.series.forEach((series) => {\n const xAxisOptions = series.xAxis && series.xAxis.options || {};\n if (series.options.stacking && series.reserveSpace()) {\n series.stackKey = [\n series.type,\n StackingAxis_pick(series.options.stack, ''),\n inverted ? xAxisOptions.top : xAxisOptions.left,\n inverted ? xAxisOptions.height : xAxisOptions.width\n ].join(',');\n }\n });\n}\n/**\n * @private\n */\nfunction onAxisDestroy() {\n const stacking = this.stacking;\n if (stacking) {\n const stacks = stacking.stacks;\n // Destroy each stack total\n StackingAxis_objectEach(stacks, (stack, stackKey) => {\n StackingAxis_destroyObjectProperties(stack);\n delete stacks[stackKey];\n });\n stacking.stackTotalGroup?.destroy();\n }\n}\n/**\n * @private\n */\nfunction onAxisInit() {\n if (!this.stacking) {\n this.stacking = new AxisAdditions(this);\n }\n}\n/**\n * Get stack indicator, according to it's x-value, to determine points with the\n * same x-value\n *\n * @private\n * @function Highcharts.Series#getStackIndicator\n */\nfunction seriesGetStackIndicator(stackIndicator, x, index, key) {\n // Update stack indicator, when:\n // first point in a stack || x changed || stack type (negative vs positive)\n // changed:\n if (!StackingAxis_defined(stackIndicator) ||\n stackIndicator.x !== x ||\n (key && stackIndicator.stackKey !== key)) {\n stackIndicator = {\n x: x,\n index: 0,\n key,\n stackKey: key\n };\n }\n else {\n stackIndicator.index++;\n }\n stackIndicator.key = [index, x, stackIndicator.index].join(',');\n return stackIndicator;\n}\n/**\n * Iterate over all stacks and compute the absolute values to percent\n *\n * @private\n * @function Highcharts.Series#modifyStacks\n */\nfunction seriesModifyStacks() {\n const series = this, yAxis = series.yAxis, stackKey = series.stackKey || '', stacks = yAxis.stacking.stacks, processedXData = series.getColumn('x', true), stacking = series.options.stacking, stacker = series[stacking + 'Stacker'];\n let stackIndicator;\n if (stacker) { // Modifier function exists (Series.percentStacker etc.)\n [stackKey, '-' + stackKey].forEach((key) => {\n let i = processedXData.length, x, stackItem, pointExtremes;\n while (i--) {\n x = processedXData[i];\n stackIndicator = series.getStackIndicator(stackIndicator, x, series.index, key);\n stackItem = stacks[key]?.[x];\n pointExtremes = stackItem?.points[stackIndicator.key || ''];\n if (pointExtremes) {\n stacker.call(series, pointExtremes, stackItem, i);\n }\n }\n });\n }\n}\n/**\n * Modifier function for percent stacks. Blows up the stack to 100%.\n *\n * @private\n * @function Highcharts.Series#percentStacker\n */\nfunction seriesPercentStacker(pointExtremes, stack, i) {\n const totalFactor = stack.total ? 100 / stack.total : 0;\n // Y bottom value\n pointExtremes[0] = StackingAxis_correctFloat(pointExtremes[0] * totalFactor);\n // Y value\n pointExtremes[1] = StackingAxis_correctFloat(pointExtremes[1] * totalFactor);\n this.stackedYData[i] = pointExtremes[1];\n}\n/**\n * Set grouped points in a stack-like object. When `centerInCategory` is true,\n * and `stacking` is not enabled, we need a pseudo (horizontal) stack in order\n * to handle grouping of points within the same category.\n *\n * @private\n * @function Highcharts.Series#setGroupedPoints\n * @return {void}\n */\nfunction seriesSetGroupedPoints(axis) {\n // Only series types supporting centerInCategory need to do this. That also\n // applies to resetting (#20221).\n if (this.is('column') || this.is('columnrange')) {\n if (this.options.centerInCategory &&\n // With only one series, we don't need to consider centerInCategory\n this.chart.series.length > 1) {\n seriesProto.setStackedPoints.call(this, axis, 'group');\n // After updating, if we now have proper stacks, we must delete the\n // group pseudo stacks (#14980)\n }\n else {\n axis.stacking.resetStacks();\n }\n }\n}\n/**\n * Adds series' points value to corresponding stack\n *\n * @private\n * @function Highcharts.Series#setStackedPoints\n */\nfunction seriesSetStackedPoints(axis, stackingParam) {\n const type = stackingParam || this.options.stacking;\n if (!type ||\n !this.reserveSpace() ||\n // Group stacks (centerInCategory) belong on the x-axis, other stacks on\n // the y-axis.\n ({ group: 'xAxis' }[type] || 'yAxis') !== axis.coll) {\n return;\n }\n const series = this, xData = series.getColumn('x', true), yData = series.getColumn(series.pointValKey || 'y', true), stackedYData = [], yDataLength = yData.length, seriesOptions = series.options, threshold = seriesOptions.threshold || 0, stackThreshold = seriesOptions.startFromThreshold ? threshold : 0, stackOption = seriesOptions.stack, stackKey = stackingParam ?\n `${series.type},${type}` : (series.stackKey || ''), negKey = '-' + stackKey, negStacks = series.negStacks, stacking = axis.stacking, stacks = stacking.stacks, oldStacks = stacking.oldStacks;\n let stackIndicator, isNegative, stack, other, key, pointKey, i;\n stacking.stacksTouched += 1;\n // Loop over the non-null y values and read them into a local array\n for (i = 0; i < yDataLength; i++) {\n const x = xData[i] || 0, y = yData[i], yNumber = StackingAxis_isNumber(y) && y || 0;\n stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);\n pointKey = stackIndicator.key || '';\n // Read stacked values into a stack based on the x value,\n // the sign of y and the stack key. Stacking is also handled for null\n // values (#739)\n isNegative = negStacks && yNumber < (stackThreshold ? 0 : threshold);\n key = isNegative ? negKey : stackKey;\n // Create empty object for this stack if it doesn't exist yet\n if (!stacks[key]) {\n stacks[key] = {};\n }\n // Initialize StackItem for this x\n if (!stacks[key][x]) {\n if (oldStacks[key]?.[x]) {\n stacks[key][x] = oldStacks[key][x];\n stacks[key][x].total = null;\n }\n else {\n stacks[key][x] = new Stacking_StackItem(axis, axis.options.stackLabels, !!isNegative, x, stackOption);\n }\n }\n // If the StackItem doesn't exist, create it first\n stack = stacks[key][x];\n if (y !== null) {\n stack.points[pointKey] = stack.points[series.index] = [\n StackingAxis_pick(stack.cumulative, stackThreshold)\n ];\n // Record the base of the stack\n if (!StackingAxis_defined(stack.cumulative)) {\n stack.base = pointKey;\n }\n stack.touched = stacking.stacksTouched;\n // In area charts, if there are multiple points on the same X value,\n // let the area fill the full span of those points\n if (stackIndicator.index > 0 && series.singleStacks === false) {\n stack.points[pointKey][0] = stack.points[series.index + ',' + x + ',0'][0];\n }\n // When updating to null, reset the point stack (#7493)\n }\n else {\n delete stack.points[pointKey];\n delete stack.points[series.index];\n }\n // Add value to the stack total\n let total = stack.total || 0;\n if (type === 'percent') {\n // Percent stacked column, totals are the same for the positive and\n // negative stacks\n other = isNegative ? stackKey : negKey;\n if (negStacks && stacks[other]?.[x]) {\n other = stacks[other][x];\n total = other.total = Math.max(other.total || 0, total) +\n Math.abs(yNumber);\n // Percent stacked areas\n }\n else {\n total = StackingAxis_correctFloat(total + Math.abs(yNumber));\n }\n }\n else if (type === 'group') {\n // In this stack, the total is the number of valid points\n if (StackingAxis_isNumber(y)) {\n total++;\n }\n }\n else {\n total = StackingAxis_correctFloat(total + yNumber);\n }\n if (type === 'group') {\n // This point's index within the stack, pushed to stack.points[1]\n stack.cumulative = (total || 1) - 1;\n }\n else {\n stack.cumulative = StackingAxis_correctFloat(StackingAxis_pick(stack.cumulative, stackThreshold) + yNumber);\n }\n stack.total = total;\n if (y !== null) {\n stack.points[pointKey].push(stack.cumulative);\n stackedYData[i] = stack.cumulative;\n stack.hasValidPoints = true;\n }\n }\n if (type === 'percent') {\n stacking.usePercentage = true;\n }\n if (type !== 'group') {\n this.stackedYData = stackedYData; // To be used in getExtremes\n }\n // Reset old stacks\n stacking.oldStacks = {};\n}\n/* *\n *\n * Classes\n *\n * */\n/**\n * Adds stacking support to axes.\n * @private\n * @class\n */\nclass AxisAdditions {\n /* *\n *\n * Constructors\n *\n * */\n constructor(axis) {\n this.oldStacks = {};\n this.stacks = {};\n this.stacksTouched = 0;\n this.axis = axis;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Build the stacks from top down\n * @private\n */\n buildStacks() {\n const stacking = this, axis = stacking.axis, axisSeries = axis.series, isXAxis = axis.coll === 'xAxis', reversedStacks = axis.options.reversedStacks, len = axisSeries.length;\n let actualSeries, i;\n this.resetStacks();\n stacking.usePercentage = false;\n i = len;\n while (i--) {\n actualSeries = axisSeries[reversedStacks ? i : len - i - 1];\n if (isXAxis) {\n actualSeries.setGroupedPoints(axis);\n }\n actualSeries.setStackedPoints(axis);\n }\n // Loop up again to compute percent and stream stack\n if (!isXAxis) {\n for (i = 0; i < len; i++) {\n axisSeries[i].modifyStacks();\n }\n }\n StackingAxis_fireEvent(axis, 'afterBuildStacks');\n }\n /**\n * @private\n */\n cleanStacks() {\n if (this.oldStacks) {\n this.stacks = this.oldStacks;\n // Reset stacks\n StackingAxis_objectEach(this.stacks, (type) => {\n StackingAxis_objectEach(type, (stack) => {\n stack.cumulative = stack.total;\n });\n });\n }\n }\n /**\n * Set all the stacks to initial states and destroy unused ones.\n * @private\n */\n resetStacks() {\n StackingAxis_objectEach(this.stacks, (type) => {\n StackingAxis_objectEach(type, (stack, x) => {\n // Clean up memory after point deletion (#1044, #4320)\n if (StackingAxis_isNumber(stack.touched) &&\n stack.touched < this.stacksTouched) {\n stack.destroy();\n delete type[x];\n // Reset stacks\n }\n else {\n stack.total = null;\n stack.cumulative = null;\n }\n });\n });\n }\n /**\n * @private\n */\n renderStackTotals() {\n const stacking = this, axis = stacking.axis, chart = axis.chart, renderer = chart.renderer, stacks = stacking.stacks, stackLabelsAnim = axis.options.stackLabels?.animation, animationConfig = StackingAxis_getDeferredAnimation(chart, stackLabelsAnim || false), stackTotalGroup = stacking.stackTotalGroup = (stacking.stackTotalGroup ||\n renderer\n .g('stack-labels')\n .attr({\n zIndex: 6,\n opacity: 0\n })\n .add());\n // The plotLeft/Top will change when y axis gets wider so we need to\n // translate the stackTotalGroup at every render call. See bug #506\n // and #516\n stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n // Render each stack total\n StackingAxis_objectEach(stacks, (type) => {\n StackingAxis_objectEach(type, (stack) => {\n stack.render(stackTotalGroup);\n });\n });\n stackTotalGroup.animate({\n opacity: 1\n }, animationConfig);\n }\n}\n/* *\n *\n * Composition\n *\n * */\nvar StackingAxis;\n(function (StackingAxis) {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Extends axis with stacking support.\n * @private\n */\n function compose(AxisClass, ChartClass, SeriesClass) {\n const chartProto = ChartClass.prototype, seriesProto = SeriesClass.prototype;\n if (!chartProto.getStacks) {\n StackingAxis_addEvent(AxisClass, 'init', onAxisInit);\n StackingAxis_addEvent(AxisClass, 'destroy', onAxisDestroy);\n chartProto.getStacks = chartGetStacks;\n seriesProto.getStackIndicator = seriesGetStackIndicator;\n seriesProto.modifyStacks = seriesModifyStacks;\n seriesProto.percentStacker = seriesPercentStacker;\n seriesProto.setGroupedPoints = seriesSetGroupedPoints;\n seriesProto.setStackedPoints = seriesSetStackedPoints;\n }\n }\n StackingAxis.compose = compose;\n})(StackingAxis || (StackingAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Stacking_StackingAxis = (StackingAxis);\n\n;// ./code/es-modules/Series/Line/LineSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\nconst { defined: LineSeries_defined, merge: LineSeries_merge, isObject: LineSeries_isObject } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The line series is the base type and is therefor the series base prototype.\n *\n * @private\n */\nclass LineSeries extends Series_Series {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Draw the graph. Called internally when rendering line-like series\n * types. The first time it generates the `series.graph` item and\n * optionally other series-wide items like `series.area` for area\n * charts. On subsequent calls these items are updated with new\n * positions and attributes.\n *\n * @function Highcharts.Series#drawGraph\n */\n drawGraph() {\n const options = this.options, graphPath = (this.gappedPath || this.getGraphPath).call(this), styledMode = this.chart.styledMode;\n // Draw the graph\n [this, ...this.zones].forEach((owner, i) => {\n let attribs, graph = owner.graph;\n const verb = graph ? 'animate' : 'attr', dashStyle = owner.dashStyle ||\n options.dashStyle;\n if (graph) {\n graph.endX = this.preventGraphAnimation ?\n null :\n graphPath.xMap;\n graph.animate({ d: graphPath });\n }\n else if (graphPath.length) { // #1487\n /**\n * SVG element of line-based charts. Can be used for styling\n * purposes. If zones are configured, this element will be\n * hidden and replaced by multiple zone lines, accessible\n * via `series.zones[i].graph`.\n *\n * @name Highcharts.Series#graph\n * @type {Highcharts.SVGElement|undefined}\n */\n owner.graph = graph = this.chart.renderer\n .path(graphPath)\n .addClass('highcharts-graph' +\n (i ? ` highcharts-zone-graph-${i - 1} ` : ' ') +\n ((i && owner.className) || ''))\n .attr({ zIndex: 1 }) // #1069\n .add(this.group);\n }\n if (graph && !styledMode) {\n attribs = {\n 'stroke': ((!i && options.lineColor) || // Series only\n owner.color ||\n this.color ||\n \"#cccccc\" /* Palette.neutralColor20 */),\n 'stroke-width': options.lineWidth || 0,\n // Polygon series use filled graph\n 'fill': (this.fillGraph && this.color) || 'none'\n };\n // Apply dash style\n if (dashStyle) {\n attribs.dashstyle = dashStyle;\n // The reason for the `else if` is that linecaps don't mix well\n // with dashstyle. The gaps get partially filled by the\n // linecap.\n }\n else if (options.linecap !== 'square') {\n attribs['stroke-linecap'] =\n attribs['stroke-linejoin'] = 'round';\n }\n graph[verb](attribs)\n // Add shadow to normal series as well as zones\n .shadow(options.shadow &&\n // If shadow is defined, call function with\n // `filterUnits: 'userSpaceOnUse'` to avoid known\n // SVG filter bug (#19093)\n LineSeries_merge({ filterUnits: 'userSpaceOnUse' }, LineSeries_isObject(options.shadow) ? options.shadow : {}));\n }\n // Helpers for animation\n if (graph) {\n graph.startX = graphPath.xMap;\n graph.isArea = graphPath.isArea; // For arearange animation\n }\n });\n }\n // eslint-disable-next-line valid-jsdoc\n /**\n * Get the graph path.\n *\n * @private\n */\n getGraphPath(points, nullsAsZeroes, connectCliffs) {\n const series = this, options = series.options, graphPath = [], xMap = [];\n let gap, step = options.step;\n points = points || series.points;\n // Bottom of a stack is reversed\n const reversed = points.reversed;\n if (reversed) {\n points.reverse();\n }\n // Reverse the steps (#5004)\n step = {\n right: 1,\n center: 2\n }[step] || (step && 3);\n if (step && reversed) {\n step = 4 - step;\n }\n // Remove invalid points, especially in spline (#5015)\n points = this.getValidPoints(points, false, !(options.connectNulls && !nullsAsZeroes && !connectCliffs));\n // Build the line\n points.forEach(function (point, i) {\n const plotX = point.plotX, plotY = point.plotY, lastPoint = points[i - 1], isNull = point.isNull || typeof plotY !== 'number';\n // The path to this point from the previous\n let pathToPoint;\n if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) &&\n !connectCliffs) {\n gap = true; // ... and continue\n }\n // Line series, nullsAsZeroes is not handled\n if (isNull && !LineSeries_defined(nullsAsZeroes) && i > 0) {\n gap = !options.connectNulls;\n // Area series, nullsAsZeroes is set\n }\n else if (isNull && !nullsAsZeroes) {\n gap = true;\n }\n else {\n if (i === 0 || gap) {\n pathToPoint = [[\n 'M',\n point.plotX,\n point.plotY\n ]];\n // Generate the spline as defined in the SplineSeries object\n }\n else if (series.getPointSpline) {\n pathToPoint = [series.getPointSpline(points, point, i)];\n }\n else if (step) {\n if (step === 1) { // Right\n pathToPoint = [[\n 'L',\n lastPoint.plotX,\n plotY\n ]];\n }\n else if (step === 2) { // Center\n pathToPoint = [[\n 'L',\n (lastPoint.plotX + plotX) / 2,\n lastPoint.plotY\n ], [\n 'L',\n (lastPoint.plotX + plotX) / 2,\n plotY\n ]];\n }\n else {\n pathToPoint = [[\n 'L',\n plotX,\n lastPoint.plotY\n ]];\n }\n pathToPoint.push([\n 'L',\n plotX,\n plotY\n ]);\n }\n else {\n // Normal line to next point\n pathToPoint = [[\n 'L',\n plotX,\n plotY\n ]];\n }\n // Prepare for animation. When step is enabled, there are\n // two path nodes for each x value.\n xMap.push(point.x);\n if (step) {\n xMap.push(point.x);\n if (step === 2) { // Step = center (#8073)\n xMap.push(point.x);\n }\n }\n graphPath.push.apply(graphPath, pathToPoint);\n gap = false;\n }\n });\n graphPath.xMap = xMap;\n series.graphPath = graphPath;\n return graphPath;\n }\n}\n/* *\n *\n * Static Functions\n *\n * */\nLineSeries.defaultOptions = LineSeries_merge(Series_Series.defaultOptions, \n/**\n * General options for all series types.\n *\n * @optionparent plotOptions.series\n */\n{\n legendSymbol: 'lineMarker'\n});\nSeries_SeriesRegistry.registerSeriesType('line', LineSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Line_LineSeries = ((/* unused pure expression or super */ null && (LineSeries)));\n/* *\n *\n * API Options\n *\n * */\n/**\n * A line series displays information as a series of data points connected by\n * straight line segments.\n *\n * @sample {highcharts} highcharts/demo/line-chart/\n * Line chart\n * @sample {highstock} stock/demo/basic-line/\n * Line chart\n *\n * @extends plotOptions.series\n * @product highcharts highstock\n * @apioption plotOptions.line\n */\n/**\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n * of a line graph. Round means that lines are rounded in the ends and\n * bends.\n *\n * @type {Highcharts.SeriesLinecapValue}\n * @default round\n * @since 3.0.7\n * @apioption plotOptions.line.linecap\n */\n/**\n * A `line` series. If the [type](#series.line.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.line\n * @excluding dataParser,dataURL\n * @product highcharts highstock\n * @apioption series.line\n */\n/**\n * An array of data points for the series. For the `line` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 1],\n * [1, 2],\n * [2, 8]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.line.turboThreshold),\n * this option is not available.\n * ```js\n * data: [{\n * x: 1,\n * y: 9,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 6,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * **Note:** In TypeScript you have to extend `PointOptionsObject` with an\n * additional declaration to allow custom data types:\n * ```ts\n * declare module `highcharts` {\n * interface PointOptionsObject {\n * custom: Record;\n * }\n * }\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @declare Highcharts.PointOptionsObject\n * @type {Array|null|*>}\n * @apioption series.line.data\n */\n/**\n * An additional, individual class name for the data point's graphic\n * representation. Changes to a point's color will also be reflected in a\n * chart's legend and tooltip.\n *\n * @sample {highcharts} highcharts/css/point-series-classname\n * Series and point class name\n *\n * @type {string}\n * @since 5.0.0\n * @product highcharts gantt\n * @apioption series.line.data.className\n */\n/**\n * Individual color for the point. By default the color is pulled from\n * the global `colors` array.\n *\n * In styled mode, the `color` option doesn't take effect. Instead, use\n * `colorIndex`.\n *\n * @sample {highcharts} highcharts/point/color/\n * Mark the highest point\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highcharts highstock gantt\n * @apioption series.line.data.color\n */\n/**\n * A specific color index to use for the point, so its graphic representations\n * are given the class name `highcharts-color-{n}`. In styled mode this will\n * change the color of the graphic. In non-styled mode, the color is set by the\n * `fill` attribute, so the change in class name won't have a visual effect by\n * default.\n *\n * Since v11, CSS variables on the form `--highcharts-color-{n}` make changing\n * the color scheme very convenient.\n *\n * @sample {highcharts} highcharts/css/colorindex/\n * Series and point color index\n *\n * @type {number}\n * @since 5.0.0\n * @product highcharts gantt\n * @apioption series.line.data.colorIndex\n */\n/**\n * A reserved subspace to store options and values for customized functionality.\n * Here you can add additional data for your own event callbacks and formatter\n * callbacks.\n *\n * @sample {highcharts} highcharts/point/custom/\n * Point and series with custom data\n *\n * @type {Highcharts.Dictionary<*>}\n * @apioption series.line.data.custom\n */\n/**\n * Individual data label for each point. The options are the same as\n * the ones for [plotOptions.series.dataLabels](\n * #plotOptions.series.dataLabels).\n *\n * @sample highcharts/point/datalabels/\n * Show a label for the last value\n *\n * @type {*|Array<*>}\n * @declare Highcharts.DataLabelsOptions\n * @extends plotOptions.line.dataLabels\n * @product highcharts highstock gantt\n * @apioption series.line.data.dataLabels\n */\n/**\n * A description of the point to add to the screen reader information\n * about the point.\n *\n * @type {string}\n * @since 5.0.0\n * @requires modules/accessibility\n * @apioption series.line.data.description\n */\n/**\n * An id for the point. This can be used after render time to get a\n * pointer to the point object through `chart.get()`.\n *\n * @sample {highcharts} highcharts/point/id/\n * Remove an id'd point\n *\n * @type {string}\n * @since 1.2.0\n * @product highcharts highstock gantt\n * @apioption series.line.data.id\n */\n/**\n * The rank for this point's data label in case of collision. If two\n * data labels are about to overlap, only the one with the highest `labelrank`\n * will be drawn.\n *\n * @type {number}\n * @apioption series.line.data.labelrank\n */\n/**\n * The name of the point as shown in the legend, tooltip, dataLabels, etc.\n *\n * @see [xAxis.uniqueNames](#xAxis.uniqueNames)\n *\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Point names\n *\n * @type {string}\n * @apioption series.line.data.name\n */\n/**\n * Whether the data point is selected initially.\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock gantt\n * @apioption series.line.data.selected\n */\n/**\n * The x value of the point.\n *\n * For datetime axes, a number value is the timestamp in milliseconds since\n * 1970, while a date string is parsed according to the [current time zone]\n * (https://api.highcharts.com/highcharts/time.timezone) of the\n * chart. Date strings are supported since v12.\n *\n * @type {number|string}\n * @product highcharts highstock\n * @apioption series.line.data.x\n */\n/**\n * The y value of the point.\n *\n * @type {number|null}\n * @product highcharts highstock\n * @apioption series.line.data.y\n */\n/**\n * The individual point events.\n *\n * @extends plotOptions.series.point.events\n * @product highcharts highstock gantt\n * @apioption series.line.data.events\n */\n/**\n * Options for the point markers of line-like series.\n *\n * @declare Highcharts.PointMarkerOptionsObject\n * @extends plotOptions.series.marker\n * @product highcharts highstock\n * @apioption series.line.data.marker\n */\n''; // Include precedent doclets in transpiled\n\n;// ./code/es-modules/Series/Area/AreaSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * The area series type.\n *\n * @sample {highcharts} highcharts/demo/area-chart/\n * Area chart\n * @sample {highstock} stock/demo/area/\n * Area chart\n *\n * @extends plotOptions.line\n * @excluding useOhlcData\n * @product highcharts highstock\n * @optionparent plotOptions.area\n */\nconst AreaSeriesDefaults = {\n /**\n * @see [fillColor](#plotOptions.area.fillColor)\n * @see [fillOpacity](#plotOptions.area.fillOpacity)\n *\n * @apioption plotOptions.area.color\n */\n /**\n * Fill color or gradient for the area. When `undefined`, the series'\n * `color` is used with the series' `fillOpacity`.\n *\n * In styled mode, the fill color can be set with the `.highcharts-area`\n * class name.\n *\n * @see [color](#plotOptions.area.color)\n * @see [fillOpacity](#plotOptions.area.fillOpacity)\n *\n * @sample {highcharts} highcharts/plotoptions/area-fillcolor-default/\n * Undefined by default\n * @sample {highcharts} highcharts/plotoptions/area-fillcolor-gradient/\n * Gradient\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highcharts highstock\n * @apioption plotOptions.area.fillColor\n */\n /**\n * Fill opacity for the area. When you set an explicit `fillColor`,\n * the `fillOpacity` is not applied. Instead, you should define the\n * opacity in the `fillColor` with an rgba color definition. The\n * `fillOpacity` setting, also the default setting, overrides the alpha\n * component of the `color` setting.\n *\n * In styled mode, the fill opacity can be set with the\n * `.highcharts-area` class name.\n *\n * @see [color](#plotOptions.area.color)\n * @see [fillColor](#plotOptions.area.fillColor)\n *\n * @sample {highcharts} highcharts/plotoptions/area-fillopacity/\n * Automatic fill color and fill opacity of 0.1\n *\n * @type {number}\n * @default {highcharts} 0.75\n * @default {highstock} 0.75\n * @product highcharts highstock\n * @apioption plotOptions.area.fillOpacity\n */\n /**\n * A separate color for the graph line. By default the line takes the\n * `color` of the series, but the lineColor setting allows setting a\n * separate color for the line without altering the `fillColor`.\n *\n * In styled mode, the line stroke can be set with the\n * `.highcharts-graph` class name.\n *\n * @sample {highcharts} highcharts/plotoptions/area-linecolor/\n * Dark gray line\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highcharts highstock\n * @apioption plotOptions.area.lineColor\n */\n /**\n * A separate color for the negative part of the area. Note that `zones`\n * takes precedence over the negative fill color.\n *\n * In styled mode, a negative color is set with the\n * `.highcharts-negative` class name.\n *\n * @see [negativeColor](#plotOptions.area.negativeColor)\n *\n * @sample {highcharts} highcharts/css/series-negative-color/\n * Negative color in styled mode\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 3.0\n * @product highcharts\n * @apioption plotOptions.area.negativeFillColor\n */\n /**\n * Whether the whole area or just the line should respond to mouseover\n * tooltips and other mouse or touch events.\n *\n * @sample {highcharts|highstock} highcharts/plotoptions/area-trackbyarea/\n * Display the tooltip when the area is hovered\n *\n * @type {boolean}\n * @default false\n * @since 1.1.6\n * @product highcharts highstock\n * @apioption plotOptions.area.trackByArea\n */\n /**\n * The Y axis value to serve as the base for the area, for\n * distinguishing between values above and below a threshold. The area\n * between the graph and the threshold is filled.\n *\n * * If a number is given, the Y axis will scale to the threshold.\n * * If `null`, the scaling behaves like a line series with fill between\n * the graph and the Y axis minimum.\n * * If `Infinity` or `-Infinity`, the area between the graph and the\n * corresponding Y axis extreme is filled (since v6.1.0).\n *\n * @sample {highcharts} highcharts/plotoptions/area-threshold/\n * A threshold of 100\n * @sample {highcharts} highcharts/plotoptions/area-threshold-infinity/\n * A threshold of Infinity\n *\n * @type {number|null}\n * @since 2.0\n * @product highcharts highstock\n */\n threshold: 0,\n legendSymbol: 'areaMarker'\n};\n/**\n * A `area` series. If the [type](#series.area.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.area\n * @excluding dataParser, dataURL, useOhlcData\n * @product highcharts highstock\n * @apioption series.area\n */\n/**\n * @see [fillColor](#series.area.fillColor)\n * @see [fillOpacity](#series.area.fillOpacity)\n *\n * @apioption series.area.color\n */\n/**\n * An array of data points for the series. For the `area` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` * and `pointInterval` given in the series options. If the\n * axis has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 9],\n * [1, 7],\n * [2, 6]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.area.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * y: 9,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 6,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.line.data\n * @product highcharts highstock\n * @apioption series.area.data\n */\n/**\n * @see [color](#series.area.color)\n * @see [fillOpacity](#series.area.fillOpacity)\n *\n * @apioption series.area.fillColor\n */\n/**\n * @see [color](#series.area.color)\n * @see [fillColor](#series.area.fillColor)\n *\n * @default {highcharts} 0.75\n * @default {highstock} 0.75\n * @apioption series.area.fillOpacity\n */\n''; // Adds doclets above to transpiled\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Area_AreaSeriesDefaults = (AreaSeriesDefaults);\n\n;// ./code/es-modules/Series/Area/AreaSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { seriesTypes: { line: AreaSeries_LineSeries } } = Series_SeriesRegistry;\n\nconst { extend: AreaSeries_extend, merge: AreaSeries_merge, objectEach: AreaSeries_objectEach, pick: AreaSeries_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * Area series type.\n *\n * @private\n * @class\n * @name AreaSeries\n *\n * @augments LineSeries\n */\nclass AreaSeries extends AreaSeries_LineSeries {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Draw the graph and the underlying area. This method calls the Series\n * base function and adds the area. The areaPath is calculated in the\n * getSegmentPath method called from Series.prototype.drawGraph.\n * @private\n */\n drawGraph() {\n // Define or reset areaPath\n this.areaPath = [];\n // Call the base method\n super.drawGraph.apply(this);\n // Define local variables\n const { areaPath, options } = this;\n [this, ...this.zones].forEach((owner, i) => {\n const attribs = {}, fillColor = owner.fillColor || options.fillColor;\n let area = owner.area;\n const verb = area ? 'animate' : 'attr';\n // Create or update the area\n if (area) { // Update\n area.endX = this.preventGraphAnimation ?\n null :\n areaPath.xMap;\n area.animate({ d: areaPath });\n }\n else { // Create\n attribs.zIndex = 0; // #1069\n /**\n * SVG element of area-based charts. Can be used for styling\n * purposes. If zones are configured, this element will be\n * hidden and replaced by multiple zone areas, accessible\n * via `series.zones[i].area`.\n *\n * @name Highcharts.Series#area\n * @type {Highcharts.SVGElement|undefined}\n */\n area = owner.area = this.chart.renderer\n .path(areaPath)\n .addClass('highcharts-area' +\n (i ? ` highcharts-zone-area-${i - 1} ` : ' ') +\n ((i && owner.className) || ''))\n .add(this.group);\n area.isArea = true;\n }\n if (!this.chart.styledMode) {\n // If there is fillColor defined for the area, set it.\n // Otherwise, we set it to the zone/series color and add\n // fill-opacity (#18939).\n attribs.fill = fillColor || owner.color || this.color;\n attribs['fill-opacity'] = fillColor ?\n 1 : (options.fillOpacity ?? 0.75);\n // Allow clicking through the area if sticky tracking is true\n // (#18744)\n area.css({\n pointerEvents: this.stickyTracking ? 'none' : 'auto'\n });\n }\n area[verb](attribs);\n area.startX = areaPath.xMap;\n area.shiftUnit = options.step ? 2 : 1;\n });\n }\n /**\n * @private\n */\n getGraphPath(points) {\n const getGraphPath = AreaSeries_LineSeries.prototype.getGraphPath, options = this.options, stacking = options.stacking, yAxis = this.yAxis, bottomPoints = [], graphPoints = [], seriesIndex = this.index, stacks = yAxis.stacking.stacks[this.stackKey], threshold = options.threshold, translatedThreshold = Math.round(// #10909\n yAxis.getThreshold(options.threshold)), connectNulls = AreaSeries_pick(// #10574\n options.connectNulls, stacking === 'percent'), \n // To display null points in underlying stacked series, this\n // series graph must be broken, and the area also fall down to\n // fill the gap left by the null point. #2069\n addDummyPoints = function (i, otherI, side) {\n const point = points[i], stackedValues = stacking &&\n stacks[point.x].points[seriesIndex], nullVal = point[side + 'Null'] || 0, cliffVal = point[side + 'Cliff'] || 0;\n let top, bottom, isNull = true;\n if (cliffVal || nullVal) {\n top = (nullVal ?\n stackedValues[0] :\n stackedValues[1]) + cliffVal;\n bottom = stackedValues[0] + cliffVal;\n isNull = !!nullVal;\n }\n else if (!stacking &&\n points[otherI] &&\n points[otherI].isNull) {\n top = bottom = threshold;\n }\n // Add to the top and bottom line of the area\n if (typeof top !== 'undefined') {\n graphPoints.push({\n plotX: plotX,\n plotY: top === null ?\n translatedThreshold :\n yAxis.getThreshold(top),\n isNull: isNull,\n isCliff: true\n });\n bottomPoints.push({\n plotX: plotX,\n plotY: bottom === null ?\n translatedThreshold :\n yAxis.getThreshold(bottom),\n doCurve: false // #1041, gaps in areaspline areas\n });\n }\n };\n let plotX, isNull, yBottom;\n // Find what points to use\n points = points || this.points;\n // Fill in missing points\n if (stacking) {\n points = this.getStackPoints(points);\n }\n for (let i = 0, iEnd = points.length; i < iEnd; ++i) {\n // Reset after series.update of stacking property (#12033)\n if (!stacking) {\n points[i].leftCliff = points[i].rightCliff =\n points[i].leftNull = points[i].rightNull = void 0;\n }\n isNull = points[i].isNull;\n plotX = AreaSeries_pick(points[i].rectPlotX, points[i].plotX);\n yBottom = stacking ?\n AreaSeries_pick(points[i].yBottom, translatedThreshold) :\n translatedThreshold;\n if (!isNull || connectNulls) {\n if (!connectNulls) {\n addDummyPoints(i, i - 1, 'left');\n }\n // Skip null point when stacking is false and connectNulls\n // true\n if (!(isNull && !stacking && connectNulls)) {\n graphPoints.push(points[i]);\n bottomPoints.push({\n x: i,\n plotX: plotX,\n plotY: yBottom\n });\n }\n if (!connectNulls) {\n addDummyPoints(i, i + 1, 'right');\n }\n }\n }\n const topPath = getGraphPath.call(this, graphPoints, true, true);\n bottomPoints.reversed = true;\n const bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n const firstBottomPoint = bottomPath[0];\n if (firstBottomPoint && firstBottomPoint[0] === 'M') {\n bottomPath[0] = ['L', firstBottomPoint[1], firstBottomPoint[2]];\n }\n const areaPath = topPath.concat(bottomPath);\n if (areaPath.length) {\n areaPath.push(['Z']);\n }\n // TODO: don't set leftCliff and rightCliff when connectNulls?\n const graphPath = getGraphPath\n .call(this, graphPoints, false, connectNulls);\n if (this.chart.series.length > 1 &&\n stacking &&\n graphPoints.some((point) => point.isCliff)) {\n areaPath.hasStackedCliffs = graphPath.hasStackedCliffs = true;\n }\n areaPath.xMap = topPath.xMap;\n this.areaPath = areaPath;\n return graphPath;\n }\n /**\n * Return an array of stacked points, where null and missing points are\n * replaced by dummy points in order for gaps to be drawn correctly in\n * stacks.\n * @private\n */\n getStackPoints(points) {\n const series = this, segment = [], keys = [], xAxis = this.xAxis, yAxis = this.yAxis, stack = yAxis.stacking.stacks[this.stackKey], pointMap = {}, yAxisSeries = yAxis.series, seriesLength = yAxisSeries.length, upOrDown = yAxis.options.reversedStacks ? 1 : -1, seriesIndex = yAxisSeries.indexOf(series);\n points = points || this.points;\n if (this.options.stacking) {\n for (let i = 0; i < points.length; i++) {\n // Reset after point update (#7326)\n points[i].leftNull = points[i].rightNull = void 0;\n // Create a map where we can quickly look up the points by\n // their X values.\n pointMap[points[i].x] = points[i];\n }\n // Sort the keys (#1651)\n AreaSeries_objectEach(stack, function (stackX, x) {\n // Nulled after switching between\n // grouping and not (#1651, #2336)\n if (stackX.total !== null) {\n keys.push(x);\n }\n });\n keys.sort(function (a, b) {\n return a - b;\n });\n const visibleSeries = yAxisSeries.map((s) => s.visible);\n keys.forEach(function (x, idx) {\n let y = 0, stackPoint, stackedValues;\n if (pointMap[x] && !pointMap[x].isNull) {\n segment.push(pointMap[x]);\n // Find left and right cliff. -1 goes left, 1 goes\n // right.\n [-1, 1].forEach(function (direction) {\n const nullName = direction === 1 ?\n 'rightNull' :\n 'leftNull', cliffName = direction === 1 ?\n 'rightCliff' :\n 'leftCliff', otherStack = stack[keys[idx + direction]];\n let cliff = 0;\n // If there is a stack next to this one,\n // to the left or to the right...\n if (otherStack) {\n let i = seriesIndex;\n // Can go either up or down,\n // depending on reversedStacks\n while (i >= 0 && i < seriesLength) {\n const si = yAxisSeries[i].index;\n stackPoint = otherStack.points[si];\n if (!stackPoint) {\n // If the next point in this series is\n // missing, mark the point with\n // point.leftNull or point.rightNull = true.\n if (si === series.index) {\n pointMap[x][nullName] = true;\n // If there are missing points in the next\n // stack in any of the series below this\n // one, we need to subtract the missing\n // values and add a hiatus to the left or\n // right.\n }\n else if (visibleSeries[i]) {\n stackedValues = stack[x].points[si];\n if (stackedValues) {\n cliff -= (stackedValues[1] -\n stackedValues[0]);\n }\n }\n }\n // When reversedStacks is true, loop up,\n // else loop down\n i += upOrDown;\n }\n }\n pointMap[x][cliffName] = cliff;\n });\n // There is no point for this X value in this series, so we\n // insert a dummy point in order for the areas to be drawn\n // correctly.\n }\n else {\n // Loop down the stack to find the series below this\n // one that has a value (#1991)\n let i = seriesIndex;\n while (i >= 0 && i < seriesLength) {\n const si = yAxisSeries[i].index;\n stackPoint = stack[x].points[si];\n if (stackPoint) {\n y = stackPoint[1];\n break;\n }\n // When reversedStacks is true, loop up, else loop\n // down\n i += upOrDown;\n }\n y = AreaSeries_pick(y, 0);\n y = yAxis.translate(// #6272\n y, 0, 1, 0, 1);\n segment.push({\n isNull: true,\n plotX: xAxis.translate(// #6272\n x, 0, 0, 0, 1),\n x: x,\n plotY: y,\n yBottom: y\n });\n }\n });\n }\n return segment;\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nAreaSeries.defaultOptions = AreaSeries_merge(AreaSeries_LineSeries.defaultOptions, Area_AreaSeriesDefaults);\nAreaSeries_extend(AreaSeries.prototype, {\n singleStacks: false\n});\nSeries_SeriesRegistry.registerSeriesType('area', AreaSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Area_AreaSeries = ((/* unused pure expression or super */ null && (AreaSeries)));\n\n;// ./code/es-modules/Series/Spline/SplineSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { line: SplineSeries_LineSeries } = Series_SeriesRegistry.seriesTypes;\n\nconst { merge: SplineSeries_merge, pick: SplineSeries_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * Spline series type.\n *\n * @private\n */\nclass SplineSeries extends SplineSeries_LineSeries {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Get the spline segment from a given point's previous neighbour to the\n * given point.\n *\n * @private\n * @function Highcharts.seriesTypes.spline#getPointSpline\n */\n getPointSpline(points, point, i) {\n const \n // 1 means control points midway between points, 2 means 1/3\n // from the point, 3 is 1/4 etc\n smoothing = 1.5, denom = smoothing + 1, plotX = point.plotX || 0, plotY = point.plotY || 0, lastPoint = points[i - 1], nextPoint = points[i + 1];\n let leftContX, leftContY, rightContX, rightContY;\n /**\n * @private\n */\n function doCurve(otherPoint) {\n return otherPoint &&\n !otherPoint.isNull &&\n otherPoint.doCurve !== false &&\n // #6387, area splines next to null:\n !point.isCliff;\n }\n // Find control points\n if (doCurve(lastPoint) && doCurve(nextPoint)) {\n const lastX = lastPoint.plotX || 0, lastY = lastPoint.plotY || 0, nextX = nextPoint.plotX || 0, nextY = nextPoint.plotY || 0;\n let correction = 0;\n leftContX = (smoothing * plotX + lastX) / denom;\n leftContY = (smoothing * plotY + lastY) / denom;\n rightContX = (smoothing * plotX + nextX) / denom;\n rightContY = (smoothing * plotY + nextY) / denom;\n // Have the two control points make a straight line through main\n // point\n if (rightContX !== leftContX) { // #5016, division by zero\n correction = (((rightContY - leftContY) *\n (rightContX - plotX)) /\n (rightContX - leftContX) + plotY - rightContY);\n }\n leftContY += correction;\n rightContY += correction;\n // To prevent false extremes, check that control points are\n // between neighbouring points' y values\n if (leftContY > lastY && leftContY > plotY) {\n leftContY = Math.max(lastY, plotY);\n // Mirror of left control point\n rightContY = 2 * plotY - leftContY;\n }\n else if (leftContY < lastY && leftContY < plotY) {\n leftContY = Math.min(lastY, plotY);\n rightContY = 2 * plotY - leftContY;\n }\n if (rightContY > nextY && rightContY > plotY) {\n rightContY = Math.max(nextY, plotY);\n leftContY = 2 * plotY - rightContY;\n }\n else if (rightContY < nextY && rightContY < plotY) {\n rightContY = Math.min(nextY, plotY);\n leftContY = 2 * plotY - rightContY;\n }\n // Record for drawing in next point\n point.rightContX = rightContX;\n point.rightContY = rightContY;\n // Visualize control points for debugging\n /*\n if (leftContX) {\n this.chart.renderer\n .circle(\n leftContX + this.chart.plotLeft,\n leftContY + this.chart.plotTop,\n 2\n )\n .attr({\n stroke: 'red',\n 'stroke-width': 2,\n fill: 'none',\n zIndex: 9\n })\n .add();\n this.chart.renderer\n .path([['M', leftContX + this.chart.plotLeft,\n leftContY + this.chart.plotTop\n ], ['L', plotX + this.chart.plotLeft,\n plotY + this.chart.plotTop\n ]])\n .attr({\n stroke: 'red',\n 'stroke-width': 2,\n zIndex: 9\n })\n .add();\n }\n if (rightContX) {\n this.chart.renderer\n .circle(\n rightContX + this.chart.plotLeft,\n rightContY + this.chart.plotTop,\n 2\n )\n .attr({\n stroke: 'green',\n 'stroke-width': 2,\n fill: 'none',\n zIndex: 9\n })\n .add();\n this.chart.renderer\n .path([[\n 'M', rightContX + this.chart.plotLeft,\n rightContY + this.chart.plotTop\n ], [\n 'L', plotX + this.chart.plotLeft,\n plotY + this.chart.plotTop\n ]])\n .attr({\n stroke: 'green',\n 'stroke-width': 2,\n zIndex: 9\n })\n .add();\n }\n // */\n point.controlPoints = {\n low: [leftContX, leftContY],\n high: [rightContX, rightContY]\n };\n }\n const ret = [\n 'C',\n SplineSeries_pick(lastPoint.rightContX, lastPoint.plotX, 0),\n SplineSeries_pick(lastPoint.rightContY, lastPoint.plotY, 0),\n SplineSeries_pick(leftContX, plotX, 0),\n SplineSeries_pick(leftContY, plotY, 0),\n plotX,\n plotY\n ];\n // Reset for updating series later\n lastPoint.rightContX = lastPoint.rightContY = void 0;\n return ret;\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n/**\n * A spline series is a special type of line series, where the segments\n * between the data points are smoothed.\n *\n * @sample {highcharts} highcharts/demo/spline-irregular-time/\n * Spline chart\n * @sample {highstock} stock/demo/spline/\n * Spline chart\n *\n * @extends plotOptions.series\n * @excluding step, boostThreshold, boostBlending\n * @product highcharts highstock\n * @optionparent plotOptions.spline\n */\nSplineSeries.defaultOptions = SplineSeries_merge(SplineSeries_LineSeries.defaultOptions);\nSeries_SeriesRegistry.registerSeriesType('spline', SplineSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Spline_SplineSeries = (SplineSeries);\n/* *\n *\n * API Options\n *\n * */\n/**\n * A `spline` series. If the [type](#series.spline.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.spline\n * @excluding dataParser, dataURL, step, boostThreshold, boostBlending\n * @product highcharts highstock\n * @apioption series.spline\n */\n/**\n * An array of data points for the series. For the `spline` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 9],\n * [1, 2],\n * [2, 8]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.spline.turboThreshold),\n * this option is not available.\n * ```js\n * data: [{\n * x: 1,\n * y: 9,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 0,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.line.data\n * @product highcharts highstock\n * @apioption series.spline.data\n */\n''; // Adds doclets above intro transpiled\n\n;// ./code/es-modules/Series/AreaSpline/AreaSplineSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { area: AreaSplineSeries_AreaSeries, area: { prototype: areaProto } } = Series_SeriesRegistry.seriesTypes;\n\nconst { extend: AreaSplineSeries_extend, merge: AreaSplineSeries_merge } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * AreaSpline series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.areaspline\n *\n * @augments Highcharts.Series\n */\nclass AreaSplineSeries extends Spline_SplineSeries {\n}\n/* *\n *\n * Static Properties\n *\n * */\nAreaSplineSeries.defaultOptions = AreaSplineSeries_merge(Spline_SplineSeries.defaultOptions, AreaSplineSeries_AreaSeries.defaultOptions);\nAreaSplineSeries_extend(AreaSplineSeries.prototype, {\n getGraphPath: areaProto.getGraphPath,\n getStackPoints: areaProto.getStackPoints,\n drawGraph: areaProto.drawGraph\n});\nSeries_SeriesRegistry.registerSeriesType('areaspline', AreaSplineSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const AreaSpline_AreaSplineSeries = ((/* unused pure expression or super */ null && (AreaSplineSeries)));\n/* *\n *\n * API Options\n *\n * */\n/**\n * The area spline series is an area series where the graph between the\n * points is smoothed into a spline.\n *\n * @sample {highcharts} highcharts/demo/areaspline/\n * Area spline chart\n * @sample {highstock} stock/demo/areaspline/\n * Area spline chart\n *\n * @extends plotOptions.area\n * @excluding step, boostThreshold, boostBlending\n * @product highcharts highstock\n * @apioption plotOptions.areaspline\n */\n/**\n * @see [fillColor](#plotOptions.areaspline.fillColor)\n * @see [fillOpacity](#plotOptions.areaspline.fillOpacity)\n *\n * @apioption plotOptions.areaspline.color\n */\n/**\n * @see [color](#plotOptions.areaspline.color)\n * @see [fillOpacity](#plotOptions.areaspline.fillOpacity)\n *\n * @apioption plotOptions.areaspline.fillColor\n */\n/**\n * @see [color](#plotOptions.areaspline.color)\n * @see [fillColor](#plotOptions.areaspline.fillColor)\n *\n * @default 0.75\n * @apioption plotOptions.areaspline.fillOpacity\n */\n/**\n * A `areaspline` series. If the [type](#series.areaspline.type) option\n * is not specified, it is inherited from [chart.type](#chart.type).\n *\n *\n * @extends series,plotOptions.areaspline\n * @excluding dataParser, dataURL, step, boostThreshold, boostBlending\n * @product highcharts highstock\n * @apioption series.areaspline\n */\n/**\n * @see [fillColor](#series.areaspline.fillColor)\n * @see [fillOpacity](#series.areaspline.fillOpacity)\n *\n * @apioption series.areaspline.color\n */\n/**\n * An array of data points for the series. For the `areaspline` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 10],\n * [1, 9],\n * [2, 3]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.areaspline.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * y: 4,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 4,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.line.data\n * @product highcharts highstock\n * @apioption series.areaspline.data\n */\n/**\n * @see [color](#series.areaspline.color)\n * @see [fillOpacity](#series.areaspline.fillOpacity)\n *\n * @apioption series.areaspline.fillColor\n */\n/**\n * @see [color](#series.areaspline.color)\n * @see [fillColor](#series.areaspline.fillColor)\n *\n * @default 0.75\n * @apioption series.areaspline.fillOpacity\n */\n''; // Adds doclets above into transpiled\n\n;// ./code/es-modules/Series/Column/ColumnSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * Column series display one column per value along an X axis.\n *\n * @sample {highcharts} highcharts/demo/column-basic/\n * Column chart\n * @sample {highstock} stock/demo/column/\n * Column chart\n *\n * @extends plotOptions.line\n * @excluding connectEnds, connectNulls, gapSize, gapUnit, linecap,\n * lineWidth, marker, step, useOhlcData\n * @product highcharts highstock\n * @optionparent plotOptions.column\n */\nconst ColumnSeriesDefaults = {\n /**\n * The corner radius of the border surrounding each column or bar. A number\n * signifies pixels. A percentage string, like for example `50%`, signifies\n * a relative size. For columns this is relative to the column width, for\n * pies it is relative to the radius and the inner radius.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderradius/\n * Rounded columns\n * @sample highcharts/plotoptions/series-border-radius\n * Column and pie with rounded border\n *\n * @type {number|string|Highcharts.BorderRadiusOptionsObject}\n * @product highcharts highstock gantt\n */\n borderRadius: 3,\n /**\n * When using automatic point colors pulled from the global\n * [colors](colors) or series-specific\n * [plotOptions.column.colors](series.colors) collections, this option\n * determines whether the chart should receive one color per series or\n * one color per point.\n *\n * In styled mode, the `colors` or `series.colors` arrays are not\n * supported, and instead this option gives the points individual color\n * class names on the form `highcharts-color-{n}`.\n *\n * @see [series colors](#plotOptions.column.colors)\n *\n * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-false/\n * False by default\n * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-true/\n * True\n *\n * @type {boolean}\n * @default false\n * @since 2.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.colorByPoint\n */\n /**\n * A series specific or series type specific color set to apply instead\n * of the global [colors](#colors) when [colorByPoint](\n * #plotOptions.column.colorByPoint) is true.\n *\n * @type {Array}\n * @since 3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.colors\n */\n /**\n * When `true`, the columns will center in the category, ignoring null\n * or missing points. When `false`, space will be reserved for null or\n * missing points.\n *\n * @sample {highcharts} highcharts/series-column/centerincategory/\n * Center in category\n * @sample {highcharts} highcharts/series/stack-centerincategory/\n * Center in category, stacked and grouped\n *\n * @since 8.0.1\n * @product highcharts highstock gantt\n */\n centerInCategory: false,\n /**\n * Padding between each value groups, in x axis units.\n *\n * @sample {highcharts} highcharts/plotoptions/column-grouppadding-default/\n * 0.2 by default\n * @sample {highcharts} highcharts/plotoptions/column-grouppadding-none/\n * No group padding - all columns are evenly spaced\n *\n * @product highcharts highstock gantt\n */\n groupPadding: 0.2,\n /**\n * Whether to group non-stacked columns or to let them render\n * independent of each other. Non-grouped columns will be laid out\n * individually and overlap each other.\n *\n * @sample {highcharts} highcharts/plotoptions/column-grouping-false/\n * Grouping disabled\n * @sample {highstock} highcharts/plotoptions/column-grouping-false/\n * Grouping disabled\n *\n * @type {boolean}\n * @default true\n * @since 2.3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.grouping\n */\n /** @ignore-option */\n marker: null, // Point options are specified in the base options\n /**\n * The maximum allowed pixel width for a column, translated to the\n * height of a bar in a bar chart. This prevents the columns from\n * becoming too wide when there is a small number of points in the\n * chart.\n *\n * @see [pointWidth](#plotOptions.column.pointWidth)\n *\n * @sample {highcharts} highcharts/plotoptions/column-maxpointwidth-20/\n * Limited to 50\n * @sample {highstock} highcharts/plotoptions/column-maxpointwidth-20/\n * Limited to 50\n *\n * @type {number}\n * @since 4.1.8\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.maxPointWidth\n */\n /**\n * Padding between each column or bar, in x axis units.\n *\n * @sample {highcharts} highcharts/plotoptions/column-pointpadding-default/\n * 0.1 by default\n * @sample {highcharts} highcharts/plotoptions/column-pointpadding-025/\n * 0.25\n * @sample {highcharts} highcharts/plotoptions/column-pointpadding-none/\n * 0 for tightly packed columns\n *\n * @product highcharts highstock gantt\n */\n pointPadding: 0.1,\n /**\n * A pixel value specifying a fixed width for each column or bar point.\n * When set to `undefined`, the width is calculated from the\n * `pointPadding` and `groupPadding`. The width effects the dimension\n * that is not based on the point value. For column series it is the\n * horizontal length and for bar series it is the vertical length.\n *\n * @see [maxPointWidth](#plotOptions.column.maxPointWidth)\n *\n * @sample {highcharts} highcharts/plotoptions/column-pointwidth-20/\n * 20px wide columns regardless of chart width or the amount of\n * data points\n *\n * @type {number}\n * @since 1.2.5\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.pointWidth\n */\n /**\n * A pixel value specifying a fixed width for the column or bar.\n * Overrides pointWidth on the series.\n *\n * @see [series.pointWidth](#plotOptions.column.pointWidth)\n *\n * @type {number}\n * @default undefined\n * @since 7.0.0\n * @product highcharts highstock gantt\n * @apioption series.column.data.pointWidth\n */\n /**\n * The minimal height for a column or width for a bar. By default,\n * 0 values are not shown. To visualize a 0 (or close to zero) point,\n * set the minimal point length to a pixel value like 3\\. In stacked\n * column charts, minPointLength might not be respected for tightly\n * packed values.\n *\n * @sample {highcharts} highcharts/plotoptions/column-minpointlength/\n * Zero base value\n * @sample {highcharts} highcharts/plotoptions/column-minpointlength-pos-and-neg/\n * Positive and negative close to zero values\n *\n * @product highcharts highstock gantt\n */\n minPointLength: 0,\n /**\n * When the series contains less points than the crop threshold, all\n * points are drawn, event if the points fall outside the visible plot\n * area at the current zoom. The advantage of drawing all points\n * (including markers and columns), is that animation is performed on\n * updates. On the other hand, when the series contains more points than\n * the crop threshold, the series data is cropped to only contain points\n * that fall within the plot area. The advantage of cropping away\n * invisible points is to increase performance on large series.\n *\n * @product highcharts highstock gantt\n */\n cropThreshold: 50,\n /**\n * The X axis range that each point is valid for. This determines the\n * width of the column. On a categorized axis, the range will be 1\n * by default (one category unit). On linear and datetime axes, the\n * range will be computed as the distance between the two closest data\n * points.\n *\n * The default `null` means it is computed automatically, but this\n * option can be used to override the automatic value.\n *\n * This option is set by default to 1 if data sorting is enabled.\n *\n * @sample {highcharts} highcharts/plotoptions/column-pointrange/\n * Set the point range to one day on a data set with one week\n * between the points\n *\n * @type {number|null}\n * @since 2.3\n * @product highcharts highstock gantt\n */\n pointRange: null,\n states: {\n /**\n * Options for the hovered point. These settings override the normal\n * state options when a point is moused over or touched.\n *\n * @extends plotOptions.series.states.hover\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock gantt\n */\n hover: {\n /** @ignore-option */\n halo: false,\n /**\n * A specific border color for the hovered point. Defaults to\n * inherit the normal state border color.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highcharts gantt\n * @apioption plotOptions.column.states.hover.borderColor\n */\n /**\n * A specific color for the hovered point.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highcharts gantt\n * @apioption plotOptions.column.states.hover.color\n */\n /**\n * How much to brighten the point on interaction. Requires the\n * main color to be defined in hex or rgb(a) format.\n *\n * In styled mode, the hover brightening is by default replaced\n * with a fill-opacity set in the `.highcharts-point:hover`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-states-hover-brightness/\n * Brighten by 0.5\n *\n * @product highcharts highstock gantt\n */\n brightness: 0.1\n },\n /**\n * Options for the selected point. These settings override the\n * normal state options when a point is selected.\n *\n * @extends plotOptions.series.states.select\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock gantt\n */\n select: {\n /**\n * A specific color for the selected point.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #cccccc\n * @product highcharts highstock gantt\n */\n color: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * A specific border color for the selected point.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #000000\n * @product highcharts highstock gantt\n */\n borderColor: \"#000000\" /* Palette.neutralColor100 */\n }\n },\n dataLabels: {\n align: void 0,\n verticalAlign: void 0,\n /**\n * The y position offset of the label relative to the point in\n * pixels.\n *\n * @type {number}\n */\n y: void 0\n },\n // False doesn't work well: https://jsfiddle.net/highcharts/hz8fopan/14/\n /** @ignore-option */\n startFromThreshold: true,\n stickyTracking: false,\n tooltip: {\n distance: 6\n },\n /**\n * The Y axis value to serve as the base for the columns, for\n * distinguishing between values above and below a threshold. If `null`,\n * the columns extend from the padding Y axis minimum.\n *\n * @type {number|null}\n * @since 2.0\n * @product highcharts\n */\n threshold: 0,\n /**\n * The width of the border surrounding each column or bar. Defaults to\n * `1` when there is room for a border, but to `0` when the columns are\n * so dense that a border would cover the next column.\n *\n * In styled mode, the stroke width can be set with the\n * `.highcharts-point` rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n * 2px black border\n *\n * @type {number}\n * @default undefined\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.borderWidth\n */\n /**\n * The color of the border surrounding each column or bar.\n *\n * In styled mode, the border stroke can be set with the\n * `.highcharts-point` rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n * Dark gray border\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #ffffff\n * @product highcharts highstock gantt\n */\n borderColor: \"#ffffff\" /* Palette.backgroundColor */\n};\n/**\n * A `column` series. If the [type](#series.column.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.column\n * @excluding connectNulls, dataParser, dataURL, gapSize, gapUnit, linecap,\n * lineWidth, marker, connectEnds, step\n * @product highcharts highstock\n * @apioption series.column\n */\n/**\n * An array of data points for the series. For the `column` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 6],\n * [1, 2],\n * [2, 6]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.column.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * y: 9,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 6,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.line.data\n * @excluding marker\n * @product highcharts highstock\n * @apioption series.column.data\n */\n/**\n * The color of the border surrounding the column or bar.\n *\n * In styled mode, the border stroke can be set with the `.highcharts-point`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n * Dark gray border\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highcharts highstock\n * @apioption series.column.data.borderColor\n */\n/**\n * The width of the border surrounding the column or bar.\n *\n * In styled mode, the stroke width can be set with the `.highcharts-point`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n * 2px black border\n *\n * @type {number}\n * @product highcharts highstock\n * @apioption series.column.data.borderWidth\n */\n/**\n * A name for the dash style to use for the column or bar. Overrides\n * dashStyle on the series.\n *\n * In styled mode, the stroke dash-array can be set with the same classes as\n * listed under [data.color](#series.column.data.color).\n *\n * @see [series.pointWidth](#plotOptions.column.dashStyle)\n *\n * @type {Highcharts.DashStyleValue}\n * @apioption series.column.data.dashStyle\n */\n/**\n * A pixel value specifying a fixed width for the column or bar. Overrides\n * pointWidth on the series. The width effects the dimension that is not based\n * on the point value.\n *\n * @see [series.pointWidth](#plotOptions.column.pointWidth)\n *\n * @type {number}\n * @apioption series.column.data.pointWidth\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock\n * @apioption series.column.states.hover\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock\n * @apioption series.column.states.select\n */\n''; // Keeps doclets above in JS file\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Column_ColumnSeriesDefaults = (ColumnSeriesDefaults);\n\n;// ./code/es-modules/Series/Column/ColumnSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject: ColumnSeries_animObject } = AnimationUtilities;\n\nconst { parse: ColumnSeries_color } = Color_Color;\n\n\nconst { noop: ColumnSeries_noop } = Core_Globals;\n\n\n\nconst { clamp: ColumnSeries_clamp, crisp: ColumnSeries_crisp, defined: ColumnSeries_defined, extend: ColumnSeries_extend, fireEvent: ColumnSeries_fireEvent, isArray: ColumnSeries_isArray, isNumber: ColumnSeries_isNumber, merge: ColumnSeries_merge, pick: ColumnSeries_pick, objectEach: ColumnSeries_objectEach } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The column series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.column\n *\n * @augments Highcharts.Series\n */\nclass ColumnSeries extends Series_Series {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Animate the column heights one by one from zero.\n *\n * @private\n * @function Highcharts.seriesTypes.column#animate\n *\n * @param {boolean} init\n * Whether to initialize the animation or run it\n */\n animate(init) {\n const series = this, yAxis = this.yAxis, yAxisPos = yAxis.pos, reversed = yAxis.reversed, options = series.options, { clipOffset, inverted } = this.chart, attr = {}, translateProp = inverted ?\n 'translateX' :\n 'translateY';\n let translateStart, translatedThreshold;\n if (init && clipOffset) {\n attr.scaleY = 0.001;\n translatedThreshold = ColumnSeries_clamp(yAxis.toPixels(options.threshold || 0), yAxisPos, yAxisPos + yAxis.len);\n if (inverted) {\n // Make sure the columns don't cover the axis line during\n // entrance animation\n translatedThreshold += reversed ?\n -Math.floor(clipOffset[0]) :\n Math.ceil(clipOffset[2]);\n attr.translateX = translatedThreshold - yAxis.len;\n }\n else {\n // Make sure the columns don't cover the axis line during\n // entrance animation\n translatedThreshold += reversed ?\n Math.ceil(clipOffset[0]) :\n -Math.floor(clipOffset[2]);\n attr.translateY = translatedThreshold;\n }\n // Apply final clipping (used in Highcharts Stock) (#7083)\n // animation is done by scaleY, so clipping is for panes\n if (series.clipBox) {\n series.setClip();\n }\n series.group.attr(attr);\n }\n else { // Run the animation\n translateStart = Number(series.group.attr(translateProp));\n series.group.animate({ scaleY: 1 }, ColumnSeries_extend(ColumnSeries_animObject(series.options.animation), {\n // Do the scale synchronously to ensure smooth\n // updating (#5030, #7228)\n step: function (val, fx) {\n if (series.group) {\n attr[translateProp] = translateStart +\n fx.pos * (yAxisPos - translateStart);\n series.group.attr(attr);\n }\n }\n }));\n }\n }\n /**\n * Initialize the series. Extends the basic Series.init method by\n * marking other series of the same type as dirty.\n *\n * @private\n * @function Highcharts.seriesTypes.column#init\n */\n init(chart, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options) {\n super.init.apply(this, arguments);\n const series = this;\n chart = series.chart;\n // If the series is added dynamically, force redraw of other\n // series affected by a new column\n if (chart.hasRendered) {\n chart.series.forEach(function (otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n }\n /**\n * Return the width and x offset of the columns adjusted for grouping,\n * groupPadding, pointPadding, pointWidth etc.\n *\n * @private\n * @function Highcharts.seriesTypes.column#getColumnMetrics\n */\n getColumnMetrics() {\n const series = this, options = series.options, xAxis = series.xAxis, yAxis = series.yAxis, reversedStacks = xAxis.options.reversedStacks, \n // Keep backward compatibility: reversed xAxis had reversed\n // stacks\n reverseStacks = (xAxis.reversed && !reversedStacks) ||\n (!xAxis.reversed && reversedStacks), stackGroups = {};\n let stackKey, columnCount = 0;\n // Get the total number of column type series. This is called on\n // every series. Consider moving this logic to a chart.orderStacks()\n // function and call it on init, addSeries and removeSeries\n if (options.grouping === false) {\n columnCount = 1;\n }\n else {\n series.chart.series.forEach(function (otherSeries) {\n const otherYAxis = otherSeries.yAxis, otherOptions = otherSeries.options;\n let columnIndex;\n if (otherSeries.type === series.type &&\n otherSeries.reserveSpace() &&\n yAxis.len === otherYAxis.len &&\n yAxis.pos === otherYAxis.pos) { // #642, #2086\n if (otherOptions.stacking &&\n otherOptions.stacking !== 'group') {\n stackKey = otherSeries.stackKey;\n if (typeof stackGroups[stackKey] ===\n 'undefined') {\n stackGroups[stackKey] = columnCount++;\n }\n columnIndex = stackGroups[stackKey];\n }\n else if (otherOptions.grouping !== false) { // #1162\n columnIndex = columnCount++;\n }\n otherSeries.columnIndex = columnIndex;\n }\n });\n }\n const categoryWidth = Math.min(Math.abs(xAxis.transA) * ((!xAxis.brokenAxis?.hasBreaks && xAxis.ordinal?.slope) ||\n options.pointRange ||\n xAxis.closestPointRange ||\n xAxis.tickInterval ||\n 1), // #2610\n xAxis.len // #1535\n ), groupPadding = categoryWidth * options.groupPadding, groupWidth = categoryWidth - 2 * groupPadding, pointOffsetWidth = groupWidth / (columnCount || 1), pointWidth = Math.min(options.maxPointWidth || xAxis.len, ColumnSeries_pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))), pointPadding = (pointOffsetWidth - pointWidth) / 2, \n // #1251, #3737\n colIndex = (series.columnIndex || 0) + (reverseStacks ? 1 : 0), pointXOffset = pointPadding +\n (groupPadding +\n colIndex * pointOffsetWidth -\n (categoryWidth / 2)) * (reverseStacks ? -1 : 1);\n // Save it for reading in linked series (Error bars particularly)\n series.columnMetrics = {\n width: pointWidth,\n offset: pointXOffset,\n paddedWidth: pointOffsetWidth,\n columnCount\n };\n return series.columnMetrics;\n }\n /**\n * Make the columns crisp. The edges are rounded to the nearest full\n * pixel.\n *\n * @private\n * @function Highcharts.seriesTypes.column#crispCol\n */\n crispCol(x, y, width, height) {\n const borderWidth = this.borderWidth, inverted = this.chart.inverted, bottom = ColumnSeries_crisp(y + height, borderWidth, inverted);\n // Vertical\n y = ColumnSeries_crisp(y, borderWidth, inverted);\n height = bottom - y;\n // Horizontal. We need to first compute the exact right edge, then\n // round it and compute the width from there.\n if (this.options.crisp) {\n const right = ColumnSeries_crisp(x + width, borderWidth);\n x = ColumnSeries_crisp(x, borderWidth);\n width = right - x;\n }\n return { x, y, width, height };\n }\n /**\n * Adjust for missing columns, according to the `centerInCategory`\n * option. Missing columns are either single points or stacks where the\n * point or points are either missing or null.\n *\n * @private\n * @function Highcharts.seriesTypes.column#adjustForMissingColumns\n * @param {number} x\n * The x coordinate of the column, left side\n *\n * @param {number} pointWidth\n * The pointWidth, already computed upstream\n *\n * @param {Highcharts.ColumnPoint} point\n * The point instance\n *\n * @param {Highcharts.ColumnMetricsObject} metrics\n * The series-wide column metrics\n *\n * @return {number}\n * The adjusted x position, or the original if not adjusted\n */\n adjustForMissingColumns(x, pointWidth, point, metrics) {\n if (!point.isNull && metrics.columnCount > 1) {\n const visibleSeries = this.xAxis.series\n .filter((s) => s.visible)\n .map((s) => s.index);\n let indexInCategory = 0, totalInCategory = 0;\n // Loop over all the stacks on the Y axis. When stacking is enabled,\n // these are real point stacks. When stacking is not enabled, but\n // `centerInCategory` is true, there is one stack handling the\n // grouping of points in each category. This is done in the\n // `setGroupedPoints` function.\n ColumnSeries_objectEach(this.xAxis.stacking?.stacks, (stack) => {\n const points = typeof point.x === 'number' ?\n stack[point.x.toString()]?.points :\n void 0, pointValues = points?.[this.index], yStackMap = {};\n // Look for the index\n if (points && ColumnSeries_isArray(pointValues)) {\n let baseIndex = this.index;\n // If there are multiple points with the same X then\n // gather all series in category, and assign index\n const seriesIndexes = Object\n .keys(points)\n .filter((pointKey) => \n // Filter out duplicate X's\n !pointKey.match(',') &&\n // Filter out null points\n points[pointKey] &&\n points[pointKey].length > 1)\n .map(parseFloat)\n .filter((index) => visibleSeries.indexOf(index) !== -1)\n // When the series `stack` option is defined, assign\n // all subsequent column of the same stack to the\n // same index as the base column of the stack, then\n // filter out the original series index so that\n // `seriesIndexes` is shortened to the amount of\n // stacks, not the amount of series (#20550).\n .filter((index) => {\n const otherOptions = this.chart.series[index]\n .options, yStack = otherOptions.stacking &&\n otherOptions.stack;\n if (ColumnSeries_defined(yStack)) {\n if (ColumnSeries_isNumber(yStackMap[yStack])) {\n if (baseIndex === index) {\n baseIndex = yStackMap[yStack];\n }\n return false;\n }\n yStackMap[yStack] = index;\n }\n return true;\n })\n .sort((a, b) => b - a);\n indexInCategory = seriesIndexes.indexOf(baseIndex);\n totalInCategory = seriesIndexes.length;\n }\n });\n indexInCategory = this.xAxis.reversed ?\n totalInCategory - 1 - indexInCategory : indexInCategory;\n // Compute the adjusted x position\n const boxWidth = (totalInCategory - 1) * metrics.paddedWidth +\n pointWidth;\n x = (point.plotX || 0) + boxWidth / 2 - pointWidth -\n indexInCategory * metrics.paddedWidth;\n }\n return x;\n }\n /**\n * Translate each point to the plot area coordinate system and find\n * shape positions\n *\n * @private\n * @function Highcharts.seriesTypes.column#translate\n */\n translate() {\n const series = this, chart = series.chart, options = series.options, dense = series.dense =\n series.closestPointRange * series.xAxis.transA < 2, borderWidth = series.borderWidth = ColumnSeries_pick(options.borderWidth, dense ? 0 : 1 // #3635\n ), xAxis = series.xAxis, yAxis = series.yAxis, threshold = options.threshold, minPointLength = ColumnSeries_pick(options.minPointLength, 5), metrics = series.getColumnMetrics(), seriesPointWidth = metrics.width, seriesXOffset = series.pointXOffset = metrics.offset, dataMin = series.dataMin, dataMax = series.dataMax, translatedThreshold = series.translatedThreshold =\n yAxis.getThreshold(threshold);\n // Postprocessed for border width\n let seriesBarW = series.barW =\n Math.max(seriesPointWidth, 1 + 2 * borderWidth);\n // When the pointPadding is 0, we want the columns to be packed\n // tightly, so we allow individual columns to have individual sizes.\n // When pointPadding is greater, we strive for equal-width columns\n // (#2694).\n if (options.pointPadding && options.crisp) {\n seriesBarW = Math.ceil(seriesBarW);\n }\n Series_Series.prototype.translate.apply(series);\n // Record the new values\n series.points.forEach(function (point) {\n const yBottom = ColumnSeries_pick(point.yBottom, translatedThreshold), safeDistance = 999 + Math.abs(yBottom), plotX = point.plotX || 0, \n // Don't draw too far outside plot area (#1303, #2241,\n // #4264)\n plotY = ColumnSeries_clamp(point.plotY, -safeDistance, yAxis.len + safeDistance);\n let up, barY = Math.min(plotY, yBottom), barH = Math.max(plotY, yBottom) - barY, pointWidth = seriesPointWidth, barX = plotX + seriesXOffset, barW = seriesBarW;\n // Handle options.minPointLength\n if (minPointLength && Math.abs(barH) < minPointLength) {\n barH = minPointLength;\n up = (!yAxis.reversed && !point.negative) ||\n (yAxis.reversed && point.negative);\n // Reverse zeros if there's no positive value in the series\n // in visible range (#7046)\n if (ColumnSeries_isNumber(threshold) &&\n ColumnSeries_isNumber(dataMax) &&\n point.y === threshold &&\n dataMax <= threshold &&\n // And if there's room for it (#7311)\n (yAxis.min || 0) < threshold &&\n // If all points are the same value (i.e zero) not draw\n // as negative points (#10646), but only if there's room\n // for it (#14876)\n (dataMin !== dataMax || (yAxis.max || 0) <= threshold)) {\n up = !up;\n point.negative = !point.negative;\n }\n // If stacked...\n barY = (Math.abs(barY - translatedThreshold) > minPointLength ?\n // ...keep position\n yBottom - minPointLength :\n // #1485, #4051\n translatedThreshold -\n (up ? minPointLength : 0));\n }\n // Handle point.options.pointWidth\n // @todo Handle grouping/stacking too. Calculate offset properly\n if (ColumnSeries_defined(point.options.pointWidth)) {\n pointWidth = barW =\n Math.ceil(point.options.pointWidth);\n barX -= Math.round((pointWidth - seriesPointWidth) / 2);\n }\n // Adjust for null or missing points\n if (options.centerInCategory) {\n barX = series.adjustForMissingColumns(barX, pointWidth, point, metrics);\n }\n // Cache for access in polar\n point.barX = barX;\n point.pointWidth = pointWidth;\n // Fix the tooltip on center of grouped columns (#1216, #424,\n // #3648)\n point.tooltipPos = chart.inverted ?\n [\n ColumnSeries_clamp(yAxis.len + yAxis.pos - chart.plotLeft - plotY, yAxis.pos - chart.plotLeft, yAxis.len + yAxis.pos - chart.plotLeft),\n xAxis.len + xAxis.pos - chart.plotTop - barX - barW / 2,\n barH\n ] :\n [\n xAxis.left - chart.plotLeft + barX + barW / 2,\n ColumnSeries_clamp(plotY + yAxis.pos -\n chart.plotTop, yAxis.pos - chart.plotTop, yAxis.len + yAxis.pos - chart.plotTop),\n barH\n ];\n // Register shape type and arguments to be used in drawPoints. Allow\n // `shapeType` defined on `pointClass` level.\n point.shapeType = series.pointClass.prototype.shapeType ||\n 'roundedRect';\n point.shapeArgs = series.crispCol(barX, \n // #3169, drilldown from null must have a position to work from.\n // #6585, dataLabel should be placed on xAxis, not floating in\n // the middle of the chart.\n point.isNull ? translatedThreshold : barY, barW, point.isNull ? 0 : barH);\n });\n // Fire a specific event after column translate. We could instead apply\n // all the column logic in an `afterTranslate` event handler, but there\n // are so many other series types that use the column translation, that\n // it is more convenient to have a specific event for it.\n ColumnSeries_fireEvent(this, 'afterColumnTranslate');\n }\n /**\n * Columns have no graph\n *\n * @private\n * @function Highcharts.seriesTypes.column#drawGraph\n */\n drawGraph() {\n this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n }\n /**\n * Get presentational attributes\n *\n * @private\n * @function Highcharts.seriesTypes.column#pointAttribs\n */\n pointAttribs(point, state) {\n const options = this.options, p2o = this.pointAttrToOptions || {}, strokeOption = p2o.stroke || 'borderColor', strokeWidthOption = p2o['stroke-width'] || 'borderWidth';\n let stateOptions, zone, brightness, fill = (point && point.color) || this.color, \n // Set to fill when borderColor null:\n stroke = ((point && point[strokeOption]) ||\n options[strokeOption] ||\n fill), dashstyle = (point && point.options.dashStyle) || options.dashStyle, strokeWidth = (point && point[strokeWidthOption]) ||\n options[strokeWidthOption] ||\n this[strokeWidthOption] || 0, opacity = ColumnSeries_pick(point && point.opacity, options.opacity, 1);\n // Handle zone colors\n if (point && this.zones.length) {\n zone = point.getZone();\n // When zones are present, don't use point.color (#4267).\n // Changed order (#6527), added support for colorAxis (#10670)\n fill = (point.options.color ||\n (zone && (zone.color || point.nonZonedColor)) ||\n this.color);\n if (zone) {\n stroke = zone.borderColor || stroke;\n dashstyle = zone.dashStyle || dashstyle;\n strokeWidth = zone.borderWidth || strokeWidth;\n }\n }\n // Select or hover states\n if (state && point) {\n stateOptions = ColumnSeries_merge(options.states[state], \n // #6401\n point.options.states &&\n point.options.states[state] ||\n {});\n brightness = stateOptions.brightness;\n fill =\n stateOptions.color || (typeof brightness !== 'undefined' &&\n ColumnSeries_color(fill)\n .brighten(stateOptions.brightness)\n .get()) || fill;\n stroke = stateOptions[strokeOption] || stroke;\n strokeWidth =\n stateOptions[strokeWidthOption] || strokeWidth;\n dashstyle = stateOptions.dashStyle || dashstyle;\n opacity = ColumnSeries_pick(stateOptions.opacity, opacity);\n }\n const ret = {\n fill: fill,\n stroke: stroke,\n 'stroke-width': strokeWidth,\n opacity: opacity\n };\n if (dashstyle) {\n ret.dashstyle = dashstyle;\n }\n return ret;\n }\n /**\n * Draw the columns. For bars, the series.group is rotated, so the same\n * coordinates apply for columns and bars. This method is inherited by\n * scatter series.\n *\n * @private\n * @function Highcharts.seriesTypes.column#drawPoints\n */\n drawPoints(points = this.points) {\n const series = this, chart = this.chart, options = series.options, renderer = chart.renderer, animationLimit = options.animationLimit || 250;\n let shapeArgs;\n // Draw the columns\n points.forEach(function (point) {\n const plotY = point.plotY;\n let graphic = point.graphic, hasGraphic = !!graphic, verb = graphic && chart.pointCount < animationLimit ?\n 'animate' : 'attr';\n if (ColumnSeries_isNumber(plotY) && point.y !== null) {\n shapeArgs = point.shapeArgs;\n // When updating a series between 2d and 3d or cartesian and\n // polar, the shape type changes.\n if (graphic && point.hasNewShapeType()) {\n graphic = graphic.destroy();\n }\n // Set starting position for point sliding animation.\n if (series.enabledDataSorting) {\n point.startXPos = series.xAxis.reversed ?\n -(shapeArgs ? (shapeArgs.width || 0) : 0) :\n series.xAxis.width;\n }\n if (!graphic) {\n point.graphic = graphic =\n renderer[point.shapeType](shapeArgs)\n .add(point.group || series.group);\n if (graphic &&\n series.enabledDataSorting &&\n chart.hasRendered &&\n chart.pointCount < animationLimit) {\n graphic.attr({\n x: point.startXPos\n });\n hasGraphic = true;\n verb = 'animate';\n }\n }\n if (graphic && hasGraphic) { // Update\n graphic[verb](ColumnSeries_merge(shapeArgs));\n }\n // Presentational\n if (!chart.styledMode) {\n graphic[verb](series.pointAttribs(point, (point.selected && 'select')))\n .shadow(point.allowShadow !== false && options.shadow);\n }\n if (graphic) {\n graphic.addClass(point.getClassName(), true);\n graphic.attr({\n visibility: point.visible ? 'inherit' : 'hidden'\n });\n }\n }\n else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n });\n }\n /**\n * Draw the tracker for a point.\n * @private\n */\n drawTracker(points = this.points) {\n const series = this, chart = series.chart, pointer = chart.pointer, onMouseOver = function (e) {\n pointer?.normalize(e);\n const point = pointer?.getPointFromEvent(e), \n // Run point events only for points inside plot area, #21136\n isInsidePlot = chart.scrollablePlotArea ?\n chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop, {\n visiblePlotOnly: true\n }) : true;\n // Undefined on graph in scatterchart\n if (pointer &&\n point &&\n series.options.enableMouseTracking &&\n isInsidePlot) {\n pointer.isDirectTouch = true;\n point.onMouseOver(e);\n }\n };\n let dataLabels;\n // Add reference to the point\n points.forEach(function (point) {\n dataLabels = (ColumnSeries_isArray(point.dataLabels) ?\n point.dataLabels :\n (point.dataLabel ? [point.dataLabel] : []));\n if (point.graphic) {\n point.graphic.element.point = point;\n }\n dataLabels.forEach(function (dataLabel) {\n (dataLabel.div || dataLabel.element).point = point;\n });\n });\n // Add the event listeners, we need to do this only once\n if (!series._hasTracking) {\n series.trackerGroups.forEach(function (key) {\n if (series[key]) {\n // We don't always have dataLabelsGroup\n series[key]\n .addClass('highcharts-tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', function (e) {\n pointer?.onTrackerMouseOut(e);\n })\n .on('touchstart', onMouseOver);\n if (!chart.styledMode && series.options.cursor) {\n series[key]\n .css({ cursor: series.options.cursor });\n }\n }\n });\n series._hasTracking = true;\n }\n ColumnSeries_fireEvent(this, 'afterDrawTracker');\n }\n /**\n * Remove this series from the chart\n *\n * @private\n * @function Highcharts.seriesTypes.column#remove\n */\n remove() {\n const series = this, chart = series.chart;\n // Column and bar series affects other series of the same type\n // as they are either stacked or grouped\n if (chart.hasRendered) {\n chart.series.forEach(function (otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n Series_Series.prototype.remove.apply(series, arguments);\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nColumnSeries.defaultOptions = ColumnSeries_merge(Series_Series.defaultOptions, Column_ColumnSeriesDefaults);\nColumnSeries_extend(ColumnSeries.prototype, {\n // When tooltip is not shared, this series (and derivatives) requires\n // direct touch/hover. KD-tree does not apply.\n directTouch: true,\n getSymbol: ColumnSeries_noop,\n // Use separate negative stacks, unlike area stacks where a negative\n // point is subtracted from previous (#1910)\n negStacks: true,\n trackerGroups: ['group', 'dataLabelsGroup']\n});\nSeries_SeriesRegistry.registerSeriesType('column', ColumnSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Column_ColumnSeries = (ColumnSeries);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Adjusted width and x offset of the columns for grouping.\n *\n * @private\n * @interface Highcharts.ColumnMetricsObject\n */ /**\n* Width of the columns.\n* @name Highcharts.ColumnMetricsObject#width\n* @type {number}\n*/ /**\n* Offset of the columns.\n* @name Highcharts.ColumnMetricsObject#offset\n* @type {number}\n*/\n''; // Detach doclets above\n\n;// ./code/es-modules/Core/Series/DataLabel.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { getDeferredAnimation: DataLabel_getDeferredAnimation } = AnimationUtilities;\n\nconst { format: DataLabel_format } = Core_Templating;\n\nconst { defined: DataLabel_defined, extend: DataLabel_extend, fireEvent: DataLabel_fireEvent, getAlignFactor: DataLabel_getAlignFactor, isArray: DataLabel_isArray, isString: DataLabel_isString, merge: DataLabel_merge, objectEach: DataLabel_objectEach, pick: DataLabel_pick, pInt: DataLabel_pInt, splat: DataLabel_splat } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar DataLabel;\n(function (DataLabel) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Check if this series has data labels, either a series-level setting, or\n * individual. In case of individual point labels, this method is overridden\n * to always return true.\n * @private\n */\n function hasDataLabels() {\n return mergedDataLabelOptions(this)\n .some((o) => o?.enabled);\n }\n /**\n * Align each individual data label.\n * @private\n */\n function alignDataLabel(point, dataLabel, options, alignTo, isNew) {\n const series = this, { chart, enabledDataSorting } = this, inverted = this.isCartesian && chart.inverted, plotX = point.plotX, plotY = point.plotY, rotation = options.rotation || 0, isInsidePlot = DataLabel_defined(plotX) &&\n DataLabel_defined(plotY) &&\n chart.isInsidePlot(plotX, Math.round(plotY), {\n inverted,\n paneCoordinates: true,\n series\n }), setStartPos = (alignOptions) => {\n if (enabledDataSorting && series.xAxis && !justify) {\n series.setDataLabelStartPos(point, dataLabel, isNew, isInsidePlot, alignOptions);\n }\n }, justify = rotation === 0 ? DataLabel_pick(options.overflow, (enabledDataSorting ? 'none' : 'justify')) === 'justify' : false;\n // Math.round for rounding errors (#2683), alignTo to allow column\n // labels (#2700)\n let visible = this.visible &&\n point.visible !== false &&\n DataLabel_defined(plotX) &&\n (point.series.forceDL ||\n (enabledDataSorting && !justify) ||\n isInsidePlot ||\n (\n // If the data label is inside the align box, it is enough\n // that parts of the align box is inside the plot area\n // (#12370). When stacking, it is always inside regardless\n // of the option (#15148).\n DataLabel_pick(options.inside, !!this.options.stacking) &&\n alignTo &&\n chart.isInsidePlot(plotX, inverted ?\n alignTo.x + 1 :\n alignTo.y + alignTo.height - 1, {\n inverted,\n paneCoordinates: true,\n series\n })));\n const pos = point.pos();\n if (visible && pos) {\n const bBox = dataLabel.getBBox(), unrotatedbBox = dataLabel.getBBox(void 0, 0);\n // The alignment box is a singular point\n alignTo = DataLabel_extend({\n x: pos[0],\n y: Math.round(pos[1]),\n width: 0,\n height: 0\n }, alignTo || {});\n // Align to plot edges\n if (options.alignTo === 'plotEdges' && series.isCartesian) {\n alignTo[inverted ? 'x' : 'y'] = 0;\n alignTo[inverted ? 'width' : 'height'] = this.yAxis?.len || 0;\n }\n // Add the text size for alignment calculation\n DataLabel_extend(options, {\n width: bBox.width,\n height: bBox.height\n });\n setStartPos(alignTo); // Data sorting\n // Align the label to the adjusted box with for unrotated bBox due\n // to rotationOrigin, which is based on unrotated label\n dataLabel.align(DataLabel_merge(options, {\n width: unrotatedbBox.width,\n height: unrotatedbBox.height\n }), false, alignTo, false);\n dataLabel.alignAttr.x += DataLabel_getAlignFactor(options.align) *\n (unrotatedbBox.width - bBox.width);\n dataLabel.alignAttr.y += DataLabel_getAlignFactor(options.verticalAlign) *\n (unrotatedbBox.height - bBox.height);\n dataLabel[dataLabel.placed ? 'animate' : 'attr']({\n 'text-align': dataLabel.alignAttr['text-align'] || 'center',\n x: dataLabel.alignAttr.x +\n (bBox.width - unrotatedbBox.width) / 2,\n y: dataLabel.alignAttr.y +\n (bBox.height - unrotatedbBox.height) / 2,\n rotationOriginX: (dataLabel.width || 0) / 2,\n rotationOriginY: (dataLabel.height || 0) / 2\n });\n // Uncomment this block to visualize the bounding boxes used for\n // determining visibility\n // chart.renderer.rect(\n // (dataLabel.alignAttr.x || 0) + chart.plotLeft,\n // (dataLabel.alignAttr.y || 0) + chart.plotTop,\n // bBox.width,\n // bBox.height\n // ).attr({\n // stroke: 'rgba(0, 0, 0, 0.3)',\n // 'stroke-width': 1,\n // zIndex: 20\n // }).add();\n // chart.renderer.circle(\n // chart.plotLeft + pick(dataLabel.alignAttr.x, 0),\n // chart.plotTop + pick(dataLabel.alignAttr.y, 0),\n // 2\n // ).attr({\n // fill: 'red',\n // zIndex: 20\n // }).add();\n if (justify && alignTo.height >= 0) { // #8830\n this.justifyDataLabel(dataLabel, options, dataLabel.alignAttr, bBox, alignTo, isNew);\n }\n else if (DataLabel_pick(options.crop, true)) {\n const { x, y } = dataLabel.alignAttr, correction = 1;\n // Check if the dataLabel should be visible.\n visible =\n chart.isInsidePlot(x, y, {\n paneCoordinates: true,\n series\n }) &&\n chart.isInsidePlot(x + bBox.width - correction, y + bBox.height - correction, {\n paneCoordinates: true,\n series\n });\n }\n // When we're using a shape, make it possible with a connector or an\n // arrow pointing to this point\n if (options.shape && !rotation) {\n dataLabel[isNew ? 'attr' : 'animate']({\n anchorX: pos[0],\n anchorY: pos[1]\n });\n }\n }\n // To use alignAttr property in hideOverlappingLabels\n if (isNew && enabledDataSorting) {\n dataLabel.placed = false;\n }\n // Show or hide based on the final aligned position\n if (!visible && (!enabledDataSorting || justify)) {\n dataLabel.hide();\n dataLabel.placed = false; // Don't animate back in\n }\n else {\n dataLabel.show();\n dataLabel.placed = true; // Flag for overlapping logic\n }\n }\n /**\n * Handle the dataLabels.filter option.\n * @private\n */\n function applyFilter(point, options) {\n const filter = options.filter;\n if (filter) {\n const op = filter.operator, prop = point[filter.property], val = filter.value;\n if ((op === '>' && prop > val) ||\n (op === '<' && prop < val) ||\n (op === '>=' && prop >= val) ||\n (op === '<=' && prop <= val) ||\n (op === '==' && prop == val) || // eslint-disable-line eqeqeq\n (op === '===' && prop === val) ||\n (op === '!=' && prop != val) || // eslint-disable-line eqeqeq\n (op === '!==' && prop !== val)) {\n return true;\n }\n return false;\n }\n return true;\n }\n /**\n * @private\n */\n function compose(SeriesClass) {\n const seriesProto = SeriesClass.prototype;\n if (!seriesProto.initDataLabels) {\n seriesProto.initDataLabels = initDataLabels;\n seriesProto.initDataLabelsGroup = initDataLabelsGroup;\n seriesProto.alignDataLabel = alignDataLabel;\n seriesProto.drawDataLabels = drawDataLabels;\n seriesProto.justifyDataLabel = justifyDataLabel;\n seriesProto.setDataLabelStartPos = setDataLabelStartPos;\n seriesProto.hasDataLabels = hasDataLabels;\n }\n }\n DataLabel.compose = compose;\n /**\n * Create the SVGElement group for dataLabels\n * @private\n */\n function initDataLabelsGroup() {\n return this.plotGroup('dataLabelsGroup', 'data-labels', this.hasRendered ? 'inherit' : 'hidden', // #5133, #10220\n this.options.dataLabels.zIndex || 6);\n }\n /**\n * Init the data labels with the correct animation\n * @private\n */\n function initDataLabels(animationConfig) {\n const series = this, hasRendered = series.hasRendered || 0;\n // Create a separate group for the data labels to avoid rotation\n const dataLabelsGroup = this.initDataLabelsGroup()\n .attr({ opacity: +hasRendered }); // #3300\n if (!hasRendered && dataLabelsGroup) {\n if (series.visible) { // #2597, #3023, #3024\n dataLabelsGroup.show();\n }\n if (series.options.animation) {\n dataLabelsGroup.animate({ opacity: 1 }, animationConfig);\n }\n else {\n dataLabelsGroup.attr({ opacity: 1 });\n }\n }\n return dataLabelsGroup;\n }\n /**\n * Draw the data labels\n * @private\n */\n function drawDataLabels(points) {\n points = points || this.points;\n const series = this, chart = series.chart, seriesOptions = series.options, renderer = chart.renderer, { backgroundColor, plotBackgroundColor } = chart.options.chart, contrastColor = renderer.getContrast((DataLabel_isString(plotBackgroundColor) && plotBackgroundColor) ||\n (DataLabel_isString(backgroundColor) && backgroundColor) ||\n \"#000000\" /* Palette.neutralColor100 */), seriesDlOptions = mergedDataLabelOptions(series);\n let pointOptions, dataLabelsGroup;\n // Resolve the animation\n const { animation, defer } = seriesDlOptions[0], animationConfig = defer ?\n DataLabel_getDeferredAnimation(chart, animation, series) :\n { defer: 0, duration: 0 };\n DataLabel_fireEvent(this, 'drawDataLabels');\n if (series.hasDataLabels?.()) {\n dataLabelsGroup = this.initDataLabels(animationConfig);\n // Make the labels for each point\n points.forEach((point) => {\n const dataLabels = point.dataLabels || [];\n // Merge in series options for the point.\n // @note dataLabelAttribs (like pointAttribs) would eradicate\n // the need for dlOptions, and simplify the section below.\n pointOptions = DataLabel_splat(mergeArrays(seriesDlOptions, \n // The dlOptions prop is used in treemaps\n point.dlOptions || point.options?.dataLabels));\n // Handle each individual data label for this point\n pointOptions.forEach((labelOptions, i) => {\n // Options for one datalabel\n const labelEnabled = (labelOptions.enabled &&\n (point.visible || point.dataLabelOnHidden) &&\n // #2282, #4641, #7112, #10049\n (!point.isNull || point.dataLabelOnNull) &&\n applyFilter(point, labelOptions)), { backgroundColor, borderColor, distance, style = {} } = labelOptions;\n let formatString, labelText, rotation, attr = {}, dataLabel = dataLabels[i], isNew = !dataLabel, labelBgColor;\n if (labelEnabled) {\n // Create individual options structure that can be\n // extended without affecting others\n formatString = DataLabel_pick(labelOptions[point.formatPrefix + 'Format'], labelOptions.format);\n labelText = DataLabel_defined(formatString) ?\n DataLabel_format(formatString, point, chart) :\n (labelOptions[point.formatPrefix + 'Formatter'] ||\n labelOptions.formatter).call(point, labelOptions);\n rotation = labelOptions.rotation;\n if (!chart.styledMode) {\n // Determine the color\n style.color = DataLabel_pick(labelOptions.color, style.color, DataLabel_isString(series.color) ? series.color : void 0, \"#000000\" /* Palette.neutralColor100 */);\n // Get automated contrast color\n if (style.color === 'contrast') {\n if (backgroundColor !== 'none') {\n labelBgColor = backgroundColor;\n }\n point.contrastColor = renderer.getContrast(labelBgColor !== 'auto' && labelBgColor ||\n (point.color || series.color));\n style.color = (labelBgColor || // #20007\n (!DataLabel_defined(distance) &&\n labelOptions.inside) ||\n DataLabel_pInt(distance || 0) < 0 ||\n seriesOptions.stacking) ?\n point.contrastColor :\n contrastColor;\n }\n else {\n delete point.contrastColor;\n }\n if (seriesOptions.cursor) {\n style.cursor = seriesOptions.cursor;\n }\n }\n attr = {\n r: labelOptions.borderRadius || 0,\n rotation,\n padding: labelOptions.padding,\n zIndex: 1\n };\n if (!chart.styledMode) {\n attr.fill = backgroundColor === 'auto' ?\n point.color :\n backgroundColor;\n attr.stroke = borderColor === 'auto' ?\n point.color :\n borderColor;\n attr['stroke-width'] = labelOptions.borderWidth;\n }\n // Remove unused attributes (#947)\n DataLabel_objectEach(attr, (val, name) => {\n if (typeof val === 'undefined') {\n delete attr[name];\n }\n });\n }\n // If the point is outside the plot area, or the label\n // changes properties that we cannot change, destroy it and\n // build a new one below. #678, #820.\n if (dataLabel && (!labelEnabled ||\n !DataLabel_defined(labelText) ||\n !!dataLabel.div !== !!labelOptions.useHTML ||\n (\n // Change from no rotation to rotation and\n // vice versa. Don't use defined() because\n // rotation = 0 means also rotation = undefined\n (!dataLabel.rotation ||\n !labelOptions.rotation) &&\n dataLabel.rotation !== labelOptions.rotation))) {\n dataLabel = void 0;\n isNew = true;\n }\n // Individual labels are disabled if the are explicitly\n // disabled in the point options, or if they fall outside\n // the plot area.\n if (labelEnabled && DataLabel_defined(labelText)) {\n if (!dataLabel) {\n // Create new label element\n dataLabel = renderer.label(labelText, 0, 0, labelOptions.shape, void 0, void 0, labelOptions.useHTML, void 0, 'data-label');\n dataLabel.addClass(' highcharts-data-label-color-' +\n point.colorIndex +\n ' ' + (labelOptions.className || '') +\n ( // #3398\n labelOptions.useHTML ?\n ' highcharts-tracker' :\n ''));\n }\n else {\n // Use old element and just update text\n attr.text = labelText;\n }\n // Store data label options for later access\n if (dataLabel) {\n dataLabel.options = labelOptions;\n dataLabel.attr(attr);\n if (!chart.styledMode) {\n // Styles must be applied before add in order to\n // read text bounding box\n dataLabel.css(style).shadow(labelOptions.shadow);\n }\n else if (style.width) {\n // In styled mode with a width property set,\n // the width should be applied to the\n // dataLabel. (#20499). These properties affect\n // layout and must be applied also in styled\n // mode.\n dataLabel.css({\n width: style.width,\n textOverflow: style.textOverflow,\n whiteSpace: style.whiteSpace\n });\n }\n DataLabel_fireEvent(dataLabel, 'beforeAddingDataLabel', { labelOptions, point });\n if (!dataLabel.added) {\n dataLabel.add(dataLabelsGroup);\n }\n // Now the data label is created and placed at 0,0,\n // so we need to align it\n series.alignDataLabel(point, dataLabel, labelOptions, void 0, isNew);\n dataLabel.isActive = true;\n if (dataLabels[i] && dataLabels[i] !== dataLabel) {\n dataLabels[i].destroy();\n }\n dataLabels[i] = dataLabel;\n }\n }\n });\n // Destroy and remove the inactive ones\n let j = dataLabels.length;\n while (j--) {\n // The item can be undefined if a disabled data label is\n // succeeded by an enabled one (#19457)\n if (!dataLabels[j] || !dataLabels[j].isActive) {\n dataLabels[j]?.destroy();\n dataLabels.splice(j, 1);\n }\n else {\n dataLabels[j].isActive = false;\n }\n }\n // Write back\n point.dataLabel = dataLabels[0];\n point.dataLabels = dataLabels;\n });\n }\n DataLabel_fireEvent(this, 'afterDrawDataLabels');\n }\n /**\n * If data labels fall partly outside the plot area, align them back in, in\n * a way that doesn't hide the point.\n * @private\n */\n function justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n const chart = this.chart, align = options.align, verticalAlign = options.verticalAlign, padding = dataLabel.box ? 0 : (dataLabel.padding || 0), horizontalAxis = chart.inverted ? this.yAxis : this.xAxis, horizontalAxisShift = horizontalAxis ?\n horizontalAxis.left - chart.plotLeft : 0, verticalAxis = chart.inverted ? this.xAxis : this.yAxis, verticalAxisShift = verticalAxis ?\n verticalAxis.top - chart.plotTop : 0;\n let { x = 0, y = 0 } = options, off, justified;\n // Off left\n off = (alignAttr.x || 0) + padding + horizontalAxisShift;\n if (off < 0) {\n if (align === 'right' && x >= 0) {\n options.align = 'left';\n options.inside = true;\n }\n else {\n x -= off;\n }\n justified = true;\n }\n // Off right\n off = (alignAttr.x || 0) + bBox.width - padding + horizontalAxisShift;\n if (off > chart.plotWidth) {\n if (align === 'left' && x <= 0) {\n options.align = 'right';\n options.inside = true;\n }\n else {\n x += chart.plotWidth - off;\n }\n justified = true;\n }\n // Off top\n off = alignAttr.y + padding + verticalAxisShift;\n if (off < 0) {\n if (verticalAlign === 'bottom' && y >= 0) {\n options.verticalAlign = 'top';\n options.inside = true;\n }\n else {\n y -= off;\n }\n justified = true;\n }\n // Off bottom\n off = (alignAttr.y || 0) + bBox.height - padding + verticalAxisShift;\n if (off > chart.plotHeight) {\n if (verticalAlign === 'top' && y <= 0) {\n options.verticalAlign = 'bottom';\n options.inside = true;\n }\n else {\n y += chart.plotHeight - off;\n }\n justified = true;\n }\n if (justified) {\n options.x = x;\n options.y = y;\n dataLabel.placed = !isNew;\n dataLabel.align(options, void 0, alignTo);\n }\n return justified;\n }\n /**\n * Merge two objects that can be arrays. If one of them is an array, the\n * other is merged into each element. If both are arrays, each element is\n * merged by index. If neither are arrays, we use normal merge.\n * @private\n */\n function mergeArrays(one, two) {\n let res = [], i;\n if (DataLabel_isArray(one) && !DataLabel_isArray(two)) {\n res = one.map(function (el) {\n return DataLabel_merge(el, two);\n });\n }\n else if (DataLabel_isArray(two) && !DataLabel_isArray(one)) {\n res = two.map(function (el) {\n return DataLabel_merge(one, el);\n });\n }\n else if (!DataLabel_isArray(one) && !DataLabel_isArray(two)) {\n res = DataLabel_merge(one, two);\n }\n else if (DataLabel_isArray(one) && DataLabel_isArray(two)) {\n i = Math.max(one.length, two.length);\n while (i--) {\n res[i] = DataLabel_merge(one[i], two[i]);\n }\n }\n return res;\n }\n /**\n * Merge plotOptions and series options for dataLabels.\n * @private\n */\n function mergedDataLabelOptions(series) {\n const plotOptions = series.chart.options.plotOptions;\n return DataLabel_splat(mergeArrays(mergeArrays(plotOptions?.series?.dataLabels, plotOptions?.[series.type]?.dataLabels), series.options.dataLabels));\n }\n /**\n * Set starting position for data label sorting animation.\n * @private\n */\n function setDataLabelStartPos(point, dataLabel, isNew, isInside, alignOptions) {\n const chart = this.chart, inverted = chart.inverted, xAxis = this.xAxis, reversed = xAxis.reversed, labelCenter = ((inverted ? dataLabel.height : dataLabel.width) || 0) / 2, pointWidth = point.pointWidth, halfWidth = pointWidth ? pointWidth / 2 : 0;\n dataLabel.startXPos = inverted ?\n alignOptions.x :\n (reversed ?\n -labelCenter - halfWidth :\n xAxis.width - labelCenter + halfWidth);\n dataLabel.startYPos = inverted ?\n (reversed ?\n this.yAxis.height - labelCenter + halfWidth :\n -labelCenter - halfWidth) : alignOptions.y;\n // We need to handle visibility in case of sorting point outside plot\n // area\n if (!isInside) {\n dataLabel\n .attr({ opacity: 1 })\n .animate({ opacity: 0 }, void 0, dataLabel.hide);\n }\n else if (dataLabel.visibility === 'hidden') {\n dataLabel.show();\n dataLabel\n .attr({ opacity: 0 })\n .animate({ opacity: 1 });\n }\n // Save start position on first render, but do not change position\n if (!chart.hasRendered) {\n return;\n }\n // Set start position\n if (isNew) {\n dataLabel.attr({ x: dataLabel.startXPos, y: dataLabel.startYPos });\n }\n dataLabel.placed = true;\n }\n})(DataLabel || (DataLabel = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_DataLabel = (DataLabel);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Callback JavaScript function to format the data label as a string. Note that\n * if a `format` is defined, the format takes precedence and the formatter is\n * ignored.\n *\n * @callback Highcharts.DataLabelsFormatterCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Data label context to format\n *\n * @param {Highcharts.DataLabelsOptions} options\n * [API options](/highcharts/plotOptions.series.dataLabels) of the data label\n *\n * @return {number|string|null|undefined}\n * Formatted data label text\n */\n/**\n * Values for handling data labels that flow outside the plot area.\n *\n * @typedef {\"allow\"|\"justify\"} Highcharts.DataLabelsOverflowValue\n */\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Series/Column/ColumnDataLabel.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { composed: ColumnDataLabel_composed } = Core_Globals;\n\nconst { series: ColumnDataLabel_Series } = Series_SeriesRegistry;\n\nconst { merge: ColumnDataLabel_merge, pick: ColumnDataLabel_pick, pushUnique: ColumnDataLabel_pushUnique } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar ColumnDataLabel;\n(function (ColumnDataLabel) {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Override the basic data label alignment by adjusting for the position of\n * the column.\n * @private\n */\n function alignDataLabel(point, dataLabel, options, alignTo, isNew) {\n const inverted = this.chart.inverted, series = point.series, xLen = (series.xAxis ? series.xAxis.len : this.chart.plotSizeX) || 0, yLen = (series.yAxis ? series.yAxis.len : this.chart.plotSizeY) || 0, \n // Data label box for alignment\n dlBox = point.dlBox || point.shapeArgs, below = ColumnDataLabel_pick(point.below, // Range series\n point.plotY >\n ColumnDataLabel_pick(this.translatedThreshold, yLen)), \n // Draw it inside the box?\n inside = ColumnDataLabel_pick(options.inside, !!this.options.stacking);\n // Align to the column itself, or the top of it\n if (dlBox) { // Area range uses this method but not alignTo\n alignTo = ColumnDataLabel_merge(dlBox);\n // Check for specific overflow and crop conditions (#13240)\n if (!(options.overflow === 'allow' && options.crop === false)) {\n if (alignTo.y < 0) {\n alignTo.height += alignTo.y;\n alignTo.y = 0;\n }\n // If parts of the box overshoots outside the plot area, modify\n // the box to center the label inside\n const overshoot = alignTo.y + alignTo.height - yLen;\n if (overshoot > 0 && overshoot < alignTo.height - 1) {\n alignTo.height -= overshoot;\n }\n }\n if (inverted) {\n alignTo = {\n x: yLen - alignTo.y - alignTo.height,\n y: xLen - alignTo.x - alignTo.width,\n width: alignTo.height,\n height: alignTo.width\n };\n }\n // Compute the alignment box\n if (!inside) {\n if (inverted) {\n alignTo.x += below ? 0 : alignTo.width;\n alignTo.width = 0;\n }\n else {\n alignTo.y += below ? alignTo.height : 0;\n alignTo.height = 0;\n }\n }\n }\n // When alignment is undefined (typically columns and bars), display the\n // individual point below or above the point depending on the threshold\n options.align = ColumnDataLabel_pick(options.align, !inverted || inside ? 'center' : below ? 'right' : 'left');\n options.verticalAlign = ColumnDataLabel_pick(options.verticalAlign, inverted || inside ? 'middle' : below ? 'top' : 'bottom');\n // Call the parent method\n ColumnDataLabel_Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n // If label was justified and we have contrast, set it:\n if (options.inside && point.contrastColor) {\n dataLabel.css({\n color: point.contrastColor\n });\n }\n }\n /** @private */\n function compose(ColumnSeriesClass) {\n Series_DataLabel.compose(ColumnDataLabel_Series);\n if (ColumnDataLabel_pushUnique(ColumnDataLabel_composed, 'ColumnDataLabel')) {\n ColumnSeriesClass.prototype.alignDataLabel = alignDataLabel;\n }\n }\n ColumnDataLabel.compose = compose;\n})(ColumnDataLabel || (ColumnDataLabel = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Column_ColumnDataLabel = (ColumnDataLabel);\n\n;// ./code/es-modules/Series/Bar/BarSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\nconst { extend: BarSeries_extend, merge: BarSeries_merge } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * Bar series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.bar\n *\n * @augments Highcharts.Series\n */\nclass BarSeries extends Column_ColumnSeries {\n}\n/* *\n *\n * Static Properties\n *\n * */\n/**\n * A bar series is a special type of column series where the columns are\n * horizontal.\n *\n * @sample highcharts/demo/bar-chart/\n * Bar chart\n *\n * @extends plotOptions.column\n * @product highcharts\n * @optionparent plotOptions.bar\n */\nBarSeries.defaultOptions = BarSeries_merge(Column_ColumnSeries.defaultOptions, {\n// Nothing here yet\n});\nBarSeries_extend(BarSeries.prototype, {\n inverted: true\n});\nSeries_SeriesRegistry.registerSeriesType('bar', BarSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Bar_BarSeries = ((/* unused pure expression or super */ null && (BarSeries)));\n/* *\n *\n * API Options\n *\n * */\n/**\n * A `bar` series. If the [type](#series.bar.type) option is not specified,\n * it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.bar\n * @excluding connectNulls, dashStyle, dataParser, dataURL, gapSize, gapUnit,\n * linecap, lineWidth, marker, connectEnds, step\n * @product highcharts\n * @apioption series.bar\n */\n/**\n * An array of data points for the series. For the `bar` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 5],\n * [1, 10],\n * [2, 3]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.bar.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * y: 1,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 10,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.column.data\n * @product highcharts\n * @apioption series.bar.data\n */\n/**\n * @excluding halo,lineWidth,lineWidthPlus,marker\n * @product highcharts highstock\n * @apioption series.bar.states.hover\n */\n/**\n * @excluding halo,lineWidth,lineWidthPlus,marker\n * @product highcharts highstock\n * @apioption series.bar.states.select\n */\n''; // Gets doclets above into transpiled\n\n;// ./code/es-modules/Series/Scatter/ScatterSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * A scatter plot uses cartesian coordinates to display values for two\n * variables for a set of data.\n *\n * @sample {highcharts} highcharts/demo/scatter/\n * Scatter plot\n *\n * @extends plotOptions.line\n * @excluding cropThreshold, legendSymbolColor, pointPlacement, shadow,\n * useOhlcData\n * @product highcharts highstock\n * @optionparent plotOptions.scatter\n */\nconst ScatterSeriesDefaults = {\n /**\n * The width of the line connecting the data points.\n *\n * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-none/\n * 0 by default\n * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-1/\n * 1px\n *\n * @product highcharts highstock\n */\n lineWidth: 0,\n findNearestPointBy: 'xy',\n /**\n * Apply a jitter effect for the rendered markers. When plotting\n * discrete values, a little random noise may help telling the points\n * apart. The jitter setting applies a random displacement of up to `n`\n * axis units in either direction. So for example on a horizontal X\n * axis, setting the `jitter.x` to 0.24 will render the point in a\n * random position between 0.24 units to the left and 0.24 units to the\n * right of the true axis position. On a category axis, setting it to\n * 0.5 will fill up the bin and make the data appear continuous.\n *\n * When rendered on top of a box plot or a column series, a jitter value\n * of 0.24 will correspond to the underlying series' default\n * [groupPadding](\n * https://api.highcharts.com/highcharts/plotOptions.column.groupPadding)\n * and [pointPadding](\n * https://api.highcharts.com/highcharts/plotOptions.column.pointPadding)\n * settings.\n *\n * **Note:** With boost mode enabled, the jitter effect is not supported.\n *\n * @sample {highcharts} highcharts/demo/scatter-jitter\n * Jitter on a scatter plot\n *\n * @sample {highcharts} highcharts/series-scatter/jitter-boxplot\n * Jittered scatter plot on top of a box plot\n *\n * @product highcharts highstock\n * @since 7.0.2\n */\n jitter: {\n /**\n * The maximal X offset for the random jitter effect.\n */\n x: 0,\n /**\n * The maximal Y offset for the random jitter effect.\n */\n y: 0\n },\n marker: {\n enabled: true // Overrides auto-enabling in line series (#3647)\n },\n /**\n * Sticky tracking of mouse events. When true, the `mouseOut` event\n * on a series isn't triggered until the mouse moves over another\n * series, or out of the plot area. When false, the `mouseOut` event on\n * a series is triggered when the mouse leaves the area around the\n * series' graph or markers. This also implies the tooltip. When\n * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n * will be hidden when moving the mouse between series.\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock highmaps\n * @apioption plotOptions.scatter.stickyTracking\n */\n /**\n * A configuration object for the tooltip rendering of each single\n * series. Properties are inherited from [tooltip](#tooltip).\n * Overridable properties are `headerFormat`, `pointFormat`,\n * `yDecimals`, `xDateFormat`, `yPrefix` and `ySuffix`. Unlike other\n * series, in a scatter plot the series.name by default shows in the\n * headerFormat and point.x and point.y in the pointFormat.\n *\n * @product highcharts highstock highmaps\n */\n tooltip: {\n /**\n * @product highcharts highstock\n */\n headerFormat: '\\u25CF ' +\n ' {series.name}
',\n pointFormat: 'x: {point.x}
y: {point.y}
'\n }\n};\n/**\n * A `scatter` series. If the [type](#series.scatter.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.scatter\n * @excluding cropThreshold, dataParser, dataURL, useOhlcData\n * @product highcharts highstock\n * @apioption series.scatter\n */\n/**\n * An array of data points for the series. For the `scatter` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 0],\n * [1, 8],\n * [2, 9]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.scatter.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * y: 2,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 4,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.line.data\n * @product highcharts highstock\n * @apioption series.scatter.data\n */\n''; // Keeps doclets above in JS file\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Scatter_ScatterSeriesDefaults = (ScatterSeriesDefaults);\n\n;// ./code/es-modules/Series/Scatter/ScatterSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { column: ScatterSeries_ColumnSeries, line: ScatterSeries_LineSeries } = Series_SeriesRegistry.seriesTypes;\n\nconst { addEvent: ScatterSeries_addEvent, extend: ScatterSeries_extend, merge: ScatterSeries_merge } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * Scatter series type.\n *\n * @private\n */\nclass ScatterSeries extends ScatterSeries_LineSeries {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Optionally add the jitter effect.\n * @private\n */\n applyJitter() {\n const series = this, jitter = this.options.jitter, len = this.points.length;\n /**\n * Return a repeatable, pseudo-random number based on an integer\n * seed.\n * @private\n */\n function unrandom(seed) {\n const rand = Math.sin(seed) * 10000;\n return rand - Math.floor(rand);\n }\n if (jitter) {\n this.points.forEach(function (point, i) {\n ['x', 'y'].forEach(function (dim, j) {\n if (jitter[dim] && !point.isNull) {\n const plotProp = `plot${dim.toUpperCase()}`, axis = series[`${dim}Axis`], translatedJitter = jitter[dim] *\n axis.transA;\n if (axis && !axis.logarithmic) {\n // Identify the outer bounds of the jitter range\n const min = Math.max(0, (point[plotProp] || 0) - translatedJitter), max = Math.min(axis.len, (point[plotProp] || 0) + translatedJitter);\n // Find a random position within this range\n point[plotProp] = min +\n (max - min) * unrandom(i + j * len);\n // Update clientX for the tooltip k-d-tree\n if (dim === 'x') {\n point.clientX = point.plotX;\n }\n }\n }\n });\n });\n }\n }\n /**\n * @private\n */\n drawGraph() {\n if (this.options.lineWidth) {\n super.drawGraph();\n }\n else if (this.graph) {\n this.graph = this.graph.destroy();\n }\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nScatterSeries.defaultOptions = ScatterSeries_merge(ScatterSeries_LineSeries.defaultOptions, Scatter_ScatterSeriesDefaults);\nScatterSeries_extend(ScatterSeries.prototype, {\n drawTracker: ScatterSeries_ColumnSeries.prototype.drawTracker,\n sorted: false,\n requireSorting: false,\n noSharedTooltip: true,\n trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup']\n});\n/* *\n *\n * Events\n *\n * */\n/* eslint-disable no-invalid-this */\nScatterSeries_addEvent(ScatterSeries, 'afterTranslate', function () {\n this.applyJitter();\n});\nSeries_SeriesRegistry.registerSeriesType('scatter', ScatterSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Scatter_ScatterSeries = ((/* unused pure expression or super */ null && (ScatterSeries)));\n\n;// ./code/es-modules/Series/CenteredUtilities.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { deg2rad: CenteredUtilities_deg2rad } = Core_Globals;\n\n\nconst { fireEvent: CenteredUtilities_fireEvent, isNumber: CenteredUtilities_isNumber, pick: CenteredUtilities_pick, relativeLength: CenteredUtilities_relativeLength } = Core_Utilities;\n/**\n * @private\n */\nvar CenteredUtilities;\n(function (CenteredUtilities) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Get the center of the pie based on the size and center options relative\n * to the plot area. Borrowed by the polar and gauge series types.\n *\n * @private\n * @function Highcharts.CenteredSeriesMixin.getCenter\n */\n function getCenter() {\n const options = this.options, chart = this.chart, slicingRoom = 2 * (options.slicedOffset || 0), plotWidth = chart.plotWidth - 2 * slicingRoom, plotHeight = chart.plotHeight - 2 * slicingRoom, centerOption = options.center, smallestSize = Math.min(plotWidth, plotHeight), thickness = options.thickness;\n let handleSlicingRoom, size = options.size, innerSize = options.innerSize || 0, i, value;\n if (typeof size === 'string') {\n size = parseFloat(size);\n }\n if (typeof innerSize === 'string') {\n innerSize = parseFloat(innerSize);\n }\n const positions = [\n CenteredUtilities_pick(centerOption?.[0], '50%'),\n CenteredUtilities_pick(centerOption?.[1], '50%'),\n // Prevent from negative values\n CenteredUtilities_pick(size && size < 0 ? void 0 : options.size, '100%'),\n CenteredUtilities_pick(innerSize && innerSize < 0 ? void 0 : options.innerSize || 0, '0%')\n ];\n // No need for inner size in angular (gauges) series but still required\n // for pie series\n if (chart.angular && !(this instanceof Series_Series)) {\n positions[3] = 0;\n }\n for (i = 0; i < 4; ++i) {\n value = positions[i];\n handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n // I == 0: centerX, relative to width\n // i == 1: centerY, relative to height\n // i == 2: size, relative to smallestSize\n // i == 3: innerSize, relative to size\n positions[i] = CenteredUtilities_relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) + (handleSlicingRoom ? slicingRoom : 0);\n }\n // Inner size cannot be larger than size (#3632)\n if (positions[3] > positions[2]) {\n positions[3] = positions[2];\n }\n // Thickness overrides innerSize, need to be less than pie size (#6647)\n if (CenteredUtilities_isNumber(thickness) &&\n thickness * 2 < positions[2] && thickness > 0) {\n positions[3] = positions[2] - thickness * 2;\n }\n CenteredUtilities_fireEvent(this, 'afterGetCenter', { positions });\n return positions;\n }\n CenteredUtilities.getCenter = getCenter;\n /**\n * GetStartAndEndRadians - Calculates start and end angles in radians.\n * Used in series types such as pie and sunburst.\n *\n * @private\n * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians\n *\n * @param {number} [start]\n * Start angle in degrees.\n *\n * @param {number} [end]\n * Start angle in degrees.\n *\n * @return {Highcharts.RadianAngles}\n * Returns an object containing start and end angles as radians.\n */\n function getStartAndEndRadians(start, end) {\n const startAngle = CenteredUtilities_isNumber(start) ? start : 0, // Must be a number\n endAngle = ((CenteredUtilities_isNumber(end) && // Must be a number\n end > startAngle && // Must be larger than the start angle\n // difference must be less than 360 degrees\n (end - startAngle) < 360) ?\n end :\n startAngle + 360), correction = -90;\n return {\n start: CenteredUtilities_deg2rad * (startAngle + correction),\n end: CenteredUtilities_deg2rad * (endAngle + correction)\n };\n }\n CenteredUtilities.getStartAndEndRadians = getStartAndEndRadians;\n})(CenteredUtilities || (CenteredUtilities = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_CenteredUtilities = (CenteredUtilities);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @private\n * @interface Highcharts.RadianAngles\n */ /**\n* @name Highcharts.RadianAngles#end\n* @type {number}\n*/ /**\n* @name Highcharts.RadianAngles#start\n* @type {number}\n*/\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Series/Pie/PiePoint.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { setAnimation: PiePoint_setAnimation } = AnimationUtilities;\n\n\nconst { addEvent: PiePoint_addEvent, defined: PiePoint_defined, extend: PiePoint_extend, isNumber: PiePoint_isNumber, pick: PiePoint_pick, relativeLength: PiePoint_relativeLength } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\nclass PiePoint extends Series_Point {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Extendable method for getting the path of the connector between the\n * data label and the pie slice.\n * @private\n */\n getConnectorPath(dataLabel) {\n const labelPosition = dataLabel.dataLabelPosition, options = (dataLabel.options || {}), connectorShape = options.connectorShape, shapeFunc = (this.connectorShapes[connectorShape] || connectorShape);\n return labelPosition && shapeFunc.call(this, {\n // Pass simplified label position object for user's convenience\n ...labelPosition.computed,\n alignment: labelPosition.alignment\n }, labelPosition.connectorPosition, options) || [];\n }\n /**\n * @private\n */\n getTranslate() {\n return this.sliced && this.slicedTranslation || {\n translateX: 0,\n translateY: 0\n };\n }\n /**\n * @private\n */\n haloPath(size) {\n const shapeArgs = this.shapeArgs;\n return this.sliced || !this.visible ?\n [] :\n this.series.chart.renderer.symbols.arc(shapeArgs.x, shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {\n // Substract 1px to ensure the background is not bleeding\n // through between the halo and the slice (#7495).\n innerR: shapeArgs.r - 1,\n start: shapeArgs.start,\n end: shapeArgs.end,\n borderRadius: shapeArgs.borderRadius\n });\n }\n /**\n * Initialize the pie slice.\n * @private\n */\n constructor(series, options, x) {\n super(series, options, x);\n this.half = 0;\n this.name ?? (this.name = 'Slice');\n // Add event listener for select\n const toggleSlice = (e) => {\n this.slice(e.type === 'select');\n };\n PiePoint_addEvent(this, 'select', toggleSlice);\n PiePoint_addEvent(this, 'unselect', toggleSlice);\n }\n /**\n * Negative points are not valid (#1530, #3623, #5322)\n * @private\n */\n isValid() {\n return PiePoint_isNumber(this.y) && this.y >= 0;\n }\n /**\n * Toggle the visibility of a pie slice or other data point. Note that this\n * method is available only for some series, like pie, treemap and sunburst.\n *\n * @function Highcharts.Point#setVisible\n *\n * @param {boolean} [vis]\n * True to show the pie slice or other data point, false to hide. If\n * undefined, the visibility is toggled.\n *\n * @param {boolean} [redraw] Whether to redraw the chart after the point is\n * altered. If doing more operations on the chart, it is a good idea to set\n * redraw to false and call {@link Chart#redraw|chart.redraw()} after.\n *\n */\n setVisible(vis, redraw = true) {\n if (vis !== this.visible) {\n // If called without an argument, toggle visibility\n this.update({\n visible: vis ?? !this.visible\n }, redraw, void 0, false);\n }\n }\n /**\n * Set or toggle whether the slice is cut out from the pie.\n * @private\n *\n * @param {boolean} sliced\n * When undefined, the slice state is toggled.\n *\n * @param {boolean} [redraw]\n * Whether to redraw the chart. True by default.\n *\n * @param {boolean|Partial} [animation]\n * Animation options.\n */\n slice(sliced, redraw, animation) {\n const series = this.series, chart = series.chart;\n PiePoint_setAnimation(animation, chart);\n // Redraw is true by default\n redraw = PiePoint_pick(redraw, true);\n /**\n * Pie series only. Whether to display a slice offset from the\n * center.\n * @name Highcharts.Point#sliced\n * @type {boolean|undefined}\n */\n // if called without an argument, toggle\n this.sliced = this.options.sliced = sliced =\n PiePoint_defined(sliced) ? sliced : !this.sliced;\n // Update userOptions.data\n series.options.data[series.data.indexOf(this)] =\n this.options;\n if (this.graphic) {\n this.graphic.animate(this.getTranslate());\n }\n }\n}\nPiePoint_extend(PiePoint.prototype, {\n connectorShapes: {\n // Only one available before v7.0.0\n fixedOffset: function (labelPosition, connectorPosition, options) {\n const breakAt = connectorPosition.breakAt, touchingSliceAt = connectorPosition.touchingSliceAt, lineSegment = options.softConnector ? [\n 'C', // Soft break\n // 1st control point (of the curve)\n labelPosition.x +\n // 5 gives the connector a little horizontal bend\n (labelPosition.alignment === 'left' ? -5 : 5),\n labelPosition.y, //\n 2 * breakAt.x - touchingSliceAt.x, // 2nd control point\n 2 * breakAt.y - touchingSliceAt.y, //\n breakAt.x, // End of the curve\n breakAt.y //\n ] : [\n 'L', // Pointy break\n breakAt.x,\n breakAt.y\n ];\n // Assemble the path\n return ([\n ['M', labelPosition.x, labelPosition.y],\n lineSegment,\n ['L', touchingSliceAt.x, touchingSliceAt.y]\n ]);\n },\n straight: function (labelPosition, connectorPosition) {\n const touchingSliceAt = connectorPosition.touchingSliceAt;\n // Direct line to the slice\n return [\n ['M', labelPosition.x, labelPosition.y],\n ['L', touchingSliceAt.x, touchingSliceAt.y]\n ];\n },\n crookedLine: function (labelPosition, connectorPosition, options) {\n const { angle = this.angle || 0, breakAt, touchingSliceAt } = connectorPosition, { series } = this, [cx, cy, diameter] = series.center, r = diameter / 2, { plotLeft, plotWidth } = series.chart, leftAligned = labelPosition.alignment === 'left', { x, y } = labelPosition;\n let crookX = breakAt.x;\n if (options.crookDistance) {\n const crookDistance = PiePoint_relativeLength(// % to fraction\n options.crookDistance, 1);\n crookX = leftAligned ?\n cx +\n r +\n (plotWidth + plotLeft - cx - r) * (1 - crookDistance) :\n plotLeft + (cx - r) * crookDistance;\n // When the crookDistance option is undefined, make the bend in the\n // intersection between the radial line in the middle of the slice,\n // and the extension of the label position.\n }\n else {\n crookX = cx + (cy - y) * Math.tan(angle - Math.PI / 2);\n }\n const path = [['M', x, y]];\n // The crookedLine formula doesn't make sense if the path overlaps\n // the label - use straight line instead in that case\n if (leftAligned ?\n (crookX <= x && crookX >= breakAt.x) :\n (crookX >= x && crookX <= breakAt.x)) {\n path.push(['L', crookX, y]);\n }\n path.push(['L', breakAt.x, breakAt.y], ['L', touchingSliceAt.x, touchingSliceAt.y]);\n return path;\n }\n }\n});\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Pie_PiePoint = (PiePoint);\n\n;// ./code/es-modules/Series/Pie/PieSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * A pie chart is a circular graphic which is divided into slices to\n * illustrate numerical proportion.\n *\n * @sample highcharts/demo/pie-chart/\n * Pie chart\n *\n * @extends plotOptions.line\n * @excluding animationLimit, boostThreshold, connectEnds, connectNulls,\n * cropThreshold, dashStyle, dataSorting, dragDrop,\n * findNearestPointBy, getExtremesFromAll, label, lineWidth,\n * linkedTo, marker, negativeColor, pointInterval,\n * pointIntervalUnit, pointPlacement, pointStart,\n * softThreshold, stacking, step, threshold, turboThreshold,\n * zoneAxis, zones, dataSorting, boostBlending\n * @product highcharts highmaps\n * @optionparent plotOptions.pie\n *\n * @private\n */\nconst PieSeriesDefaults = {\n /**\n * The corner radius of the border surrounding each slice. A number\n * signifies pixels. A percentage string, like for example `50%`, signifies\n * a size relative to the radius and the inner radius.\n *\n * @sample highcharts/plotoptions/series-border-radius\n * Column and pie with rounded border\n *\n * @since 11.0.0\n *\n * @type {number|string|Highcharts.BorderRadiusOptionsObject}\n */\n borderRadius: 3,\n /**\n * @excluding legendItemClick\n * @apioption plotOptions.pie.events\n */\n /**\n * Fires when the checkbox next to the point name in the legend is\n * clicked. One parameter, event, is passed to the function. The state\n * of the checkbox is found by event.checked. The checked item is found\n * by event.item. Return false to prevent the default action which is to\n * toggle the select state of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n * Alert checkbox status\n *\n * @type {Function}\n * @since 1.2.0\n * @product highcharts highmaps\n * @context Highcharts.Point\n * @apioption plotOptions.pie.events.checkboxClick\n */\n /**\n * Fires when the legend item belonging to the pie point (slice) is\n * clicked. The `this` keyword refers to the point itself. One\n * parameter, `event`, is passed to the function, containing common\n * event information. The default action is to toggle the visibility of\n * the point. This can be prevented by calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * [legend.events.itemClick](#legend.events.itemClick).\n *\n * @deprecated 11.4.4\n * @type {Highcharts.PointLegendItemClickCallbackFunction}\n * @since 1.2.0\n * @product highcharts highmaps\n * @apioption plotOptions.pie.point.events.legendItemClick\n */\n /**\n * The center of the pie chart relative to the plot area. Can be\n * percentages or pixel values. The default behaviour (as of 3.0) is to\n * center the pie so that all slices and data labels are within the plot\n * area. As a consequence, the pie may actually jump around in a chart\n * with dynamic values, as the data labels move. In that case, the\n * center should be explicitly set, for example to `[\"50%\", \"50%\"]`.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-center/\n * Centered at 100, 100\n *\n * @type {Array<(number|string|null),(number|string|null)>}\n * @default [null, null]\n * @product highcharts highmaps\n *\n * @private\n */\n center: [null, null],\n /**\n * The color of the pie series. A pie series is represented as an empty\n * circle if the total sum of its values is 0. Use this property to\n * define the color of its border.\n *\n * In styled mode, the color can be defined by the\n * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n * color can be set with the `.highcharts-series`,\n * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n * `.highcharts-series-{n}` class, or individual classes given by the\n * `className` option.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n * Empty pie series\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default ${palette.neutralColor20}\n * @apioption plotOptions.pie.color\n */\n /**\n * @product highcharts\n *\n * @private\n */\n clip: false,\n /**\n * @ignore-option\n *\n * @private\n */\n colorByPoint: true, // Always true for pies\n /**\n * A series specific or series type specific color set to use instead\n * of the global [colors](#colors).\n *\n * @sample {highcharts} highcharts/demo/pie-monochrome/\n * Set default colors for all pies\n *\n * @type {Array}\n * @since 3.0\n * @product highcharts highmaps\n * @apioption plotOptions.pie.colors\n */\n /**\n * @declare Highcharts.SeriesPieDataLabelsOptionsObject\n * @extends plotOptions.series.dataLabels\n * @excluding align, allowOverlap, inside, staggerLines, step\n * @private\n */\n dataLabels: {\n /**\n * Alignment method for data labels. Possible values are:\n *\n * - `plotEdges`: Each label touches the nearest vertical edge of\n * the plot area.\n *\n * - `connectors`: Connectors have the same x position and the\n * widest label of each half (left & right) touches the nearest\n * vertical edge of the plot area.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-connectors/\n * alignTo: connectors\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-plotedges/\n * alignTo: plotEdges\n *\n * @type {string}\n * @since 7.0.0\n * @product highcharts highmaps\n * @apioption plotOptions.pie.dataLabels.alignTo\n */\n /**\n * The color of the line connecting the data label to the pie slice.\n * The default color is the same as the point's color.\n *\n * In styled mode, the connector stroke is given in the\n * `.highcharts-data-label-connector` class.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorcolor/\n * Blue connectors\n * @sample {highcharts} highcharts/css/pie-point/\n * Styled connectors\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 2.1\n * @product highcharts highmaps\n * @apioption plotOptions.pie.dataLabels.connectorColor\n */\n /**\n * The distance from the data label to the connector. Note that\n * data labels also have a default `padding`, so in order for the\n * connector to touch the text, the `padding` must also be 0.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorpadding/\n * No padding\n *\n * @since 2.1\n * @product highcharts highmaps\n */\n connectorPadding: 5,\n /**\n * Specifies the method that is used to generate the connector path.\n * Highcharts provides 3 built-in connector shapes: `'crookedLine'`\n * (default since v11), `'fixedOffset'` and `'straight'`.\n *\n * Users can provide their own method by passing a function instead of a\n * string. Three arguments are passed to the callback:\n *\n * - An object that holds the information about the coordinates of the\n * label (`x` & `y` properties) and how the label is located in\n * relation to the pie (`alignment` property). `alignment` can by one\n * of the following: `'left'` (pie on the left side of the data\n * label), `'right'` (pie on the right side of the data label) or\n * `'center'` (data label overlaps the pie).\n *\n * - An object that holds the information about the position of the\n * connector. Its `touchingSliceAt` porperty tells the position of\n * the place where the connector touches the slice.\n *\n * - Data label options\n *\n * The function has to return an SVG path definition in array form (see\n * the example).\n *\n * @sample {highcharts}\n * highcharts/plotoptions/pie-datalabels-connectorshape-string/\n * connectorShape is a String\n * @sample {highcharts}\n * highcharts/plotoptions/pie-datalabels-connectorshape-function/\n * connectorShape is a function\n *\n * @type {string|Function}\n * @since 7.0.0\n * @product highcharts highmaps\n */\n connectorShape: 'crookedLine',\n /**\n * The width of the line connecting the data label to the pie slice.\n *\n * In styled mode, the connector stroke width is given in the\n * `.highcharts-data-label-connector` class.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorwidth-disabled/\n * Disable the connector\n * @sample {highcharts} highcharts/css/pie-point/\n * Styled connectors\n *\n * @type {number}\n * @default 1\n * @since 2.1\n * @product highcharts highmaps\n * @apioption plotOptions.pie.dataLabels.connectorWidth\n */\n /**\n * Works only if `connectorShape` is `'crookedLine'`. It defines how\n * far from the vertical plot edge the coonnector path should be\n * crooked. With the default, `undefined`, the crook is placed so that\n * the horizontal line from the label intersects with the radial line\n * extending through the center of the pie slice.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-crookdistance/\n * crookDistance set to 90%\n *\n * @since 7.0.0\n * @product highcharts highmaps\n */\n crookDistance: void 0,\n /**\n * The distance of the data label from the pie's edge. Negative\n * numbers put the data label on top of the pie slices. Can also be\n * defined as a percentage of pie's radius. Connectors are only\n * shown for data labels outside the pie.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-distance/\n * Data labels on top of the pie\n *\n * @type {number|string}\n * @since 2.1\n * @product highcharts highmaps\n */\n distance: 30,\n enabled: true,\n /**\n * A\n * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for the data label. Available variables are the same as for\n * `formatter`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n * Add a unit\n *\n * @type {string}\n * @default undefined\n * @since 3.0\n * @apioption plotOptions.pie.dataLabels.format\n */\n // eslint-disable-next-line valid-jsdoc\n /**\n * Callback JavaScript function to format the data label. Note that\n * if a `format` is defined, the format takes precedence and the\n * formatter is ignored.\n *\n * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n * @default function () { return this.point.isNull ? void 0 : this.point.name; }\n */\n formatter: function () {\n return this.isNull ? void 0 : this.name;\n },\n /**\n * Whether to render the connector as a soft arc or a line with a sharp\n * break. Works only if `connectorShape` equals to `fixedOffset`.\n *\n * @sample {highcharts}\n * highcharts/plotoptions/pie-datalabels-softconnector-true/\n * Soft\n * @sample {highcharts}\n * highcharts/plotoptions/pie-datalabels-softconnector-false/\n * Non soft\n *\n * @since 2.1.7\n * @product highcharts highmaps\n */\n softConnector: true,\n /**\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow\n * Long labels truncated with an ellipsis\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap\n * Long labels are wrapped\n *\n * @type {Highcharts.CSSObject}\n * @apioption plotOptions.pie.dataLabels.style\n */\n x: 0\n },\n /**\n * If the total sum of the pie's values is 0, the series is represented\n * as an empty circle . The `fillColor` option defines the color of that\n * circle. Use [pie.borderWidth](#plotOptions.pie.borderWidth) to set\n * the border thickness.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n * Empty pie series\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @private\n */\n fillColor: void 0,\n /**\n * The end angle of the pie in degrees where 0 is top and 90 is right.\n * Defaults to `startAngle` plus 360.\n *\n * @sample {highcharts} highcharts/demo/pie-semi-circle/\n * Semi-circle donut\n *\n * @type {number}\n * @since 1.3.6\n * @product highcharts highmaps\n * @apioption plotOptions.pie.endAngle\n */\n /**\n * Thickness describing the ring size for a donut type chart,\n * overriding [innerSize](#plotOptions.pie.innerSize).\n *\n * @type {number}\n * @default undefined\n * @product highcharts\n * @since 10.1.0\n * @apioption plotOptions.pie.thickness\n * @private\n */\n /**\n * Equivalent to [chart.ignoreHiddenSeries](#chart.ignoreHiddenSeries),\n * this option tells whether the series shall be redrawn as if the\n * hidden point were `null`.\n *\n * The default value changed from `false` to `true` with Highcharts\n * 3.0.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-ignorehiddenpoint/\n * True, the hiddden point is ignored\n *\n * @since 2.3.0\n * @product highcharts highmaps\n *\n * @private\n */\n ignoreHiddenPoint: true,\n /**\n * @default true\n * @extends plotOptions.series.inactiveOtherPoints\n * @private\n */\n inactiveOtherPoints: true,\n /**\n * The size of the inner diameter for the pie. A size greater than 0\n * renders a donut chart. Can be a percentage or pixel value.\n * Percentages are relative to the pie size. Pixel values are given as\n * integers. Setting overridden by thickness.\n *\n *\n * Note: in Highcharts < 4.1.2, the percentage was relative to the plot\n * area, not the pie size.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-innersize-80px/\n * 80px inner size\n * @sample {highcharts} highcharts/plotoptions/pie-innersize-50percent/\n * 50% of the plot area\n * @sample {highcharts} highcharts/demo/3d-pie-donut/\n * 3D donut\n *\n * @type {number|string}\n * @default 0\n * @since 2.0\n * @product highcharts highmaps\n * @apioption plotOptions.pie.innerSize\n */\n /**\n * @ignore-option\n *\n * @private\n */\n legendType: 'point',\n /**\n * @ignore-option\n *\n * @private\n */\n marker: null, // Point options are specified in the base options\n /**\n * The minimum size for a pie in response to auto margins. The pie will\n * try to shrink to make room for data labels in side the plot area,\n * but only to this size.\n *\n * @type {number|string}\n * @default 80\n * @since 3.0\n * @product highcharts highmaps\n * @apioption plotOptions.pie.minSize\n */\n /**\n * The diameter of the pie relative to the plot area. Can be a\n * percentage or pixel value. Pixel values are given as integers. The\n * default behaviour (as of 3.0) is to scale to the plot area and give\n * room for data labels within the plot area.\n * [slicedOffset](#plotOptions.pie.slicedOffset) is also included in the\n * default size calculation. As a consequence, the size of the pie may\n * vary when points are updated and data labels more around. In that\n * case it is best to set a fixed value, for example `\"75%\"`.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-size/\n * Smaller pie\n *\n * @type {number|string|null}\n * @product highcharts highmaps\n *\n * @private\n */\n size: null,\n /**\n * Whether to display this particular series or series type in the\n * legend. Since 2.1, pies are not shown in the legend by default.\n *\n * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n * One series in the legend, one hidden\n *\n * @product highcharts highmaps\n *\n * @private\n */\n showInLegend: false,\n /**\n * If a point is sliced, moved out from the center, how many pixels\n * should it be moved?.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-slicedoffset-20/\n * 20px offset\n *\n * @product highcharts highmaps\n *\n * @private\n */\n slicedOffset: 10,\n /**\n * The start angle of the pie slices in degrees where 0 is top and 90\n * right.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-startangle-90/\n * Start from right\n *\n * @type {number}\n * @default 0\n * @since 2.3.4\n * @product highcharts highmaps\n * @apioption plotOptions.pie.startAngle\n */\n /**\n * Sticky tracking of mouse events. When true, the `mouseOut` event\n * on a series isn't triggered until the mouse moves over another\n * series, or out of the plot area. When false, the `mouseOut` event on\n * a series is triggered when the mouse leaves the area around the\n * series' graph or markers. This also implies the tooltip. When\n * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n * will be hidden when moving the mouse between series.\n *\n * @product highcharts highmaps\n *\n * @private\n */\n stickyTracking: false,\n tooltip: {\n followPointer: true\n },\n /**\n * The color of the border surrounding each slice. When `null`, the\n * border takes the same color as the slice fill. This can be used\n * together with a `borderWidth` to fill drawing gaps created by\n * antialiazing artefacts in borderless pies.\n *\n * In styled mode, the border stroke is given in the `.highcharts-point`\n * class.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-bordercolor-black/\n * Black border\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #ffffff\n * @product highcharts highmaps\n *\n * @private\n */\n borderColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * The width of the border surrounding each slice.\n *\n * When setting the border width to 0, there may be small gaps between\n * the slices due to SVG antialiasing artefacts. To work around this,\n * keep the border width at 0.5 or 1, but set the `borderColor` to\n * `null` instead.\n *\n * In styled mode, the border stroke width is given in the\n * `.highcharts-point` class.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-borderwidth/\n * 3px border\n *\n * @product highcharts highmaps\n *\n * @private\n */\n borderWidth: 1,\n /**\n * @ignore-option\n * @private\n */\n lineWidth: void 0, // #12222\n states: {\n /**\n * @extends plotOptions.series.states.hover\n * @excluding marker, lineWidth, lineWidthPlus\n * @product highcharts highmaps\n */\n hover: {\n /**\n * How much to brighten the point on interaction. Requires the\n * main color to be defined in hex or rgb(a) format.\n *\n * In styled mode, the hover brightness is by default replaced\n * by a fill-opacity given in the `.highcharts-point-hover`\n * class.\n *\n * @sample {highcharts} highcharts/plotoptions/pie-states-hover-brightness/\n * Brightened by 0.5\n *\n * @product highcharts highmaps\n */\n brightness: 0.1\n }\n }\n};\n/**\n * A `pie` series. If the [type](#series.pie.type) option is not specified,\n * it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.pie\n * @excluding cropThreshold, dataParser, dataURL, linkedTo, stack, xAxis, yAxis,\n * dataSorting, step, boostThreshold, boostBlending\n * @product highcharts highmaps\n * @apioption series.pie\n */\n/**\n * An array of data points for the series. For the `pie` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.pie.turboThreshold),\n * this option is not available.\n * ```js\n * data: [{\n * y: 1,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * y: 7,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @type {Array|null|*>}\n * @extends series.line.data\n * @excluding marker, x\n * @product highcharts highmaps\n * @apioption series.pie.data\n */\n/**\n * @type {Highcharts.SeriesPieDataLabelsOptionsObject}\n * @product highcharts highmaps\n * @apioption series.pie.data.dataLabels\n */\n/**\n * The sequential index of the data point in the legend.\n *\n * @type {number}\n * @product highcharts highmaps\n * @apioption series.pie.data.legendIndex\n */\n/**\n * Whether to display a slice offset from the center.\n *\n * @sample {highcharts} highcharts/point/sliced/\n * One sliced point\n *\n * @type {boolean}\n * @product highcharts highmaps\n * @apioption series.pie.data.sliced\n */\n/**\n * @extends plotOptions.pie.dataLabels\n * @excluding align, allowOverlap, inside, staggerLines, step\n * @product highcharts highmaps\n * @apioption series.pie.dataLabels\n */\n/**\n * @excluding legendItemClick\n * @product highcharts highmaps\n * @apioption series.pie.events\n */\n''; // Placeholder for transpiled doclets above\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Pie_PieSeriesDefaults = (PieSeriesDefaults);\n\n;// ./code/es-modules/Series/Pie/PieSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { getStartAndEndRadians } = Series_CenteredUtilities;\n\n\nconst { noop: PieSeries_noop } = Core_Globals;\n\n\n\n\n\n\nconst { clamp: PieSeries_clamp, extend: PieSeries_extend, fireEvent: PieSeries_fireEvent, merge: PieSeries_merge, pick: PieSeries_pick } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * Pie series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.pie\n *\n * @augments Highcharts.Series\n */\nclass PieSeries extends Series_Series {\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * Animates the pies in.\n * @private\n */\n animate(init) {\n const series = this, points = series.points, startAngleRad = series.startAngleRad;\n if (!init) {\n points.forEach(function (point) {\n const graphic = point.graphic, args = point.shapeArgs;\n if (graphic && args) {\n // Start values\n graphic.attr({\n // Animate from inner radius (#779)\n r: PieSeries_pick(point.startR, (series.center && series.center[3] / 2)),\n start: startAngleRad,\n end: startAngleRad\n });\n // Animate\n graphic.animate({\n r: args.r,\n start: args.start,\n end: args.end\n }, series.options.animation);\n }\n });\n }\n }\n /**\n * Called internally to draw auxiliary graph in pie-like series in\n * situtation when the default graph is not sufficient enough to present\n * the data well. Auxiliary graph is saved in the same object as\n * regular graph.\n * @private\n */\n drawEmpty() {\n const start = this.startAngleRad, end = this.endAngleRad, options = this.options;\n let centerX, centerY;\n // Draw auxiliary graph if there're no visible points.\n if (this.total === 0 && this.center) {\n centerX = this.center[0];\n centerY = this.center[1];\n if (!this.graph) {\n this.graph = this.chart.renderer\n .arc(centerX, centerY, this.center[1] / 2, 0, start, end)\n .addClass('highcharts-empty-series')\n .add(this.group);\n }\n this.graph.attr({\n d: SVG_Symbols.arc(centerX, centerY, this.center[2] / 2, 0, {\n start,\n end,\n innerR: this.center[3] / 2\n })\n });\n if (!this.chart.styledMode) {\n this.graph.attr({\n 'stroke-width': options.borderWidth,\n fill: options.fillColor || 'none',\n stroke: options.color || \"#cccccc\" /* Palette.neutralColor20 */\n });\n }\n }\n else if (this.graph) { // Destroy the graph object.\n this.graph = this.graph.destroy();\n }\n }\n /**\n * Slices in pie chart are initialized in DOM, but it's shapes and\n * animations are normally run in `drawPoints()`.\n * @private\n */\n drawPoints() {\n const renderer = this.chart.renderer;\n this.points.forEach(function (point) {\n // When updating a series between 2d and 3d or cartesian and\n // polar, the shape type changes.\n if (point.graphic && point.hasNewShapeType()) {\n point.graphic = point.graphic.destroy();\n }\n if (!point.graphic) {\n point.graphic = renderer[point.shapeType](point.shapeArgs)\n .add(point.series.group);\n point.delayedRendering = true;\n }\n });\n }\n /**\n * Extend the generatePoints method by adding total and percentage\n * properties to each point\n * @private\n */\n generatePoints() {\n super.generatePoints();\n this.updateTotals();\n }\n /**\n * Utility for getting the x value from a given y, used for anticollision\n * logic in data labels.\n * @private\n */\n getX(y, left, point, dataLabel) {\n const center = this.center, \n // Variable pie has individual radius\n radius = this.radii ?\n this.radii[point.index] || 0 :\n center[2] / 2, labelPosition = dataLabel.dataLabelPosition, distance = labelPosition?.distance || 0;\n const angle = Math.asin(PieSeries_clamp((y - center[1]) / (radius + distance), -1, 1));\n const x = center[0] +\n (left ? -1 : 1) *\n (Math.cos(angle) * (radius + distance)) +\n (distance > 0 ?\n (left ? -1 : 1) * (dataLabel.padding || 0) :\n 0);\n return x;\n }\n /**\n * Define hasData function for non-cartesian series. Returns true if the\n * series has points at all.\n * @private\n */\n hasData() {\n return !!this.dataTable.rowCount;\n }\n /**\n * Draw the data points\n * @private\n */\n redrawPoints() {\n const series = this, chart = series.chart;\n let groupTranslation, graphic, pointAttr, shapeArgs;\n this.drawEmpty();\n // Apply the drop-shadow to the group because otherwise each element\n // would cast a shadow on others\n if (series.group && !chart.styledMode) {\n series.group.shadow(series.options.shadow);\n }\n // Draw the slices\n series.points.forEach(function (point) {\n const animateTo = {};\n graphic = point.graphic;\n if (!point.isNull && graphic) {\n shapeArgs = point.shapeArgs;\n // If the point is sliced, use special translation, else use\n // plot area translation\n groupTranslation = point.getTranslate();\n if (!chart.styledMode) {\n pointAttr = series.pointAttribs(point, (point.selected && 'select'));\n }\n // Draw the slice\n if (!point.delayedRendering) {\n graphic\n .setRadialReference(series.center);\n if (!chart.styledMode) {\n PieSeries_merge(true, animateTo, pointAttr);\n }\n PieSeries_merge(true, animateTo, shapeArgs, groupTranslation);\n graphic.animate(animateTo);\n }\n else {\n graphic\n .setRadialReference(series.center)\n .attr(shapeArgs)\n .attr(groupTranslation);\n if (!chart.styledMode) {\n graphic\n .attr(pointAttr)\n .attr({ 'stroke-linejoin': 'round' });\n }\n point.delayedRendering = false;\n }\n graphic\n .attr({\n visibility: point.visible ? 'inherit' : 'hidden'\n });\n graphic.addClass(point.getClassName(), true);\n }\n else if (graphic) {\n point.graphic = graphic.destroy();\n }\n });\n }\n /**\n * Utility for sorting data labels.\n * @private\n */\n sortByAngle(points, sign) {\n points.sort(function (a, b) {\n return ((typeof a.angle !== 'undefined') &&\n (b.angle - a.angle) * sign);\n });\n }\n /**\n * Do translation for pie slices\n * @private\n */\n translate(positions) {\n PieSeries_fireEvent(this, 'translate');\n this.generatePoints();\n const series = this, precision = 1000, // Issue #172\n options = series.options, slicedOffset = options.slicedOffset, radians = getStartAndEndRadians(options.startAngle, options.endAngle), startAngleRad = series.startAngleRad = radians.start, endAngleRad = series.endAngleRad = radians.end, circ = endAngleRad - startAngleRad, // 2 * Math.PI,\n points = series.points, ignoreHiddenPoint = options.ignoreHiddenPoint, len = points.length;\n let start, end, angle, \n // The x component of the radius vector for a given point\n radiusX, radiusY, i, point, cumulative = 0;\n // Get positions - either an integer or a percentage string must be\n // given. If positions are passed as a parameter, we're in a\n // recursive loop for adjusting space for data labels.\n if (!positions) {\n /**\n * The series center position, read only. This applies only to\n * circular chart types like pie and sunburst. It is an array of\n * `[centerX, centerY, diameter, innerDiameter]`.\n *\n * @name Highcharts.Series#center\n * @type {Array}\n */\n series.center = positions = series.getCenter();\n }\n // Calculate the geometry for each point\n for (i = 0; i < len; i++) {\n point = points[i];\n // Set start and end angle\n start = startAngleRad + (cumulative * circ);\n if (point.isValid() &&\n (!ignoreHiddenPoint || point.visible)) {\n cumulative += point.percentage / 100;\n }\n end = startAngleRad + (cumulative * circ);\n // Set the shape\n const shapeArgs = {\n x: positions[0],\n y: positions[1],\n r: positions[2] / 2,\n innerR: positions[3] / 2,\n start: Math.round(start * precision) / precision,\n end: Math.round(end * precision) / precision\n };\n point.shapeType = 'arc';\n point.shapeArgs = shapeArgs;\n // The angle must stay within -90 and 270 (#2645)\n angle = (end + start) / 2;\n if (angle > 1.5 * Math.PI) {\n angle -= 2 * Math.PI;\n }\n else if (angle < -Math.PI / 2) {\n angle += 2 * Math.PI;\n }\n // Center for the sliced out slice\n point.slicedTranslation = {\n translateX: Math.round(Math.cos(angle) * slicedOffset),\n translateY: Math.round(Math.sin(angle) * slicedOffset)\n };\n // Set the anchor point for tooltips\n radiusX = Math.cos(angle) * positions[2] / 2;\n radiusY = Math.sin(angle) * positions[2] / 2;\n point.tooltipPos = [\n positions[0] + radiusX * 0.7,\n positions[1] + radiusY * 0.7\n ];\n point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ?\n 1 :\n 0;\n point.angle = angle;\n }\n PieSeries_fireEvent(series, 'afterTranslate');\n }\n /**\n * Recompute total chart sum and update percentages of points.\n * @private\n */\n updateTotals() {\n const points = this.points, len = points.length, ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n let i, point, total = 0;\n // Get the total sum\n for (i = 0; i < len; i++) {\n point = points[i];\n if (point.isValid() &&\n (!ignoreHiddenPoint || point.visible)) {\n total += point.y;\n }\n }\n this.total = total;\n // Set each point's properties\n for (i = 0; i < len; i++) {\n point = points[i];\n point.percentage =\n (total > 0 && (point.visible || !ignoreHiddenPoint)) ?\n point.y / total * 100 :\n 0;\n point.total = total;\n }\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nPieSeries.defaultOptions = PieSeries_merge(Series_Series.defaultOptions, Pie_PieSeriesDefaults);\nPieSeries_extend(PieSeries.prototype, {\n axisTypes: [],\n directTouch: true,\n drawGraph: void 0,\n drawTracker: Column_ColumnSeries.prototype.drawTracker,\n getCenter: Series_CenteredUtilities.getCenter,\n getSymbol: PieSeries_noop,\n invertible: false,\n isCartesian: false,\n noSharedTooltip: true,\n pointAttribs: Column_ColumnSeries.prototype.pointAttribs,\n pointClass: Pie_PiePoint,\n requireSorting: false,\n searchPoint: PieSeries_noop,\n trackerGroups: ['group', 'dataLabelsGroup']\n});\nSeries_SeriesRegistry.registerSeriesType('pie', PieSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Pie_PieSeries = ((/* unused pure expression or super */ null && (PieSeries)));\n\n;// ./code/es-modules/Series/Pie/PieDataLabel.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { composed: PieDataLabel_composed, noop: PieDataLabel_noop } = Core_Globals;\n\nconst { distribute: PieDataLabel_distribute } = Renderer_RendererUtilities;\n\nconst { series: PieDataLabel_Series } = Series_SeriesRegistry;\n\nconst { arrayMax: PieDataLabel_arrayMax, clamp: PieDataLabel_clamp, defined: PieDataLabel_defined, pick: PieDataLabel_pick, pushUnique: PieDataLabel_pushUnique, relativeLength: PieDataLabel_relativeLength } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar PieDataLabel_ColumnDataLabel;\n(function (ColumnDataLabel) {\n /* *\n *\n * Constants\n *\n * */\n const dataLabelPositioners = {\n // Based on the value computed in Highcharts' distribute algorithm.\n radialDistributionY: function (point, dataLabel) {\n return (dataLabel.dataLabelPosition?.top || 0) +\n point.distributeBox.pos;\n },\n // Get the x - use the natural x position for labels near the top and\n // bottom, to prevent the top and botton slice connectors from touching\n // each other on either side. Based on the value computed in Highcharts'\n // distribute algorithm.\n radialDistributionX: function (series, point, y, naturalY, dataLabel) {\n const pos = dataLabel.dataLabelPosition;\n return series.getX(y < (pos?.top || 0) + 2 || y > (pos?.bottom || 0) - 2 ?\n naturalY :\n y, point.half, point, dataLabel);\n },\n // The dataLabels.distance determines the x position of the label\n justify: function (point, dataLabel, radius, seriesCenter) {\n return seriesCenter[0] + (point.half ? -1 : 1) *\n (radius + (dataLabel.dataLabelPosition?.distance || 0));\n },\n // Left edges of the left-half labels touch the left edge of the plot\n // area. Right edges of the right-half labels touch the right edge of\n // the plot area.\n alignToPlotEdges: function (dataLabel, half, plotWidth, plotLeft) {\n const dataLabelWidth = dataLabel.getBBox().width;\n return half ? dataLabelWidth + plotLeft :\n plotWidth - dataLabelWidth - plotLeft;\n },\n // Connectors of each side end in the same x position. Labels are\n // aligned to them. Left edge of the widest left-half label touches the\n // left edge of the plot area. Right edge of the widest right-half label\n // touches the right edge of the plot area.\n alignToConnectors: function (points, half, plotWidth, plotLeft) {\n let maxDataLabelWidth = 0, dataLabelWidth;\n // Find widest data label\n points.forEach(function (point) {\n dataLabelWidth = point.dataLabel.getBBox().width;\n if (dataLabelWidth > maxDataLabelWidth) {\n maxDataLabelWidth = dataLabelWidth;\n }\n });\n return half ? maxDataLabelWidth + plotLeft :\n plotWidth - maxDataLabelWidth - plotLeft;\n }\n };\n /* *\n *\n * Functions\n *\n * */\n /** @private */\n function compose(PieSeriesClass) {\n Series_DataLabel.compose(PieDataLabel_Series);\n if (PieDataLabel_pushUnique(PieDataLabel_composed, 'PieDataLabel')) {\n const pieProto = PieSeriesClass.prototype;\n pieProto.dataLabelPositioners = dataLabelPositioners;\n pieProto.alignDataLabel = PieDataLabel_noop;\n pieProto.drawDataLabels = drawDataLabels;\n pieProto.getDataLabelPosition = getDataLabelPosition;\n pieProto.placeDataLabels = placeDataLabels;\n pieProto.verifyDataLabelOverflow = verifyDataLabelOverflow;\n }\n }\n ColumnDataLabel.compose = compose;\n /** @private */\n function getDataLabelPosition(point, distance) {\n const halfPI = Math.PI / 2, { start = 0, end = 0 } = point.shapeArgs || {};\n let angle = point.angle || 0;\n // If a large slice is crossing the lowest point, prefer rendering it 45\n // degrees out at either lower right or lower left. That's where there's\n // most likely to be space available and avoid text being truncated\n // (#22100). Technically this logic should also apply to the top point,\n // but that is more of an edge case since the default start angle is at\n // the top.\n if (distance > 0 &&\n // Crossing the bottom\n start < halfPI && end > halfPI &&\n // Angle within the bottom quadrant\n angle > halfPI / 2 && angle < halfPI * 1.5) {\n angle = angle <= halfPI ?\n Math.max(halfPI / 2, (start + halfPI) / 2) :\n Math.min(halfPI * 1.5, (halfPI + end) / 2);\n }\n const { center, options } = this, r = center[2] / 2, cosAngle = Math.cos(angle), sinAngle = Math.sin(angle), x = center[0] + cosAngle * r, y = center[1] + sinAngle * r, finalConnectorOffset = Math.min((options.slicedOffset || 0) + (options.borderWidth || 0), distance / 5); // #1678\n return {\n natural: {\n // Initial position of the data label - it's utilized for\n // finding the final position for the label\n x: x + cosAngle * distance,\n y: y + sinAngle * distance\n },\n computed: {\n // Used for generating connector path - initialized later in\n // drawDataLabels function x: undefined, y: undefined\n },\n // Left - pie on the left side of the data label\n // Right - pie on the right side of the data label\n // Center - data label overlaps the pie\n alignment: distance < 0 ? 'center' : point.half ? 'right' : 'left',\n connectorPosition: {\n angle,\n breakAt: {\n x: x + cosAngle * finalConnectorOffset,\n y: y + sinAngle * finalConnectorOffset\n },\n touchingSliceAt: {\n x,\n y\n }\n },\n distance\n };\n }\n /**\n * Override the base drawDataLabels method by pie specific functionality\n * @private\n */\n function drawDataLabels() {\n const series = this, points = series.points, chart = series.chart, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, plotLeft = chart.plotLeft, maxWidth = Math.round(chart.chartWidth / 3), seriesCenter = series.center, radius = seriesCenter[2] / 2, centerY = seriesCenter[1], halves = [\n [], // Right\n [] // Left\n ], overflow = [0, 0, 0, 0], // Top, right, bottom, left\n dataLabelPositioners = series.dataLabelPositioners;\n let connector, dataLabelWidth, labelHeight, maxLabelDistance = 0;\n // Get out if not enabled\n if (!series.visible || !series.hasDataLabels?.()) {\n return;\n }\n // Reset all labels that have been shortened\n points.forEach((point) => {\n (point.dataLabels || []).forEach((dataLabel) => {\n if (dataLabel.shortened) {\n dataLabel\n .attr({\n width: 'auto'\n }).css({\n width: 'auto',\n textOverflow: 'clip'\n });\n dataLabel.shortened = false;\n }\n });\n });\n // Run parent method\n PieDataLabel_Series.prototype.drawDataLabels.apply(series);\n points.forEach((point) => {\n (point.dataLabels || []).forEach((dataLabel, i) => {\n const r = seriesCenter[2] / 2, dataLabelOptions = dataLabel.options, distance = PieDataLabel_relativeLength(dataLabelOptions?.distance || 0, r);\n // Arrange points for collision detection\n if (i === 0) {\n halves[point.half].push(point);\n }\n // Avoid long labels squeezing the pie size too far down\n if (!PieDataLabel_defined(dataLabelOptions?.style?.width)) {\n if (dataLabel.getBBox().width > maxWidth) {\n dataLabel.css({\n // Use a fraction of the maxWidth to avoid wrapping\n // close to the end of the string.\n width: Math.round(maxWidth * 0.7) + 'px'\n });\n dataLabel.shortened = true;\n }\n }\n dataLabel.dataLabelPosition = this.getDataLabelPosition(point, distance);\n maxLabelDistance = Math.max(maxLabelDistance, distance);\n });\n });\n /* Loop over the points in each half, starting from the top and bottom\n * of the pie to detect overlapping labels.\n */\n halves.forEach((points, halfIdx) => {\n const length = points.length, positions = [];\n let top, bottom, size = 0, distributionLength;\n if (!length) {\n return;\n }\n // Sort by angle\n series.sortByAngle(points, halfIdx - 0.5);\n // Only do anti-collision when we have dataLabels outside the pie\n // and have connectors. (#856)\n if (maxLabelDistance > 0) {\n top = Math.max(0, centerY - radius - maxLabelDistance);\n bottom = Math.min(centerY + radius + maxLabelDistance, chart.plotHeight);\n points.forEach((point) => {\n // Check if specific points' label is outside the pie\n (point.dataLabels || []).forEach((dataLabel) => {\n const labelPosition = dataLabel.dataLabelPosition;\n if (labelPosition &&\n labelPosition.distance > 0) {\n // The point.top depends on point.labelDistance\n // value. Used for calculation of y value in getX\n // method\n labelPosition.top = Math.max(0, centerY - radius - labelPosition.distance);\n labelPosition.bottom = Math.min(centerY + radius + labelPosition.distance, chart.plotHeight);\n size = dataLabel.getBBox().height || 21;\n dataLabel.lineHeight = chart.renderer.fontMetrics(dataLabel.text || dataLabel).h + 2 * dataLabel.padding;\n point.distributeBox = {\n target: ((dataLabel.dataLabelPosition\n ?.natural.y || 0) -\n labelPosition.top +\n dataLabel.lineHeight / 2),\n size,\n rank: point.y\n };\n positions.push(point.distributeBox);\n }\n });\n });\n distributionLength = bottom + size - top;\n PieDataLabel_distribute(positions, distributionLength, distributionLength / 5);\n // Uncomment this to visualize the boxes\n /*\n points.forEach((point): void => {\n const box = point.distributeBox;\n point.dlBox?.destroy();\n if (box?.pos) {\n point.dlBox = chart.renderer.rect(\n chart.plotLeft + this.center[0] + (\n halfIdx ?\n -this.center[2] / 2 - 100 :\n this.center[2] / 2\n ),\n chart.plotTop + box.pos,\n 100,\n box.size\n )\n .attr({\n stroke: 'silver',\n 'stroke-width': 1\n })\n .add();\n }\n });\n // */\n }\n // Now the used slots are sorted, fill them up sequentially\n points.forEach((point) => {\n (point.dataLabels || []).forEach((dataLabel) => {\n const dataLabelOptions = (dataLabel.options || {}), distributeBox = point.distributeBox, labelPosition = dataLabel.dataLabelPosition, naturalY = labelPosition?.natural.y || 0, connectorPadding = dataLabelOptions\n .connectorPadding || 0, lineHeight = dataLabel.lineHeight || 21, bBox = dataLabel.getBBox(), topOffset = (lineHeight - bBox.height) / 2;\n let x = 0, y = naturalY, visibility = 'inherit';\n if (labelPosition) {\n if (positions &&\n PieDataLabel_defined(distributeBox) &&\n labelPosition.distance > 0) {\n if (typeof distributeBox.pos === 'undefined') {\n visibility = 'hidden';\n }\n else {\n labelHeight = distributeBox.size;\n // Find label's y position\n y = dataLabelPositioners\n .radialDistributionY(point, dataLabel);\n }\n }\n // Find label's x position. The justify option is\n // undocumented in the API - preserve support for it\n if (dataLabelOptions.justify) {\n x = dataLabelPositioners.justify(point, dataLabel, radius, seriesCenter);\n }\n else {\n switch (dataLabelOptions.alignTo) {\n case 'connectors':\n x = dataLabelPositioners.alignToConnectors(points, halfIdx, plotWidth, plotLeft);\n break;\n case 'plotEdges':\n x = dataLabelPositioners.alignToPlotEdges(dataLabel, halfIdx, plotWidth, plotLeft);\n break;\n default:\n x = dataLabelPositioners.radialDistributionX(series, point, y - topOffset, naturalY, dataLabel);\n }\n }\n // Record the placement and visibility\n labelPosition.attribs = {\n visibility,\n align: labelPosition.alignment\n };\n labelPosition.posAttribs = {\n x: x +\n (dataLabelOptions.x || 0) + // (#12985)\n ({\n left: connectorPadding,\n right: -connectorPadding\n }[labelPosition.alignment] || 0),\n y: y +\n (dataLabelOptions.y || 0) - // (#12985)\n // Vertically center\n lineHeight / 2\n };\n labelPosition.computed.x = x;\n labelPosition.computed.y = y - topOffset;\n // Detect overflowing data labels\n if (PieDataLabel_pick(dataLabelOptions.crop, true)) {\n dataLabelWidth = dataLabel.getBBox().width;\n let sideOverflow;\n // Overflow left\n if (x - dataLabelWidth < connectorPadding &&\n halfIdx === 1 // Left half\n ) {\n sideOverflow = Math.round(dataLabelWidth - x + connectorPadding);\n overflow[3] = Math.max(sideOverflow, overflow[3]);\n // Overflow right\n }\n else if (x + dataLabelWidth >\n plotWidth - connectorPadding &&\n halfIdx === 0 // Right half\n ) {\n sideOverflow = Math.round(x +\n dataLabelWidth -\n plotWidth +\n connectorPadding);\n overflow[1] = Math.max(sideOverflow, overflow[1]);\n }\n // Overflow top\n if (y - labelHeight / 2 < 0) {\n overflow[0] = Math.max(Math.round(-y + labelHeight / 2), overflow[0]);\n // Overflow left\n }\n else if (y + labelHeight / 2 > plotHeight) {\n overflow[2] = Math.max(Math.round(y + labelHeight / 2 - plotHeight), overflow[2]);\n }\n labelPosition.sideOverflow = sideOverflow;\n }\n }\n }); // For each data label of the point\n }); // For each point\n }); // For each half\n // Do not apply the final placement and draw the connectors until we\n // have verified that labels are not spilling over.\n if (PieDataLabel_arrayMax(overflow) === 0 ||\n this.verifyDataLabelOverflow(overflow)) {\n // Place the labels in the final position\n this.placeDataLabels();\n this.points.forEach((point) => {\n (point.dataLabels || []).forEach((dataLabel) => {\n // #8864: every connector can have individual options\n const { connectorColor, connectorWidth = 1 } = (dataLabel.options || {}), labelPosition = dataLabel.dataLabelPosition;\n // Draw the connector\n if (connectorWidth) {\n let isNew;\n connector = dataLabel.connector;\n if (labelPosition && labelPosition.distance > 0) {\n isNew = !connector;\n if (!connector) {\n dataLabel.connector = connector = chart.renderer\n .path()\n .addClass('highcharts-data-label-connector ' +\n ' highcharts-color-' +\n point.colorIndex +\n (point.className ?\n ' ' + point.className :\n ''))\n .add(series.dataLabelsGroup);\n }\n if (!chart.styledMode) {\n connector.attr({\n 'stroke-width': connectorWidth,\n 'stroke': (connectorColor ||\n point.color ||\n \"#666666\" /* Palette.neutralColor60 */)\n });\n }\n connector[isNew ? 'attr' : 'animate']({\n d: point.getConnectorPath(dataLabel)\n });\n connector.attr({\n visibility: labelPosition.attribs?.visibility\n });\n }\n else if (connector) {\n dataLabel.connector = connector.destroy();\n }\n }\n });\n });\n }\n }\n /**\n * Perform the final placement of the data labels after we have verified\n * that they fall within the plot area.\n * @private\n */\n function placeDataLabels() {\n this.points.forEach((point) => {\n (point.dataLabels || []).forEach((dataLabel) => {\n const labelPosition = dataLabel.dataLabelPosition;\n if (labelPosition) {\n // Shorten data labels with ellipsis if they still overflow\n // after the pie has reached minSize (#223).\n if (labelPosition.sideOverflow) {\n dataLabel.css({\n width: (Math.max(dataLabel.getBBox().width -\n labelPosition.sideOverflow, 0)) + 'px',\n textOverflow: ((dataLabel.options?.style || {})\n .textOverflow ||\n 'ellipsis')\n });\n dataLabel.shortened = true;\n }\n dataLabel.attr(labelPosition.attribs);\n dataLabel[dataLabel.moved ? 'animate' : 'attr'](labelPosition.posAttribs);\n dataLabel.moved = true;\n }\n else if (dataLabel) {\n dataLabel.attr({ y: -9999 });\n }\n });\n // Clear for update\n delete point.distributeBox;\n }, this);\n }\n /**\n * Verify whether the data labels are allowed to draw, or we should run more\n * translation and data label positioning to keep them inside the plot area.\n * Returns true when data labels are ready to draw.\n * @private\n */\n function verifyDataLabelOverflow(overflow) {\n const center = this.center, options = this.options, centerOption = options.center, minSize = options.minSize || 80;\n let newSize = minSize, \n // If a size is set, return true and don't try to shrink the pie\n // to fit the labels.\n ret = options.size !== null;\n if (!ret) {\n // Handle horizontal size and center\n if (centerOption[0] !== null) { // Fixed center\n newSize = Math.max(center[2] -\n Math.max(overflow[1], overflow[3]), minSize);\n }\n else { // Auto center\n newSize = Math.max(\n // Horizontal overflow\n center[2] - overflow[1] - overflow[3], minSize);\n // Horizontal center\n center[0] += (overflow[3] - overflow[1]) / 2;\n }\n // Handle vertical size and center\n if (centerOption[1] !== null) { // Fixed center\n newSize = PieDataLabel_clamp(newSize, minSize, center[2] - Math.max(overflow[0], overflow[2]));\n }\n else { // Auto center\n newSize = PieDataLabel_clamp(newSize, minSize, \n // Vertical overflow\n center[2] - overflow[0] - overflow[2]);\n // Vertical center\n center[1] += (overflow[0] - overflow[2]) / 2;\n }\n // If the size must be decreased, we need to run translate and\n // drawDataLabels again\n if (newSize < center[2]) {\n center[2] = newSize;\n center[3] = Math.min(// #3632\n options.thickness ?\n Math.max(0, newSize - options.thickness * 2) :\n Math.max(0, PieDataLabel_relativeLength(options.innerSize || 0, newSize)), newSize); // #6647\n this.translate(center);\n if (this.drawDataLabels) {\n this.drawDataLabels();\n }\n // Else, return true to indicate that the pie and its labels is\n // within the plot area\n }\n else {\n ret = true;\n }\n }\n return ret;\n }\n})(PieDataLabel_ColumnDataLabel || (PieDataLabel_ColumnDataLabel = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const PieDataLabel = (PieDataLabel_ColumnDataLabel);\n\n;// ./code/es-modules/Core/Geometry/GeometryUtilities.js\n/* *\n *\n * (c) 2010-2024 Highsoft AS\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Namespace\n *\n * */\nvar GeometryUtilities;\n(function (GeometryUtilities) {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Calculates the center between a list of points.\n *\n * @private\n *\n * @param {Array} points\n * A list of points to calculate the center of.\n *\n * @return {Highcharts.PositionObject}\n * Calculated center\n */\n function getCenterOfPoints(points) {\n const sum = points.reduce((sum, point) => {\n sum.x += point.x;\n sum.y += point.y;\n return sum;\n }, { x: 0, y: 0 });\n return {\n x: sum.x / points.length,\n y: sum.y / points.length\n };\n }\n GeometryUtilities.getCenterOfPoints = getCenterOfPoints;\n /**\n * Calculates the distance between two points based on their x and y\n * coordinates.\n *\n * @private\n *\n * @param {Highcharts.PositionObject} p1\n * The x and y coordinates of the first point.\n *\n * @param {Highcharts.PositionObject} p2\n * The x and y coordinates of the second point.\n *\n * @return {number}\n * Returns the distance between the points.\n */\n function getDistanceBetweenPoints(p1, p2) {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n }\n GeometryUtilities.getDistanceBetweenPoints = getDistanceBetweenPoints;\n /**\n * Calculates the angle between two points.\n * @todo add unit tests.\n * @private\n * @param {Highcharts.PositionObject} p1 The first point.\n * @param {Highcharts.PositionObject} p2 The second point.\n * @return {number} Returns the angle in radians.\n */\n function getAngleBetweenPoints(p1, p2) {\n return Math.atan2(p2.x - p1.x, p2.y - p1.y);\n }\n GeometryUtilities.getAngleBetweenPoints = getAngleBetweenPoints;\n /**\n * Test for point in polygon. Polygon defined as array of [x,y] points.\n * @private\n * @param {PositionObject} point The point potentially within a polygon.\n * @param {Array>} polygon The polygon potentially containing the point.\n */\n function pointInPolygon({ x, y }, polygon) {\n const len = polygon.length;\n let i, j, inside = false;\n for (i = 0, j = len - 1; i < len; j = i++) {\n const [x1, y1] = polygon[i], [x2, y2] = polygon[j];\n if (y1 > y !== y2 > y &&\n (x < (x2 - x1) *\n (y - y1) /\n (y2 - y1) +\n x1)) {\n inside = !inside;\n }\n }\n return inside;\n }\n GeometryUtilities.pointInPolygon = pointInPolygon;\n})(GeometryUtilities || (GeometryUtilities = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Geometry_GeometryUtilities = (GeometryUtilities);\n\n;// ./code/es-modules/Extensions/OverlappingDataLabels.js\n/* *\n *\n * Highcharts module to hide overlapping data labels.\n * This module is included in Highcharts.\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { pointInPolygon } = Geometry_GeometryUtilities;\n\nconst { addEvent: OverlappingDataLabels_addEvent, fireEvent: OverlappingDataLabels_fireEvent, objectEach: OverlappingDataLabels_objectEach, pick: OverlappingDataLabels_pick } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n * provide a smooth visual impression.\n *\n * @requires modules/overlapping-datalabels\n *\n * @private\n * @function Highcharts.Chart#hideOverlappingLabels\n * @param {Array} labels\n * Rendered data labels\n */\nfunction chartHideOverlappingLabels(labels) {\n const chart = this, len = labels.length, isIntersectRect = (box1, box2) => !(box2.x >= box1.x + box1.width ||\n box2.x + box2.width <= box1.x ||\n box2.y >= box1.y + box1.height ||\n box2.y + box2.height <= box1.y), isPolygonOverlap = (box1Poly, box2Poly) => {\n for (const p of box1Poly) {\n if (pointInPolygon({ x: p[0], y: p[1] }, box2Poly)) {\n return true;\n }\n }\n return false;\n };\n /**\n * Get the box with its position inside the chart, as opposed to getBBox\n * that only reports the position relative to the parent.\n */\n function getAbsoluteBox(label) {\n if (label && (!label.alignAttr || label.placed)) {\n const padding = label.box ? 0 : (label.padding || 0), pos = label.alignAttr || {\n x: label.attr('x'),\n y: label.attr('y')\n }, bBox = label.getBBox();\n label.width = bBox.width;\n label.height = bBox.height;\n return {\n x: pos.x + (label.parentGroup?.translateX || 0) + padding,\n y: pos.y + (label.parentGroup?.translateY || 0) + padding,\n width: (label.width || 0) - 2 * padding,\n height: (label.height || 0) - 2 * padding,\n polygon: bBox?.polygon\n };\n }\n }\n let label, label1, label2, box1, box2, isLabelAffected = false;\n for (let i = 0; i < len; i++) {\n label = labels[i];\n if (label) {\n // Mark with initial opacity\n label.oldOpacity = label.opacity;\n label.newOpacity = 1;\n label.absoluteBox = getAbsoluteBox(label);\n }\n }\n // Prevent a situation in a gradually rising slope, that each label will\n // hide the previous one because the previous one always has lower rank.\n labels.sort((a, b) => (b.labelrank || 0) - (a.labelrank || 0));\n // Detect overlapping labels\n for (let i = 0; i < len; ++i) {\n label1 = labels[i];\n box1 = label1 && label1.absoluteBox;\n const box1Poly = box1?.polygon;\n for (let j = i + 1; j < len; ++j) {\n label2 = labels[j];\n box2 = label2 && label2.absoluteBox;\n let toHide = false;\n if (box1 &&\n box2 &&\n label1 !== label2 && // #6465, polar chart with connectEnds\n label1.newOpacity !== 0 &&\n label2.newOpacity !== 0 &&\n // #15863 dataLabels are no longer hidden by translation\n label1.visibility !== 'hidden' &&\n label2.visibility !== 'hidden') {\n const box2Poly = box2.polygon;\n // If labels have polygons, only evaluate\n // based on polygons\n if (box1Poly &&\n box2Poly &&\n box1Poly !== box2Poly) {\n if (isPolygonOverlap(box1Poly, box2Poly)) {\n toHide = true;\n }\n // If there are no polygons, evaluate rectangles coliding\n }\n else if (isIntersectRect(box1, box2)) {\n toHide = true;\n }\n if (toHide) {\n const overlappingLabel = (label1.labelrank < label2.labelrank ?\n label1 :\n label2), labelText = overlappingLabel.text;\n overlappingLabel.newOpacity = 0;\n if (labelText?.element.querySelector('textPath')) {\n labelText.hide();\n }\n }\n }\n }\n }\n // Hide or show\n for (const label of labels) {\n if (hideOrShow(label, chart)) {\n isLabelAffected = true;\n }\n }\n if (isLabelAffected) {\n OverlappingDataLabels_fireEvent(chart, 'afterHideAllOverlappingLabels');\n }\n}\n/** @private */\nfunction compose(ChartClass) {\n const chartProto = ChartClass.prototype;\n if (!chartProto.hideOverlappingLabels) {\n chartProto.hideOverlappingLabels = chartHideOverlappingLabels;\n OverlappingDataLabels_addEvent(ChartClass, 'render', OverlappingDataLabels_onChartRender);\n }\n}\n/**\n * Hide or show labels based on opacity.\n *\n * @private\n * @function hideOrShow\n * @param {Highcharts.SVGElement} label\n * The label.\n * @param {Highcharts.Chart} chart\n * The chart that contains the label.\n * @return {boolean}\n * Whether label is affected\n */\nfunction hideOrShow(label, chart) {\n let complete, newOpacity, isLabelAffected = false;\n if (label) {\n newOpacity = label.newOpacity;\n if (label.oldOpacity !== newOpacity) {\n // Toggle data labels\n if (label.hasClass('highcharts-data-label')) {\n // Make sure the label is completely hidden to avoid catching\n // clicks (#4362)\n label[newOpacity ? 'removeClass' : 'addClass']('highcharts-data-label-hidden');\n complete = function () {\n if (!chart.styledMode) {\n label.css({\n pointerEvents: newOpacity ? 'auto' : 'none'\n });\n }\n };\n isLabelAffected = true;\n // Animate or set the opacity\n label[label.isOld ? 'animate' : 'attr']({ opacity: newOpacity }, void 0, complete);\n OverlappingDataLabels_fireEvent(chart, 'afterHideOverlappingLabel');\n // Toggle other labels, tick labels\n }\n else {\n label.attr({\n opacity: newOpacity\n });\n }\n }\n label.isOld = true;\n }\n return isLabelAffected;\n}\n/**\n * Collect potential overlapping data labels. Stack labels probably don't need\n * to be considered because they are usually accompanied by data labels that lie\n * inside the columns.\n * @private\n */\nfunction OverlappingDataLabels_onChartRender() {\n const chart = this;\n let labels = [];\n // Consider external label collectors\n for (const collector of (chart.labelCollectors || [])) {\n labels = labels.concat(collector());\n }\n for (const yAxis of (chart.yAxis || [])) {\n if (yAxis.stacking &&\n yAxis.options.stackLabels &&\n !yAxis.options.stackLabels.allowOverlap) {\n OverlappingDataLabels_objectEach(yAxis.stacking.stacks, (stack) => {\n OverlappingDataLabels_objectEach(stack, (stackItem) => {\n if (stackItem.label) {\n labels.push(stackItem.label);\n }\n });\n });\n }\n }\n for (const series of (chart.series || [])) {\n if (series.visible && series.hasDataLabels?.()) { // #3866\n const push = (points) => {\n for (const point of points) {\n if (point.visible) {\n (point.dataLabels || []).forEach((label) => {\n const options = label.options || {};\n label.labelrank = OverlappingDataLabels_pick(options.labelrank, point.labelrank, point.shapeArgs?.height); // #4118\n // Allow overlap if the option is explicitly true\n if (\n // #13449\n options.allowOverlap ??\n // Pie labels outside have a separate placement\n // logic, skip the overlap logic\n Number(options.distance) > 0) {\n label.oldOpacity = label.opacity;\n label.newOpacity = 1;\n hideOrShow(label, chart);\n // Do not allow overlap\n }\n else {\n labels.push(label);\n }\n });\n }\n }\n };\n push(series.nodes || []);\n push(series.points);\n }\n }\n this.hideOverlappingLabels(labels);\n}\n/* *\n *\n * Default Export\n *\n * */\nconst OverlappingDataLabels = {\n compose\n};\n/* harmony default export */ const Extensions_OverlappingDataLabels = (OverlappingDataLabels);\n\n;// ./code/es-modules/Extensions/BorderRadius.js\n/* *\n *\n * Highcharts Border Radius module\n *\n * Author: Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defaultOptions: BorderRadius_defaultOptions } = Defaults;\n\nconst { noop: BorderRadius_noop } = Core_Globals;\n\nconst { addEvent: BorderRadius_addEvent, extend: BorderRadius_extend, isObject: BorderRadius_isObject, merge: BorderRadius_merge, relativeLength: BorderRadius_relativeLength } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\nconst defaultBorderRadiusOptions = {\n radius: 0,\n scope: 'stack',\n where: void 0\n};\n/* *\n *\n * Variables\n *\n * */\nlet oldArc = BorderRadius_noop;\nlet oldRoundedRect = BorderRadius_noop;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction applyBorderRadius(path, i, r) {\n const a = path[i];\n let b = path[i + 1];\n if (b[0] === 'Z') {\n b = path[0];\n }\n let line, arc, fromLineToArc;\n // From straight line to arc\n if ((a[0] === 'M' || a[0] === 'L') && b[0] === 'A') {\n line = a;\n arc = b;\n fromLineToArc = true;\n // From arc to straight line\n }\n else if (a[0] === 'A' && (b[0] === 'M' || b[0] === 'L')) {\n line = b;\n arc = a;\n }\n if (line && arc && arc.params) {\n const bigR = arc[1], \n // In our use cases, outer pie slice arcs are clockwise and inner\n // arcs (donut/sunburst etc) are anti-clockwise\n clockwise = arc[5], params = arc.params, { start, end, cx, cy } = params;\n // Some geometric constants\n const relativeR = clockwise ? (bigR - r) : (bigR + r), \n // The angle, on the big arc, that the border radius arc takes up\n angleOfBorderRadius = relativeR ? Math.asin(r / relativeR) : 0, angleOffset = clockwise ?\n angleOfBorderRadius :\n -angleOfBorderRadius, \n // The distance along the radius of the big arc to the starting\n // point of the small border radius arc\n distanceBigCenterToStartArc = (Math.cos(angleOfBorderRadius) *\n relativeR);\n // From line to arc\n if (fromLineToArc) {\n // Update the cache\n params.start = start + angleOffset;\n // First move to the start position at the radial line. We want to\n // start one borderRadius closer to the center.\n line[1] = cx + distanceBigCenterToStartArc * Math.cos(start);\n line[2] = cy + distanceBigCenterToStartArc * Math.sin(start);\n // Now draw an arc towards the point where the small circle touches\n // the great circle.\n path.splice(i + 1, 0, [\n 'A',\n r,\n r,\n 0, // Slanting,\n 0, // Long arc\n 1, // Clockwise\n cx + bigR * Math.cos(params.start),\n cy + bigR * Math.sin(params.start)\n ]);\n // From arc to line\n }\n else {\n // Update the cache\n params.end = end - angleOffset;\n // End the big arc a bit earlier\n arc[6] = cx + bigR * Math.cos(params.end);\n arc[7] = cy + bigR * Math.sin(params.end);\n // Draw a small arc towards a point on the end angle, but one\n // borderRadius closer to the center relative to the perimeter.\n path.splice(i + 1, 0, [\n 'A',\n r,\n r,\n 0,\n 0,\n 1,\n cx + distanceBigCenterToStartArc * Math.cos(end),\n cy + distanceBigCenterToStartArc * Math.sin(end)\n ]);\n }\n // Long or short arc must be reconsidered because we have modified the\n // start and end points\n arc[4] = Math.abs(params.end - params.start) < Math.PI ? 0 : 1;\n }\n}\n/**\n * Extend arc with borderRadius.\n * @private\n */\nfunction BorderRadius_arc(x, y, w, h, options = {}) {\n const path = oldArc(x, y, w, h, options), { innerR = 0, r = w, start = 0, end = 0 } = options;\n if (options.open || !options.borderRadius) {\n return path;\n }\n const alpha = end - start, sinHalfAlpha = Math.sin(alpha / 2), borderRadius = Math.max(Math.min(BorderRadius_relativeLength(options.borderRadius || 0, r - innerR), \n // Cap to half the sector radius\n (r - innerR) / 2, \n // For smaller pie slices, cap to the largest small circle that\n // can be fitted within the sector\n (r * sinHalfAlpha) / (1 + sinHalfAlpha)), 0), \n // For the inner radius, we need an extra cap because the inner arc\n // is shorter than the outer arc\n innerBorderRadius = Math.min(borderRadius, 2 * (alpha / Math.PI) * innerR);\n // Apply turn-by-turn border radius. Start at the end since we're\n // splicing in arc segments.\n let i = path.length - 1;\n while (i--) {\n applyBorderRadius(path, i, i > 1 ? innerBorderRadius : borderRadius);\n }\n return path;\n}\n/** @private */\nfunction seriesOnAfterColumnTranslate() {\n if (this.options.borderRadius &&\n !(this.chart.is3d && this.chart.is3d())) {\n const { options, yAxis } = this, percent = options.stacking === 'percent', seriesDefault = BorderRadius_defaultOptions.plotOptions?.[this.type]\n ?.borderRadius, borderRadius = optionsToObject(options.borderRadius, BorderRadius_isObject(seriesDefault) ? seriesDefault : {}), reversed = yAxis.options.reversed;\n for (const point of this.points) {\n const { shapeArgs } = point;\n if (point.shapeType === 'roundedRect' && shapeArgs) {\n const { width = 0, height = 0, y = 0 } = shapeArgs;\n let brBoxY = y, brBoxHeight = height;\n // It would be nice to refactor StackItem.getStackBox/\n // setOffset so that we could get a reliable box out of\n // it. Currently it is close if we remove the label\n // offset, but we still need to run crispCol and also\n // flip it if inverted, so atm it is simpler to do it\n // like the below.\n if (borderRadius.scope === 'stack' &&\n point.stackTotal) {\n const stackEnd = yAxis.translate(percent ? 100 : point.stackTotal, false, true, false, true), stackThreshold = yAxis.translate(options.threshold || 0, false, true, false, true), box = this.crispCol(0, Math.min(stackEnd, stackThreshold), 0, Math.abs(stackEnd - stackThreshold));\n brBoxY = box.y;\n brBoxHeight = box.height;\n }\n const flip = (point.negative ? -1 : 1) *\n (reversed ? -1 : 1) === -1;\n // Handle the where option\n let where = borderRadius.where;\n // Waterfall, hanging columns should have rounding on\n // all sides\n if (!where &&\n this.is('waterfall') &&\n Math.abs((point.yBottom || 0) -\n (this.translatedThreshold || 0)) > this.borderWidth) {\n where = 'all';\n }\n if (!where) {\n where = 'end';\n }\n // Get the radius\n const r = Math.min(BorderRadius_relativeLength(borderRadius.radius, width), width / 2, \n // Cap to the height, but not if where is `end`\n where === 'all' ? height / 2 : Infinity) || 0;\n // If the `where` option is 'end', cut off the\n // rectangles by making the border-radius box one r\n // greater, so that the imaginary radius falls outside\n // the rectangle.\n if (where === 'end') {\n if (flip) {\n brBoxY -= r;\n brBoxHeight += r;\n }\n else {\n brBoxHeight += r;\n }\n }\n BorderRadius_extend(shapeArgs, { brBoxHeight, brBoxY, r });\n }\n }\n }\n}\n/** @private */\nfunction BorderRadius_compose(SeriesClass, SVGElementClass, SVGRendererClass) {\n const PieSeriesClass = SeriesClass.types.pie;\n if (!SVGElementClass.symbolCustomAttribs.includes('borderRadius')) {\n const symbols = SVGRendererClass.prototype.symbols;\n BorderRadius_addEvent(SeriesClass, 'afterColumnTranslate', seriesOnAfterColumnTranslate, {\n // After columnrange and polar column modifications\n order: 9\n });\n BorderRadius_addEvent(PieSeriesClass, 'afterTranslate', pieSeriesOnAfterTranslate);\n SVGElementClass.symbolCustomAttribs.push('borderRadius', 'brBoxHeight', 'brBoxY');\n oldArc = symbols.arc;\n oldRoundedRect = symbols.roundedRect;\n symbols.arc = BorderRadius_arc;\n symbols.roundedRect = BorderRadius_roundedRect;\n }\n}\n/** @private */\nfunction optionsToObject(options, seriesBROptions) {\n if (!BorderRadius_isObject(options)) {\n options = { radius: options || 0 };\n }\n return BorderRadius_merge(defaultBorderRadiusOptions, seriesBROptions, options);\n}\n/** @private */\nfunction pieSeriesOnAfterTranslate() {\n const borderRadius = optionsToObject(this.options.borderRadius);\n for (const point of this.points) {\n const shapeArgs = point.shapeArgs;\n if (shapeArgs) {\n shapeArgs.borderRadius = BorderRadius_relativeLength(borderRadius.radius, (shapeArgs.r || 0) - ((shapeArgs.innerR) || 0));\n }\n }\n}\n/**\n * Extend roundedRect with individual cutting through rOffset.\n * @private\n */\nfunction BorderRadius_roundedRect(x, y, width, height, options = {}) {\n const path = oldRoundedRect(x, y, width, height, options), { r = 0, brBoxHeight = height, brBoxY = y } = options, brOffsetTop = y - brBoxY, brOffsetBtm = (brBoxY + brBoxHeight) - (y + height), \n // When the distance to the border-radius box is greater than the r\n // itself, it means no border radius. The -0.1 accounts for float\n // rounding errors.\n rTop = (brOffsetTop - r) > -0.1 ? 0 : r, rBtm = (brOffsetBtm - r) > -0.1 ? 0 : r, cutTop = Math.max(rTop && brOffsetTop, 0), cutBtm = Math.max(rBtm && brOffsetBtm, 0);\n /*\n\n The naming of control points:\n\n / a -------- b \\\n / \\\n h c\n | |\n | |\n | |\n g d\n \\ /\n \\ f -------- e /\n\n */\n const a = [x + rTop, y], b = [x + width - rTop, y], c = [x + width, y + rTop], d = [\n x + width, y + height - rBtm\n ], e = [\n x + width - rBtm,\n y + height\n ], f = [x + rBtm, y + height], g = [x, y + height - rBtm], h = [x, y + rTop];\n const applyPythagoras = (r, altitude) => Math.sqrt(Math.pow(r, 2) - Math.pow(altitude, 2));\n // Inside stacks, cut off part of the top\n if (cutTop) {\n const base = applyPythagoras(rTop, rTop - cutTop);\n a[0] -= base;\n b[0] += base;\n c[1] = h[1] = y + rTop - cutTop;\n }\n // Column is lower than the radius. Cut off bottom inside the top\n // radius.\n if (height < rTop - cutTop) {\n const base = applyPythagoras(rTop, rTop - cutTop - height);\n c[0] = d[0] = x + width - rTop + base;\n e[0] = Math.min(c[0], e[0]);\n f[0] = Math.max(d[0], f[0]);\n g[0] = h[0] = x + rTop - base;\n c[1] = h[1] = y + height;\n }\n // Inside stacks, cut off part of the bottom\n if (cutBtm) {\n const base = applyPythagoras(rBtm, rBtm - cutBtm);\n e[0] += base;\n f[0] -= base;\n d[1] = g[1] = y + height - rBtm + cutBtm;\n }\n // Cut off top inside the bottom radius\n if (height < rBtm - cutBtm) {\n const base = applyPythagoras(rBtm, rBtm - cutBtm - height);\n c[0] = d[0] = x + width - rBtm + base;\n b[0] = Math.min(c[0], b[0]);\n a[0] = Math.max(d[0], a[0]);\n g[0] = h[0] = x + rBtm - base;\n d[1] = g[1] = y;\n }\n // Preserve the box for data labels\n path.length = 0;\n path.push(['M', ...a], \n // Top side\n ['L', ...b], \n // Top right corner\n ['A', rTop, rTop, 0, 0, 1, ...c], \n // Right side\n ['L', ...d], \n // Bottom right corner\n ['A', rBtm, rBtm, 0, 0, 1, ...e], \n // Bottom side\n ['L', ...f], \n // Bottom left corner\n ['A', rBtm, rBtm, 0, 0, 1, ...g], \n // Left side\n ['L', ...h], \n // Top left corner\n ['A', rTop, rTop, 0, 0, 1, ...a], ['Z']);\n return path;\n}\n/* *\n *\n * Default Export\n *\n * */\nconst BorderRadius = {\n compose: BorderRadius_compose,\n optionsToObject\n};\n/* harmony default export */ const Extensions_BorderRadius = (BorderRadius);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Detailed options for border radius.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderradius/\n * Rounded columns\n * @sample highcharts/plotoptions/series-border-radius\n * Column and pie with rounded border\n *\n * @interface Highcharts.BorderRadiusOptionsObject\n */ /**\n* The border radius. A number signifies pixels. A percentage string, like for\n* example `50%`, signifies a relative size. For columns this is relative to the\n* column width, for pies it is relative to the radius and the inner radius.\n*\n* @name Highcharts.BorderRadiusOptionsObject#radius\n* @type {string|number}\n*/ /**\n* The scope of the rounding for column charts. In a stacked column chart, the\n* value `point` means each single point will get rounded corners. The value\n* `stack` means the rounding will apply to the full stack, so that only points\n* close to the top or bottom will receive rounding.\n*\n* @name Highcharts.BorderRadiusOptionsObject#scope\n* @validvalue [\"point\", \"stack\"]\n* @type {string}\n*/ /**\n* For column charts, where in the point or stack to apply rounding. The `end`\n* value means only those corners at the point value will be rounded, leaving\n* the corners at the base or threshold unrounded. This is the most intuitive\n* behaviour. The `all` value means also the base will be rounded.\n*\n* @name Highcharts.BorderRadiusOptionsObject#where\n* @validvalue [\"all\", \"end\"]\n* @type {string}\n* @default end\n*/\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Responsive.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { diffObjects: Responsive_diffObjects, extend: Responsive_extend, find: Responsive_find, merge: Responsive_merge, pick: Responsive_pick, uniqueKey: Responsive_uniqueKey } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar Responsive;\n(function (Responsive) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n function compose(ChartClass) {\n const chartProto = ChartClass.prototype;\n if (!chartProto.matchResponsiveRule) {\n Responsive_extend(chartProto, {\n matchResponsiveRule,\n setResponsive\n });\n }\n return ChartClass;\n }\n Responsive.compose = compose;\n /**\n * Handle a single responsiveness rule.\n *\n * @private\n * @function Highcharts.Chart#matchResponsiveRule\n * @param {Highcharts.ResponsiveRulesOptions} rule\n * @param {Array} matches\n */\n function matchResponsiveRule(rule, matches) {\n const condition = rule.condition, fn = condition.callback || function () {\n return (this.chartWidth <= Responsive_pick(condition.maxWidth, Number.MAX_VALUE) &&\n this.chartHeight <= Responsive_pick(condition.maxHeight, Number.MAX_VALUE) &&\n this.chartWidth >= Responsive_pick(condition.minWidth, 0) &&\n this.chartHeight >= Responsive_pick(condition.minHeight, 0));\n };\n if (fn.call(this)) {\n matches.push(rule._id);\n }\n }\n /**\n * Update the chart based on the current chart/document size and options\n * for responsiveness.\n *\n * @private\n * @function Highcharts.Chart#setResponsive\n * @param {boolean} [redraw=true]\n * @param {boolean} [reset=false]\n * Reset by un-applying all rules. Chart.update resets all rules before\n * applying updated options.\n */\n function setResponsive(redraw, reset) {\n const options = this.options.responsive, currentResponsive = this.currentResponsive;\n let ruleIds = [], undoOptions;\n if (!reset && options && options.rules) {\n options.rules.forEach((rule) => {\n if (typeof rule._id === 'undefined') {\n rule._id = Responsive_uniqueKey();\n }\n this.matchResponsiveRule(rule, ruleIds /* , redraw */);\n }, this);\n }\n // Merge matching rules\n const mergedOptions = Responsive_merge(...ruleIds\n .map((ruleId) => Responsive_find((options || {}).rules || [], (rule) => (rule._id === ruleId)))\n .map((rule) => (rule && rule.chartOptions)));\n mergedOptions.isResponsiveOptions = true;\n // Stringified key for the rules that currently apply.\n ruleIds = (ruleIds.toString() || void 0);\n const currentRuleIds = (currentResponsive && currentResponsive.ruleIds);\n // Changes in what rules apply\n if (ruleIds !== currentRuleIds) {\n // Undo previous rules. Before we apply a new set of rules, we\n // need to roll back completely to base options (#6291).\n if (currentResponsive) {\n this.currentResponsive = void 0;\n this.updatingResponsive = true;\n this.update(currentResponsive.undoOptions, redraw, true);\n this.updatingResponsive = false;\n }\n if (ruleIds) {\n // Get undo-options for matching rules. The `undoOptions``\n // hold the current values before they are changed by the\n // `mergedOptions`.\n undoOptions = Responsive_diffObjects(mergedOptions, this.options, true, this.collectionsWithUpdate);\n undoOptions.isResponsiveOptions = true;\n this.currentResponsive = {\n ruleIds: ruleIds,\n mergedOptions: mergedOptions,\n undoOptions: undoOptions\n };\n if (!this.updatingResponsive) {\n this.update(mergedOptions, redraw, true);\n }\n }\n else {\n this.currentResponsive = void 0;\n }\n }\n }\n})(Responsive || (Responsive = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Core_Responsive = (Responsive);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A callback function to gain complete control on when the responsive rule\n * applies.\n *\n * @callback Highcharts.ResponsiveCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * Chart context.\n *\n * @return {boolean}\n * Return `true` if it applies.\n */\n(''); // Keeps doclets above in JS file\n/* *\n *\n * API Options\n *\n * */\n/**\n * Allows setting a set of rules to apply for different screen or chart\n * sizes. Each rule specifies additional chart options.\n *\n * @sample {highstock} stock/demo/responsive/\n * Stock chart\n * @sample highcharts/responsive/axis/\n * Axis\n * @sample highcharts/responsive/legend/\n * Legend\n * @sample highcharts/responsive/classname/\n * Class name\n *\n * @since 5.0.0\n * @apioption responsive\n */\n/**\n * A set of rules for responsive settings. The rules are executed from\n * the top down.\n *\n * @sample {highcharts} highcharts/responsive/axis/\n * Axis changes\n * @sample {highstock} highcharts/responsive/axis/\n * Axis changes\n * @sample {highmaps} highcharts/responsive/axis/\n * Axis changes\n *\n * @type {Array<*>}\n * @since 5.0.0\n * @apioption responsive.rules\n */\n/**\n * A full set of chart options to apply as overrides to the general\n * chart options. The chart options are applied when the given rule\n * is active.\n *\n * A special case is configuration objects that take arrays, for example\n * [xAxis](#xAxis), [yAxis](#yAxis) or [series](#series). For these\n * collections, an `id` option is used to map the new option set to\n * an existing object. If an existing object of the same id is not found,\n * the item of the same index updated. So for example, setting `chartOptions`\n * with two series items without an `id`, will cause the existing chart's\n * two series to be updated with respective options.\n *\n * @sample {highstock} stock/demo/responsive/\n * Stock chart\n * @sample highcharts/responsive/axis/\n * Axis\n * @sample highcharts/responsive/legend/\n * Legend\n * @sample highcharts/responsive/classname/\n * Class name\n *\n * @type {Highcharts.Options}\n * @since 5.0.0\n * @apioption responsive.rules.chartOptions\n */\n/**\n * Under which conditions the rule applies.\n *\n * @since 5.0.0\n * @apioption responsive.rules.condition\n */\n/**\n * A callback function to gain complete control on when the responsive\n * rule applies. Return `true` if it applies. This opens for checking\n * against other metrics than the chart size, for example the document\n * size or other elements.\n *\n * @type {Highcharts.ResponsiveCallbackFunction}\n * @since 5.0.0\n * @context Highcharts.Chart\n * @apioption responsive.rules.condition.callback\n */\n/**\n * The responsive rule applies if the chart height is less than this.\n *\n * @type {number}\n * @since 5.0.0\n * @apioption responsive.rules.condition.maxHeight\n */\n/**\n * The responsive rule applies if the chart width is less than this.\n *\n * @sample highcharts/responsive/axis/\n * Max width is 500\n *\n * @type {number}\n * @since 5.0.0\n * @apioption responsive.rules.condition.maxWidth\n */\n/**\n * The responsive rule applies if the chart height is greater than this.\n *\n * @type {number}\n * @default 0\n * @since 5.0.0\n * @apioption responsive.rules.condition.minHeight\n */\n/**\n * The responsive rule applies if the chart width is greater than this.\n *\n * @type {number}\n * @default 0\n * @since 5.0.0\n * @apioption responsive.rules.condition.minWidth\n */\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/masters/highcharts.src.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst G = Core_Globals;\n// Classes\nG.AST = HTML_AST;\nG.Axis = Axis_Axis;\nG.Chart = Chart_Chart;\nG.Color = Color_Color;\nG.DataLabel = Series_DataLabel;\nG.DataTableCore = Data_DataTableCore;\nG.Fx = Animation_Fx;\nG.HTMLElement = HTML_HTMLElement;\nG.Legend = Legend_Legend;\nG.LegendSymbol = Legend_LegendSymbol;\nG.OverlappingDataLabels = G.OverlappingDataLabels || Extensions_OverlappingDataLabels;\nG.PlotLineOrBand = PlotLineOrBand_PlotLineOrBand;\nG.Point = Series_Point;\nG.Pointer = Core_Pointer;\nG.RendererRegistry = Renderer_RendererRegistry;\nG.Series = Series_Series;\nG.SeriesRegistry = Series_SeriesRegistry;\nG.StackItem = Stacking_StackItem;\nG.SVGElement = SVG_SVGElement;\nG.SVGRenderer = SVG_SVGRenderer;\nG.Templating = Core_Templating;\nG.Tick = Axis_Tick;\nG.Time = Core_Time;\nG.Tooltip = Core_Tooltip;\n// Utilities\nG.animate = AnimationUtilities.animate;\nG.animObject = AnimationUtilities.animObject;\nG.chart = Chart_Chart.chart;\nG.color = Color_Color.parse;\nG.dateFormat = Core_Templating.dateFormat;\nG.defaultOptions = Defaults.defaultOptions;\nG.distribute = Renderer_RendererUtilities.distribute;\nG.format = Core_Templating.format;\nG.getDeferredAnimation = AnimationUtilities.getDeferredAnimation;\nG.getOptions = Defaults.getOptions;\nG.numberFormat = Core_Templating.numberFormat;\nG.seriesType = Series_SeriesRegistry.seriesType;\nG.setAnimation = AnimationUtilities.setAnimation;\nG.setOptions = Defaults.setOptions;\nG.stop = AnimationUtilities.stop;\nG.time = Defaults.defaultTime;\nG.timers = Animation_Fx.timers;\n// Compositions\nExtensions_BorderRadius.compose(G.Series, G.SVGElement, G.SVGRenderer);\nColumn_ColumnDataLabel.compose(G.Series.types.column);\nSeries_DataLabel.compose(G.Series);\nAxis_DateTimeAxis.compose(G.Axis);\nHTML_HTMLElement.compose(G.SVGRenderer);\nLegend_Legend.compose(G.Chart);\nAxis_LogarithmicAxis.compose(G.Axis);\nExtensions_OverlappingDataLabels.compose(G.Chart);\nPieDataLabel.compose(G.Series.types.pie);\nPlotLineOrBand_PlotLineOrBand.compose(G.Chart, G.Axis);\nCore_Pointer.compose(G.Chart);\nCore_Responsive.compose(G.Chart);\nExtensions_ScrollablePlotArea.compose(G.Axis, G.Chart, G.Series);\nStacking_StackingAxis.compose(G.Axis, G.Chart, G.Series);\nCore_Tooltip.compose(G.Pointer);\nCore_Utilities.extend(G, Core_Utilities);\n// Default Export\n/* harmony default export */ const highcharts_src = (G);\n\n;// ./code/es-modules/Series/DataModifyComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { tooltipFormatter: pointTooltipFormatter } = Series_Point.prototype;\n\n\nconst { addEvent: DataModifyComposition_addEvent, arrayMax: DataModifyComposition_arrayMax, arrayMin: DataModifyComposition_arrayMin, correctFloat: DataModifyComposition_correctFloat, defined: DataModifyComposition_defined, isArray: DataModifyComposition_isArray, isNumber: DataModifyComposition_isNumber, isString: DataModifyComposition_isString, pick: DataModifyComposition_pick } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar DataModifyComposition;\n(function (DataModifyComposition) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Extends the series, axis and point classes with\n * compare and cumulative support.\n *\n * @private\n *\n * @param SeriesClass\n * Series class to use.\n *\n * @param AxisClass\n * Axis class to extend.\n *\n * @param PointClass\n * Point class to use.\n */\n function compose(SeriesClass, AxisClass, PointClass) {\n const axisProto = AxisClass.prototype, pointProto = PointClass.prototype, seriesProto = SeriesClass.prototype;\n if (!seriesProto.setCompare) {\n seriesProto.setCompare = seriesSetCompare;\n seriesProto.setCumulative = seriesSetCumulative;\n DataModifyComposition_addEvent(SeriesClass, 'afterInit', afterInit);\n DataModifyComposition_addEvent(SeriesClass, 'afterGetExtremes', afterGetExtremes);\n DataModifyComposition_addEvent(SeriesClass, 'afterProcessData', afterProcessData);\n }\n if (!axisProto.setCompare) {\n axisProto.setCompare = axisSetCompare;\n axisProto.setModifier = setModifier;\n axisProto.setCumulative = axisSetCumulative;\n pointProto.tooltipFormatter = tooltipFormatter;\n }\n return SeriesClass;\n }\n DataModifyComposition.compose = compose;\n /* ********************************************************************** *\n * Start shared compare and cumulative logic *\n * ********************************************************************** */\n /**\n * Shared code for the axis.setCompare() and the axis.setCumulative()\n * methods. Inits the 'compare' or the 'cumulative' mode.\n * @private\n */\n function setModifier(mode, modeState, redraw) {\n if (!this.isXAxis) {\n this.series.forEach(function (series) {\n if (mode === 'compare' &&\n typeof modeState !== 'boolean') {\n series.setCompare(modeState, false);\n }\n else if (mode === 'cumulative' &&\n !DataModifyComposition_isString(modeState)) {\n series.setCumulative(modeState, false);\n }\n });\n if (DataModifyComposition_pick(redraw, true)) {\n this.chart.redraw();\n }\n }\n }\n /**\n * Extend the tooltip formatter by adding support for the point.change\n * variable as well as the changeDecimals option.\n *\n * @ignore\n * @function Highcharts.Point#tooltipFormatter\n *\n * @param {string} pointFormat\n */\n function tooltipFormatter(pointFormat) {\n const point = this, { numberFormatter } = point.series.chart, replace = function (value) {\n pointFormat = pointFormat.replace('{point.' + value + '}', (point[value] > 0 && value === 'change' ? '+' : '') +\n numberFormatter(point[value], DataModifyComposition_pick(point.series.tooltipOptions.changeDecimals, 2)));\n };\n if (DataModifyComposition_defined(point.change)) {\n replace('change');\n }\n if (DataModifyComposition_defined(point.cumulativeSum)) {\n replace('cumulativeSum');\n }\n return pointTooltipFormatter.apply(this, [pointFormat]);\n }\n /**\n * Extend series.init by adding a methods to modify the y values used\n * for plotting on the y axis. For compare mode, this method is called both\n * from the axis when finding dataMin and dataMax,\n * and from the series.translate method.\n *\n * @ignore\n * @function Highcharts.Series#init\n */\n function afterInit() {\n const compare = this.options.compare;\n let dataModify;\n if (compare === 'percent' ||\n compare === 'value' ||\n this.options.cumulative) {\n dataModify = new Additions(this);\n if (compare === 'percent' || compare === 'value') {\n // Set comparison mode\n dataModify.initCompare(compare);\n }\n else {\n // Set Cumulative Sum mode\n dataModify.initCumulative();\n }\n }\n this.dataModify = dataModify;\n }\n /**\n * Adjust the extremes (compare and cumulative modify the data).\n * @private\n */\n function afterGetExtremes(e) {\n const dataExtremes = e.dataExtremes, activeYData = dataExtremes.activeYData;\n if (this.dataModify && dataExtremes) {\n let extremes;\n if (this.options.compare) {\n extremes = [\n this.dataModify.modifyValue(dataExtremes.dataMin),\n this.dataModify.modifyValue(dataExtremes.dataMax)\n ];\n }\n else if (this.options.cumulative &&\n DataModifyComposition_isArray(activeYData) &&\n // If only one y visible, sum doesn't change\n // so no need to change extremes\n activeYData.length >= 2) {\n extremes = Additions.getCumulativeExtremes(activeYData);\n }\n if (extremes) {\n dataExtremes.dataMin = DataModifyComposition_arrayMin(extremes);\n dataExtremes.dataMax = DataModifyComposition_arrayMax(extremes);\n }\n }\n }\n /* ********************************************************************** *\n * End shared compare and cumulative logic *\n * ********************************************************************** */\n /* ********************************************************************** *\n * Start value compare logic *\n * ********************************************************************** */\n /**\n * Highcharts Stock only. Set the\n * [compare](https://api.highcharts.com/highstock/plotOptions.series.compare)\n * mode of the series after render time.\n * In most cases it is more useful running\n * {@link Axis#setCompare} on the X axis to update all its series.\n *\n * @function Highcharts.Series#setCompare\n *\n * @param {string|null} [compare]\n * Can be one of `undefined` (default), `null`, `\"percent\"`\n * or `\"value\"`.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or to wait for a later call to\n * {@link Chart#redraw}.\n */\n function seriesSetCompare(compare, redraw) {\n // Survive to export, #5485 (and for options generally)\n this.options.compare = this.userOptions.compare = compare;\n // Fire series.init() that will set or delete series.dataModify\n this.update({}, DataModifyComposition_pick(redraw, true));\n if (this.dataModify && (compare === 'value' || compare === 'percent')) {\n this.dataModify.initCompare(compare);\n }\n else {\n // When disabling, clear the points\n this.points.forEach((point) => {\n delete point.change;\n });\n }\n }\n /**\n * Extend series.processData by finding the first y value in the plot area,\n * used for comparing the following values\n *\n * @ignore\n * @function Highcharts.Series#processData\n */\n function afterProcessData() {\n const series = this, \n // For series with more than one value (range, OHLC etc), compare\n // against close or the pointValKey (#4922, #3112, #9854)\n compareColumn = this.getColumn((series.pointArrayMap &&\n (series.options.pointValKey || series.pointValKey)) || 'y', true);\n if (series.xAxis && // Not pies\n compareColumn.length &&\n series.dataModify) {\n const processedXData = series.getColumn('x', true), length = series.dataTable.rowCount, compareStart = series.options.compareStart === true ? 0 : 1;\n // Find the first value for comparison\n for (let i = 0; i < length - compareStart; i++) {\n const compareValue = compareColumn[i];\n if (DataModifyComposition_isNumber(compareValue) &&\n compareValue !== 0 &&\n processedXData[i + compareStart] >= (series.xAxis.min || 0)) {\n series.dataModify.compareValue = compareValue;\n break;\n }\n }\n }\n }\n /**\n * Highcharts Stock only. Set the compare mode on all series\n * belonging to a Y axis.\n *\n * @see [plotOptions.series.compare](https://api.highcharts.com/highstock/plotOptions.series.compare)\n *\n * @sample stock/members/axis-setcompare/\n * Set compare\n *\n * @function Highcharts.Axis#setCompare\n *\n * @param {string|null} [compare]\n * The compare mode. Can be one of `undefined` (default), `null`,\n * `\"value\"` or `\"percent\"`.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or to wait for a later call to\n * {@link Chart#redraw}.\n */\n function axisSetCompare(compare, redraw) {\n this.setModifier('compare', compare, redraw);\n }\n /* ********************************************************************** *\n * End value compare logic *\n * ********************************************************************** */\n /* ********************************************************************** *\n * Start Cumulative Sum logic, author: Rafal Sebestjanski *\n * ********************************************************************** */\n /**\n * Highcharts Stock only. Set the\n * [cumulative](https://api.highcharts.com/highstock/plotOptions.series.cumulative)\n * mode of the series after render time.\n * In most cases it is more useful running\n * {@link Axis#setCumulative} on the Y axis to update all its series.\n *\n * @function Highcharts.Series#setCumulative\n *\n * @param {boolean} [cumulative=false]\n * Either enable or disable Cumulative Sum mode.\n * Can be one of `false` (default) or `true`.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or to wait for a later call to\n * {@link Chart#redraw}.\n */\n function seriesSetCumulative(cumulative, redraw) {\n // Set default value to false\n cumulative = DataModifyComposition_pick(cumulative, false);\n // Survive to export, #5485 (and for options generally)\n this.options.cumulative = this.userOptions.cumulative = cumulative;\n // Fire series.init() that will set or delete series.dataModify\n this.update({}, DataModifyComposition_pick(redraw, true));\n // If should, turn on the Cumulative Sum mode\n if (this.dataModify) {\n this.dataModify.initCumulative();\n }\n else {\n // When disabling, clear the points\n this.points.forEach((point) => {\n delete point.cumulativeSum;\n });\n }\n }\n /**\n * Highcharts Stock only. Set the cumulative mode on all series\n * belonging to a Y axis.\n *\n * @see [plotOptions.series.cumulative](https://api.highcharts.com/highstock/plotOptions.series.cumulative)\n *\n * @sample stock/members/axis-setcumulative/\n * Set cumulative\n *\n * @function Highcharts.Axis#setCumulative\n *\n * @param {boolean} [cumulative]\n * Whether to disable or enable the cumulative mode.\n * Can be one of `undefined` (default, treated as `false`),\n * `false` or `true`.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or to wait for a later call to\n * {@link Chart#redraw}.\n */\n function axisSetCumulative(cumulative, redraw) {\n this.setModifier('cumulative', cumulative, redraw);\n }\n /* *\n *\n * Classes\n *\n * */\n /**\n * @private\n */\n class Additions {\n /* *\n *\n * Constructors\n *\n * */\n /**\n * @private\n */\n constructor(series) {\n this.series = series;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n modifyValue() {\n return 0;\n }\n /**\n * @ignore\n * @function Highcharts.Series#getCumulativeExtremes\n *\n * @param {Array} [activeYData]\n * An array cointaining all the points' y values\n * in a visible range.\n */\n static getCumulativeExtremes(activeYData) {\n let cumulativeDataMin = Infinity, cumulativeDataMax = -Infinity;\n activeYData.reduce((prev, cur) => {\n const sum = prev + cur;\n cumulativeDataMin = Math.min(cumulativeDataMin, sum, prev);\n cumulativeDataMax = Math.max(cumulativeDataMax, sum, prev);\n return sum;\n });\n return [cumulativeDataMin, cumulativeDataMax];\n }\n /**\n * @ignore\n * @function Highcharts.Series#initCompare\n *\n * @param {string} [compare]\n * Can be one of `\"percent\"` or `\"value\"`.\n */\n initCompare(compare) {\n // Set the modifyValue method\n this.modifyValue = function (value, index) {\n if (value === null) {\n value = 0;\n }\n const compareValue = this.compareValue;\n if (typeof value !== 'undefined' &&\n typeof compareValue !== 'undefined') { // #2601, #5814\n // Get the modified value\n if (compare === 'value') {\n value -= compareValue;\n // Compare percent\n }\n else {\n const compareBase = this.series.options.compareBase;\n value = 100 * (value / compareValue) -\n (compareBase === 100 ? 0 : 100);\n }\n // Record for tooltip etc.\n if (typeof index !== 'undefined') {\n const point = this.series.points[index];\n if (point) {\n point.change = value;\n }\n }\n return value;\n }\n return 0;\n };\n }\n /**\n * @ignore\n * @function Highcharts.Series#initCumulative\n */\n initCumulative() {\n // Set the modifyValue method\n this.modifyValue = function (value, index) {\n if (value === null) {\n value = 0;\n }\n if (value !== void 0 && index !== void 0) {\n const prevPoint = index > 0 ?\n this.series.points[index - 1] : null;\n // Get the modified value\n if (prevPoint && prevPoint.cumulativeSum) {\n value = DataModifyComposition_correctFloat(prevPoint.cumulativeSum + value);\n }\n // Record for tooltip etc.\n const point = this.series.points[index];\n const cumulativeStart = point.series.options.cumulativeStart, withinRange = point.x <= this.series.xAxis.max &&\n point.x >= this.series.xAxis.min;\n if (point) {\n if (!cumulativeStart || withinRange) {\n point.cumulativeSum = value;\n }\n else {\n point.cumulativeSum = void 0;\n }\n }\n return value;\n }\n return 0;\n };\n }\n }\n DataModifyComposition.Additions = Additions;\n})(DataModifyComposition || (DataModifyComposition = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_DataModifyComposition = (DataModifyComposition);\n/* *\n *\n * API Options\n *\n * */\n/**\n * Compare the values of the series against the first non-null, non-\n * zero value in the visible range. The y axis will show percentage\n * or absolute change depending on whether `compare` is set to `\"percent\"`\n * or `\"value\"`. When this is applied to multiple series, it allows\n * comparing the development of the series against each other. Adds\n * a `change` field to every point object.\n *\n * @see [compareBase](#plotOptions.series.compareBase)\n * @see [Axis.setCompare()](/class-reference/Highcharts.Axis#setCompare)\n * @see [Series.setCompare()](/class-reference/Highcharts.Series#setCompare)\n *\n * @sample {highstock} stock/plotoptions/series-compare-percent/\n * Percent\n * @sample {highstock} stock/plotoptions/series-compare-value/\n * Value\n *\n * @type {string}\n * @since 1.0.1\n * @product highstock\n * @validvalue [\"percent\", \"value\"]\n * @apioption plotOptions.series.compare\n */\n/**\n * Defines if comparison should start from the first point within the visible\n * range or should start from the last point **before** the range.\n *\n * In other words, this flag determines if first point within the visible range\n * will have 0% (`compareStart=true`) or should have been already calculated\n * according to the previous point (`compareStart=false`).\n *\n * @sample {highstock} stock/plotoptions/series-comparestart/\n * Calculate compare within visible range\n *\n * @type {boolean}\n * @default false\n * @since 6.0.0\n * @product highstock\n * @apioption plotOptions.series.compareStart\n */\n/**\n * When [compare](#plotOptions.series.compare) is `percent`, this option\n * dictates whether to use 0 or 100 as the base of comparison.\n *\n * @sample {highstock} stock/plotoptions/series-comparebase/\n * Compare base is 100\n *\n * @type {number}\n * @default 0\n * @since 5.0.6\n * @product highstock\n * @validvalue [0, 100]\n * @apioption plotOptions.series.compareBase\n */\n/**\n * Cumulative Sum feature replaces points' values with the following formula:\n * `sum of all previous points' values + current point's value`.\n * Works only for points in a visible range.\n * Adds the `cumulativeSum` field to each point object that can be accessed\n * e.g. in the [tooltip.pointFormat](https://api.highcharts.com/highstock/tooltip.pointFormat).\n *\n * With `dataGrouping` enabled, default grouping approximation is set to `sum`.\n *\n * @see [Axis.setCumulative()](/class-reference/Highcharts.Axis#setCumulative)\n * @see [Series.setCumulative()](/class-reference/Highcharts.Series#setCumulative)\n *\n * @sample {highstock} stock/plotoptions/series-cumulative-sum/\n * Cumulative Sum\n *\n * @type {boolean}\n * @default false\n * @since 9.3.0\n * @product highstock\n * @apioption plotOptions.series.cumulative\n */\n/**\n * Defines if cumulation should start from the first point within the visible\n * range or should start from the last point **before** the range.\n *\n * In other words, this flag determines if first point within the visible range\n * will start at 0 (`cumulativeStart=true`) or should have been already calculated\n * according to the previous point (`cumulativeStart=false`).\n *\n * @sample {highstock} stock/plotoptions/series-cumulativestart/\n * Cumulative Start\n *\n * @type {boolean}\n * @default false\n * @since 11.4.2\n * @product highstock\n * @apioption plotOptions.series.cumulativeStart\n */\n''; // Keeps doclets above in transpiled file\n\n;// ./code/es-modules/Stock/Navigator/ChartNavigatorComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { isTouchDevice: ChartNavigatorComposition_isTouchDevice } = Core_Globals;\n\nconst { addEvent: ChartNavigatorComposition_addEvent, merge: ChartNavigatorComposition_merge, pick: ChartNavigatorComposition_pick } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\nconst composedMembers = [];\n/* *\n *\n * Variables\n *\n * */\nlet NavigatorConstructor;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction ChartNavigatorComposition_compose(ChartClass, NavigatorClass) {\n if (Core_Utilities.pushUnique(composedMembers, ChartClass)) {\n const chartProto = ChartClass.prototype;\n NavigatorConstructor = NavigatorClass;\n chartProto.callbacks.push(onChartCallback);\n ChartNavigatorComposition_addEvent(ChartClass, 'afterAddSeries', onChartAfterAddSeries);\n ChartNavigatorComposition_addEvent(ChartClass, 'afterSetChartSize', onChartAfterSetChartSize);\n ChartNavigatorComposition_addEvent(ChartClass, 'afterUpdate', onChartAfterUpdate);\n ChartNavigatorComposition_addEvent(ChartClass, 'beforeRender', onChartBeforeRender);\n ChartNavigatorComposition_addEvent(ChartClass, 'beforeShowResetZoom', onChartBeforeShowResetZoom);\n ChartNavigatorComposition_addEvent(ChartClass, 'update', onChartUpdate);\n }\n}\n/**\n * Handle adding new series.\n * @private\n */\nfunction onChartAfterAddSeries() {\n if (this.navigator) {\n // Recompute which series should be shown in navigator, and add them\n this.navigator.setBaseSeries(null, false);\n }\n}\n/**\n * For stock charts, extend the Chart.setChartSize method so that we can set the\n * final top position of the navigator once the height of the chart, including\n * the legend, is determined. #367. We can't use Chart.getMargins, because\n * labels offsets are not calculated yet.\n * @private\n */\nfunction onChartAfterSetChartSize() {\n const legend = this.legend, navigator = this.navigator;\n let legendOptions, xAxis, yAxis;\n if (navigator) {\n legendOptions = legend && legend.options;\n xAxis = navigator.xAxis;\n yAxis = navigator.yAxis;\n const { scrollbarHeight, scrollButtonSize } = navigator;\n // Compute the top position\n if (this.inverted) {\n navigator.left = navigator.opposite ?\n this.chartWidth - scrollbarHeight -\n navigator.height :\n this.spacing[3] + scrollbarHeight;\n navigator.top = this.plotTop + scrollButtonSize;\n }\n else {\n navigator.left = ChartNavigatorComposition_pick(xAxis.left, this.plotLeft + scrollButtonSize);\n navigator.top = navigator.navigatorOptions.top ||\n this.chartHeight -\n navigator.height -\n scrollbarHeight -\n (this.scrollbar?.options.margin || 0) -\n this.spacing[2] -\n (this.rangeSelector && this.extraBottomMargin ?\n this.rangeSelector.getHeight() :\n 0) -\n ((legendOptions &&\n legendOptions.verticalAlign === 'bottom' &&\n legendOptions.layout !== 'proximate' && // #13392\n legendOptions.enabled &&\n !legendOptions.floating) ?\n legend.legendHeight +\n ChartNavigatorComposition_pick(legendOptions.margin, 10) :\n 0) -\n (this.titleOffset ? this.titleOffset[2] : 0);\n }\n if (xAxis && yAxis) { // False if navigator is disabled (#904)\n if (this.inverted) {\n xAxis.options.left = yAxis.options.left = navigator.left;\n }\n else {\n xAxis.options.top = yAxis.options.top = navigator.top;\n }\n xAxis.setAxisSize();\n yAxis.setAxisSize();\n }\n }\n}\n/**\n * Initialize navigator, if no scrolling exists yet.\n * @private\n */\nfunction onChartAfterUpdate(event) {\n if (!this.navigator && !this.scroller &&\n (this.options.navigator.enabled ||\n this.options.scrollbar.enabled)) {\n this.scroller = this.navigator = new NavigatorConstructor(this);\n if (ChartNavigatorComposition_pick(event.redraw, true)) {\n this.redraw(event.animation); // #7067\n }\n }\n}\n/**\n * Initialize navigator for stock charts\n * @private\n */\nfunction onChartBeforeRender() {\n const options = this.options;\n if (options.navigator.enabled ||\n options.scrollbar.enabled) {\n this.scroller = this.navigator = new NavigatorConstructor(this);\n }\n}\n/**\n * For Stock charts. For x only zooming, do not to create the zoom button\n * because X axis zooming is already allowed by the Navigator and Range\n * selector. (#9285)\n * @private\n */\nfunction onChartBeforeShowResetZoom() {\n const chartOptions = this.options, navigator = chartOptions.navigator, rangeSelector = chartOptions.rangeSelector;\n if (((navigator && navigator.enabled) ||\n (rangeSelector && rangeSelector.enabled)) &&\n ((!ChartNavigatorComposition_isTouchDevice &&\n this.zooming.type === 'x') ||\n (ChartNavigatorComposition_isTouchDevice && this.zooming.pinchType === 'x'))) {\n return false;\n }\n}\n/**\n * @private\n */\nfunction onChartCallback(chart) {\n const navigator = chart.navigator;\n // Initialize the navigator\n if (navigator && chart.xAxis[0]) {\n const extremes = chart.xAxis[0].getExtremes();\n navigator.render(extremes.min, extremes.max);\n }\n}\n/**\n * Merge options, if no scrolling exists yet\n * @private\n */\nfunction onChartUpdate(e) {\n const navigatorOptions = (e.options.navigator || {}), scrollbarOptions = (e.options.scrollbar || {});\n if (!this.navigator && !this.scroller &&\n (navigatorOptions.enabled || scrollbarOptions.enabled)) {\n ChartNavigatorComposition_merge(true, this.options.navigator, navigatorOptions);\n ChartNavigatorComposition_merge(true, this.options.scrollbar, scrollbarOptions);\n delete e.options.navigator;\n delete e.options.scrollbar;\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst ChartNavigatorComposition = {\n compose: ChartNavigatorComposition_compose\n};\n/* harmony default export */ const Navigator_ChartNavigatorComposition = (ChartNavigatorComposition);\n\n;// ./code/es-modules/Core/Axis/NavigatorAxisComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { isTouchDevice: NavigatorAxisComposition_isTouchDevice } = Core_Globals;\n\nconst { addEvent: NavigatorAxisComposition_addEvent, correctFloat: NavigatorAxisComposition_correctFloat, defined: NavigatorAxisComposition_defined, isNumber: NavigatorAxisComposition_isNumber, pick: NavigatorAxisComposition_pick } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction NavigatorAxisComposition_onAxisInit() {\n const axis = this;\n if (!axis.navigatorAxis) {\n axis.navigatorAxis = new NavigatorAxisAdditions(axis);\n }\n}\n/**\n * For Stock charts, override selection zooming with some special features\n * because X axis zooming is already allowed by the Navigator and Range\n * selector.\n * @private\n */\nfunction onAxisSetExtremes(e) {\n const axis = this, chart = axis.chart, chartOptions = chart.options, navigator = chartOptions.navigator, navigatorAxis = axis.navigatorAxis, pinchType = chart.zooming.pinchType, rangeSelector = chartOptions.rangeSelector, zoomType = chart.zooming.type;\n let zoomed;\n if (axis.isXAxis &&\n (navigator?.enabled || rangeSelector?.enabled)) {\n // For y only zooming, ignore the X axis completely\n if (zoomType === 'y' && e.trigger === 'zoom') {\n zoomed = false;\n // For xy zooming, record the state of the zoom before zoom selection,\n // then when the reset button is pressed, revert to this state. This\n // should apply only if the chart is initialized with a range (#6612),\n // otherwise zoom all the way out.\n }\n else if (((e.trigger === 'zoom' && zoomType === 'xy') ||\n (NavigatorAxisComposition_isTouchDevice && pinchType === 'xy')) &&\n axis.options.range) {\n const previousZoom = navigatorAxis.previousZoom;\n // Minimum defined, zooming in\n if (NavigatorAxisComposition_defined(e.min)) {\n navigatorAxis.previousZoom = [axis.min, axis.max];\n // Minimum undefined, resetting zoom\n }\n else if (previousZoom) {\n e.min = previousZoom[0];\n e.max = previousZoom[1];\n navigatorAxis.previousZoom = void 0;\n }\n }\n }\n if (typeof zoomed !== 'undefined') {\n e.preventDefault();\n }\n}\n/* *\n *\n * Class\n *\n * */\n/**\n * @private\n * @class\n */\nclass NavigatorAxisAdditions {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * @private\n */\n static compose(AxisClass) {\n if (!AxisClass.keepProps.includes('navigatorAxis')) {\n AxisClass.keepProps.push('navigatorAxis');\n NavigatorAxisComposition_addEvent(AxisClass, 'init', NavigatorAxisComposition_onAxisInit);\n NavigatorAxisComposition_addEvent(AxisClass, 'setExtremes', onAxisSetExtremes);\n }\n }\n /* *\n *\n * Constructors\n *\n * */\n constructor(axis) {\n this.axis = axis;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n destroy() {\n this.axis = void 0;\n }\n /**\n * Add logic to normalize the zoomed range in order to preserve the pressed\n * state of range selector buttons\n *\n * @private\n * @function Highcharts.Axis#toFixedRange\n */\n toFixedRange(pxMin, pxMax, fixedMin, fixedMax) {\n const axis = this.axis, halfPointRange = (axis.pointRange || 0) / 2;\n let newMin = NavigatorAxisComposition_pick(fixedMin, axis.translate(pxMin, true, !axis.horiz)), newMax = NavigatorAxisComposition_pick(fixedMax, axis.translate(pxMax, true, !axis.horiz));\n // Add/remove half point range to/from the extremes (#1172)\n if (!NavigatorAxisComposition_defined(fixedMin)) {\n newMin = NavigatorAxisComposition_correctFloat(newMin + halfPointRange);\n }\n if (!NavigatorAxisComposition_defined(fixedMax)) {\n newMax = NavigatorAxisComposition_correctFloat(newMax - halfPointRange);\n }\n if (!NavigatorAxisComposition_isNumber(newMin) || !NavigatorAxisComposition_isNumber(newMax)) { // #1195, #7411\n newMin = newMax = void 0;\n }\n return {\n min: newMin,\n max: newMax\n };\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const NavigatorAxisComposition = (NavigatorAxisAdditions);\n\n;// ./code/es-modules/Stock/Navigator/NavigatorDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { parse: NavigatorDefaults_color } = Color_Color;\n\nconst { seriesTypes: NavigatorDefaults_seriesTypes } = Series_SeriesRegistry;\n/* *\n *\n * Constants\n *\n * */\n/**\n * The navigator is a small series below the main series, displaying\n * a view of the entire data set. It provides tools to zoom in and\n * out on parts of the data as well as panning across the dataset.\n *\n * @product highstock gantt\n * @optionparent navigator\n */\nconst NavigatorDefaults = {\n /**\n * Whether the navigator and scrollbar should adapt to updated data\n * in the base X axis. When loading data async, as in the demo below,\n * this should be `false`. Otherwise new data will trigger navigator\n * redraw, which will cause unwanted looping. In the demo below, the\n * data in the navigator is set only once. On navigating, only the main\n * chart content is updated.\n *\n * @sample {highstock} stock/demo/lazy-loading/\n * Set to false with async data loading\n *\n * @type {boolean}\n * @default true\n * @apioption navigator.adaptToUpdatedData\n */\n /**\n * An integer identifying the index to use for the base series, or a\n * string representing the id of the series.\n *\n * **Note**: As of Highcharts 5.0, this is now a deprecated option.\n * Prefer [series.showInNavigator](#plotOptions.series.showInNavigator).\n *\n * @see [series.showInNavigator](#plotOptions.series.showInNavigator)\n *\n * @deprecated\n * @type {number|string}\n * @default 0\n * @apioption navigator.baseSeries\n */\n /**\n * Enable or disable the navigator.\n *\n * @sample {highstock} stock/navigator/enabled/\n * Disable the navigator\n *\n * @type {boolean}\n * @default true\n * @apioption navigator.enabled\n */\n /**\n * When the chart is inverted, whether to draw the navigator on the\n * opposite side.\n *\n * @type {boolean}\n * @default false\n * @since 5.0.8\n * @apioption navigator.opposite\n */\n /**\n * The height of the navigator.\n *\n * @sample {highstock} stock/navigator/height/\n * A higher navigator\n */\n height: 40,\n /**\n * The distance from the nearest element, the X axis or X axis labels.\n *\n * @sample {highstock} stock/navigator/margin/\n * A margin of 2 draws the navigator closer to the X axis labels\n */\n margin: 25,\n /**\n * Whether the mask should be inside the range marking the zoomed\n * range, or outside. In Highcharts Stock 1.x it was always `false`.\n *\n * @sample {highstock} stock/demo/maskinside-false/\n * False, mask outside\n *\n * @since 2.0\n */\n maskInside: true,\n /**\n * Options for the handles for dragging the zoomed area.\n *\n * @sample {highstock} stock/navigator/handles/\n * Colored handles\n */\n handles: {\n /**\n * Width for handles.\n *\n * @sample {highstock} stock/navigator/styled-handles/\n * Styled handles\n *\n * @since 6.0.0\n */\n width: 7,\n /**\n * Border radius of the handles.\n *\n * @sample {highstock} stock/navigator/handles-border-radius/\n * Border radius on the navigator handles.\n *\n * @since 11.4.2\n */\n borderRadius: 0,\n /**\n * Height for handles.\n *\n * @sample {highstock} stock/navigator/styled-handles/\n * Styled handles\n *\n * @since 6.0.0\n */\n height: 15,\n /**\n * Array to define shapes of handles. 0-index for left, 1-index for\n * right.\n *\n * Additionally, the URL to a graphic can be given on this form:\n * `url(graphic.png)`. Note that for the image to be applied to\n * exported charts, its URL needs to be accessible by the export\n * server.\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n * used by its method name, as shown in the demo.\n *\n * @sample {highstock} stock/navigator/styled-handles/\n * Styled handles\n *\n * @type {Array}\n * @default [\"navigator-handle\", \"navigator-handle\"]\n * @since 6.0.0\n */\n symbols: ['navigator-handle', 'navigator-handle'],\n /**\n * Allows to enable/disable handles.\n *\n * @since 6.0.0\n */\n enabled: true,\n /**\n * The width for the handle border and the stripes inside.\n *\n * @sample {highstock} stock/navigator/styled-handles/\n * Styled handles\n *\n * @since 6.0.0\n * @apioption navigator.handles.lineWidth\n */\n lineWidth: 1,\n /**\n * The fill for the handle.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n backgroundColor: \"#f2f2f2\" /* Palette.neutralColor5 */,\n /**\n * The stroke for the handle border and the stripes inside.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n borderColor: \"#999999\" /* Palette.neutralColor40 */\n },\n /**\n * The color of the mask covering the areas of the navigator series\n * that are currently not visible in the main series. The default\n * color is bluish with an opacity of 0.3 to see the series below.\n *\n * @see In styled mode, the mask is styled with the\n * `.highcharts-navigator-mask` and\n * `.highcharts-navigator-mask-inside` classes.\n *\n * @sample {highstock} stock/navigator/maskfill/\n * Blue, semi transparent mask\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default rgba(102,133,194,0.3)\n */\n maskFill: NavigatorDefaults_color(\"#667aff\" /* Palette.highlightColor60 */).setOpacity(0.3).get(),\n /**\n * The color of the line marking the currently zoomed area in the\n * navigator.\n *\n * @sample {highstock} stock/navigator/outline/\n * 2px blue outline\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #cccccc\n */\n outlineColor: \"#999999\" /* Palette.neutralColor40 */,\n /**\n * The width of the line marking the currently zoomed area in the\n * navigator.\n *\n * @see In styled mode, the outline stroke width is set with the\n * `.highcharts-navigator-outline` class.\n *\n * @sample {highstock} stock/navigator/outline/\n * 2px blue outline\n *\n * @type {number}\n */\n outlineWidth: 1,\n /**\n * Options for the navigator series. Available options are the same\n * as any series, documented at [plotOptions](#plotOptions.series)\n * and [series](#series).\n *\n * Unless data is explicitly defined on navigator.series, the data\n * is borrowed from the first series in the chart.\n *\n * Default series options for the navigator series are:\n * ```js\n * series: {\n * type: 'areaspline',\n * fillOpacity: 0.05,\n * dataGrouping: {\n * smoothed: true\n * },\n * lineWidth: 1,\n * marker: {\n * enabled: false\n * }\n * }\n * ```\n *\n * @see In styled mode, the navigator series is styled with the\n * `.highcharts-navigator-series` class.\n *\n * @sample {highstock} stock/navigator/series-data/\n * Using a separate data set for the navigator\n * @sample {highstock} stock/navigator/series/\n * A green navigator series\n *\n * @type {*|Array<*>|Highcharts.SeriesOptionsType|Array}\n */\n series: {\n /**\n * The type of the navigator series.\n *\n * Heads up:\n * In column-type navigator, zooming is limited to at least one\n * point with its `pointRange`.\n *\n * @sample {highstock} stock/navigator/column/\n * Column type navigator\n *\n * @type {string}\n * @default {highstock} `areaspline` if defined, otherwise `line`\n * @default {gantt} gantt\n */\n type: (typeof NavigatorDefaults_seriesTypes.areaspline === 'undefined' ?\n 'line' :\n 'areaspline'),\n /**\n * The fill opacity of the navigator series.\n */\n fillOpacity: 0.05,\n /**\n * The pixel line width of the navigator series.\n */\n lineWidth: 1,\n /**\n * @ignore-option\n */\n compare: null,\n /**\n * @ignore-option\n */\n sonification: {\n enabled: false\n },\n /**\n * Unless data is explicitly defined, the data is borrowed from the\n * first series in the chart.\n *\n * @type {Array|object|null>}\n * @product highstock\n * @apioption navigator.series.data\n */\n /**\n * Data grouping options for the navigator series.\n *\n * @extends plotOptions.series.dataGrouping\n */\n dataGrouping: {\n approximation: 'average',\n enabled: true,\n groupPixelWidth: 2,\n // Replace smoothed property by anchors, #12455.\n firstAnchor: 'firstPoint',\n anchor: 'middle',\n lastAnchor: 'lastPoint',\n // Day and week differs from plotOptions.series.dataGrouping\n units: [\n ['millisecond', [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],\n ['second', [1, 2, 5, 10, 15, 30]],\n ['minute', [1, 2, 5, 10, 15, 30]],\n ['hour', [1, 2, 3, 4, 6, 8, 12]],\n ['day', [1, 2, 3, 4]],\n ['week', [1, 2, 3]],\n ['month', [1, 3, 6]],\n ['year', null]\n ]\n },\n /**\n * Data label options for the navigator series. Data labels are\n * disabled by default on the navigator series.\n *\n * @extends plotOptions.series.dataLabels\n */\n dataLabels: {\n enabled: false,\n zIndex: 2 // #1839\n },\n id: 'highcharts-navigator-series',\n className: 'highcharts-navigator-series',\n /**\n * Sets the fill color of the navigator series.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @apioption navigator.series.color\n */\n /**\n * Line color for the navigator series. Allows setting the color\n * while disallowing the default candlestick setting.\n *\n * @type {Highcharts.ColorString|null}\n */\n lineColor: null, // #4602\n marker: {\n enabled: false\n },\n /**\n * Since Highcharts Stock v8, default value is the same as default\n * `pointRange` defined for a specific type (e.g. `null` for\n * column type).\n *\n * In Highcharts Stock version < 8, defaults to 0.\n *\n * @extends plotOptions.series.pointRange\n * @type {number|null}\n * @apioption navigator.series.pointRange\n */\n /**\n * The threshold option. Setting it to 0 will make the default\n * navigator area series draw its area from the 0 value and up.\n *\n * @type {number|null}\n */\n threshold: null\n },\n /**\n * Enable or disable navigator sticking to right, while adding new\n * points. If `undefined`, the navigator sticks to the axis maximum only\n * if it was already at the maximum prior to adding points.\n *\n * @type {boolean}\n * @default undefined\n * @since 10.2.1\n * @sample {highstock} stock/navigator/sticktomax-false/\n * stickToMax set to false\n * @apioption navigator.stickToMax\n */\n /**\n * Options for the navigator X axis. Default series options for the\n * navigator xAxis are:\n * ```js\n * xAxis: {\n * tickWidth: 0,\n * lineWidth: 0,\n * gridLineWidth: 1,\n * tickPixelInterval: 200,\n * labels: {\n * align: 'left',\n * style: {\n * color: '#888'\n * },\n * x: 3,\n * y: -4\n * }\n * }\n * ```\n *\n * @extends xAxis\n * @excluding linkedTo, maxZoom, minRange, opposite, range, scrollbar,\n * showEmpty, maxRange\n */\n xAxis: {\n /**\n * Additional range on the right side of the xAxis. Works similar to\n * `xAxis.maxPadding`, but the value is set in terms of axis values,\n * percentage or pixels.\n *\n * If it's a number, it is interpreted as axis values, which in a\n * datetime axis equals milliseconds.\n *\n * If it's a percentage string, is interpreted as percentages of the\n * axis length. An overscroll of 50% will make a 100px axis 50px longer.\n *\n * If it's a pixel string, it is interpreted as a fixed pixel value, but\n * limited to 90% of the axis length.\n *\n * If it's undefined, the value is inherited from `xAxis.overscroll`.\n *\n * Can be set for both, main xAxis and navigator's xAxis.\n *\n * @type {number | string | undefined}\n * @since 6.0.0\n * @apioption navigator.xAxis.overscroll\n */\n className: 'highcharts-navigator-xaxis',\n tickLength: 0,\n lineWidth: 0,\n gridLineColor: \"#e6e6e6\" /* Palette.neutralColor10 */,\n id: 'navigator-x-axis',\n gridLineWidth: 1,\n tickPixelInterval: 200,\n labels: {\n align: 'left',\n /**\n * @type {Highcharts.CSSObject}\n */\n style: {\n /** @ignore */\n color: \"#000000\" /* Palette.neutralColor100 */,\n /** @ignore */\n fontSize: '0.7em',\n /** @ignore */\n opacity: 0.6,\n /** @ignore */\n textOutline: '2px contrast'\n },\n x: 3,\n y: -4\n },\n crosshair: false\n },\n /**\n * Options for the navigator Y axis. Default series options for the\n * navigator yAxis are:\n * ```js\n * yAxis: {\n * gridLineWidth: 0,\n * startOnTick: false,\n * endOnTick: false,\n * minPadding: 0.1,\n * maxPadding: 0.1,\n * labels: {\n * enabled: false\n * },\n * title: {\n * text: null\n * },\n * tickWidth: 0\n * }\n * ```\n *\n * @extends yAxis\n * @excluding height, linkedTo, maxZoom, minRange, ordinal, range,\n * showEmpty, scrollbar, top, units, maxRange, minLength,\n * maxLength, resize\n */\n yAxis: {\n className: 'highcharts-navigator-yaxis',\n gridLineWidth: 0,\n startOnTick: false,\n endOnTick: false,\n minPadding: 0.1,\n id: 'navigator-y-axis',\n maxPadding: 0.1,\n labels: {\n enabled: false\n },\n crosshair: false,\n title: {\n text: null\n },\n tickLength: 0,\n tickWidth: 0\n }\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Navigator_NavigatorDefaults = (NavigatorDefaults);\n/* *\n *\n * API Options\n *\n * */\n/**\n * Maximum range which can be set using the navigator's handles.\n * Opposite of [xAxis.minRange](#xAxis.minRange).\n *\n * @sample {highstock} stock/navigator/maxrange/\n * Defined max and min range\n *\n * @type {number}\n * @since 6.0.0\n * @product highstock gantt\n * @apioption xAxis.maxRange\n */\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Stock/Navigator/NavigatorSymbols.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { relativeLength: NavigatorSymbols_relativeLength } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\n/**\n * Draw one of the handles on the side of the zoomed range in the navigator.\n * @private\n */\nfunction navigatorHandle(_x, _y, width, height, options = {}) {\n const halfWidth = options.width ? options.width / 2 : width, markerPosition = 1.5, r = NavigatorSymbols_relativeLength(options.borderRadius || 0, Math.min(halfWidth * 2, height));\n height = options.height || height;\n return [\n ['M', -markerPosition, height / 2 - 3.5],\n ['L', -markerPosition, height / 2 + 4.5],\n ['M', markerPosition - 1, height / 2 - 3.5],\n ['L', markerPosition - 1, height / 2 + 4.5],\n ...SVG_Symbols.rect(-halfWidth - 1, 0.5, halfWidth * 2 + 1, height, { r })\n ];\n}\n/* *\n *\n * Default Export\n *\n * */\nconst NavigatorSymbols = {\n 'navigator-handle': navigatorHandle\n};\n/* harmony default export */ const Navigator_NavigatorSymbols = (NavigatorSymbols);\n\n;// ./code/es-modules/Stock/Utilities/StockUtilities.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defined: StockUtilities_defined } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Sets the chart.fixedRange to the specified value. If the value is larger\n * than actual range, sets it to the maximum possible range. (#20327)\n *\n * @private\n * @function Highcharts.StockChart#setFixedRange\n * @param {number|undefined} range\n * Range to set in axis units.\n */\nfunction setFixedRange(range) {\n const xAxis = this.xAxis[0];\n if (StockUtilities_defined(xAxis.dataMax) &&\n StockUtilities_defined(xAxis.dataMin) &&\n range) {\n this.fixedRange = Math.min(range, xAxis.dataMax - xAxis.dataMin);\n }\n else {\n this.fixedRange = range;\n }\n}\nconst StockUtilities = {\n setFixedRange\n};\n/* harmony default export */ const Utilities_StockUtilities = (StockUtilities);\n\n;// ./code/es-modules/Stock/Navigator/NavigatorComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { setOptions: NavigatorComposition_setOptions } = Defaults;\n\nconst { composed: NavigatorComposition_composed } = Core_Globals;\n\n\n\n\nconst { getRendererType } = Renderer_RendererRegistry;\n\nconst { setFixedRange: NavigatorComposition_setFixedRange } = Utilities_StockUtilities;\n\nconst { addEvent: NavigatorComposition_addEvent, extend: NavigatorComposition_extend, pushUnique: NavigatorComposition_pushUnique } = Core_Utilities;\n/* *\n *\n * Variables\n *\n * */\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction NavigatorComposition_compose(ChartClass, AxisClass, SeriesClass) {\n NavigatorAxisComposition.compose(AxisClass);\n if (NavigatorComposition_pushUnique(NavigatorComposition_composed, 'Navigator')) {\n ChartClass.prototype.setFixedRange = NavigatorComposition_setFixedRange;\n NavigatorComposition_extend(getRendererType().prototype.symbols, Navigator_NavigatorSymbols);\n NavigatorComposition_addEvent(SeriesClass, 'afterUpdate', onSeriesAfterUpdate);\n NavigatorComposition_setOptions({ navigator: Navigator_NavigatorDefaults });\n }\n}\n/**\n * Handle updating series\n * @private\n */\nfunction onSeriesAfterUpdate() {\n if (this.chart.navigator && !this.options.isInternal) {\n this.chart.navigator.setBaseSeries(null, false);\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst NavigatorComposition = {\n compose: NavigatorComposition_compose\n};\n/* harmony default export */ const Navigator_NavigatorComposition = (NavigatorComposition);\n\n;// ./code/es-modules/Core/Axis/ScrollbarAxis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { composed: ScrollbarAxis_composed } = Core_Globals;\n\nconst { addEvent: ScrollbarAxis_addEvent, defined: ScrollbarAxis_defined, pick: ScrollbarAxis_pick, pushUnique: ScrollbarAxis_pushUnique } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar ScrollbarAxis;\n(function (ScrollbarAxis) {\n /* *\n *\n * Variables\n *\n * */\n let Scrollbar;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Attaches to axis events to create scrollbars if enabled.\n *\n * @private\n *\n * @param {Highcharts.Axis} AxisClass\n * Axis class to extend.\n *\n * @param {Highcharts.Scrollbar} ScrollbarClass\n * Scrollbar class to use.\n */\n function compose(AxisClass, ScrollbarClass) {\n if (ScrollbarAxis_pushUnique(ScrollbarAxis_composed, 'Axis.Scrollbar')) {\n Scrollbar = ScrollbarClass;\n ScrollbarAxis_addEvent(AxisClass, 'afterGetOffset', onAxisAfterGetOffset);\n ScrollbarAxis_addEvent(AxisClass, 'afterInit', onAxisAfterInit);\n ScrollbarAxis_addEvent(AxisClass, 'afterRender', onAxisAfterRender);\n }\n }\n ScrollbarAxis.compose = compose;\n /** @private */\n function getExtremes(axis) {\n const axisMin = ScrollbarAxis_pick(axis.options && axis.options.min, axis.min);\n const axisMax = ScrollbarAxis_pick(axis.options && axis.options.max, axis.max);\n return {\n axisMin,\n axisMax,\n scrollMin: ScrollbarAxis_defined(axis.dataMin) ?\n Math.min(axisMin, axis.min, axis.dataMin, ScrollbarAxis_pick(axis.threshold, Infinity)) : axisMin,\n scrollMax: ScrollbarAxis_defined(axis.dataMax) ?\n Math.max(axisMax, axis.max, axis.dataMax, ScrollbarAxis_pick(axis.threshold, -Infinity)) : axisMax\n };\n }\n /**\n * Make space for a scrollbar.\n * @private\n */\n function onAxisAfterGetOffset() {\n const axis = this, scrollbar = axis.scrollbar, opposite = scrollbar && !scrollbar.options.opposite, index = axis.horiz ? 2 : opposite ? 3 : 1;\n if (scrollbar) {\n // Reset scrollbars offsets\n axis.chart.scrollbarsOffsets = [0, 0];\n axis.chart.axisOffset[index] +=\n scrollbar.size + (scrollbar.options.margin || 0);\n }\n }\n /**\n * Wrap axis initialization and create scrollbar if enabled.\n * @private\n */\n function onAxisAfterInit() {\n const axis = this;\n if (axis.options &&\n axis.options.scrollbar &&\n axis.options.scrollbar.enabled) {\n // Predefined options:\n axis.options.scrollbar.vertical = !axis.horiz;\n axis.options.startOnTick = axis.options.endOnTick = false;\n axis.scrollbar = new Scrollbar(axis.chart.renderer, axis.options.scrollbar, axis.chart);\n ScrollbarAxis_addEvent(axis.scrollbar, 'changed', function (e) {\n const { axisMin, axisMax, scrollMin: unitedMin, scrollMax: unitedMax } = getExtremes(axis), range = unitedMax - unitedMin;\n let to, from;\n // #12834, scroll when show/hide series, wrong extremes\n if (!ScrollbarAxis_defined(axisMin) || !ScrollbarAxis_defined(axisMax)) {\n return;\n }\n if ((axis.horiz && !axis.reversed) ||\n (!axis.horiz && axis.reversed)) {\n to = unitedMin + range * this.to;\n from = unitedMin + range * this.from;\n }\n else {\n // Y-values in browser are reversed, but this also\n // applies for reversed horizontal axis:\n to = unitedMin + range * (1 - this.from);\n from = unitedMin + range * (1 - this.to);\n }\n if (this.shouldUpdateExtremes(e.DOMType)) {\n // #17977, set animation to undefined instead of true\n const animate = e.DOMType === 'mousemove' ||\n e.DOMType === 'touchmove' ? false : void 0;\n axis.setExtremes(from, to, true, animate, e);\n }\n else {\n // When live redraw is disabled, don't change extremes\n // Only change the position of the scrollbar thumb\n this.setRange(this.from, this.to);\n }\n });\n }\n }\n /**\n * Wrap rendering axis, and update scrollbar if one is created.\n * @private\n */\n function onAxisAfterRender() {\n const axis = this, { scrollMin, scrollMax } = getExtremes(axis), scrollbar = axis.scrollbar, offset = (axis.axisTitleMargin + (axis.titleOffset || 0)), scrollbarsOffsets = axis.chart.scrollbarsOffsets, axisMargin = axis.options.margin || 0;\n let offsetsIndex, from, to;\n if (scrollbar && scrollbarsOffsets) {\n if (axis.horiz) {\n // Reserve space for labels/title\n if (!axis.opposite) {\n scrollbarsOffsets[1] += offset;\n }\n scrollbar.position(axis.left, (axis.top +\n axis.height +\n 2 +\n scrollbarsOffsets[1] -\n (axis.opposite ? axisMargin : 0)), axis.width, axis.height);\n // Next scrollbar should reserve space for margin (if set)\n if (!axis.opposite) {\n scrollbarsOffsets[1] += axisMargin;\n }\n offsetsIndex = 1;\n }\n else {\n // Reserve space for labels/title\n if (axis.opposite) {\n scrollbarsOffsets[0] += offset;\n }\n let xPosition;\n if (!scrollbar.options.opposite) {\n xPosition = axis.opposite ? 0 : axisMargin;\n }\n else {\n xPosition = axis.left +\n axis.width +\n 2 +\n scrollbarsOffsets[0] -\n (axis.opposite ? 0 : axisMargin);\n }\n scrollbar.position(xPosition, axis.top, axis.width, axis.height);\n // Next scrollbar should reserve space for margin (if set)\n if (axis.opposite) {\n scrollbarsOffsets[0] += axisMargin;\n }\n offsetsIndex = 0;\n }\n scrollbarsOffsets[offsetsIndex] += scrollbar.size +\n (scrollbar.options.margin || 0);\n if (isNaN(scrollMin) ||\n isNaN(scrollMax) ||\n !ScrollbarAxis_defined(axis.min) ||\n !ScrollbarAxis_defined(axis.max) ||\n axis.dataMin === axis.dataMax // #10733\n ) {\n // Default action: when data extremes are the same or there is\n // not extremes on the axis, but scrollbar exists, make it\n // full size\n scrollbar.setRange(0, 1);\n }\n else if (axis.min === axis.max) { // #20359\n // When the extremes are the same, set the scrollbar to a point\n // within the extremes range. Utilize pointRange to perform the\n // calculations. (#20359)\n const interval = axis.pointRange / (axis.dataMax +\n 1);\n from = interval * axis.min;\n to = interval * (axis.max + 1);\n scrollbar.setRange(from, to);\n }\n else {\n from = ((axis.min - scrollMin) /\n (scrollMax - scrollMin));\n to = ((axis.max - scrollMin) /\n (scrollMax - scrollMin));\n if ((axis.horiz && !axis.reversed) ||\n (!axis.horiz && axis.reversed)) {\n scrollbar.setRange(from, to);\n }\n else {\n // Inverse vertical axis\n scrollbar.setRange(1 - to, 1 - from);\n }\n }\n }\n }\n})(ScrollbarAxis || (ScrollbarAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_ScrollbarAxis = (ScrollbarAxis);\n\n;// ./code/es-modules/Stock/Scrollbar/ScrollbarDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Constant\n *\n * */\n/**\n *\n * The scrollbar is a means of panning over the X axis of a stock chart.\n * Scrollbars can also be applied to other types of axes.\n *\n * Another approach to scrollable charts is the [chart.scrollablePlotArea](\n * https://api.highcharts.com/highcharts/chart.scrollablePlotArea) option that\n * is especially suitable for simpler cartesian charts on mobile.\n *\n * In styled mode, all the presentational options for the\n * scrollbar are replaced by the classes `.highcharts-scrollbar-thumb`,\n * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n *\n * @sample stock/yaxis/inverted-bar-scrollbar/\n * A scrollbar on a simple bar chart\n *\n * @product highstock gantt\n * @optionparent scrollbar\n *\n * @private\n */\nconst ScrollbarDefaults = {\n /**\n * The height of the scrollbar. If `buttonsEnabled` is true , the height\n * also applies to the width of the scroll arrows so that they are always\n * squares.\n *\n * @sample stock/scrollbar/style/\n * Non-default height\n *\n * @type {number}\n */\n height: 10,\n /**\n * The border rounding radius of the bar.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n */\n barBorderRadius: 5,\n /**\n * The corner radius of the scrollbar buttons.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n */\n buttonBorderRadius: 0,\n /**\n * Enable or disable the buttons at the end of the scrollbar.\n *\n * @since 11.0.0\n */\n buttonsEnabled: false,\n /**\n * Enable or disable the scrollbar.\n *\n * @sample stock/scrollbar/enabled/\n * Disable the scrollbar, only use navigator\n *\n * @type {boolean}\n * @default true\n * @apioption scrollbar.enabled\n */\n /**\n * Whether to redraw the main chart as the scrollbar or the navigator\n * zoomed window is moved. Defaults to `true` for modern browsers and\n * `false` for legacy IE browsers as well as mobile devices.\n *\n * @sample stock/scrollbar/liveredraw\n * Setting live redraw to false\n *\n * @type {boolean}\n * @since 1.3\n */\n liveRedraw: void 0,\n /**\n * The margin between the scrollbar and its axis when the scrollbar is\n * applied directly to an axis, or the navigator in case that is enabled.\n * Defaults to 10 for axis, 0 for navigator.\n *\n * @type {number|undefined}\n */\n margin: void 0,\n /**\n * The minimum width of the scrollbar.\n *\n * @since 1.2.5\n */\n minWidth: 6,\n /** @ignore-option */\n opposite: true,\n /**\n * Whether to show or hide the scrollbar when the scrolled content is\n * zoomed out to it full extent.\n *\n * @type {boolean}\n * @default true\n * @apioption scrollbar.showFull\n */\n step: 0.2,\n /**\n * The z index of the scrollbar group.\n */\n zIndex: 3,\n /**\n * The background color of the scrollbar itself.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n barBackgroundColor: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * The width of the bar's border.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n */\n barBorderWidth: 0,\n /**\n * The color of the scrollbar's border.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n barBorderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * The color of the small arrow inside the scrollbar buttons.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n buttonArrowColor: \"#333333\" /* Palette.neutralColor80 */,\n /**\n * The color of scrollbar buttons.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n buttonBackgroundColor: \"#e6e6e6\" /* Palette.neutralColor10 */,\n /**\n * The color of the border of the scrollbar buttons.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n buttonBorderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * The border width of the scrollbar buttons.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n */\n buttonBorderWidth: 1,\n /**\n * The color of the small rifles in the middle of the scrollbar.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n rifleColor: 'none',\n /**\n * The color of the track background.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n trackBackgroundColor: 'rgba(255, 255, 255, 0.001)', // #18922\n /**\n * The color of the border of the scrollbar track.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n */\n trackBorderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n /**\n * The corner radius of the border of the scrollbar track.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n */\n trackBorderRadius: 5,\n /**\n * The width of the border of the scrollbar track.\n *\n * @sample stock/scrollbar/style/\n * Scrollbar styling\n */\n trackBorderWidth: 1\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Scrollbar_ScrollbarDefaults = (ScrollbarDefaults);\n\n;// ./code/es-modules/Stock/Scrollbar/Scrollbar.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defaultOptions: Scrollbar_defaultOptions } = Defaults;\n\n\n\n\nconst { addEvent: Scrollbar_addEvent, correctFloat: Scrollbar_correctFloat, crisp: Scrollbar_crisp, defined: Scrollbar_defined, destroyObjectProperties: Scrollbar_destroyObjectProperties, fireEvent: Scrollbar_fireEvent, merge: Scrollbar_merge, pick: Scrollbar_pick, removeEvent: Scrollbar_removeEvent } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * A reusable scrollbar, internally used in Highcharts Stock's\n * navigator and optionally on individual axes.\n *\n * @private\n * @class\n * @name Highcharts.Scrollbar\n * @param {Highcharts.SVGRenderer} renderer\n * @param {Highcharts.ScrollbarOptions} options\n * @param {Highcharts.Chart} chart\n */\nclass Scrollbar {\n /* *\n *\n * Static Functions\n *\n * */\n static compose(AxisClass) {\n Axis_ScrollbarAxis.compose(AxisClass, Scrollbar);\n }\n /**\n * When we have vertical scrollbar, rifles and arrow in buttons should be\n * rotated. The same method is used in Navigator's handles, to rotate them.\n *\n * @function Highcharts.swapXY\n *\n * @param {Highcharts.SVGPathArray} path\n * Path to be rotated.\n *\n * @param {boolean} [vertical]\n * If vertical scrollbar, swap x-y values.\n *\n * @return {Highcharts.SVGPathArray}\n * Rotated path.\n *\n * @requires modules/stock\n */\n static swapXY(path, vertical) {\n if (vertical) {\n path.forEach((seg) => {\n const len = seg.length;\n let temp;\n for (let i = 0; i < len; i += 2) {\n temp = seg[i + 1];\n if (typeof temp === 'number') {\n seg[i + 1] = seg[i + 2];\n seg[i + 2] = temp;\n }\n }\n });\n }\n return path;\n }\n /* *\n *\n * Constructors\n *\n * */\n constructor(renderer, options, chart) {\n /* *\n *\n * Properties\n *\n * */\n this._events = [];\n this.chartX = 0;\n this.chartY = 0;\n this.from = 0;\n this.scrollbarButtons = [];\n this.scrollbarLeft = 0;\n this.scrollbarStrokeWidth = 1;\n this.scrollbarTop = 0;\n this.size = 0;\n this.to = 0;\n this.trackBorderWidth = 1;\n this.x = 0;\n this.y = 0;\n this.init(renderer, options, chart);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Set up the mouse and touch events for the Scrollbar\n *\n * @private\n * @function Highcharts.Scrollbar#addEvents\n */\n addEvents() {\n const buttonsOrder = this.options.inverted ? [1, 0] : [0, 1], buttons = this.scrollbarButtons, bar = this.scrollbarGroup.element, track = this.track.element, mouseDownHandler = this.mouseDownHandler.bind(this), mouseMoveHandler = this.mouseMoveHandler.bind(this), mouseUpHandler = this.mouseUpHandler.bind(this);\n const _events = [\n // Mouse events\n [\n buttons[buttonsOrder[0]].element,\n 'click',\n this.buttonToMinClick.bind(this)\n ],\n [\n buttons[buttonsOrder[1]].element,\n 'click',\n this.buttonToMaxClick.bind(this)\n ],\n [track, 'click', this.trackClick.bind(this)],\n [bar, 'mousedown', mouseDownHandler],\n [bar.ownerDocument, 'mousemove', mouseMoveHandler],\n [bar.ownerDocument, 'mouseup', mouseUpHandler],\n // Touch events\n [bar, 'touchstart', mouseDownHandler],\n [bar.ownerDocument, 'touchmove', mouseMoveHandler],\n [bar.ownerDocument, 'touchend', mouseUpHandler]\n ];\n // Add them all\n _events.forEach(function (args) {\n Scrollbar_addEvent.apply(null, args);\n });\n this._events = _events;\n }\n buttonToMaxClick(e) {\n const scroller = this;\n const range = ((scroller.to - scroller.from) *\n Scrollbar_pick(scroller.options.step, 0.2));\n scroller.updatePosition(scroller.from + range, scroller.to + range);\n Scrollbar_fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMEvent: e\n });\n }\n buttonToMinClick(e) {\n const scroller = this;\n const range = Scrollbar_correctFloat(scroller.to - scroller.from) *\n Scrollbar_pick(scroller.options.step, 0.2);\n scroller.updatePosition(Scrollbar_correctFloat(scroller.from - range), Scrollbar_correctFloat(scroller.to - range));\n Scrollbar_fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMEvent: e\n });\n }\n /**\n * Get normalized (0-1) cursor position over the scrollbar\n *\n * @private\n * @function Highcharts.Scrollbar#cursorToScrollbarPosition\n *\n * @param {*} normalizedEvent\n * normalized event, with chartX and chartY values\n *\n * @return {Highcharts.Dictionary}\n * Local position {chartX, chartY}\n */\n cursorToScrollbarPosition(normalizedEvent) {\n const scroller = this, options = scroller.options, minWidthDifference = options.minWidth > scroller.calculatedWidth ?\n options.minWidth :\n 0; // `minWidth` distorts translation\n return {\n chartX: (normalizedEvent.chartX - scroller.x -\n scroller.xOffset) /\n (scroller.barWidth - minWidthDifference),\n chartY: (normalizedEvent.chartY - scroller.y -\n scroller.yOffset) /\n (scroller.barWidth - minWidthDifference)\n };\n }\n /**\n * Destroys allocated elements.\n *\n * @private\n * @function Highcharts.Scrollbar#destroy\n */\n destroy() {\n const scroller = this, navigator = scroller.chart.scroller;\n // Disconnect events added in addEvents\n scroller.removeEvents();\n // Destroy properties\n [\n 'track',\n 'scrollbarRifles',\n 'scrollbar',\n 'scrollbarGroup',\n 'group'\n ].forEach(function (prop) {\n if (scroller[prop] && scroller[prop].destroy) {\n scroller[prop] = scroller[prop].destroy();\n }\n });\n // #6421, chart may have more scrollbars\n if (navigator && scroller === navigator.scrollbar) {\n navigator.scrollbar = null;\n // Destroy elements in collection\n Scrollbar_destroyObjectProperties(navigator.scrollbarButtons);\n }\n }\n /**\n * Draw the scrollbar buttons with arrows\n *\n * @private\n * @function Highcharts.Scrollbar#drawScrollbarButton\n * @param {number} index\n * 0 is left, 1 is right\n */\n drawScrollbarButton(index) {\n const scroller = this, renderer = scroller.renderer, scrollbarButtons = scroller.scrollbarButtons, options = scroller.options, size = scroller.size, group = renderer.g().add(scroller.group);\n scrollbarButtons.push(group);\n if (options.buttonsEnabled) {\n // Create a rectangle for the scrollbar button\n const rect = renderer.rect()\n .addClass('highcharts-scrollbar-button')\n .add(group);\n // Presentational attributes\n if (!scroller.chart.styledMode) {\n rect.attr({\n stroke: options.buttonBorderColor,\n 'stroke-width': options.buttonBorderWidth,\n fill: options.buttonBackgroundColor\n });\n }\n // Place the rectangle based on the rendered stroke width\n rect.attr(rect.crisp({\n x: -0.5,\n y: -0.5,\n width: size,\n height: size,\n r: options.buttonBorderRadius\n }, rect.strokeWidth()));\n // Button arrow\n const arrow = renderer\n .path(Scrollbar.swapXY([[\n 'M',\n size / 2 + (index ? -1 : 1),\n size / 2 - 3\n ], [\n 'L',\n size / 2 + (index ? -1 : 1),\n size / 2 + 3\n ], [\n 'L',\n size / 2 + (index ? 2 : -2),\n size / 2\n ]], options.vertical))\n .addClass('highcharts-scrollbar-arrow')\n .add(scrollbarButtons[index]);\n if (!scroller.chart.styledMode) {\n arrow.attr({\n fill: options.buttonArrowColor\n });\n }\n }\n }\n /**\n * @private\n * @function Highcharts.Scrollbar#init\n * @param {Highcharts.SVGRenderer} renderer\n * @param {Highcharts.ScrollbarOptions} options\n * @param {Highcharts.Chart} chart\n */\n init(renderer, options, chart) {\n const scroller = this;\n scroller.scrollbarButtons = [];\n scroller.renderer = renderer;\n scroller.userOptions = options;\n scroller.options = Scrollbar_merge(Scrollbar_ScrollbarDefaults, Scrollbar_defaultOptions.scrollbar, options);\n scroller.options.margin = Scrollbar_pick(scroller.options.margin, 10);\n scroller.chart = chart;\n // Backward compatibility\n scroller.size = Scrollbar_pick(scroller.options.size, scroller.options.height);\n // Init\n if (options.enabled) {\n scroller.render();\n scroller.addEvents();\n }\n }\n mouseDownHandler(e) {\n const scroller = this, normalizedEvent = scroller.chart.pointer?.normalize(e) || e, mousePosition = scroller.cursorToScrollbarPosition(normalizedEvent);\n scroller.chartX = mousePosition.chartX;\n scroller.chartY = mousePosition.chartY;\n scroller.initPositions = [scroller.from, scroller.to];\n scroller.grabbedCenter = true;\n }\n /**\n * Event handler for the mouse move event.\n * @private\n */\n mouseMoveHandler(e) {\n const scroller = this, normalizedEvent = scroller.chart.pointer?.normalize(e) || e, options = scroller.options, direction = options.vertical ?\n 'chartY' : 'chartX', initPositions = scroller.initPositions || [];\n let scrollPosition, chartPosition, change;\n // In iOS, a mousemove event with e.pageX === 0 is fired when\n // holding the finger down in the center of the scrollbar. This\n // should be ignored.\n if (scroller.grabbedCenter &&\n // #4696, scrollbar failed on Android\n (!e.touches || e.touches[0][direction] !== 0)) {\n chartPosition = scroller.cursorToScrollbarPosition(normalizedEvent)[direction];\n scrollPosition = scroller[direction];\n change = chartPosition - scrollPosition;\n scroller.hasDragged = true;\n scroller.updatePosition(initPositions[0] + change, initPositions[1] + change);\n if (scroller.hasDragged) {\n Scrollbar_fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMType: e.type,\n DOMEvent: e\n });\n }\n }\n }\n /**\n * Event handler for the mouse up event.\n * @private\n */\n mouseUpHandler(e) {\n const scroller = this;\n if (scroller.hasDragged) {\n Scrollbar_fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMType: e.type,\n DOMEvent: e\n });\n }\n scroller.grabbedCenter =\n scroller.hasDragged =\n scroller.chartX =\n scroller.chartY = null;\n }\n /**\n * Position the scrollbar, method called from a parent with defined\n * dimensions.\n *\n * @private\n * @function Highcharts.Scrollbar#position\n * @param {number} x\n * x-position on the chart\n * @param {number} y\n * y-position on the chart\n * @param {number} width\n * width of the scrollbar\n * @param {number} height\n * height of the scrollbar\n */\n position(x, y, width, height) {\n const scroller = this, options = scroller.options, { buttonsEnabled, margin = 0, vertical } = options, method = scroller.rendered ? 'animate' : 'attr';\n let xOffset = height, yOffset = 0;\n // Make the scrollbar visible when it is repositioned, #15763.\n scroller.group.show();\n scroller.x = x;\n scroller.y = y + this.trackBorderWidth;\n scroller.width = width; // Width with buttons\n scroller.height = height;\n scroller.xOffset = xOffset;\n scroller.yOffset = yOffset;\n // If Scrollbar is a vertical type, swap options:\n if (vertical) {\n scroller.width = scroller.yOffset = width = yOffset = scroller.size;\n scroller.xOffset = xOffset = 0;\n scroller.yOffset = yOffset = buttonsEnabled ? scroller.size : 0;\n // Width without buttons\n scroller.barWidth = height - (buttonsEnabled ? width * 2 : 0);\n scroller.x = x = x + margin;\n }\n else {\n scroller.height = height = scroller.size;\n scroller.xOffset = xOffset = buttonsEnabled ? scroller.size : 0;\n // Width without buttons\n scroller.barWidth = width - (buttonsEnabled ? height * 2 : 0);\n scroller.y = scroller.y + margin;\n }\n // Set general position for a group:\n scroller.group[method]({\n translateX: x,\n translateY: scroller.y\n });\n // Resize background/track:\n scroller.track[method]({\n width: width,\n height: height\n });\n // Move right/bottom button to its place:\n scroller.scrollbarButtons[1][method]({\n translateX: vertical ? 0 : width - xOffset,\n translateY: vertical ? height - yOffset : 0\n });\n }\n /**\n * Removes the event handlers attached previously with addEvents.\n *\n * @private\n * @function Highcharts.Scrollbar#removeEvents\n */\n removeEvents() {\n this._events.forEach(function (args) {\n Scrollbar_removeEvent.apply(null, args);\n });\n this._events.length = 0;\n }\n /**\n * Render scrollbar with all required items.\n *\n * @private\n * @function Highcharts.Scrollbar#render\n */\n render() {\n const scroller = this, renderer = scroller.renderer, options = scroller.options, size = scroller.size, styledMode = scroller.chart.styledMode, group = renderer.g('scrollbar')\n .attr({\n zIndex: options.zIndex\n })\n .hide() // Initially hide the scrollbar #15863\n .add();\n // Draw the scrollbar group\n scroller.group = group;\n // Draw the scrollbar track:\n scroller.track = renderer.rect()\n .addClass('highcharts-scrollbar-track')\n .attr({\n r: options.trackBorderRadius || 0,\n height: size,\n width: size\n }).add(group);\n if (!styledMode) {\n scroller.track.attr({\n fill: options.trackBackgroundColor,\n stroke: options.trackBorderColor,\n 'stroke-width': options.trackBorderWidth\n });\n }\n const trackBorderWidth = scroller.trackBorderWidth =\n scroller.track.strokeWidth();\n scroller.track.attr({\n x: -Scrollbar_crisp(0, trackBorderWidth),\n y: -Scrollbar_crisp(0, trackBorderWidth)\n });\n // Draw the scrollbar itself\n scroller.scrollbarGroup = renderer.g().add(group);\n scroller.scrollbar = renderer.rect()\n .addClass('highcharts-scrollbar-thumb')\n .attr({\n height: size - trackBorderWidth,\n width: size - trackBorderWidth,\n r: options.barBorderRadius || 0\n }).add(scroller.scrollbarGroup);\n scroller.scrollbarRifles = renderer\n .path(Scrollbar.swapXY([\n ['M', -3, size / 4],\n ['L', -3, 2 * size / 3],\n ['M', 0, size / 4],\n ['L', 0, 2 * size / 3],\n ['M', 3, size / 4],\n ['L', 3, 2 * size / 3]\n ], options.vertical))\n .addClass('highcharts-scrollbar-rifles')\n .add(scroller.scrollbarGroup);\n if (!styledMode) {\n scroller.scrollbar.attr({\n fill: options.barBackgroundColor,\n stroke: options.barBorderColor,\n 'stroke-width': options.barBorderWidth\n });\n scroller.scrollbarRifles.attr({\n stroke: options.rifleColor,\n 'stroke-width': 1\n });\n }\n scroller.scrollbarStrokeWidth = scroller.scrollbar.strokeWidth();\n scroller.scrollbarGroup.translate(-Scrollbar_crisp(0, scroller.scrollbarStrokeWidth), -Scrollbar_crisp(0, scroller.scrollbarStrokeWidth));\n // Draw the buttons:\n scroller.drawScrollbarButton(0);\n scroller.drawScrollbarButton(1);\n }\n /**\n * Set scrollbar size, with a given scale.\n *\n * @private\n * @function Highcharts.Scrollbar#setRange\n * @param {number} from\n * scale (0-1) where bar should start\n * @param {number} to\n * scale (0-1) where bar should end\n */\n setRange(from, to) {\n const scroller = this, options = scroller.options, vertical = options.vertical, minWidth = options.minWidth, fullWidth = scroller.barWidth, method = (this.rendered &&\n !this.hasDragged &&\n !(this.chart.navigator && this.chart.navigator.hasDragged)) ? 'animate' : 'attr';\n if (!Scrollbar_defined(fullWidth)) {\n return;\n }\n const toPX = fullWidth * Math.min(to, 1);\n let fromPX, newSize;\n from = Math.max(from, 0);\n fromPX = Math.ceil(fullWidth * from);\n scroller.calculatedWidth = newSize = Scrollbar_correctFloat(toPX - fromPX);\n // We need to recalculate position, if minWidth is used\n if (newSize < minWidth) {\n fromPX = (fullWidth - minWidth + newSize) * from;\n newSize = minWidth;\n }\n const newPos = Math.floor(fromPX + scroller.xOffset + scroller.yOffset);\n const newRiflesPos = newSize / 2 - 0.5; // -0.5 -> rifle line width / 2\n // Store current position:\n scroller.from = from;\n scroller.to = to;\n if (!vertical) {\n scroller.scrollbarGroup[method]({\n translateX: newPos\n });\n scroller.scrollbar[method]({\n width: newSize\n });\n scroller.scrollbarRifles[method]({\n translateX: newRiflesPos\n });\n scroller.scrollbarLeft = newPos;\n scroller.scrollbarTop = 0;\n }\n else {\n scroller.scrollbarGroup[method]({\n translateY: newPos\n });\n scroller.scrollbar[method]({\n height: newSize\n });\n scroller.scrollbarRifles[method]({\n translateY: newRiflesPos\n });\n scroller.scrollbarTop = newPos;\n scroller.scrollbarLeft = 0;\n }\n if (newSize <= 12) {\n scroller.scrollbarRifles.hide();\n }\n else {\n scroller.scrollbarRifles.show();\n }\n // Show or hide the scrollbar based on the showFull setting\n if (options.showFull === false) {\n if (from <= 0 && to >= 1) {\n scroller.group.hide();\n }\n else {\n scroller.group.show();\n }\n }\n scroller.rendered = true;\n }\n /**\n * Checks if the extremes should be updated in response to a scrollbar\n * change event.\n *\n * @private\n * @function Highcharts.Scrollbar#shouldUpdateExtremes\n */\n shouldUpdateExtremes(eventType) {\n return (Scrollbar_pick(this.options.liveRedraw, Core_Globals.svg &&\n !Core_Globals.isTouchDevice &&\n !this.chart.boosted) ||\n // Mouseup always should change extremes\n eventType === 'mouseup' ||\n eventType === 'touchend' ||\n // Internal events\n !Scrollbar_defined(eventType));\n }\n trackClick(e) {\n const scroller = this;\n const normalizedEvent = scroller.chart.pointer?.normalize(e) || e, range = scroller.to - scroller.from, top = scroller.y + scroller.scrollbarTop, left = scroller.x + scroller.scrollbarLeft;\n if ((scroller.options.vertical && normalizedEvent.chartY > top) ||\n (!scroller.options.vertical && normalizedEvent.chartX > left)) {\n // On the top or on the left side of the track:\n scroller.updatePosition(scroller.from + range, scroller.to + range);\n }\n else {\n // On the bottom or the right side of the track:\n scroller.updatePosition(scroller.from - range, scroller.to - range);\n }\n Scrollbar_fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMEvent: e\n });\n }\n /**\n * Update the scrollbar with new options\n *\n * @private\n * @function Highcharts.Scrollbar#update\n * @param {Highcharts.ScrollbarOptions} options\n */\n update(options) {\n this.destroy();\n this.init(this.chart.renderer, Scrollbar_merge(true, this.options, options), this.chart);\n }\n /**\n * Update position option in the Scrollbar, with normalized 0-1 scale\n *\n * @private\n * @function Highcharts.Scrollbar#updatePosition\n * @param {number} from\n * @param {number} to\n */\n updatePosition(from, to) {\n if (to > 1) {\n from = Scrollbar_correctFloat(1 - Scrollbar_correctFloat(to - from));\n to = 1;\n }\n if (from < 0) {\n to = Scrollbar_correctFloat(to - from);\n from = 0;\n }\n this.from = from;\n this.to = to;\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nScrollbar.defaultOptions = Scrollbar_ScrollbarDefaults;\n/* *\n *\n * Registry\n *\n * */\nScrollbar_defaultOptions.scrollbar = Scrollbar_merge(true, Scrollbar.defaultOptions, Scrollbar_defaultOptions.scrollbar);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Scrollbar_Scrollbar = (Scrollbar);\n\n;// ./code/es-modules/Stock/Navigator/Navigator.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\nconst { defaultOptions: Navigator_defaultOptions } = Defaults;\n\nconst { isTouchDevice: Navigator_isTouchDevice } = Core_Globals;\n\n\n\n\nconst { prototype: { symbols } } = SVG_SVGRenderer;\n\nconst { addEvent: Navigator_addEvent, clamp: Navigator_clamp, correctFloat: Navigator_correctFloat, defined: Navigator_defined, destroyObjectProperties: Navigator_destroyObjectProperties, erase: Navigator_erase, extend: Navigator_extend, find: Navigator_find, fireEvent: Navigator_fireEvent, isArray: Navigator_isArray, isNumber: Navigator_isNumber, merge: Navigator_merge, pick: Navigator_pick, removeEvent: Navigator_removeEvent, splat: Navigator_splat } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Finding the min or max of a set of variables where we don't know if they are\n * defined, is a pattern that is repeated several places in Highcharts. Consider\n * making this a global utility method.\n * @private\n */\nfunction numExt(extreme, ...args) {\n const numbers = [].filter.call(args, Navigator_isNumber);\n if (numbers.length) {\n return Math[extreme].apply(0, numbers);\n }\n}\n/* *\n *\n * Class\n *\n * */\n/**\n * The Navigator class\n *\n * @private\n * @class\n * @name Highcharts.Navigator\n *\n * @param {Highcharts.Chart} chart\n * Chart object\n */\nclass Navigator {\n /* *\n *\n * Static Properties\n *\n * */\n static compose(ChartClass, AxisClass, SeriesClass) {\n Navigator_ChartNavigatorComposition.compose(ChartClass, Navigator);\n Navigator_NavigatorComposition.compose(ChartClass, AxisClass, SeriesClass);\n }\n /* *\n *\n * Constructor\n *\n * */\n constructor(chart) {\n this.isDirty = false;\n this.scrollbarHeight = 0;\n this.init(chart);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Draw one of the handles on the side of the zoomed range in the navigator.\n *\n * @private\n * @function Highcharts.Navigator#drawHandle\n *\n * @param {number} x\n * The x center for the handle\n *\n * @param {number} index\n * 0 for left and 1 for right\n *\n * @param {boolean|undefined} inverted\n * Flag for chart.inverted\n *\n * @param {string} verb\n * Use 'animate' or 'attr'\n */\n drawHandle(x, index, inverted, verb) {\n const navigator = this, height = navigator.navigatorOptions.handles.height;\n // Place it\n navigator.handles[index][verb](inverted ? {\n translateX: Math.round(navigator.left + navigator.height / 2),\n translateY: Math.round(navigator.top + parseInt(x, 10) + 0.5 - height)\n } : {\n translateX: Math.round(navigator.left + parseInt(x, 10)),\n translateY: Math.round(navigator.top + navigator.height / 2 - height / 2 - 1)\n });\n }\n /**\n * Render outline around the zoomed range\n *\n * @private\n * @function Highcharts.Navigator#drawOutline\n *\n * @param {number} zoomedMin\n * in pixels position where zoomed range starts\n *\n * @param {number} zoomedMax\n * in pixels position where zoomed range ends\n *\n * @param {boolean|undefined} inverted\n * flag if chart is inverted\n *\n * @param {string} verb\n * use 'animate' or 'attr'\n */\n drawOutline(zoomedMin, zoomedMax, inverted, verb) {\n const navigator = this, maskInside = navigator.navigatorOptions.maskInside, outlineWidth = navigator.outline.strokeWidth(), halfOutline = outlineWidth / 2, outlineCorrection = (outlineWidth % 2) / 2, // #5800\n scrollButtonSize = navigator.scrollButtonSize, navigatorSize = navigator.size, navigatorTop = navigator.top, height = navigator.height, lineTop = navigatorTop - halfOutline, lineBtm = navigatorTop + height;\n let left = navigator.left, verticalMin, path;\n if (inverted) {\n verticalMin = navigatorTop + zoomedMax + outlineCorrection;\n zoomedMax = navigatorTop + zoomedMin + outlineCorrection;\n path = [\n [\n 'M',\n left + height,\n navigatorTop - scrollButtonSize - outlineCorrection\n ],\n // Top right of zoomed range\n ['L', left + height, verticalMin],\n ['L', left, verticalMin], // Top left of z.r.\n ['M', left, zoomedMax], // Bottom left of z.r.\n ['L', left + height, zoomedMax], // Bottom right of z.r.\n [\n 'L',\n left + height,\n navigatorTop + navigatorSize + scrollButtonSize\n ]\n ];\n if (maskInside) {\n path.push(\n // Upper left of zoomed range\n ['M', left + height, verticalMin - halfOutline], \n // Upper right of z.r.\n [\n 'L',\n left + height,\n zoomedMax + halfOutline\n ]);\n }\n }\n else {\n left -= scrollButtonSize;\n zoomedMin += left + scrollButtonSize - outlineCorrection;\n zoomedMax += left + scrollButtonSize - outlineCorrection;\n path = [\n // Left\n ['M', left, lineTop],\n // Upper left of zoomed range\n ['L', zoomedMin, lineTop],\n // Lower left of z.r.\n ['L', zoomedMin, lineBtm],\n // Lower right of z.r.\n ['M', zoomedMax, lineBtm],\n // Upper right of z.r.\n ['L', zoomedMax, lineTop],\n // Right\n [\n 'L',\n left + navigatorSize + scrollButtonSize * 2,\n lineTop\n ]\n ];\n if (maskInside) {\n path.push(\n // Upper left of zoomed range\n ['M', zoomedMin - halfOutline, lineTop], \n // Upper right of z.r.\n ['L', zoomedMax + halfOutline, lineTop]);\n }\n }\n navigator.outline[verb]({\n d: path\n });\n }\n /**\n * Render outline around the zoomed range\n *\n * @private\n * @function Highcharts.Navigator#drawMasks\n *\n * @param {number} zoomedMin\n * in pixels position where zoomed range starts\n *\n * @param {number} zoomedMax\n * in pixels position where zoomed range ends\n *\n * @param {boolean|undefined} inverted\n * flag if chart is inverted\n *\n * @param {string} verb\n * use 'animate' or 'attr'\n */\n drawMasks(zoomedMin, zoomedMax, inverted, verb) {\n const navigator = this, left = navigator.left, top = navigator.top, navigatorHeight = navigator.height;\n let height, width, x, y;\n // Determine rectangle position & size\n // According to (non)inverted position:\n if (inverted) {\n x = [left, left, left];\n y = [top, top + zoomedMin, top + zoomedMax];\n width = [navigatorHeight, navigatorHeight, navigatorHeight];\n height = [\n zoomedMin,\n zoomedMax - zoomedMin,\n navigator.size - zoomedMax\n ];\n }\n else {\n x = [left, left + zoomedMin, left + zoomedMax];\n y = [top, top, top];\n width = [\n zoomedMin,\n zoomedMax - zoomedMin,\n navigator.size - zoomedMax\n ];\n height = [navigatorHeight, navigatorHeight, navigatorHeight];\n }\n navigator.shades.forEach((shade, i) => {\n shade[verb]({\n x: x[i],\n y: y[i],\n width: width[i],\n height: height[i]\n });\n });\n }\n /**\n * Generate and update DOM elements for a navigator:\n *\n * - main navigator group\n *\n * - all shades\n *\n * - outline\n *\n * - handles\n *\n * @private\n * @function Highcharts.Navigator#renderElements\n */\n renderElements() {\n const navigator = this, navigatorOptions = navigator.navigatorOptions, maskInside = navigatorOptions.maskInside, chart = navigator.chart, inverted = chart.inverted, renderer = chart.renderer, mouseCursor = {\n cursor: inverted ? 'ns-resize' : 'ew-resize'\n }, \n // Create the main navigator group\n navigatorGroup = navigator.navigatorGroup ??\n (navigator.navigatorGroup = renderer\n .g('navigator')\n .attr({\n zIndex: 8,\n visibility: 'hidden'\n })\n .add());\n // Create masks, each mask will get events and fill:\n [\n !maskInside,\n maskInside,\n !maskInside\n ].forEach((hasMask, index) => {\n const shade = navigator.shades[index] ??\n (navigator.shades[index] = renderer.rect()\n .addClass('highcharts-navigator-mask' +\n (index === 1 ? '-inside' : '-outside'))\n .add(navigatorGroup));\n if (!chart.styledMode) {\n shade.attr({\n fill: hasMask ? navigatorOptions.maskFill : 'rgba(0,0,0,0)'\n });\n if (index === 1) {\n shade.css(mouseCursor);\n }\n }\n });\n // Create the outline:\n if (!navigator.outline) {\n navigator.outline = renderer.path()\n .addClass('highcharts-navigator-outline')\n .add(navigatorGroup);\n }\n if (!chart.styledMode) {\n navigator.outline.attr({\n 'stroke-width': navigatorOptions.outlineWidth,\n stroke: navigatorOptions.outlineColor\n });\n }\n // Create the handlers:\n if (navigatorOptions.handles?.enabled) {\n const handlesOptions = navigatorOptions.handles, { height, width } = handlesOptions;\n [0, 1].forEach((index) => {\n const symbolName = handlesOptions.symbols[index];\n if (!navigator.handles[index] ||\n navigator.handles[index].symbolUrl !== symbolName) {\n // Generate symbol from scratch if we're dealing with an URL\n navigator.handles[index]?.destroy();\n navigator.handles[index] = renderer.symbol(symbolName, -width / 2 - 1, 0, width, height, handlesOptions);\n // Z index is 6 for right handle, 7 for left. Can't be 10,\n // because of the tooltip in inverted chart (#2908).\n navigator.handles[index].attr({ zIndex: 7 - index })\n .addClass('highcharts-navigator-handle ' +\n 'highcharts-navigator-handle-' +\n ['left', 'right'][index]).add(navigatorGroup);\n navigator.addMouseEvents();\n // If the navigator symbol changed, update its path and name\n }\n else if (!navigator.handles[index].isImg &&\n navigator.handles[index].symbolName !== symbolName) {\n const symbolFn = symbols[symbolName], path = symbolFn.call(symbols, -width / 2 - 1, 0, width, height);\n navigator.handles[index].attr({\n d: path\n });\n navigator.handles[index].symbolName = symbolName;\n }\n if (chart.inverted) {\n navigator.handles[index].attr({\n rotation: 90,\n rotationOriginX: Math.floor(-width / 2),\n rotationOriginY: (height + width) / 2\n });\n }\n if (!chart.styledMode) {\n navigator.handles[index]\n .attr({\n fill: handlesOptions.backgroundColor,\n stroke: handlesOptions.borderColor,\n 'stroke-width': handlesOptions.lineWidth,\n width: handlesOptions.width,\n height: handlesOptions.height,\n x: -width / 2 - 1,\n y: 0\n })\n .css(mouseCursor);\n }\n });\n }\n }\n /**\n * Update navigator\n *\n * @private\n * @function Highcharts.Navigator#update\n *\n * @param {Highcharts.NavigatorOptions} options\n * Options to merge in when updating navigator\n */\n update(options, redraw = false) {\n const chart = this.chart, invertedUpdate = chart.options.chart.inverted !==\n chart.scrollbar?.options.vertical;\n Navigator_merge(true, chart.options.navigator, options);\n this.navigatorOptions = chart.options.navigator || {};\n this.setOpposite();\n // Revert to destroy/init for navigator/scrollbar enabled toggle\n if (Navigator_defined(options.enabled) || invertedUpdate) {\n this.destroy();\n this.navigatorEnabled = options.enabled || this.navigatorEnabled;\n return this.init(chart);\n }\n if (this.navigatorEnabled) {\n this.isDirty = true;\n if (options.adaptToUpdatedData === false) {\n this.baseSeries.forEach((series) => {\n Navigator_removeEvent(series, 'updatedData', this.updatedDataHandler);\n }, this);\n }\n if (options.adaptToUpdatedData) {\n this.baseSeries.forEach((series) => {\n series.eventsToUnbind.push(Navigator_addEvent(series, 'updatedData', this.updatedDataHandler));\n }, this);\n }\n // Update navigator series\n if (options.series || options.baseSeries) {\n this.setBaseSeries(void 0, false);\n }\n // Update navigator axis\n if (options.height || options.xAxis || options.yAxis) {\n this.height = options.height ?? this.height;\n const offsets = this.getXAxisOffsets();\n this.xAxis.update({\n ...options.xAxis,\n offsets,\n [chart.inverted ? 'width' : 'height']: this.height,\n [chart.inverted ? 'height' : 'width']: void 0\n }, false);\n this.yAxis.update({\n ...options.yAxis,\n [chart.inverted ? 'width' : 'height']: this.height\n }, false);\n }\n }\n if (redraw) {\n chart.redraw();\n }\n }\n /**\n * Render the navigator\n *\n * @private\n * @function Highcharts.Navigator#render\n * @param {number} min\n * X axis value minimum\n * @param {number} max\n * X axis value maximum\n * @param {number} [pxMin]\n * Pixel value minimum\n * @param {number} [pxMax]\n * Pixel value maximum\n */\n render(min, max, pxMin, pxMax) {\n const navigator = this, chart = navigator.chart, xAxis = navigator.xAxis, pointRange = xAxis.pointRange || 0, scrollbarXAxis = xAxis.navigatorAxis.fake ? chart.xAxis[0] : xAxis, navigatorEnabled = navigator.navigatorEnabled, rendered = navigator.rendered, inverted = chart.inverted, minRange = chart.xAxis[0].minRange, maxRange = chart.xAxis[0].options.maxRange, scrollButtonSize = navigator.scrollButtonSize;\n let navigatorWidth, scrollbarLeft, scrollbarTop, scrollbarHeight = navigator.scrollbarHeight, navigatorSize, verb;\n // Don't redraw while moving the handles (#4703).\n if (this.hasDragged && !Navigator_defined(pxMin)) {\n return;\n }\n if (this.isDirty) {\n // Update DOM navigator elements\n this.renderElements();\n }\n min = Navigator_correctFloat(min - pointRange / 2);\n max = Navigator_correctFloat(max + pointRange / 2);\n // Don't render the navigator until we have data (#486, #4202, #5172).\n if (!Navigator_isNumber(min) || !Navigator_isNumber(max)) {\n // However, if navigator was already rendered, we may need to resize\n // it. For example hidden series, but visible navigator (#6022).\n if (rendered) {\n pxMin = 0;\n pxMax = Navigator_pick(xAxis.width, scrollbarXAxis.width);\n }\n else {\n return;\n }\n }\n navigator.left = Navigator_pick(xAxis.left, \n // In case of scrollbar only, without navigator\n chart.plotLeft + scrollButtonSize +\n (inverted ? chart.plotWidth : 0));\n let zoomedMax = navigator.size = navigatorSize = Navigator_pick(xAxis.len, (inverted ? chart.plotHeight : chart.plotWidth) -\n 2 * scrollButtonSize);\n if (inverted) {\n navigatorWidth = scrollbarHeight;\n }\n else {\n navigatorWidth = navigatorSize + 2 * scrollButtonSize;\n }\n // Get the pixel position of the handles\n pxMin = Navigator_pick(pxMin, xAxis.toPixels(min, true));\n pxMax = Navigator_pick(pxMax, xAxis.toPixels(max, true));\n // Verify (#1851, #2238)\n if (!Navigator_isNumber(pxMin) || Math.abs(pxMin) === Infinity) {\n pxMin = 0;\n pxMax = navigatorWidth;\n }\n // Are we below the minRange? (#2618, #6191)\n const newMin = xAxis.toValue(pxMin, true), newMax = xAxis.toValue(pxMax, true), currentRange = Math.abs(Navigator_correctFloat(newMax - newMin));\n if (currentRange < minRange) {\n if (this.grabbedLeft) {\n pxMin = xAxis.toPixels(newMax - minRange - pointRange, true);\n }\n else if (this.grabbedRight) {\n pxMax = xAxis.toPixels(newMin + minRange + pointRange, true);\n }\n }\n else if (Navigator_defined(maxRange) &&\n Navigator_correctFloat(currentRange - pointRange) > maxRange) {\n if (this.grabbedLeft) {\n pxMin = xAxis.toPixels(newMax - maxRange - pointRange, true);\n }\n else if (this.grabbedRight) {\n pxMax = xAxis.toPixels(newMin + maxRange + pointRange, true);\n }\n }\n // Handles are allowed to cross, but never exceed the plot area\n navigator.zoomedMax = Navigator_clamp(Math.max(pxMin, pxMax), 0, zoomedMax);\n navigator.zoomedMin = Navigator_clamp(navigator.fixedWidth ?\n navigator.zoomedMax - navigator.fixedWidth :\n Math.min(pxMin, pxMax), 0, zoomedMax);\n navigator.range = navigator.zoomedMax - navigator.zoomedMin;\n zoomedMax = Math.round(navigator.zoomedMax);\n const zoomedMin = Math.round(navigator.zoomedMin);\n if (navigatorEnabled) {\n navigator.navigatorGroup.attr({\n visibility: 'inherit'\n });\n // Place elements\n verb = rendered && !navigator.hasDragged ? 'animate' : 'attr';\n navigator.drawMasks(zoomedMin, zoomedMax, inverted, verb);\n navigator.drawOutline(zoomedMin, zoomedMax, inverted, verb);\n if (navigator.navigatorOptions.handles.enabled) {\n navigator.drawHandle(zoomedMin, 0, inverted, verb);\n navigator.drawHandle(zoomedMax, 1, inverted, verb);\n }\n }\n if (navigator.scrollbar) {\n if (inverted) {\n scrollbarTop = navigator.top - scrollButtonSize;\n scrollbarLeft = navigator.left - scrollbarHeight +\n (navigatorEnabled || !scrollbarXAxis.opposite ? 0 :\n // Multiple axes has offsets:\n (scrollbarXAxis.titleOffset || 0) +\n // Self margin from the axis.title\n scrollbarXAxis.axisTitleMargin);\n scrollbarHeight = navigatorSize + 2 * scrollButtonSize;\n }\n else {\n scrollbarTop = navigator.top + (navigatorEnabled ?\n navigator.height :\n -scrollbarHeight);\n scrollbarLeft = navigator.left - scrollButtonSize;\n }\n // Reposition scrollbar\n navigator.scrollbar.position(scrollbarLeft, scrollbarTop, navigatorWidth, scrollbarHeight);\n // Keep scale 0-1\n navigator.scrollbar.setRange(\n // Use real value, not rounded because range can be very small\n // (#1716)\n navigator.zoomedMin / (navigatorSize || 1), navigator.zoomedMax / (navigatorSize || 1));\n }\n navigator.rendered = true;\n this.isDirty = false;\n Navigator_fireEvent(this, 'afterRender');\n }\n /**\n * Set up the mouse and touch events for the navigator\n *\n * @private\n * @function Highcharts.Navigator#addMouseEvents\n */\n addMouseEvents() {\n const navigator = this, chart = navigator.chart, container = chart.container;\n let eventsToUnbind = [], mouseMoveHandler, mouseUpHandler;\n /**\n * Create mouse events' handlers.\n * Make them as separate functions to enable wrapping them:\n */\n navigator.mouseMoveHandler = mouseMoveHandler = function (e) {\n navigator.onMouseMove(e);\n };\n navigator.mouseUpHandler = mouseUpHandler = function (e) {\n navigator.onMouseUp(e);\n };\n // Add shades and handles mousedown events\n eventsToUnbind = navigator.getPartsEvents('mousedown');\n eventsToUnbind.push(\n // Add mouse move and mouseup events. These are bind to doc/div,\n // because Navigator.grabbedSomething flags are stored in mousedown\n // events\n Navigator_addEvent(chart.renderTo, 'mousemove', mouseMoveHandler), Navigator_addEvent(container.ownerDocument, 'mouseup', mouseUpHandler), \n // Touch events\n Navigator_addEvent(chart.renderTo, 'touchmove', mouseMoveHandler), Navigator_addEvent(container.ownerDocument, 'touchend', mouseUpHandler));\n eventsToUnbind.concat(navigator.getPartsEvents('touchstart'));\n navigator.eventsToUnbind = eventsToUnbind;\n // Data events\n if (navigator.series && navigator.series[0]) {\n eventsToUnbind.push(Navigator_addEvent(navigator.series[0].xAxis, 'foundExtremes', function () {\n chart.navigator.modifyNavigatorAxisExtremes();\n }));\n }\n }\n /**\n * Generate events for handles and masks\n *\n * @private\n * @function Highcharts.Navigator#getPartsEvents\n *\n * @param {string} eventName\n * Event name handler, 'mousedown' or 'touchstart'\n *\n * @return {Array}\n * An array of functions to remove navigator functions from the\n * events again.\n */\n getPartsEvents(eventName) {\n const navigator = this, events = [];\n ['shades', 'handles'].forEach(function (name) {\n navigator[name].forEach(function (navigatorItem, index) {\n events.push(Navigator_addEvent(navigatorItem.element, eventName, function (e) {\n navigator[name + 'Mousedown'](e, index);\n }));\n });\n });\n return events;\n }\n /**\n * Mousedown on a shaded mask, either:\n *\n * - will be stored for future drag&drop\n *\n * - will directly shift to a new range\n *\n * @private\n * @function Highcharts.Navigator#shadesMousedown\n *\n * @param {Highcharts.PointerEventObject} e\n * Mouse event\n *\n * @param {number} index\n * Index of a mask in Navigator.shades array\n */\n shadesMousedown(e, index) {\n e = this.chart.pointer?.normalize(e) || e;\n const navigator = this, chart = navigator.chart, xAxis = navigator.xAxis, zoomedMin = navigator.zoomedMin, navigatorSize = navigator.size, range = navigator.range;\n let navigatorPosition = navigator.left, chartX = e.chartX, fixedMax, fixedMin, ext, left;\n // For inverted chart, swap some options:\n if (chart.inverted) {\n chartX = e.chartY;\n navigatorPosition = navigator.top;\n }\n if (index === 1) {\n // Store information for drag&drop\n navigator.grabbedCenter = chartX;\n navigator.fixedWidth = range;\n navigator.dragOffset = chartX - zoomedMin;\n }\n else {\n // Shift the range by clicking on shaded areas\n left = chartX - navigatorPosition - range / 2;\n if (index === 0) {\n left = Math.max(0, left);\n }\n else if (index === 2 && left + range >= navigatorSize) {\n left = navigatorSize - range;\n if (navigator.reversedExtremes) {\n // #7713\n left -= range;\n fixedMin = navigator.getUnionExtremes().dataMin;\n }\n else {\n // #2293, #3543\n fixedMax = navigator.getUnionExtremes().dataMax;\n }\n }\n if (left !== zoomedMin) { // It has actually moved\n navigator.fixedWidth = range; // #1370\n ext = xAxis.navigatorAxis.toFixedRange(left, left + range, fixedMin, fixedMax);\n if (Navigator_defined(ext.min)) { // #7411\n Navigator_fireEvent(this, 'setRange', {\n min: Math.min(ext.min, ext.max),\n max: Math.max(ext.min, ext.max),\n redraw: true,\n eventArguments: {\n trigger: 'navigator'\n }\n });\n }\n }\n }\n }\n /**\n * Mousedown on a handle mask.\n * Will store necessary information for drag&drop.\n *\n * @private\n * @function Highcharts.Navigator#handlesMousedown\n * @param {Highcharts.PointerEventObject} e\n * Mouse event\n * @param {number} index\n * Index of a handle in Navigator.handles array\n */\n handlesMousedown(e, index) {\n e = this.chart.pointer?.normalize(e) || e;\n const navigator = this, chart = navigator.chart, baseXAxis = chart.xAxis[0], \n // For reversed axes, min and max are changed,\n // so the other extreme should be stored\n reverse = navigator.reversedExtremes;\n if (index === 0) {\n // Grab the left handle\n navigator.grabbedLeft = true;\n navigator.otherHandlePos = navigator.zoomedMax;\n navigator.fixedExtreme = reverse ? baseXAxis.min : baseXAxis.max;\n }\n else {\n // Grab the right handle\n navigator.grabbedRight = true;\n navigator.otherHandlePos = navigator.zoomedMin;\n navigator.fixedExtreme = reverse ? baseXAxis.max : baseXAxis.min;\n }\n chart.setFixedRange(void 0);\n }\n /**\n * Mouse move event based on x/y mouse position.\n *\n * @private\n * @function Highcharts.Navigator#onMouseMove\n *\n * @param {Highcharts.PointerEventObject} e\n * Mouse event\n */\n onMouseMove(e) {\n const navigator = this, chart = navigator.chart, navigatorSize = navigator.navigatorSize, range = navigator.range, dragOffset = navigator.dragOffset, inverted = chart.inverted;\n let left = navigator.left, chartX;\n // In iOS, a mousemove event with e.pageX === 0 is fired when holding\n // the finger down in the center of the scrollbar. This should be\n // ignored.\n if (!e.touches || e.touches[0].pageX !== 0) { // #4696\n e = chart.pointer?.normalize(e) || e;\n chartX = e.chartX;\n // Swap some options for inverted chart\n if (inverted) {\n left = navigator.top;\n chartX = e.chartY;\n }\n // Drag left handle or top handle\n if (navigator.grabbedLeft) {\n navigator.hasDragged = true;\n navigator.render(0, 0, chartX - left, navigator.otherHandlePos);\n // Drag right handle or bottom handle\n }\n else if (navigator.grabbedRight) {\n navigator.hasDragged = true;\n navigator.render(0, 0, navigator.otherHandlePos, chartX - left);\n // Drag scrollbar or open area in navigator\n }\n else if (navigator.grabbedCenter) {\n navigator.hasDragged = true;\n if (chartX < dragOffset) { // Outside left\n chartX = dragOffset;\n // Outside right\n }\n else if (chartX >\n navigatorSize + dragOffset - range) {\n chartX = navigatorSize + dragOffset - range;\n }\n navigator.render(0, 0, chartX - dragOffset, chartX - dragOffset + range);\n }\n if (navigator.hasDragged &&\n navigator.scrollbar &&\n Navigator_pick(navigator.scrollbar.options.liveRedraw, \n // By default, don't run live redraw on touch\n // devices or if the chart is in boost.\n !Navigator_isTouchDevice &&\n !this.chart.boosted)) {\n e.DOMType = e.type;\n setTimeout(function () {\n navigator.onMouseUp(e);\n }, 0);\n }\n }\n }\n /**\n * Mouse up event based on x/y mouse position.\n *\n * @private\n * @function Highcharts.Navigator#onMouseUp\n * @param {Highcharts.PointerEventObject} e\n * Mouse event\n */\n onMouseUp(e) {\n const navigator = this, chart = navigator.chart, xAxis = navigator.xAxis, scrollbar = navigator.scrollbar, DOMEvent = e.DOMEvent || e, inverted = chart.inverted, verb = navigator.rendered && !navigator.hasDragged ?\n 'animate' : 'attr';\n let zoomedMax, zoomedMin, unionExtremes, fixedMin, fixedMax, ext;\n if (\n // MouseUp is called for both, navigator and scrollbar (that order),\n // which causes calling afterSetExtremes twice. Prevent first call\n // by checking if scrollbar is going to set new extremes (#6334)\n (navigator.hasDragged && (!scrollbar || !scrollbar.hasDragged)) ||\n e.trigger === 'scrollbar') {\n unionExtremes = navigator.getUnionExtremes();\n // When dragging one handle, make sure the other one doesn't change\n if (navigator.zoomedMin === navigator.otherHandlePos) {\n fixedMin = navigator.fixedExtreme;\n }\n else if (navigator.zoomedMax === navigator.otherHandlePos) {\n fixedMax = navigator.fixedExtreme;\n }\n // Snap to right edge (#4076)\n if (navigator.zoomedMax === navigator.size) {\n fixedMax = navigator.reversedExtremes ?\n unionExtremes.dataMin :\n unionExtremes.dataMax;\n }\n // Snap to left edge (#7576)\n if (navigator.zoomedMin === 0) {\n fixedMin = navigator.reversedExtremes ?\n unionExtremes.dataMax :\n unionExtremes.dataMin;\n }\n ext = xAxis.navigatorAxis.toFixedRange(navigator.zoomedMin, navigator.zoomedMax, fixedMin, fixedMax);\n if (Navigator_defined(ext.min)) {\n Navigator_fireEvent(this, 'setRange', {\n min: Math.min(ext.min, ext.max),\n max: Math.max(ext.min, ext.max),\n redraw: true,\n animation: navigator.hasDragged ? false : null,\n eventArguments: {\n trigger: 'navigator',\n triggerOp: 'navigator-drag',\n DOMEvent: DOMEvent // #1838\n }\n });\n }\n }\n if (e.DOMType !== 'mousemove' &&\n e.DOMType !== 'touchmove') {\n navigator.grabbedLeft = navigator.grabbedRight =\n navigator.grabbedCenter = navigator.fixedWidth =\n navigator.fixedExtreme = navigator.otherHandlePos =\n navigator.hasDragged = navigator.dragOffset = null;\n }\n // Update position of navigator shades, outline and handles (#12573)\n if (navigator.navigatorEnabled &&\n Navigator_isNumber(navigator.zoomedMin) &&\n Navigator_isNumber(navigator.zoomedMax)) {\n zoomedMin = Math.round(navigator.zoomedMin);\n zoomedMax = Math.round(navigator.zoomedMax);\n if (navigator.shades) {\n navigator.drawMasks(zoomedMin, zoomedMax, inverted, verb);\n }\n if (navigator.outline) {\n navigator.drawOutline(zoomedMin, zoomedMax, inverted, verb);\n }\n if (navigator.navigatorOptions.handles.enabled &&\n Object.keys(navigator.handles).length ===\n navigator.handles.length) {\n navigator.drawHandle(zoomedMin, 0, inverted, verb);\n navigator.drawHandle(zoomedMax, 1, inverted, verb);\n }\n }\n }\n /**\n * Removes the event handlers attached previously with addEvents.\n *\n * @private\n * @function Highcharts.Navigator#removeEvents\n */\n removeEvents() {\n if (this.eventsToUnbind) {\n this.eventsToUnbind.forEach(function (unbind) {\n unbind();\n });\n this.eventsToUnbind = void 0;\n }\n this.removeBaseSeriesEvents();\n }\n /**\n * Remove data events.\n *\n * @private\n * @function Highcharts.Navigator#removeBaseSeriesEvents\n */\n removeBaseSeriesEvents() {\n const baseSeries = this.baseSeries || [];\n if (this.navigatorEnabled && baseSeries[0]) {\n if (this.navigatorOptions.adaptToUpdatedData !== false) {\n baseSeries.forEach(function (series) {\n Navigator_removeEvent(series, 'updatedData', this.updatedDataHandler);\n }, this);\n }\n // We only listen for extremes-events on the first baseSeries\n if (baseSeries[0].xAxis) {\n Navigator_removeEvent(baseSeries[0].xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n }\n }\n }\n /**\n * Calculate the navigator xAxis offsets\n *\n * @private\n */\n getXAxisOffsets() {\n return (this.chart.inverted ?\n [this.scrollButtonSize, 0, -this.scrollButtonSize, 0] :\n [0, -this.scrollButtonSize, 0, this.scrollButtonSize]);\n }\n /**\n * Initialize the Navigator object\n *\n * @private\n * @function Highcharts.Navigator#init\n */\n init(chart) {\n const chartOptions = chart.options, navigatorOptions = chartOptions.navigator || {}, navigatorEnabled = navigatorOptions.enabled, scrollbarOptions = chartOptions.scrollbar || {}, scrollbarEnabled = scrollbarOptions.enabled, height = navigatorEnabled && navigatorOptions.height || 0, scrollbarHeight = scrollbarEnabled && scrollbarOptions.height || 0, scrollButtonSize = scrollbarOptions.buttonsEnabled && scrollbarHeight || 0;\n this.handles = [];\n this.shades = [];\n this.chart = chart;\n this.setBaseSeries();\n this.height = height;\n this.scrollbarHeight = scrollbarHeight;\n this.scrollButtonSize = scrollButtonSize;\n this.scrollbarEnabled = scrollbarEnabled;\n this.navigatorEnabled = navigatorEnabled;\n this.navigatorOptions = navigatorOptions;\n this.scrollbarOptions = scrollbarOptions;\n this.setOpposite();\n const navigator = this, baseSeries = navigator.baseSeries, xAxisIndex = chart.xAxis.length, yAxisIndex = chart.yAxis.length, baseXaxis = baseSeries && baseSeries[0] && baseSeries[0].xAxis ||\n chart.xAxis[0] || { options: {} };\n chart.isDirtyBox = true;\n if (navigator.navigatorEnabled) {\n const offsets = this.getXAxisOffsets();\n // An x axis is required for scrollbar also\n navigator.xAxis = new Axis_Axis(chart, Navigator_merge({\n // Inherit base xAxis' break, ordinal options and overscroll\n breaks: baseXaxis.options.breaks,\n ordinal: baseXaxis.options.ordinal,\n overscroll: baseXaxis.options.overscroll\n }, navigatorOptions.xAxis, {\n type: 'datetime',\n yAxis: navigatorOptions.yAxis?.id,\n index: xAxisIndex,\n isInternal: true,\n offset: 0,\n keepOrdinalPadding: true, // #2436\n startOnTick: false,\n endOnTick: false,\n // Inherit base xAxis' padding when ordinal is false (#16915).\n minPadding: baseXaxis.options.ordinal ? 0 :\n baseXaxis.options.minPadding,\n maxPadding: baseXaxis.options.ordinal ? 0 :\n baseXaxis.options.maxPadding,\n zoomEnabled: false\n }, chart.inverted ? {\n offsets,\n width: height\n } : {\n offsets,\n height\n }), 'xAxis');\n navigator.yAxis = new Axis_Axis(chart, Navigator_merge(navigatorOptions.yAxis, {\n alignTicks: false,\n offset: 0,\n index: yAxisIndex,\n isInternal: true,\n reversed: Navigator_pick((navigatorOptions.yAxis &&\n navigatorOptions.yAxis.reversed), (chart.yAxis[0] && chart.yAxis[0].reversed), false), // #14060\n zoomEnabled: false\n }, chart.inverted ? {\n width: height\n } : {\n height: height\n }), 'yAxis');\n // If we have a base series, initialize the navigator series\n if (baseSeries || navigatorOptions.series.data) {\n navigator.updateNavigatorSeries(false);\n // If not, set up an event to listen for added series\n }\n else if (chart.series.length === 0) {\n navigator.unbindRedraw = Navigator_addEvent(chart, 'beforeRedraw', function () {\n // We've got one, now add it as base\n if (chart.series.length > 0 && !navigator.series) {\n navigator.setBaseSeries();\n navigator.unbindRedraw(); // Reset\n }\n });\n }\n navigator.reversedExtremes = (chart.inverted && !navigator.xAxis.reversed) || (!chart.inverted && navigator.xAxis.reversed);\n // Render items, so we can bind events to them:\n navigator.renderElements();\n // Add mouse events\n navigator.addMouseEvents();\n // In case of scrollbar only, fake an x axis to get translation\n }\n else {\n navigator.xAxis = {\n chart,\n navigatorAxis: {\n fake: true\n },\n translate: function (value, reverse) {\n const axis = chart.xAxis[0], ext = axis.getExtremes(), scrollTrackWidth = axis.len - 2 * scrollButtonSize, min = numExt('min', axis.options.min, ext.dataMin), valueRange = numExt('max', axis.options.max, ext.dataMax) - min;\n return reverse ?\n // From pixel to value\n (value * valueRange / scrollTrackWidth) + min :\n // From value to pixel\n scrollTrackWidth * (value - min) / valueRange;\n },\n toPixels: function (value) {\n return this.translate(value);\n },\n toValue: function (value) {\n return this.translate(value, true);\n }\n };\n navigator.xAxis.navigatorAxis.axis = navigator.xAxis;\n navigator.xAxis.navigatorAxis.toFixedRange = (NavigatorAxisComposition.prototype.toFixedRange.bind(navigator.xAxis.navigatorAxis));\n }\n // Initialize the scrollbar\n if (chart.options.scrollbar.enabled) {\n const options = Navigator_merge(chart.options.scrollbar, { vertical: chart.inverted });\n if (!Navigator_isNumber(options.margin) && navigator.navigatorEnabled) {\n options.margin = chart.inverted ? -3 : 3;\n }\n chart.scrollbar = navigator.scrollbar = new Scrollbar_Scrollbar(chart.renderer, options, chart);\n Navigator_addEvent(navigator.scrollbar, 'changed', function (e) {\n const range = navigator.size, to = range * this.to, from = range * this.from;\n navigator.hasDragged = navigator.scrollbar.hasDragged;\n navigator.render(0, 0, from, to);\n if (this.shouldUpdateExtremes(e.DOMType)) {\n setTimeout(function () {\n navigator.onMouseUp(e);\n });\n }\n });\n }\n // Add data events\n navigator.addBaseSeriesEvents();\n // Add redraw events\n navigator.addChartEvents();\n }\n /**\n * Set the opposite property on navigator\n *\n * @private\n */\n setOpposite() {\n const navigatorOptions = this.navigatorOptions, navigatorEnabled = this.navigatorEnabled, chart = this.chart;\n this.opposite = Navigator_pick(navigatorOptions.opposite, Boolean(!navigatorEnabled && chart.inverted)); // #6262\n }\n /**\n * Get the union data extremes of the chart - the outer data extremes of the\n * base X axis and the navigator axis.\n *\n * @private\n * @function Highcharts.Navigator#getUnionExtremes\n */\n getUnionExtremes(returnFalseOnNoBaseSeries) {\n const baseAxis = this.chart.xAxis[0], time = this.chart.time, navAxis = this.xAxis, navAxisOptions = navAxis.options, baseAxisOptions = baseAxis.options;\n let ret;\n if (!returnFalseOnNoBaseSeries || baseAxis.dataMin !== null) {\n ret = {\n dataMin: Navigator_pick(// #4053\n time.parse(navAxisOptions?.min), numExt('min', time.parse(baseAxisOptions.min), baseAxis.dataMin, navAxis.dataMin, navAxis.min)),\n dataMax: Navigator_pick(time.parse(navAxisOptions?.max), numExt('max', time.parse(baseAxisOptions.max), baseAxis.dataMax, navAxis.dataMax, navAxis.max))\n };\n }\n return ret;\n }\n /**\n * Set the base series and update the navigator series from this. With a bit\n * of modification we should be able to make this an API method to be called\n * from the outside\n *\n * @private\n * @function Highcharts.Navigator#setBaseSeries\n * @param {Highcharts.SeriesOptionsType} [baseSeriesOptions]\n * Additional series options for a navigator\n * @param {boolean} [redraw]\n * Whether to redraw after update.\n */\n setBaseSeries(baseSeriesOptions, redraw) {\n const chart = this.chart, baseSeries = this.baseSeries = [];\n baseSeriesOptions = (baseSeriesOptions ||\n chart.options && chart.options.navigator.baseSeries ||\n (chart.series.length ?\n // Find the first non-navigator series (#8430)\n Navigator_find(chart.series, (s) => (!s.options.isInternal)).index :\n 0));\n // Iterate through series and add the ones that should be shown in\n // navigator.\n (chart.series || []).forEach((series, i) => {\n if (\n // Don't include existing nav series\n !series.options.isInternal &&\n (series.options.showInNavigator ||\n (i === baseSeriesOptions ||\n series.options.id === baseSeriesOptions) &&\n series.options.showInNavigator !== false)) {\n baseSeries.push(series);\n }\n });\n // When run after render, this.xAxis already exists\n if (this.xAxis && !this.xAxis.navigatorAxis.fake) {\n this.updateNavigatorSeries(true, redraw);\n }\n }\n /**\n * Update series in the navigator from baseSeries, adding new if does not\n * exist.\n *\n * @private\n * @function Highcharts.Navigator.updateNavigatorSeries\n */\n updateNavigatorSeries(addEvents, redraw) {\n const navigator = this, chart = navigator.chart, baseSeries = navigator.baseSeries, navSeriesMixin = {\n enableMouseTracking: false,\n index: null, // #6162\n linkedTo: null, // #6734\n group: 'nav', // For columns\n padXAxis: false,\n xAxis: this.navigatorOptions.xAxis?.id,\n yAxis: this.navigatorOptions.yAxis?.id,\n showInLegend: false,\n stacking: void 0, // #4823\n isInternal: true,\n states: {\n inactive: {\n opacity: 1\n }\n }\n }, \n // Remove navigator series that are no longer in the baseSeries\n navigatorSeries = navigator.series =\n (navigator.series || []).filter((navSeries) => {\n const base = navSeries.baseSeries;\n if (baseSeries.indexOf(base) < 0) { // Not in array\n // If there is still a base series connected to this\n // series, remove event handler and reference.\n if (base) {\n Navigator_removeEvent(base, 'updatedData', navigator.updatedDataHandler);\n delete base.navigatorSeries;\n }\n // Kill the nav series. It may already have been\n // destroyed (#8715).\n if (navSeries.chart) {\n navSeries.destroy();\n }\n return false;\n }\n return true;\n });\n let baseOptions, mergedNavSeriesOptions, chartNavigatorSeriesOptions = navigator.navigatorOptions.series, baseNavigatorOptions;\n // Go through each base series and merge the options to create new\n // series\n if (baseSeries && baseSeries.length) {\n baseSeries.forEach((base) => {\n const linkedNavSeries = base.navigatorSeries, userNavOptions = Navigator_extend(\n // Grab color and visibility from base as default\n {\n color: base.color,\n visible: base.visible\n }, !Navigator_isArray(chartNavigatorSeriesOptions) ?\n chartNavigatorSeriesOptions :\n Navigator_defaultOptions.navigator.series);\n // Don't update if the series exists in nav and we have disabled\n // adaptToUpdatedData.\n if (linkedNavSeries &&\n navigator.navigatorOptions.adaptToUpdatedData === false) {\n return;\n }\n navSeriesMixin.name = 'Navigator ' + baseSeries.length;\n baseOptions = base.options || {};\n baseNavigatorOptions = baseOptions.navigatorOptions || {};\n // The dataLabels options are not merged correctly\n // if the settings are an array, #13847.\n userNavOptions.dataLabels = Navigator_splat(userNavOptions.dataLabels);\n mergedNavSeriesOptions = Navigator_merge(baseOptions, navSeriesMixin, userNavOptions, baseNavigatorOptions);\n // Once nav series type is resolved, pick correct pointRange\n mergedNavSeriesOptions.pointRange = Navigator_pick(\n // Stricte set pointRange in options\n userNavOptions.pointRange, baseNavigatorOptions.pointRange, \n // Fallback to default values, e.g. `null` for column\n Navigator_defaultOptions.plotOptions[mergedNavSeriesOptions.type || 'line'].pointRange);\n // Merge data separately. Do a slice to avoid mutating the\n // navigator options from base series (#4923).\n const navigatorSeriesData = baseNavigatorOptions.data || userNavOptions.data;\n navigator.hasNavigatorData =\n navigator.hasNavigatorData || !!navigatorSeriesData;\n mergedNavSeriesOptions.data = (navigatorSeriesData ||\n baseOptions.data?.slice(0));\n // Update or add the series\n if (linkedNavSeries && linkedNavSeries.options) {\n linkedNavSeries.update(mergedNavSeriesOptions, redraw);\n }\n else {\n base.navigatorSeries = chart.initSeries(mergedNavSeriesOptions);\n // Set data on initial run with dataSorting enabled (#20318)\n chart.setSortedData();\n base.navigatorSeries.baseSeries = base; // Store ref\n navigatorSeries.push(base.navigatorSeries);\n }\n });\n }\n // If user has defined data (and no base series) or explicitly defined\n // navigator.series as an array, we create these series on top of any\n // base series.\n if (chartNavigatorSeriesOptions.data &&\n !(baseSeries && baseSeries.length) ||\n Navigator_isArray(chartNavigatorSeriesOptions)) {\n navigator.hasNavigatorData = false;\n // Allow navigator.series to be an array\n chartNavigatorSeriesOptions =\n Navigator_splat(chartNavigatorSeriesOptions);\n chartNavigatorSeriesOptions.forEach((userSeriesOptions, i) => {\n navSeriesMixin.name =\n 'Navigator ' + (navigatorSeries.length + 1);\n mergedNavSeriesOptions = Navigator_merge(Navigator_defaultOptions.navigator.series, {\n // Since we don't have a base series to pull color from,\n // try to fake it by using color from series with same\n // index. Otherwise pull from the colors array. We need\n // an explicit color as otherwise updates will increment\n // color counter and we'll get a new color for each\n // update of the nav series.\n color: chart.series[i] &&\n !chart.series[i].options.isInternal &&\n chart.series[i].color ||\n chart.options.colors[i] ||\n chart.options.colors[0]\n }, navSeriesMixin, userSeriesOptions);\n mergedNavSeriesOptions.data = userSeriesOptions.data;\n if (mergedNavSeriesOptions.data) {\n navigator.hasNavigatorData = true;\n navigatorSeries.push(chart.initSeries(mergedNavSeriesOptions));\n }\n });\n }\n if (addEvents) {\n this.addBaseSeriesEvents();\n }\n }\n /**\n * Add data events.\n * For example when main series is updated we need to recalculate extremes\n *\n * @private\n * @function Highcharts.Navigator#addBaseSeriesEvent\n */\n addBaseSeriesEvents() {\n const navigator = this, baseSeries = navigator.baseSeries || [];\n // Bind modified extremes event to first base's xAxis only.\n // In event of > 1 base-xAxes, the navigator will ignore those.\n // Adding this multiple times to the same axis is no problem, as\n // duplicates should be discarded by the browser.\n if (baseSeries[0] && baseSeries[0].xAxis) {\n baseSeries[0].eventsToUnbind.push(Navigator_addEvent(baseSeries[0].xAxis, 'foundExtremes', this.modifyBaseAxisExtremes));\n }\n baseSeries.forEach((base) => {\n // Link base series show/hide to navigator series visibility\n base.eventsToUnbind.push(Navigator_addEvent(base, 'show', function () {\n if (this.navigatorSeries) {\n this.navigatorSeries.setVisible(true, false);\n }\n }));\n base.eventsToUnbind.push(Navigator_addEvent(base, 'hide', function () {\n if (this.navigatorSeries) {\n this.navigatorSeries.setVisible(false, false);\n }\n }));\n // Respond to updated data in the base series, unless explicitly\n // not adapting to data changes.\n if (this.navigatorOptions.adaptToUpdatedData !== false) {\n if (base.xAxis) {\n base.eventsToUnbind.push(Navigator_addEvent(base, 'updatedData', this.updatedDataHandler));\n }\n }\n // Handle series removal\n base.eventsToUnbind.push(Navigator_addEvent(base, 'remove', function () {\n if (baseSeries) {\n Navigator_erase(baseSeries, base); // #21043\n }\n if (this.navigatorSeries && navigator.series) {\n Navigator_erase(navigator.series, this.navigatorSeries);\n if (Navigator_defined(this.navigatorSeries.options)) {\n this.navigatorSeries.remove(false);\n }\n delete this.navigatorSeries;\n }\n }));\n });\n }\n /**\n * Get minimum from all base series connected to the navigator\n * @private\n * @param {number} currentSeriesMin\n * Minium from the current series\n * @return {number}\n * Minimum from all series\n */\n getBaseSeriesMin(currentSeriesMin) {\n return this.baseSeries.reduce(function (min, series) {\n // #10193\n return Math.min(min, series.getColumn('x')[0] ?? min);\n }, currentSeriesMin);\n }\n /**\n * Set the navigator x axis extremes to reflect the total. The navigator\n * extremes should always be the extremes of the union of all series in the\n * chart as well as the navigator series.\n *\n * @private\n * @function Highcharts.Navigator#modifyNavigatorAxisExtremes\n */\n modifyNavigatorAxisExtremes() {\n const xAxis = this.xAxis;\n if (typeof xAxis.getExtremes !== 'undefined') {\n const unionExtremes = this.getUnionExtremes(true);\n if (unionExtremes &&\n (unionExtremes.dataMin !== xAxis.min ||\n unionExtremes.dataMax !== xAxis.max)) {\n xAxis.min = unionExtremes.dataMin;\n xAxis.max = unionExtremes.dataMax;\n }\n }\n }\n /**\n * Hook to modify the base axis extremes with information from the Navigator\n *\n * @private\n * @function Highcharts.Navigator#modifyBaseAxisExtremes\n */\n modifyBaseAxisExtremes() {\n const baseXAxis = this, navigator = baseXAxis.chart.navigator, baseExtremes = baseXAxis.getExtremes(), baseMin = baseExtremes.min, baseMax = baseExtremes.max, baseDataMin = baseExtremes.dataMin, baseDataMax = baseExtremes.dataMax, range = baseMax - baseMin, stickToMin = navigator.stickToMin, stickToMax = navigator.stickToMax, overscroll = Navigator_pick(baseXAxis.ordinal?.convertOverscroll(baseXAxis.options.overscroll), 0), navigatorSeries = navigator.series && navigator.series[0], hasSetExtremes = !!baseXAxis.setExtremes, \n // When the extremes have been set by range selector button, don't\n // stick to min or max. The range selector buttons will handle the\n // extremes. (#5489)\n unmutable = baseXAxis.eventArgs &&\n baseXAxis.eventArgs.trigger === 'rangeSelectorButton';\n let newMax, newMin;\n if (!unmutable) {\n // If the zoomed range is already at the min, move it to the right\n // as new data comes in\n if (stickToMin) {\n newMin = baseDataMin;\n newMax = newMin + range;\n }\n // If the zoomed range is already at the max, move it to the right\n // as new data comes in\n if (stickToMax) {\n newMax = baseDataMax + overscroll;\n // If stickToMin is true, the new min value is set above\n if (!stickToMin) {\n newMin = Math.max(baseDataMin, // Don't go below data extremes (#13184)\n newMax - range, navigator.getBaseSeriesMin(navigatorSeries && navigatorSeries.xData ?\n navigatorSeries.xData[0] :\n -Number.MAX_VALUE));\n }\n }\n // Update the extremes\n if (hasSetExtremes && (stickToMin || stickToMax)) {\n if (Navigator_isNumber(newMin)) {\n baseXAxis.min = baseXAxis.userMin = newMin;\n baseXAxis.max = baseXAxis.userMax = newMax;\n }\n }\n }\n // Reset\n navigator.stickToMin =\n navigator.stickToMax = null;\n }\n /**\n * Handler for updated data on the base series. When data is modified, the\n * navigator series must reflect it. This is called from the Chart.redraw\n * function before axis and series extremes are computed.\n *\n * @private\n * @function Highcharts.Navigator#updateDataHandler\n */\n updatedDataHandler() {\n const navigator = this.chart.navigator, baseSeries = this, navigatorSeries = this.navigatorSeries, shouldStickToMax = navigator.reversedExtremes ?\n Math.round(navigator.zoomedMin) === 0 :\n Math.round(navigator.zoomedMax) >= Math.round(navigator.size);\n // If the scrollbar is scrolled all the way to the right, keep right as\n // new data comes in, unless user set navigator.stickToMax to false.\n navigator.stickToMax = Navigator_pick(this.chart.options.navigator &&\n this.chart.options.navigator.stickToMax, shouldStickToMax);\n navigator.stickToMin = navigator.shouldStickToMin(baseSeries, navigator);\n // Set the navigator series data to the new data of the base series\n if (navigatorSeries && !navigator.hasNavigatorData) {\n navigatorSeries.options.pointStart = baseSeries.getColumn('x')[0];\n navigatorSeries.setData(baseSeries.options.data, false, null, false); // #5414\n }\n }\n /**\n * Detect if the zoomed area should stick to the minimum, #14742.\n *\n * @private\n * @function Highcharts.Navigator#shouldStickToMin\n */\n shouldStickToMin(baseSeries, navigator) {\n const xDataMin = navigator.getBaseSeriesMin(baseSeries.getColumn('x')[0]), xAxis = baseSeries.xAxis, max = xAxis.max, min = xAxis.min, range = xAxis.options.range;\n let stickToMin = true;\n if (Navigator_isNumber(max) && Navigator_isNumber(min)) {\n // If range declared, stick to the minimum only if the range\n // is smaller than the data set range.\n if (range && max - xDataMin > 0) {\n stickToMin = max - xDataMin < range;\n }\n else {\n // If the current axis minimum falls outside the new\n // updated dataset, we must adjust.\n stickToMin = min <= xDataMin;\n }\n }\n else {\n stickToMin = false; // #15864\n }\n return stickToMin;\n }\n /**\n * Add chart events, like redrawing navigator, when chart requires that.\n *\n * @private\n * @function Highcharts.Navigator#addChartEvents\n */\n addChartEvents() {\n if (!this.eventsToUnbind) {\n this.eventsToUnbind = [];\n }\n this.eventsToUnbind.push(\n // Move the scrollbar after redraw, like after data updata even if\n // axes don't redraw\n Navigator_addEvent(this.chart, 'redraw', function () {\n const navigator = this.navigator, xAxis = navigator && (navigator.baseSeries &&\n navigator.baseSeries[0] &&\n navigator.baseSeries[0].xAxis ||\n this.xAxis[0]); // #5709, #13114\n if (xAxis) {\n navigator.render(xAxis.min, xAxis.max);\n }\n }), \n // Make room for the navigator, can be placed around the chart:\n Navigator_addEvent(this.chart, 'getMargins', function () {\n const chart = this, navigator = chart.navigator;\n let marginName = navigator.opposite ?\n 'plotTop' : 'marginBottom';\n if (chart.inverted) {\n marginName = navigator.opposite ?\n 'marginRight' : 'plotLeft';\n }\n chart[marginName] =\n (chart[marginName] || 0) + (navigator.navigatorEnabled || !chart.inverted ?\n navigator.height + navigator.scrollbarHeight :\n 0) + navigator.navigatorOptions.margin;\n }), Navigator_addEvent(Navigator, 'setRange', function (e) {\n this.chart.xAxis[0].setExtremes(e.min, e.max, e.redraw, e.animation, e.eventArguments);\n }));\n }\n /**\n * Destroys allocated elements.\n *\n * @private\n * @function Highcharts.Navigator#destroy\n */\n destroy() {\n // Disconnect events added in addEvents\n this.removeEvents();\n if (this.xAxis) {\n Navigator_erase(this.chart.xAxis, this.xAxis);\n Navigator_erase(this.chart.axes, this.xAxis);\n }\n if (this.yAxis) {\n Navigator_erase(this.chart.yAxis, this.yAxis);\n Navigator_erase(this.chart.axes, this.yAxis);\n }\n // Destroy series\n (this.series || []).forEach((s) => {\n if (s.destroy) {\n s.destroy();\n }\n });\n // Destroy properties\n [\n 'series', 'xAxis', 'yAxis', 'shades', 'outline', 'scrollbarTrack',\n 'scrollbarRifles', 'scrollbarGroup', 'scrollbar', 'navigatorGroup',\n 'rendered'\n ].forEach((prop) => {\n if (this[prop] && this[prop].destroy) {\n this[prop].destroy();\n }\n this[prop] = null;\n });\n // Destroy elements in collection\n [this.handles].forEach((coll) => {\n Navigator_destroyObjectProperties(coll);\n });\n this.navigatorEnabled = false;\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Navigator_Navigator = (Navigator);\n\n;// ./code/es-modules/Core/Axis/OrdinalAxis.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\n\nconst { addEvent: OrdinalAxis_addEvent, correctFloat: OrdinalAxis_correctFloat, css: OrdinalAxis_css, defined: OrdinalAxis_defined, error: OrdinalAxis_error, isNumber: OrdinalAxis_isNumber, pick: OrdinalAxis_pick, timeUnits: OrdinalAxis_timeUnits, isString: OrdinalAxis_isString } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\n/**\n * Extends the axis with ordinal support.\n * @private\n */\nvar OrdinalAxis;\n(function (OrdinalAxis) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Extends the axis with ordinal support.\n *\n * @private\n *\n * @param AxisClass\n * Axis class to extend.\n *\n * @param ChartClass\n * Chart class to use.\n *\n * @param SeriesClass\n * Series class to use.\n */\n function compose(AxisClass, SeriesClass, ChartClass) {\n const axisProto = AxisClass.prototype;\n if (!axisProto.ordinal2lin) {\n axisProto.getTimeTicks = getTimeTicks;\n axisProto.index2val = index2val;\n axisProto.lin2val = lin2val;\n axisProto.val2lin = val2lin;\n // Record this to prevent overwriting by broken-axis module (#5979)\n axisProto.ordinal2lin = axisProto.val2lin;\n OrdinalAxis_addEvent(AxisClass, 'afterInit', onAxisAfterInit);\n OrdinalAxis_addEvent(AxisClass, 'foundExtremes', onAxisFoundExtremes);\n OrdinalAxis_addEvent(AxisClass, 'afterSetScale', onAxisAfterSetScale);\n OrdinalAxis_addEvent(AxisClass, 'initialAxisTranslation', onAxisInitialAxisTranslation);\n OrdinalAxis_addEvent(ChartClass, 'pan', onChartPan);\n OrdinalAxis_addEvent(ChartClass, 'touchpan', onChartPan);\n OrdinalAxis_addEvent(SeriesClass, 'updatedData', onSeriesUpdatedData);\n }\n return AxisClass;\n }\n OrdinalAxis.compose = compose;\n /**\n * In an ordinal axis, there might be areas with dense concentrations of\n * points, then large gaps between some. Creating equally distributed\n * ticks over this entire range may lead to a huge number of ticks that\n * will later be removed. So instead, break the positions up in\n * segments, find the tick positions for each segment then concatenize\n * them. This method is used from both data grouping logic and X axis\n * tick position logic.\n * @private\n */\n function getTimeTicks(normalizedInterval, min, max, startOfWeek, positions = [], closestDistance = 0, findHigherRanks) {\n const higherRanks = {}, tickPixelIntervalOption = this.options.tickPixelInterval, time = this.chart.time, \n // Record all the start positions of a segment, to use when\n // deciding what's a gap in the data.\n segmentStarts = [];\n let end, segmentPositions, hasCrossedHigherRank, info, outsideMax, start = 0, groupPositions = [], lastGroupPosition = -Number.MAX_VALUE;\n // The positions are not always defined, for example for ordinal\n // positions when data has regular interval (#1557, #2090)\n if ((!this.options.ordinal && !this.options.breaks) ||\n !positions ||\n positions.length < 3 ||\n typeof min === 'undefined') {\n return time.getTimeTicks.apply(time, arguments);\n }\n // Analyze the positions array to split it into segments on gaps\n // larger than 5 times the closest distance. The closest distance is\n // already found at this point, so we reuse that instead of\n // computing it again.\n const posLength = positions.length;\n for (end = 0; end < posLength; end++) {\n outsideMax = end && positions[end - 1] > max;\n if (positions[end] < min) { // Set the last position before min\n start = end;\n }\n if (end === posLength - 1 ||\n positions[end + 1] - positions[end] > closestDistance * 5 ||\n outsideMax) {\n // For each segment, calculate the tick positions from the\n // getTimeTicks utility function. The interval will be the\n // same regardless of how long the segment is.\n if (positions[end] > lastGroupPosition) { // #1475\n segmentPositions = time.getTimeTicks(normalizedInterval, positions[start], positions[end], startOfWeek);\n // Prevent duplicate groups, for example for multiple\n // segments within one larger time frame (#1475)\n while (segmentPositions.length &&\n segmentPositions[0] <= lastGroupPosition) {\n segmentPositions.shift();\n }\n if (segmentPositions.length) {\n lastGroupPosition =\n segmentPositions[segmentPositions.length - 1];\n }\n segmentStarts.push(groupPositions.length);\n groupPositions = groupPositions.concat(segmentPositions);\n }\n // Set start of next segment\n start = end + 1;\n }\n if (outsideMax) {\n break;\n }\n }\n // Get the grouping info from the last of the segments. The info is\n // the same for all segments.\n if (segmentPositions) {\n info = segmentPositions.info;\n // Optionally identify ticks with higher rank, for example\n // when the ticks have crossed midnight.\n if (findHigherRanks && info.unitRange <= OrdinalAxis_timeUnits.hour) {\n end = groupPositions.length - 1;\n // Compare points two by two\n for (start = 1; start < end; start++) {\n if (time.dateFormat('%d', groupPositions[start]) !==\n time.dateFormat('%d', groupPositions[start - 1])) {\n higherRanks[groupPositions[start]] = 'day';\n hasCrossedHigherRank = true;\n }\n }\n // If the complete array has crossed midnight, we want\n // to mark the first positions also as higher rank\n if (hasCrossedHigherRank) {\n higherRanks[groupPositions[0]] = 'day';\n }\n info.higherRanks = higherRanks;\n }\n // Save the info\n info.segmentStarts = segmentStarts;\n groupPositions.info = info;\n }\n else {\n OrdinalAxis_error(12, false, this.chart);\n }\n // Don't show ticks within a gap in the ordinal axis, where the\n // space between two points is greater than a portion of the tick\n // pixel interval\n if (findHigherRanks && OrdinalAxis_defined(tickPixelIntervalOption)) {\n const length = groupPositions.length, translatedArr = [], distances = [];\n let itemToRemove, translated, lastTranslated, medianDistance, distance, i = length;\n // Find median pixel distance in order to keep a reasonably even\n // distance between ticks (#748)\n while (i--) {\n translated = this.translate(groupPositions[i]);\n if (lastTranslated) {\n distances[i] = lastTranslated - translated;\n }\n translatedArr[i] = lastTranslated = translated;\n }\n distances.sort((a, b) => a - b);\n medianDistance = distances[Math.floor(distances.length / 2)];\n if (medianDistance < tickPixelIntervalOption * 0.6) {\n medianDistance = null;\n }\n // Now loop over again and remove ticks where needed\n i = groupPositions[length - 1] > max ? length - 1 : length; // #817\n lastTranslated = void 0;\n while (i--) {\n translated = translatedArr[i];\n distance = Math.abs(lastTranslated - translated);\n // #4175 - when axis is reversed, the distance, is negative but\n // tickPixelIntervalOption positive, so we need to compare the\n // same values\n // Remove ticks that are closer than 0.6 times the pixel\n // interval from the one to the right, but not if it is close to\n // the median distance (#748).\n if (lastTranslated &&\n distance < tickPixelIntervalOption * 0.8 &&\n (medianDistance === null || distance < medianDistance * 0.8)) {\n // Is this a higher ranked position with a normal\n // position to the right?\n if (higherRanks[groupPositions[i]] &&\n !higherRanks[groupPositions[i + 1]]) {\n // Yes: remove the lower ranked neighbour to the\n // right\n itemToRemove = i + 1;\n lastTranslated = translated; // #709\n }\n else {\n // No: remove this one\n itemToRemove = i;\n }\n groupPositions.splice(itemToRemove, 1);\n }\n else {\n lastTranslated = translated;\n }\n }\n }\n return groupPositions;\n }\n /**\n * Get axis position of given index of the extended ordinal positions.\n * Used only when panning an ordinal axis.\n *\n * @private\n * @function Highcharts.Axis#index2val\n * @param {number} index\n * The index value of searched point\n */\n function index2val(index) {\n const axis = this, ordinal = axis.ordinal, \n // Context could be changed to extendedOrdinalPositions.\n ordinalPositions = ordinal.positions;\n // The visible range contains only equally spaced values.\n if (!ordinalPositions) {\n return index;\n }\n let i = ordinalPositions.length - 1, distance;\n if (index < 0) { // Out of range, in effect panning to the left\n index = ordinalPositions[0];\n }\n else if (index > i) { // Out of range, panning to the right\n index = ordinalPositions[i];\n }\n else { // Split it up\n i = Math.floor(index);\n distance = index - i; // The decimal\n }\n if (typeof distance !== 'undefined' &&\n typeof ordinalPositions[i] !== 'undefined') {\n return ordinalPositions[i] + (distance ?\n distance *\n (ordinalPositions[i + 1] - ordinalPositions[i]) :\n 0);\n }\n return index;\n }\n /**\n * Translate from linear (internal) to axis value.\n *\n * @private\n * @function Highcharts.Axis#lin2val\n * @param {number} val\n * The linear abstracted value.\n */\n function lin2val(val) {\n const axis = this, ordinal = axis.ordinal, localMin = axis.old ? axis.old.min : axis.min, localA = axis.old ? axis.old.transA : axis.transA;\n // Always use extendedPositions (#19816)\n const positions = ordinal.getExtendedPositions();\n // In some cases (especially in early stages of the chart creation) the\n // getExtendedPositions might return undefined.\n if (positions?.length) {\n // Convert back from modivied value to pixels. // #15970\n const pixelVal = OrdinalAxis_correctFloat((val - localMin) * localA +\n axis.minPixelPadding), index = OrdinalAxis_correctFloat(ordinal.getIndexOfPoint(pixelVal, positions)), mantissa = OrdinalAxis_correctFloat(index % 1);\n // Check if the index is inside position array. If true,\n // read/approximate value for that exact index.\n if (index >= 0 && index <= positions.length - 1) {\n const leftNeighbour = positions[Math.floor(index)], rightNeighbour = positions[Math.ceil(index)], distance = rightNeighbour - leftNeighbour;\n return positions[Math.floor(index)] + mantissa * distance;\n }\n }\n // If the value is outside positions array, return initial value\n return val; // #16784\n }\n /**\n * Internal function to calculate the precise index in ordinalPositions\n * array.\n * @private\n */\n function getIndexInArray(ordinalPositions, val) {\n const index = OrdinalAxis.Additions.findIndexOf(ordinalPositions, val, true);\n if (ordinalPositions[index] === val) {\n return index;\n }\n const percent = (val - ordinalPositions[index]) /\n (ordinalPositions[index + 1] - ordinalPositions[index]);\n return index + percent;\n }\n /**\n * @private\n */\n function onAxisAfterInit() {\n const axis = this;\n if (!axis.ordinal) {\n axis.ordinal = new OrdinalAxis.Additions(axis);\n }\n }\n /**\n * @private\n */\n function onAxisFoundExtremes() {\n const axis = this, { eventArgs, options } = axis;\n if (axis.isXAxis &&\n OrdinalAxis_defined(options.overscroll) &&\n options.overscroll !== 0 &&\n OrdinalAxis_isNumber(axis.max) &&\n OrdinalAxis_isNumber(axis.min)) {\n if (axis.options.ordinal && !axis.ordinal.originalOrdinalRange) {\n // Calculate the original ordinal range\n axis.ordinal.getExtendedPositions(false);\n }\n if (axis.max === axis.dataMax &&\n (\n // Panning is an exception. We don't want to apply\n // overscroll when panning over the dataMax\n eventArgs?.trigger !== 'pan' ||\n axis.isInternal) &&\n // Scrollbar buttons are the other execption\n eventArgs?.trigger !== 'navigator') {\n const overscroll = axis.ordinal.convertOverscroll(options.overscroll);\n axis.max += overscroll;\n // Live data and buttons require translation for the min:\n if (!axis.isInternal &&\n OrdinalAxis_defined(axis.userMin) &&\n eventArgs?.trigger !== 'mousewheel') {\n axis.min += overscroll;\n }\n }\n }\n }\n /**\n * For ordinal axis, that loads data async, redraw axis after data is\n * loaded. If we don't do that, axis will have the same extremes as\n * previously, but ordinal positions won't be calculated. See #10290\n * @private\n */\n function onAxisAfterSetScale() {\n const axis = this;\n if (axis.horiz && !axis.isDirty) {\n axis.isDirty = axis.isOrdinal &&\n axis.chart.navigator &&\n !axis.chart.navigator.adaptToUpdatedData;\n }\n }\n /**\n * @private\n */\n function onAxisInitialAxisTranslation() {\n const axis = this;\n if (axis.ordinal) {\n axis.ordinal.beforeSetTickPositions();\n axis.tickInterval = axis.ordinal.postProcessTickInterval(axis.tickInterval);\n }\n }\n /**\n * Extending the Chart.pan method for ordinal axes\n * @private\n */\n function onChartPan(e) {\n const chart = this, xAxis = chart.xAxis[0], overscroll = xAxis.ordinal.convertOverscroll(xAxis.options.overscroll), chartX = e.originalEvent.chartX, panning = chart.options.chart.panning;\n let runBase = false;\n if (panning &&\n panning.type !== 'y' &&\n xAxis.options.ordinal &&\n xAxis.series.length &&\n // On touch devices, let default function handle the pinching\n (!e.touches || e.touches.length <= 1)) {\n const mouseDownX = chart.mouseDownX, extremes = xAxis.getExtremes(), dataMin = extremes.dataMin, dataMax = extremes.dataMax, min = extremes.min, max = extremes.max, hoverPoints = chart.hoverPoints, closestPointRange = (xAxis.closestPointRange ||\n (xAxis.ordinal && xAxis.ordinal.overscrollPointsRange)), pointPixelWidth = (xAxis.translationSlope *\n (xAxis.ordinal.slope || closestPointRange)), \n // How many ordinal units did we move?\n movedUnits = Math.round((mouseDownX - chartX) / pointPixelWidth), \n // Get index of all the chart's points\n extendedOrdinalPositions = xAxis.ordinal.getExtendedPositions(), extendedAxis = {\n ordinal: {\n positions: extendedOrdinalPositions,\n extendedOrdinalPositions: extendedOrdinalPositions\n }\n }, index2val = xAxis.index2val, val2lin = xAxis.val2lin;\n let trimmedRange, ordinalPositions;\n // Make sure panning to the edges does not decrease the zoomed range\n if ((min <= dataMin && movedUnits < 0) ||\n (max + overscroll >= dataMax && movedUnits > 0)) {\n return;\n }\n // We have an ordinal axis, but the data is equally spaced\n if (!extendedAxis.ordinal.positions) {\n runBase = true;\n }\n else if (Math.abs(movedUnits) > 1) {\n // Remove active points for shared tooltip\n if (hoverPoints) {\n hoverPoints.forEach(function (point) {\n point.setState();\n });\n }\n // In grouped data series, the last ordinal position represents\n // the grouped data, which is to the left of the real data max.\n // If we don't compensate for this, we will be allowed to pan\n // grouped data series passed the right of the plot area.\n ordinalPositions = extendedAxis.ordinal.positions;\n if (dataMax >\n ordinalPositions[ordinalPositions.length - 1]) {\n ordinalPositions.push(dataMax);\n }\n // Get the new min and max values by getting the ordinal index\n // for the current extreme, then add the moved units and\n // translate back to values. This happens on the extended\n // ordinal positions if the new position is out of range, else\n // it happens on the current x axis which is smaller and faster.\n chart.setFixedRange(max - min);\n trimmedRange = xAxis.navigatorAxis\n .toFixedRange(void 0, void 0, index2val.apply(extendedAxis, [\n val2lin.apply(extendedAxis, [min, true]) +\n movedUnits\n ]), index2val.apply(extendedAxis, [\n val2lin.apply(extendedAxis, [max, true]) +\n movedUnits\n ]));\n // Apply it if it is within the available data range\n if (trimmedRange.min >= Math.min(ordinalPositions[0], min) &&\n trimmedRange.max <= Math.max(ordinalPositions[ordinalPositions.length - 1], max) + overscroll) {\n xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, { trigger: 'pan' });\n }\n chart.mouseDownX = chartX; // Set new reference for next run\n OrdinalAxis_css(chart.container, { cursor: 'move' });\n }\n }\n else {\n runBase = true;\n }\n // Revert to the linear chart.pan version\n if (runBase || (panning && /y/.test(panning.type))) {\n if (overscroll) {\n xAxis.max = xAxis.dataMax + overscroll;\n }\n }\n else {\n e.preventDefault();\n }\n }\n /**\n * @private\n */\n function onSeriesUpdatedData() {\n const xAxis = this.xAxis;\n // Destroy the extended ordinal index on updated data\n // and destroy extendedOrdinalPositions, #16055.\n if (xAxis && xAxis.options.ordinal) {\n delete xAxis.ordinal.index;\n delete xAxis.ordinal.originalOrdinalRange;\n }\n }\n /**\n * Translate from a linear axis value to the corresponding ordinal axis\n * position. If there are no gaps in the ordinal axis this will be the\n * same. The translated value is the value that the point would have if\n * the axis was linear, using the same min and max.\n *\n * @private\n * @function Highcharts.Axis#val2lin\n * @param {number} val\n * The axis value.\n * @param {boolean} [toIndex]\n * Whether to return the index in the ordinalPositions or the new value.\n */\n function val2lin(val, toIndex) {\n const axis = this, ordinal = axis.ordinal, ordinalPositions = ordinal.positions;\n let slope = ordinal.slope, extendedOrdinalPositions;\n if (!ordinalPositions) {\n return val;\n }\n const ordinalLength = ordinalPositions.length;\n let ordinalIndex;\n // If the searched value is inside visible plotArea, ivastigate the\n // value basing on ordinalPositions.\n if (ordinalPositions[0] <= val &&\n ordinalPositions[ordinalLength - 1] >= val) {\n ordinalIndex = getIndexInArray(ordinalPositions, val);\n // Final return value is based on ordinalIndex\n }\n else {\n extendedOrdinalPositions =\n ordinal.getExtendedPositions &&\n ordinal.getExtendedPositions();\n if (!(extendedOrdinalPositions && extendedOrdinalPositions.length)) {\n return val;\n }\n const length = extendedOrdinalPositions.length;\n if (!slope) {\n slope =\n (extendedOrdinalPositions[length - 1] -\n extendedOrdinalPositions[0]) /\n length;\n }\n // `originalPointReference` is equal to the index of first point of\n // ordinalPositions in extendedOrdinalPositions.\n const originalPositionsReference = getIndexInArray(extendedOrdinalPositions, ordinalPositions[0]);\n // If the searched value is outside the visiblePlotArea,\n // check if it is inside extendedOrdinalPositions.\n if (val >= extendedOrdinalPositions[0] &&\n val <=\n extendedOrdinalPositions[length - 1]) {\n // Return Value\n ordinalIndex = getIndexInArray(extendedOrdinalPositions, val) -\n originalPositionsReference;\n }\n else {\n if (!toIndex) {\n // If the value is outside positions array,\n // return initial value, #16784\n return val;\n }\n // Since ordinal.slope is the average distance between 2\n // points on visible plotArea, this can be used to calculate\n // the approximate position of the point, which is outside\n // the extendedOrdinalPositions.\n if (val < extendedOrdinalPositions[0]) {\n const diff = extendedOrdinalPositions[0] - val, approximateIndexOffset = diff / slope;\n ordinalIndex =\n -originalPositionsReference -\n approximateIndexOffset;\n }\n else {\n const diff = val -\n extendedOrdinalPositions[length - 1], approximateIndexOffset = diff / slope;\n ordinalIndex =\n approximateIndexOffset +\n length -\n originalPositionsReference;\n }\n }\n }\n return toIndex ? ordinalIndex : slope * (ordinalIndex || 0) +\n ordinal.offset;\n }\n /* *\n *\n * Classes\n *\n * */\n /**\n * @private\n */\n class Additions {\n /* *\n *\n * Constructors\n *\n * */\n /**\n * @private\n */\n constructor(axis) {\n this.index = {};\n this.axis = axis;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Calculate the ordinal positions before tick positions are calculated.\n * @private\n */\n beforeSetTickPositions() {\n const axis = this.axis, ordinal = axis.ordinal, extremes = axis.getExtremes(), min = extremes.min, max = extremes.max, hasBreaks = axis.brokenAxis?.hasBreaks, isOrdinal = axis.options.ordinal;\n let len, uniqueOrdinalPositions, dist, minIndex, maxIndex, slope, i, ordinalPositions = [], overscrollPointsRange = Number.MAX_VALUE, useOrdinal = false, adjustOrdinalExtremesPoints = false, isBoosted = false;\n // Apply the ordinal logic\n if (isOrdinal || hasBreaks) { // #4167 YAxis is never ordinal ?\n let distanceBetweenPoint = 0;\n axis.series.forEach(function (series, i) {\n const xData = series.getColumn('x', true);\n uniqueOrdinalPositions = [];\n // For an axis with multiple series, check if the distance\n // between points is identical throughout all series.\n if (i > 0 &&\n series.options.id !== 'highcharts-navigator-series' &&\n xData.length > 1) {\n adjustOrdinalExtremesPoints = (distanceBetweenPoint !== xData[1] - xData[0]);\n }\n distanceBetweenPoint = xData[1] - xData[0];\n if (series.boosted) {\n isBoosted = series.boosted;\n }\n if (series.reserveSpace() &&\n (series\n .takeOrdinalPosition !== false || hasBreaks)) {\n // Concatenate the processed X data into the existing\n // positions, or the empty array\n ordinalPositions = ordinalPositions.concat(xData);\n len = ordinalPositions.length;\n // Remove duplicates (#1588)\n ordinalPositions.sort(function (a, b) {\n // Without a custom function it is sorted as strings\n return a - b;\n });\n overscrollPointsRange = Math.min(overscrollPointsRange, OrdinalAxis_pick(\n // Check for a single-point series:\n series.closestPointRange, overscrollPointsRange));\n if (len) {\n i = 0;\n while (i < len - 1) {\n if (ordinalPositions[i] !==\n ordinalPositions[i + 1]) {\n uniqueOrdinalPositions.push(ordinalPositions[i + 1]);\n }\n i++;\n }\n // Check first item:\n if (uniqueOrdinalPositions[0] !==\n ordinalPositions[0]) {\n uniqueOrdinalPositions.unshift(ordinalPositions[0]);\n }\n ordinalPositions = uniqueOrdinalPositions;\n }\n }\n });\n if (!axis.ordinal.originalOrdinalRange) {\n // Calculate current originalOrdinalRange\n axis.ordinal.originalOrdinalRange =\n (ordinalPositions.length - 1) * overscrollPointsRange;\n }\n // If the distance between points is not identical throughout\n // all series, remove the first and last ordinal position to\n // avoid enabling ordinal logic when it is not needed, #17405.\n // Only for boosted series because changes are negligible.\n if (adjustOrdinalExtremesPoints && isBoosted) {\n ordinalPositions.pop();\n ordinalPositions.shift();\n }\n // Cache the length\n len = ordinalPositions.length;\n // Check if we really need the overhead of mapping axis data\n // against the ordinal positions. If the series consist of\n // evenly spaced data any way, we don't need any ordinal logic.\n if (len > 2) { // Two points have equal distance by default\n dist = ordinalPositions[1] - ordinalPositions[0];\n i = len - 1;\n while (i-- && !useOrdinal) {\n if (ordinalPositions[i + 1] - ordinalPositions[i] !==\n dist) {\n useOrdinal = true;\n }\n }\n // When zooming in on a week, prevent axis padding for\n // weekends even though the data within the week is evenly\n // spaced.\n if (!axis.options.keepOrdinalPadding &&\n (ordinalPositions[0] - min > dist ||\n (max -\n ordinalPositions[ordinalPositions.length - 1]) > dist)) {\n useOrdinal = true;\n }\n }\n else if (axis.options.overscroll) {\n if (len === 2) {\n // Exactly two points, distance for overscroll is fixed:\n overscrollPointsRange =\n ordinalPositions[1] - ordinalPositions[0];\n }\n else if (len === 1) {\n // We have just one point, closest distance is unknown.\n // Assume then it is last point and overscrolled range:\n overscrollPointsRange = axis.ordinal.convertOverscroll(axis.options.overscroll);\n ordinalPositions = [\n ordinalPositions[0],\n ordinalPositions[0] + overscrollPointsRange\n ];\n }\n else {\n // In case of zooming in on overscrolled range, stick to\n // the old range:\n overscrollPointsRange = ordinal.overscrollPointsRange;\n }\n }\n // Record the slope and offset to compute the linear values from\n // the array index. Since the ordinal positions may exceed the\n // current range, get the start and end positions within it\n // (#719, #665b)\n if (useOrdinal || axis.forceOrdinal) {\n if (axis.options.overscroll) {\n ordinal.overscrollPointsRange = overscrollPointsRange;\n ordinalPositions = ordinalPositions.concat(ordinal.getOverscrollPositions());\n }\n // Register\n ordinal.positions = ordinalPositions;\n // This relies on the ordinalPositions being set. Use\n // Math.max and Math.min to prevent padding on either sides\n // of the data.\n minIndex = axis.ordinal2lin(// #5979\n Math.max(min, ordinalPositions[0]), true);\n maxIndex = Math.max(axis.ordinal2lin(Math.min(max, ordinalPositions[ordinalPositions.length - 1]), true), 1); // #3339\n // Set the slope and offset of the values compared to the\n // indices in the ordinal positions.\n ordinal.slope = slope =\n (max - min) / (maxIndex - minIndex);\n ordinal.offset = min - (minIndex * slope);\n }\n else {\n ordinal.overscrollPointsRange = OrdinalAxis_pick(axis.closestPointRange, ordinal.overscrollPointsRange);\n ordinal.positions = axis.ordinal.slope = ordinal.offset =\n void 0;\n }\n }\n axis.isOrdinal = isOrdinal && useOrdinal; // #3818, #4196, #4926\n ordinal.groupIntervalFactor = null; // Reset for next run\n }\n /**\n * Faster way of using the Array.indexOf method.\n * Works for sorted arrays only with unique values.\n *\n * @param {Array} sortedArray\n * The sorted array inside which we are looking for.\n * @param {number} key\n * The key to being found.\n * @param {boolean} indirectSearch\n * In case of lack of the point in the array, should return\n * value be equal to -1 or the closest smaller index.\n * @private\n */\n static findIndexOf(sortedArray, key, indirectSearch) {\n let start = 0, end = sortedArray.length - 1, middle;\n while (start < end) {\n middle = Math.ceil((start + end) / 2);\n // Key found as the middle element.\n if (sortedArray[middle] <= key) {\n // Continue searching to the right.\n start = middle;\n }\n else {\n // Continue searching to the left.\n end = middle - 1;\n }\n }\n if (sortedArray[start] === key) {\n return start;\n }\n // Key could not be found.\n return !indirectSearch ? -1 : start;\n }\n /**\n * Get the ordinal positions for the entire data set. This is necessary\n * in chart panning because we need to find out what points or data\n * groups are available outside the visible range. When a panning\n * operation starts, if an index for the given grouping does not exists,\n * it is created and cached. This index is deleted on updated data, so\n * it will be regenerated the next time a panning operation starts.\n * @private\n */\n getExtendedPositions(withOverscroll = true) {\n const ordinal = this, axis = ordinal.axis, axisProto = axis.constructor.prototype, chart = axis.chart, key = axis.series.reduce((k, series) => {\n const grouping = series.currentDataGrouping;\n return (k +\n (grouping ? grouping.count + grouping.unitName : 'raw'));\n }, ''), overscroll = withOverscroll ?\n axis.ordinal.convertOverscroll(axis.options.overscroll) : 0, extremes = axis.getExtremes();\n let fakeAxis, fakeSeries = void 0, ordinalIndex = ordinal.index;\n // If this is the first time, or the ordinal index is deleted by\n // updatedData,\n // create it.\n if (!ordinalIndex) {\n ordinalIndex = ordinal.index = {};\n }\n if (!ordinalIndex[key]) {\n // Create a fake axis object where the extended ordinal\n // positions are emulated\n fakeAxis = {\n series: [],\n chart: chart,\n forceOrdinal: false,\n getExtremes: function () {\n return {\n min: extremes.dataMin,\n max: extremes.dataMax + overscroll\n };\n },\n applyGrouping: axisProto.applyGrouping,\n getGroupPixelWidth: axisProto.getGroupPixelWidth,\n getTimeTicks: axisProto.getTimeTicks,\n options: {\n ordinal: true\n },\n ordinal: {\n getGroupIntervalFactor: this.getGroupIntervalFactor\n },\n ordinal2lin: axisProto.ordinal2lin, // #6276\n getIndexOfPoint: axisProto.getIndexOfPoint,\n val2lin: axisProto.val2lin // #2590\n };\n fakeAxis.ordinal.axis = fakeAxis;\n // Add the fake series to hold the full data, then apply\n // processData to it\n axis.series.forEach((series) => {\n fakeSeries = {\n xAxis: fakeAxis,\n chart: chart,\n groupPixelWidth: series.groupPixelWidth,\n destroyGroupedData: Core_Globals.noop,\n getColumn: series.getColumn,\n applyGrouping: series.applyGrouping,\n getProcessedData: series.getProcessedData,\n reserveSpace: series.reserveSpace,\n visible: series.visible\n };\n const xData = series.getColumn('x').concat(withOverscroll ?\n ordinal.getOverscrollPositions() :\n []);\n fakeSeries.dataTable = new Data_DataTableCore({\n columns: {\n x: xData\n }\n });\n fakeSeries.options = {\n ...series.options,\n dataGrouping: series.currentDataGrouping ? {\n firstAnchor: series.options.dataGrouping?.firstAnchor,\n anchor: series.options.dataGrouping?.anchor,\n lastAnchor: series.options.dataGrouping?.firstAnchor,\n enabled: true,\n forced: true,\n approximation: 'open',\n units: [[\n series.currentDataGrouping.unitName,\n [series.currentDataGrouping.count]\n ]]\n } : {\n enabled: false\n }\n };\n fakeAxis.series.push(fakeSeries);\n series.processData.apply(fakeSeries);\n });\n fakeAxis.applyGrouping({ hasExtremesChanged: true });\n // Force to use the ordinal when points are evenly spaced (e.g.\n // weeks), #3825.\n if ((fakeSeries?.closestPointRange !==\n fakeSeries?.basePointRange) &&\n fakeSeries.currentDataGrouping) {\n fakeAxis.forceOrdinal = true;\n }\n // Run beforeSetTickPositions to compute the ordinalPositions\n axis.ordinal.beforeSetTickPositions.apply({ axis: fakeAxis });\n if (!axis.ordinal.originalOrdinalRange &&\n fakeAxis.ordinal.originalOrdinalRange) {\n axis.ordinal.originalOrdinalRange =\n fakeAxis.ordinal.originalOrdinalRange;\n }\n // Cache it\n if (fakeAxis.ordinal.positions) {\n ordinalIndex[key] = fakeAxis.ordinal.positions;\n }\n }\n return ordinalIndex[key];\n }\n /**\n * Find the factor to estimate how wide the plot area would have been if\n * ordinal gaps were included. This value is used to compute an imagined\n * plot width in order to establish the data grouping interval.\n *\n * A real world case is the intraday-candlestick example. Without this\n * logic, it would show the correct data grouping when viewing a range\n * within each day, but once moving the range to include the gap between\n * two days, the interval would include the cut-away night hours and the\n * data grouping would be wrong. So the below method tries to compensate\n * by identifying the most common point interval, in this case days.\n *\n * An opposite case is presented in issue #718. We have a long array of\n * daily data, then one point is appended one hour after the last point.\n * We expect the data grouping not to change.\n *\n * In the future, if we find cases where this estimation doesn't work\n * optimally, we might need to add a second pass to the data grouping\n * logic, where we do another run with a greater interval if the number\n * of data groups is more than a certain fraction of the desired group\n * count.\n * @private\n */\n getGroupIntervalFactor(xMin, xMax, series) {\n const ordinal = this, processedXData = series.getColumn('x', true), len = processedXData.length, distances = [];\n let median, i, groupIntervalFactor = ordinal.groupIntervalFactor;\n // Only do this computation for the first series, let the other\n // inherit it (#2416)\n if (!groupIntervalFactor) {\n // Register all the distances in an array\n for (i = 0; i < len - 1; i++) {\n distances[i] = (processedXData[i + 1] -\n processedXData[i]);\n }\n // Sort them and find the median\n distances.sort(function (a, b) {\n return a - b;\n });\n median = distances[Math.floor(len / 2)];\n // Compensate for series that don't extend through the entire\n // axis extent. #1675.\n xMin = Math.max(xMin, processedXData[0]);\n xMax = Math.min(xMax, processedXData[len - 1]);\n ordinal.groupIntervalFactor = groupIntervalFactor =\n (len * median) / (xMax - xMin);\n }\n // Return the factor needed for data grouping\n return groupIntervalFactor;\n }\n /**\n * Get index of point inside the ordinal positions array.\n *\n * @private\n * @param {number} pixelVal\n * The pixel value of a point.\n *\n * @param {Array} [ordinalArray]\n * An array of all points available on the axis for the given data set.\n * Either ordinalPositions if the value is inside the plotArea or\n * extendedOrdinalPositions if not.\n */\n getIndexOfPoint(pixelVal, ordinalArray) {\n const ordinal = this, axis = ordinal.axis, min = axis.min, minX = axis.minPixelPadding, indexOfMin = getIndexInArray(ordinalArray, min);\n const ordinalPointPixelInterval = axis.translationSlope *\n (ordinal.slope ||\n axis.closestPointRange ||\n ordinal.overscrollPointsRange);\n const shiftIndex = OrdinalAxis_correctFloat((pixelVal - minX) / ordinalPointPixelInterval);\n return indexOfMin + shiftIndex;\n }\n /**\n * Get ticks for an ordinal axis within a range where points don't\n * exist. It is required when overscroll is enabled. We can't base on\n * points, because we may not have any, so we use approximated\n * pointRange and generate these ticks between Axis.dataMax,\n * Axis.dataMax + Axis.overscroll evenly spaced. Used in panning and\n * navigator scrolling.\n * @private\n */\n getOverscrollPositions() {\n const ordinal = this, axis = ordinal.axis, extraRange = ordinal.convertOverscroll(axis.options.overscroll), distance = ordinal.overscrollPointsRange, positions = [];\n let max = axis.dataMax;\n if (OrdinalAxis_defined(distance)) {\n // Max + pointRange because we need to scroll to the last\n while (max < axis.dataMax + extraRange) {\n max += distance;\n positions.push(max);\n }\n }\n return positions;\n }\n /**\n * Make the tick intervals closer because the ordinal gaps make the\n * ticks spread out or cluster.\n * @private\n */\n postProcessTickInterval(tickInterval) {\n // Problem: https://jsfiddle.net/highcharts/FQm4E/1/. This is a case\n // where this algorithm doesn't work optimally. In this case, the\n // tick labels are spread out per week, but all the gaps reside\n // within weeks. So we have a situation where the labels are courser\n // than the ordinal gaps, and thus the tick interval should not be\n // altered.\n const ordinal = this, axis = ordinal.axis, ordinalSlope = ordinal.slope, closestPointRange = axis.closestPointRange;\n let ret;\n if (ordinalSlope && closestPointRange) {\n if (!axis.options.breaks) {\n ret = (tickInterval /\n (ordinalSlope / closestPointRange));\n }\n else {\n ret = closestPointRange || tickInterval; // #7275\n }\n }\n else {\n ret = tickInterval;\n }\n return ret;\n }\n /**\n * If overscroll is pixel or pecentage value, convert it to axis range.\n *\n * @private\n * @param {number | string} overscroll\n * Overscroll value in axis range, pixels or percentage value.\n * @return {number}\n * Overscroll value in axis range.\n */\n convertOverscroll(overscroll = 0) {\n const ordinal = this, axis = ordinal.axis, calculateOverscroll = function (overscrollPercentage) {\n return OrdinalAxis_pick(ordinal.originalOrdinalRange, OrdinalAxis_defined(axis.dataMax) && OrdinalAxis_defined(axis.dataMin) ?\n axis.dataMax - axis.dataMin : 0) * overscrollPercentage;\n };\n if (OrdinalAxis_isString(overscroll)) {\n const overscrollValue = parseInt(overscroll, 10);\n if (/%$/.test(overscroll)) {\n // If overscroll is percentage\n return calculateOverscroll(overscrollValue / 100);\n }\n if (/px/.test(overscroll)) {\n // If overscroll is pixels, it is limited to 90% of the axis\n // length to prevent division by zero\n const limitedOverscrollValue = Math.min(overscrollValue, axis.len * 0.9), pixelToPercent = limitedOverscrollValue / axis.len;\n return calculateOverscroll(pixelToPercent / (1 - pixelToPercent));\n }\n // If overscroll is a string but not pixels or percentage,\n // return 0 as no overscroll\n return 0;\n }\n return overscroll;\n }\n }\n OrdinalAxis.Additions = Additions;\n})(OrdinalAxis || (OrdinalAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_OrdinalAxis = (OrdinalAxis);\n\n;// ./code/es-modules/Stock/RangeSelector/RangeSelectorDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Declarations\n *\n * */\n/**\n * An object containing language-related strings and settings. A typical setup\n * uses `Highcharts.setOptions` to make the options apply to all charts in the\n * same page.\n *\n * ```js\n * Highcharts.setOptions({\n * lang: {\n * locale: 'fr'\n * }\n * });\n * ```\n *\n * @optionparent lang\n */\nconst lang = {\n /**\n * The text for the label for the range selector buttons.\n *\n * @product highstock gantt\n */\n rangeSelectorZoom: 'Zoom',\n /**\n * The text for the label for the \"from\" input box in the range\n * selector. Since v9.0, this string is empty as the label is not\n * rendered by default.\n *\n * @product highstock gantt\n */\n rangeSelectorFrom: '',\n /**\n * The text for the label for the \"to\" input box in the range selector.\n *\n * @product highstock gantt\n */\n rangeSelectorTo: '→'\n};\n/**\n * The range selector is a tool for selecting ranges to display within\n * the chart. It provides buttons to select preconfigured ranges in\n * the chart, like 1 day, 1 week, 1 month etc. It also provides input\n * boxes where min and max dates can be manually input.\n *\n * @product highstock gantt\n * @optionparent rangeSelector\n */\nconst rangeSelector = {\n /**\n * Whether to enable all buttons from the start. By default buttons are\n * only enabled if the corresponding time range exists on the X axis,\n * but enabling all buttons allows for dynamically loading different\n * time ranges.\n *\n * @sample {highstock} stock/rangeselector/allbuttonsenabled-true/\n * All buttons enabled\n *\n * @since 2.0.3\n */\n allButtonsEnabled: false,\n /**\n * An array of configuration objects for the buttons.\n *\n * Defaults to:\n * ```js\n * buttons: [{\n * type: 'month',\n * count: 1,\n * text: '1m',\n * title: 'View 1 month'\n * }, {\n * type: 'month',\n * count: 3,\n * text: '3m',\n * title: 'View 3 months'\n * }, {\n * type: 'month',\n * count: 6,\n * text: '6m',\n * title: 'View 6 months'\n * }, {\n * type: 'ytd',\n * text: 'YTD',\n * title: 'View year to date'\n * }, {\n * type: 'year',\n * count: 1,\n * text: '1y',\n * title: 'View 1 year'\n * }, {\n * type: 'all',\n * text: 'All',\n * title: 'View all'\n * }]\n * ```\n *\n * @sample {highstock} stock/demo/rangeselector-datagrouping/\n * Data grouping by buttons\n *\n * @type {Array<*>}\n */\n buttons: [{\n type: 'month',\n count: 1,\n text: '1m',\n title: 'View 1 month'\n }, {\n type: 'month',\n count: 3,\n text: '3m',\n title: 'View 3 months'\n }, {\n type: 'month',\n count: 6,\n text: '6m',\n title: 'View 6 months'\n }, {\n type: 'ytd',\n text: 'YTD',\n title: 'View year to date'\n }, {\n type: 'year',\n count: 1,\n text: '1y',\n title: 'View 1 year'\n }, {\n type: 'all',\n text: 'All',\n title: 'View all'\n }],\n /**\n * How many units of the defined type the button should span. If `type`\n * is \"month\" and `count` is 3, the button spans three months.\n *\n * @type {number}\n * @default 1\n * @apioption rangeSelector.buttons.count\n */\n /**\n * Fires when clicking on the rangeSelector button. One parameter,\n * event, is passed to the function, containing common event\n * information.\n *\n * ```js\n * click: function(e) {\n * console.log(this);\n * }\n * ```\n *\n * Return false to stop default button's click action.\n *\n * @sample {highstock} stock/rangeselector/button-click/\n * Click event on the button\n *\n * @type {Highcharts.RangeSelectorClickCallbackFunction}\n * @apioption rangeSelector.buttons.events.click\n */\n /**\n * Additional range (in milliseconds) added to the end of the calculated\n * time span.\n *\n * @sample {highstock} stock/rangeselector/min-max-offsets/\n * Button offsets\n *\n * @type {number}\n * @default 0\n * @since 6.0.0\n * @apioption rangeSelector.buttons.offsetMax\n */\n /**\n * Additional range (in milliseconds) added to the start of the\n * calculated time span.\n *\n * @sample {highstock} stock/rangeselector/min-max-offsets/\n * Button offsets\n *\n * @type {number}\n * @default 0\n * @since 6.0.0\n * @apioption rangeSelector.buttons.offsetMin\n */\n /**\n * When buttons apply dataGrouping on a series, by default zooming\n * in/out will deselect buttons and unset dataGrouping. Enable this\n * option to keep buttons selected when extremes change.\n *\n * @sample {highstock} stock/rangeselector/preserve-datagrouping/\n * Different preserveDataGrouping settings\n *\n * @type {boolean}\n * @default false\n * @since 6.1.2\n * @apioption rangeSelector.buttons.preserveDataGrouping\n */\n /**\n * A custom data grouping object for each button.\n *\n * @see [series.dataGrouping](#plotOptions.series.dataGrouping)\n *\n * @sample {highstock} stock/demo/rangeselector-datagrouping/\n * Data grouping by range selector buttons\n *\n * @type {*}\n * @extends plotOptions.series.dataGrouping\n * @apioption rangeSelector.buttons.dataGrouping\n */\n /**\n * The text for the button itself.\n *\n * @type {string}\n * @apioption rangeSelector.buttons.text\n */\n /**\n * Explanation for the button, shown as a tooltip on hover, and used by\n * assistive technology.\n *\n * @type {string}\n * @apioption rangeSelector.buttons.title\n */\n /**\n * Defined the time span for the button. Can be one of `millisecond`,\n * `second`, `minute`, `hour`, `day`, `week`, `month`, `year`, `ytd`,\n * and `all`.\n *\n * @type {Highcharts.RangeSelectorButtonTypeValue}\n * @apioption rangeSelector.buttons.type\n */\n /**\n * The space in pixels between the buttons in the range selector.\n */\n buttonSpacing: 5,\n /**\n * Whether to collapse the range selector buttons into a dropdown when\n * there is not enough room to show everything in a single row, instead\n * of dividing the range selector into multiple rows.\n * Can be one of the following:\n * - `always`: Always collapse\n * - `responsive`: Only collapse when there is not enough room\n * - `never`: Never collapse\n *\n * @sample {highstock} stock/rangeselector/dropdown/\n * Dropdown option\n *\n * @validvalue [\"always\", \"responsive\", \"never\"]\n * @since 9.0.0\n */\n dropdown: 'responsive',\n /**\n * Enable or disable the range selector. Default to `true` for stock\n * charts, using the `stockChart` factory.\n *\n * @sample {highstock} stock/rangeselector/enabled/\n * Disable the range selector\n *\n * @type {boolean|undefined}\n * @default {highstock} true\n */\n enabled: void 0,\n /**\n * The vertical alignment of the rangeselector box. Allowed properties\n * are `top`, `middle`, `bottom`.\n *\n * @sample {highstock} stock/rangeselector/vertical-align-middle/\n * Middle\n * @sample {highstock} stock/rangeselector/vertical-align-bottom/\n * Bottom\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 6.0.0\n */\n verticalAlign: 'top',\n /**\n * A collection of attributes for the buttons. The object takes SVG\n * attributes like `fill`, `stroke`, `stroke-width`, as well as `style`,\n * a collection of CSS properties for the text.\n *\n * The object can also be extended with states, so you can set\n * presentational options for `hover`, `select` or `disabled` button\n * states.\n *\n * CSS styles for the text label.\n *\n * In styled mode, the buttons are styled by the\n * `.highcharts-range-selector-buttons .highcharts-button` rule with its\n * different states.\n *\n * @sample {highstock} stock/rangeselector/styling/\n * Styling the buttons and inputs\n *\n * @type {Highcharts.SVGAttributes}\n */\n buttonTheme: {\n /** @ignore */\n width: 28,\n /** @ignore */\n height: 18,\n /** @ignore */\n padding: 2,\n /** @ignore */\n zIndex: 7 // #484, #852\n },\n /**\n * When the rangeselector is floating, the plot area does not reserve\n * space for it. This opens for positioning anywhere on the chart.\n *\n * @sample {highstock} stock/rangeselector/floating/\n * Placing the range selector between the plot area and the\n * navigator\n *\n * @since 6.0.0\n */\n floating: false,\n /**\n * The x offset of the range selector relative to its horizontal\n * alignment within `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @since 6.0.0\n */\n x: 0,\n /**\n * The y offset of the range selector relative to its horizontal\n * alignment within `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @since 6.0.0\n */\n y: 0,\n /**\n * Deprecated. The height of the range selector. Currently it is\n * calculated dynamically.\n *\n * @deprecated\n * @type {number|undefined}\n * @since 2.1.9\n */\n height: void 0, // Reserved space for buttons and input\n /**\n * The border color of the date input boxes.\n *\n * @sample {highstock} stock/rangeselector/styling/\n * Styling the buttons and inputs\n *\n * @type {Highcharts.ColorString}\n * @since 1.3.7\n */\n inputBoxBorderColor: 'none',\n /**\n * The pixel height of the date input boxes.\n *\n * @sample {highstock} stock/rangeselector/styling/\n * Styling the buttons and inputs\n *\n * @since 1.3.7\n */\n inputBoxHeight: 17,\n /**\n * The pixel width of the date input boxes. When `undefined`, the width\n * is fitted to the rendered content.\n *\n * @sample {highstock} stock/rangeselector/styling/\n * Styling the buttons and inputs\n *\n * @type {number|undefined}\n * @since 1.3.7\n */\n inputBoxWidth: void 0,\n /**\n * The date format in the input boxes when not selected for editing.\n * Defaults to `%e %b %Y`.\n *\n * This is used to determine which type of input to show,\n * `datetime-local`, `date` or `time` and falling back to `text` when\n * the browser does not support the input type or the format contains\n * milliseconds.\n *\n * @sample {highstock} stock/rangeselector/input-type/\n * Input types\n * @sample {highstock} stock/rangeselector/input-format/\n * Milliseconds in the range selector\n *\n */\n inputDateFormat: '%[ebY]',\n /**\n * A custom callback function to parse values entered in the input boxes and\n * return a valid JavaScript time as milliseconds since 1970. The first\n * argument passed is the value to parse, second is a boolean indicating use\n * of UTC time. The third is a reference to the `time` object. Time zone can\n * be read from `time.timezone`.\n *\n * This will only get called for inputs of type `text`. Since v8.2.3, the\n * input type is dynamically determined based on the granularity of the\n * `inputDateFormat` and the browser support.\n *\n * @sample {highstock} stock/rangeselector/input-format/\n * Milliseconds in the range selector\n *\n * @type {Highcharts.RangeSelectorParseCallbackFunction}\n * @since 1.3.3\n */\n inputDateParser: void 0,\n /**\n * The date format in the input boxes when they are selected for\n * editing. This must be a format that is recognized by JavaScript\n * Date.parse.\n *\n * This will only be used for inputs of type `text`. Since v8.2.3,\n * the input type is dynamically determined based on the granularity\n * of the `inputDateFormat` and the browser support.\n *\n * @sample {highstock} stock/rangeselector/input-format/\n * Milliseconds in the range selector\n *\n */\n inputEditDateFormat: '%Y-%m-%d',\n /**\n * Enable or disable the date input boxes.\n */\n inputEnabled: true,\n /**\n * Positioning for the input boxes. Allowed properties are `align`,\n * `x` and `y`.\n *\n * @since 1.2.4\n */\n inputPosition: {\n /**\n * The alignment of the input box. Allowed properties are `left`,\n * `center`, `right`.\n *\n * @sample {highstock} stock/rangeselector/input-button-opposite-alignment/\n * Opposite alignment\n *\n * @sample {highstock} stock/rangeselector/input-button-same-alignment/\n * Same alignment for buttons and input\n *\n * @type {Highcharts.AlignValue}\n * @since 6.0.0\n */\n align: 'right',\n /**\n * X offset of the input row.\n */\n x: 0,\n /**\n * Y offset of the input row.\n */\n y: 0\n },\n /**\n * The space in pixels between the labels and the date input boxes in\n * the range selector.\n *\n * @since 9.0.0\n */\n inputSpacing: 5,\n /**\n * The index of the button to appear pre-selected. If the selected range\n * exceeds the total data range and the 'all' option is available,\n * the 'all' option, showing the full range, is automatically selected.\n *\n * @type {number}\n */\n selected: void 0,\n /**\n * Positioning for the button row.\n *\n * @since 1.2.4\n */\n buttonPosition: {\n /**\n * The alignment of the input box. Allowed properties are `left`,\n * `center`, `right`.\n *\n * @sample {highstock} stock/rangeselector/input-button-opposite-alignment/\n * Opposite alignment\n *\n * @sample {highstock} stock/rangeselector/input-button-same-alignment/\n * Same alignment for buttons and input\n *\n * @type {Highcharts.AlignValue}\n * @since 6.0.0\n */\n align: 'left',\n /**\n * X offset of the button row.\n */\n x: 0,\n /**\n * Y offset of the button row.\n */\n y: 0\n },\n /**\n * CSS for the HTML inputs in the range selector.\n *\n * In styled mode, the inputs are styled by the\n * `.highcharts-range-input text` rule in SVG mode, and\n * `input.highcharts-range-selector` when active.\n *\n * @sample {highstock} stock/rangeselector/styling/\n * Styling the buttons and inputs\n *\n * @type {Highcharts.CSSObject}\n * @apioption rangeSelector.inputStyle\n */\n inputStyle: {\n /** @ignore */\n color: \"#334eff\" /* Palette.highlightColor80 */,\n /** @ignore */\n cursor: 'pointer',\n /** @ignore */\n fontSize: '0.8em'\n },\n /**\n * CSS styles for the labels - the Zoom, From and To texts.\n *\n * In styled mode, the labels are styled by the\n * `.highcharts-range-label` class.\n *\n * @sample {highstock} stock/rangeselector/styling/\n * Styling the buttons and inputs\n *\n * @type {Highcharts.CSSObject}\n */\n labelStyle: {\n /** @ignore */\n color: \"#666666\" /* Palette.neutralColor60 */,\n /** @ignore */\n fontSize: '0.8em'\n }\n};\n/* *\n *\n * Default Export\n *\n * */\nconst RangeSelectorDefaults = {\n lang,\n rangeSelector\n};\n/* harmony default export */ const RangeSelector_RangeSelectorDefaults = (RangeSelectorDefaults);\n\n;// ./code/es-modules/Stock/RangeSelector/RangeSelectorComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defaultOptions: RangeSelectorComposition_defaultOptions } = Defaults;\n\nconst { composed: RangeSelectorComposition_composed } = Core_Globals;\n\n\nconst { addEvent: RangeSelectorComposition_addEvent, defined: RangeSelectorComposition_defined, extend: RangeSelectorComposition_extend, isNumber: RangeSelectorComposition_isNumber, merge: RangeSelectorComposition_merge, pick: RangeSelectorComposition_pick, pushUnique: RangeSelectorComposition_pushUnique } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\nconst chartDestroyEvents = [];\n/* *\n *\n * Variables\n *\n * */\nlet RangeSelectorConstructor;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Get the axis min value based on the range option and the current max. For\n * stock charts this is extended via the {@link RangeSelector} so that if the\n * selected range is a multiple of months or years, it is compensated for\n * various month lengths.\n *\n * @private\n * @function Highcharts.Axis#minFromRange\n * @return {number|undefined}\n * The new minimum value.\n */\nfunction axisMinFromRange() {\n const rangeOptions = this.range, type = rangeOptions.type, max = this.max, time = this.chart.time, \n // Get the true range from a start date\n getTrueRange = function (base, count) {\n const original = time.toParts(base), modified = original.slice();\n if (type === 'year') {\n modified[0] += count;\n }\n else {\n modified[1] += count;\n }\n let d = time.makeTime.apply(time, modified);\n const numbers = time.toParts(d);\n // When subtracting a month still places us in the same month, like\n // subtracting one month from March 31 places us on February 31,\n // which translates to March 3 (#6537)\n if (type === 'month' &&\n original[1] === numbers[1] &&\n Math.abs(count) === 1) {\n modified[0] = original[0];\n modified[1] = original[1];\n // 0 is the last day of the previous month\n modified[2] = 0;\n }\n d = time.makeTime.apply(time, modified);\n return d - base;\n };\n let min, range;\n if (RangeSelectorComposition_isNumber(rangeOptions)) {\n min = max - rangeOptions;\n range = rangeOptions;\n }\n else if (rangeOptions) {\n min = max + getTrueRange(max, -(rangeOptions.count || 1));\n // Let the fixedRange reflect initial settings (#5930)\n if (this.chart) {\n this.chart.setFixedRange(max - min);\n }\n }\n const dataMin = RangeSelectorComposition_pick(this.dataMin, Number.MIN_VALUE);\n if (!RangeSelectorComposition_isNumber(min)) {\n min = dataMin;\n }\n if (min <= dataMin) {\n min = dataMin;\n if (typeof range === 'undefined') { // #4501\n range = getTrueRange(min, rangeOptions.count);\n }\n this.newMax = Math.min(min + range, RangeSelectorComposition_pick(this.dataMax, Number.MAX_VALUE));\n }\n if (!RangeSelectorComposition_isNumber(max)) {\n min = void 0;\n }\n else if (!RangeSelectorComposition_isNumber(rangeOptions) &&\n rangeOptions &&\n rangeOptions._offsetMin) {\n min += rangeOptions._offsetMin;\n }\n return min;\n}\n/**\n * @private\n */\nfunction updateRangeSelectorButtons() {\n this.rangeSelector?.redrawElements();\n}\n/**\n * @private\n */\nfunction RangeSelectorComposition_compose(AxisClass, ChartClass, RangeSelectorClass) {\n RangeSelectorConstructor = RangeSelectorClass;\n if (RangeSelectorComposition_pushUnique(RangeSelectorComposition_composed, 'RangeSelector')) {\n const chartProto = ChartClass.prototype;\n AxisClass.prototype.minFromRange = axisMinFromRange;\n RangeSelectorComposition_addEvent(ChartClass, 'afterGetContainer', createRangeSelector);\n RangeSelectorComposition_addEvent(ChartClass, 'beforeRender', RangeSelectorComposition_onChartBeforeRender);\n RangeSelectorComposition_addEvent(ChartClass, 'destroy', onChartDestroy);\n RangeSelectorComposition_addEvent(ChartClass, 'getMargins', onChartGetMargins);\n RangeSelectorComposition_addEvent(ChartClass, 'redraw', redrawRangeSelector);\n RangeSelectorComposition_addEvent(ChartClass, 'update', RangeSelectorComposition_onChartUpdate);\n RangeSelectorComposition_addEvent(ChartClass, 'beforeRedraw', updateRangeSelectorButtons);\n chartProto.callbacks.push(redrawRangeSelector);\n RangeSelectorComposition_extend(RangeSelectorComposition_defaultOptions, { rangeSelector: RangeSelector_RangeSelectorDefaults.rangeSelector });\n RangeSelectorComposition_extend(RangeSelectorComposition_defaultOptions.lang, RangeSelector_RangeSelectorDefaults.lang);\n }\n}\n/**\n * Initialize rangeselector for stock charts\n * @private\n */\nfunction createRangeSelector() {\n if (this.options.rangeSelector &&\n this.options.rangeSelector.enabled) {\n this.rangeSelector = new RangeSelectorConstructor(this);\n }\n}\n/**\n * @private\n */\nfunction RangeSelectorComposition_onChartBeforeRender() {\n const chart = this, rangeSelector = chart.rangeSelector;\n if (rangeSelector) {\n if (RangeSelectorComposition_isNumber(rangeSelector.deferredYTDClick)) {\n rangeSelector.clickButton(rangeSelector.deferredYTDClick);\n delete rangeSelector.deferredYTDClick;\n }\n const verticalAlign = rangeSelector.options.verticalAlign;\n if (!rangeSelector.options.floating) {\n if (verticalAlign === 'bottom') {\n this.extraBottomMargin = true;\n }\n else if (verticalAlign === 'top') {\n this.extraTopMargin = true;\n }\n }\n }\n}\nfunction redrawRangeSelector() {\n const chart = this;\n const rangeSelector = this.rangeSelector;\n if (!rangeSelector) {\n return;\n }\n let alignTo;\n const extremes = chart.xAxis[0].getExtremes();\n const legend = chart.legend;\n const verticalAlign = (rangeSelector &&\n rangeSelector.options.verticalAlign);\n if (RangeSelectorComposition_isNumber(extremes.min)) {\n rangeSelector.render(extremes.min, extremes.max);\n }\n // Re-align the legend so that it's below the rangeselector\n if (legend.display &&\n verticalAlign === 'top' &&\n verticalAlign === legend.options.verticalAlign) {\n // Create a new alignment box for the legend.\n alignTo = RangeSelectorComposition_merge(chart.spacingBox);\n if (legend.options.layout === 'vertical') {\n alignTo.y = chart.plotTop;\n }\n else {\n alignTo.y += rangeSelector.getHeight();\n }\n legend.group.placed = false; // Don't animate the alignment.\n legend.align(alignTo);\n }\n}\n/**\n * Remove resize/afterSetExtremes at chart destroy.\n * @private\n */\nfunction onChartDestroy() {\n for (let i = 0, iEnd = chartDestroyEvents.length; i < iEnd; ++i) {\n const events = chartDestroyEvents[i];\n if (events[0] === this) {\n events[1].forEach((unbind) => unbind());\n chartDestroyEvents.splice(i, 1);\n return;\n }\n }\n}\n/**\n *\n */\nfunction onChartGetMargins() {\n const rangeSelector = this.rangeSelector;\n if (rangeSelector?.options?.enabled) {\n const rangeSelectorHeight = rangeSelector.getHeight();\n const verticalAlign = rangeSelector.options.verticalAlign;\n if (!rangeSelector.options.floating) {\n if (verticalAlign === 'bottom') {\n this.marginBottom += rangeSelectorHeight;\n }\n else if (verticalAlign !== 'middle') {\n this.plotTop += rangeSelectorHeight;\n }\n }\n }\n}\n/**\n * @private\n */\nfunction RangeSelectorComposition_onChartUpdate(e) {\n const chart = this, options = e.options, optionsRangeSelector = options.rangeSelector, extraBottomMarginWas = this.extraBottomMargin, extraTopMarginWas = this.extraTopMargin;\n let rangeSelector = chart.rangeSelector;\n if (optionsRangeSelector &&\n optionsRangeSelector.enabled &&\n !RangeSelectorComposition_defined(rangeSelector) &&\n this.options.rangeSelector) {\n this.options.rangeSelector.enabled = true;\n this.rangeSelector = rangeSelector = new RangeSelectorConstructor(this);\n }\n this.extraBottomMargin = false;\n this.extraTopMargin = false;\n if (rangeSelector) {\n const verticalAlign = (optionsRangeSelector &&\n optionsRangeSelector.verticalAlign) || (rangeSelector.options && rangeSelector.options.verticalAlign);\n if (!rangeSelector.options.floating) {\n if (verticalAlign === 'bottom') {\n this.extraBottomMargin = true;\n }\n else if (verticalAlign !== 'middle') {\n this.extraTopMargin = true;\n }\n }\n if (this.extraBottomMargin !== extraBottomMarginWas ||\n this.extraTopMargin !== extraTopMarginWas) {\n this.isDirtyBox = true;\n }\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst RangeSelectorComposition = {\n compose: RangeSelectorComposition_compose\n};\n/* harmony default export */ const RangeSelector_RangeSelectorComposition = (RangeSelectorComposition);\n\n;// ./code/es-modules/Stock/RangeSelector/RangeSelector.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { defaultOptions: RangeSelector_defaultOptions } = Defaults;\n\n\n\n\n\nconst { addEvent: RangeSelector_addEvent, createElement: RangeSelector_createElement, css: RangeSelector_css, defined: RangeSelector_defined, destroyObjectProperties: RangeSelector_destroyObjectProperties, diffObjects: RangeSelector_diffObjects, discardElement: RangeSelector_discardElement, extend: RangeSelector_extend, fireEvent: RangeSelector_fireEvent, isNumber: RangeSelector_isNumber, isString: RangeSelector_isString, merge: RangeSelector_merge, objectEach: RangeSelector_objectEach, pick: RangeSelector_pick, splat: RangeSelector_splat } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Get the preferred input type based on a date format string.\n *\n * @private\n * @function preferredInputType\n */\nfunction preferredInputType(format) {\n const hasTimeKey = (char) => new RegExp(`%[[a-zA-Z]*${char}`).test(format);\n const ms = RangeSelector_isString(format) ?\n format.indexOf('%L') !== -1 :\n // Implemented but not typed as of 2024\n format.fractionalSecondDigits;\n if (ms) {\n return 'text';\n }\n const date = RangeSelector_isString(format) ?\n ['a', 'A', 'd', 'e', 'w', 'b', 'B', 'm', 'o', 'y', 'Y']\n .some(hasTimeKey) :\n format.dateStyle || format.day || format.month || format.year;\n const time = RangeSelector_isString(format) ?\n ['H', 'k', 'I', 'l', 'M', 'S'].some(hasTimeKey) :\n format.timeStyle || format.hour || format.minute || format.second;\n if (date && time) {\n return 'datetime-local';\n }\n if (date) {\n return 'date';\n }\n if (time) {\n return 'time';\n }\n return 'text';\n}\n/* *\n *\n * Class\n *\n * */\n/**\n * The range selector.\n *\n * @private\n * @class\n * @name Highcharts.RangeSelector\n * @param {Highcharts.Chart} chart\n */\nclass RangeSelector {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * @private\n */\n static compose(AxisClass, ChartClass) {\n RangeSelector_RangeSelectorComposition.compose(AxisClass, ChartClass, RangeSelector);\n }\n /* *\n *\n * Constructor\n *\n * */\n constructor(chart) {\n this.isDirty = false;\n this.buttonOptions = RangeSelector.prototype.defaultButtons;\n this.initialButtonGroupWidth = 0;\n this.maxButtonWidth = () => {\n let buttonWidth = 0;\n this.buttons.forEach((button) => {\n const bBox = button.getBBox();\n if (bBox.width > buttonWidth) {\n buttonWidth = bBox.width;\n }\n });\n return buttonWidth;\n };\n this.init(chart);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * The method to run when one of the buttons in the range selectors is\n * clicked\n *\n * @private\n * @function Highcharts.RangeSelector#clickButton\n * @param {number} i\n * The index of the button\n * @param {boolean} [redraw]\n */\n clickButton(i, redraw) {\n const rangeSelector = this, chart = rangeSelector.chart, rangeOptions = rangeSelector.buttonOptions[i], baseAxis = chart.xAxis[0], unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis || {}, type = rangeOptions.type, dataGrouping = rangeOptions.dataGrouping;\n let dataMin = unionExtremes.dataMin, dataMax = unionExtremes.dataMax, newMin, newMax = RangeSelector_isNumber(baseAxis?.max) ? Math.round(Math.min(baseAxis.max, dataMax ?? baseAxis.max)) : void 0, // #1568\n baseXAxisOptions, range = rangeOptions._range, rangeMin, ctx, ytdExtremes, addOffsetMin = true;\n // Chart has no data, base series is removed\n if (dataMin === null || dataMax === null) {\n return;\n }\n rangeSelector.setSelected(i);\n // Apply dataGrouping associated to button\n if (dataGrouping) {\n this.forcedDataGrouping = true;\n Axis_Axis.prototype.setDataGrouping.call(baseAxis || { chart: this.chart }, dataGrouping, false);\n this.frozenStates = rangeOptions.preserveDataGrouping;\n }\n // Apply range\n if (type === 'month' || type === 'year') {\n if (!baseAxis) {\n // This is set to the user options and picked up later when the\n // axis is instantiated so that we know the min and max.\n range = rangeOptions;\n }\n else {\n ctx = {\n range: rangeOptions,\n max: newMax,\n chart: chart,\n dataMin: dataMin,\n dataMax: dataMax\n };\n newMin = baseAxis.minFromRange.call(ctx);\n if (RangeSelector_isNumber(ctx.newMax)) {\n newMax = ctx.newMax;\n }\n // #15799: offsetMin is added in minFromRange so that it works\n // with pre-selected buttons as well\n addOffsetMin = false;\n }\n // Fixed times like minutes, hours, days\n }\n else if (range) {\n if (RangeSelector_isNumber(newMax)) {\n newMin = Math.max(newMax - range, dataMin);\n newMax = Math.min(newMin + range, dataMax);\n addOffsetMin = false;\n }\n }\n else if (type === 'ytd') {\n // On user clicks on the buttons, or a delayed action running from\n // the beforeRender event (below), the baseAxis is defined.\n if (baseAxis) {\n // When \"ytd\" is the pre-selected button for the initial view,\n // its calculation is delayed and rerun in the beforeRender\n // event (below). When the series are initialized, but before\n // the chart is rendered, we have access to the xData array\n // (#942).\n if (baseAxis.hasData() && (!RangeSelector_isNumber(dataMax) ||\n !RangeSelector_isNumber(dataMin))) {\n dataMin = Number.MAX_VALUE;\n dataMax = -Number.MAX_VALUE;\n chart.series.forEach((series) => {\n // Reassign it to the last item\n const xData = series.getColumn('x');\n if (xData.length) {\n dataMin = Math.min(xData[0], dataMin);\n dataMax = Math.max(xData[xData.length - 1], dataMax);\n }\n });\n redraw = false;\n }\n if (RangeSelector_isNumber(dataMax) && RangeSelector_isNumber(dataMin)) {\n ytdExtremes = rangeSelector.getYTDExtremes(dataMax, dataMin);\n newMin = rangeMin = ytdExtremes.min;\n newMax = ytdExtremes.max;\n }\n // \"ytd\" is pre-selected. We don't yet have access to processed\n // point and extremes data (things like pointStart and pointInterval\n // are missing), so we delay the process (#942)\n }\n else {\n rangeSelector.deferredYTDClick = i;\n return;\n }\n }\n else if (type === 'all' && baseAxis) {\n // If the navigator exist and the axis range is declared reset that\n // range and from now on only use the range set by a user, #14742.\n if (chart.navigator && chart.navigator.baseSeries[0]) {\n chart.navigator.baseSeries[0].xAxis.options.range = void 0;\n }\n newMin = dataMin;\n newMax = dataMax;\n }\n if (addOffsetMin && rangeOptions._offsetMin && RangeSelector_defined(newMin)) {\n newMin += rangeOptions._offsetMin;\n }\n if (rangeOptions._offsetMax && RangeSelector_defined(newMax)) {\n newMax += rangeOptions._offsetMax;\n }\n if (this.dropdown) {\n this.dropdown.selectedIndex = i + 1;\n }\n // Update the chart\n if (!baseAxis) {\n // Axis not yet instantiated. Temporarily set min and range\n // options and axes once defined and remove them on\n // chart load (#4317 & #20529).\n baseXAxisOptions = RangeSelector_splat(chart.options.xAxis || {})[0];\n const axisRangeUpdateEvent = RangeSelector_addEvent(chart, 'afterCreateAxes', function () {\n const xAxis = chart.xAxis[0];\n xAxis.range = xAxis.options.range = range;\n xAxis.min = xAxis.options.min = rangeMin;\n });\n RangeSelector_addEvent(chart, 'load', function resetMinAndRange() {\n const xAxis = chart.xAxis[0];\n chart.setFixedRange(rangeOptions._range);\n xAxis.options.range = baseXAxisOptions.range;\n xAxis.options.min = baseXAxisOptions.min;\n axisRangeUpdateEvent(); // Remove event\n });\n }\n else if (RangeSelector_isNumber(newMin) && RangeSelector_isNumber(newMax)) {\n // Existing axis object. Set extremes after render time.\n baseAxis.setExtremes(newMin, newMax, RangeSelector_pick(redraw, true), void 0, // Auto animation\n {\n trigger: 'rangeSelectorButton',\n rangeSelectorButton: rangeOptions\n });\n chart.setFixedRange(rangeOptions._range);\n }\n RangeSelector_fireEvent(this, 'afterBtnClick');\n }\n /**\n * Set the selected option. This method only sets the internal flag, it\n * doesn't update the buttons or the actual zoomed range.\n *\n * @private\n * @function Highcharts.RangeSelector#setSelected\n * @param {number} [selected]\n */\n setSelected(selected) {\n this.selected = this.options.selected = selected;\n }\n /**\n * Initialize the range selector\n *\n * @private\n * @function Highcharts.RangeSelector#init\n * @param {Highcharts.Chart} chart\n */\n init(chart) {\n const rangeSelector = this, options = chart.options.rangeSelector, buttonOptions = options.buttons, selectedOption = options.selected, blurInputs = function () {\n const minInput = rangeSelector.minInput, maxInput = rangeSelector.maxInput;\n // #3274 in some case blur is not defined\n if (minInput && !!minInput.blur) {\n RangeSelector_fireEvent(minInput, 'blur');\n }\n if (maxInput && !!maxInput.blur) {\n RangeSelector_fireEvent(maxInput, 'blur');\n }\n };\n rangeSelector.chart = chart;\n rangeSelector.options = options;\n rangeSelector.buttons = [];\n rangeSelector.buttonOptions = buttonOptions;\n this.eventsToUnbind = [];\n this.eventsToUnbind.push(RangeSelector_addEvent(chart.container, 'mousedown', blurInputs));\n this.eventsToUnbind.push(RangeSelector_addEvent(chart, 'resize', blurInputs));\n // Extend the buttonOptions with actual range\n buttonOptions.forEach(rangeSelector.computeButtonRange);\n // Zoomed range based on a pre-selected button index\n if (typeof selectedOption !== 'undefined' &&\n buttonOptions[selectedOption]) {\n this.clickButton(selectedOption, false);\n }\n this.eventsToUnbind.push(RangeSelector_addEvent(chart, 'load', function () {\n // If a data grouping is applied to the current button, release it\n // when extremes change\n if (chart.xAxis && chart.xAxis[0]) {\n RangeSelector_addEvent(chart.xAxis[0], 'setExtremes', function (e) {\n if (RangeSelector_isNumber(this.max) &&\n RangeSelector_isNumber(this.min) &&\n this.max - this.min !== chart.fixedRange &&\n e.trigger !== 'rangeSelectorButton' &&\n e.trigger !== 'updatedData' &&\n rangeSelector.forcedDataGrouping &&\n !rangeSelector.frozenStates) {\n this.setDataGrouping(false, false);\n }\n });\n }\n }));\n this.createElements();\n }\n /**\n * Dynamically update the range selector buttons after a new range has been\n * set\n *\n * @private\n * @function Highcharts.RangeSelector#updateButtonStates\n */\n updateButtonStates() {\n const rangeSelector = this, chart = this.chart, dropdown = this.dropdown, dropdownLabel = this.dropdownLabel, baseAxis = chart.xAxis[0], actualRange = Math.round(baseAxis.max - baseAxis.min), hasNoData = !baseAxis.hasVisibleSeries, day = 24 * 36e5, // A single day in milliseconds\n unionExtremes = (chart.scroller &&\n chart.scroller.getUnionExtremes()) || baseAxis, dataMin = unionExtremes.dataMin, dataMax = unionExtremes.dataMax, ytdExtremes = rangeSelector.getYTDExtremes(dataMax, dataMin), ytdMin = ytdExtremes.min, ytdMax = ytdExtremes.max, selected = rangeSelector.selected, allButtonsEnabled = rangeSelector.options.allButtonsEnabled, buttonStates = new Array(rangeSelector.buttonOptions.length)\n .fill(0), selectedExists = RangeSelector_isNumber(selected), buttons = rangeSelector.buttons;\n let isSelectedTooGreat = false, selectedIndex = null;\n rangeSelector.buttonOptions.forEach((rangeOptions, i) => {\n const range = rangeOptions._range, type = rangeOptions.type, count = rangeOptions.count || 1, offsetRange = rangeOptions._offsetMax -\n rangeOptions._offsetMin, isSelected = i === selected, \n // Disable buttons where the range exceeds what is allowed i;\n // the current view\n isTooGreatRange = range >\n dataMax - dataMin, \n // Disable buttons where the range is smaller than the minimum\n // range\n isTooSmallRange = range < baseAxis.minRange;\n // Do not select the YTD button if not explicitly told so\n let isYTDButNotSelected = false, \n // Disable the All button if we're already showing all\n isSameRange = range === actualRange;\n if (isSelected && isTooGreatRange) {\n isSelectedTooGreat = true;\n }\n if (baseAxis.isOrdinal &&\n baseAxis.ordinal?.positions &&\n range &&\n actualRange < range) {\n // Handle ordinal ranges\n const positions = baseAxis.ordinal.positions, prevOrdinalPosition = Axis_OrdinalAxis.Additions.findIndexOf(positions, baseAxis.min, true), nextOrdinalPosition = Math.min(Axis_OrdinalAxis.Additions.findIndexOf(positions, baseAxis.max, true) + 1, positions.length - 1);\n if (positions[nextOrdinalPosition] -\n positions[prevOrdinalPosition] > range) {\n isSameRange = true;\n }\n }\n else if (\n // Months and years have variable range so we check the extremes\n (type === 'month' || type === 'year') &&\n (actualRange + 36e5 >=\n { month: 28, year: 365 }[type] * day * count - offsetRange) &&\n (actualRange - 36e5 <=\n { month: 31, year: 366 }[type] * day * count + offsetRange)) {\n isSameRange = true;\n }\n else if (type === 'ytd') {\n isSameRange = (ytdMax - ytdMin + offsetRange) === actualRange;\n isYTDButNotSelected = !isSelected;\n }\n else if (type === 'all') {\n isSameRange = (baseAxis.max - baseAxis.min >=\n dataMax - dataMin);\n }\n // The new zoom area happens to match the range for a button - mark\n // it selected. This happens when scrolling across an ordinal gap.\n // It can be seen in the intraday demos when selecting 1h and scroll\n // across the night gap.\n const disable = (!allButtonsEnabled &&\n !(isSelectedTooGreat && type === 'all') &&\n (isTooGreatRange ||\n isTooSmallRange ||\n hasNoData));\n const select = ((isSelectedTooGreat && type === 'all') ||\n (isYTDButNotSelected ? false : isSameRange) ||\n (isSelected && rangeSelector.frozenStates));\n if (disable) {\n buttonStates[i] = 3;\n }\n else if (select) {\n if (!selectedExists || i === selected) {\n selectedIndex = i;\n }\n }\n });\n if (selectedIndex !== null) {\n buttonStates[selectedIndex] = 2;\n rangeSelector.setSelected(selectedIndex);\n if (this.dropdown) {\n this.dropdown.selectedIndex = selectedIndex + 1;\n }\n }\n else {\n rangeSelector.setSelected();\n if (this.dropdown) {\n this.dropdown.selectedIndex = -1;\n }\n if (dropdownLabel) {\n dropdownLabel.setState(0);\n dropdownLabel.attr({\n text: (RangeSelector_defaultOptions.lang.rangeSelectorZoom || '') + ' ▾'\n });\n }\n }\n for (let i = 0; i < buttonStates.length; i++) {\n const state = buttonStates[i];\n const button = buttons[i];\n if (button.state !== state) {\n button.setState(state);\n if (dropdown) {\n dropdown.options[i + 1].disabled = (state === 3);\n if (state === 2) {\n if (dropdownLabel) {\n dropdownLabel.setState(2);\n dropdownLabel.attr({\n text: rangeSelector.buttonOptions[i].text + ' ▾'\n });\n }\n dropdown.selectedIndex = i + 1;\n }\n const bbox = dropdownLabel.getBBox();\n RangeSelector_css(dropdown, {\n width: `${bbox.width}px`,\n height: `${bbox.height}px`\n });\n }\n }\n }\n }\n /**\n * Compute and cache the range for an individual button\n *\n * @private\n * @function Highcharts.RangeSelector#computeButtonRange\n * @param {Highcharts.RangeSelectorButtonsOptions} rangeOptions\n */\n computeButtonRange(rangeOptions) {\n const type = rangeOptions.type, count = rangeOptions.count || 1, \n // These time intervals have a fixed number of milliseconds, as\n // opposed to month, ytd and year\n fixedTimes = {\n millisecond: 1,\n second: 1000,\n minute: 60 * 1000,\n hour: 3600 * 1000,\n day: 24 * 3600 * 1000,\n week: 7 * 24 * 3600 * 1000\n };\n // Store the range on the button object\n if (fixedTimes[type]) {\n rangeOptions._range = fixedTimes[type] * count;\n }\n else if (type === 'month' || type === 'year') {\n rangeOptions._range = {\n month: 30,\n year: 365\n }[type] * 24 * 36e5 * count;\n }\n rangeOptions._offsetMin = RangeSelector_pick(rangeOptions.offsetMin, 0);\n rangeOptions._offsetMax = RangeSelector_pick(rangeOptions.offsetMax, 0);\n rangeOptions._range +=\n rangeOptions._offsetMax - rangeOptions._offsetMin;\n }\n /**\n * Get the unix timestamp of a HTML input for the dates\n *\n * @private\n * @function Highcharts.RangeSelector#getInputValue\n */\n getInputValue(name) {\n const input = name === 'min' ? this.minInput : this.maxInput;\n const options = this.chart.options\n .rangeSelector;\n const time = this.chart.time;\n if (input) {\n return ((input.type === 'text' && options.inputDateParser) ||\n this.defaultInputDateParser)(input.value, time.timezone === 'UTC', time);\n }\n return 0;\n }\n /**\n * Set the internal and displayed value of a HTML input for the dates\n *\n * @private\n * @function Highcharts.RangeSelector#setInputValue\n */\n setInputValue(name, inputTime) {\n const options = this.options, time = this.chart.time, input = name === 'min' ? this.minInput : this.maxInput, dateBox = name === 'min' ? this.minDateBox : this.maxDateBox;\n if (input) {\n input.setAttribute('type', preferredInputType(options.inputDateFormat || '%e %b %Y'));\n const hcTimeAttr = input.getAttribute('data-hc-time');\n let updatedTime = RangeSelector_defined(hcTimeAttr) ? Number(hcTimeAttr) : void 0;\n if (RangeSelector_defined(inputTime)) {\n const previousTime = updatedTime;\n if (RangeSelector_defined(previousTime)) {\n input.setAttribute('data-hc-time-previous', previousTime);\n }\n input.setAttribute('data-hc-time', inputTime);\n updatedTime = inputTime;\n }\n input.value = time.dateFormat((this.inputTypeFormats[input.type] ||\n options.inputEditDateFormat), updatedTime);\n if (dateBox) {\n dateBox.attr({\n text: time.dateFormat(options.inputDateFormat, updatedTime)\n });\n }\n }\n }\n /**\n * Set the min and max value of a HTML input for the dates\n *\n * @private\n * @function Highcharts.RangeSelector#setInputExtremes\n */\n setInputExtremes(name, min, max) {\n const input = name === 'min' ? this.minInput : this.maxInput;\n if (input) {\n const format = this.inputTypeFormats[input.type];\n const time = this.chart.time;\n if (format) {\n const newMin = time.dateFormat(format, min);\n if (input.min !== newMin) {\n input.min = newMin;\n }\n const newMax = time.dateFormat(format, max);\n if (input.max !== newMax) {\n input.max = newMax;\n }\n }\n }\n }\n /**\n * @private\n * @function Highcharts.RangeSelector#showInput\n * @param {string} name\n */\n showInput(name) {\n const dateBox = name === 'min' ? this.minDateBox : this.maxDateBox, input = name === 'min' ? this.minInput : this.maxInput;\n if (input && dateBox && this.inputGroup) {\n const isTextInput = input.type === 'text', { translateX = 0, translateY = 0 } = this.inputGroup, { x = 0, width = 0, height = 0 } = dateBox, { inputBoxWidth } = this.options;\n RangeSelector_css(input, {\n width: isTextInput ?\n ((width + (inputBoxWidth ? -2 : 20)) + 'px') :\n 'auto',\n height: (height - 2) + 'px',\n border: '2px solid silver'\n });\n if (isTextInput && inputBoxWidth) {\n RangeSelector_css(input, {\n left: (translateX + x) + 'px',\n top: translateY + 'px'\n });\n // Inputs of types date, time or datetime-local should be centered\n // on top of the dateBox\n }\n else {\n RangeSelector_css(input, {\n left: Math.min(Math.round(x +\n translateX -\n (input.offsetWidth - width) / 2), this.chart.chartWidth - input.offsetWidth) + 'px',\n top: (translateY - (input.offsetHeight - height) / 2) + 'px'\n });\n }\n }\n }\n /**\n * @private\n * @function Highcharts.RangeSelector#hideInput\n * @param {string} name\n */\n hideInput(name) {\n const input = name === 'min' ? this.minInput : this.maxInput;\n if (input) {\n RangeSelector_css(input, {\n top: '-9999em',\n border: 0,\n width: '1px',\n height: '1px'\n });\n }\n }\n /**\n * @private\n * @function Highcharts.RangeSelector#defaultInputDateParser\n */\n defaultInputDateParser(inputDate, useUTC, time) {\n return time?.parse(inputDate) || 0;\n }\n /**\n * Draw either the 'from' or the 'to' HTML input box of the range selector\n *\n * @private\n * @function Highcharts.RangeSelector#drawInput\n */\n drawInput(name) {\n const { chart, div, inputGroup } = this;\n const rangeSelector = this, chartStyle = chart.renderer.style || {}, renderer = chart.renderer, options = chart.options.rangeSelector, lang = RangeSelector_defaultOptions.lang, isMin = name === 'min';\n /**\n * @private\n */\n function updateExtremes(name) {\n const { maxInput, minInput } = rangeSelector, chartAxis = chart.xAxis[0], unionExtremes = chart.scroller?.getUnionExtremes() || chartAxis, dataMin = unionExtremes.dataMin, dataMax = unionExtremes.dataMax, currentExtreme = chart.xAxis[0].getExtremes()[name];\n let value = rangeSelector.getInputValue(name);\n if (RangeSelector_isNumber(value) && value !== currentExtreme) {\n // Validate the extremes. If it goes beyond the data min or\n // max, use the actual data extreme (#2438).\n if (isMin && maxInput && RangeSelector_isNumber(dataMin)) {\n if (value > Number(maxInput.getAttribute('data-hc-time'))) {\n value = void 0;\n }\n else if (value < dataMin) {\n value = dataMin;\n }\n }\n else if (minInput && RangeSelector_isNumber(dataMax)) {\n if (value < Number(minInput.getAttribute('data-hc-time'))) {\n value = void 0;\n }\n else if (value > dataMax) {\n value = dataMax;\n }\n }\n // Set the extremes\n if (typeof value !== 'undefined') { // @todo typeof undefined\n chartAxis.setExtremes(isMin ? value : chartAxis.min, isMin ? chartAxis.max : value, void 0, void 0, { trigger: 'rangeSelectorInput' });\n }\n }\n }\n // Create the text label\n const text = lang[isMin ? 'rangeSelectorFrom' : 'rangeSelectorTo'] || '';\n const label = renderer\n .label(text, 0)\n .addClass('highcharts-range-label')\n .attr({\n padding: text ? 2 : 0,\n height: text ? options.inputBoxHeight : 0\n })\n .add(inputGroup);\n // Create an SVG label that shows updated date ranges and records click\n // events that bring in the HTML input.\n const dateBox = renderer\n .label('', 0)\n .addClass('highcharts-range-input')\n .attr({\n padding: 2,\n width: options.inputBoxWidth,\n height: options.inputBoxHeight,\n 'text-align': 'center'\n })\n .on('click', function () {\n // If it is already focused, the onfocus event doesn't fire\n // (#3713)\n rangeSelector.showInput(name);\n rangeSelector[name + 'Input'].focus();\n });\n if (!chart.styledMode) {\n dateBox.attr({\n stroke: options.inputBoxBorderColor,\n 'stroke-width': 1\n });\n }\n dateBox.add(inputGroup);\n // Create the HTML input element. This is rendered as 1x1 pixel then set\n // to the right size when focused.\n const input = RangeSelector_createElement('input', {\n name: name,\n className: 'highcharts-range-selector'\n }, void 0, div);\n // #14788: Setting input.type to an unsupported type throws in IE, so\n // we need to use setAttribute instead\n input.setAttribute('type', preferredInputType(options.inputDateFormat || '%e %b %Y'));\n if (!chart.styledMode) {\n // Styles\n label.css(RangeSelector_merge(chartStyle, options.labelStyle));\n dateBox.css(RangeSelector_merge({\n color: \"#333333\" /* Palette.neutralColor80 */\n }, chartStyle, options.inputStyle));\n RangeSelector_css(input, RangeSelector_extend({\n position: 'absolute',\n border: 0,\n boxShadow: '0 0 15px rgba(0,0,0,0.3)',\n width: '1px', // Chrome needs a pixel to see it\n height: '1px',\n padding: 0,\n textAlign: 'center',\n fontSize: chartStyle.fontSize,\n fontFamily: chartStyle.fontFamily,\n top: '-9999em' // #4798\n }, options.inputStyle));\n }\n // Blow up the input box\n input.onfocus = () => {\n rangeSelector.showInput(name);\n };\n // Hide away the input box\n input.onblur = () => {\n // Update extremes only when inputs are active\n if (input === Core_Globals.doc.activeElement) { // Only when focused\n // Update also when no `change` event is triggered, like when\n // clicking inside the SVG (#4710)\n updateExtremes(name);\n }\n // #10404 - move hide and blur outside focus\n rangeSelector.hideInput(name);\n rangeSelector.setInputValue(name);\n input.blur(); // #4606\n };\n let keyDown = false;\n // Handle changes in the input boxes\n input.onchange = () => {\n // Update extremes and blur input when clicking date input calendar\n if (!keyDown) {\n updateExtremes(name);\n rangeSelector.hideInput(name);\n input.blur();\n }\n };\n input.onkeypress = (event) => {\n // IE does not fire onchange on enter\n if (event.keyCode === 13) {\n updateExtremes(name);\n }\n };\n input.onkeydown = (event) => {\n keyDown = true;\n // Arrow keys\n if (event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'Tab') {\n updateExtremes(name);\n }\n };\n input.onkeyup = () => {\n keyDown = false;\n };\n return { dateBox, input, label };\n }\n /**\n * Get the position of the range selector buttons and inputs. This can be\n * overridden from outside for custom positioning.\n *\n * @private\n * @function Highcharts.RangeSelector#getPosition\n */\n getPosition() {\n const chart = this.chart, options = chart.options.rangeSelector, top = options.verticalAlign === 'top' ?\n chart.plotTop - chart.axisOffset[0] :\n 0; // Set offset only for verticalAlign top\n return {\n buttonTop: top + options.buttonPosition.y,\n inputTop: top + options.inputPosition.y - 10\n };\n }\n /**\n * Get the extremes of YTD. Will choose dataMax if its value is lower than\n * the current timestamp. Will choose dataMin if its value is higher than\n * the timestamp for the start of current year.\n *\n * @private\n * @function Highcharts.RangeSelector#getYTDExtremes\n * @return {*}\n * Returns min and max for the YTD\n */\n getYTDExtremes(dataMax, dataMin) {\n const time = this.chart.time, year = time.toParts(dataMax)[0], startOfYear = time.makeTime(year, 0);\n return {\n max: dataMax,\n min: Math.max(dataMin, startOfYear)\n };\n }\n createElements() {\n const chart = this.chart, renderer = chart.renderer, container = chart.container, chartOptions = chart.options, options = chartOptions.rangeSelector, inputEnabled = options.inputEnabled, inputsZIndex = RangeSelector_pick(chartOptions.chart.style?.zIndex, 0) + 1;\n if (options.enabled === false) {\n return;\n }\n this.group = renderer.g('range-selector-group')\n .attr({\n zIndex: 7\n })\n .add();\n this.div = RangeSelector_createElement('div', void 0, {\n position: 'relative',\n height: 0,\n zIndex: inputsZIndex\n });\n if (this.buttonOptions.length) {\n this.renderButtons();\n }\n // First create a wrapper outside the container in order to make\n // the inputs work and make export correct\n if (container.parentNode) {\n container.parentNode.insertBefore(this.div, container);\n }\n if (inputEnabled) {\n this.createInputs();\n }\n }\n /**\n * Create the input elements and its group.\n *\n */\n createInputs() {\n this.inputGroup = this.chart.renderer.g('input-group').add(this.group);\n const minElems = this.drawInput('min');\n this.minDateBox = minElems.dateBox;\n this.minLabel = minElems.label;\n this.minInput = minElems.input;\n const maxElems = this.drawInput('max');\n this.maxDateBox = maxElems.dateBox;\n this.maxLabel = maxElems.label;\n this.maxInput = maxElems.input;\n }\n /**\n * Render the range selector including the buttons and the inputs. The first\n * time render is called, the elements are created and positioned. On\n * subsequent calls, they are moved and updated.\n *\n * @private\n * @function Highcharts.RangeSelector#render\n * @param {number} [min]\n * X axis minimum\n * @param {number} [max]\n * X axis maximum\n */\n render(min, max) {\n if (this.options.enabled === false) {\n return;\n }\n const chart = this.chart, chartOptions = chart.options, options = chartOptions.rangeSelector, \n // Place inputs above the container\n inputEnabled = options.inputEnabled;\n if (inputEnabled) {\n if (!this.inputGroup) {\n this.createInputs();\n }\n // Set or reset the input values\n this.setInputValue('min', min);\n this.setInputValue('max', max);\n if (!this.chart.styledMode) {\n this.maxLabel?.css(options.labelStyle);\n this.minLabel?.css(options.labelStyle);\n }\n const unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || chart.xAxis[0] || {};\n if (RangeSelector_defined(unionExtremes.dataMin) &&\n RangeSelector_defined(unionExtremes.dataMax)) {\n const minRange = chart.xAxis[0].minRange || 0;\n this.setInputExtremes('min', unionExtremes.dataMin, Math.min(unionExtremes.dataMax, this.getInputValue('max')) - minRange);\n this.setInputExtremes('max', Math.max(unionExtremes.dataMin, this.getInputValue('min')) + minRange, unionExtremes.dataMax);\n }\n // Reflow\n if (this.inputGroup) {\n let x = 0;\n [\n this.minLabel,\n this.minDateBox,\n this.maxLabel,\n this.maxDateBox\n ].forEach((label) => {\n if (label) {\n const { width } = label.getBBox();\n if (width) {\n label.attr({ x });\n x += width + options.inputSpacing;\n }\n }\n });\n }\n }\n else {\n if (this.inputGroup) {\n this.inputGroup.destroy();\n delete this.inputGroup;\n }\n }\n if (!this.chart.styledMode) {\n if (this.zoomText) {\n this.zoomText.css(options.labelStyle);\n }\n }\n this.alignElements();\n this.updateButtonStates();\n }\n /**\n * Render the range buttons. This only runs the first time, later the\n * positioning is laid out in alignElements.\n *\n * @private\n * @function Highcharts.RangeSelector#renderButtons\n */\n renderButtons() {\n var _a;\n const { chart, options } = this;\n const lang = RangeSelector_defaultOptions.lang;\n const renderer = chart.renderer;\n const buttonTheme = RangeSelector_merge(options.buttonTheme);\n const states = buttonTheme && buttonTheme.states;\n // Prevent the button from resetting the width when the button state\n // changes since we need more control over the width when collapsing\n // the buttons\n delete buttonTheme.width;\n delete buttonTheme.states;\n this.buttonGroup = renderer.g('range-selector-buttons').add(this.group);\n const dropdown = this.dropdown = RangeSelector_createElement('select', void 0, {\n position: 'absolute',\n padding: 0,\n border: 0,\n cursor: 'pointer',\n opacity: 0.0001\n }, this.div);\n // Create a label for dropdown select element\n const userButtonTheme = chart.userOptions.rangeSelector?.buttonTheme;\n this.dropdownLabel = renderer.button('', 0, 0, () => { }, RangeSelector_merge(buttonTheme, {\n 'stroke-width': RangeSelector_pick(buttonTheme['stroke-width'], 0),\n width: 'auto',\n paddingLeft: RangeSelector_pick(options.buttonTheme.paddingLeft, userButtonTheme?.padding, 8),\n paddingRight: RangeSelector_pick(options.buttonTheme.paddingRight, userButtonTheme?.padding, 8)\n }), states && states.hover, states && states.select, states && states.disabled)\n .hide()\n .add(this.group);\n // Prevent page zoom on iPhone\n RangeSelector_addEvent(dropdown, 'touchstart', () => {\n dropdown.style.fontSize = '16px';\n });\n // Forward events from select to button\n const mouseOver = Core_Globals.isMS ? 'mouseover' : 'mouseenter', mouseOut = Core_Globals.isMS ? 'mouseout' : 'mouseleave';\n RangeSelector_addEvent(dropdown, mouseOver, () => {\n RangeSelector_fireEvent(this.dropdownLabel.element, mouseOver);\n });\n RangeSelector_addEvent(dropdown, mouseOut, () => {\n RangeSelector_fireEvent(this.dropdownLabel.element, mouseOut);\n });\n RangeSelector_addEvent(dropdown, 'change', () => {\n const button = this.buttons[dropdown.selectedIndex - 1];\n RangeSelector_fireEvent(button.element, 'click');\n });\n this.zoomText = renderer\n .label(lang.rangeSelectorZoom || '', 0)\n .attr({\n padding: options.buttonTheme.padding,\n height: options.buttonTheme.height,\n paddingLeft: 0,\n paddingRight: 0\n })\n .add(this.buttonGroup);\n if (!this.chart.styledMode) {\n this.zoomText.css(options.labelStyle);\n (_a = options.buttonTheme)['stroke-width'] ?? (_a['stroke-width'] = 0);\n }\n RangeSelector_createElement('option', {\n textContent: this.zoomText.textStr,\n disabled: true\n }, void 0, dropdown);\n this.createButtons();\n }\n createButtons() {\n const { options } = this;\n const buttonTheme = RangeSelector_merge(options.buttonTheme);\n const states = buttonTheme && buttonTheme.states;\n // Prevent the button from resetting the width when the button state\n // changes since we need more control over the width when collapsing\n // the buttons\n const width = buttonTheme.width || 28;\n delete buttonTheme.width;\n delete buttonTheme.states;\n this.buttonOptions.forEach((rangeOptions, i) => {\n this.createButton(rangeOptions, i, width, states);\n });\n }\n createButton(rangeOptions, i, width, states) {\n const { dropdown, buttons, chart, options } = this;\n const renderer = chart.renderer;\n const buttonTheme = RangeSelector_merge(options.buttonTheme);\n dropdown?.add(RangeSelector_createElement('option', {\n textContent: rangeOptions.title || rangeOptions.text\n }), i + 2);\n buttons[i] = renderer\n .button(rangeOptions.text, 0, 0, (e) => {\n // Extract events from button object and call\n const buttonEvents = (rangeOptions.events && rangeOptions.events.click);\n let callDefaultEvent;\n if (buttonEvents) {\n callDefaultEvent =\n buttonEvents.call(rangeOptions, e);\n }\n if (callDefaultEvent !== false) {\n this.clickButton(i);\n }\n this.isActive = true;\n }, buttonTheme, states && states.hover, states && states.select, states && states.disabled)\n .attr({\n 'text-align': 'center',\n width\n })\n .add(this.buttonGroup);\n if (rangeOptions.title) {\n buttons[i].attr('title', rangeOptions.title);\n }\n }\n /**\n * Align the elements horizontally and vertically.\n *\n * @private\n * @function Highcharts.RangeSelector#alignElements\n */\n alignElements() {\n const { buttonGroup, buttons, chart, group, inputGroup, options, zoomText } = this;\n const chartOptions = chart.options;\n const navButtonOptions = (chartOptions.exporting &&\n chartOptions.exporting.enabled !== false &&\n chartOptions.navigation &&\n chartOptions.navigation.buttonOptions);\n const { buttonPosition, inputPosition, verticalAlign } = options;\n // Get the X offset required to avoid overlapping with the exporting\n // button. This is used both by the buttonGroup and the inputGroup.\n const getXOffsetForExportButton = (group, position, rightAligned) => {\n if (navButtonOptions &&\n this.titleCollision(chart) &&\n verticalAlign === 'top' &&\n rightAligned && ((position.y -\n group.getBBox().height - 12) <\n ((navButtonOptions.y || 0) +\n (navButtonOptions.height || 0) +\n chart.spacing[0]))) {\n return -40;\n }\n return 0;\n };\n let plotLeft = chart.plotLeft;\n if (group && buttonPosition && inputPosition) {\n let translateX = buttonPosition.x - chart.spacing[3];\n if (buttonGroup) {\n this.positionButtons();\n if (!this.initialButtonGroupWidth) {\n let width = 0;\n if (zoomText) {\n width += zoomText.getBBox().width + 5;\n }\n buttons.forEach((button, i) => {\n width += button.width || 0;\n if (i !== buttons.length - 1) {\n width += options.buttonSpacing;\n }\n });\n this.initialButtonGroupWidth = width;\n }\n plotLeft -= chart.spacing[3];\n // Detect collision between button group and exporting\n const xOffsetForExportButton = getXOffsetForExportButton(buttonGroup, buttonPosition, buttonPosition.align === 'right' ||\n inputPosition.align === 'right');\n this.alignButtonGroup(xOffsetForExportButton);\n if (this.buttonGroup?.translateY) {\n this.dropdownLabel\n .attr({ y: this.buttonGroup.translateY });\n }\n // Skip animation\n group.placed = buttonGroup.placed = chart.hasLoaded;\n }\n let xOffsetForExportButton = 0;\n if (options.inputEnabled && inputGroup) {\n // Detect collision between the input group and exporting button\n xOffsetForExportButton = getXOffsetForExportButton(inputGroup, inputPosition, buttonPosition.align === 'right' ||\n inputPosition.align === 'right');\n if (inputPosition.align === 'left') {\n translateX = plotLeft;\n }\n else if (inputPosition.align === 'right') {\n translateX = -Math.max(chart.axisOffset[1], -xOffsetForExportButton);\n }\n // Update the alignment to the updated spacing box\n inputGroup.align({\n y: inputPosition.y,\n width: inputGroup.getBBox().width,\n align: inputPosition.align,\n // Fix wrong getBBox() value on right align\n x: inputPosition.x + translateX - 2\n }, true, chart.spacingBox);\n // Skip animation\n inputGroup.placed = chart.hasLoaded;\n }\n this.handleCollision(xOffsetForExportButton);\n // Vertical align\n group.align({\n verticalAlign\n }, true, chart.spacingBox);\n const alignTranslateY = group.alignAttr.translateY;\n // Set position\n let groupHeight = group.getBBox().height + 20; // # 20 padding\n let translateY = 0;\n // Calculate bottom position\n if (verticalAlign === 'bottom') {\n const legendOptions = chart.legend && chart.legend.options;\n const legendHeight = (legendOptions &&\n legendOptions.verticalAlign === 'bottom' &&\n legendOptions.enabled &&\n !legendOptions.floating ?\n (chart.legend.legendHeight +\n RangeSelector_pick(legendOptions.margin, 10)) :\n 0);\n groupHeight = groupHeight + legendHeight - 20;\n translateY = (alignTranslateY -\n groupHeight -\n (options.floating ? 0 : options.y) -\n (chart.titleOffset ? chart.titleOffset[2] : 0) -\n 10 // 10 spacing\n );\n }\n if (verticalAlign === 'top') {\n if (options.floating) {\n translateY = 0;\n }\n if (chart.titleOffset && chart.titleOffset[0]) {\n translateY = chart.titleOffset[0];\n }\n translateY += ((chart.margin[0] - chart.spacing[0]) || 0);\n }\n else if (verticalAlign === 'middle') {\n if (inputPosition.y === buttonPosition.y) {\n translateY = alignTranslateY;\n }\n else if (inputPosition.y || buttonPosition.y) {\n if (inputPosition.y < 0 ||\n buttonPosition.y < 0) {\n translateY -= Math.min(inputPosition.y, buttonPosition.y);\n }\n else {\n translateY = alignTranslateY - groupHeight;\n }\n }\n }\n group.translate(options.x, options.y + Math.floor(translateY));\n // Translate HTML inputs\n const { minInput, maxInput, dropdown } = this;\n if (options.inputEnabled && minInput && maxInput) {\n minInput.style.marginTop = group.translateY + 'px';\n maxInput.style.marginTop = group.translateY + 'px';\n }\n if (dropdown) {\n dropdown.style.marginTop = group.translateY + 'px';\n }\n }\n }\n /**\n * @private\n */\n redrawElements() {\n const chart = this.chart, { inputBoxHeight, inputBoxBorderColor } = this.options;\n this.maxDateBox?.attr({\n height: inputBoxHeight\n });\n this.minDateBox?.attr({\n height: inputBoxHeight\n });\n if (!chart.styledMode) {\n this.maxDateBox?.attr({\n stroke: inputBoxBorderColor\n });\n this.minDateBox?.attr({\n stroke: inputBoxBorderColor\n });\n }\n if (this.isDirty) {\n this.isDirty = false;\n // Reset this prop to force redrawing collapse of buttons\n this.isCollapsed = void 0;\n const newButtonsOptions = this.options.buttons ?? [];\n const btnLength = Math.min(newButtonsOptions.length, this.buttonOptions.length);\n const { dropdown, options } = this;\n const buttonTheme = RangeSelector_merge(options.buttonTheme);\n const states = buttonTheme && buttonTheme.states;\n // Prevent the button from resetting the width when the button state\n // changes since we need more control over the width when collapsing\n // the buttons\n const width = buttonTheme.width || 28;\n // Destroy additional buttons\n if (newButtonsOptions.length < this.buttonOptions.length) {\n for (let i = this.buttonOptions.length - 1; i >= newButtonsOptions.length; i--) {\n const btn = this.buttons.pop();\n btn?.destroy();\n this.dropdown?.options.remove(i + 1);\n }\n }\n // Update current buttons\n for (let i = btnLength - 1; i >= 0; i--) {\n const diff = RangeSelector_diffObjects(newButtonsOptions[i], this.buttonOptions[i]);\n if (Object.keys(diff).length !== 0) {\n const rangeOptions = newButtonsOptions[i];\n this.buttons[i].destroy();\n dropdown?.options.remove(i + 1);\n this.createButton(rangeOptions, i, width, states);\n this.computeButtonRange(rangeOptions);\n }\n }\n // Create missing buttons\n if (newButtonsOptions.length > this.buttonOptions.length) {\n for (let i = this.buttonOptions.length; i < newButtonsOptions.length; i++) {\n this.createButton(newButtonsOptions[i], i, width, states);\n this.computeButtonRange(newButtonsOptions[i]);\n }\n }\n this.buttonOptions = this.options.buttons ?? [];\n if (RangeSelector_defined(this.options.selected) && this.buttons.length) {\n this.clickButton(this.options.selected, false);\n }\n }\n }\n /**\n * Align the button group horizontally and vertically.\n *\n * @private\n * @function Highcharts.RangeSelector#alignButtonGroup\n * @param {number} xOffsetForExportButton\n * @param {number} [width]\n */\n alignButtonGroup(xOffsetForExportButton, width) {\n const { chart, options, buttonGroup, dropdown, dropdownLabel } = this;\n const { buttonPosition } = options;\n const plotLeft = chart.plotLeft - chart.spacing[3];\n let translateX = buttonPosition.x - chart.spacing[3];\n let dropdownTranslateX = chart.plotLeft;\n if (buttonPosition.align === 'right') {\n translateX += xOffsetForExportButton - plotLeft; // #13014\n if (this.hasVisibleDropdown) {\n dropdownTranslateX = chart.chartWidth +\n xOffsetForExportButton -\n this.maxButtonWidth() - 20;\n }\n }\n else if (buttonPosition.align === 'center') {\n translateX -= plotLeft / 2;\n if (this.hasVisibleDropdown) {\n dropdownTranslateX = chart.chartWidth / 2 -\n this.maxButtonWidth();\n }\n }\n if (dropdown) {\n RangeSelector_css(dropdown, {\n left: dropdownTranslateX + 'px',\n top: buttonGroup?.translateY + 'px'\n });\n }\n dropdownLabel?.attr({\n x: dropdownTranslateX\n });\n if (buttonGroup) {\n // Align button group\n buttonGroup.align({\n y: buttonPosition.y,\n width: RangeSelector_pick(width, this.initialButtonGroupWidth),\n align: buttonPosition.align,\n x: translateX\n }, true, chart.spacingBox);\n }\n }\n /**\n * @private\n * @function Highcharts.RangeSelector#positionButtons\n */\n positionButtons() {\n const { buttons, chart, options, zoomText } = this;\n const verb = chart.hasLoaded ? 'animate' : 'attr';\n const { buttonPosition } = options;\n const plotLeft = chart.plotLeft;\n let buttonLeft = plotLeft;\n if (zoomText && zoomText.visibility !== 'hidden') {\n // #8769, allow dynamically updating margins\n zoomText[verb]({\n x: RangeSelector_pick(plotLeft + buttonPosition.x, plotLeft)\n });\n // Button start position\n buttonLeft += buttonPosition.x +\n zoomText.getBBox().width + 5;\n }\n for (let i = 0, iEnd = this.buttonOptions.length; i < iEnd; ++i) {\n if (buttons[i].visibility !== 'hidden') {\n buttons[i][verb]({ x: buttonLeft });\n // Increase the button position for the next button\n buttonLeft += (buttons[i].width || 0) + options.buttonSpacing;\n }\n else {\n buttons[i][verb]({ x: plotLeft });\n }\n }\n }\n /**\n * Handle collision between the button group and the input group\n *\n * @private\n * @function Highcharts.RangeSelector#handleCollision\n *\n * @param {number} xOffsetForExportButton\n * The X offset of the group required to make room for the\n * exporting button\n */\n handleCollision(xOffsetForExportButton) {\n const { chart, buttonGroup, inputGroup, initialButtonGroupWidth } = this;\n const { buttonPosition, dropdown, inputPosition } = this.options;\n const moveInputsDown = () => {\n if (inputGroup && buttonGroup) {\n inputGroup.attr({\n translateX: inputGroup.alignAttr.translateX + (chart.axisOffset[1] >= -xOffsetForExportButton ?\n 0 :\n -xOffsetForExportButton),\n translateY: inputGroup.alignAttr.translateY +\n buttonGroup.getBBox().height + 10\n });\n }\n };\n // Detect collision\n if (inputGroup && buttonGroup) {\n if (inputPosition.align === buttonPosition.align) {\n moveInputsDown();\n if (initialButtonGroupWidth >\n chart.plotWidth + xOffsetForExportButton - 20) {\n this.collapseButtons();\n }\n else {\n this.expandButtons();\n }\n }\n else if (initialButtonGroupWidth -\n xOffsetForExportButton +\n inputGroup.getBBox().width >\n chart.plotWidth) {\n if (dropdown === 'responsive') {\n this.collapseButtons();\n }\n else {\n moveInputsDown();\n }\n }\n else {\n this.expandButtons();\n }\n }\n else if (buttonGroup && dropdown === 'responsive') {\n if (initialButtonGroupWidth > chart.plotWidth) {\n this.collapseButtons();\n }\n else {\n this.expandButtons();\n }\n }\n // Forced states\n if (buttonGroup) {\n if (dropdown === 'always') {\n this.collapseButtons();\n }\n if (dropdown === 'never') {\n this.expandButtons();\n }\n }\n this.alignButtonGroup(xOffsetForExportButton);\n }\n /**\n * Collapse the buttons and show the select element.\n *\n * @private\n * @function Highcharts.RangeSelector#collapseButtons\n * @param {number} xOffsetForExportButton\n */\n collapseButtons() {\n const { buttons, zoomText } = this;\n if (this.isCollapsed === true) {\n return;\n }\n this.isCollapsed = true;\n zoomText.hide();\n buttons.forEach((button) => void button.hide());\n this.showDropdown();\n }\n /**\n * Show all the buttons and hide the select element.\n *\n * @private\n * @function Highcharts.RangeSelector#expandButtons\n */\n expandButtons() {\n const { buttons, zoomText } = this;\n if (this.isCollapsed === false) {\n return;\n }\n this.isCollapsed = false;\n this.hideDropdown();\n zoomText.show();\n buttons.forEach((button) => void button.show());\n this.positionButtons();\n }\n /**\n * Position the select element on top of the button.\n *\n * @private\n * @function Highcharts.RangeSelector#showDropdown\n */\n showDropdown() {\n const { buttonGroup, dropdownLabel, dropdown } = this;\n if (buttonGroup && dropdown) {\n dropdownLabel.show();\n RangeSelector_css(dropdown, { visibility: 'inherit' });\n this.hasVisibleDropdown = true;\n }\n }\n /**\n * @private\n * @function Highcharts.RangeSelector#hideDropdown\n */\n hideDropdown() {\n const { dropdown } = this;\n if (dropdown) {\n this.dropdownLabel.hide();\n RangeSelector_css(dropdown, {\n visibility: 'hidden',\n width: '1px',\n height: '1px'\n });\n this.hasVisibleDropdown = false;\n }\n }\n /**\n * Extracts height of range selector\n *\n * @private\n * @function Highcharts.RangeSelector#getHeight\n * @return {number}\n * Returns rangeSelector height\n */\n getHeight() {\n const rangeSelector = this, options = rangeSelector.options, rangeSelectorGroup = rangeSelector.group, inputPosition = options.inputPosition, buttonPosition = options.buttonPosition, yPosition = options.y, buttonPositionY = buttonPosition.y, inputPositionY = inputPosition.y;\n let rangeSelectorHeight = 0;\n if (options.height) {\n return options.height;\n }\n // Align the elements before we read the height in case we're switching\n // between wrapped and non-wrapped layout\n this.alignElements();\n rangeSelectorHeight = rangeSelectorGroup ?\n // 13px to keep back compatibility\n (rangeSelectorGroup.getBBox(true).height) + 13 +\n yPosition :\n 0;\n const minPosition = Math.min(inputPositionY, buttonPositionY);\n if ((inputPositionY < 0 && buttonPositionY < 0) ||\n (inputPositionY > 0 && buttonPositionY > 0)) {\n rangeSelectorHeight += Math.abs(minPosition);\n }\n return rangeSelectorHeight;\n }\n /**\n * Detect collision with title or subtitle\n *\n * @private\n * @function Highcharts.RangeSelector#titleCollision\n * @return {boolean}\n * Returns collision status\n */\n titleCollision(chart) {\n return !(chart.options.title.text ||\n chart.options.subtitle.text);\n }\n /**\n * Update the range selector with new options\n *\n * @private\n * @function Highcharts.RangeSelector#update\n * @param {Highcharts.RangeSelectorOptions} options\n */\n update(options, redraw = true) {\n const chart = this.chart;\n RangeSelector_merge(true, this.options, options);\n if (this.options.selected &&\n this.options.selected >= this.options.buttons.length) {\n this.options.selected = void 0;\n chart.options.rangeSelector.selected = void 0;\n }\n if (RangeSelector_defined(options.enabled)) {\n this.destroy();\n return this.init(chart);\n }\n this.isDirty = !!options.buttons;\n if (redraw) {\n this.render();\n }\n }\n /**\n * Destroys allocated elements.\n *\n * @private\n * @function Highcharts.RangeSelector#destroy\n */\n destroy() {\n const rSelector = this, minInput = rSelector.minInput, maxInput = rSelector.maxInput;\n if (rSelector.eventsToUnbind) {\n rSelector.eventsToUnbind.forEach((unbind) => unbind());\n rSelector.eventsToUnbind = void 0;\n }\n // Destroy elements in collections\n RangeSelector_destroyObjectProperties(rSelector.buttons);\n // Clear input element events\n if (minInput) {\n minInput.onfocus = minInput.onblur = minInput.onchange = null;\n }\n if (maxInput) {\n maxInput.onfocus = maxInput.onblur = maxInput.onchange = null;\n }\n // Destroy HTML and SVG elements\n RangeSelector_objectEach(rSelector, function (val, key) {\n if (val && key !== 'chart') {\n if (val instanceof SVG_SVGElement) {\n // SVGElement\n val.destroy();\n }\n else if (val instanceof window.HTMLElement) {\n // HTML element\n RangeSelector_discardElement(val);\n }\n delete rSelector[key];\n }\n if (val !== RangeSelector.prototype[key]) {\n rSelector[key] = null;\n }\n }, this);\n this.buttons = [];\n }\n}\nRangeSelector_extend(RangeSelector.prototype, {\n /**\n * The date formats to use when setting min, max and value on date inputs.\n * @private\n */\n inputTypeFormats: {\n 'datetime-local': '%Y-%m-%dT%H:%M:%S',\n 'date': '%Y-%m-%d',\n 'time': '%H:%M:%S'\n }\n});\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const RangeSelector_RangeSelector = (RangeSelector);\n/* *\n *\n * API Options\n *\n * */\n/**\n * Define the time span for the button\n *\n * @typedef {\"all\"|\"day\"|\"hour\"|\"millisecond\"|\"minute\"|\"month\"|\"second\"|\"week\"|\"year\"|\"ytd\"} Highcharts.RangeSelectorButtonTypeValue\n */\n/**\n * Callback function to react on button clicks.\n *\n * @callback Highcharts.RangeSelectorClickCallbackFunction\n *\n * @param {global.Event} e\n * Event arguments.\n *\n * @param {boolean|undefined}\n * Return false to cancel the default button event.\n */\n/**\n * Callback function to parse values entered in the input boxes and return a\n * valid JavaScript time as milliseconds since 1970.\n *\n * @callback Highcharts.RangeSelectorParseCallbackFunction\n *\n * @param {string} value\n * Input value to parse.\n *\n * @return {number}\n * Parsed JavaScript time value.\n */\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Core/Chart/StockChart.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { format: StockChart_format } = Core_Templating;\n\nconst { getOptions: StockChart_getOptions } = Defaults;\n\n\n\n\nconst { setFixedRange: StockChart_setFixedRange } = Utilities_StockUtilities;\n\nconst { addEvent: StockChart_addEvent, clamp: StockChart_clamp, crisp: StockChart_crisp, defined: StockChart_defined, extend: StockChart_extend, find: StockChart_find, isNumber: StockChart_isNumber, isString: StockChart_isString, merge: StockChart_merge, pick: StockChart_pick, splat: StockChart_splat } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Get stock-specific default axis options.\n *\n * @private\n * @function getDefaultAxisOptions\n */\nfunction getDefaultAxisOptions(coll, options, defaultOptions) {\n if (coll === 'xAxis') {\n return {\n minPadding: 0,\n maxPadding: 0,\n overscroll: 0,\n ordinal: true\n };\n }\n if (coll === 'yAxis') {\n return {\n labels: {\n y: -2\n },\n opposite: defaultOptions.opposite ?? options.opposite ?? true,\n showLastLabel: !!(\n // #6104, show last label by default for category axes\n options.categories ||\n options.type === 'category'),\n title: {\n text: defaultOptions.title?.text !== 'Values' ?\n defaultOptions.title?.text :\n null\n }\n };\n }\n return {};\n}\n/**\n * Get stock-specific forced axis options.\n *\n * @private\n * @function getForcedAxisOptions\n */\nfunction getForcedAxisOptions(type, chartOptions) {\n if (type === 'xAxis') {\n // Always disable startOnTick:true on the main axis when the navigator\n // is enabled (#1090)\n const navigatorEnabled = StockChart_pick(chartOptions.navigator && chartOptions.navigator.enabled, Navigator_NavigatorDefaults.enabled, true);\n const axisOptions = {\n type: 'datetime',\n categories: void 0\n };\n if (navigatorEnabled) {\n axisOptions.startOnTick = false;\n axisOptions.endOnTick = false;\n }\n return axisOptions;\n }\n return {};\n}\n/* *\n *\n * Class\n *\n * */\n/**\n * Stock-optimized chart. Use {@link Highcharts.Chart|Chart} for common charts.\n *\n * @requires modules/stock\n *\n * @class\n * @name Highcharts.StockChart\n * @extends Highcharts.Chart\n */\nclass StockChart extends Chart_Chart {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Initializes the chart. The constructor's arguments are passed on\n * directly.\n *\n * @function Highcharts.StockChart#init\n *\n * @param {Highcharts.Options} userOptions\n * Custom options.\n *\n * @param {Function} [callback]\n * Function to run when the chart has loaded and all external\n * images are loaded.\n *\n *\n * @emits Highcharts.StockChart#event:init\n * @emits Highcharts.StockChart#event:afterInit\n */\n init(userOptions, callback) {\n const defaultOptions = StockChart_getOptions(), xAxisOptions = userOptions.xAxis, yAxisOptions = userOptions.yAxis, \n // Always disable startOnTick:true on the main axis when the\n // navigator is enabled (#1090)\n navigatorEnabled = StockChart_pick(userOptions.navigator && userOptions.navigator.enabled, Navigator_NavigatorDefaults.enabled, true);\n // Avoid doing these twice\n userOptions.xAxis = userOptions.yAxis = void 0;\n const options = StockChart_merge({\n chart: {\n panning: {\n enabled: true,\n type: 'x'\n },\n zooming: {\n pinchType: 'x',\n mouseWheel: {\n type: 'x'\n }\n }\n },\n navigator: {\n enabled: navigatorEnabled\n },\n scrollbar: {\n // #4988 - check if setOptions was called\n enabled: StockChart_pick(Scrollbar_ScrollbarDefaults.enabled, true)\n },\n rangeSelector: {\n // #4988 - check if setOptions was called\n enabled: StockChart_pick(RangeSelector_RangeSelectorDefaults.rangeSelector.enabled, true)\n },\n title: {\n text: null\n },\n tooltip: {\n split: StockChart_pick(defaultOptions.tooltip && defaultOptions.tooltip.split, true),\n crosshairs: true\n },\n legend: {\n enabled: false\n }\n }, userOptions, // User's options\n {\n isStock: true // Internal flag\n });\n userOptions.xAxis = xAxisOptions;\n userOptions.yAxis = yAxisOptions;\n // Apply X axis options to both single and multi y axes\n options.xAxis = StockChart_splat(userOptions.xAxis || {}).map((xAxisOptions) => StockChart_merge(getDefaultAxisOptions('xAxis', xAxisOptions, defaultOptions.xAxis), \n // #7690\n xAxisOptions, // User options\n getForcedAxisOptions('xAxis', userOptions)));\n // Apply Y axis options to both single and multi y axes\n options.yAxis = StockChart_splat(userOptions.yAxis || {}).map((yAxisOptions) => StockChart_merge(getDefaultAxisOptions('yAxis', yAxisOptions, defaultOptions.yAxis), \n // #7690\n yAxisOptions // User options\n ));\n super.init(options, callback);\n }\n /**\n * Factory for creating different axis types.\n * Extended to add stock defaults.\n *\n * @private\n * @function Highcharts.StockChart#createAxis\n * @param {string} coll\n * An axis type.\n * @param {Chart.CreateAxisOptionsObject} options\n * The axis creation options.\n */\n createAxis(coll, options) {\n options.axis = StockChart_merge(getDefaultAxisOptions(coll, options.axis, StockChart_getOptions()[coll]), options.axis, getForcedAxisOptions(coll, this.userOptions));\n return super.createAxis(coll, options);\n }\n}\nStockChart_addEvent(Chart_Chart, 'update', function (e) {\n const chart = this, options = e.options;\n // Use case: enabling scrollbar from a disabled state.\n // Scrollbar needs to be initialized from a controller, Navigator in this\n // case (#6615)\n if ('scrollbar' in options && chart.navigator) {\n StockChart_merge(true, chart.options.scrollbar, options.scrollbar);\n chart.navigator.update({ enabled: !!chart.navigator.navigatorEnabled });\n delete options.scrollbar;\n }\n});\n/* *\n *\n * Composition\n *\n * */\n(function (StockChart) {\n /* *\n *\n * Functions\n *\n * */\n /** @private */\n function compose(ChartClass, AxisClass, SeriesClass, SVGRendererClass) {\n const seriesProto = SeriesClass.prototype;\n if (!seriesProto.forceCropping) {\n StockChart_addEvent(AxisClass, 'afterDrawCrosshair', onAxisAfterDrawCrosshair);\n StockChart_addEvent(AxisClass, 'afterHideCrosshair', onAxisAfterHideCrosshair);\n StockChart_addEvent(AxisClass, 'autoLabelAlign', onAxisAutoLabelAlign);\n StockChart_addEvent(AxisClass, 'destroy', onAxisDestroy);\n StockChart_addEvent(AxisClass, 'getPlotLinePath', onAxisGetPlotLinePath);\n ChartClass.prototype.setFixedRange = StockChart_setFixedRange;\n seriesProto.forceCropping = seriesForceCropping;\n StockChart_addEvent(SeriesClass, 'setOptions', onSeriesSetOptions);\n SVGRendererClass.prototype.crispPolyLine = svgRendererCrispPolyLine;\n }\n }\n StockChart.compose = compose;\n /**\n * Extend crosshairs to also draw the label.\n * @private\n */\n function onAxisAfterDrawCrosshair(event) {\n const axis = this;\n // Check if the label has to be drawn\n if (!(axis.crosshair?.label?.enabled &&\n axis.cross &&\n StockChart_isNumber(axis.min) &&\n StockChart_isNumber(axis.max))) {\n return;\n }\n const chart = axis.chart, log = axis.logarithmic, options = axis.crosshair.label, // The label's options\n horiz = axis.horiz, // Axis orientation\n opposite = axis.opposite, // Axis position\n left = axis.left, // Left position\n top = axis.top, // Top position\n width = axis.width, tickInside = axis.options.tickPosition === 'inside', snap = axis.crosshair.snap !== false, e = event.e || (axis.cross?.e), point = event.point;\n let crossLabel = axis.crossLabel, // The svgElement\n posx, posy, formatOption = options.format, formatFormat = '', limit, offset = 0, \n // Use last available event (#5287)\n min = axis.min, max = axis.max;\n if (log) {\n min = log.lin2log(axis.min);\n max = log.lin2log(axis.max);\n }\n const align = (horiz ? 'center' : opposite ?\n (axis.labelAlign === 'right' ? 'right' : 'left') :\n (axis.labelAlign === 'left' ? 'left' : 'center'));\n // If the label does not exist yet, create it.\n if (!crossLabel) {\n crossLabel = axis.crossLabel = chart.renderer\n .label('', 0, void 0, options.shape || 'callout')\n .addClass('highcharts-crosshair-label highcharts-color-' + (point && point.series ?\n point.series.colorIndex :\n axis.series[0] && this.series[0].colorIndex))\n .attr({\n align: options.align || align,\n padding: StockChart_pick(options.padding, 8),\n r: StockChart_pick(options.borderRadius, 3),\n zIndex: 2\n })\n .add(axis.labelGroup);\n // Presentational\n if (!chart.styledMode) {\n crossLabel\n .attr({\n fill: options.backgroundColor ||\n ( // #14888\n point && point.series &&\n point.series.color) ||\n \"#666666\" /* Palette.neutralColor60 */,\n stroke: options.borderColor || '',\n 'stroke-width': options.borderWidth || 0\n })\n .css(StockChart_extend({\n color: \"#ffffff\" /* Palette.backgroundColor */,\n fontWeight: 'normal',\n fontSize: '0.7em',\n textAlign: 'center'\n }, options.style || {}));\n }\n }\n if (horiz) {\n posx = snap ? (point.plotX || 0) + left : e.chartX;\n posy = top + (opposite ? 0 : axis.height);\n }\n else {\n posx = left + axis.offset + (opposite ? width : 0);\n posy = snap ? (point.plotY || 0) + top : e.chartY;\n }\n if (!formatOption && !options.formatter) {\n if (axis.dateTime) {\n formatFormat = '%b %d, %Y';\n }\n formatOption =\n '{value' + (formatFormat ? ':' + formatFormat : '') + '}';\n }\n // Show the label\n const value = snap ?\n (axis.isXAxis ? point.x : point.y) :\n axis.toValue(horiz ? e.chartX : e.chartY);\n // Crosshair should be rendered within Axis range (#7219) and the point\n // of currentPriceIndicator should be inside the plot area (#14879).\n const isInside = point && point.series ?\n point.series.isPointInside(point) :\n (StockChart_isNumber(value) && value > min && value < max);\n let text = '';\n if (formatOption) {\n text = StockChart_format(formatOption, { value }, chart);\n }\n else if (options.formatter && StockChart_isNumber(value)) {\n text = options.formatter.call(axis, value);\n }\n crossLabel.attr({\n text,\n x: posx,\n y: posy,\n visibility: isInside ? 'inherit' : 'hidden'\n });\n const crossBox = crossLabel.getBBox();\n // Now it is placed we can correct its position\n if (StockChart_isNumber(crossLabel.x) && !horiz && !opposite) {\n posx = crossLabel.x - (crossBox.width / 2);\n }\n if (StockChart_isNumber(crossLabel.y)) {\n if (horiz) {\n if ((tickInside && !opposite) || (!tickInside && opposite)) {\n posy = crossLabel.y - crossBox.height;\n }\n }\n else {\n posy = crossLabel.y - (crossBox.height / 2);\n }\n }\n // Check the edges\n if (horiz) {\n limit = {\n left,\n right: left + axis.width\n };\n }\n else {\n limit = {\n left: axis.labelAlign === 'left' ? left : 0,\n right: axis.labelAlign === 'right' ?\n left + axis.width :\n chart.chartWidth\n };\n }\n const translateX = crossLabel.translateX || 0;\n // Left edge\n if (translateX < limit.left) {\n offset = limit.left - translateX;\n }\n // Right edge\n if (translateX + crossBox.width >= limit.right) {\n offset = -(translateX + crossBox.width - limit.right);\n }\n // Show the crosslabel\n crossLabel.attr({\n x: Math.max(0, posx + offset),\n y: Math.max(0, posy),\n // First set x and y, then anchorX and anchorY, when box is actually\n // calculated, #5702\n anchorX: horiz ?\n posx :\n (axis.opposite ? 0 : chart.chartWidth),\n anchorY: horiz ?\n (axis.opposite ? chart.chartHeight : 0) :\n posy + crossBox.height / 2\n });\n }\n /**\n * Wrapper to hide the label.\n * @private\n */\n function onAxisAfterHideCrosshair() {\n const axis = this;\n if (axis.crossLabel) {\n axis.crossLabel = axis.crossLabel.hide();\n }\n }\n /**\n * Override the automatic label alignment so that the first Y axis' labels\n * are drawn on top of the grid line, and subsequent axes are drawn outside.\n * @private\n */\n function onAxisAutoLabelAlign(e) {\n const axis = this, chart = axis.chart, options = axis.options, panes = chart._labelPanes = chart._labelPanes || {}, labelOptions = options.labels;\n if (chart.options.isStock && axis.coll === 'yAxis') {\n const key = options.top + ',' + options.height;\n // Do it only for the first Y axis of each pane\n if (!panes[key] && labelOptions.enabled) {\n if (labelOptions.distance === 15 && // Default\n axis.side === 1) {\n labelOptions.distance = 0;\n }\n if (typeof labelOptions.align === 'undefined') {\n labelOptions.align = 'right';\n }\n panes[key] = axis;\n e.align = 'right';\n e.preventDefault();\n }\n }\n }\n /**\n * Clear axis from label panes. (#6071)\n * @private\n */\n function onAxisDestroy() {\n const axis = this, chart = axis.chart, key = (axis.options &&\n (axis.options.top + ',' + axis.options.height));\n if (key && chart._labelPanes && chart._labelPanes[key] === axis) {\n delete chart._labelPanes[key];\n }\n }\n /**\n * Override getPlotLinePath to allow for multipane charts.\n * @private\n */\n function onAxisGetPlotLinePath(e) {\n const axis = this, series = (axis.isLinked && !axis.series && axis.linkedParent ?\n axis.linkedParent.series :\n axis.series), chart = axis.chart, renderer = chart.renderer, axisLeft = axis.left, axisTop = axis.top, result = [], translatedValue = e.translatedValue, value = e.value, force = e.force, \n /**\n * Return the other axis based on either the axis option or on\n * related series.\n * @private\n */\n getAxis = (coll) => {\n const otherColl = coll === 'xAxis' ? 'yAxis' : 'xAxis', opt = axis.options[otherColl];\n // Other axis indexed by number\n if (StockChart_isNumber(opt)) {\n return [chart[otherColl][opt]];\n }\n // Other axis indexed by id (like navigator)\n if (StockChart_isString(opt)) {\n return [chart.get(opt)];\n }\n // Auto detect based on existing series\n return series.map((s) => s[otherColl]);\n };\n let x1, y1, x2, y2, axes = [], // #3416 need a default array\n axes2, uniqueAxes, transVal;\n if ( // For stock chart, by default render paths across the panes\n // except the case when `acrossPanes` is disabled by user (#6644)\n (chart.options.isStock && e.acrossPanes !== false) &&\n // Ignore in case of colorAxis or zAxis. #3360, #3524, #6720\n axis.coll === 'xAxis' || axis.coll === 'yAxis') {\n e.preventDefault();\n // Get the related axes based on series\n axes = getAxis(axis.coll);\n // Get the related axes based options.*Axis setting #2810\n axes2 = (axis.isXAxis ? chart.yAxis : chart.xAxis);\n for (const A of axes2) {\n if (!A.options.isInternal) {\n const a = (A.isXAxis ? 'yAxis' : 'xAxis'), relatedAxis = (StockChart_defined(A.options[a]) ?\n chart[a][A.options[a]] :\n chart[a][0]);\n if (axis === relatedAxis) {\n axes.push(A);\n }\n }\n }\n // Remove duplicates in the axes array. If there are no axes in the\n // axes array, we are adding an axis without data, so we need to\n // populate this with grid lines (#2796).\n uniqueAxes = axes.length ?\n [] :\n [axis.isXAxis ? chart.yAxis[0] : chart.xAxis[0]]; // #3742\n for (const axis2 of axes) {\n if (uniqueAxes.indexOf(axis2) === -1 &&\n // Do not draw on axis which overlap completely. #5424\n !StockChart_find(uniqueAxes, (unique) => (unique.pos === axis2.pos &&\n unique.len === axis2.len))) {\n uniqueAxes.push(axis2);\n }\n }\n transVal = StockChart_pick(translatedValue, axis.translate(value || 0, void 0, void 0, e.old));\n if (StockChart_isNumber(transVal)) {\n if (axis.horiz) {\n for (const axis2 of uniqueAxes) {\n let skip;\n y1 = axis2.pos;\n y2 = y1 + axis2.len;\n x1 = x2 = Math.round(transVal + axis.transB);\n // Outside plot area\n if (force !== 'pass' &&\n (x1 < axisLeft || x1 > axisLeft + axis.width)) {\n if (force) {\n x1 = x2 = StockChart_clamp(x1, axisLeft, axisLeft + axis.width);\n }\n else {\n skip = true;\n }\n }\n if (!skip) {\n result.push(['M', x1, y1], ['L', x2, y2]);\n }\n }\n }\n else {\n for (const axis2 of uniqueAxes) {\n let skip;\n x1 = axis2.pos;\n x2 = x1 + axis2.len;\n y1 = y2 = Math.round(axisTop + axis.height - transVal);\n // Outside plot area\n if (force !== 'pass' &&\n (y1 < axisTop || y1 > axisTop + axis.height)) {\n if (force) {\n y1 = y2 = StockChart_clamp(y1, axisTop, axisTop + axis.height);\n }\n else {\n skip = true;\n }\n }\n if (!skip) {\n result.push(['M', x1, y1], ['L', x2, y2]);\n }\n }\n }\n }\n e.path = result.length > 0 ?\n renderer.crispPolyLine(result, e.lineWidth || 1) :\n // #3557 getPlotLinePath in regular Highcharts also returns null\n void 0;\n }\n }\n /**\n * Handle som Stock-specific series defaults, override the plotOptions\n * before series options are handled.\n * @private\n */\n function onSeriesSetOptions(e) {\n const series = this;\n if (series.chart.options.isStock) {\n let overrides;\n if (series.is('column') || series.is('columnrange')) {\n overrides = {\n borderWidth: 0,\n shadow: false\n };\n }\n else if (!series.is('scatter') && !series.is('sma')) {\n overrides = {\n marker: {\n enabled: false,\n radius: 2\n }\n };\n }\n if (overrides) {\n e.plotOptions[series.type] = StockChart_merge(e.plotOptions[series.type], overrides);\n }\n }\n }\n /**\n * Based on the data grouping options decides whether\n * the data should be cropped while processing.\n *\n * @ignore\n * @function Highcharts.Series#forceCropping\n */\n function seriesForceCropping() {\n const series = this, chart = series.chart, options = series.options, dataGroupingOptions = options.dataGrouping, groupingEnabled = (series.allowDG !== false &&\n dataGroupingOptions &&\n StockChart_pick(dataGroupingOptions.enabled, chart.options.isStock));\n return groupingEnabled;\n }\n /* eslint-disable jsdoc/check-param-names */\n /**\n * Factory function for creating new stock charts. Creates a new\n * {@link Highcharts.StockChart|StockChart} object with different default\n * options than the basic Chart.\n *\n * @example\n * let chart = Highcharts.stockChart('container', {\n * series: [{\n * data: [1, 2, 3, 4, 5, 6, 7, 8, 9],\n * pointInterval: 24 * 60 * 60 * 1000\n * }]\n * });\n *\n * @function Highcharts.stockChart\n *\n * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n * The DOM element to render to, or its id.\n *\n * @param {Highcharts.Options} options\n * The chart options structure as described in the\n * [options reference](https://api.highcharts.com/highstock).\n *\n * @param {Highcharts.ChartCallbackFunction} [callback]\n * A function to execute when the chart object is finished\n * rendering and all external image files (`chart.backgroundImage`,\n * `chart.plotBackgroundImage` etc) are loaded. Defining a\n * [chart.events.load](https://api.highcharts.com/highstock/chart.events.load)\n * handler is equivalent.\n *\n * @return {Highcharts.StockChart}\n * The chart object.\n */\n function stockChart(a, b, c) {\n return new StockChart(a, b, c);\n }\n StockChart.stockChart = stockChart;\n /* eslint-enable jsdoc/check-param-names */\n /**\n * Function to crisp a line with multiple segments\n *\n * @private\n * @function Highcharts.SVGRenderer#crispPolyLine\n */\n function svgRendererCrispPolyLine(points, width) {\n // Points format: [['M', 0, 0], ['L', 100, 0]]\n // normalize to a crisp line\n for (let i = 0; i < points.length; i = i + 2) {\n const start = points[i], end = points[i + 1];\n if (StockChart_defined(start[1]) && start[1] === end[1]) {\n start[1] = end[1] = StockChart_crisp(start[1], width);\n }\n if (StockChart_defined(start[2]) && start[2] === end[2]) {\n start[2] = end[2] = StockChart_crisp(start[2], width);\n }\n }\n return points;\n }\n})(StockChart || (StockChart = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Chart_StockChart = (StockChart);\n\n;// ./code/es-modules/Series/HLC/HLCPoint.js\n/* *\n *\n * (c) 2010-2024 Pawel Lysy\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { column: { prototype: { pointClass: ColumnPoint } } } = Series_SeriesRegistry.seriesTypes;\n/* *\n *\n * Class\n *\n * */\nclass HLCPoint extends ColumnPoint {\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const HLC_HLCPoint = (HLCPoint);\n\n;// ./code/es-modules/Series/HLC/HLCSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Pawel Lysy\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * An HLC chart is a style of financial chart used to describe price\n * movements over time. It displays high, low and close values per\n * data point.\n *\n * @sample stock/demo/hlc/\n * HLC chart\n *\n * @extends plotOptions.column\n * @excluding borderColor, borderRadius, borderWidth, crisp, stacking,\n * stack\n * @product highstock\n * @optionparent plotOptions.hlc\n */\nconst HLCSeriesDefaults = {\n /**\n * The approximate pixel width of each group. If for example a series\n * with 30 points is displayed over a 600 pixel wide plot area, no\n * grouping is performed. If however the series contains so many points\n * that the spacing is less than the groupPixelWidth, Highcharts will\n * try to group it into appropriate groups so that each is more or less\n * two pixels wide. Defaults to `5`.\n *\n * @type {number}\n * @default 5\n * @product highstock\n * @apioption plotOptions.hlc.dataGrouping.groupPixelWidth\n */\n /**\n * @type {Highcharts.DataGroupingApproximationValue|Function}\n * @default hlc\n * @product highstock\n * @apioption plotOptions.hlc.dataGrouping.approximation\n */\n /**\n * @default close\n * @apioption plotOptions.hlc.colorKey\n */\n /**\n * The pixel width of the line/border. Defaults to `1`.\n *\n * @sample {highstock} stock/plotoptions/hlc-linewidth/\n * A greater line width\n *\n * @type {number}\n * @default 1\n * @product highstock\n *\n * @public\n */\n lineWidth: 1,\n tooltip: {\n pointFormat: '\\u25CF ' +\n ' {series.name}
' +\n 'High: {point.high}
' +\n 'Low: {point.low}
' +\n 'Close: {point.close}
'\n },\n /**\n * @type {number|null}\n */\n threshold: null,\n states: {\n /**\n * @extends plotOptions.column.states.hover\n * @product highstock\n */\n hover: {\n /**\n * The pixel width of the line representing the HLC point.\n *\n * @type {number}\n * @default 3\n * @product highstock\n */\n lineWidth: 3\n }\n },\n /**\n * Determines which one of `high`, `low`, `close` values should\n * be represented as `point.y`, which is later used to set dataLabel\n * position and [compare](#plotOptions.series.compare).\n *\n * @sample {highstock} stock/plotoptions/hlc-pointvalkey/\n * Possible values\n *\n * @declare Highcharts.OptionsHLCPointValKeyValue\n * @type {string}\n * @default close\n * @validvalue [\"high\", \"low\", \"close\"]\n * @product highstock\n * @apioption plotOptions.hlc.pointValKey\n */\n /**\n * @default close\n * @apioption plotOptions.hlc.colorKey\n */\n stickyTracking: true\n};\n/**\n * A `hlc` series. If the [type](#series.hlc.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.hlc\n * @excluding dataParser, dataURL\n * @product highstock\n * @apioption series.hlc\n */\n/**\n * An array of data points for the series. For the `hlc` series type,\n * points can be given in the following ways:\n *\n * 1. An array of arrays with 4 or 3 values. In this case, the values correspond\n * to `x,high,low,close`. If the first value is a string, it is applied\n * as the name of the point, and the `x` value is inferred. The `x` value can\n * also be omitted, in which case the inner arrays should be of length of 3\\.\n * Then the `x` value is automatically calculated, either starting at 0 and\n * incremented by 1, or from `pointStart` and `pointInterval` given in the\n * series options.\n * ```js\n * data: [\n * [0, 5, 6, 7],\n * [1, 4, 8, 2],\n * [2, 3, 4, 10]\n * ]\n * ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.hlc.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * high: 4,\n * low: 5,\n * close: 2,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * high: 3,\n * low: 6,\n * close: 7,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @type {Array|Array<(number|string),number,number,number>|*>}\n * @extends series.arearange.data\n * @excluding y, marker\n * @product highstock\n * @apioption series.hlc.data\n */\n/**\n * The closing value of each data point.\n *\n * @type {number}\n * @product highstock\n * @apioption series.hlc.data.close\n */\n(''); // Keeps doclets above in JS file\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const HLC_HLCSeriesDefaults = (HLCSeriesDefaults);\n\n;// ./code/es-modules/Series/HLC/HLCSeries.js\n/* *\n *\n * (c) 2010-2024 Pawel Lysy\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\nconst { column: HLCSeries_ColumnSeries } = Series_SeriesRegistry.seriesTypes;\n\nconst { crisp: HLCSeries_crisp, extend: HLCSeries_extend, merge: HLCSeries_merge } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The hlc series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.hlc\n *\n * @augments Highcharts.Series\n */\nclass HLCSeries extends HLCSeries_ColumnSeries {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Extend the path if close is not between high and low.\n *\n * @param {SVGPath} path the path array of the point\n * @param {number} halfStrokeWidth\n * @param {number} value value of the point to which the stem should be extended\n */\n extendStem(path, halfStrokeWidth, value) {\n const start = path[0];\n const end = path[1];\n // We don't need to worry about crisp - close value\n // is already crisped and halfStrokeWidth should remove it.\n if (typeof start[2] === 'number') {\n start[2] = Math.max(value + halfStrokeWidth, start[2]);\n }\n if (typeof end[2] === 'number') {\n end[2] = Math.min(value - halfStrokeWidth, end[2]);\n }\n }\n /**\n * Function to create SVGPath of the point based on the\n * plot positions of this point.\n * @private\n */\n getPointPath(point, graphic) {\n // Crisp vector coordinates\n const strokeWidth = graphic.strokeWidth(), series = point.series, \n // #2596:\n crispX = HLCSeries_crisp(point.plotX || 0, strokeWidth), halfWidth = Math.round(point.shapeArgs.width / 2);\n // The vertical stem\n const path = [\n ['M', crispX, Math.round(point.yBottom)],\n ['L', crispX, Math.round(point.plotHigh)]\n ];\n // Close\n if (point.close !== null) {\n const plotClose = HLCSeries_crisp(point.plotClose, strokeWidth);\n path.push(['M', crispX, plotClose], ['L', crispX + halfWidth, plotClose]);\n series.extendStem(path, strokeWidth / 2, plotClose);\n }\n return path;\n }\n /**\n * Draw single point\n * @private\n */\n drawSinglePoint(point) {\n const series = point.series, chart = series.chart;\n let path, graphic = point.graphic;\n if (typeof point.plotY !== 'undefined') {\n // Create and/or update the graphic\n if (!graphic) {\n point.graphic = graphic = chart.renderer.path()\n .add(series.group);\n }\n if (!chart.styledMode) {\n graphic.attr(series.pointAttribs(point, (point.selected && 'select'))); // #3897\n }\n // Crisp vector coordinates\n path = series.getPointPath(point, graphic);\n graphic[!graphic ? 'attr' : 'animate']({ d: path })\n .addClass(point.getClassName(), true);\n }\n }\n /**\n * Draw the data points\n * @private\n */\n drawPoints() {\n this.points.forEach(this.drawSinglePoint);\n }\n /**\n * @private\n * @function Highcharts.seriesTypes.hlc#init\n */\n init() {\n super.init.apply(this, arguments);\n this.options.stacking = void 0; // #8817\n }\n /**\n * Postprocess mapping between options and SVG attributes\n * @private\n */\n pointAttribs(point, state) {\n const attribs = super.pointAttribs.call(this, point, state);\n delete attribs.fill;\n return attribs;\n }\n toYData(point) {\n // Return a plain array for speedy calculation\n return [point.high, point.low, point.close];\n }\n /**\n * Translate data points from raw values x and y to plotX and plotY\n *\n * @private\n * @function Highcharts.seriesTypes.hlc#translate\n */\n translate() {\n const series = this, yAxis = series.yAxis, names = (this.pointArrayMap && this.pointArrayMap.slice()) || [], translated = names.map((name) => `plot${name.charAt(0).toUpperCase() + name.slice(1)}`);\n translated.push('yBottom');\n names.push('low');\n super.translate.apply(series);\n // Do the translation\n series.points.forEach(function (point) {\n names.forEach(function (name, i) {\n let value = point[name];\n if (value !== null) {\n if (series.dataModify) {\n value = series.dataModify.modifyValue(value);\n }\n point[translated[i]] =\n yAxis.toPixels(value, true);\n }\n });\n // Align the tooltip to the high value to avoid covering the\n // point\n point.tooltipPos[1] =\n point.plotHigh + yAxis.pos - series.chart.plotTop;\n });\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nHLCSeries.defaultOptions = HLCSeries_merge(HLCSeries_ColumnSeries.defaultOptions, HLC_HLCSeriesDefaults);\nHLCSeries_extend(HLCSeries.prototype, {\n pointClass: HLC_HLCPoint,\n animate: null, // Disable animation\n directTouch: false,\n keysAffectYAxis: ['low', 'high'],\n pointArrayMap: ['high', 'low', 'close'],\n pointAttrToOptions: {\n stroke: 'color',\n 'stroke-width': 'lineWidth'\n },\n pointValKey: 'close'\n});\nSeries_SeriesRegistry.registerSeriesType('hlc', HLCSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const HLC_HLCSeries = ((/* unused pure expression or super */ null && (HLCSeries)));\n\n;// ./code/es-modules/Series/OHLC/OHLCPoint.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { seriesTypes: { hlc: OHLCPoint_HLCSeries } } = Series_SeriesRegistry;\n/* *\n *\n * Class\n *\n * */\nclass OHLCPoint extends OHLCPoint_HLCSeries.prototype.pointClass {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Extend the parent method by adding up or down to the class name.\n * @private\n * @function Highcharts.seriesTypes.ohlc#getClassName\n */\n getClassName() {\n return super.getClassName.call(this) +\n (this.open < this.close ?\n ' highcharts-point-up' :\n ' highcharts-point-down');\n }\n /**\n * Save upColor as point color (#14826).\n * @private\n * @function Highcharts.seriesTypes.ohlc#resolveUpColor\n */\n resolveUpColor() {\n if (this.open < this.close &&\n !this.options.color &&\n this.series.options.upColor) {\n this.color = this.series.options.upColor;\n }\n }\n /**\n * Extend the parent method by saving upColor.\n * @private\n * @function Highcharts.seriesTypes.ohlc#resolveColor\n */\n resolveColor() {\n super.resolveColor();\n if (!this.series.is('heikinashi')) {\n this.resolveUpColor();\n }\n }\n /**\n * Extend the parent method by saving upColor.\n * @private\n * @function Highcharts.seriesTypes.ohlc#getZone\n *\n * @return {Highcharts.SeriesZonesOptionsObject}\n * The zone item.\n */\n getZone() {\n const zone = super.getZone();\n this.resolveUpColor();\n return zone;\n }\n /**\n * Extend the parent method by resolving up/down colors (#15849)\n * @private\n **/\n applyOptions() {\n super.applyOptions.apply(this, arguments);\n if (this.resolveColor) {\n this.resolveColor();\n }\n return this;\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const OHLC_OHLCPoint = (OHLCPoint);\n\n;// ./code/es-modules/Series/OHLC/OHLCSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * An OHLC chart is a style of financial chart used to describe price\n * movements over time. It displays open, high, low and close values per\n * data point.\n *\n * @sample stock/demo/ohlc\n * OHLC chart\n *\n * @extends plotOptions.hlc\n * @product highstock\n * @optionparent plotOptions.ohlc\n */\nconst OHLCSeriesDefaults = {\n /**\n * @type {Highcharts.DataGroupingApproximationValue|Function}\n * @default ohlc\n * @product highstock\n * @apioption plotOptions.ohlc.dataGrouping.approximation\n */\n /**\n * Determines which one of `open`, `high`, `low`, `close` values should\n * be represented as `point.y`, which is later used to set dataLabel\n * position and [compare](#plotOptions.series.compare).\n *\n * @declare Highcharts.OptionsPointValKeyValue\n * @default close\n * @validvalue [\"open\", \"high\", \"low\", \"close\"]\n * @product highstock\n * @apioption plotOptions.ohlc.pointValKey\n */\n /**\n * Line color for up points.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highstock\n * @apioption plotOptions.ohlc.upColor\n */\n tooltip: {\n pointFormat: '\\u25CF ' +\n ' {series.name}
' +\n 'Open: {point.open}
' +\n 'High: {point.high}
' +\n 'Low: {point.low}
' +\n 'Close: {point.close}
'\n }\n};\n/**\n * The parameter allows setting line series type and use OHLC indicators.\n * Data in OHLC format is required.\n *\n * @sample {highstock} stock/indicators/use-ohlc-data\n * Use OHLC data format to plot line chart\n *\n * @type {boolean}\n * @product highstock\n * @apioption plotOptions.line.useOhlcData\n */\n/**\n * A `ohlc` series. If the [type](#series.ohlc.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.ohlc\n * @excluding dataParser, dataURL\n * @product highstock\n * @apioption series.ohlc\n */\n/**\n * An array of data points for the series. For the `ohlc` series type,\n * points can be given in the following ways:\n *\n * 1. An array of arrays with 5 or 4 values. In this case, the values correspond\n * to `x,open,high,low,close`. If the first value is a string, it is applied\n * as the name of the point, and the `x` value is inferred. The `x` value can\n * also be omitted, in which case the inner arrays should be of length 4\\.\n * Then the `x` value is automatically calculated, either starting at 0 and\n * incremented by 1, or from `pointStart` and `pointInterval` given in the\n * series options.\n * ```js\n * data: [\n * [0, 6, 5, 6, 7],\n * [1, 9, 4, 8, 2],\n * [2, 6, 3, 4, 10]\n * ]\n * ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.ohlc.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * open: 3,\n * high: 4,\n * low: 5,\n * close: 2,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * open: 4,\n * high: 3,\n * low: 6,\n * close: 7,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @type {Array|Array<(number|string),number,number,number,number>|*>}\n * @extends series.arearange.data\n * @excluding y, marker\n * @product highstock\n * @apioption series.ohlc.data\n */\n/**\n * The closing value of each data point.\n *\n * @type {number}\n * @product highstock\n * @apioption series.ohlc.data.close\n */\n/**\n * The opening value of each data point.\n *\n * @type {number}\n * @product highstock\n * @apioption series.ohlc.data.open\n */\n''; // Adds doclets above to transpiled\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const OHLC_OHLCSeriesDefaults = (OHLCSeriesDefaults);\n\n;// ./code/es-modules/Series/OHLC/OHLCSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { composed: OHLCSeries_composed } = Core_Globals;\n\n\n\nconst { hlc: OHLCSeries_HLCSeries } = Series_SeriesRegistry.seriesTypes;\n\nconst { addEvent: OHLCSeries_addEvent, crisp: OHLCSeries_crisp, extend: OHLCSeries_extend, merge: OHLCSeries_merge, pushUnique: OHLCSeries_pushUnique } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction onSeriesAfterSetOptions(e) {\n const options = e.options, dataGrouping = options.dataGrouping;\n if (dataGrouping &&\n options.useOhlcData &&\n options.id !== 'highcharts-navigator-series') {\n dataGrouping.approximation = 'ohlc';\n }\n}\n/**\n * Add useOhlcData option\n * @private\n */\nfunction onSeriesInit(eventOptions) {\n // eslint-disable-next-line no-invalid-this\n const series = this, options = eventOptions.options;\n if (options.useOhlcData &&\n options.id !== 'highcharts-navigator-series') {\n OHLCSeries_extend(series, {\n pointValKey: OHLCSeries.prototype.pointValKey,\n // Keys: ohlcProto.keys, // @todo potentially nonsense\n pointArrayMap: OHLCSeries.prototype.pointArrayMap,\n toYData: OHLCSeries.prototype.toYData\n });\n }\n}\n/* *\n *\n * Class\n *\n * */\n/**\n * The ohlc series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.ohlc\n *\n * @augments Highcharts.Series\n */\nclass OHLCSeries extends OHLCSeries_HLCSeries {\n /* *\n *\n * Static Functions\n *\n * */\n static compose(SeriesClass, ..._args) {\n if (OHLCSeries_pushUnique(OHLCSeries_composed, 'OHLCSeries')) {\n OHLCSeries_addEvent(SeriesClass, 'afterSetOptions', onSeriesAfterSetOptions);\n OHLCSeries_addEvent(SeriesClass, 'init', onSeriesInit);\n }\n }\n /* *\n *\n * Functions\n *\n * */\n getPointPath(point, graphic) {\n const path = super.getPointPath(point, graphic), strokeWidth = graphic.strokeWidth(), crispX = OHLCSeries_crisp(point.plotX || 0, strokeWidth), halfWidth = Math.round(point.shapeArgs.width / 2);\n if (point.open !== null) {\n const plotOpen = OHLCSeries_crisp(point.plotOpen, strokeWidth);\n path.push(['M', crispX, plotOpen], ['L', crispX - halfWidth, plotOpen]);\n super.extendStem(path, strokeWidth / 2, plotOpen);\n }\n return path;\n }\n /**\n * Postprocess mapping between options and SVG attributes\n * @private\n */\n pointAttribs(point, state) {\n const attribs = super.pointAttribs.call(this, point, state), options = this.options;\n delete attribs.fill;\n if (!point.options.color &&\n options.upColor &&\n point.open < point.close) {\n attribs.stroke = options.upColor;\n }\n return attribs;\n }\n toYData(point) {\n // Return a plain array for speedy calculation\n return [point.open, point.high, point.low, point.close];\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nOHLCSeries.defaultOptions = OHLCSeries_merge(OHLCSeries_HLCSeries.defaultOptions, OHLC_OHLCSeriesDefaults);\nOHLCSeries_extend(OHLCSeries.prototype, {\n pointClass: OHLC_OHLCPoint,\n pointArrayMap: ['open', 'high', 'low', 'close']\n});\nSeries_SeriesRegistry.registerSeriesType('ohlc', OHLCSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const OHLC_OHLCSeries = (OHLCSeries);\n\n;// ./code/es-modules/Series/Candlestick/CandlestickSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * A candlestick chart is a style of financial chart used to describe\n * price movements over time.\n *\n * @sample stock/demo/candlestick/\n * Candlestick chart\n *\n * @extends plotOptions.ohlc\n * @excluding borderColor,borderRadius,borderWidth\n * @product highstock\n * @optionparent plotOptions.candlestick\n */\nconst CandlestickSeriesDefaults = {\n /**\n * The specific line color for up candle sticks. The default is to\n * inherit the general `lineColor` setting.\n *\n * @sample {highstock} stock/plotoptions/candlestick-linecolor/\n * Candlestick line colors\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @since 1.3.6\n * @product highstock\n * @apioption plotOptions.candlestick.upLineColor\n */\n states: {\n /**\n * @extends plotOptions.column.states.hover\n * @product highstock\n */\n hover: {\n /**\n * The pixel width of the line/border around the\n * candlestick.\n *\n * @product highstock\n */\n lineWidth: 2\n }\n },\n /**\n * @type {number|null}\n * @product highstock\n */\n threshold: null,\n /**\n * The color of the line/border of the candlestick.\n *\n * In styled mode, the line stroke can be set with the\n * `.highcharts-candlestick-series .highcahrts-point` rule.\n *\n * @see [upLineColor](#plotOptions.candlestick.upLineColor)\n *\n * @sample {highstock} stock/plotoptions/candlestick-linecolor/\n * Candlestick line colors\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #000000\n * @product highstock\n */\n lineColor: \"#000000\" /* Palette.neutralColor100 */,\n /**\n * The pixel width of the candlestick line/border. Defaults to `1`.\n *\n *\n * In styled mode, the line stroke width can be set with the\n * `.highcharts-candlestick-series .highcahrts-point` rule.\n *\n * @product highstock\n */\n lineWidth: 1,\n /**\n * The fill color of the candlestick when values are rising.\n *\n * In styled mode, the up color can be set with the\n * `.highcharts-candlestick-series .highcharts-point-up` rule.\n *\n * @sample {highstock} stock/plotoptions/candlestick-color/\n * Custom colors\n * @sample {highstock} highcharts/css/candlestick/\n * Colors in styled mode\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #ffffff\n * @product highstock\n */\n upColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * @product highstock\n */\n stickyTracking: true\n};\n/**\n * A `candlestick` series. If the [type](#series.candlestick.type)\n * option is not specified, it is inherited from [chart.type](\n * #chart.type).\n *\n * @type {*}\n * @extends series,plotOptions.candlestick\n * @excluding dataParser, dataURL, marker\n * @product highstock\n * @apioption series.candlestick\n */\n/**\n * An array of data points for the series. For the `candlestick` series\n * type, points can be given in the following ways:\n *\n * 1. An array of arrays with 5 or 4 values. In this case, the values correspond\n * to `x,open,high,low,close`. If the first value is a string, it is applied\n * as the name of the point, and the `x` value is inferred. The `x` value can\n * also be omitted, in which case the inner arrays should be of length 4.\n * Then the `x` value is automatically calculated, either starting at 0 and\n * incremented by 1, or from `pointStart` and `pointInterval` given in the\n * series options.\n * ```js\n * data: [\n * [0, 7, 2, 0, 4],\n * [1, 1, 4, 2, 8],\n * [2, 3, 3, 9, 3]\n * ]\n * ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.candlestick.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * open: 9,\n * high: 2,\n * low: 4,\n * close: 6,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * open: 1,\n * high: 4,\n * low: 7,\n * close: 7,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @type {Array|Array<(number|string),number,number,number,number>|*>}\n * @extends series.ohlc.data\n * @excluding y\n * @product highstock\n * @apioption series.candlestick.data\n */\n''; // Adds doclets above to transpiled\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Candlestick_CandlestickSeriesDefaults = (CandlestickSeriesDefaults);\n\n;// ./code/es-modules/Series/Candlestick/CandlestickSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { column: CandlestickSeries_ColumnSeries, ohlc: CandlestickSeries_OHLCSeries } = Series_SeriesRegistry.seriesTypes;\n\nconst { crisp: CandlestickSeries_crisp, merge: CandlestickSeries_merge } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\n/**\n * The candlestick series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.candlestick\n *\n * @augments Highcharts.seriesTypes.ohlc\n */\nclass CandlestickSeries extends CandlestickSeries_OHLCSeries {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Postprocess mapping between options and SVG attributes\n *\n * @private\n * @function Highcharts.seriesTypes.candlestick#pointAttribs\n */\n pointAttribs(point, state) {\n const attribs = CandlestickSeries_ColumnSeries.prototype.pointAttribs.call(this, point, state), options = this.options, isUp = point.open < point.close, stroke = options.lineColor || this.color, color = point.color || this.color; // (#14826)\n attribs['stroke-width'] = options.lineWidth;\n attribs.fill = point.options.color ||\n (isUp ? (options.upColor || color) : color);\n attribs.stroke = point.options.lineColor ||\n (isUp ? (options.upLineColor || stroke) : stroke);\n // Select or hover states\n if (state) {\n const stateOptions = options.states[state];\n attribs.fill = stateOptions.color || attribs.fill;\n attribs.stroke = stateOptions.lineColor || attribs.stroke;\n attribs['stroke-width'] =\n stateOptions.lineWidth || attribs['stroke-width'];\n }\n return attribs;\n }\n /**\n * Draw the data points.\n *\n * @private\n * @function Highcharts.seriesTypes.candlestick#drawPoints\n */\n drawPoints() {\n const series = this, points = series.points, chart = series.chart, reversedYAxis = series.yAxis.reversed;\n for (const point of points) {\n let graphic = point.graphic, plotOpen, plotClose, topBox, bottomBox, hasTopWhisker, hasBottomWhisker, crispX, path, halfWidth;\n const isNew = !graphic;\n if (typeof point.plotY !== 'undefined') {\n if (!graphic) {\n point.graphic = graphic = chart.renderer.path()\n .add(series.group);\n }\n if (!series.chart.styledMode) {\n graphic\n .attr(series.pointAttribs(point, (point.selected && 'select'))) // #3897\n .shadow(series.options.shadow);\n }\n // Crisp vector coordinates\n const strokeWidth = graphic.strokeWidth();\n // #2596:\n crispX = CandlestickSeries_crisp(point.plotX || 0, strokeWidth);\n plotOpen = point.plotOpen;\n plotClose = point.plotClose;\n topBox = Math.min(plotOpen, plotClose);\n bottomBox = Math.max(plotOpen, plotClose);\n halfWidth = Math.round(point.shapeArgs.width / 2);\n hasTopWhisker = reversedYAxis ?\n bottomBox !== point.yBottom :\n Math.round(topBox) !==\n Math.round(point.plotHigh || 0);\n hasBottomWhisker = reversedYAxis ?\n Math.round(topBox) !==\n Math.round(point.plotHigh || 0) :\n bottomBox !== point.yBottom;\n topBox = CandlestickSeries_crisp(topBox, strokeWidth);\n bottomBox = CandlestickSeries_crisp(bottomBox, strokeWidth);\n // Create the path. Due to a bug in Chrome 49, the path is\n // first instantiated with no values, then the values\n // pushed. For unknown reasons, instantiating the path array\n // with all the values would lead to a crash when updating\n // frequently (#5193).\n path = [];\n path.push(['M', crispX - halfWidth, bottomBox], ['L', crispX - halfWidth, topBox], ['L', crispX + halfWidth, topBox], ['L', crispX + halfWidth, bottomBox], ['Z'], // Ensure a nice rectangle #2602\n ['M', crispX, topBox], [\n 'L',\n // #460, #2094\n crispX,\n hasTopWhisker ?\n Math.round(reversedYAxis ?\n point.yBottom :\n point.plotHigh) :\n topBox\n ], ['M', crispX, bottomBox], [\n 'L',\n // #460, #2094\n crispX,\n hasBottomWhisker ?\n Math.round(reversedYAxis ?\n point.plotHigh :\n point.yBottom) :\n bottomBox\n ]);\n graphic[isNew ? 'attr' : 'animate']({ d: path })\n .addClass(point.getClassName(), true);\n }\n }\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nCandlestickSeries.defaultOptions = CandlestickSeries_merge(CandlestickSeries_OHLCSeries.defaultOptions, { tooltip: CandlestickSeries_OHLCSeries.defaultOptions.tooltip }, Candlestick_CandlestickSeriesDefaults);\nSeries_SeriesRegistry.registerSeriesType('candlestick', CandlestickSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Candlestick_CandlestickSeries = ((/* unused pure expression or super */ null && (CandlestickSeries)));\n\n;// ./code/es-modules/Series/Flags/FlagsPoint.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { column: { prototype: { pointClass: FlagsPoint_ColumnPoint } } } = Series_SeriesRegistry.seriesTypes;\n\nconst { isNumber: FlagsPoint_isNumber } = Core_Utilities;\n/* *\n *\n * Class\n *\n * */\nclass FlagsPoint extends FlagsPoint_ColumnPoint {\n constructor() {\n /* *\n *\n * Properties\n *\n * */\n super(...arguments);\n this.ttBelow = false;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n isValid() {\n // #9233 - Prevent from treating flags as null points (even if\n // they have no y values defined).\n return FlagsPoint_isNumber(this.y) || typeof this.y === 'undefined';\n }\n /**\n * @private\n */\n hasNewShapeType() {\n const shape = this.options.shape || this.series.options.shape;\n return this.graphic && shape && shape !== this.graphic.symbolKey;\n }\n}\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Flags_FlagsPoint = (FlagsPoint);\n\n;// ./code/es-modules/Series/Flags/FlagsSeriesDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * API Options\n *\n * */\n/**\n * Flags are used to mark events in stock charts. They can be added on the\n * timeline, or attached to a specific series.\n *\n * @sample stock/demo/flags-general/\n * Flags on a line series\n *\n * @extends plotOptions.column\n * @excluding animation, borderColor, borderWidth,\n * colorByPoint, cropThreshold, dataGrouping, pointPadding,\n * pointWidth, turboThreshold\n * @product highstock\n * @optionparent plotOptions.flags\n */\nconst FlagsSeriesDefaults = {\n /**\n * The corner radius of the border surrounding each flag. For `squarepin`\n * shaped flags only. A number signifies pixels. A percentage string, like\n * for example 50%, signifies a relative size.\n */\n borderRadius: 0,\n /**\n * In case the flag is placed on a series, on what point key to place\n * it. Line and columns have one key, `y`. In range or OHLC-type series,\n * however, the flag can optionally be placed on the `open`, `high`,\n * `low` or `close` key.\n *\n * @sample {highstock} stock/plotoptions/flags-onkey/\n * Range series, flag on high\n *\n * @type {string}\n * @default y\n * @since 4.2.2\n * @product highstock\n * @validvalue [\"y\", \"open\", \"high\", \"low\", \"close\"]\n * @apioption plotOptions.flags.onKey\n */\n /**\n * The id of the series that the flags should be drawn on. If no id\n * is given, the flags are drawn on the x axis.\n *\n * @sample {highstock} stock/plotoptions/flags/\n * Flags on series and on x axis\n *\n * @type {string}\n * @product highstock\n * @apioption plotOptions.flags.onSeries\n */\n pointRange: 0, // #673\n /**\n * Whether the flags are allowed to overlap sideways. If `false`, the\n * flags are moved sideways using an algorithm that seeks to place every\n * flag as close as possible to its original position.\n *\n * @sample {highstock} stock/plotoptions/flags-allowoverlapx\n * Allow sideways overlap\n *\n * @since 6.0.4\n */\n allowOverlapX: false,\n /**\n * The shape of the marker. Can be one of \"flag\", \"circlepin\",\n * \"squarepin\", or an image of the format `url(/path-to-image.jpg)`.\n * Individual shapes can also be set for each point.\n *\n * @sample {highstock} stock/plotoptions/flags/\n * Different shapes\n *\n * @type {Highcharts.FlagsShapeValue}\n * @product highstock\n */\n shape: 'flag',\n /**\n * When multiple flags in the same series fall on the same value, this\n * number determines the vertical offset between them.\n *\n * @sample {highstock} stock/plotoptions/flags-stackdistance/\n * A greater stack distance\n *\n * @product highstock\n */\n stackDistance: 12,\n /**\n * Text alignment for the text inside the flag.\n *\n * @since 5.0.0\n * @product highstock\n * @validvalue [\"left\", \"center\", \"right\"]\n */\n textAlign: 'center',\n /**\n * Specific tooltip options for flag series. Flag series tooltips are\n * different from most other types in that a flag doesn't have a data\n * value, so the tooltip rather displays the `text` option for each\n * point.\n *\n * @extends plotOptions.series.tooltip\n * @excluding changeDecimals, valueDecimals, valuePrefix, valueSuffix\n * @product highstock\n */\n tooltip: {\n pointFormat: '{point.text}'\n },\n /**\n * @type {number|null}\n */\n threshold: null,\n /**\n * The text to display on each flag. This can be defined on series\n * level, or individually for each point. Defaults to `\"A\"`.\n *\n * @type {string}\n * @default A\n * @product highstock\n * @apioption plotOptions.flags.title\n */\n /**\n * The y position of the top left corner of the flag relative to either\n * the series (if onSeries is defined), or the x axis. Defaults to\n * `-30`.\n *\n * @product highstock\n */\n y: -30,\n /**\n * Whether to use HTML to render the flag texts. Using HTML allows for\n * advanced formatting, images and reliable bi-directional text\n * rendering. Note that exported images won't respect the HTML, and that\n * HTML won't respect Z-index settings.\n *\n * @type {boolean}\n * @default false\n * @since 1.3\n * @product highstock\n * @apioption plotOptions.flags.useHTML\n */\n /**\n * Fixed width of the flag's shape. By default, width is autocalculated\n * according to the flag's title.\n *\n * @sample {highstock} stock/demo/flags-shapes/\n * Flags with fixed width\n *\n * @type {number}\n * @product highstock\n * @apioption plotOptions.flags.width\n */\n /**\n * Fixed height of the flag's shape. By default, height is\n * autocalculated according to the flag's title.\n *\n * @type {number}\n * @product highstock\n * @apioption plotOptions.flags.height\n */\n /**\n * The fill color for the flags.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highstock\n */\n fillColor: \"#ffffff\" /* Palette.backgroundColor */,\n /**\n * The color of the line/border of the flag.\n *\n * In styled mode, the stroke is set in the\n * `.highcharts-flag-series.highcharts-point` rule.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default #000000\n * @product highstock\n * @apioption plotOptions.flags.lineColor\n */\n /**\n * The pixel width of the flag's line/border.\n *\n * @product highstock\n */\n lineWidth: 1,\n states: {\n /**\n * @extends plotOptions.column.states.hover\n * @product highstock\n */\n hover: {\n /**\n * The color of the line/border of the flag.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highstock\n */\n lineColor: \"#000000\" /* Palette.neutralColor100 */,\n /**\n * The fill or background color of the flag.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highstock\n */\n fillColor: \"#ccd3ff\" /* Palette.highlightColor20 */\n }\n },\n /**\n * The text styles of the flag.\n *\n * In styled mode, the styles are set in the\n * `.highcharts-flag-series .highcharts-point` rule.\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontSize\": \"11px\", \"fontWeight\": \"bold\"}\n * @product highstock\n */\n style: {\n /** @ignore-option */\n fontSize: '0.7em',\n /** @ignore-option */\n fontWeight: 'bold'\n }\n};\n/**\n * A `flags` series. If the [type](#series.flags.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.flags\n * @excluding animation, borderColor, borderRadius, borderWidth, colorByPoint,\n * connectNulls, cropThreshold, dashStyle, dataGrouping, dataParser,\n * dataURL, gapSize, gapUnit, linecap, lineWidth, marker,\n * pointPadding, pointWidth, step, turboThreshold, useOhlcData\n * @product highstock\n * @apioption series.flags\n */\n/**\n * An array of data points for the series. For the `flags` series type,\n * points can be given in the following ways:\n *\n * 1. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.flags.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * title: \"A\",\n * text: \"First event\"\n * }, {\n * x: 1,\n * title: \"B\",\n * text: \"Second event\"\n * }]\n * ```\n *\n * @type {Array<*>}\n * @extends series.line.data\n * @excluding dataLabels, marker, name, y\n * @product highstock\n * @apioption series.flags.data\n */\n/**\n * The fill color of an individual flag. By default it inherits from\n * the series color.\n *\n * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product highstock\n * @apioption series.flags.data.fillColor\n */\n/**\n * The longer text to be shown in the flag's tooltip.\n *\n * @type {string}\n * @product highstock\n * @apioption series.flags.data.text\n */\n/**\n * The short text to be shown on the flag.\n *\n * @type {string}\n * @product highstock\n * @apioption series.flags.data.title\n */\n''; // Keeps doclets above in transpiled file\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Flags_FlagsSeriesDefaults = (FlagsSeriesDefaults);\n\n;// ./code/es-modules/Series/Flags/FlagsSymbols.js\n/* *\n *\n * Imports\n *\n * */\n\n/* *\n *\n * Composition\n *\n * */\nvar FlagsSymbols;\n(function (FlagsSymbols) {\n /* *\n *\n * Constants\n *\n * */\n const modifiedMembers = [];\n /* *\n *\n * Functions\n *\n * */\n /* eslint-disable valid-jsdoc */\n /**\n * @private\n */\n function compose(SVGRendererClass) {\n if (modifiedMembers.indexOf(SVGRendererClass) === -1) {\n modifiedMembers.push(SVGRendererClass);\n const symbols = SVGRendererClass.prototype.symbols;\n symbols.flag = flag;\n createPinSymbol(symbols, 'circle');\n createPinSymbol(symbols, 'square');\n }\n const RendererClass = Renderer_RendererRegistry.getRendererType();\n // The symbol callbacks are generated on the SVGRenderer object in all\n // browsers.\n if (modifiedMembers.indexOf(RendererClass)) {\n modifiedMembers.push(RendererClass);\n }\n }\n FlagsSymbols.compose = compose;\n /**\n * Create the flag icon with anchor.\n * @private\n */\n function flag(x, y, w, h, options) {\n const anchorX = (options && options.anchorX) || x, anchorY = (options && options.anchorY) || y;\n // To do: unwanted any cast because symbols.circle has wrong type, it\n // actually returns an SVGPathArray\n const path = this.circle(anchorX - 1, anchorY - 1, 2, 2);\n path.push(['M', anchorX, anchorY], ['L', x, y + h], ['L', x, y], ['L', x + w, y], ['L', x + w, y + h], ['L', x, y + h], ['Z']);\n return path;\n }\n /**\n * Create the circlepin and squarepin icons with anchor.\n * @private\n */\n function createPinSymbol(symbols, shape) {\n symbols[(shape + 'pin')] = function (x, y, w, h, options) {\n const anchorX = options && options.anchorX, anchorY = options && options.anchorY;\n let path;\n // For single-letter flags, make sure circular flags are not taller\n // than their width\n if (shape === 'circle' && h > w) {\n x -= Math.round((h - w) / 2);\n w = h;\n }\n path = (symbols[shape])(x, y, w, h, options);\n if (anchorX && anchorY) {\n /**\n * If the label is below the anchor, draw the connecting line\n * from the top edge of the label, otherwise start drawing from\n * the bottom edge\n */\n let labelX = anchorX;\n if (shape === 'circle') {\n labelX = x + w / 2;\n }\n else {\n const startSeg = path[0];\n const endSeg = path[1];\n if (startSeg[0] === 'M' && endSeg[0] === 'L') {\n labelX = (startSeg[1] + endSeg[1]) / 2;\n }\n }\n const labelY = (y > anchorY) ? y : y + h;\n path.push([\n 'M',\n labelX,\n labelY\n ], [\n 'L',\n anchorX,\n anchorY\n ]);\n path = path.concat(symbols.circle(anchorX - 1, anchorY - 1, 2, 2));\n }\n return path;\n };\n }\n})(FlagsSymbols || (FlagsSymbols = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Flags_FlagsSymbols = (FlagsSymbols);\n\n;// ./code/es-modules/Series/OnSeriesComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { composed: OnSeriesComposition_composed } = Core_Globals;\nconst { prototype: columnProto } = Column_ColumnSeries;\n\nconst { prototype: OnSeriesComposition_seriesProto } = Series_Series;\n\nconst { defined: OnSeriesComposition_defined, pushUnique: OnSeriesComposition_pushUnique, stableSort: OnSeriesComposition_stableSort } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\nvar OnSeriesComposition;\n(function (OnSeriesComposition) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n function compose(SeriesClass) {\n if (OnSeriesComposition_pushUnique(OnSeriesComposition_composed, 'OnSeries')) {\n const seriesProto = SeriesClass.prototype;\n seriesProto.getPlotBox = getPlotBox;\n seriesProto.translate = translate;\n }\n return SeriesClass;\n }\n OnSeriesComposition.compose = compose;\n /**\n * Override getPlotBox. If the onSeries option is valid, return the plot box\n * of the onSeries, otherwise proceed as usual.\n *\n * @private\n */\n function getPlotBox(name) {\n return OnSeriesComposition_seriesProto.getPlotBox.call((this.options.onSeries &&\n this.chart.get(this.options.onSeries)) || this, name);\n }\n OnSeriesComposition.getPlotBox = getPlotBox;\n /**\n * Extend the translate method by placing the point on the related series\n *\n * @private\n */\n function translate() {\n columnProto.translate.apply(this);\n const series = this, options = series.options, chart = series.chart, points = series.points, optionsOnSeries = options.onSeries, onSeries = (optionsOnSeries &&\n chart.get(optionsOnSeries)), step = onSeries && onSeries.options.step, onData = (onSeries && onSeries.points), inverted = chart.inverted, xAxis = series.xAxis, yAxis = series.yAxis;\n let cursor = points.length - 1, point, lastPoint, onKey = options.onKey || 'y', i = onData && onData.length, xOffset = 0, leftPoint, lastX, rightPoint, currentDataGrouping, distanceRatio;\n // Relate to a master series\n if (onSeries && onSeries.visible && i) {\n xOffset = (onSeries.pointXOffset || 0) + (onSeries.barW || 0) / 2;\n currentDataGrouping = onSeries.currentDataGrouping;\n lastX = (onData[i - 1].x +\n (currentDataGrouping ? currentDataGrouping.totalRange : 0)); // #2374\n // sort the data points\n OnSeriesComposition_stableSort(points, (a, b) => (a.x - b.x));\n onKey = 'plot' + onKey[0].toUpperCase() + onKey.substr(1);\n while (i-- && points[cursor]) {\n leftPoint = onData[i];\n point = points[cursor];\n point.y = leftPoint.y;\n if (leftPoint.x <= point.x &&\n typeof leftPoint[onKey] !== 'undefined') {\n if (point.x <= lastX) { // #803\n point.plotY = leftPoint[onKey];\n // Interpolate between points, #666\n if (leftPoint.x < point.x &&\n !step) {\n rightPoint = onData[i + 1];\n if (rightPoint &&\n typeof rightPoint[onKey] !== 'undefined') {\n // If the series is spline, calculate Y of the\n // point on the bezier line. #19264\n if (OnSeriesComposition_defined(point.plotX) &&\n onSeries.is('spline')) {\n leftPoint = leftPoint;\n rightPoint = rightPoint;\n const p0 = [\n leftPoint.plotX || 0,\n leftPoint.plotY || 0\n ], p3 = [\n rightPoint.plotX || 0,\n rightPoint.plotY || 0\n ], p1 = (leftPoint.controlPoints?.high ||\n p0), p2 = (rightPoint.controlPoints?.low ||\n p3), pixelThreshold = 0.25, maxIterations = 100, calculateCoord = (t, key) => (\n // The parametric formula for the\n // cubic Bezier curve.\n Math.pow(1 - t, 3) * p0[key] +\n 3 * (1 - t) * (1 - t) * t *\n p1[key] + 3 * (1 - t) * t * t *\n p2[key] + t * t * t * p3[key]);\n let tMin = 0, tMax = 1, t;\n // Find `t` of the parametric function of\n // the bezier curve for the given `plotX`.\n for (let i = 0; i < maxIterations; i++) {\n const tMid = (tMin + tMax) / 2;\n const xMid = calculateCoord(tMid, 0);\n if (xMid === null) {\n break;\n }\n if (Math.abs(xMid - point.plotX) < pixelThreshold) {\n t = tMid;\n break;\n }\n if (xMid < point.plotX) {\n tMin = tMid;\n }\n else {\n tMax = tMid;\n }\n }\n if (OnSeriesComposition_defined(t)) {\n point.plotY =\n calculateCoord(t, 1);\n point.y =\n yAxis.toValue(point.plotY, true);\n }\n }\n else {\n // The distance ratio, between 0 and 1\n distanceRatio =\n (point.x - leftPoint.x) /\n (rightPoint.x - leftPoint.x);\n point.plotY +=\n distanceRatio *\n // The plotY distance\n (rightPoint[onKey] - leftPoint[onKey]);\n point.y +=\n distanceRatio *\n (rightPoint.y - leftPoint.y);\n }\n }\n }\n }\n cursor--;\n i++; // Check again for points in the same x position\n if (cursor < 0) {\n break;\n }\n }\n }\n }\n // Add plotY position and handle stacking\n points.forEach((point, i) => {\n let stackIndex;\n point.plotX += xOffset; // #2049\n // Undefined plotY means the point is either on axis, outside series\n // range or hidden series. If the series is outside the range of the\n // x axis it should fall through with an undefined plotY, but then\n // we must remove the shapeArgs (#847). For inverted charts, we need\n // to calculate position anyway, because series.invertGroups is not\n // defined\n if (typeof point.plotY === 'undefined' || inverted) {\n if (point.plotX >= 0 &&\n point.plotX <= xAxis.len) {\n // We're inside xAxis range\n if (inverted) {\n point.plotY = xAxis.translate(point.x, 0, 1, 0, 1);\n point.plotX = OnSeriesComposition_defined(point.y) ?\n yAxis.translate(point.y, 0, 0, 0, 1) :\n 0;\n }\n else {\n point.plotY = (xAxis.opposite ? 0 : series.yAxis.len) +\n xAxis.offset; // For the windbarb demo\n }\n }\n else {\n point.shapeArgs = {}; // 847\n }\n }\n // If multiple flags appear at the same x, order them into a stack\n lastPoint = points[i - 1];\n if (lastPoint && lastPoint.plotX === point.plotX) {\n if (typeof lastPoint.stackIndex === 'undefined') {\n lastPoint.stackIndex = 0;\n }\n stackIndex = lastPoint.stackIndex + 1;\n }\n point.stackIndex = stackIndex; // #3639\n });\n this.onSeries = onSeries;\n }\n OnSeriesComposition.translate = translate;\n})(OnSeriesComposition || (OnSeriesComposition = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Series_OnSeriesComposition = (OnSeriesComposition);\n\n;// ./code/es-modules/Series/Flags/FlagsSeries.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\n\nconst { noop: FlagsSeries_noop } = Core_Globals;\n\n\nconst { distribute: FlagsSeries_distribute } = Renderer_RendererUtilities;\n\nconst { series: FlagsSeries_Series, seriesTypes: { column: FlagsSeries_ColumnSeries } } = Series_SeriesRegistry;\n\n\nconst { addEvent: FlagsSeries_addEvent, defined: FlagsSeries_defined, extend: FlagsSeries_extend, isNumber: FlagsSeries_isNumber, merge: FlagsSeries_merge, objectEach: FlagsSeries_objectEach, wrap: FlagsSeries_wrap } = Core_Utilities;\n/* *\n *\n * Classes\n *\n * */\n/**\n * The Flags series.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.flags\n *\n * @augments Highcharts.Series\n */\nclass FlagsSeries extends FlagsSeries_ColumnSeries {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Disable animation, but keep clipping (#8546).\n * @private\n */\n animate(init) {\n if (init) {\n this.setClip();\n }\n }\n /**\n * Draw the markers.\n * @private\n */\n drawPoints() {\n const series = this, points = series.points, chart = series.chart, renderer = chart.renderer, inverted = chart.inverted, options = series.options, optionsY = options.y, yAxis = series.yAxis, boxesMap = {}, boxes = [], borderRadius = FlagsSeries_isNumber(options.borderRadius) ?\n options.borderRadius : 0;\n let plotX, plotY, shape, i, point, graphic, stackIndex, anchorY, attribs, outsideRight, centered;\n i = points.length;\n while (i--) {\n point = points[i];\n outsideRight =\n (inverted ? point.plotY : point.plotX) >\n series.xAxis.len;\n plotX = point.plotX;\n stackIndex = point.stackIndex;\n shape = point.options.shape || options.shape;\n plotY = point.plotY;\n if (typeof plotY !== 'undefined') {\n plotY = point.plotY + optionsY -\n (typeof stackIndex !== 'undefined' &&\n (stackIndex * options.stackDistance));\n }\n // Skip connectors for higher level stacked points\n point.anchorX = stackIndex ? void 0 : point.plotX;\n anchorY = stackIndex ? void 0 : point.plotY;\n centered = shape !== 'flag';\n graphic = point.graphic;\n // Only draw the point if y is defined and the flag is within\n // the visible area\n if (typeof plotY !== 'undefined' &&\n plotX >= 0 &&\n !outsideRight) {\n // #15384\n if (graphic && point.hasNewShapeType()) {\n graphic = graphic.destroy();\n }\n // Create the flag\n if (!graphic) {\n graphic = point.graphic = renderer.label('', 0, void 0, shape, void 0, void 0, options.useHTML)\n .addClass('highcharts-point')\n .add(series.markerGroup);\n // Add reference to the point for tracker (#6303)\n if (point.graphic.div) {\n point.graphic.div.point = point;\n }\n graphic.isNew = true;\n }\n graphic.attr({\n align: centered ? 'center' : 'left',\n width: options.width,\n height: options.height,\n 'text-align': options.textAlign,\n r: borderRadius\n });\n if (!chart.styledMode) {\n graphic\n .attr(series.pointAttribs(point))\n .css(FlagsSeries_merge(options.style, point.style))\n .shadow(options.shadow);\n }\n if (plotX > 0) { // #3119\n plotX -= graphic.strokeWidth() % 2; // #4285\n }\n // Plant the flag\n attribs = {\n y: plotY,\n anchorY: anchorY\n };\n if (options.allowOverlapX) {\n attribs.x = plotX;\n attribs.anchorX = point.anchorX;\n }\n graphic.attr({\n // Allow empty string as a flag title (#20549)\n text: point.options.title ?? options.title ?? 'A'\n })[graphic.isNew ? 'attr' : 'animate'](attribs);\n // Rig for the distribute function\n if (!options.allowOverlapX) {\n if (!boxesMap[point.plotX]) {\n boxesMap[point.plotX] = {\n align: centered ? 0.5 : 0,\n size: graphic.width || 0,\n target: plotX,\n anchorX: plotX\n };\n }\n else {\n boxesMap[point.plotX].size = Math.max(boxesMap[point.plotX].size, graphic.width || 0);\n }\n }\n // Set the tooltip anchor position\n point.tooltipPos = [\n plotX,\n plotY + yAxis.pos - chart.plotTop\n ]; // #6327\n }\n else if (graphic) {\n point.graphic = graphic.destroy();\n }\n }\n // Handle X-dimension overlapping\n if (!options.allowOverlapX) {\n let maxDistance = 100;\n FlagsSeries_objectEach(boxesMap, function (box) {\n box.plotX = box.anchorX;\n boxes.push(box);\n maxDistance = Math.max(box.size, maxDistance);\n });\n // If necessary (for overlapping or long labels) distribute it\n // depending on the label width or a hardcoded value, #16041.\n FlagsSeries_distribute(boxes, inverted ? yAxis.len : this.xAxis.len, maxDistance);\n for (const point of points) {\n const plotX = point.plotX, graphic = point.graphic, box = graphic && boxesMap[plotX];\n if (box && graphic) {\n // Hide flag when its box position is not specified\n // (#8573, #9299)\n if (!FlagsSeries_defined(box.pos)) {\n graphic.hide().isNew = true;\n }\n else {\n graphic[graphic.isNew ? 'attr' : 'animate']({\n x: box.pos + (box.align || 0) * box.size,\n anchorX: point.anchorX\n }).show().isNew = false;\n }\n }\n }\n }\n // Can be a mix of SVG and HTML and we need events for both (#6303)\n if (options.useHTML && series.markerGroup) {\n FlagsSeries_wrap(series.markerGroup, 'on', function (proceed) {\n return SVG_SVGElement.prototype.on.apply(\n // For HTML\n // eslint-disable-next-line no-invalid-this\n proceed.apply(this, [].slice.call(arguments, 1)), \n // And for SVG\n [].slice.call(arguments, 1));\n });\n }\n }\n /**\n * Extend the column trackers with listeners to expand and contract\n * stacks.\n * @private\n */\n drawTracker() {\n const series = this, points = series.points;\n super.drawTracker();\n /* *\n * Bring each stacked flag up on mouse over, this allows readability\n * of vertically stacked elements as well as tight points on the x\n * axis. #1924.\n */\n for (const point of points) {\n const graphic = point.graphic;\n if (graphic) {\n if (point.unbindMouseOver) {\n point.unbindMouseOver();\n }\n point.unbindMouseOver = FlagsSeries_addEvent(graphic.element, 'mouseover', function () {\n // Raise this point\n if (point.stackIndex > 0 &&\n !point.raised) {\n point._y = graphic.y;\n graphic.attr({\n y: point._y - 8\n });\n point.raised = true;\n }\n // Revert other raised points\n for (const otherPoint of points) {\n if (otherPoint !== point &&\n otherPoint.raised &&\n otherPoint.graphic) {\n otherPoint.graphic.attr({\n y: otherPoint._y\n });\n otherPoint.raised = false;\n }\n }\n });\n }\n }\n }\n /**\n * Get presentational attributes\n * @private\n */\n pointAttribs(point, state) {\n const options = this.options, color = (point && point.color) || this.color;\n let lineColor = options.lineColor, lineWidth = (point && point.lineWidth), fill = (point && point.fillColor) || options.fillColor;\n if (state) {\n fill = options.states[state].fillColor;\n lineColor = options.states[state].lineColor;\n lineWidth = options.states[state].lineWidth;\n }\n return {\n fill: fill || color,\n stroke: lineColor || color,\n 'stroke-width': lineWidth || options.lineWidth || 0\n };\n }\n /**\n * @private\n */\n setClip() {\n FlagsSeries_Series.prototype.setClip.apply(this, arguments);\n if (this.options.clip !== false &&\n this.sharedClipKey &&\n this.markerGroup) {\n this.markerGroup.clip(this.chart.sharedClips[this.sharedClipKey]);\n }\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nFlagsSeries.compose = Flags_FlagsSymbols.compose;\nFlagsSeries.defaultOptions = FlagsSeries_merge(FlagsSeries_ColumnSeries.defaultOptions, Flags_FlagsSeriesDefaults);\nSeries_OnSeriesComposition.compose(FlagsSeries);\nFlagsSeries_extend(FlagsSeries.prototype, {\n allowDG: false,\n forceCrop: true,\n invertible: false, // Flags series group should not be invertible (#14063).\n noSharedTooltip: true,\n pointClass: Flags_FlagsPoint,\n sorted: false,\n takeOrdinalPosition: false, // #1074\n trackerGroups: ['markerGroup'],\n buildKDTree: FlagsSeries_noop,\n /**\n * Inherit the initialization from base Series.\n * @private\n */\n init: FlagsSeries_Series.prototype.init\n});\nSeries_SeriesRegistry.registerSeriesType('flags', FlagsSeries);\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Flags_FlagsSeries = (FlagsSeries);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @typedef {\"circlepin\"|\"flag\"|\"squarepin\"} Highcharts.FlagsShapeValue\n */\n''; // Detach doclets above\n\n;// ./code/es-modules/Core/Axis/BrokenAxis.js\n/* *\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { addEvent: BrokenAxis_addEvent, find: BrokenAxis_find, fireEvent: BrokenAxis_fireEvent, isArray: BrokenAxis_isArray, isNumber: BrokenAxis_isNumber, pick: BrokenAxis_pick } = Core_Utilities;\n/* *\n *\n * Composition\n *\n * */\n/**\n * Axis with support of broken data rows.\n * @private\n */\nvar BrokenAxis;\n(function (BrokenAxis) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Adds support for broken axes.\n * @private\n */\n function compose(AxisClass, SeriesClass) {\n if (!AxisClass.keepProps.includes('brokenAxis')) {\n AxisClass.keepProps.push('brokenAxis');\n BrokenAxis_addEvent(AxisClass, 'init', onAxisInit);\n BrokenAxis_addEvent(AxisClass, 'afterInit', onAxisAfterInit);\n BrokenAxis_addEvent(AxisClass, 'afterSetTickPositions', onAxisAfterSetTickPositions);\n BrokenAxis_addEvent(AxisClass, 'afterSetOptions', onAxisAfterSetOptions);\n const seriesProto = SeriesClass.prototype;\n seriesProto.drawBreaks = seriesDrawBreaks;\n seriesProto.gappedPath = seriesGappedPath;\n BrokenAxis_addEvent(SeriesClass, 'afterGeneratePoints', onSeriesAfterGeneratePoints);\n BrokenAxis_addEvent(SeriesClass, 'afterRender', onSeriesAfterRender);\n }\n return AxisClass;\n }\n BrokenAxis.compose = compose;\n /**\n * @private\n */\n function onAxisAfterInit() {\n if (typeof this.brokenAxis !== 'undefined') {\n this.brokenAxis.setBreaks(this.options.breaks, false);\n }\n }\n /**\n * Force Axis to be not-ordinal when breaks are defined.\n * @private\n */\n function onAxisAfterSetOptions() {\n const axis = this;\n if (axis.brokenAxis?.hasBreaks) {\n axis.options.ordinal = false;\n }\n }\n /**\n * @private\n */\n function onAxisAfterSetTickPositions() {\n const axis = this, brokenAxis = axis.brokenAxis;\n if (brokenAxis?.hasBreaks) {\n const tickPositions = axis.tickPositions, info = axis.tickPositions.info, newPositions = [];\n for (let i = 0; i < tickPositions.length; i++) {\n if (!brokenAxis.isInAnyBreak(tickPositions[i])) {\n newPositions.push(tickPositions[i]);\n }\n }\n axis.tickPositions = newPositions;\n axis.tickPositions.info = info;\n }\n }\n /**\n * @private\n */\n function onAxisInit() {\n const axis = this;\n if (!axis.brokenAxis) {\n axis.brokenAxis = new Additions(axis);\n }\n }\n /**\n * @private\n */\n function onSeriesAfterGeneratePoints() {\n const { isDirty, options: { connectNulls }, points, xAxis, yAxis } = this;\n // Set, or reset visibility of the points. Axis.setBreaks marks\n // the series as isDirty\n if (isDirty) {\n let i = points.length;\n while (i--) {\n const point = points[i];\n // Respect nulls inside the break (#4275)\n const nullGap = point.y === null && connectNulls === false;\n const isPointInBreak = (!nullGap && (xAxis?.brokenAxis?.isInAnyBreak(point.x, true) ||\n yAxis?.brokenAxis?.isInAnyBreak(point.y, true)));\n // Set point.visible if in any break.\n // If not in break, reset visible to original value.\n point.visible = isPointInBreak ?\n false :\n point.options.visible !== false;\n }\n }\n }\n /**\n * @private\n */\n function onSeriesAfterRender() {\n this.drawBreaks(this.xAxis, ['x']);\n this.drawBreaks(this.yAxis, BrokenAxis_pick(this.pointArrayMap, ['y']));\n }\n /**\n * @private\n */\n function seriesDrawBreaks(axis, keys) {\n const series = this, points = series.points;\n let breaks, threshold, y;\n if (axis?.brokenAxis?.hasBreaks) {\n const brokenAxis = axis.brokenAxis;\n keys.forEach(function (key) {\n breaks = brokenAxis?.breakArray || [];\n threshold = axis.isXAxis ?\n axis.min :\n BrokenAxis_pick(series.options.threshold, axis.min);\n // Array of breaks that have been \"zoomed-out\" which means that\n // they were shown previously, but now after zoom, they are not\n // (#19885).\n const breaksOutOfRange = axis?.options?.breaks?.filter(function (brk) {\n let isOut = true;\n // Iterate to see if \"brk\" is in axis range\n for (let i = 0; i < breaks.length; i++) {\n const otherBreak = breaks[i];\n if (otherBreak.from === brk.from &&\n otherBreak.to === brk.to) {\n isOut = false;\n break;\n }\n }\n return isOut;\n });\n points.forEach(function (point) {\n y = BrokenAxis_pick(point['stack' + key.toUpperCase()], point[key]);\n breaks.forEach(function (brk) {\n if (BrokenAxis_isNumber(threshold) && BrokenAxis_isNumber(y)) {\n let eventName = '';\n if ((threshold < brk.from && y > brk.to) ||\n (threshold > brk.from && y < brk.from)) {\n eventName = 'pointBreak';\n }\n else if ((threshold < brk.from &&\n y > brk.from &&\n y < brk.to) || (threshold > brk.from &&\n y > brk.to &&\n y < brk.from)) {\n eventName = 'pointInBreak';\n }\n if (eventName) {\n BrokenAxis_fireEvent(axis, eventName, { point, brk });\n }\n }\n });\n breaksOutOfRange?.forEach(function (brk) {\n BrokenAxis_fireEvent(axis, 'pointOutsideOfBreak', { point, brk });\n });\n });\n });\n }\n }\n /**\n * Extend getGraphPath by identifying gaps in the data so that we\n * can draw a gap in the line or area. This was moved from ordinal\n * axis module to broken axis module as of #5045.\n *\n * @private\n * @function Highcharts.Series#gappedPath\n *\n * @return {Highcharts.SVGPathArray}\n * Gapped path\n */\n function seriesGappedPath() {\n const currentDataGrouping = this.currentDataGrouping, groupingSize = currentDataGrouping?.gapSize, points = this.points.slice(), yAxis = this.yAxis;\n let gapSize = this.options.gapSize, i = points.length - 1, stack;\n /**\n * Defines when to display a gap in the graph, together with the\n * [gapUnit](plotOptions.series.gapUnit) option.\n *\n * In case when `dataGrouping` is enabled, points can be grouped\n * into a larger time span. This can make the grouped points to\n * have a greater distance than the absolute value of `gapSize`\n * property, which will result in disappearing graph completely.\n * To prevent this situation the mentioned distance between\n * grouped points is used instead of previously defined\n * `gapSize`.\n *\n * In practice, this option is most often used to visualize gaps\n * in time series. In a stock chart, intraday data is available\n * for daytime hours, while gaps will appear in nights and\n * weekends.\n *\n * @see [gapUnit](plotOptions.series.gapUnit)\n * @see [xAxis.breaks](#xAxis.breaks)\n *\n * @sample {highstock} stock/plotoptions/series-gapsize/\n * Setting the gap size to 2 introduces gaps for weekends in\n * daily datasets.\n *\n * @type {number}\n * @default 0\n * @product highstock\n * @requires modules/broken-axis\n * @apioption plotOptions.series.gapSize\n */\n /**\n * Together with [gapSize](plotOptions.series.gapSize), this\n * option defines where to draw gaps in the graph.\n *\n * When the `gapUnit` is `\"relative\"` (default), a gap size of 5\n * means that if the distance between two points is greater than\n * 5 times that of the two closest points, the graph will be\n * broken.\n *\n * When the `gapUnit` is `\"value\"`, the gap is based on absolute\n * axis values, which on a datetime axis is milliseconds. This\n * also applies to the navigator series that inherits gap\n * options from the base series.\n *\n * @see [gapSize](plotOptions.series.gapSize)\n *\n * @type {string}\n * @default relative\n * @since 5.0.13\n * @product highstock\n * @validvalue [\"relative\", \"value\"]\n * @requires modules/broken-axis\n * @apioption plotOptions.series.gapUnit\n */\n if (gapSize && i > 0) { // #5008\n // Gap unit is relative\n if (this.options.gapUnit !== 'value') {\n gapSize *= this.basePointRange;\n }\n // Setting a new gapSize in case dataGrouping is enabled\n // (#7686)\n if (groupingSize &&\n groupingSize > gapSize &&\n // Except when DG is forced (e.g. from other series)\n // and has lower granularity than actual points (#11351)\n groupingSize >= this.basePointRange) {\n gapSize = groupingSize;\n }\n // Extension for ordinal breaks\n let current, next;\n while (i--) {\n // Reassign next if it is not visible\n if (!(next && next.visible !== false)) {\n next = points[i + 1];\n }\n current = points[i];\n // Skip iteration if one of the points is not visible\n if (next.visible === false || current.visible === false) {\n continue;\n }\n if (next.x - current.x > gapSize) {\n const xRange = (current.x + next.x) / 2;\n points.splice(// Insert after this one\n i + 1, 0, {\n isNull: true,\n x: xRange\n });\n // For stacked chart generate empty stack items, #6546\n if (yAxis.stacking && this.options.stacking) {\n stack = yAxis.stacking.stacks[this.stackKey][xRange] = new Stacking_StackItem(yAxis, yAxis.options.stackLabels, false, xRange, this.stack);\n stack.total = 0;\n }\n }\n // Assign current to next for the upcoming iteration\n next = current;\n }\n }\n // Call base method\n return this.getGraphPath(points);\n }\n /* *\n *\n * Class\n *\n * */\n /**\n * Provides support for broken axes.\n * @private\n * @class\n */\n class Additions {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * @private\n */\n static isInBreak(brk, val) {\n const repeat = brk.repeat || Infinity, from = brk.from, length = brk.to - brk.from, test = (val >= from ?\n (val - from) % repeat :\n repeat - ((from - val) % repeat));\n let ret;\n if (!brk.inclusive) {\n ret = test < length && test !== 0;\n }\n else {\n ret = test <= length;\n }\n return ret;\n }\n /**\n * @private\n */\n static lin2Val(val) {\n const axis = this;\n const brokenAxis = axis.brokenAxis;\n const breakArray = brokenAxis && brokenAxis.breakArray;\n if (!breakArray || !BrokenAxis_isNumber(val)) {\n return val;\n }\n let nval = val, brk, i;\n for (i = 0; i < breakArray.length; i++) {\n brk = breakArray[i];\n if (brk.from >= nval) {\n break;\n }\n else if (brk.to < nval) {\n nval += brk.len;\n }\n else if (Additions.isInBreak(brk, nval)) {\n nval += brk.len;\n }\n }\n return nval;\n }\n /**\n * @private\n */\n static val2Lin(val) {\n const axis = this;\n const brokenAxis = axis.brokenAxis;\n const breakArray = brokenAxis && brokenAxis.breakArray;\n if (!breakArray || !BrokenAxis_isNumber(val)) {\n return val;\n }\n let nval = val, brk, i;\n for (i = 0; i < breakArray.length; i++) {\n brk = breakArray[i];\n if (brk.to <= val) {\n nval -= brk.len;\n }\n else if (brk.from >= val) {\n break;\n }\n else if (Additions.isInBreak(brk, val)) {\n nval -= (val - brk.from);\n break;\n }\n }\n return nval;\n }\n /* *\n *\n * Constructors\n *\n * */\n constructor(axis) {\n this.hasBreaks = false;\n this.axis = axis;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Returns the first break found where the x is larger then break.from\n * and smaller then break.to.\n *\n * @param {number} x\n * The number which should be within a break.\n *\n * @param {Array} breaks\n * The array of breaks to search within.\n *\n * @return {Highcharts.XAxisBreaksOptions|undefined}\n * Returns the first break found that matches, returns false if no break\n * is found.\n */\n findBreakAt(x, breaks) {\n return BrokenAxis_find(breaks, function (b) {\n return b.from < x && x < b.to;\n });\n }\n /**\n * @private\n */\n isInAnyBreak(val, testKeep) {\n const brokenAxis = this, axis = brokenAxis.axis, breaks = axis.options.breaks || [];\n let i = breaks.length, inbrk, keep, ret;\n if (i && BrokenAxis_isNumber(val)) {\n while (i--) {\n if (Additions.isInBreak(breaks[i], val)) {\n inbrk = true;\n if (!keep) {\n keep = BrokenAxis_pick(breaks[i].showPoints, !axis.isXAxis);\n }\n }\n }\n if (inbrk && testKeep) {\n ret = inbrk && !keep;\n }\n else {\n ret = inbrk;\n }\n }\n return ret;\n }\n /**\n * Dynamically set or unset breaks in an axis. This function in lighter\n * than using Axis.update, and it also preserves animation.\n *\n * @private\n * @function Highcharts.Axis#setBreaks\n *\n * @param {Array} [breaks]\n * The breaks to add. When `undefined` it removes existing breaks.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart immediately.\n */\n setBreaks(breaks, redraw) {\n const brokenAxis = this, axis = brokenAxis.axis, time = axis.chart.time, hasBreaks = BrokenAxis_isArray(breaks) &&\n !!breaks.length &&\n !!Object.keys(breaks[0]).length; // Check for [{}], #16368.\n axis.isDirty = brokenAxis.hasBreaks !== hasBreaks;\n brokenAxis.hasBreaks = hasBreaks;\n // Compile string dates\n breaks?.forEach((brk) => {\n brk.from = time.parse(brk.from) || 0;\n brk.to = time.parse(brk.to) || 0;\n });\n if (breaks !== axis.options.breaks) {\n axis.options.breaks = axis.userOptions.breaks = breaks;\n }\n axis.forceRedraw = true; // Force recalculation in setScale\n // Recalculate series related to the axis.\n axis.series.forEach(function (series) {\n series.isDirty = true;\n });\n if (!hasBreaks && axis.val2lin === Additions.val2Lin) {\n // Revert to prototype functions\n delete axis.val2lin;\n delete axis.lin2val;\n }\n if (hasBreaks) {\n axis.userOptions.ordinal = false;\n axis.lin2val = Additions.lin2Val;\n axis.val2lin = Additions.val2Lin;\n axis.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {\n // If trying to set extremes inside a break, extend min to\n // after, and max to before the break ( #3857 )\n if (brokenAxis.hasBreaks) {\n const breaks = (this.options.breaks || []);\n let axisBreak;\n while ((axisBreak = brokenAxis.findBreakAt(newMin, breaks))) {\n newMin = axisBreak.to;\n }\n while ((axisBreak = brokenAxis.findBreakAt(newMax, breaks))) {\n newMax = axisBreak.from;\n }\n // If both min and max is within the same break.\n if (newMax < newMin) {\n newMax = newMin;\n }\n }\n axis.constructor.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);\n };\n axis.setAxisTranslation = function () {\n axis.constructor.prototype.setAxisTranslation.call(this);\n brokenAxis.unitLength = void 0;\n if (brokenAxis.hasBreaks) {\n const breaks = axis.options.breaks || [], \n // Temporary one:\n breakArrayT = [], breakArray = [], pointRangePadding = BrokenAxis_pick(axis.pointRangePadding, 0);\n let length = 0, inBrk, repeat, min = axis.userMin || axis.min, max = axis.userMax || axis.max, start, i;\n // Min & max check (#4247)\n breaks.forEach(function (brk) {\n repeat = brk.repeat || Infinity;\n if (BrokenAxis_isNumber(min) && BrokenAxis_isNumber(max)) {\n if (Additions.isInBreak(brk, min)) {\n min += ((brk.to % repeat) -\n (min % repeat));\n }\n if (Additions.isInBreak(brk, max)) {\n max -= ((max % repeat) -\n (brk.from % repeat));\n }\n }\n });\n // Construct an array holding all breaks in the axis\n breaks.forEach(function (brk) {\n start = brk.from;\n repeat = brk.repeat || Infinity;\n if (BrokenAxis_isNumber(min) && BrokenAxis_isNumber(max)) {\n while (start - repeat > min) {\n start -= repeat;\n }\n while (start < min) {\n start += repeat;\n }\n for (i = start; i < max; i += repeat) {\n breakArrayT.push({\n value: i,\n move: 'in'\n });\n breakArrayT.push({\n value: i + brk.to - brk.from,\n move: 'out',\n size: brk.breakSize\n });\n }\n }\n });\n breakArrayT.sort(function (a, b) {\n return ((a.value === b.value) ?\n ((a.move === 'in' ? 0 : 1) -\n (b.move === 'in' ? 0 : 1)) :\n a.value - b.value);\n });\n // Simplify the breaks\n inBrk = 0;\n start = min;\n breakArrayT.forEach(function (brk) {\n inBrk += (brk.move === 'in' ? 1 : -1);\n if (inBrk === 1 && brk.move === 'in') {\n start = brk.value;\n }\n if (inBrk === 0 && BrokenAxis_isNumber(start)) {\n breakArray.push({\n from: start,\n to: brk.value,\n len: brk.value - start - (brk.size || 0)\n });\n length += (brk.value -\n start -\n (brk.size || 0));\n }\n });\n brokenAxis.breakArray = breakArray;\n // Used with staticScale, and below the actual axis\n // length, when breaks are subtracted.\n if (BrokenAxis_isNumber(min) &&\n BrokenAxis_isNumber(max) &&\n BrokenAxis_isNumber(axis.min)) {\n brokenAxis.unitLength = max - min - length +\n pointRangePadding;\n BrokenAxis_fireEvent(axis, 'afterBreaks');\n if (axis.staticScale) {\n axis.transA = axis.staticScale;\n }\n else if (brokenAxis.unitLength) {\n axis.transA *=\n (max - axis.min + pointRangePadding) /\n brokenAxis.unitLength;\n }\n if (pointRangePadding) {\n axis.minPixelPadding =\n axis.transA * (axis.minPointOffset || 0);\n }\n axis.min = min;\n axis.max = max;\n }\n }\n };\n }\n if (BrokenAxis_pick(redraw, true)) {\n axis.chart.redraw();\n }\n }\n }\n BrokenAxis.Additions = Additions;\n})(BrokenAxis || (BrokenAxis = {}));\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const Axis_BrokenAxis = (BrokenAxis);\n\n;// ./code/es-modules/masters/modules/broken-axis.src.js\n/**\n * @license Highcharts JS v12.1.1 (2024-12-20)\n * @module highcharts/modules/broken-axis\n * @requires highcharts\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n\n\nconst broken_axis_src_G = Core_Globals;\nbroken_axis_src_G.BrokenAxis = broken_axis_src_G.BrokenAxis || Axis_BrokenAxis;\nbroken_axis_src_G.BrokenAxis.compose(broken_axis_src_G.Axis, broken_axis_src_G.Series);\n/* harmony default export */ const broken_axis_src = ((/* unused pure expression or super */ null && (Highcharts)));\n\n;// ./code/es-modules/Extensions/DataGrouping/ApproximationRegistry.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Constants\n *\n * */\n/**\n * Define the available approximation types. The data grouping\n * approximations takes an array or numbers as the first parameter. In case\n * of ohlc, four arrays are sent in as four parameters. Each array consists\n * only of numbers. In case null values belong to the group, the property\n * .hasNulls will be set to true on the array.\n *\n * @product highstock\n *\n * @private\n */\nconst ApproximationRegistry = {\n// Approximations added programmatically\n};\n/* *\n *\n * Default Export\n *\n * */\n/* harmony default export */ const DataGrouping_ApproximationRegistry = (ApproximationRegistry);\n\n;// ./code/es-modules/Extensions/DataGrouping/ApproximationDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { arrayMax: ApproximationDefaults_arrayMax, arrayMin: ApproximationDefaults_arrayMin, correctFloat: ApproximationDefaults_correctFloat, extend: ApproximationDefaults_extend, isNumber: ApproximationDefaults_isNumber } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction average(arr) {\n const len = arr.length;\n let ret = sum(arr);\n // If we have a number, return it divided by the length. If not,\n // return null or undefined based on what the sum method finds.\n if (ApproximationDefaults_isNumber(ret) && len) {\n ret = ApproximationDefaults_correctFloat(ret / len);\n }\n return ret;\n}\n/**\n * The same as average, but for series with multiple values, like area ranges.\n * @private\n */\nfunction averages() {\n const ret = [];\n [].forEach.call(arguments, function (arr) {\n ret.push(average(arr));\n });\n // Return undefined when first elem. is undefined and let\n // sum method handle null (#7377)\n return typeof ret[0] === 'undefined' ? void 0 : ret;\n}\n/**\n * @private\n */\nfunction ApproximationDefaults_close(arr) {\n return arr.length ?\n arr[arr.length - 1] :\n (arr.hasNulls ? null : void 0);\n}\n/**\n * @private\n */\nfunction high(arr) {\n return arr.length ?\n ApproximationDefaults_arrayMax(arr) :\n (arr.hasNulls ? null : void 0);\n}\n/**\n * HLC, OHLC and range are special cases where a multidimensional array is input\n * and an array is output.\n * @private\n */\nfunction hlc(high, low, close) {\n high = DataGrouping_ApproximationRegistry.high(high);\n low = DataGrouping_ApproximationRegistry.low(low);\n close = DataGrouping_ApproximationRegistry.close(close);\n if (ApproximationDefaults_isNumber(high) ||\n ApproximationDefaults_isNumber(low) ||\n ApproximationDefaults_isNumber(close)) {\n return [high, low, close];\n }\n}\n/**\n * @private\n */\nfunction low(arr) {\n return arr.length ?\n ApproximationDefaults_arrayMin(arr) :\n (arr.hasNulls ? null : void 0);\n}\n/**\n * @private\n */\nfunction ohlc(open, high, low, close) {\n open = DataGrouping_ApproximationRegistry.open(open);\n high = DataGrouping_ApproximationRegistry.high(high);\n low = DataGrouping_ApproximationRegistry.low(low);\n close = DataGrouping_ApproximationRegistry.close(close);\n if (ApproximationDefaults_isNumber(open) ||\n ApproximationDefaults_isNumber(high) ||\n ApproximationDefaults_isNumber(low) ||\n ApproximationDefaults_isNumber(close)) {\n return [open, high, low, close];\n }\n}\n/**\n * @private\n */\nfunction ApproximationDefaults_open(arr) {\n return arr.length ? arr[0] : (arr.hasNulls ? null : void 0);\n}\n/**\n * @private\n */\nfunction range(low, high) {\n low = DataGrouping_ApproximationRegistry.low(low);\n high = DataGrouping_ApproximationRegistry.high(high);\n if (ApproximationDefaults_isNumber(low) || ApproximationDefaults_isNumber(high)) {\n return [low, high];\n }\n if (low === null && high === null) {\n return null;\n }\n // Else, return is undefined\n}\n/**\n * @private\n */\nfunction sum(arr) {\n let len = arr.length, ret;\n // 1. it consists of nulls exclusive\n if (!len && arr.hasNulls) {\n ret = null;\n // 2. it has a length and real values\n }\n else if (len) {\n ret = 0;\n while (len--) {\n ret += arr[len];\n }\n }\n // 3. it has zero length, so just return undefined\n // => doNothing()\n return ret;\n}\n/* *\n *\n * Default Export\n *\n * */\nconst ApproximationDefaults = {\n average,\n averages,\n close: ApproximationDefaults_close,\n high,\n hlc,\n low,\n ohlc,\n open: ApproximationDefaults_open,\n range,\n sum\n};\nApproximationDefaults_extend(DataGrouping_ApproximationRegistry, ApproximationDefaults);\n/* harmony default export */ const DataGrouping_ApproximationDefaults = (ApproximationDefaults);\n\n;// ./code/es-modules/Extensions/DataGrouping/DataGroupingDefaults.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n * Constants\n *\n * */\n/**\n * Common options\n * @private\n */\nconst common = {\n /// enabled: null, // (true for stock charts, false for basic),\n // forced: undefined,\n groupPixelWidth: 2,\n // The first one is the point or start value, the second is the start\n // value if we're dealing with range, the third one is the end value if\n // dealing with a range\n dateTimeLabelFormats: {\n millisecond: [\n '%[AebHMSL]',\n '%[AebHMSL]',\n '-%[HMSL]'\n ],\n second: [\n '%[AebHMS]',\n '%[AebHMS]',\n '-%[HMS]'\n ],\n minute: [\n '%[AebHM]',\n '%[AebHM]',\n '-%[HM]'\n ],\n hour: [\n '%[AebHM]',\n '%[AebHM]',\n '-%[HM]'\n ],\n day: [\n '%[AebY]',\n '%[Aeb]',\n '-%[AebY]'\n ],\n week: [\n 'week from %[AebY]',\n '%[Aeb]',\n '-%[AebY]'\n ],\n month: [\n '%[BY]',\n '%[B]',\n '-%[BY]'\n ],\n year: [\n '%Y',\n '%Y',\n '-%Y'\n ]\n }\n /// smoothed = false, // enable this for navigator series only\n};\n/**\n * Extends common options\n * @private\n */\nconst seriesSpecific = {\n line: {},\n spline: {},\n area: {},\n areaspline: {},\n arearange: {},\n column: {\n groupPixelWidth: 10\n },\n columnrange: {\n groupPixelWidth: 10\n },\n candlestick: {\n groupPixelWidth: 10\n },\n ohlc: {\n groupPixelWidth: 5\n },\n hlc: {\n groupPixelWidth: 5\n // Move to HeikinAshiSeries.ts after refactoring data grouping.\n },\n heikinashi: {\n groupPixelWidth: 10\n }\n};\n/**\n * Units are defined in a separate array to allow complete overriding in\n * case of a user option.\n * @private\n */\nconst units = [\n [\n 'millisecond', // Unit name\n [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // Allowed multiples\n ], [\n 'second',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'minute',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'hour',\n [1, 2, 3, 4, 6, 8, 12]\n ], [\n 'day',\n [1]\n ], [\n 'week',\n [1]\n ], [\n 'month',\n [1, 3, 6]\n ], [\n 'year',\n null\n ]\n];\n/* *\n *\n * Default Export\n *\n * */\nconst DataGroupingDefaults = {\n common,\n seriesSpecific,\n units\n};\n/* harmony default export */ const DataGrouping_DataGroupingDefaults = (DataGroupingDefaults);\n\n;// ./code/es-modules/Extensions/DataGrouping/DataGroupingAxisComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\nconst { addEvent: DataGroupingAxisComposition_addEvent, extend: DataGroupingAxisComposition_extend, merge: DataGroupingAxisComposition_merge, pick: DataGroupingAxisComposition_pick } = Core_Utilities;\n/* *\n *\n * Variables\n *\n * */\nlet AxisConstructor;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Check the groupPixelWidth and apply the grouping if needed.\n * Fired only after processing the data.\n *\n * @product highstock\n *\n * @function Highcharts.Axis#applyGrouping\n */\nfunction applyGrouping(e) {\n const axis = this, series = axis.series;\n // Reset the groupPixelWidth for all series, #17141.\n series.forEach(function (series) {\n series.groupPixelWidth = void 0; // #2110\n });\n series.forEach(function (series) {\n series.groupPixelWidth = (axis.getGroupPixelWidth &&\n axis.getGroupPixelWidth());\n if (series.groupPixelWidth) {\n series.hasProcessed = true; // #2692\n }\n // Fire independing on series.groupPixelWidth to always set a proper\n // dataGrouping state, (#16238)\n series.applyGrouping(!!e.hasExtremesChanged);\n });\n}\n/**\n * @private\n */\nfunction DataGroupingAxisComposition_compose(AxisClass) {\n AxisConstructor = AxisClass;\n const axisProto = AxisClass.prototype;\n if (!axisProto.applyGrouping) {\n DataGroupingAxisComposition_addEvent(AxisClass, 'afterSetScale', onAfterSetScale);\n // When all series are processed, calculate the group pixel width and\n // then if this value is different than zero apply groupings.\n DataGroupingAxisComposition_addEvent(AxisClass, 'postProcessData', applyGrouping);\n DataGroupingAxisComposition_extend(axisProto, {\n applyGrouping,\n getGroupPixelWidth,\n setDataGrouping\n });\n }\n}\n/**\n * Get the data grouping pixel width based on the greatest defined individual\n * width of the axis' series, and if whether one of the axes need grouping.\n * @private\n */\nfunction getGroupPixelWidth() {\n const series = this.series;\n let i = series.length, groupPixelWidth = 0, doGrouping = false, dataLength, dgOptions;\n // If one of the series needs grouping, apply it to all (#1634)\n while (i--) {\n dgOptions = series[i].options.dataGrouping;\n if (dgOptions) { // #2692\n // If multiple series are compared on the same x axis, give them the\n // same group pixel width (#334)\n groupPixelWidth = Math.max(groupPixelWidth, \n // Fallback to commonOptions (#9693)\n DataGroupingAxisComposition_pick(dgOptions.groupPixelWidth, DataGrouping_DataGroupingDefaults.common.groupPixelWidth));\n dataLength = (series[i].dataTable.modified ||\n series[i].dataTable).rowCount;\n // Execute grouping if the amount of points is greater than the\n // limit defined in groupPixelWidth\n if (series[i].groupPixelWidth ||\n (dataLength >\n (this.chart.plotSizeX / groupPixelWidth)) ||\n (dataLength && dgOptions.forced)) {\n doGrouping = true;\n }\n }\n }\n return doGrouping ? groupPixelWidth : 0;\n}\n/**\n * When resetting the scale reset the hasProcessed flag to avoid taking\n * previous data grouping of neighbour series into account when determining\n * group pixel width (#2692).\n * @private\n */\nfunction onAfterSetScale() {\n this.series.forEach(function (series) {\n series.hasProcessed = false;\n });\n}\n/**\n * Highcharts Stock only. Force data grouping on all the axis' series.\n *\n * @product highstock\n *\n * @function Highcharts.Axis#setDataGrouping\n *\n * @param {boolean|Highcharts.DataGroupingOptionsObject} [dataGrouping]\n * A `dataGrouping` configuration. Use `false` to disable data grouping\n * dynamically.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or wait for a later call to\n * {@link Chart#redraw}.\n */\nfunction setDataGrouping(dataGrouping, redraw) {\n const axis = this;\n let i;\n redraw = DataGroupingAxisComposition_pick(redraw, true);\n if (!dataGrouping) {\n dataGrouping = {\n forced: false,\n units: null\n };\n }\n // Axis is instantiated, update all series\n if (this instanceof AxisConstructor) {\n i = this.series.length;\n while (i--) {\n this.series[i].update({\n dataGrouping: dataGrouping\n }, false);\n }\n // Axis not yet instantiated, alter series options\n }\n else {\n this.chart.options.series.forEach(function (seriesOptions) {\n // Merging dataGrouping options with already defined options #16759\n seriesOptions.dataGrouping = typeof dataGrouping === 'boolean' ?\n dataGrouping :\n DataGroupingAxisComposition_merge(dataGrouping, seriesOptions.dataGrouping);\n });\n }\n // Clear ordinal slope, so we won't accidentally use the old one (#7827)\n if (axis.ordinal) {\n axis.ordinal.slope = void 0;\n }\n if (redraw) {\n this.chart.redraw();\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst DataGroupingAxisComposition = {\n compose: DataGroupingAxisComposition_compose\n};\n/* harmony default export */ const DataGrouping_DataGroupingAxisComposition = (DataGroupingAxisComposition);\n\n;// ./code/es-modules/Extensions/DataGrouping/DataGroupingSeriesComposition.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\n\n\n\nconst { series: { prototype: DataGroupingSeriesComposition_seriesProto } } = Series_SeriesRegistry;\n\nconst { addEvent: DataGroupingSeriesComposition_addEvent, defined: DataGroupingSeriesComposition_defined, error: DataGroupingSeriesComposition_error, extend: DataGroupingSeriesComposition_extend, isNumber: DataGroupingSeriesComposition_isNumber, merge: DataGroupingSeriesComposition_merge, pick: DataGroupingSeriesComposition_pick, splat: DataGroupingSeriesComposition_splat } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\nconst baseGeneratePoints = DataGroupingSeriesComposition_seriesProto.generatePoints;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction adjustExtremes(xAxis, groupedXData) {\n // Make sure the X axis extends to show the first group (#2533)\n // But only for visible series (#5493, #6393)\n if (DataGroupingSeriesComposition_defined(groupedXData[0]) &&\n DataGroupingSeriesComposition_isNumber(xAxis.min) &&\n DataGroupingSeriesComposition_isNumber(xAxis.dataMin) &&\n groupedXData[0] < xAxis.min) {\n if ((!DataGroupingSeriesComposition_defined(xAxis.options.min) &&\n xAxis.min <= xAxis.dataMin) ||\n xAxis.min === xAxis.dataMin) {\n xAxis.min = Math.min(groupedXData[0], xAxis.min);\n }\n xAxis.dataMin = Math.min(groupedXData[0], xAxis.dataMin);\n }\n // When the last anchor set, change the extremes that\n // the last point is visible (#12455).\n if (DataGroupingSeriesComposition_defined(groupedXData[groupedXData.length - 1]) &&\n DataGroupingSeriesComposition_isNumber(xAxis.max) &&\n DataGroupingSeriesComposition_isNumber(xAxis.dataMax) &&\n groupedXData[groupedXData.length - 1] > xAxis.max) {\n if ((!DataGroupingSeriesComposition_defined(xAxis.options.max) &&\n DataGroupingSeriesComposition_isNumber(xAxis.dataMax) &&\n xAxis.max >= xAxis.dataMax) || xAxis.max === xAxis.dataMax) {\n xAxis.max = Math.max(groupedXData[groupedXData.length - 1], xAxis.max);\n }\n xAxis.dataMax = Math.max(groupedXData[groupedXData.length - 1], xAxis.dataMax);\n }\n}\n/**\n * @private\n */\nfunction anchorPoints(series, groupedXData, xMax) {\n const options = series.options, dataGroupingOptions = options.dataGrouping, totalRange = (series.currentDataGrouping && series.currentDataGrouping.gapSize), xData = series.getColumn('x');\n if (!(dataGroupingOptions &&\n xData.length &&\n totalRange &&\n series.groupMap)) {\n return;\n }\n const groupedDataLastIndex = groupedXData.length - 1, anchor = dataGroupingOptions.anchor, firstAnchor = dataGroupingOptions.firstAnchor, lastAnchor = dataGroupingOptions.lastAnchor;\n let anchorIndexIterator = groupedXData.length - 1, anchorFirstIndex = 0;\n // Change the first point position, but only when it is\n // the first point in the data set not in the current zoom.\n if (firstAnchor && xData[0] >= groupedXData[0]) {\n anchorFirstIndex++;\n const groupStart = series.groupMap[0].start, groupLength = series.groupMap[0].length;\n let firstGroupEnd;\n if (DataGroupingSeriesComposition_isNumber(groupStart) && DataGroupingSeriesComposition_isNumber(groupLength)) {\n firstGroupEnd = groupStart + (groupLength - 1);\n }\n groupedXData[0] = {\n start: groupedXData[0],\n middle: groupedXData[0] + 0.5 * totalRange,\n end: groupedXData[0] + totalRange,\n firstPoint: xData[0],\n lastPoint: firstGroupEnd && xData[firstGroupEnd]\n }[firstAnchor];\n }\n // Change the last point position but only when it is\n // the last point in the data set not in the current zoom,\n // or if it is not the 1st point simultaneously.\n if (groupedDataLastIndex > 0 &&\n lastAnchor &&\n totalRange &&\n groupedXData[groupedDataLastIndex] >= xMax - totalRange) {\n anchorIndexIterator--;\n const lastGroupStart = series.groupMap[series.groupMap.length - 1].start;\n groupedXData[groupedDataLastIndex] = {\n start: groupedXData[groupedDataLastIndex],\n middle: groupedXData[groupedDataLastIndex] + 0.5 * totalRange,\n end: groupedXData[groupedDataLastIndex] + totalRange,\n firstPoint: lastGroupStart && xData[lastGroupStart],\n lastPoint: xData[xData.length - 1]\n }[lastAnchor];\n }\n if (anchor && anchor !== 'start') {\n const shiftInterval = (totalRange *\n { middle: 0.5, end: 1 }[anchor]);\n // Anchor the rest of the points apart from the ones, that were\n // previously moved.\n while (anchorIndexIterator >= anchorFirstIndex) {\n groupedXData[anchorIndexIterator] += shiftInterval;\n anchorIndexIterator--;\n }\n }\n}\n/**\n * For the processed data, calculate the grouped data if needed.\n *\n * @private\n * @function Highcharts.Series#applyGrouping\n */\nfunction DataGroupingSeriesComposition_applyGrouping(hasExtremesChanged) {\n const series = this, chart = series.chart, options = series.options, dataGroupingOptions = options.dataGrouping, groupingEnabled = series.allowDG !== false && dataGroupingOptions &&\n DataGroupingSeriesComposition_pick(dataGroupingOptions.enabled, chart.options.isStock), reserveSpace = series.reserveSpace(), lastDataGrouping = this.currentDataGrouping;\n let currentDataGrouping, croppedData, revertRequireSorting = false;\n // Data needs to be sorted for dataGrouping\n if (groupingEnabled && !series.requireSorting) {\n series.requireSorting = revertRequireSorting = true;\n }\n // Skip if skipDataGrouping method returns false or if grouping is disabled\n // (in that order).\n const skip = skipDataGrouping(series, hasExtremesChanged) === false || !groupingEnabled;\n // Revert original requireSorting value if changed\n if (revertRequireSorting) {\n series.requireSorting = false;\n }\n if (skip) {\n return;\n }\n series.destroyGroupedData();\n const table = dataGroupingOptions.groupAll ?\n series.dataTable :\n series.dataTable.modified || series.dataTable, processedXData = series.getColumn('x', !dataGroupingOptions.groupAll), xData = processedXData, plotSizeX = chart.plotSizeX, xAxis = series.xAxis, extremes = xAxis.getExtremes(), ordinal = xAxis.options.ordinal, groupPixelWidth = series.groupPixelWidth;\n let i, hasGroupedData;\n // Execute grouping if the amount of points is greater than the limit\n // defined in groupPixelWidth\n if (groupPixelWidth &&\n xData &&\n table.rowCount &&\n plotSizeX &&\n DataGroupingSeriesComposition_isNumber(extremes.min)) {\n hasGroupedData = true;\n // Force recreation of point instances in series.translate, #5699\n series.isDirty = true;\n series.points = null; // #6709\n const xMin = extremes.min, xMax = extremes.max, groupIntervalFactor = (ordinal &&\n xAxis.ordinal &&\n xAxis.ordinal.getGroupIntervalFactor(xMin, xMax, series)) || 1, interval = (groupPixelWidth * (xMax - xMin) / plotSizeX) *\n groupIntervalFactor, groupPositions = xAxis.getTimeTicks(Axis_DateTimeAxis.Additions.prototype.normalizeTimeTickInterval(interval, dataGroupingOptions.units ||\n DataGrouping_DataGroupingDefaults.units), \n // Processed data may extend beyond axis (#4907)\n Math.min(xMin, xData[0]), Math.max(xMax, xData[xData.length - 1]), xAxis.options.startOfWeek, processedXData, series.closestPointRange), groupedData = DataGroupingSeriesComposition_seriesProto.groupData.apply(series, [\n table,\n groupPositions,\n dataGroupingOptions.approximation\n ]);\n let modified = groupedData.modified, groupedXData = modified.getColumn('x', true), gapSize = 0;\n // The smoothed option is deprecated, instead, there is a fallback\n // to the new anchoring mechanism. #12455.\n if (dataGroupingOptions?.smoothed &&\n modified.rowCount) {\n dataGroupingOptions.firstAnchor = 'firstPoint';\n dataGroupingOptions.anchor = 'middle';\n dataGroupingOptions.lastAnchor = 'lastPoint';\n DataGroupingSeriesComposition_error(32, false, chart, {\n 'dataGrouping.smoothed': 'use dataGrouping.anchor'\n });\n }\n // Record what data grouping values were used\n for (i = 1; i < groupPositions.length; i++) {\n // The grouped gapSize needs to be the largest distance between\n // the group to capture varying group sizes like months or DST\n // crossing (#10000). Also check that the gap is not at the\n // start of a segment.\n if (!groupPositions.info.segmentStarts ||\n groupPositions.info.segmentStarts.indexOf(i) === -1) {\n gapSize = Math.max(groupPositions[i] - groupPositions[i - 1], gapSize);\n }\n }\n currentDataGrouping = groupPositions.info;\n currentDataGrouping.gapSize = gapSize;\n series.closestPointRange = groupPositions.info.totalRange;\n series.groupMap = groupedData.groupMap;\n series.currentDataGrouping = currentDataGrouping;\n anchorPoints(series, groupedXData || [], xMax);\n if (reserveSpace && groupedXData) {\n adjustExtremes(xAxis, groupedXData);\n }\n // We calculated all group positions but we should render only the ones\n // within the visible range\n if (dataGroupingOptions.groupAll) {\n // Keep the reference to all grouped points for further calculation,\n // used in Heikin-Ashi and hollow candlestick series.\n series.allGroupedTable = modified;\n croppedData = series.cropData(modified, xAxis.min || 0, xAxis.max || 0);\n modified = croppedData.modified;\n groupedXData = modified.getColumn('x');\n series.cropStart = croppedData.start; // #15005\n }\n // Set the modified table\n series.dataTable.modified = modified;\n }\n else {\n series.groupMap = void 0;\n series.currentDataGrouping = void 0;\n }\n series.hasGroupedData = hasGroupedData;\n series.preventGraphAnimation =\n (lastDataGrouping && lastDataGrouping.totalRange) !==\n (currentDataGrouping && currentDataGrouping.totalRange);\n}\n/**\n * @private\n */\nfunction DataGroupingSeriesComposition_compose(SeriesClass) {\n const seriesProto = SeriesClass.prototype;\n if (!seriesProto.applyGrouping) {\n const PointClass = SeriesClass.prototype.pointClass;\n // Override point prototype to throw a warning when trying to update\n // grouped points.\n DataGroupingSeriesComposition_addEvent(PointClass, 'update', function () {\n if (this.dataGroup) {\n DataGroupingSeriesComposition_error(24, false, this.series.chart);\n return false;\n }\n });\n DataGroupingSeriesComposition_addEvent(SeriesClass, 'afterSetOptions', onAfterSetOptions);\n DataGroupingSeriesComposition_addEvent(SeriesClass, 'destroy', destroyGroupedData);\n DataGroupingSeriesComposition_extend(seriesProto, {\n applyGrouping: DataGroupingSeriesComposition_applyGrouping,\n destroyGroupedData,\n generatePoints,\n getDGApproximation,\n groupData\n });\n }\n}\n/**\n * Destroy the grouped data points. #622, #740\n * @private\n */\nfunction destroyGroupedData() {\n // Clear previous groups\n if (this.groupedData) {\n this.groupedData.forEach(function (point, i) {\n if (point) {\n this.groupedData[i] = point.destroy ?\n point.destroy() : null;\n }\n }, this);\n // Clears all:\n // - `this.groupedData`\n // - `this.points`\n // - `preserve` object in series.update()\n this.groupedData.length = 0;\n delete this.allGroupedTable;\n }\n}\n/**\n * Override the generatePoints method by adding a reference to grouped data\n * @private\n */\nfunction generatePoints() {\n baseGeneratePoints.apply(this);\n // Record grouped data in order to let it be destroyed the next time\n // processData runs\n this.destroyGroupedData(); // #622\n this.groupedData = this.hasGroupedData ? this.points : null;\n}\n/**\n * Set default approximations to the prototypes if present. Properties are\n * inherited down. Can be overridden for individual series types.\n * @private\n */\nfunction getDGApproximation() {\n if (this.is('arearange')) {\n return 'range';\n }\n if (this.is('ohlc')) {\n return 'ohlc';\n }\n if (this.is('hlc')) {\n return 'hlc';\n }\n if (\n // #18974, default approximation for cumulative\n // should be `sum` when `dataGrouping` is enabled\n this.is('column') ||\n this.options.cumulative) {\n return 'sum';\n }\n return 'average';\n}\n/**\n * Highcharts Stock only. Takes parallel arrays of x and y data and groups the\n * data into intervals defined by groupPositions, a collection of starting x\n * values for each group.\n *\n * @product highstock\n *\n * @function Highcharts.Series#groupData\n * @param {Highcharts.DataTable} table\n * The series data table.\n * @param {Array} groupPositions\n * Group positions.\n * @param {string|Function} [approximation]\n * Approximation to use.\n * @return {Highcharts.DataGroupingResultObject}\n * Mapped groups.\n */\nfunction groupData(table, groupPositions, approximation) {\n const xData = table.getColumn('x', true) || [], yData = table.getColumn('y', true), series = this, data = series.data, dataOptions = series.options && series.options.data, groupedXData = [], modified = new Data_DataTableCore(), groupMap = [], dataLength = table.rowCount, \n // When grouping the fake extended axis for panning, we don't need to\n // consider y\n handleYData = !!yData, values = [], pointArrayMap = series.pointArrayMap, pointArrayMapLength = pointArrayMap && pointArrayMap.length, extendedPointArrayMap = ['x'].concat(pointArrayMap || ['y']), \n // Data columns to be applied to the modified data table at the end\n valueColumns = (pointArrayMap || ['y']).map(() => []), groupAll = (this.options.dataGrouping &&\n this.options.dataGrouping.groupAll);\n let pointX, pointY, groupedY, pos = 0, start = 0;\n const approximationFn = (typeof approximation === 'function' ?\n approximation :\n approximation && DataGrouping_ApproximationRegistry[approximation] ?\n DataGrouping_ApproximationRegistry[approximation] :\n DataGrouping_ApproximationRegistry[(series.getDGApproximation && series.getDGApproximation() ||\n 'average')]);\n // Calculate values array size from pointArrayMap length\n if (pointArrayMapLength) {\n let len = pointArrayMap.length;\n while (len--) {\n values.push([]);\n }\n }\n else {\n values.push([]);\n }\n const valuesLen = pointArrayMapLength || 1;\n for (let i = 0; i <= dataLength; i++) {\n // Start with the first point within the X axis range (#2696)\n if (xData[i] < groupPositions[0]) {\n continue; // With next point\n }\n // When a new group is entered, summarize and initialize\n // the previous group\n while ((typeof groupPositions[pos + 1] !== 'undefined' &&\n xData[i] >= groupPositions[pos + 1]) ||\n i === dataLength) { // Get the last group\n // get group x and y\n pointX = groupPositions[pos];\n series.dataGroupInfo = {\n start: groupAll ? start : (series.cropStart + start),\n length: values[0].length,\n groupStart: pointX\n };\n groupedY = approximationFn.apply(series, values);\n // By default, let options of the first grouped point be passed over\n // to the grouped point. This allows preserving properties like\n // `name` and `color` or custom properties. Implementers can\n // override this from the approximation function, where they can\n // write custom options to `this.dataGroupInfo.options`.\n if (series.pointClass && !DataGroupingSeriesComposition_defined(series.dataGroupInfo.options)) {\n // Convert numbers and arrays into objects\n series.dataGroupInfo.options = DataGroupingSeriesComposition_merge(series.pointClass.prototype\n .optionsToObject.call({ series: series }, series.options.data[series.cropStart + start]));\n // Make sure the raw data (x, y, open, high etc) is not copied\n // over and overwriting approximated data.\n extendedPointArrayMap.forEach(function (key) {\n delete series.dataGroupInfo.options[key];\n });\n }\n // Push the grouped data\n if (typeof groupedY !== 'undefined') {\n groupedXData.push(pointX);\n // Push the grouped values to the parallel columns\n const groupedValuesArr = DataGroupingSeriesComposition_splat(groupedY);\n for (let j = 0; j < groupedValuesArr.length; j++) {\n valueColumns[j].push(groupedValuesArr[j]);\n }\n groupMap.push(series.dataGroupInfo);\n }\n // Reset the aggregate arrays\n start = i;\n for (let j = 0; j < valuesLen; j++) {\n values[j].length = 0; // Faster than values[j] = []\n values[j].hasNulls = false;\n }\n // Advance on the group positions\n pos += 1;\n // Don't loop beyond the last group\n if (i === dataLength) {\n break;\n }\n }\n // Break out\n if (i === dataLength) {\n break;\n }\n // For each raw data point, push it to an array that contains all values\n // for this specific group\n if (pointArrayMap) {\n const index = groupAll ? i : series.cropStart + i, point = (data && data[index]) ||\n series.pointClass.prototype.applyOptions.apply({\n series: series\n }, [dataOptions[index]]);\n let val;\n for (let j = 0; j < pointArrayMapLength; j++) {\n val = point[pointArrayMap[j]];\n if (DataGroupingSeriesComposition_isNumber(val)) {\n values[j].push(val);\n }\n else if (val === null) {\n values[j].hasNulls = true;\n }\n }\n }\n else {\n pointY = handleYData ? yData[i] : null;\n if (DataGroupingSeriesComposition_isNumber(pointY)) {\n values[0].push(pointY);\n }\n else if (pointY === null) {\n values[0].hasNulls = true;\n }\n }\n }\n const columns = {\n x: groupedXData\n };\n (pointArrayMap || ['y']).forEach((key, i) => {\n columns[key] = valueColumns[i];\n });\n modified.setColumns(columns);\n return {\n groupMap,\n modified\n };\n}\n/**\n * Handle default options for data grouping. This must be set at runtime because\n * some series types are defined after this.\n * @private\n */\nfunction onAfterSetOptions(e) {\n const options = e.options, type = this.type, plotOptions = this.chart.options.plotOptions, \n // External series, for example technical indicators should also inherit\n // commonOptions which are not available outside this module\n baseOptions = (this.useCommonDataGrouping &&\n DataGrouping_DataGroupingDefaults.common), seriesSpecific = DataGrouping_DataGroupingDefaults.seriesSpecific;\n let defaultOptions = Defaults.defaultOptions.plotOptions[type].dataGrouping;\n if (plotOptions && (seriesSpecific[type] || baseOptions)) { // #1284\n const rangeSelector = this.chart.rangeSelector;\n if (!defaultOptions) {\n defaultOptions = DataGroupingSeriesComposition_merge(DataGrouping_DataGroupingDefaults.common, seriesSpecific[type]);\n }\n options.dataGrouping = DataGroupingSeriesComposition_merge(baseOptions, defaultOptions, plotOptions.series && plotOptions.series.dataGrouping, // #1228\n // Set by the StockChart constructor:\n plotOptions[type].dataGrouping, this.userOptions.dataGrouping, !options.isInternal &&\n rangeSelector &&\n DataGroupingSeriesComposition_isNumber(rangeSelector.selected) &&\n rangeSelector.buttonOptions[rangeSelector.selected].dataGrouping);\n }\n}\n/**\n * @private\n */\nfunction skipDataGrouping(series, force) {\n return !(series.isCartesian &&\n !series.isDirty &&\n !series.xAxis.isDirty &&\n !series.yAxis.isDirty &&\n !force);\n}\n/* *\n *\n * Default Export\n *\n * */\nconst DataGroupingSeriesComposition = {\n compose: DataGroupingSeriesComposition_compose,\n groupData\n};\n/* harmony default export */ const DataGrouping_DataGroupingSeriesComposition = (DataGroupingSeriesComposition);\n\n;// ./code/es-modules/Extensions/DataGrouping/DataGrouping.js\n/* *\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\n\n\n\nconst { format: DataGrouping_format } = Core_Templating;\n\nconst { composed: DataGrouping_composed } = Core_Globals;\n\nconst { addEvent: DataGrouping_addEvent, extend: DataGrouping_extend, isNumber: DataGrouping_isNumber, pick: DataGrouping_pick, pushUnique: DataGrouping_pushUnique } = Core_Utilities;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction DataGrouping_compose(AxisClass, SeriesClass, TooltipClass) {\n DataGrouping_DataGroupingAxisComposition.compose(AxisClass);\n DataGrouping_DataGroupingSeriesComposition.compose(SeriesClass);\n if (TooltipClass &&\n DataGrouping_pushUnique(DataGrouping_composed, 'DataGrouping')) {\n DataGrouping_addEvent(TooltipClass, 'headerFormatter', onTooltipHeaderFormatter);\n }\n}\n/**\n * Extend the original method, make the tooltip's header reflect the grouped\n * range.\n * @private\n */\nfunction onTooltipHeaderFormatter(e) {\n const chart = this.chart, time = chart.time, point = e.point, series = point.series, options = series.options, tooltipOptions = series.tooltipOptions, dataGroupingOptions = options.dataGrouping, xAxis = series.xAxis;\n let xDateFormat = tooltipOptions.xDateFormat || '', xDateFormatEnd, currentDataGrouping, dateTimeLabelFormats, labelFormats, formattedKey, formatString = tooltipOptions[e.isFooter ? 'footerFormat' : 'headerFormat'];\n // Apply only to grouped series\n if (xAxis &&\n xAxis.options.type === 'datetime' &&\n dataGroupingOptions &&\n DataGrouping_isNumber(point.key)) {\n // Set variables\n currentDataGrouping = series.currentDataGrouping;\n dateTimeLabelFormats = dataGroupingOptions.dateTimeLabelFormats ||\n // Fallback to commonOptions (#9693)\n DataGrouping_DataGroupingDefaults.common.dateTimeLabelFormats;\n // If we have grouped data, use the grouping information to get the\n // right format\n if (currentDataGrouping) {\n labelFormats = dateTimeLabelFormats[currentDataGrouping.unitName];\n if (currentDataGrouping.count === 1) {\n xDateFormat = labelFormats[0];\n }\n else {\n xDateFormat = labelFormats[1];\n xDateFormatEnd = labelFormats[2];\n }\n // If not grouped, and we don't have set the xDateFormat option, get the\n // best fit, so if the least distance between points is one minute, show\n // it, but if the least distance is one day, skip hours and minutes etc.\n }\n else if (!xDateFormat && dateTimeLabelFormats && xAxis.dateTime) {\n xDateFormat = xAxis.dateTime.getXDateFormat(point.x, tooltipOptions.dateTimeLabelFormats);\n }\n const groupStart = DataGrouping_pick(series.groupMap?.[point.index].groupStart, point.key), groupEnd = groupStart + (currentDataGrouping?.totalRange || 0) - 1;\n formattedKey = time.dateFormat(xDateFormat, groupStart);\n if (xDateFormatEnd) {\n formattedKey += time.dateFormat(xDateFormatEnd, groupEnd);\n }\n // Replace default header style with class name\n if (series.chart.styledMode) {\n formatString = this.styledModeFormat(formatString);\n }\n // Return the replaced format\n e.text = DataGrouping_format(formatString, {\n point: DataGrouping_extend(point, { key: formattedKey }),\n series: series\n }, chart);\n e.preventDefault();\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst DataGroupingComposition = {\n compose: DataGrouping_compose,\n groupData: DataGrouping_DataGroupingSeriesComposition.groupData\n};\n/* harmony default export */ const DataGrouping = (DataGroupingComposition);\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @typedef {\"average\"|\"averages\"|\"open\"|\"high\"|\"low\"|\"close\"|\"sum\"} Highcharts.DataGroupingApproximationValue\n */\n/**\n * The position of the point inside the group.\n *\n * @typedef {\"start\"|\"middle\"|\"end\"} Highcharts.DataGroupingAnchor\n */\n/**\n * The position of the first or last point in the series inside the group.\n *\n * @typedef {\"start\"|\"middle\"|\"end\"|\"firstPoint\"|\"lastPoint\"} Highcharts.DataGroupingAnchorExtremes\n */\n/**\n * Highcharts Stock only.\n *\n * @product highstock\n * @interface Highcharts.DataGroupingInfoObject\n */ /**\n* @name Highcharts.DataGroupingInfoObject#length\n* @type {number}\n*/ /**\n* @name Highcharts.DataGroupingInfoObject#options\n* @type {Highcharts.SeriesOptionsType|undefined}\n*/ /**\n* @name Highcharts.DataGroupingInfoObject#start\n* @type {number}\n*/\n/**\n * Highcharts Stock only.\n *\n * @product highstock\n * @interface Highcharts.DataGroupingResultObject\n */ /**\n* @name Highcharts.DataGroupingResultObject#groupedXData\n* @type {Array}\n*/ /**\n* @name Highcharts.DataGroupingResultObject#groupedYData\n* @type {Array<(number|null|undefined)>|Array>}\n*/ /**\n* @name Highcharts.DataGroupingResultObject#groupMap\n* @type {Array}\n*/\n/**\n * Highcharts Stock only. If a point object is created by data\n * grouping, it doesn't reflect actual points in the raw\n * data. In this case, the `dataGroup` property holds\n * information that points back to the raw data.\n *\n * - `dataGroup.start` is the index of the first raw data\n * point in the group.\n *\n * - `dataGroup.length` is the amount of points in the\n * group.\n *\n * @sample stock/members/point-datagroup\n * Click to inspect raw data points\n *\n * @product highstock\n *\n * @name Highcharts.Point#dataGroup\n * @type {Highcharts.DataGroupingInfoObject|undefined}\n */\n(''); // Detach doclets above\n/* *\n *\n * API Options\n *\n * */\n/**\n * Data grouping is the concept of sampling the data values into larger\n * blocks in order to ease readability and increase performance of the\n * JavaScript charts. Highcharts Stock by default applies data grouping when\n * the points become closer than a certain pixel value, determined by\n * the `groupPixelWidth` option.\n *\n * If data grouping is applied, the grouping information of grouped\n * points can be read from the [Point.dataGroup](\n * /class-reference/Highcharts.Point#dataGroup). If point options other than\n * the data itself are set, for example `name` or `color` or custom properties,\n * the grouping logic doesn't know how to group it. In this case the options of\n * the first point instance are copied over to the group point. This can be\n * altered through a custom `approximation` callback function.\n *\n * @declare Highcharts.DataGroupingOptionsObject\n * @product highstock\n * @requires modules/stock\n * @apioption plotOptions.series.dataGrouping\n */\n/**\n * Specifies how the points should be located on the X axis inside the group.\n * Points that are extremes can be set separately. Available options:\n *\n * - `start` places the point at the beginning of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 00:00:00)\n *\n * - `middle` places the point in the middle of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 12:00:00)\n *\n * - `end` places the point at the end of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 23:59:59)\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-anchor\n * Changing the point x-coordinate inside the group.\n *\n * @see [dataGrouping.firstAnchor](#plotOptions.series.dataGrouping.firstAnchor)\n * @see [dataGrouping.lastAnchor](#plotOptions.series.dataGrouping.lastAnchor)\n *\n * @type {Highcharts.DataGroupingAnchor}\n * @since 9.1.0\n * @default start\n * @apioption plotOptions.series.dataGrouping.anchor\n */\n/**\n * The method of approximation inside a group. When for example 30 days\n * are grouped into one month, this determines what value should represent\n * the group. Possible values are \"average\", \"averages\", \"open\", \"high\",\n * \"low\", \"close\" and \"sum\". For OHLC and candlestick series the approximation\n * is \"ohlc\" by default, which finds the open, high, low and close values\n * within all the grouped data. For ranges, the approximation is \"range\",\n * which finds the low and high values. For multi-dimensional data,\n * like ranges and OHLC, \"averages\" will compute the average for each\n * dimension.\n *\n * Custom aggregate methods can be added by assigning a callback function\n * as the approximation. This function takes a numeric array as the\n * argument and should return a single numeric value or `null`. Note\n * that the numeric array will never contain null values, only true\n * numbers. Instead, if null values are present in the raw data, the\n * numeric array will have an `.hasNulls` property set to `true`. For\n * single-value data sets the data is available in the first argument\n * of the callback function. For OHLC data sets, all the open values\n * are in the first argument, all high values in the second etc.\n *\n * Since v4.2.7, grouping meta data is available in the approximation\n * callback from `this.dataGroupInfo`. It can be used to extract information\n * from the raw data.\n *\n * Defaults to `average` for line-type series, `sum` for columns, `range`\n * for range series, `hlc` for HLC, and `ohlc` for OHLC and candlestick.\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-approximation\n * Approximation callback with custom data\n * @sample {highstock} stock/plotoptions/series-datagrouping-simple-approximation\n * Simple approximation demo\n *\n * @type {Highcharts.DataGroupingApproximationValue|Function}\n * @apioption plotOptions.series.dataGrouping.approximation\n */\n/**\n * Datetime formats for the header of the tooltip in a stock chart.\n * The format can vary within a chart depending on the currently selected\n * time range and the current data grouping.\n *\n * The default formats are:\n * ```js\n * {\n * millisecond: [\n * '%A, %e %b, %H:%M:%S.%L', '%A, %e %b, %H:%M:%S.%L', '-%H:%M:%S.%L'\n * ],\n * second: ['%A, %e %b, %H:%M:%S', '%A, %e %b, %H:%M:%S', '-%H:%M:%S'],\n * minute: ['%A, %e %b, %H:%M', '%A, %e %b, %H:%M', '-%H:%M'],\n * hour: ['%A, %e %b, %H:%M', '%A, %e %b, %H:%M', '-%H:%M'],\n * day: ['%A, %e %b %Y', '%A, %e %b', '-%A, %e %b %Y'],\n * week: ['Week from %A, %e %b %Y', '%A, %e %b', '-%A, %e %b %Y'],\n * month: ['%B %Y', '%B', '-%B %Y'],\n * year: ['%Y', '%Y', '-%Y']\n * }\n * ```\n *\n * For each of these array definitions, the first item is the format\n * used when the active time span is one unit. For instance, if the\n * current data applies to one week, the first item of the week array\n * is used. The second and third items are used when the active time\n * span is more than two units. For instance, if the current data applies\n * to two weeks, the second and third item of the week array are used,\n * and applied to the start and end date of the time span.\n *\n * @type {Object}\n * @apioption plotOptions.series.dataGrouping.dateTimeLabelFormats\n */\n/**\n * Enable or disable data grouping.\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.dataGrouping.enabled\n */\n/**\n * Specifies how the first grouped point is positioned on the xAxis.\n * If firstAnchor and/or lastAnchor are defined, then those options take\n * precedence over anchor for the first and/or last grouped points.\n * Available options:\n *\n * -`start` places the point at the beginning of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 00:00:00)\n *\n * -`middle` places the point in the middle of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 12:00:00)\n *\n * -`end` places the point at the end of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 23:59:59)\n *\n * -`firstPoint` the first point in the group\n * (e.g. points at 00:13, 00:35, 00:59 -> 00:13)\n *\n * -`lastPoint` the last point in the group\n * (e.g. points at 00:13, 00:35, 00:59 -> 00:59)\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-first-anchor\n * Applying first and last anchor.\n *\n * @see [dataGrouping.anchor](#plotOptions.series.dataGrouping.anchor)\n *\n * @type {Highcharts.DataGroupingAnchorExtremes}\n * @since 9.1.0\n * @default start\n * @apioption plotOptions.series.dataGrouping.firstAnchor\n */\n/**\n * When data grouping is forced, it runs no matter how small the intervals\n * are. This can be handy for example when the sum should be calculated\n * for values appearing at random times within each hour.\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.dataGrouping.forced\n */\n/**\n * The approximate pixel width of each group. If for example a series\n * with 30 points is displayed over a 600 pixel wide plot area, no grouping\n * is performed. If however the series contains so many points that\n * the spacing is less than the groupPixelWidth, Highcharts will try\n * to group it into appropriate groups so that each is more or less\n * two pixels wide. If multiple series with different group pixel widths\n * are drawn on the same x axis, all series will take the greatest width.\n * For example, line series have 2px default group width, while column\n * series have 10px. If combined, both the line and the column will\n * have 10px by default.\n *\n * @type {number}\n * @default 2\n * @apioption plotOptions.series.dataGrouping.groupPixelWidth\n */\n/**\n * By default only points within the visible range are grouped. Enabling this\n * option will force data grouping to calculate all grouped points for a given\n * dataset. That option prevents for example a column series from calculating\n * a grouped point partially. The effect is similar to\n * [Series.getExtremesFromAll](#plotOptions.series.getExtremesFromAll) but does\n * not affect yAxis extremes.\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-groupall/\n * Two series with the same data but different groupAll setting\n *\n * @type {boolean}\n * @default false\n * @since 6.1.0\n * @apioption plotOptions.series.dataGrouping.groupAll\n */\n/**\n * Specifies how the last grouped point is positioned on the xAxis.\n * If firstAnchor and/or lastAnchor are defined, then those options take\n * precedence over anchor for the first and/or last grouped points.\n * Available options:\n *\n * -`start` places the point at the beginning of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 00:00:00)\n *\n * -`middle` places the point in the middle of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 12:00:00)\n *\n * -`end` places the point at the end of the group\n * (e.g. range 00:00:00 - 23:59:59 -> 23:59:59)\n *\n * -`firstPoint` the first point in the group\n * (e.g. points at 00:13, 00:35, 00:59 -> 00:13)\n *\n * -`lastPoint` the last point in the group\n * (e.g. points at 00:13, 00:35, 00:59 -> 00:59)\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-first-anchor\n * Applying first and last anchor.\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-last-anchor\n * Applying the last anchor in the chart with live data.\n *\n * @see [dataGrouping.anchor](#plotOptions.series.dataGrouping.anchor)\n *\n * @type {Highcharts.DataGroupingAnchorExtremes}\n * @since 9.1.0\n * @default start\n * @apioption plotOptions.series.dataGrouping.lastAnchor\n */\n/**\n * Normally, a group is indexed by the start of that group, so for example\n * when 30 daily values are grouped into one month, that month's x value\n * will be the 1st of the month. This apparently shifts the data to\n * the left. When the smoothed option is true, this is compensated for.\n * The data is shifted to the middle of the group, and min and max\n * values are preserved. Internally, this is used in the Navigator series.\n *\n * @type {boolean}\n * @default false\n * @deprecated\n * @apioption plotOptions.series.dataGrouping.smoothed\n */\n/**\n * An array determining what time intervals the data is allowed to be\n * grouped to. Each array item is an array where the first value is\n * the time unit and the second value another array of allowed multiples.\n *\n * Defaults to:\n * ```js\n * units: [[\n * 'millisecond', // unit name\n * [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n * ], [\n * 'second',\n * [1, 2, 5, 10, 15, 30]\n * ], [\n * 'minute',\n * [1, 2, 5, 10, 15, 30]\n * ], [\n * 'hour',\n * [1, 2, 3, 4, 6, 8, 12]\n * ], [\n * 'day',\n * [1]\n * ], [\n * 'week',\n * [1]\n * ], [\n * 'month',\n * [1, 3, 6]\n * ], [\n * 'year',\n * null\n * ]]\n * ```\n *\n * @type {Array|null)>>}\n * @apioption plotOptions.series.dataGrouping.units\n */\n/**\n * The approximate pixel width of each group. If for example a series\n * with 30 points is displayed over a 600 pixel wide plot area, no grouping\n * is performed. If however the series contains so many points that\n * the spacing is less than the groupPixelWidth, Highcharts will try\n * to group it into appropriate groups so that each is more or less\n * two pixels wide. Defaults to `10`.\n *\n * @sample {highstock} stock/plotoptions/series-datagrouping-grouppixelwidth/\n * Two series with the same data density but different groupPixelWidth\n *\n * @type {number}\n * @default 10\n * @apioption plotOptions.column.dataGrouping.groupPixelWidth\n */\n''; // Required by JSDoc parsing\n\n;// ./code/es-modules/masters/modules/datagrouping.src.js\n/**\n * @license Highstock JS v12.1.1 (2024-12-20)\n * @module highcharts/modules/datagrouping\n * @requires highcharts\n *\n * Data grouping module\n *\n * (c) 2010-2024 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n\n\n\n\nconst datagrouping_src_G = Core_Globals;\ndatagrouping_src_G.dataGrouping = datagrouping_src_G.dataGrouping || {};\ndatagrouping_src_G.dataGrouping.approximationDefaults = (datagrouping_src_G.dataGrouping.approximationDefaults ||\n DataGrouping_ApproximationDefaults);\ndatagrouping_src_G.dataGrouping.approximations = (datagrouping_src_G.dataGrouping.approximations ||\n DataGrouping_ApproximationRegistry);\nDataGrouping.compose(datagrouping_src_G.Axis, datagrouping_src_G.Series, datagrouping_src_G.Tooltip);\n/* harmony default export */ const datagrouping_src = ((/* unused pure expression or super */ null && (Highcharts)));\n\n;// ./code/es-modules/Extensions/Annotations/NavigationBindingsUtilities.js\n/* *\n *\n * (c) 2009-2024 Highsoft, Black Label\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { defined: NavigationBindingsUtilities_defined, isNumber: NavigationBindingsUtilities_isNumber, pick: NavigationBindingsUtilities_pick } = Core_Utilities;\n/* *\n *\n * Constants\n *\n * */\n/**\n * Define types for editable fields per annotation. There is no need to define\n * numbers, because they won't change their type to string.\n * @private\n */\nconst annotationsFieldsTypes = {\n backgroundColor: 'string',\n borderColor: 'string',\n borderRadius: 'string',\n color: 'string',\n fill: 'string',\n fontSize: 'string',\n labels: 'string',\n name: 'string',\n stroke: 'string',\n title: 'string'\n};\n/* *\n *\n * Functions\n *\n * */\n/**\n * Returns the first xAxis or yAxis that was clicked with its value.\n *\n * @private\n *\n * @param {Array} coords\n * All the chart's x or y axes with a current pointer's axis value.\n *\n * @return {Highcharts.PointerAxisCoordinateObject}\n * Object with a first found axis and its value that pointer\n * is currently pointing.\n */\nfunction getAssignedAxis(coords) {\n return coords.filter((coord) => {\n const extremes = coord.axis.getExtremes(), axisMin = extremes.min, axisMax = extremes.max, \n // Correct axis edges when axis has series\n // with pointRange (like column)\n minPointOffset = NavigationBindingsUtilities_pick(coord.axis.minPointOffset, 0);\n return NavigationBindingsUtilities_isNumber(axisMin) && NavigationBindingsUtilities_isNumber(axisMax) &&\n coord.value >= (axisMin - minPointOffset) &&\n coord.value <= (axisMax + minPointOffset) &&\n // Don't count navigator axis\n !coord.axis.options.isInternal;\n })[0]; // If the axes overlap, return the first axis that was found.\n}\n/**\n * Get field type according to value\n *\n * @private\n *\n * @param {'boolean'|'number'|'string'} value\n * Atomic type (one of: string, number, boolean)\n *\n * @return {'checkbox'|'number'|'text'}\n * Field type (one of: text, number, checkbox)\n */\nfunction getFieldType(key, value) {\n const predefinedType = annotationsFieldsTypes[key];\n let fieldType = typeof value;\n if (NavigationBindingsUtilities_defined(predefinedType)) {\n fieldType = predefinedType;\n }\n return {\n 'string': 'text',\n 'number': 'number',\n 'boolean': 'checkbox'\n }[fieldType];\n}\n/* *\n *\n * Default Export\n *\n * */\nconst NavigationBindingUtilities = {\n annotationsFieldsTypes,\n getAssignedAxis,\n getFieldType\n};\n/* harmony default export */ const NavigationBindingsUtilities = (NavigationBindingUtilities);\n\n;// ./code/es-modules/Extensions/MouseWheelZoom/MouseWheelZoom.js\n/* *\n *\n * (c) 2023 Torstein Honsi, Askel Eirik Johansson\n *\n * License: www.highcharts.com/license\n *\n * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { addEvent: MouseWheelZoom_addEvent, isObject: MouseWheelZoom_isObject, pick: MouseWheelZoom_pick, defined: MouseWheelZoom_defined, merge: MouseWheelZoom_merge } = Core_Utilities;\n\nconst { getAssignedAxis: MouseWheelZoom_getAssignedAxis } = NavigationBindingsUtilities;\n/* *\n *\n * Constants\n *\n * */\nconst composedClasses = [], MouseWheelZoom_defaultOptions = {\n enabled: true,\n sensitivity: 1.1\n};\nlet wheelTimer;\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nconst MouseWheelZoom_optionsToObject = (options) => {\n if (!MouseWheelZoom_isObject(options)) {\n options = {\n enabled: options ?? true\n };\n }\n return MouseWheelZoom_merge(MouseWheelZoom_defaultOptions, options);\n};\n/**\n * @private\n */\nconst zoomBy = function (chart, howMuch, xAxis, yAxis, mouseX, mouseY, options) {\n const type = MouseWheelZoom_pick(options.type, chart.zooming.type, '');\n let axes = [];\n if (type === 'x') {\n axes = xAxis;\n }\n else if (type === 'y') {\n axes = yAxis;\n }\n else if (type === 'xy') {\n axes = chart.axes;\n }\n const hasZoomed = chart.transform({\n axes,\n // Create imaginary reference and target rectangles around the mouse\n // point that scales up or down with `howMuch`;\n to: {\n x: mouseX - 5,\n y: mouseY - 5,\n // Must use 10 to get passed the limit for too small reference.\n // Below this, the transform will default to a pan.\n width: 10,\n height: 10\n },\n from: {\n x: mouseX - 5 * howMuch,\n y: mouseY - 5 * howMuch,\n width: 10 * howMuch,\n height: 10 * howMuch\n },\n trigger: 'mousewheel'\n });\n if (hasZoomed) {\n if (MouseWheelZoom_defined(wheelTimer)) {\n clearTimeout(wheelTimer);\n }\n // Some time after the last mousewheel event, run drop. In case any of\n // the affected axes had `startOnTick` or `endOnTick`, they will be\n // re-adjusted now.\n wheelTimer = setTimeout(() => {\n chart.pointer?.drop();\n }, 400);\n }\n return hasZoomed;\n};\n/**\n * @private\n */\nfunction onAfterGetContainer() {\n const wheelZoomOptions = MouseWheelZoom_optionsToObject(this.zooming.mouseWheel);\n if (wheelZoomOptions.enabled) {\n MouseWheelZoom_addEvent(this.container, 'wheel', (e) => {\n e = this.pointer?.normalize(e) || e;\n const { pointer } = this, allowZoom = pointer && !pointer.inClass(e.target, 'highcharts-no-mousewheel');\n // Firefox uses e.detail, WebKit and IE uses deltaX, deltaY, deltaZ.\n if (this.isInsidePlot(e.chartX - this.plotLeft, e.chartY - this.plotTop) && allowZoom) {\n const wheelSensitivity = wheelZoomOptions.sensitivity || 1.1, delta = e.detail || ((e.deltaY || 0) / 120), xAxisCoords = MouseWheelZoom_getAssignedAxis(pointer.getCoordinates(e).xAxis), yAxisCoords = MouseWheelZoom_getAssignedAxis(pointer.getCoordinates(e).yAxis);\n const hasZoomed = zoomBy(this, Math.pow(wheelSensitivity, delta), xAxisCoords ? [xAxisCoords.axis] : this.xAxis, yAxisCoords ? [yAxisCoords.axis] : this.yAxis, e.chartX, e.chartY, wheelZoomOptions);\n // Prevent page scroll\n if (hasZoomed) {\n e.preventDefault?.();\n }\n }\n });\n }\n}\n/**\n * @private\n */\nfunction MouseWheelZoom_compose(ChartClass) {\n if (composedClasses.indexOf(ChartClass) === -1) {\n composedClasses.push(ChartClass);\n MouseWheelZoom_addEvent(ChartClass, 'afterGetContainer', onAfterGetContainer);\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst MouseWheelZoomComposition = {\n compose: MouseWheelZoom_compose\n};\n/* harmony default export */ const MouseWheelZoom = (MouseWheelZoomComposition);\n/* *\n *\n * API Options\n *\n * */\n/**\n * The mouse wheel zoom is a feature included in Highcharts Stock, but is also\n * available for Highcharts Core as a module. Zooming with the mouse wheel is\n * enabled by default in Highcharts Stock. In Highcharts Core it is enabled if\n * [chart.zooming.type](chart.zooming.type) is set. It can be disabled by\n * setting this option to `false`.\n *\n * @type {boolean|object}\n * @since 11.1.0\n * @requires modules/mouse-wheel-zoom\n * @sample {highcharts} highcharts/mouse-wheel-zoom/enabled\n * Enable or disable\n * @sample {highstock} stock/mouse-wheel-zoom/enabled\n * Enable or disable\n * @apioption chart.zooming.mouseWheel\n */\n/**\n * Zooming with the mouse wheel can be disabled by setting this option to\n * `false`.\n *\n * @type {boolean}\n * @default true\n * @since 11.1.0\n * @requires modules/mouse-wheel-zoom\n * @apioption chart.zooming.mouseWheel.enabled\n */\n/**\n * Adjust the sensitivity of the zoom. Sensitivity of mouse wheel or trackpad\n * scrolling. `1` is no sensitivity, while with `2`, one mouse wheel delta will\n * zoom in `50%`.\n *\n * @type {number}\n * @default 1.1\n * @since 11.1.0\n * @requires modules/mouse-wheel-zoom\n * @sample {highcharts} highcharts/mouse-wheel-zoom/sensitivity\n * Change mouse wheel zoom sensitivity\n * @sample {highstock} stock/mouse-wheel-zoom/sensitivity\n * Change mouse wheel zoom sensitivity\n * @apioption chart.zooming.mouseWheel.sensitivity\n */\n/**\n * Decides in what dimensions the user can zoom scrolling the wheel. Can be one\n * of `x`, `y` or `xy`. In Highcharts Core, if not specified here, it will\n * inherit the type from [chart.zooming.type](chart.zooming.type). In Highcharts\n * Stock, it defaults to `x`.\n *\n * Note that particularly with mouse wheel in the y direction, the zoom is\n * affected by the default [yAxis.startOnTick](#yAxis.startOnTick) and\n * [endOnTick]((#yAxis.endOnTick)) settings. In order to respect these settings,\n * the zoom level will adjust after the user has stopped zooming. To prevent\n * this, consider setting `startOnTick` and `endOnTick` to `false`.\n *\n * @type {string}\n * @default {highcharts} undefined\n * @default {highstock} x\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @since 11.1.0\n * @requires modules/mouse-wheel-zoom\n * @apioption chart.zooming.mouseWheel.type\n */\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/masters/modules/mouse-wheel-zoom.src.js\n/**\n * @license Highcharts JS v12.1.1 (2024-12-20)\n * @module highcharts/modules/mouse-wheel-zoom\n * @requires highcharts\n *\n * Mousewheel zoom module\n *\n * (c) 2023 Askel Eirik Johansson\n *\n * License: www.highcharts.com/license\n */\n\n\n\nconst mouse_wheel_zoom_src_G = Core_Globals;\nmouse_wheel_zoom_src_G.MouseWheelZoom = mouse_wheel_zoom_src_G.MouseWheelZoom || MouseWheelZoom;\nmouse_wheel_zoom_src_G.MouseWheelZoom.compose(mouse_wheel_zoom_src_G.Chart);\n/* harmony default export */ const mouse_wheel_zoom_src = ((/* unused pure expression or super */ null && (Highcharts)));\n\n;// ./code/es-modules/masters/modules/stock.src.js\n/**\n * @license Highstock JS v12.1.1 (2024-12-20)\n * @module highcharts/modules/stock\n * @requires highcharts\n *\n * Highcharts Stock as a plugin for Highcharts\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst stock_src_G = Core_Globals;\n// Classes\nstock_src_G.Navigator = stock_src_G.Navigator || Navigator_Navigator;\nstock_src_G.OrdinalAxis = stock_src_G.OrdinalAxis || Axis_OrdinalAxis;\nstock_src_G.RangeSelector = stock_src_G.RangeSelector || RangeSelector_RangeSelector;\nstock_src_G.Scrollbar = stock_src_G.Scrollbar || Scrollbar_Scrollbar;\n// Functions\nstock_src_G.stockChart = stock_src_G.stockChart || Chart_StockChart.stockChart;\nstock_src_G.StockChart = stock_src_G.StockChart || stock_src_G.stockChart;\nstock_src_G.extend(stock_src_G.StockChart, Chart_StockChart);\n// Compositions\nSeries_DataModifyComposition.compose(stock_src_G.Series, stock_src_G.Axis, stock_src_G.Point);\nFlags_FlagsSeries.compose(stock_src_G.Renderer);\nOHLC_OHLCSeries.compose(stock_src_G.Series);\nstock_src_G.Navigator.compose(stock_src_G.Chart, stock_src_G.Axis, stock_src_G.Series);\nstock_src_G.OrdinalAxis.compose(stock_src_G.Axis, stock_src_G.Series, stock_src_G.Chart);\nstock_src_G.RangeSelector.compose(stock_src_G.Axis, stock_src_G.Chart);\nstock_src_G.Scrollbar.compose(stock_src_G.Axis);\nstock_src_G.StockChart.compose(stock_src_G.Chart, stock_src_G.Axis, stock_src_G.Series, stock_src_G.SVGRenderer);\n/* harmony default export */ const stock_src = ((/* unused pure expression or super */ null && (Highcharts)));\n\n;// ./code/es-modules/masters/highstock.src.js\n/**\n * @license Highstock JS v12.1.1 (2024-12-20)\n * @module highcharts/highstock\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n\n\nhighcharts_src.product = 'Highstock';\n/* harmony default export */ const highstock_src = (highcharts_src);\n\n__webpack_exports__ = __webpack_exports__[\"default\"];\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});"],"names":["root","factory","exports","module","define","amd","error","window","serialMode","hasInternalReferenceBug","NavigatorConstructor","RangeSelectorConstructor","AxisConstructor","wheelTimer","Globals","RendererRegistry","RendererUtilities","AxisDefaults","Foundation","DateTimeAxis","LogarithmicAxis","PlotLineOrBandAxis","LegendSymbol","SeriesRegistry","StackingAxis","DataLabel","ColumnDataLabel","CenteredUtilities","PieDataLabel_ColumnDataLabel","GeometryUtilities","Responsive","DataModifyComposition","ScrollbarAxis","OrdinalAxis","FlagsSymbols","OnSeriesComposition","BrokenAxis","__webpack_require__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","__webpack_exports__","highstock_src","SVG_NS","product","version","win","doc","document","svg","createElementNS","createSVGRect","pageLang","body","closest","lang","userAgent","navigator","isChrome","chrome","isFirefox","indexOf","isMS","test","opera","isSafari","isTouchDevice","isWebKit","deg2rad","Math","PI","marginNames","noop","supportsPassiveEvents","supportsPassive","opts","addEventListener","removeEventListener","charts","composed","dateFormats","seriesTypes","symbolSizes","chartCount","Core_Globals","code","stop","chart","params","severity","isCode","isNumber","message","toString","additionalMessages","objectEach","value","encodeURI","fireEvent","Error","console","messages","warn","push","pInt","s","mag","parseInt","isString","isArray","str","isObject","strict","isDOMElement","nodeType","isClass","c","constructor","name","n","isNaN","Infinity","defined","attr","elem","keyOrAttribs","ret","isGetter","attrSingle","setAttribute","getAttribute","removeAttribute","splat","extend","a","b","pick","args","arguments","length","i","arg","css","el","styles","style","getMagnitude","num","pow","floor","log","LN10","correctFloat","prec","parseFloat","toPrecision","easeInOutSine","pos","cos","find","Array","arr","callback","fn","ctx","removeEvent","type","removeOneEvent","removeAllEvents","eventCollection","types","len","nodeName","_val","owner","events","hcEvents","typeEvents","filter","eventArguments","defaultFunction","createEvent","dispatchEvent","e","initEvent","target","preventDefault","defaultPrevented","object","multilevel","unshift","apply","getPrototypeOf","sort","order","forEach","uniqueKey","hash","random","substring","id","jQuery","highcharts","slice","shift","Utilities","addEvent","options","Point","series","runTrackerClick","passive","capture","eventObject","arrayMax","data","max","arrayMin","min","clamp","clearTimeout","createElement","tag","attribs","parent","nopad","padding","border","margin","appendChild","crisp","lineWidth","inverted","mod","inverter","round","destroyObjectProperties","except","destructablesOnly","val","destroy","diffObjects","newer","older","keepOlder","collectionsWithUpdate","diff","depth","keeper","newerVal","keys","discardElement","element","parentElement","removeChild","erase","item","splice","extendClass","members","getAlignFactor","align","center","right","middle","bottom","getClosestDistance","arrays","onError","loopLength","distance","allowNegative","xData","getNestedProperty","path","pathElements","split","pathElement","thisProp","child","replace","getStyle","toInt","offsetWidth","scrollWidth","boundingClientRectWidth","getBoundingClientRect","width","offsetHeight","scrollHeight","getComputedStyle","getPropertyValue","insertItem","collection","indexOption","index","isInternal","_i","isFunction","merge","extendOrSource","sources","doCopy","copy","original","normalizeTickInterval","interval","multiples","magnitude","allowDecimals","hasTickAmount","retInterval","normalized","offset","docElem","documentElement","box","parentNode","top","left","height","pageYOffset","scrollTop","clientTop","pageXOffset","scrollLeft","clientLeft","pad","number","padder","String","join","pushUnique","array","relativeLength","base","replaceNested","text","replacements","previous","replacement","stableSort","sortFunction","sortValue","safeI","syncTimeout","delay","context","setTimeout","timeUnits","millisecond","second","minute","hour","day","week","month","year","ucfirst","toUpperCase","useSerialIds","mode","wrap","method","func","proceed","outerArgs","scope","concat","Time_win","Time_defined","Time_error","Time_extend","Time_isNumber","Time_isObject","Time_isString","Time_merge","Time_objectEach","Time_pad","Time_splat","Time_timeUnits","Time_ucfirst","hasOldSafariBug","Intl","DateTimeFormat","formatRange","isDateTimeFormatOptions","main","spanishWeekdayIndex","weekday","Core_Time","timezone","variableTimezone","Date","update","dTLCache","timezoneOffset","useUTC","isMonth","isShort","timeZone","map","position","dateFormat","toParts","timestamp","dayOfMonth","hours","minutes","seconds","dateTimeFormat","Number","locale","cacheKey","JSON","stringify","str2dtf","dTL","format","dtf","mapping","L","fractionalSecondDigits","S","M","H","k","E","A","B","m","y","Y","makeTime","date","milliseconds","UTC","getTimezoneOffset","newOffset","parse","hasTimezone","isYYYYMMDD","ts","gmt","colon","timeZoneName","upperCaseFirst","defaultOptions","invalidDate","match","localeAwareRegex","exec","time","fullYear","langWeekdays","weekdays","shortWeekdays","months","shortMonths","substr","w","I","l","p","P","tzHours","prefix","suffix","resolveDTLFormat","f","from","to","getTimeTicks","normalizedInterval","startOfWeek","tickPositions","higherRanks","count","unitRange","variableDayLength","weekdayNo","t","info","totalRange","getDateFormat","range","dateTimeLabelFormats","dateStr","blank","strpos","lastN","Defaults_fireEvent","Defaults_merge","colors","symbols","loading","numericSymbols","resetZoom","resetZoomTitle","global","buttonTheme","fill","r","stroke","color","cursor","fontSize","fontWeight","states","hover","select","disabled","alignThresholds","panning","enabled","styledMode","borderRadius","colorCount","allowMutatingData","ignoreHiddenSeries","spacing","resetZoomButton","theme","reflow","zooming","singleTouch","resetButton","zIndex","x","borderColor","backgroundColor","plotBorderColor","title","minScale","subtitle","caption","verticalAlign","plotOptions","legend","alignColumns","className","layout","itemMarginBottom","itemMarginTop","labelFormatter","navigation","activeColor","inactiveColor","itemStyle","textDecoration","textOverflow","itemHoverStyle","itemHiddenStyle","shadow","itemCheckboxStyle","squareSymbol","symbolPadding","labelStyle","opacity","textAlign","tooltip","animation","duration","easing","sqrt","footerFormat","headerShape","hideDelay","shape","shared","snap","headerFormat","pointFormat","borderWidth","stickOnContact","useHTML","credits","href","defaultTime","Defaults","getOptions","setOptions","Color_isNumber","Color_merge","Color_pInt","Color_defined","Color","input","None","result","rgba","parser","NaN","GlobalColor","stops","names","toLowerCase","parsers","regex","brighten","alpha","setOpacity","tweenTo","fromRgba","toRgba","hasAlpha","channel","white","black","Fx_win","Fx_isNumber","Fx_objectEach","Fx","dSetter","paths","start","end","now","startSeg","endSeg","tweenSeg","j","startItem","endItem","toD","step","unit","run","self","timer","gotoEnd","stopped","requestAnimationFrame","timers","startTime","curAnim","complete","done","initPath","fromD","startX","endX","isArea","positionFactor","disableAnimation","hasStackedCliffs","fullLength","reverse","prepend","other","moveSegment","otherSegment","z","pop","append","segmentToAdd","lowerSegmentToAdd","fillSetter","strokeSetter","AnimationUtilities_defined","AnimationUtilities_getStyle","AnimationUtilities_isArray","AnimationUtilities_isNumber","AnimationUtilities_isObject","AnimationUtilities_merge","AnimationUtilities_objectEach","AnimationUtilities_pick","animObject","defer","Animation_Fx","AnimationUtilities","animate","opt","fx","pathArray","getDeferredAnimation","labelAnimation","seriesAnim","renderer","forExport","setAnimation","globalAnimation","AST_win","AST_attr","AST_createElement","AST_css","AST_error","AST_isFunction","AST_isString","AST_objectEach","AST_splat","trustedTypes","trustedTypesPolicy","createPolicy","createHTML","emptyHTML","AST","filterUserAttributes","attributes","valid","allowedAttributes","allowedReferences","some","ref","parseStyle","reduce","line","pair","trim","g","setElementHTML","html","innerHTML","ast","addToDOM","source","nodes","parseMarkup","recurse","subtree","subParent","node","tagName","textNode","textContent","createTextNode","bypassHTMLFiltering","allowedTags","NS","namespaceURI","children","markup","DOMParser","parseFromString","appendChildNodes","addTo","astNode","parsedAttributes","attrib","childNodes","childNode","Templating_defaultOptions","Templating_defaultTime","Templating_pageLang","Templating_extend","Templating_getNestedProperty","Templating_isArray","Templating_isNumber","Templating_isObject","Templating_isString","Templating_pick","Templating_ucfirst","helpers","add","divide","eq","each","ge","gt","condition","le","lt","multiply","ne","subtract","unless","numberFormatCache","isQuotedString","subRegex","matches","floatRegex","decRegex","numberFormatter","numberFormat","resolveProperty","currentMatch","hasSub","mainMatch","subMatch","isBlock","expression","charAt","startInner","startingElseSection","elseBody","parts","startChar","char","valueAndFormat","segment","decimals","decimalPoint","thousandsSep","lastIndex","fractionDigits","mantissa","exp","origDec","firstDecimals","toExponential","toFixed","minimumFractionDigits","maximumFractionDigits","useGrouping","hasSeparators","nf","NumberFormat","Core_Templating","defaultRenderer","rendererTypes","getRendererType","rendererType","registerRendererType","rendererClass","setAsDefault","Renderer","Renderer_RendererRegistry","RendererUtilities_clamp","RendererUtilities_pick","RendererUtilities_pushUnique","RendererUtilities_stableSort","distribute","boxes","maxDistance","origBoxes","reducedLen","sortByTarget","restBoxes","boxesLength","forDeletion","overlapping","total","equalRank","size","rank","targets","posInCompositeBox","abs","Renderer_RendererUtilities","SVGElement_animate","SVGElement_animObject","SVGElement_stop","SVGElement_doc","SVGElement_SVG_NS","SVGElement_win","SVGElement_addEvent","SVGElement_attr","SVGElement_createElement","SVGElement_crisp","SVGElement_css","SVGElement_defined","SVGElement_erase","SVGElement_extend","SVGElement_fireEvent","SVGElement_getAlignFactor","SVGElement_isArray","SVGElement_isFunction","SVGElement_isNumber","SVGElement_isObject","SVGElement_isString","SVGElement_merge","SVGElement_objectEach","SVGElement_pick","SVGElement_pInt","SVGElement_pushUnique","SVGElement_replaceNested","SVGElement_syncTimeout","SVGElement_uniqueKey","SVGElement","_defaultGetter","_defaultSetter","inserted","parentGroup","textStr","buildText","added","handleZ","zIndexSetter","onAdd","addClass","currentClassName","newClassName","afterSetters","doTransform","updateTransform","alignOptions","alignByTranslate","alignTo","redraw","alignedObjects","initialAlignment","Boolean","alignToKey","alignToBox","placed","alignAttr","alignSetter","convert","alignValue","animOptions","deferTime","hidden","applyTextOutline","textOutline","getContrast","strokeWidth","fakeTS","digit","removeTextOutline","outline","parentElem","querySelector","clone","cloneNode","totalHeight","querySelectorAll","br","dy","insertBefore","firstChild","continueAnimation","symbolCustomAttribs","hasSetSymbolSize","skipAttr","symbolName","symbolAttr","rotation","setter","clip","clipElem","clipPath","defs","url","rect","x1","y1","x2","y2","x2Crisp","y2Crisp","complexColor","colorOptions","colorObject","gradName","gradAttr","radAttr","gradients","stopColor","stopOpacity","radialReference","radialGradient","linearGradient","gradientUnits","getRadialAttr","gradientObject","Color_Color","stopObject","gradient","oldStyles","newStyles","textWidth","hasNew","stylesToApply","dashstyleSetter","v","wrapper","ownerSVGElement","parentToClean","grandParent","onclick","onmouseout","onmouseover","onmousemove","point","connector","safeRemoveChild","div","pathToSegments","acc","seg","hrefSetter","setAttributeNS","getBBox","reload","rot","bBox","toggleTextShadowShim","cache","cacheKeys","isSVG","rootFontSize","lineClamp","polygon","display","htmlGetBBox","getRotatedBox","boxX","boxY","translateY","rotationOriginX","rotationOriginY","alignFactor","baseline","rad","rad90","cosRad","sinRad","sin","wCosRad","wSinRad","cosRad90","sinRad90","xOriginCosRad","xOriginSinRad","yOriginCosRad","yOriginSinRad","rotOrigin","aX","pX","bX","cX","dX","aY","pY","bY","cY","dY","boxWidth","boxHeight","hasClass","hide","visibility","onEvents","on","eventType","handler","opacitySetter","reAlign","removeClass","RegExp","setRadialReference","coordinates","existingGradient","shadowOptions","offsetX","offsetY","shadowDefinition","show","inherit","tempElement","textSetter","textPxLength","titleSetter","titleNode","getElementsByTagName","toFront","translate","translateX","matrix","scaleX","scaleY","transform","textPath","visibilitySetter","xGetter","parentWrapper","svgParent","otherElement","otherZIndex","undefinedOtherZIndex","yGetter","matrixSetter","rotationOriginXSetter","rotationOriginYSetter","rotationSetter","scaleXSetter","scaleYSetter","translateXSetter","translateYSetter","verticalAlignSetter","SVG_SVGElement","SVGLabel_defined","SVGLabel_extend","SVGLabel_getAlignFactor","SVGLabel_isNumber","SVGLabel_merge","SVGLabel_pick","SVGLabel_removeEvent","SVGLabel","anchorX","anchorY","hasBGImage","paddingLeftSetter","paddingSetter","paddingRightSetter","doUpdate","symbolKey","emptyBBox","baselineOffset","needsBox","deferredAttr","xSetting","anchorXSetter","boxAttr","getCrispAdjust","anchorYSetter","ySetting","textStyles","textProps","updateTextPadding","updateBoxSize","paddingLeft","heightSetter","heightSetting","rSetter","crispAdjust","widthSetting","getPaddedWidth","metrics","fontMetrics","firstLineMetrics","h","symbol","textY","textX","widthSetter","paddingRight","xSetter","ySetter","Symbols_defined","Symbols_isNumber","Symbols_pick","arc","cx","cy","rx","ry","proximity","fullCircle","innerRadius","innerR","open","cosStart","sinStart","cosEnd","sinEnd","longArc","arcSegment","clockwise","roundedRect","SVG_Symbols","callout","safeDistance","isTopCorner","cornerY","circle","diamond","square","triangle","TextBuilder_doc","TextBuilder_SVG_NS","TextBuilder_win","TextBuilder_attr","TextBuilder_extend","TextBuilder_fireEvent","TextBuilder_isString","TextBuilder_objectEach","TextBuilder_pick","stringWithEllipsis","currentIndex","SVG_TextBuilder","svgElement","textLineHeight","lineHeight","ellipsis","noWrap","whiteSpace","buildSVG","hasMarkup","tempParent","textCache","actualWidth","regexMatchBreaks","modifyTree","modifyDOM","unescapeEntities","nextSibling","previousSibling","getLineHeight","modifyTextNode","words","hasWhiteSpace","ellipsisWidth","lineNo","startAt","lines","precedingSiblings","truncate","modifyChildren","Node","TEXT_NODE","baseVal","modifyChild","fontStyle","nextNode","getString","lengths","minIndex","maxIndex","getSubStringLength","charEnd","concatenatedEnd","ceil","inputStr","escapes","SVGRenderer_defaultOptions","SVGRenderer_charts","SVGRenderer_deg2rad","SVGRenderer_doc","SVGRenderer_isFirefox","SVGRenderer_SVG_NS","SVGRenderer_win","SVGRenderer_addEvent","SVGRenderer_attr","SVGRenderer_createElement","SVGRenderer_crisp","SVGRenderer_css","SVGRenderer_defined","SVGRenderer_destroyObjectProperties","SVGRenderer_extend","SVGRenderer_isArray","SVGRenderer_isNumber","SVGRenderer_isObject","SVGRenderer_isString","SVGRenderer_merge","SVGRenderer_pick","SVGRenderer_pInt","SVGRenderer_replaceNested","SVGRenderer_uniqueKey","SVGRenderer","container","allowHTML","subPixelFix","boxWrapper","getReferenceURL","desc","imgCount","setSize","unSubPixelFix","def","hitElement","elementFromPoint","location","fontFamily","setStyle","isHidden","rendererDefs","Element","chartIndex","filterUnits","getShadowFilterContent","dx","stdDeviation","b8","button","hoverState","selectState","disabledState","label","curState","normalStyle","stateAttribs","HTML_AST","stateStyles","stateName","setState","state","pointerEvents","stopPropagation","crispLine","points","_key","rGetter","viewBox","alignElements","image","onload","preserveAspectRatio","elemWrapper","onDummyLoad","dummy","Image","src","imageSrc","centerImage","ren","imageRegex","isImage","sym","symbolFn","img","imgwidth","imgheight","imgSize","scale","backgroundSize","isImg","symbolUrl","hasLoaded","clipRect","tspans","parentVal","tspan","rotCorr","alterY","commandLength","C","Q","T","V","draw","HTMLElement_attr","HTMLElement_css","HTMLElement_createElement","HTMLElement_defined","HTMLElement_extend","HTMLElement_getAlignFactor","HTMLElement_isNumber","HTMLElement_pInt","HTMLElement_pushUnique","commonSetter","decorateSVGGroup","cssProto","classSetter","HTMLElement","compose","SVGRendererClass","getSpanCorrection","alignCorrection","xCorr","yCorr","isSettingWidth","overflow","WebkitLineClamp","WebkitBoxOrient","offsetLeft","offsetTop","alignOnAdd","marginLeft","marginTop","currentTextTransform","parentPadding","oldTextWidth","textWidthNum","innerText","cTT","oldRotation","oldAlign","setSpanRotation","transformOrigin","originX","originY","parents","svgGroup","proto","xAxis","alignTicks","panningEnabled","zoomEnabled","endOnTick","gridLineDashStyle","gridZIndex","labels","autoRotationLimit","indentation","reserveSpace","staggerLines","maxPadding","minorGridLineDashStyle","minorTickLength","minorTickPosition","minorTicksPerMajor","minPadding","reversed","reversedStacks","showEmpty","showFirstLabel","showLastLabel","startOnTick","tickLength","tickPixelInterval","tickmarkPlacement","tickPosition","visible","minorGridLineColor","minorGridLineWidth","minorTickColor","lineColor","gridLineColor","gridLineWidth","tickColor","yAxis","stackLabels","allowOverlap","crop","formatter","axis","Axis_AxisDefaults","Foundation_addEvent","Foundation_isFunction","Foundation_objectEach","Foundation_removeEvent","registerEventOptions","component","eventOptions","event","Core_Foundation","Tick_deg2rad","Tick_clamp","Tick_correctFloat","Tick_defined","Tick_destroyObjectProperties","Tick_extend","Tick_fireEvent","Tick_getAlignFactor","Tick_isNumber","Tick_merge","Tick_objectEach","Tick_pick","Axis_Tick","noLabel","parameters","isNew","isNewLabel","tickmarkOffset","addLabel","tick","categories","logarithmic","labelOptions","isFirst","isLast","animateLabels","tickInterval","tickPositionInfo","dateTimeLabelFormat","category","lin2log","dateTime","grid","unitName","getXDateFormat","defaultLabelFormatter","list","shortenLabel","getSlotWidth","_addedPlotLB","moveLabel","movedLabel","createLabel","xy","labelGroup","getPosition","horiz","tickPos","old","cHeight","oldChartHeight","chartHeight","transB","opposite","oldChartWidth","chartWidth","getLabelPosition","yOffset","transA","isLinked","linkedParent","tickRotCorr","labelOffsetCorrection","reserveSpaceDefault","labelOffset","labelAlign","side","getLabelSize","getMarkPath","tickWidth","handleOverflow","pxPos","leftBound","labelLeft","rightBound","labelRight","isRadial","factor","labelWidth","slotWidth","modifiedSlotWidth","goRight","leftPos","rightPos","xCorrection","autoRotation","moved","labelPos","ticks","currentTick","render","axisStart","axisEnd","polar","labelOpacity","newOpacity","isActive","renderGridLine","renderMark","renderLabel","gridLine","gridLinePath","dashStyle","dashstyle","gridGroup","getPlotLinePath","force","acrossPanes","tickSize","isXAxis","mark","isNewMark","axisGroup","replaceMovedLabel","isDirty","Axis_animObject","Axis_defaultOptions","Axis_deg2rad","Axis_arrayMax","Axis_arrayMin","Axis_clamp","Axis_correctFloat","Axis_defined","Axis_destroyObjectProperties","Axis_erase","Axis_error","Axis_extend","Axis_fireEvent","Axis_getClosestDistance","Axis_insertItem","Axis_isArray","Axis_isNumber","Axis_isString","Axis_merge","Axis_normalizeTickInterval","Axis_objectEach","Axis_pick","Axis_relativeLength","Axis_removeEvent","Axis_splat","Axis_syncTimeout","getNormalizedTickInterval","tickAmount","Axis","userOptions","coll","init","isZAxis","labelsOptions","uniqueNames","minPixelPadding","hasNames","plotLinesAndBandsGroups","positiveValuesOnly","linkedTo","labelEdge","minorTicks","plotLinesAndBands","alternateBands","minRange","userMinRange","maxZoom","crosshair","crosshairs","axes","orderItems","labelRotation","sideSpecific","numSymMagnitude","numericSymbolMagnitude","numericSymbolDetector","multi","getSeriesExtremes","xExtremes","hasVisibleSeries","dataMin","dataMax","threshold","softThreshold","seriesOptions","seriesDataMin","seriesDataMax","getColumn","getXExtremes","dataExtremes","applyExtremes","backwards","cvsCoord","handleLog","pointPlacement","localMin","doPostTranslate","isOrdinal","brokenAxis","hasBreaks","lin2val","sign","cvsOffset","localA","returnValue","sector","val2lin","toPixels","paneCoordinates","toValue","pixel","axisLeft","axisTop","cWidth","translatedValue","skip","between","evt","scrollablePixelsY","scrollablePixelsX","getLinearTickPositions","lastPos","precision","roundedMin","roundedMax","single","getMinorTickInterval","minorTickInterval","getMinorTickPositions","pointRangePadding","unitLength","minorTickPositions","paddedTicks","_pos","getLogTickPositions","normalizeTimeTickInterval","trimTicks","adjustForMinRange","zoomOffset","spaceAvailable","minArgs","maxArgs","ceiling","closestDataRange","xIncrement","log2lin","getClosest","closestSingleDistance","closestDistance","singleXs","seriesClosest","closestPointRange","sorted","nameToX","explicitCategories","nameX","requireSorting","autoIncrement","updateNames","isDirtyData","dataTable","rowCount","processData","generatePoints","setColumn","setAxisTranslation","hasCategories","pointRange","axisPointRange","minPointOffset","ordinalCorrection","seriesPointRange","isPointPlacementAxis","is","ordinal","slope","translationSlope","staticScale","minFromRange","setTickInterval","secondPass","softMax","softMin","tickPixelIntervalOption","linkedParentExtremes","tickIntervalOption","thresholdMin","thresholdMax","hardMin","hardMax","getTickAmount","userMin","userMax","getExtremes","stacking","usePercentage","numThreshold","hasExtremesChanged","forceCrop","forceCropping","minTickInterval","unsquish","setTickPositions","tickPositionsOption","tickPositioner","minorTickIntervalOption","allowEndOnTick","isPanning","tickPositionerResult","positions","units","startingTickInterval","adjustedTickInterval","adjustTickAmount","alignToOthers","hasOther","alignedAxes","chartOptions","thresholdAlignments","thresholdAlignment","getKey","pane","thisKey","otherAxis","threshAlign","getThresholdAlignment","sum","callerAxis","finalTickAmt","currentTickAmount","thresholdTickIndex","hasData","adjustExtremes","setScale","isXAxisDirty","setAxisSize","isDirtyAxisLength","forceRedraw","buildStacks","cleanStacks","allExtremes","setExtremes","serie","kdTree","eventArgs","offsets","plotWidth","plotHeight","plotTop","plotLeft","getThreshold","realMin","realMax","autoLabelAlign","angle","labelMetrics","slotSize","rotationOption","getStep","spaceNeeded","newTickInterval","bestScore","MAX_VALUE","score","slotCount","cssWidth","renderUnsquish","labelStyleOptions","innerWidth","lineClampOption","commonWidth","maxLabelLength","widthOption","addTitle","axisTitleOptions","axisTitle","low","high","generateTick","createGroups","axisParent","createGroup","getOffset","invertedSide","hasCrossing","crossing","axisOffset","clipOffset","directionFactor","showAxis","titleOffset","titleOffsetOption","titleMargin","labelOffsetPadded","lineHeightCorrection","renderLine","axisTitleMargin","getMaxLabelDimensions","maxLabelDimensions","axisLine","getLinePath","lineLeft","lineTop","getTitlePosition","axisLength","xOption","yOption","textHeightOvershoot","alongAxis","offAxis","titlePosition","renderMinorTick","slideIn","renderTick","isColumn","stackLabelOptions","alternateGridColor","overlap","px","slideInTicks","hasRendered","PlotLineOrBand","plotLines","plotBands","plotLineOptions","addPlotBandOrLine","forDestruction","isPlaced","renderStackTotals","plotLine","getKeepProps","keepProps","keepEvents","plotGroup","drawCrosshair","categorized","graphic","cross","crossOptions","crosshairPos","plotX","plotY","chartX","chartY","stackY","isCrosshair","hideCrosshair","isDirtyBox","remove","axisSeries","setTitle","titleOptions","setCategories","DateTimeAxis_addEvent","DateTimeAxis_getMagnitude","DateTimeAxis_normalizeTickInterval","DateTimeAxis_timeUnits","onAfterSetType","Additions","AxisClass","includes","axisProto","unitsOption","Axis_DateTimeAxis","LogarithmicAxis_addEvent","LogarithmicAxis_normalizeTickInterval","LogarithmicAxis_pick","onAfterInit","minor","minorAutoInterval","intermediate","break2","totalPixelLength","Axis_LogarithmicAxis","PlotLineOrBandAxis_erase","PlotLineOrBandAxis_extend","PlotLineOrBandAxis_isNumber","PlotLineOrBandClass","addPlotBand","updatedOptions","addPlotLine","getPlotBandPath","toPath","outside","plus","isFlat","pathStart","pathEnd","toPathStart","toPathEnd","removePlotBand","removePlotBandOrLine","removePlotLine","PlotLineOrBandType","PlotLineOrBand_PlotLineOrBandAxis","PlotLineOrBand_addEvent","PlotLineOrBand_arrayMax","PlotLineOrBand_arrayMin","PlotLineOrBand_defined","PlotLineOrBand_destroyObjectProperties","PlotLineOrBand_erase","PlotLineOrBand_fireEvent","PlotLineOrBand_merge","PlotLineOrBand_objectEach","PlotLineOrBand_pick","ChartClass","labelCollectors","groupAttribs","optionsLabel","svgElem","group","isBand","isLine","groupName","eventsAdded","inside","getLabelText","xBounds","yBounds","bBoxWidth","Tooltip_animObject","Tooltip_format","Tooltip_composed","Tooltip_doc","Tooltip_addEvent","Tooltip_clamp","Tooltip_css","Tooltip_discardElement","Tooltip_extend","Tooltip_fireEvent","Tooltip_isArray","Tooltip_isNumber","Tooltip_isObject","Tooltip_isString","Tooltip_merge","Tooltip_pick","Tooltip_pushUnique","Tooltip_splat","Tooltip_syncTimeout","Tooltip","pointer","allowShared","isSticky","bodyFormatter","tooltipOptions","formatPrefix","tooltipFormatter","cleanSplit","tt","defaultFormatter","hoverPoints","headerFooterFormatter","Core_Utilities","hideTimer","getAnchor","mouseEvent","followPointer","normalize","tooltipPos","getClassName","isSplit","isHeader","colorIndex","getLabel","doSplit","wasSplit","chartStyle","renderTo","shouldStickOnContact","getPlayingField","clientWidth","clientHeight","outerHeight","outerWidth","chartPosition","getChartPosition","buildDimensionArray","dim","isX","first","swapped","flipped","negative","hoverSeries","preferFarSide","ttBelow","firstDimension","outerSize","innerSize","scaledInnerSize","scaledDist","scaleDiff","roomLeft","roomRight","alignedLeft","alignedRight","secondDimension","swap","pointerEvent","inClass","move","skipAnchor","drawTracker","refresh","pointOrPoints","formatString","wasShared","noSharedTooltip","anchor","applyInactiveState","currentSeries","renderSplit","checkX","checkY","isDirectTouch","shouldShowTooltip","spacingBox","updatePosition","positioner","scrollablePlotArea","scrollingContainer","bounds","tooltipLabel","headerTop","chartLeft","chartTop","distributionBoxTop","headerHeight","adjustedPlotHeight","defaultPositioner","updatePartialTooltip","partialTooltip","ignoreX","boxPosition","boxStart","boxExtremes","tracker","hoverPoint","anchorPos","labelBBox","styledModeFormat","isFooter","xDateFormat","tooltipDateKeys","PointerClass","Core_Tooltip","Point_animObject","Point_defaultOptions","Point_format","Point_addEvent","Point_crisp","Point_erase","Point_extend","Point_fireEvent","Point_getNestedProperty","Point_isArray","Point_isFunction","Point_isNumber","Point_isObject","Point_merge","Point_pick","Point_syncTimeout","Point_removeEvent","Point_uniqueKey","animateBeforeDestroy","animateParams","startXPos","graphicalProps","getGraphicalProps","singular","isDataLabel","startYPos","plural","applyOptions","pointValKey","optionsToObject","dataLabels","selected","relativeXValue","isNull","isValid","destroyed","dataSorting","destroyPoint","graphics","dataLabel","destroyElements","legendItem","destroyItem","onMouseOut","pointCount","kinds","props","firePointEvent","manageEvent","allowPointSelect","ctrlKey","metaKey","shiftKey","zone","getZone","zones","zoneAxis","nonZonedColor","hasNewShapeType","oldShapeType","shapeType","resolveColor","pointArrayMap","valueCount","firstItemType","setNestedProperty","hasDataLabels","marker","_hasPointMarkers","chartCoordinates","posX","posY","optionsChart","colorByPoint","colorCounter","nestedKeys","isLastKey","shouldDraw","valueDecimals","valuePrefix","valueSuffix","runEvent","hasMockGraphic","shouldDestroyGraphic","row","dataColumnKeys","setRow","fixedBox","hasCartesianSeries","legendType","isDirtyLegend","removePoint","accumulate","selectedStaging","getSelectedPoints","loopPoint","loopSeries","inactiveOtherPoints","onMouseOver","getChartCoordinatesFromPoint","runPointActions","userEvent","importedUserEvent","previousState","stateOptions","markerOptions","normalDisabled","markerStateOptions","stateDisabled","pointMarker","hasMarkers","markerAttribs","halo","pointAttribs","pointAttribsAnimation","stateMarkerGraphic","newSymbol","currentSymbol","markerGroup","isInside","haloOptions","markerGraphic","markerVisibility","isCluster","haloPath","Series_Point","Pointer_color","Pointer_charts","Pointer_composed","Pointer_isTouchDevice","Pointer_addEvent","Pointer_attr","Pointer_css","Pointer_extend","Pointer_find","Pointer_fireEvent","Pointer_isNumber","Pointer_isObject","Pointer_objectEach","Pointer_offset","Pointer_pick","Pointer_pushUnique","Pointer_splat","Pointer","activeSeries","linkedSeries","navigatorSeries","inactiveSeries","setAllPointsToState","eventsToUnbind","unbind","unbindDocumentMouseUp","unbindDocumentTouchEnd","clearInterval","tooltipTimeout","getSelectionMarkerAttrs","attrs","zoomHor","zoomVert","mouseDownX","mouseDownY","drag","panKey","selectionMarkerFill","panKeyPressed","clickedInside","selectionMarker","touch","hasDragged","isInsidePlot","visiblePlotOnly","mapView","hasZoom","pan","dragStart","mouseIsDown","cancelClick","getSelectionBox","drop","boosted","zoomX","zoomY","selection","originalEvent","_cursor","pinchDown","findNearestKDPoint","compareX","findNearestPointBy","searchPoint","p1","p2","isCloserX","distX","isCloser","dist","isAbove","shapeArgs","clientX","isNode","getCoordinates","getHoverData","existingHoverPoint","existingHoverSeries","directTouch","enableMouseTracking","searchSeries","notSticky","stickyTracking","useExisting","boost","getPoint","getPointFromEvent","onTrackerMouseOut","relatedTarget","elemClassName","pointerCaptureEventsToUnbind","runChartClick","click","setDOMEvents","touches","ePos","changedTouches","pageX","pageY","onContainerClick","pEvt","onContainerMouseDown","isPrimaryButton","buttons","onContainerMouseMove","zoomOption","onContainerMouseLeave","hoverChartIndex","reset","onContainerMouseEnter","setHoverChartIndex","touchSelect","openMenu","onDocumentTouchEnd","onDocumentMouseUp","onContainerTouchMove","onContainerTouchStart","onDocumentMouseMove","ownerDocument","pinch","lastTouches","touchesLength","fireClickEvent","followTouchMove","initiated","cancelable","res","boxFromTouches","finger0","finger1","trigger","allowMove","tooltipPoints","isCartesian","unDocMouseMove","hoverData","useSharedTooltip","ownerDoc","onmousedown","bind","setPointerCapture","shouldHave","hasPointerCapture","pointerId","releasePointerCapture","hoverChart","relatedTargetObj","assign","hasMoved","zoomType","pinchType","Core_Pointer","DataTableCore_fireEvent","DataTableCore_isArray","DataTableCore_objectEach","DataTableCore_uniqueKey","Data_DataTableCore","autoId","columns","modified","versionTag","column","columnName","applyRowCount","asReference","getColumns","columnNames","getRow","rowIndex","eventDetail","setColumns","silent","insert","indexRowCount","cellValue","addColumns","LegendSymbol_extend","LegendSymbol_merge","LegendSymbol_pick","lineMarker","hasArea","symbolWidth","symbolHeight","generalRadius","legendItemGroup","verticalCenter","legendSymbol","lineSizer","linecap","area","radius","isMarker","areaMarker","rectangle","symbolRadius","Legend_LegendSymbol","SeriesRegistry_defaultOptions","SeriesRegistry_extend","SeriesRegistry_extendClass","SeriesRegistry_merge","registerSeriesType","seriesType","SeriesClass","defaultPlotOptions","seriesProto","pointClass","pointProto","PointClass","Series_SeriesRegistry","Series_animObject","Series_setAnimation","Series_defaultOptions","Series_registerEventOptions","Series_svg","Series_win","Series_arrayMax","Series_arrayMin","Series_clamp","Series_correctFloat","Series_crisp","Series_defined","Series_destroyObjectProperties","Series_diffObjects","Series_erase","Series_error","Series_extend","Series_find","Series_fireEvent","Series_getClosestDistance","Series_getNestedProperty","Series_insertItem","Series_isArray","Series_isNumber","Series_isString","Series_merge","Series_objectEach","Series_pick","Series_removeEvent","Series_syncTimeout","Series","lastSeries","chartSeries","bindAxes","getColor","getSymbol","setDataSortingOptions","setData","axisOptions","axisTypes","optionalAxis","hasMarkerChanged","oldOptions","oldMarker","pointInterval","pointIntervalUnit","pointStart","enabledDataSorting","allowDG","itemOptions","seriesUserOptions","typeOptions","userPlotOptions","userPlotOptionsSeries","defaultPlotOptionsType","userPlotOptionsType","negativeColor","negativeFillColor","fillColor","getName","getCyclic","defaults","setting","indexName","counterName","getPointsCollection","hasGroupedData","seriesMarkerOption","findPointIndex","optionsObject","fromIndex","matchingPoint","matchedById","pointIndex","oldData","matcher","oldPoint","touched","matchByName","cropped","cropStart","updateData","pointsToAdd","equalLength","hasUpdatedByKey","succeeded","pointOptions","hasDerivedData","addPoint","updatePoints","oldDataLength","turboThreshold","table","updatedData","indexOfX","indexOfY","copiedData","dataLength","sortData","runTurbo","firstPoint","getFirstValidPoint","lastPoint","isShortArray","valueData","autoX","colArray","pt","sortKey","getPointOptionsObject","sortedData","aValue","bValue","seriesData","getProcessedData","forceExtremesFromAll","cropThreshold","getExtremesFromAll","croppedData","updatingNames","cropData","processedData","basePointRange","dataOptions","processedDataLength","groupCropStartIndex","dataGrouping","groupAll","pOptions","dataGroup","groupMap","yData","customData","stackedYData","yAxisData","keysAffectYAxis","activeYData","shoulder","doAll","xMin","xMax","values","increment","pointPlacementToXValue","dynamicallyPlaced","stackThreshold","startFromThreshold","lastPlotX","stackIndicator","closestPointRangePx","limitedRange","xValue","stackItem","stackValues","yValue","lowValue","stacks","negStacks","stackKey","getStackIndicator","stackTotal","percentage","irregularWidths","setOffset","pointXOffset","barW","yBottom","dataModify","modifyValue","isPointInside","getValidPoints","insideOnly","allowNull","asNull","getClipBox","clipBox","plotSizeX","plotSizeY","invertible","getSharedClipKey","sharedClipKey","setClip","sharedClips","animationClipKey","animationClipRect","markerAnimationClipRect","markerClipBox","finalBox","afterAnimate","finishedAnimating","drawPoints","verb","pointMarkerOptions","hasPointMarker","colorAxis","seriesMarkerOptions","specialGroup","globallyEnabled","enabledThreshold","hasImage","pointAttr","seriesStateOptions","pointStateOptions","radiusPlus","pointColorOption","pointColor","zoneColor","lineWidthPlus","keepEventsForUpdate","issue134","removeEvents","AXIS","animationTimeout","survive","applyZones","graph","halfWidth","avoidClose","translated","lineClip","axisMax","invertPath","showLine","zoneBelow","lastLineClip","lastTranslated","simpleClip","simplePath","adaptivePath","getPlotBox","horAxis","vertAxis","chartSeriesGroup","seriesGroup","animDuration","drawGraph","drawDataLabels","redrawPoints","wasDirty","searchKDTree","buildKDTree","buildingKdTree","dimensions","kdtree","median","kdAxisArray","kdNow","suppliedPointEvaluator","suppliedBSideCheckEvaluator","kdX","kdY","kdComparer","kdDimensions","useRadius","isBubble","pointEvaluator","comparisonProp","bSideCheckEvaluator","doSearch","search","tree","flip","setDistance","p1kdX","p2kdX","p1kdY","p2kdY","tdist","sideA","sideB","trackByArea","trackerPath","areaPath","graphPath","TRACKER_FILL","dataLabelsGroup","withEvent","isInTheMiddle","linkSeries","initialType","initialSeriesProto","preserve","newType","keepPoints","joinBy","mapData","optionsToCheck","option","hasOptionChanged","parallelArrays","groups","casting","propFromSeries","setPrototypeOf","ownEvents","missingModuleFor","showInLegend","setSortedData","setName","optionName","oldOption","plotOptionsOption","mouseOver","mouseOut","stateAnimation","graphElement","labelBySeries","setVisible","vis","oldVisibility","showOrHide","colorizeItem","otherSeries","checkbox","checked","drawLegendSymbol","showCheckbox","normal","inactive","registerType","Series_Series","Legend_animObject","Legend_setAnimation","Legend_registerEventOptions","Legend_composed","Legend_distribute","Legend_format","Legend_addEvent","Legend_createElement","Legend_css","Legend_defined","Legend_discardElement","Legend_find","Legend_fireEvent","Legend_isNumber","Legend_merge","Legend_pick","Legend_pushUnique","Legend_relativeLength","Legend_stableSort","Legend_syncTimeout","Legend","allItems","initialItemY","itemHeight","itemX","itemY","lastItemY","lastLineHeight","legendHeight","legendWidth","maxItemWidth","maxLegendWidth","pages","titleHeight","totalItemWidth","positionCheckboxes","proximate","proximatePositions","positionItems","originalColor","legendSymbolColor","hiddenColor","fillOpacity","colorizeHidden","positionItem","isResizing","ltr","rtl","getAllItems","clipHeight","scrollOffset","checkboxOffset","renderTitle","contentGroup","setText","labelFormat","renderItem","horizontal","itemDistance","isSeries","createCheckboxForItem","itemClassName","itemExtraWidth","scrollGroup","setItemEvents","itemWidth","fontMetricsH","labelHeight","layoutItem","getAlignment","floating","adjustMargins","alignment","alignments","alignLeft","useFirstPoint","legendGroup","allowedWidth","legendIndex","optionsY","alignTop","maxHeight","navOptions","arrowSize","clipToHeight","addTracker","nav","lastY","spaceHeight","currentPage","fullHeight","pageIx","up","scroll","pager","down","scrollBy","pageCount","upTracker","downTracker","legendLabel","isPoint","activeClass","legendElements","setOtherItemsState","otherItem","defaultItemClick","browserEvent","defaultChecked","Legend_Legend","Chart_animate","Chart_animObject","Chart_setAnimation","Chart_defaultOptions","Chart_numberFormat","Chart_registerEventOptions","Chart_charts","Chart_doc","Chart_marginNames","Chart_svg","Chart_win","Chart_seriesTypes","Chart_addEvent","Chart_attr","Chart_createElement","Chart_css","Chart_defined","Chart_diffObjects","Chart_discardElement","Chart_erase","Chart_error","Chart_extend","Chart_find","Chart_fireEvent","Chart_getAlignFactor","Chart_getStyle","Chart_isArray","Chart_isNumber","Chart_isObject","Chart_isString","Chart_merge","Chart_objectEach","Chart_pick","Chart_pInt","Chart_relativeLength","Chart_removeEvent","Chart_splat","Chart_syncTimeout","Chart_uniqueKey","Chart","setZoomOptions","zoomKey","zoomBySingleTouch","getElementById","showAxes","symbolCounter","firstRender","initSeries","getSeriesOrderByLinks","optionsArray","userOptionsArray","iEnd","plotBox","scrollablePlotBox","ignoreY","legendUserOptions","isHiddenChart","afterRedraw","hasDirtyStacks","hasStackedSeries","redrawLegend","setResponsive","temporaryDisplay","layOutTitles","centerInCategory","updateTotals","getStacks","getMargins","extKey","drawChartBox","itemById","createAxes","getSelectedSeries","subtitleOptions","applyDescription","explicitOptions","updateOptions","isStock","descOptions","topAligned","uncappedScale","requiresDirtyBox","getContainerBox","nonContainers","getChartSize","heightOption","containerBox","enableDefaultHeight","revert","tempStyle","hcOrigStyle","hcOrigDetached","contains","hcOricDetached","setProperty","setClassName","getContainer","containerStyle","indexAttrName","containerId","oldChartIndex","skipClone","userSelect","exporting","skipAxes","resetMargins","marginBottom","getAxisMargins","setChartSize","oldBox","isPrinting","reflowTimeout","setReflow","runReflow","ResizeObserver","observe","clipRoundFunc","marginRight","plotBorderWidth","sideName","plotBGImage","chartBackgroundColor","plotBackgroundColor","plotBackgroundImage","chartBackground","plotBackground","plotBorder","chartBorderWidth","mgn","bgAttr","plotShadow","klass","isUpdating","renderSeries","axisLayoutRuns","renderAxes","expectedSpace","redoHorizontal","redoVertical","mockTick","tempWidth","tempHeight","seriesGroupShadow","addCredits","creds","mapCredits","scroller","serieOptions","callbacks","warnIfA11yModuleNotLoaded","accessibility","role","addSeries","addAxis","createAxis","addColorAxis","showLoading","loadingOptions","setLoadingSize","loadingDiv","loadingSpan","loadingShown","showDuration","hideLoading","hideDuration","oneToOne","updateAllAxes","updateAllSeries","runSetSize","adders","isResponsiveOptions","itemsForRemoval","propsRequireUpdateSeries","propsRequireDirtyBox","propsRequireReflow","newOptions","hasId","collectionsWithInit","newWidth","newHeight","setSubtitle","setCaption","showResetZoom","btnOptions","relativeTo","zoomOut","resetSelection","panningOptions","hasZoomed","displayButton","isAnyAxisPanning","wh","toLength","fromLength","fromCenter","toCenter","pointRangeDirection","newMin","newMax","minPx","seriesExtremes","optionsMin","optionsMax","safeDataMin","safeDataMax","padRange","paddedMin","paddedMax","allowZoomOutside","overscroll","Chart_Chart","ScrollablePlotArea_stop","ScrollablePlotArea_composed","ScrollablePlotArea_addEvent","ScrollablePlotArea_createElement","ScrollablePlotArea_css","ScrollablePlotArea_defined","ScrollablePlotArea_erase","ScrollablePlotArea_merge","ScrollablePlotArea_pushUnique","onChartRender","ScrollablePlotArea","applyFixed","markDirty","afterSetSize","recalculateHoriz","minWidth","minHeight","hasParallelCoordinates","lastHoverPoint","scrollableOptions","moveFixedElements","WebkitOverflowScrolling","overflowX","overflowY","parentDiv","innerContainer","fixedDiv","fixedRenderer","mask","scrollPositionX","scrollPositionY","scrollableWidth","scrollableHeight","maskTop","maskLeft","maskBottom","maskRight","maskPlotRight","maskPlotBottom","redrawTrigger","axisClass","fixedSelectors","classBase","StackItem_format","StackItem_Series","StackItem_destroyObjectProperties","StackItem_fireEvent","StackItem_getAlignFactor","StackItem_isNumber","StackItem_pick","Stacking_StackItem","negativeValue","stackOption","isNegative","cumulative","hasValidPoints","stack","leftCliff","rightCliff","formatOption","labelrank","xOffset","boxBottom","boxTop","defaultX","stackBox","getStackBox","labelBox","isJustify","adjustStackPosition","justifyDataLabel","stackBoxProps","totalStackValue","neg","StackingAxis_getDeferredAnimation","StackingAxis_addEvent","StackingAxis_correctFloat","StackingAxis_defined","StackingAxis_destroyObjectProperties","StackingAxis_fireEvent","StackingAxis_isNumber","StackingAxis_objectEach","StackingAxis_pick","chartGetStacks","oldStacks","xAxisOptions","onAxisDestroy","stackTotalGroup","onAxisInit","AxisAdditions","seriesGetStackIndicator","seriesModifyStacks","processedXData","stacker","pointExtremes","seriesPercentStacker","totalFactor","seriesSetGroupedPoints","setStackedPoints","resetStacks","seriesSetStackedPoints","stackingParam","pointKey","yDataLength","negKey","stacksTouched","yNumber","singleStacks","actualSeries","setGroupedPoints","modifyStacks","animationConfig","stackLabelsAnim","chartProto","percentStacker","Stacking_StackingAxis","LineSeries_defined","LineSeries_merge","LineSeries_isObject","LineSeries","gappedPath","getGraphPath","preventGraphAnimation","xMap","fillGraph","nullsAsZeroes","connectCliffs","gap","connectNulls","pathToPoint","getPointSpline","AreaSeries_LineSeries","AreaSeries_extend","AreaSeries_merge","AreaSeries_objectEach","AreaSeries_pick","AreaSeries","shiftUnit","bottomPoints","graphPoints","seriesIndex","translatedThreshold","addDummyPoints","otherI","stackedValues","nullVal","cliffVal","isCliff","doCurve","getStackPoints","leftNull","rightNull","rectPlotX","topPath","bottomPath","firstBottomPoint","pointMap","yAxisSeries","seriesLength","upOrDown","stackX","visibleSeries","idx","stackPoint","direction","nullName","otherStack","cliff","si","SplineSeries_LineSeries","SplineSeries_merge","SplineSeries_pick","SplineSeries","leftContX","leftContY","rightContX","rightContY","nextPoint","otherPoint","lastX","nextX","nextY","correction","smoothing","controlPoints","Spline_SplineSeries","AreaSplineSeries_AreaSeries","areaProto","AreaSplineSeries_extend","AreaSplineSeries_merge","AreaSplineSeries","ColumnSeries_animObject","ColumnSeries_color","ColumnSeries_noop","ColumnSeries_clamp","ColumnSeries_crisp","ColumnSeries_defined","ColumnSeries_extend","ColumnSeries_fireEvent","ColumnSeries_isArray","ColumnSeries_isNumber","ColumnSeries_merge","ColumnSeries_pick","ColumnSeries_objectEach","ColumnSeries","translateStart","yAxisPos","translateProp","getColumnMetrics","reverseStacks","stackGroups","columnCount","grouping","columnIndex","otherYAxis","otherOptions","categoryWidth","groupPadding","pointOffsetWidth","groupWidth","pointWidth","maxPointWidth","pointPadding","colIndex","columnMetrics","paddedWidth","crispCol","adjustForMissingColumns","indexInCategory","totalInCategory","pointValues","yStackMap","baseIndex","seriesIndexes","yStack","dense","minPointLength","seriesPointWidth","seriesXOffset","seriesBarW","barY","barH","barX","p2o","pointAttrToOptions","strokeOption","strokeWidthOption","brightness","animationLimit","hasGraphic","allowShadow","_hasTracking","trackerGroups","Column_ColumnSeries","DataLabel_getDeferredAnimation","DataLabel_format","DataLabel_defined","DataLabel_extend","DataLabel_fireEvent","DataLabel_getAlignFactor","DataLabel_isArray","DataLabel_isString","DataLabel_merge","DataLabel_objectEach","DataLabel_pick","DataLabel_pInt","DataLabel_splat","mergedDataLabelOptions","alignDataLabel","justify","forceDL","unrotatedbBox","setDataLabelStartPos","initDataLabelsGroup","initDataLabels","contrastColor","seriesDlOptions","mergeArrays","dlOptions","labelEnabled","dataLabelOnHidden","dataLabelOnNull","applyFilter","op","operator","property","labelText","labelBgColor","horizontalAxis","horizontalAxisShift","verticalAxis","verticalAxisShift","off","justified","one","two","labelCenter","Series_DataLabel","ColumnDataLabel_composed","ColumnDataLabel_Series","ColumnDataLabel_merge","ColumnDataLabel_pick","ColumnDataLabel_pushUnique","xLen","yLen","dlBox","below","overshoot","ColumnSeriesClass","Column_ColumnDataLabel","BarSeries_extend","BarSeries_merge","BarSeries","ScatterSeries_ColumnSeries","ScatterSeries_LineSeries","ScatterSeries_addEvent","ScatterSeries_extend","ScatterSeries_merge","ScatterSeries","applyJitter","jitter","plotProp","translatedJitter","unrandom","seed","rand","CenteredUtilities_deg2rad","CenteredUtilities_fireEvent","CenteredUtilities_isNumber","CenteredUtilities_pick","CenteredUtilities_relativeLength","getCenter","slicingRoom","slicedOffset","centerOption","smallestSize","thickness","handleSlicingRoom","angular","getStartAndEndRadians","startAngle","endAngle","Series_CenteredUtilities","PiePoint_setAnimation","PiePoint_addEvent","PiePoint_defined","PiePoint_extend","PiePoint_isNumber","PiePoint_pick","PiePoint_relativeLength","PiePoint","getConnectorPath","labelPosition","dataLabelPosition","connectorShape","shapeFunc","connectorShapes","computed","connectorPosition","getTranslate","sliced","slicedTranslation","half","toggleSlice","fixedOffset","breakAt","touchingSliceAt","lineSegment","softConnector","straight","crookedLine","diameter","leftAligned","crookX","crookDistance","tan","PieSeries_noop","PieSeries_clamp","PieSeries_extend","PieSeries_fireEvent","PieSeries_merge","PieSeries_pick","PieSeries","startAngleRad","startR","drawEmpty","centerX","centerY","endAngleRad","delayedRendering","getX","radii","asin","groupTranslation","animateTo","sortByAngle","radians","circ","ignoreHiddenPoint","radiusX","radiusY","connectorPadding","PieDataLabel_composed","PieDataLabel_noop","PieDataLabel_distribute","PieDataLabel_Series","PieDataLabel_arrayMax","PieDataLabel_clamp","PieDataLabel_defined","PieDataLabel_pick","PieDataLabel_pushUnique","PieDataLabel_relativeLength","dataLabelPositioners","radialDistributionY","distributeBox","radialDistributionX","naturalY","seriesCenter","alignToPlotEdges","dataLabelWidth","alignToConnectors","maxDataLabelWidth","getDataLabelPosition","halfPI","cosAngle","sinAngle","finalConnectorOffset","natural","maxWidth","halves","maxLabelDistance","shortened","dataLabelOptions","halfIdx","distributionLength","topOffset","posAttribs","sideOverflow","verifyDataLabelOverflow","placeDataLabels","connectorColor","connectorWidth","minSize","newSize","PieSeriesClass","pieProto","PieDataLabel","getCenterOfPoints","getDistanceBetweenPoints","getAngleBetweenPoints","atan2","pointInPolygon","OverlappingDataLabels_addEvent","OverlappingDataLabels_fireEvent","OverlappingDataLabels_objectEach","OverlappingDataLabels_pick","chartHideOverlappingLabels","isIntersectRect","box1","box2","isPolygonOverlap","box1Poly","box2Poly","label1","label2","isLabelAffected","oldOpacity","absoluteBox","getAbsoluteBox","toHide","overlappingLabel","hideOrShow","isOld","OverlappingDataLabels_onChartRender","collector","hideOverlappingLabels","Extensions_OverlappingDataLabels","BorderRadius_defaultOptions","BorderRadius_noop","BorderRadius_addEvent","BorderRadius_extend","BorderRadius_isObject","BorderRadius_merge","BorderRadius_relativeLength","defaultBorderRadiusOptions","where","oldArc","oldRoundedRect","BorderRadius_arc","sinHalfAlpha","innerBorderRadius","applyBorderRadius","fromLineToArc","bigR","relativeR","angleOfBorderRadius","angleOffset","distanceBigCenterToStartArc","seriesOnAfterColumnTranslate","is3d","percent","seriesDefault","brBoxY","brBoxHeight","stackEnd","seriesBROptions","pieSeriesOnAfterTranslate","BorderRadius_roundedRect","brOffsetTop","brOffsetBtm","rTop","rBtm","cutTop","cutBtm","applyPythagoras","altitude","Responsive_diffObjects","Responsive_extend","Responsive_find","Responsive_merge","Responsive_pick","Responsive_uniqueKey","matchResponsiveRule","rule","_id","responsive","currentResponsive","ruleIds","undoOptions","rules","mergedOptions","ruleId","currentRuleIds","updatingResponsive","Core_Responsive","G","DataTableCore","OverlappingDataLabels","StackItem","Templating","Tick","Time","Extensions_BorderRadius","SVGElementClass","pie","HTML_HTMLElement","PlotLineOrBand_PlotLineOrBand","Extensions_ScrollablePlotArea","pointTooltipFormatter","DataModifyComposition_addEvent","DataModifyComposition_arrayMax","DataModifyComposition_arrayMin","DataModifyComposition_correctFloat","DataModifyComposition_defined","DataModifyComposition_isArray","DataModifyComposition_isNumber","DataModifyComposition_isString","DataModifyComposition_pick","setModifier","modeState","setCompare","setCumulative","changeDecimals","change","cumulativeSum","afterInit","compare","initCompare","initCumulative","afterGetExtremes","extremes","getCumulativeExtremes","seriesSetCompare","afterProcessData","compareColumn","compareStart","compareValue","axisSetCompare","seriesSetCumulative","axisSetCumulative","cumulativeDataMin","cumulativeDataMax","prev","cur","compareBase","prevPoint","cumulativeStart","withinRange","Series_DataModifyComposition","ChartNavigatorComposition_isTouchDevice","ChartNavigatorComposition_addEvent","ChartNavigatorComposition_merge","ChartNavigatorComposition_pick","composedMembers","onChartAfterAddSeries","setBaseSeries","onChartAfterSetChartSize","legendOptions","scrollbarHeight","scrollButtonSize","navigatorOptions","scrollbar","rangeSelector","extraBottomMargin","getHeight","onChartAfterUpdate","onChartBeforeRender","onChartBeforeShowResetZoom","onChartCallback","onChartUpdate","scrollbarOptions","Navigator_ChartNavigatorComposition","NavigatorClass","NavigatorAxisComposition_isTouchDevice","NavigatorAxisComposition_addEvent","NavigatorAxisComposition_correctFloat","NavigatorAxisComposition_defined","NavigatorAxisComposition_isNumber","NavigatorAxisComposition_pick","NavigatorAxisComposition_onAxisInit","navigatorAxis","NavigatorAxisAdditions","onAxisSetExtremes","zoomed","previousZoom","toFixedRange","pxMin","pxMax","fixedMin","fixedMax","halfPointRange","NavigatorDefaults_color","NavigatorDefaults_seriesTypes","NavigatorDefaults","maskInside","handles","maskFill","outlineColor","outlineWidth","areaspline","sonification","approximation","groupPixelWidth","firstAnchor","lastAnchor","NavigatorSymbols_relativeLength","Navigator_NavigatorSymbols","_x","_y","markerPosition","StockUtilities_defined","Utilities_StockUtilities","setFixedRange","fixedRange","NavigatorComposition_setOptions","NavigatorComposition_composed","NavigatorComposition_setFixedRange","NavigatorComposition_addEvent","NavigatorComposition_extend","NavigatorComposition_pushUnique","onSeriesAfterUpdate","Navigator_NavigatorComposition","NavigatorAxisComposition","ScrollbarAxis_composed","ScrollbarAxis_addEvent","ScrollbarAxis_defined","ScrollbarAxis_pick","ScrollbarAxis_pushUnique","Scrollbar","axisMin","scrollMin","scrollMax","onAxisAfterGetOffset","scrollbarsOffsets","onAxisAfterInit","vertical","unitedMin","unitedMax","shouldUpdateExtremes","DOMType","setRange","onAxisAfterRender","offsetsIndex","axisMargin","xPosition","ScrollbarClass","Axis_ScrollbarAxis","Scrollbar_ScrollbarDefaults","barBorderRadius","buttonBorderRadius","buttonsEnabled","liveRedraw","barBackgroundColor","barBorderWidth","barBorderColor","buttonArrowColor","buttonBackgroundColor","buttonBorderColor","buttonBorderWidth","rifleColor","trackBackgroundColor","trackBorderColor","trackBorderRadius","trackBorderWidth","Scrollbar_defaultOptions","Scrollbar_addEvent","Scrollbar_correctFloat","Scrollbar_crisp","Scrollbar_defined","Scrollbar_destroyObjectProperties","Scrollbar_fireEvent","Scrollbar_merge","Scrollbar_pick","Scrollbar_removeEvent","swapXY","temp","_events","scrollbarButtons","scrollbarLeft","scrollbarStrokeWidth","scrollbarTop","addEvents","buttonsOrder","bar","scrollbarGroup","track","mouseDownHandler","mouseMoveHandler","mouseUpHandler","buttonToMinClick","buttonToMaxClick","trackClick","DOMEvent","cursorToScrollbarPosition","normalizedEvent","minWidthDifference","calculatedWidth","barWidth","drawScrollbarButton","arrow","mousePosition","initPositions","grabbedCenter","rendered","scrollbarRifles","fromPX","fullWidth","toPX","newPos","newRiflesPos","showFull","Navigator_defaultOptions","Navigator_isTouchDevice","Navigator_addEvent","Navigator_clamp","Navigator_correctFloat","Navigator_defined","Navigator_destroyObjectProperties","Navigator_erase","Navigator_extend","Navigator_find","Navigator_fireEvent","Navigator_isArray","Navigator_isNumber","Navigator_merge","Navigator_pick","Navigator_removeEvent","Navigator_splat","numExt","extreme","numbers","Navigator","drawHandle","drawOutline","zoomedMin","zoomedMax","halfOutline","outlineCorrection","navigatorSize","navigatorTop","lineBtm","verticalMin","drawMasks","navigatorHeight","shades","shade","renderElements","mouseCursor","navigatorGroup","hasMask","handlesOptions","addMouseEvents","invertedUpdate","setOpposite","navigatorEnabled","adaptToUpdatedData","baseSeries","updatedDataHandler","getXAxisOffsets","scrollbarXAxis","fake","maxRange","navigatorWidth","currentRange","grabbedLeft","grabbedRight","fixedWidth","onMouseMove","onMouseUp","getPartsEvents","modifyNavigatorAxisExtremes","eventName","navigatorItem","shadesMousedown","navigatorPosition","ext","dragOffset","reversedExtremes","getUnionExtremes","handlesMousedown","baseXAxis","otherHandlePos","fixedExtreme","unionExtremes","triggerOp","removeBaseSeriesEvents","modifyBaseAxisExtremes","scrollbarEnabled","xAxisIndex","yAxisIndex","baseXaxis","breaks","keepOrdinalPadding","updateNavigatorSeries","unbindRedraw","scrollTrackWidth","valueRange","addBaseSeriesEvents","addChartEvents","returnFalseOnNoBaseSeries","baseAxis","navAxis","navAxisOptions","baseAxisOptions","baseSeriesOptions","showInNavigator","navSeriesMixin","padXAxis","navSeries","baseOptions","mergedNavSeriesOptions","chartNavigatorSeriesOptions","baseNavigatorOptions","linkedNavSeries","userNavOptions","navigatorSeriesData","hasNavigatorData","userSeriesOptions","getBaseSeriesMin","currentSeriesMin","baseExtremes","baseMin","baseMax","baseDataMin","baseDataMax","stickToMin","stickToMax","convertOverscroll","hasSetExtremes","shouldStickToMax","shouldStickToMin","xDataMin","marginName","OrdinalAxis_addEvent","OrdinalAxis_correctFloat","OrdinalAxis_css","OrdinalAxis_defined","OrdinalAxis_error","OrdinalAxis_isNumber","OrdinalAxis_pick","OrdinalAxis_timeUnits","OrdinalAxis_isString","findHigherRanks","segmentStarts","segmentPositions","hasCrossedHigherRank","outsideMax","groupPositions","lastGroupPosition","posLength","translatedArr","distances","itemToRemove","medianDistance","index2val","ordinalPositions","getExtendedPositions","pixelVal","getIndexOfPoint","leftNeighbour","rightNeighbour","getIndexInArray","findIndexOf","onAxisFoundExtremes","originalOrdinalRange","onAxisAfterSetScale","onAxisInitialAxisTranslation","beforeSetTickPositions","postProcessTickInterval","onChartPan","runBase","trimmedRange","overscrollPointsRange","movedUnits","extendedOrdinalPositions","extendedAxis","onSeriesUpdatedData","toIndex","ordinalIndex","ordinalLength","originalPositionsReference","approximateIndexOffset","ordinal2lin","uniqueOrdinalPositions","useOrdinal","adjustOrdinalExtremesPoints","isBoosted","distanceBetweenPoint","takeOrdinalPosition","forceOrdinal","getOverscrollPositions","groupIntervalFactor","sortedArray","indirectSearch","withOverscroll","currentDataGrouping","fakeAxis","fakeSeries","applyGrouping","getGroupPixelWidth","getGroupIntervalFactor","destroyGroupedData","forced","ordinalArray","minX","indexOfMin","extraRange","ordinalSlope","calculateOverscroll","overscrollPercentage","overscrollValue","pixelToPercent","limitedOverscrollValue","Axis_OrdinalAxis","RangeSelector_RangeSelectorDefaults","rangeSelectorZoom","rangeSelectorFrom","rangeSelectorTo","allButtonsEnabled","buttonSpacing","dropdown","inputBoxBorderColor","inputBoxHeight","inputBoxWidth","inputDateFormat","inputDateParser","inputEditDateFormat","inputEnabled","inputPosition","inputSpacing","buttonPosition","inputStyle","RangeSelectorComposition_defaultOptions","RangeSelectorComposition_composed","RangeSelectorComposition_addEvent","RangeSelectorComposition_defined","RangeSelectorComposition_extend","RangeSelectorComposition_isNumber","RangeSelectorComposition_merge","RangeSelectorComposition_pick","RangeSelectorComposition_pushUnique","chartDestroyEvents","axisMinFromRange","rangeOptions","getTrueRange","MIN_VALUE","_offsetMin","updateRangeSelectorButtons","redrawElements","createRangeSelector","RangeSelectorComposition_onChartBeforeRender","deferredYTDClick","clickButton","extraTopMargin","redrawRangeSelector","onChartDestroy","onChartGetMargins","rangeSelectorHeight","RangeSelectorComposition_onChartUpdate","optionsRangeSelector","extraBottomMarginWas","extraTopMarginWas","RangeSelector_RangeSelectorComposition","RangeSelectorClass","RangeSelector_defaultOptions","RangeSelector_addEvent","RangeSelector_createElement","RangeSelector_css","RangeSelector_defined","RangeSelector_destroyObjectProperties","RangeSelector_diffObjects","RangeSelector_discardElement","RangeSelector_extend","RangeSelector_fireEvent","RangeSelector_isNumber","RangeSelector_isString","RangeSelector_merge","RangeSelector_objectEach","RangeSelector_pick","RangeSelector_splat","preferredInputType","hasTimeKey","dateStyle","timeStyle","RangeSelector","buttonOptions","defaultButtons","initialButtonGroupWidth","maxButtonWidth","buttonWidth","baseXAxisOptions","_range","rangeMin","ytdExtremes","addOffsetMin","setSelected","forcedDataGrouping","Axis_Axis","setDataGrouping","frozenStates","preserveDataGrouping","getYTDExtremes","_offsetMax","selectedIndex","rangeSelectorButton","axisRangeUpdateEvent","selectedOption","blurInputs","minInput","maxInput","blur","computeButtonRange","createElements","updateButtonStates","dropdownLabel","actualRange","hasNoData","ytdMin","ytdMax","buttonStates","selectedExists","isSelectedTooGreat","offsetRange","isSelected","isTooGreatRange","isTooSmallRange","isYTDButNotSelected","isSameRange","prevOrdinalPosition","nextOrdinalPosition","disable","bbox","fixedTimes","offsetMin","offsetMax","getInputValue","defaultInputDateParser","setInputValue","inputTime","dateBox","minDateBox","maxDateBox","hcTimeAttr","updatedTime","previousTime","inputTypeFormats","setInputExtremes","showInput","inputGroup","isTextInput","hideInput","inputDate","drawInput","isMin","updateExtremes","chartAxis","currentExtreme","focus","boxShadow","onfocus","onblur","activeElement","keyDown","onchange","onkeypress","keyCode","onkeydown","onkeyup","buttonTop","inputTop","inputsZIndex","renderButtons","createInputs","minElems","minLabel","maxElems","maxLabel","zoomText","_a","buttonGroup","userButtonTheme","createButtons","createButton","callDefaultEvent","buttonEvents","navButtonOptions","getXOffsetForExportButton","rightAligned","titleCollision","positionButtons","xOffsetForExportButton","alignButtonGroup","handleCollision","alignTranslateY","groupHeight","isCollapsed","newButtonsOptions","btnLength","btn","dropdownTranslateX","hasVisibleDropdown","buttonLeft","moveInputsDown","collapseButtons","expandButtons","showDropdown","hideDropdown","rangeSelectorGroup","yPosition","buttonPositionY","inputPositionY","minPosition","rSelector","StockChart_format","StockChart_getOptions","StockChart_setFixedRange","StockChart_addEvent","StockChart_clamp","StockChart_crisp","StockChart_defined","StockChart_extend","StockChart_find","StockChart_isNumber","StockChart_isString","StockChart_merge","StockChart_pick","StockChart_splat","getDefaultAxisOptions","getForcedAxisOptions","Navigator_NavigatorDefaults","StockChart","yAxisOptions","mouseWheel","onAxisAfterDrawCrosshair","tickInside","crossLabel","posx","posy","formatFormat","limit","crossBox","onAxisAfterHideCrosshair","onAxisAutoLabelAlign","panes","_labelPanes","onAxisGetPlotLinePath","uniqueAxes","transVal","getAxis","otherColl","axis2","unique","crispPolyLine","onSeriesSetOptions","overrides","seriesForceCropping","dataGroupingOptions","svgRendererCrispPolyLine","stockChart","Chart_StockChart","ColumnPoint","HLCSeries_ColumnSeries","HLCSeries_crisp","HLCSeries_extend","HLCSeries_merge","HLCSeries","extendStem","halfStrokeWidth","getPointPath","crispX","plotHigh","close","plotClose","drawSinglePoint","toYData","hlc","OHLCPoint_HLCSeries","OHLCPoint","resolveUpColor","upColor","OHLCSeries_composed","OHLCSeries_HLCSeries","OHLCSeries_addEvent","OHLCSeries_crisp","OHLCSeries_extend","OHLCSeries_merge","OHLCSeries_pushUnique","onSeriesAfterSetOptions","useOhlcData","onSeriesInit","OHLCSeries","_args","plotOpen","CandlestickSeries_ColumnSeries","ohlc","CandlestickSeries_OHLCSeries","CandlestickSeries_crisp","CandlestickSeries_merge","CandlestickSeries","isUp","upLineColor","reversedYAxis","topBox","bottomBox","hasTopWhisker","hasBottomWhisker","FlagsPoint_ColumnPoint","FlagsPoint_isNumber","Flags_FlagsPoint","modifiedMembers","flag","createPinSymbol","labelX","labelY","RendererClass","Flags_FlagsSymbols","OnSeriesComposition_composed","columnProto","OnSeriesComposition_seriesProto","OnSeriesComposition_defined","OnSeriesComposition_pushUnique","OnSeriesComposition_stableSort","onSeries","optionsOnSeries","onData","onKey","leftPoint","rightPoint","distanceRatio","p0","p3","calculateCoord","tMin","tMax","tMid","xMid","stackIndex","Series_OnSeriesComposition","FlagsSeries_noop","FlagsSeries_distribute","FlagsSeries_Series","FlagsSeries_ColumnSeries","FlagsSeries_addEvent","FlagsSeries_defined","FlagsSeries_extend","FlagsSeries_isNumber","FlagsSeries_merge","FlagsSeries_objectEach","FlagsSeries_wrap","FlagsSeries","outsideRight","centered","boxesMap","stackDistance","allowOverlapX","unbindMouseOver","raised","BrokenAxis_addEvent","BrokenAxis_find","BrokenAxis_fireEvent","BrokenAxis_isArray","BrokenAxis_isNumber","BrokenAxis_pick","setBreaks","onAxisAfterSetOptions","onAxisAfterSetTickPositions","newPositions","isInAnyBreak","onSeriesAfterGeneratePoints","isPointInBreak","onSeriesAfterRender","drawBreaks","seriesDrawBreaks","breakArray","breaksOutOfRange","brk","isOut","otherBreak","seriesGappedPath","groupingSize","gapSize","current","next","gapUnit","xRange","isInBreak","repeat","inclusive","lin2Val","nval","val2Lin","findBreakAt","testKeep","inbrk","keep","showPoints","axisBreak","breakArrayT","inBrk","breakSize","Axis_BrokenAxis","broken_axis_src_G","DataGrouping_ApproximationRegistry","ApproximationDefaults_arrayMax","ApproximationDefaults_arrayMin","ApproximationDefaults_correctFloat","ApproximationDefaults_extend","ApproximationDefaults_isNumber","average","hasNulls","ApproximationDefaults","averages","DataGrouping_DataGroupingDefaults","common","seriesSpecific","spline","arearange","columnrange","candlestick","heikinashi","DataGroupingAxisComposition_addEvent","DataGroupingAxisComposition_extend","DataGroupingAxisComposition_merge","DataGroupingAxisComposition_pick","hasProcessed","doGrouping","dgOptions","onAfterSetScale","DataGrouping_DataGroupingAxisComposition","DataGroupingSeriesComposition_seriesProto","DataGroupingSeriesComposition_addEvent","DataGroupingSeriesComposition_defined","DataGroupingSeriesComposition_error","DataGroupingSeriesComposition_extend","DataGroupingSeriesComposition_isNumber","DataGroupingSeriesComposition_merge","DataGroupingSeriesComposition_pick","DataGroupingSeriesComposition_splat","baseGeneratePoints","DataGroupingSeriesComposition_applyGrouping","groupedXData","groupingEnabled","lastDataGrouping","revertRequireSorting","skipDataGrouping","groupedData","groupData","smoothed","anchorPoints","groupedDataLastIndex","anchorIndexIterator","anchorFirstIndex","firstGroupEnd","groupStart","groupLength","lastGroupStart","shiftInterval","allGroupedTable","getDGApproximation","handleYData","pointArrayMapLength","extendedPointArrayMap","valueColumns","pointX","pointY","groupedY","approximationFn","valuesLen","dataGroupInfo","groupedValuesArr","onAfterSetOptions","useCommonDataGrouping","DataGrouping_DataGroupingSeriesComposition","DataGrouping_format","DataGrouping_composed","DataGrouping_addEvent","DataGrouping_extend","DataGrouping_isNumber","DataGrouping_pick","DataGrouping_pushUnique","onTooltipHeaderFormatter","xDateFormatEnd","labelFormats","formattedKey","groupEnd","DataGroupingComposition","TooltipClass","datagrouping_src_G","approximationDefaults","approximations","DataGrouping","NavigationBindingsUtilities_defined","NavigationBindingsUtilities_isNumber","NavigationBindingsUtilities_pick","annotationsFieldsTypes","MouseWheelZoom_addEvent","MouseWheelZoom_isObject","MouseWheelZoom_pick","MouseWheelZoom_defined","MouseWheelZoom_merge","getAssignedAxis","MouseWheelZoom_getAssignedAxis","coords","coord","getFieldType","predefinedType","fieldType","composedClasses","MouseWheelZoom_defaultOptions","sensitivity","MouseWheelZoom_optionsToObject","zoomBy","howMuch","mouseX","mouseY","onAfterGetContainer","wheelZoomOptions","allowZoom","wheelSensitivity","delta","detail","deltaY","xAxisCoords","yAxisCoords","mouse_wheel_zoom_src_G","MouseWheelZoom","stock_src_G","Flags_FlagsSeries","OHLC_OHLCSeries","highcharts_src"],"mappings":"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hC,GACIA,EAAS/kB,MAAM,EACfqlB,CAAAA,EAAQN,QAAQ,CAAGA,CAAO,CAElC,CACAK,EAAMxnB,IAAI,CAACynB,EACf,EAEA,MADA,EAAE,CAAC7hB,OAAO,CAAC3J,IAAI,CAACO,EAAIM,IAAI,CAAC8qB,UAAU,CAAE,AAACC,GAAcN,EAAiBM,EAAWxB,IACzEA,CACX,CACJ,CAqBApB,GAAII,iBAAiB,CAAG,CACpB,MACA,gBACA,mBACA,gBACA,gBACA,cACA,aACA,kBACA,YACA,eACA,gBACA,uBACA,gBACA,QACA,YACA,QACA,UACA,KACA,KACA,IACA,KACA,KACA,WACA,OACA,cACA,cACA,gBACA,SACA,OACA,KACA,KACA,MACA,eACA,cACA,SACA,UACA,WACA,SACA,UACA,cACA,eACA,eACA,IACA,SACA,OACA,OACA,OACA,QACA,QACA,MACA,cACA,eACA,SACA,iBACA,eACA,QACA,cACA,SACA,UACA,UACA,SACA,WACA,aACA,cACA,aACA,aACA,QACA,OACA,SACA,QACA,IACA,KACA,KACA,aACA,IACA,KACA,KACA,SACH,CAgBDJ,GAAIK,iBAAiB,CAAG,CACpB,WACA,UACA,UACA,IACA,MACA,KACA,IACH,CAeDL,GAAI+B,WAAW,CAAG,CACd,IACA,OACA,IACA,KACA,SACA,UACA,SACA,WACA,OACA,KACA,OACA,MACA,KACA,KACA,KACA,sBACA,cACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,eACA,WACA,UACA,cACA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,KACA,iBACA,SACA,KACA,IACA,OACA,UACA,MACA,OACA,QACA,OACA,OACA,SACA,QACA,MACA,MACA,MACA,QACA,OACA,WACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,IACA,KACA,QACH,CACD/B,GAAID,SAAS,CAAGA,GA4BhBC,GAAI8B,mBAAmB,CAAG,CAAA,EA2C1B,GAAM,CAAEvR,eAAgBsS,EAAyB,CAAEnK,YAAaoK,EAAsB,CAAE,CAA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"}